@arcgis/portal-components 5.1.0-next.99 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cdn/3AFLX4RZ.js +31 -0
- package/dist/cdn/3XDKOO6K.js +2 -0
- package/dist/cdn/4ISLOZQ3.js +2 -0
- package/dist/cdn/{TTZBF4KI.js → 563BUCQX.js} +1 -1
- package/dist/cdn/{JOYFDD4B.js → 5BPXS3WU.js} +1 -1
- package/dist/cdn/65JPRIL4.js +98 -0
- package/dist/cdn/6K7GPATC.js +2 -0
- package/dist/cdn/6RA33SDH.js +34 -0
- package/dist/cdn/7IAAHGM2.js +2 -0
- package/dist/cdn/{SOPWLUP4.js → ABRHXRFP.js} +1 -1
- package/dist/cdn/BCUEYBNI.js +2 -0
- package/dist/cdn/CAQR2NSG.js +4 -0
- package/dist/cdn/D42PED2R.js +2 -0
- package/dist/cdn/DEHBTA5D.js +2 -0
- package/dist/cdn/EZ7YC5N5.js +99 -0
- package/dist/cdn/{SEZNHA2J.js → FK7QXBE2.js} +1 -1
- package/dist/cdn/IBYY5ORN.js +122 -0
- package/dist/cdn/ITFWXO7A.js +49 -0
- package/dist/cdn/JWUQZ52F.js +134 -0
- package/dist/cdn/KBYWRUKO.js +2 -0
- package/dist/cdn/KFH2OM2D.js +2 -0
- package/dist/cdn/{GPPEHGUO.js → LVUHKMSB.js} +1 -1
- package/dist/cdn/NDKFZPYE.js +2 -0
- package/dist/cdn/NX4L2LC2.js +2 -0
- package/dist/cdn/OYABHYVF.js +2 -0
- package/dist/cdn/{V5ZWDMLE.js → PIZFXU2N.js} +1 -1
- package/dist/cdn/QOCYNLQ7.js +71 -0
- package/dist/cdn/{ERNT74VA.js → QUYBZ3J7.js} +1 -1
- package/dist/cdn/R2XPTETT.js +22 -0
- package/dist/cdn/R53CO5LK.js +77 -0
- package/dist/cdn/{HQAGVE4P.js → RNRPTWHT.js} +17 -1
- package/dist/cdn/{32DRTMS4.js → SFKRR7GW.js} +1 -1
- package/dist/cdn/SQ54YADV.js +533 -0
- package/dist/cdn/SX4KDMYV.js +69 -0
- package/dist/cdn/TKQAFRBM.js +36 -0
- package/dist/cdn/TNDL67UN.js +2 -0
- package/dist/cdn/{LJUIMVQ2.js → W4RAJWHA.js} +1 -1
- package/dist/cdn/WHLL7DNC.js +146 -0
- package/dist/cdn/X3LZYQ4U.js +66 -0
- package/dist/cdn/XR4PMNYP.js +2 -0
- package/dist/cdn/YJK6JAPE.js +422 -0
- package/dist/cdn/{5WK4GJK2.js → Z5UVAVHJ.js} +1 -1
- package/dist/cdn/{3OTUKLZI.js → ZCL2V7W3.js} +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.ar.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.bg.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.bs.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.ca.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.cs.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.da.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.de.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.el.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.en.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.es.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.et.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.fi.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.fr.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.he.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.hr.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.hu.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.id.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.it.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.ja.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.ko.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.lt.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.lv.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.nl.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.no.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.pl.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.pt-BR.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.pt-PT.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.ro.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.ru.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.sk.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.sl.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.sr.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.sv.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.th.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.tr.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.uk.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.vi.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.zh-CN.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.zh-HK.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant/t9n/messages.zh-TW.json +1 -1
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.ar.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.bg.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.bs.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.ca.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.cs.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.da.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.de.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.el.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.en.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.es.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.et.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.fi.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.fr.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.he.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.hr.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.hu.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.id.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.it.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.ja.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.ko.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.lt.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.lv.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.nl.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.no.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.pl.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.pt-BR.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.pt-PT.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.ro.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.ru.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.sk.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.sl.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.sr.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.sv.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.th.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.tr.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.uk.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.vi.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.zh-CN.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.zh-HK.json +1 -0
- package/dist/cdn/assets/portal-ai-assistant-interrupt/t9n/messages.zh-TW.json +1 -0
- package/dist/cdn/assets/portal-item-type/t9n/messages.ar.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.bg.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.bs.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.ca.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.cs.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.da.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.de.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.el.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.es.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.et.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.fi.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.fr.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.he.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.hr.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.hu.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.id.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.it.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.ja.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.ko.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.lt.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.lv.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.nl.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.no.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.pl.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.pt-BR.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.pt-PT.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.ro.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.ru.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.sk.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.sl.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.sr.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.sv.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.th.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.tr.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.uk.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.vi.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.zh-CN.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.zh-HK.json +1 -1
- package/dist/cdn/assets/portal-item-type/t9n/messages.zh-TW.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.ar.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.bg.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.bs.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.ca.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.cs.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.da.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.de.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.el.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.en.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.es.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.et.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.fi.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.fr.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.he.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.hr.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.hu.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.id.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.it.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.ja.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.ko.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.lt.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.lv.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.nl.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.no.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.pl.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.pt-BR.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.pt-PT.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.ro.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.ru.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.sk.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.sl.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.sr.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.sv.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.th.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.tr.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.uk.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.vi.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.zh-CN.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.zh-HK.json +1 -1
- package/dist/cdn/assets/portal-replacement-item-redirect/t9n/messages.zh-TW.json +1 -1
- package/dist/cdn/index.js +1 -1
- package/dist/cdn/main.css +1 -1
- package/dist/chunks/fieldAddDelete.js +1 -1
- package/dist/chunks/functionalities.js +10 -0
- package/dist/chunks/groups.js +86 -0
- package/dist/chunks/item.js +124 -22
- package/dist/chunks/portal.js +48 -8
- package/dist/chunks/runtime.js +3 -3
- package/dist/chunks/user.js +4 -109
- package/dist/chunks/user2.js +113 -0
- package/dist/components/arcgis-portal-ai-assistant/agents/types.d.ts +7 -0
- package/dist/components/arcgis-portal-ai-assistant/customElement.d.ts +20 -6
- package/dist/components/arcgis-portal-ai-assistant/customElement.js +738 -124
- package/dist/components/arcgis-portal-ai-assistant/index.js +2 -1
- package/dist/components/arcgis-portal-ai-assistant-interrupt/customElement.d.ts +42 -0
- package/dist/components/arcgis-portal-ai-assistant-interrupt/customElement.js +51 -0
- package/dist/components/arcgis-portal-ai-assistant-interrupt/index.d.ts +1 -0
- package/dist/components/arcgis-portal-ai-assistant-interrupt/index.js +6 -0
- package/dist/components/arcgis-portal-classification-config/customElement.js +44 -37
- package/dist/components/arcgis-portal-item-type/customElement.js +1 -1
- package/dist/components/arcgis-portal-mentionable-text-area/customElement.d.ts +2 -1
- package/dist/components/arcgis-portal-mentionable-text-area/customElement.js +38 -41
- package/dist/components/arcgis-portal-mentionable-text-area/utils.d.ts +7 -0
- package/dist/components/arcgis-portal-replacement-item-redirect/customElement.d.ts +3 -3
- package/dist/components/arcgis-portal-replacement-item-redirect/customElement.js +131 -63
- package/dist/components/arcgis-portal-user-avatar/customElement.js +24 -27
- package/dist/components/arcgis-portal-voice-input/customElement.d.ts +1 -1
- package/dist/docs/api.json +1 -1
- package/dist/docs/docs.json +1 -1
- package/dist/docs/vscode.html-custom-data.json +1 -1
- package/dist/docs/web-types.json +1 -1
- package/dist/index.d.ts +16 -0
- package/dist/loader.js +3 -2
- package/dist/types/lumina.d.ts +9 -1
- package/dist/types/preact.d.ts +10 -1
- package/dist/types/react.d.ts +11 -1
- package/dist/types/stencil.d.ts +9 -1
- package/package.json +12 -10
- package/dist/cdn/2UAWM45V.js +0 -2
- package/dist/cdn/4XGP5S32.js +0 -2
- package/dist/cdn/AMCZ4UZQ.js +0 -2
- package/dist/cdn/CVTNZK7F.js +0 -2
- package/dist/cdn/DAD7LUKA.js +0 -2
- package/dist/cdn/F5QGCGHF.js +0 -2
- package/dist/cdn/HGOHRPAD.js +0 -2
- package/dist/cdn/IZQBJ5VK.js +0 -2
- package/dist/cdn/JFG6QVNF.js +0 -2
- package/dist/cdn/LCWXNCUX.js +0 -396
- package/dist/cdn/NJMHL2Y7.js +0 -4
- package/dist/cdn/OGQ2PD7M.js +0 -2
- package/dist/cdn/S2PHM4WZ.js +0 -2
- package/dist/cdn/ZAHK6WQT.js +0 -138
- package/dist/chunks/item2.js +0 -128
- /package/dist/cdn/{3OPKWSWR.js → 34BMNP6G.js} +0 -0
- /package/dist/cdn/{JQKWT7SI.js → FPAFR5IL.js} +0 -0
- /package/dist/cdn/{N5K4DR3J.js → FPKINYFN.js} +0 -0
|
@@ -1,59 +1,61 @@
|
|
|
1
1
|
/* COPYRIGHT Esri - https://js.arcgis.com/5.1/LICENSE.txt */
|
|
2
|
-
import { c as
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { createRef as
|
|
6
|
-
import { u as
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
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";
|
|
9
10
|
import n from "zod";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
itemId: n.string().default(""),
|
|
22
|
-
question: n.string().default("")
|
|
23
|
-
}), R = n.object({ summary: n.string(), followUpQuestions: n.array(n.string()).default([]) }), F = n.object({ answer: n.string(), isRelevant: n.boolean() }), S = (e) => {
|
|
24
|
-
for (let t = e.length - 1; t >= 0; t -= 1) {
|
|
25
|
-
const s = e[t];
|
|
26
|
-
if (s.type !== "human")
|
|
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")
|
|
27
22
|
continue;
|
|
28
|
-
const
|
|
29
|
-
if (typeof
|
|
30
|
-
return
|
|
31
|
-
if (Array.isArray(
|
|
32
|
-
return
|
|
33
|
-
(
|
|
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 : ""
|
|
34
29
|
).join(" ").trim();
|
|
35
30
|
}
|
|
36
31
|
return "";
|
|
37
|
-
},
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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 ? {
|
|
41
43
|
status: "success",
|
|
42
|
-
outputMessage: (await
|
|
43
|
-
promptText:
|
|
44
|
-
schema:
|
|
44
|
+
outputMessage: (await b({
|
|
45
|
+
promptText: bt,
|
|
46
|
+
schema: ft,
|
|
45
47
|
modelTier: "default",
|
|
46
48
|
inputVariables: {
|
|
47
|
-
summary:
|
|
48
|
-
question:
|
|
49
|
-
fullContext: JSON.stringify(
|
|
49
|
+
summary: r.summary,
|
|
50
|
+
question: l,
|
|
51
|
+
fullContext: JSON.stringify(r.fullContext)
|
|
50
52
|
}
|
|
51
53
|
})).answer
|
|
52
54
|
} : {
|
|
53
55
|
status: "success",
|
|
54
56
|
outputMessage: "I don't have enough information yet. Please ask me to summarize the item first using summarize item <item id>."
|
|
55
57
|
};
|
|
56
|
-
},
|
|
58
|
+
}, bt = `
|
|
57
59
|
You answer follow-up questions about an ArcGIS item.
|
|
58
60
|
|
|
59
61
|
Ground your answer in the provided item context.
|
|
@@ -73,39 +75,69 @@ Item full context
|
|
|
73
75
|
|
|
74
76
|
Question:
|
|
75
77
|
{question}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
78
|
+
`;
|
|
79
|
+
function I(s) {
|
|
80
|
+
const { portal: t, user: e } = s ?? {};
|
|
81
|
+
if (!s || !t || !e)
|
|
82
|
+
throw new Error("Invalid context: PortalAssistantContext with portal and user is required.");
|
|
83
|
+
}
|
|
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;
|
|
86
113
|
return {
|
|
87
|
-
agentExecutionContext: { ...
|
|
88
|
-
analyticsIntent:
|
|
89
|
-
analyticsItemId:
|
|
114
|
+
agentExecutionContext: { ...s.agentExecutionContext },
|
|
115
|
+
analyticsIntent: m ? "clarify" : i,
|
|
116
|
+
analyticsItemId: o || null,
|
|
90
117
|
analyticsQuestion: u || "",
|
|
91
118
|
status: "success",
|
|
92
|
-
outputMessage:
|
|
119
|
+
outputMessage: m ? 'Please clarify with summarize item <item id>, summarize item #<title>, or summarize item #"<title with spaces>".' : ""
|
|
93
120
|
};
|
|
94
|
-
},
|
|
121
|
+
}, wt = `
|
|
95
122
|
Classify the user analytics request.
|
|
96
123
|
|
|
97
124
|
Rules:
|
|
98
125
|
- intent="summarize" only when the user explicitly asks to summarize/overview/recap an item.
|
|
99
126
|
- intent="followUp" for analytical questions about item details, including schema/fields/attributes/layers.
|
|
100
127
|
- intent="clarify" when neither summarize nor follow-up intent is clear.
|
|
101
|
-
-
|
|
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.
|
|
102
132
|
- If intent is "followUp", set question to the user's full question/request text.
|
|
103
133
|
- If intent is "summarize", set question="".
|
|
104
134
|
- When user asks to show/list/explain fields, schema, attributes, columns, or layer details, classify as "followUp" unless they explicitly request a summary.
|
|
105
135
|
- If hasSummaryContext is true, prefer "followUp" for detail-oriented requests that do not explicitly ask to summarize.
|
|
106
136
|
|
|
107
137
|
Examples:
|
|
108
|
-
- "Summarize item 0123456789abcdef0123456789abcdef" => summarize
|
|
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
|
|
109
141
|
- "Show the layer's available fields" => followUp
|
|
110
142
|
- "List attributes and explain what status means" => followUp
|
|
111
143
|
- "What fields are available?" with hasSummaryContext=true => followUp
|
|
@@ -116,46 +148,40 @@ hasSummaryContext:
|
|
|
116
148
|
|
|
117
149
|
User message:
|
|
118
150
|
{userMessage}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (!e || !t || !s)
|
|
123
|
-
throw new Error("Invalid context: PortalAssistantContext with portal and user is required.");
|
|
124
|
-
}
|
|
125
|
-
const Y = async (e, t) => {
|
|
126
|
-
const s = e.analyticsItemId;
|
|
127
|
-
if (!s)
|
|
151
|
+
`, xt = async (s, t) => {
|
|
152
|
+
const e = s.analyticsItemId;
|
|
153
|
+
if (!e)
|
|
128
154
|
return {
|
|
129
155
|
status: "success",
|
|
130
|
-
outputMessage:
|
|
156
|
+
outputMessage: 'Please clarify with summarize item <item id>, summarize item #<title>, or summarize item #"<title with spaces>".'
|
|
131
157
|
};
|
|
132
|
-
await
|
|
133
|
-
const
|
|
134
|
-
|
|
135
|
-
const { portal:
|
|
136
|
-
if (
|
|
137
|
-
return await
|
|
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), {
|
|
138
164
|
status: "success",
|
|
139
165
|
outputMessage: "Unable to retrieve item context for summarization."
|
|
140
166
|
};
|
|
141
|
-
const { context:
|
|
142
|
-
promptText:
|
|
143
|
-
schema:
|
|
167
|
+
const { context: o } = c, u = await b({
|
|
168
|
+
promptText: vt,
|
|
169
|
+
schema: ht,
|
|
144
170
|
modelTier: "default",
|
|
145
|
-
inputVariables: { context: JSON.stringify(
|
|
146
|
-
}), { followUpQuestions:
|
|
147
|
-
latestItemId:
|
|
171
|
+
inputVariables: { context: JSON.stringify(o) }
|
|
172
|
+
}), { followUpQuestions: d, summary: p } = u, m = N(s), f = {
|
|
173
|
+
latestItemId: e,
|
|
148
174
|
memory: {
|
|
149
|
-
...
|
|
150
|
-
[
|
|
175
|
+
...m.memory,
|
|
176
|
+
[e]: { summary: p, followUpQuestions: d, fullContext: o }
|
|
151
177
|
}
|
|
152
178
|
};
|
|
153
|
-
return
|
|
179
|
+
return d.length && await B({ type: "suggested-prompts", data: { prompts: d } }, t), {
|
|
154
180
|
status: "success",
|
|
155
|
-
outputMessage:
|
|
156
|
-
sharedStatePatch:
|
|
181
|
+
outputMessage: p,
|
|
182
|
+
sharedStatePatch: { portalItemAnalyticsSummaryMemory: { value: f } }
|
|
157
183
|
};
|
|
158
|
-
},
|
|
184
|
+
}, vt = `
|
|
159
185
|
You are a item summary tool for ArcGIS. Your job is to summarize an item's info based on the provided context.
|
|
160
186
|
Summary rules:
|
|
161
187
|
- The summary should be concise markdown, make sure to format the output nicely so it's easy to read.
|
|
@@ -170,71 +196,659 @@ Do not include internal identifiers.
|
|
|
170
196
|
If the user asks for a detailed summary, you may expand the response up to 300 words.
|
|
171
197
|
Item context:
|
|
172
198
|
{context}
|
|
173
|
-
`,
|
|
174
|
-
...
|
|
175
|
-
// States shared across nodes in the graph
|
|
199
|
+
`, C = (s, t) => t ?? s, O = h.Root({
|
|
200
|
+
...E(),
|
|
201
|
+
// States shared only across nodes in the graph, not between invocations
|
|
176
202
|
analyticsIntent: h({
|
|
177
|
-
reducer:
|
|
203
|
+
reducer: C,
|
|
178
204
|
default: () => "clarify"
|
|
179
205
|
}),
|
|
180
206
|
analyticsItemId: h({
|
|
181
|
-
reducer:
|
|
207
|
+
reducer: C,
|
|
182
208
|
default: () => null
|
|
183
209
|
}),
|
|
184
210
|
analyticsQuestion: h({
|
|
185
|
-
reducer:
|
|
211
|
+
reducer: C,
|
|
186
212
|
default: () => ""
|
|
187
213
|
})
|
|
188
|
-
}),
|
|
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:
|
|
189
215
|
- summarizes ArcGIS portal items from item context
|
|
190
216
|
- suggests follow-up prompts grounded in the item
|
|
191
|
-
`,
|
|
217
|
+
`, Tt = {
|
|
192
218
|
id: "portal-item-analytics",
|
|
193
219
|
name: "Portal Item Analytics",
|
|
194
|
-
description:
|
|
195
|
-
createGraph:
|
|
196
|
-
workspace:
|
|
197
|
-
},
|
|
198
|
-
|
|
220
|
+
description: Mt,
|
|
221
|
+
createGraph: St,
|
|
222
|
+
workspace: O
|
|
223
|
+
}, Pt = (s) => s.map((t) => `"${t}"`).join(", "), At = n.object({
|
|
224
|
+
successMessage: n.string().default("")
|
|
225
|
+
}), q = "portal-group-creation", D = "approveAddMembers", Ct = async (s, t) => {
|
|
226
|
+
if (s.intentParams.intent !== "addMembers")
|
|
227
|
+
return {
|
|
228
|
+
status: "success",
|
|
229
|
+
outputMessage: "Use @mention usernames for the members you want to add."
|
|
230
|
+
};
|
|
231
|
+
const e = s.agentExecutionContext.sharedState.createdGroupId?.value;
|
|
232
|
+
if (!e)
|
|
233
|
+
return {
|
|
234
|
+
status: "success",
|
|
235
|
+
outputMessage: "Create a group first, then add members using @mention usernames."
|
|
236
|
+
};
|
|
237
|
+
const a = s.intentParams.memberInfo.memberIdentifiers.map((m) => m.trim()).filter(Boolean);
|
|
238
|
+
if (!a.length)
|
|
239
|
+
return {
|
|
240
|
+
status: "success",
|
|
241
|
+
outputMessage: "Use @mention usernames for the members you want to add."
|
|
242
|
+
};
|
|
243
|
+
const l = `The following member(s) will be added to the newly created group:
|
|
244
|
+
|
|
245
|
+
${a.map((m) => `- **@${m}**`).join(`
|
|
246
|
+
`)}
|
|
247
|
+
|
|
248
|
+
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,
|
|
253
|
+
kind: "booleanChoice",
|
|
254
|
+
message: l,
|
|
255
|
+
metadata: {
|
|
256
|
+
action: "addMembers",
|
|
257
|
+
groupId: e,
|
|
258
|
+
members: [...a]
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
throw new V(m);
|
|
262
|
+
}
|
|
263
|
+
if (c.payload !== !0)
|
|
264
|
+
return {
|
|
265
|
+
status: "success",
|
|
266
|
+
outputMessage: "Okay, I cancelled adding members to the group."
|
|
267
|
+
};
|
|
268
|
+
await g(
|
|
269
|
+
{ text: `Adding members ${Pt(a)}...`, agentName: "group-creation" },
|
|
270
|
+
t
|
|
271
|
+
);
|
|
272
|
+
const i = t?.configurable?.context;
|
|
273
|
+
I(i);
|
|
274
|
+
const { result: o, error: u } = await lt(i.portal, e, a);
|
|
275
|
+
if (u || !o)
|
|
276
|
+
return {
|
|
277
|
+
status: "success",
|
|
278
|
+
outputMessage: "I could not add members to that group. Please confirm group access and user accounts, then try again."
|
|
279
|
+
};
|
|
280
|
+
const { addedUsernames: d, notAddedUsers: p } = o;
|
|
281
|
+
try {
|
|
282
|
+
const f = (await b({
|
|
283
|
+
promptText: $t,
|
|
284
|
+
schema: At,
|
|
285
|
+
modelTier: "fast",
|
|
286
|
+
inputVariables: {
|
|
287
|
+
addedMembers: d.join(", "),
|
|
288
|
+
notAddedMembers: JSON.stringify(
|
|
289
|
+
p.map((v) => ({ username: v.username, reason: v.error.message }))
|
|
290
|
+
)
|
|
291
|
+
}
|
|
292
|
+
})).successMessage;
|
|
293
|
+
if (f)
|
|
294
|
+
return { status: "success", outputMessage: f };
|
|
295
|
+
} catch (m) {
|
|
296
|
+
console.error("Error generating add-members success message:", m);
|
|
297
|
+
}
|
|
298
|
+
return {};
|
|
299
|
+
}, $t = `
|
|
300
|
+
Write a concise, friendly success message for adding members to a group.
|
|
301
|
+
|
|
302
|
+
Rules:
|
|
303
|
+
- Keep it to 1-2 short sentences.
|
|
304
|
+
- 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
|
|
308
|
+
|
|
309
|
+
Added members:
|
|
310
|
+
{addedMembers}
|
|
311
|
+
|
|
312
|
+
Not added members:
|
|
313
|
+
{notAddedMembers}
|
|
314
|
+
`, R = "portal-group-creation", U = "approveCreateGroup", Gt = n.object({
|
|
315
|
+
successMessage: n.string().default("")
|
|
316
|
+
}), Et = n.object({
|
|
317
|
+
failureMessage: n.string().default("")
|
|
318
|
+
}), Nt = async (s, t) => {
|
|
319
|
+
if (s.intentParams.intent !== "create")
|
|
320
|
+
return {
|
|
321
|
+
status: "success",
|
|
322
|
+
outputMessage: "Tell me the group title you want to use."
|
|
323
|
+
};
|
|
324
|
+
const e = s.intentParams.title.trim();
|
|
325
|
+
if (!e)
|
|
326
|
+
return {
|
|
327
|
+
status: "success",
|
|
328
|
+
outputMessage: "What title would you like for the new group?"
|
|
329
|
+
};
|
|
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,
|
|
335
|
+
kind: "booleanChoice",
|
|
336
|
+
message: a,
|
|
337
|
+
metadata: {
|
|
338
|
+
action: "createGroup",
|
|
339
|
+
title: e,
|
|
340
|
+
access: "private"
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
throw new V(u);
|
|
344
|
+
}
|
|
345
|
+
if (r.payload !== !0)
|
|
346
|
+
return {
|
|
347
|
+
status: "success",
|
|
348
|
+
outputMessage: `Okay, I cancelled creating **${e}**.`
|
|
349
|
+
};
|
|
350
|
+
await g({ text: `Creating group "${e}"...`, agentName: "group-creation" }, t);
|
|
351
|
+
const l = t?.configurable?.context;
|
|
352
|
+
I(l);
|
|
353
|
+
const { result: c, error: i } = await ct(l.portal, {
|
|
354
|
+
title: e,
|
|
355
|
+
access: "private"
|
|
356
|
+
});
|
|
357
|
+
if (i || !c) {
|
|
358
|
+
const u = i?.message?.trim() || "No additional details were provided.";
|
|
359
|
+
try {
|
|
360
|
+
const p = (await b({
|
|
361
|
+
promptText: qt,
|
|
362
|
+
schema: Et,
|
|
363
|
+
modelTier: "fast",
|
|
364
|
+
inputVariables: {
|
|
365
|
+
groupTitle: e,
|
|
366
|
+
failureReason: u
|
|
367
|
+
}
|
|
368
|
+
})).failureMessage.trim();
|
|
369
|
+
if (p)
|
|
370
|
+
return {
|
|
371
|
+
status: "success",
|
|
372
|
+
outputMessage: p
|
|
373
|
+
};
|
|
374
|
+
} catch (d) {
|
|
375
|
+
console.error("Error generating create-group failure message:", d);
|
|
376
|
+
}
|
|
377
|
+
return {
|
|
378
|
+
status: "success",
|
|
379
|
+
outputMessage: "I could not create that group. Please confirm your permissions and try again with the group title."
|
|
380
|
+
};
|
|
381
|
+
}
|
|
382
|
+
const o = c.id;
|
|
383
|
+
try {
|
|
384
|
+
const d = (await b({
|
|
385
|
+
promptText: kt,
|
|
386
|
+
schema: Gt,
|
|
387
|
+
modelTier: "fast",
|
|
388
|
+
inputVariables: {
|
|
389
|
+
groupTitle: e
|
|
390
|
+
}
|
|
391
|
+
})).successMessage.trim();
|
|
392
|
+
if (d)
|
|
393
|
+
return {
|
|
394
|
+
status: "success",
|
|
395
|
+
outputMessage: d,
|
|
396
|
+
sharedStatePatch: { createdGroupId: { value: o } },
|
|
397
|
+
createdGroupId: o
|
|
398
|
+
};
|
|
399
|
+
} catch (u) {
|
|
400
|
+
console.error("Error generating create-group success message:", u);
|
|
401
|
+
}
|
|
402
|
+
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 = `
|
|
448
|
+
You classify whether a user is asking to create a new ArcGIS Portal group or add members to an existing group.
|
|
449
|
+
|
|
450
|
+
Rules:
|
|
451
|
+
- Set intent="create" when the user asks to create a group and a title can be identified.
|
|
452
|
+
- Set intent="addMembers" when the user asks to add one or more members to a group.
|
|
453
|
+
- Set intent="clarify" when required data is missing or the request is ambiguous.
|
|
454
|
+
- For create requests, extract title only.
|
|
455
|
+
- For add-members requests, extract memberIdentifiers as ArcGIS usernames only (no @ prefix), but if you're returning a hint text asking for missing members, include the @ prefix.
|
|
456
|
+
- If the user includes mentions like @jsmith, return "jsmith" in memberIdentifiers.
|
|
457
|
+
- Do not extract group ids or group titles; add-members is a follow-up action that targets the most recently created group.
|
|
458
|
+
- When intent="clarify", provide a concise clarifyMessage describing exactly what is missing.
|
|
459
|
+
- If the user gives the title in quotes, extract exactly that title.
|
|
460
|
+
- If the user says create group <title> without quotes, extract only the title text after the create-group wording.
|
|
461
|
+
- If the user message looks like only a potential title (short phrase, not a question), treat it as the title and set intent="create".
|
|
462
|
+
- Return only extracted values. Do not add helper text into title or memberIdentifiers.
|
|
463
|
+
- Make sure to match the user's tone and texting style
|
|
464
|
+
|
|
465
|
+
Examples:
|
|
466
|
+
- help me create a new group "<title>" => intent="create", title="<title>", memberIdentifiers=[]
|
|
467
|
+
- add @<username1> and @<username2> => intent="addMembers", memberIdentifiers=["<username1>","<username2>"]
|
|
468
|
+
- add <member> => intent="addMembers", memberIdentifiers=["<member>"]
|
|
469
|
+
- help me create a new group => intent="clarify" with a question for missing title
|
|
470
|
+
|
|
471
|
+
User message:
|
|
472
|
+
{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
|
+
}),
|
|
480
|
+
n.object({
|
|
481
|
+
destinationType: n.literal("portal-item"),
|
|
482
|
+
itemId: n.string().trim().min(1)
|
|
483
|
+
}),
|
|
484
|
+
n.object({
|
|
485
|
+
destinationType: n.literal("portal-group"),
|
|
486
|
+
groupId: n.string().trim().min(1)
|
|
487
|
+
})
|
|
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(),
|
|
500
|
+
// * Shared state between nodes (but not persisted to the agent execution context)
|
|
501
|
+
/** Parameters related to the user's intent for group creation actions */
|
|
502
|
+
intentParams: h({ reducer: z, default: () => ({ intent: "clarify" }) }),
|
|
503
|
+
/** The ID of the group that was created
|
|
504
|
+
* even though we already have this in the shared state
|
|
505
|
+
* we still need it here to also share between nodes
|
|
506
|
+
*/
|
|
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) => {
|
|
509
|
+
switch (t.intentParams.intent) {
|
|
510
|
+
case "create":
|
|
511
|
+
return "createPortalGroup";
|
|
512
|
+
case "addMembers":
|
|
513
|
+
return "addMembersToPortalGroup";
|
|
514
|
+
default:
|
|
515
|
+
return y;
|
|
516
|
+
}
|
|
517
|
+
}).addEdge("createPortalGroup", "suggestCreatedGroupNavigation").addEdge("addMembersToPortalGroup", "suggestCreatedGroupNavigation").addEdge("suggestCreatedGroupNavigation", y), Bt = String.raw`- **portal-group-creation** - Portal group creation assistant:
|
|
518
|
+
- creates a new ArcGIS Portal group for the signed-in user
|
|
519
|
+
- adds users to the newly created group using @mention usernames
|
|
520
|
+
`, Lt = {
|
|
521
|
+
id: "portal-group-creation",
|
|
522
|
+
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;
|
|
528
|
+
if (!t || typeof t != "object")
|
|
529
|
+
return Qt();
|
|
530
|
+
const e = t;
|
|
531
|
+
return {
|
|
532
|
+
conversationId: typeof e.conversationId == "string" ? e.conversationId : ""
|
|
533
|
+
};
|
|
534
|
+
}, Wt = (s) => ({
|
|
535
|
+
[H]: { value: s }
|
|
536
|
+
});
|
|
537
|
+
async function Ot({
|
|
538
|
+
portal: s,
|
|
539
|
+
question: t,
|
|
540
|
+
persona: e,
|
|
541
|
+
previousConversationId: a,
|
|
542
|
+
signal: r,
|
|
543
|
+
skillId: l
|
|
544
|
+
}) {
|
|
545
|
+
l ??= "doc_ai_assistant";
|
|
546
|
+
const i = await _t({
|
|
547
|
+
portal: s,
|
|
548
|
+
skillId: l,
|
|
549
|
+
message: t,
|
|
550
|
+
options: { context: {
|
|
551
|
+
kind: "DocAIAssistantRequest",
|
|
552
|
+
filters: { persona: { persona: e } }
|
|
553
|
+
}, previousConversationId: a, signal: r }
|
|
554
|
+
});
|
|
555
|
+
return {
|
|
556
|
+
reply: Jt(i, l),
|
|
557
|
+
conversationId: i[0]?.conversationId ?? ""
|
|
558
|
+
};
|
|
559
|
+
}
|
|
560
|
+
async function _t({
|
|
561
|
+
portal: s,
|
|
562
|
+
skillId: t,
|
|
563
|
+
message: e,
|
|
564
|
+
options: a
|
|
565
|
+
}) {
|
|
566
|
+
const l = `${s.helperServices.aiAssistantServices.url}/skills/${t}/chat`, c = {
|
|
567
|
+
"Content-Type": "application/json",
|
|
568
|
+
token: mt.findCredential(s.url)?.token ?? ""
|
|
569
|
+
}, i = await k(l, {
|
|
570
|
+
method: "post",
|
|
571
|
+
body: JSON.stringify({
|
|
572
|
+
message: e,
|
|
573
|
+
context: a.context,
|
|
574
|
+
conversationId: a.previousConversationId
|
|
575
|
+
}),
|
|
576
|
+
headers: c,
|
|
577
|
+
signal: a.signal
|
|
578
|
+
});
|
|
579
|
+
if (i.httpStatus !== 200)
|
|
580
|
+
throw new Error(`Doc assistant chat failed (${i.httpStatus})`, {
|
|
581
|
+
cause: i.data
|
|
582
|
+
});
|
|
583
|
+
const o = i.data, u = [o], { conversationId: d, inquiryId: p } = o, m = async (f, v) => {
|
|
584
|
+
if (!v)
|
|
585
|
+
return;
|
|
586
|
+
await ot(1e3);
|
|
587
|
+
const S = await k(l, {
|
|
588
|
+
method: "post",
|
|
589
|
+
body: JSON.stringify({ conversationId: d, inquiryId: p, ackSequenceNumber: f }),
|
|
590
|
+
headers: c,
|
|
591
|
+
signal: a.signal
|
|
592
|
+
});
|
|
593
|
+
if (S.httpStatus !== 200)
|
|
594
|
+
throw new Error(`Doc assistant poll failed (${S.httpStatus})`, {
|
|
595
|
+
cause: S.data
|
|
596
|
+
});
|
|
597
|
+
const A = S.data;
|
|
598
|
+
u.push(A), await m(A.sequenceNumber, A.hasMore);
|
|
599
|
+
};
|
|
600
|
+
return o.hasMore && await m(o.sequenceNumber, o.hasMore), u;
|
|
601
|
+
}
|
|
602
|
+
function Jt(s, t) {
|
|
603
|
+
switch (t) {
|
|
604
|
+
case "doc_chat":
|
|
605
|
+
return s.find((e) => e.message != null)?.message ?? "";
|
|
606
|
+
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;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
return "";
|
|
616
|
+
default:
|
|
617
|
+
return P(t);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
const Yt = async (s, t) => {
|
|
621
|
+
await g({ text: "Asking documentation assistant...", agentName: "doc-assistant" }, t);
|
|
622
|
+
const e = x(s.agentExecutionContext.messages).trim();
|
|
623
|
+
if (!e)
|
|
624
|
+
return {
|
|
625
|
+
status: "success",
|
|
626
|
+
outputMessage: "Please share your question and I can help with ArcGIS and Portal documentation."
|
|
627
|
+
};
|
|
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,
|
|
632
|
+
question: e,
|
|
633
|
+
previousConversationId: r.conversationId || void 0,
|
|
634
|
+
skillId: "doc_ai_assistant",
|
|
635
|
+
persona: "developers"
|
|
636
|
+
});
|
|
637
|
+
return {
|
|
638
|
+
status: "success",
|
|
639
|
+
outputMessage: l.trim() || "I could not retrieve a response from the documentation assistant.",
|
|
640
|
+
sharedStatePatch: Wt({
|
|
641
|
+
conversationId: c || r.conversationId
|
|
642
|
+
})
|
|
643
|
+
};
|
|
644
|
+
}, Ht = K(
|
|
645
|
+
async ({ groupTitle: s }, t) => {
|
|
646
|
+
const e = s.trim();
|
|
647
|
+
if (!e)
|
|
648
|
+
return null;
|
|
649
|
+
const a = t?.configurable?.context;
|
|
650
|
+
I(a);
|
|
651
|
+
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;
|
|
655
|
+
}
|
|
656
|
+
},
|
|
657
|
+
{
|
|
658
|
+
name: "resolvePortalGroupIdByTitle",
|
|
659
|
+
description: "Resolves an ArcGIS Portal group title to the best-match group id. Use this when a user references a group by title instead of an explicit group id.",
|
|
660
|
+
schema: n.object({
|
|
661
|
+
groupTitle: n.string().describe("The portal group title to resolve to a group id.")
|
|
662
|
+
})
|
|
663
|
+
}
|
|
664
|
+
), j = n.object({
|
|
665
|
+
shouldSuggestNavigation: n.boolean().default(!1),
|
|
666
|
+
destinationType: n.enum(["none", "portal-content", "portal-item", "portal-groups", "portal-group"]).default("none"),
|
|
667
|
+
itemId: n.string().default(""),
|
|
668
|
+
groupId: n.string().default("")
|
|
669
|
+
}), Xt = async (s, t) => {
|
|
670
|
+
await g({ text: "Extracting navigation intent...", agentName: "doc-assistant" }, t);
|
|
671
|
+
const e = s.outputMessage.trim();
|
|
672
|
+
if (!e)
|
|
673
|
+
return {};
|
|
674
|
+
const a = x(s.agentExecutionContext.messages).trim(), r = await L.fromTemplate(te).format({
|
|
675
|
+
question: a,
|
|
676
|
+
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 ?? {});
|
|
684
|
+
if (!i.shouldSuggestNavigation || i.destinationType === "none")
|
|
685
|
+
return {};
|
|
686
|
+
const o = Zt(i);
|
|
687
|
+
return o ? (await J(o, t), {}) : {};
|
|
688
|
+
};
|
|
689
|
+
function Zt({
|
|
690
|
+
destinationType: s,
|
|
691
|
+
itemId: t,
|
|
692
|
+
groupId: e
|
|
693
|
+
}) {
|
|
694
|
+
switch (s) {
|
|
695
|
+
case "portal-content":
|
|
696
|
+
return { destinationType: "portal-content" };
|
|
697
|
+
case "portal-groups":
|
|
698
|
+
return { destinationType: "portal-groups" };
|
|
699
|
+
case "portal-item":
|
|
700
|
+
return t ? { destinationType: "portal-item", itemId: t } : null;
|
|
701
|
+
case "portal-group":
|
|
702
|
+
return e ? { destinationType: "portal-group", groupId: e } : null;
|
|
703
|
+
case "none":
|
|
704
|
+
return null;
|
|
705
|
+
default:
|
|
706
|
+
return P(s);
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
const te = `
|
|
710
|
+
You decide whether the assistant response should include a navigation action to ArcGIS Portal.
|
|
711
|
+
|
|
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)
|
|
719
|
+
|
|
720
|
+
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.
|
|
727
|
+
|
|
728
|
+
User question:
|
|
729
|
+
{question}
|
|
730
|
+
|
|
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`;
|
|
746
|
+
switch (e) {
|
|
747
|
+
case "portal-content":
|
|
748
|
+
return `${a}/content.html`;
|
|
749
|
+
case "portal-groups":
|
|
750
|
+
return `${a}/groups.html`;
|
|
751
|
+
case "portal-item":
|
|
752
|
+
return `${a}/item.html?id=${s.itemId}`;
|
|
753
|
+
case "portal-group":
|
|
754
|
+
return `${a}/group.html?id=${s.groupId}`;
|
|
755
|
+
default:
|
|
756
|
+
return P(e);
|
|
757
|
+
}
|
|
758
|
+
};
|
|
759
|
+
class ne extends tt {
|
|
199
760
|
constructor() {
|
|
200
|
-
super(...arguments), this.t9n =
|
|
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)
|
|
764
|
+
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();
|
|
201
768
|
}
|
|
202
769
|
static {
|
|
203
|
-
this.properties = { inputText: 16, showVoiceInput: 16, isListening: 16, isVoiceInputDisabled: 16, autoDestroyDisabled: 5, portal: 0, user: 0, config: 0, defaultClosed: 5
|
|
770
|
+
this.properties = { inputText: 16, showVoiceInput: 16, isListening: 16, isVoiceInputDisabled: 16, interrupt: 16, autoDestroyDisabled: 5, portal: 0, user: 0, config: 0, defaultClosed: 5 };
|
|
204
771
|
}
|
|
205
772
|
static {
|
|
206
|
-
this.styles =
|
|
773
|
+
this.styles = re;
|
|
774
|
+
}
|
|
775
|
+
getNavigationAction(t) {
|
|
776
|
+
if (t?.type !== _)
|
|
777
|
+
return;
|
|
778
|
+
const e = jt(t.data);
|
|
779
|
+
if (!e)
|
|
780
|
+
return;
|
|
781
|
+
const a = oe(e, this.portal);
|
|
782
|
+
if (a)
|
|
783
|
+
return { href: a, targetDetail: e, label: this.getNavigationText(e.destinationType) };
|
|
784
|
+
}
|
|
785
|
+
upsertNavigationSlotElement(t, e) {
|
|
786
|
+
const a = this.assistantEl.value;
|
|
787
|
+
if (!a)
|
|
788
|
+
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) => {
|
|
791
|
+
l.preventDefault(), this.arcgisPortalNavigationRequest.emit({
|
|
792
|
+
href: e.href,
|
|
793
|
+
targetDetail: e.targetDetail
|
|
794
|
+
});
|
|
795
|
+
}}>${e.label}</calcite-button>${e.description ? w`<div class="navigation-block-description">${e.description}</div>` : null}</div>`, r);
|
|
796
|
+
}
|
|
797
|
+
getNavigationText(t) {
|
|
798
|
+
const e = this.t9n.navigation;
|
|
799
|
+
switch (t) {
|
|
800
|
+
case "portal-content":
|
|
801
|
+
return e.openContent;
|
|
802
|
+
case "portal-groups":
|
|
803
|
+
return e.openGroups;
|
|
804
|
+
case "portal-item":
|
|
805
|
+
return e.openItem;
|
|
806
|
+
case "portal-group":
|
|
807
|
+
return e.openGroup;
|
|
808
|
+
default:
|
|
809
|
+
return P(t);
|
|
810
|
+
}
|
|
207
811
|
}
|
|
208
812
|
render() {
|
|
209
|
-
const { t9n: t, inputText:
|
|
210
|
-
return
|
|
211
|
-
this.
|
|
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;
|
|
816
|
+
}} @arcgisInterruptCancel=${() => {
|
|
817
|
+
this.interrupt = null;
|
|
818
|
+
}} @arcgisInterruptSubmit=${() => {
|
|
819
|
+
this.interrupt = null;
|
|
820
|
+
}} @arcgisPromptSelect=${({ detail: o }) => {
|
|
821
|
+
this.inputText = o.prompt, requestAnimationFrame(() => {
|
|
212
822
|
this.inputEl.value?.focusTextArea();
|
|
213
823
|
});
|
|
214
|
-
}} ${
|
|
215
|
-
|
|
216
|
-
const
|
|
217
|
-
|
|
218
|
-
}} ${
|
|
219
|
-
|
|
220
|
-
}} @arcgisUserMentionableTextAreaChange=${({ detail:
|
|
221
|
-
this.inputText =
|
|
222
|
-
}} ${
|
|
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=${() => {
|
|
223
833
|
this.isListening = !0, this.isVoiceInputDisabled = !1;
|
|
224
834
|
}} @arcgisVoiceInputStop=${() => {
|
|
225
835
|
this.isListening = !1, this.isVoiceInputDisabled = !1;
|
|
226
|
-
}} @arcgisVoiceInputError=${(
|
|
227
|
-
|
|
228
|
-
}} @arcgisVoiceInputInterimTranscription=${(
|
|
229
|
-
this.inputText =
|
|
230
|
-
}} ${
|
|
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 () => {
|
|
231
841
|
this.isVoiceInputDisabled = !0;
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
}}></calcite-button>` || ""}<calcite-button type=submit icon-start=send round .disabled=${!
|
|
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);
|
|
846
|
+
}} @arcgisCancel=${() => {
|
|
847
|
+
this.assistantEl.value?.cancelInterrupt();
|
|
848
|
+
}}></arcgis-portal-ai-assistant-interrupt>` || ""}</arcgis-assistant>`;
|
|
235
849
|
}
|
|
236
850
|
}
|
|
237
|
-
|
|
851
|
+
Z("arcgis-portal-ai-assistant", ne);
|
|
238
852
|
export {
|
|
239
|
-
|
|
853
|
+
ne as ArcgisPortalAiAssistant
|
|
240
854
|
};
|