import { c as G } from "../../chunks/runtime.js";
import { nothing as V, LitElement as Q } from "@arcgis/lumina";
import { ref as J, createRef as K } from "lit/directives/ref.js";
import Y from "@arcgis/core/identity/IdentityManager.js";
import { u as X } from "../../chunks/useT9n.js";
import { b as T } from "../../chunks/arcade-defaults.js";
import { css as Z, html as c } from "lit";
import { log as b } from "@arcgis/toolkit/log";
import E from "@arcgis/core/request.js";
import { e as ee, a as te } from "../../chunks/utilities.js";
import { repeat as z } from "lit/directives/repeat.js";
import "@arcgis/toolkit/function";
import { generateGuid as ie } from "@arcgis/toolkit/string";
import { unsafeHTML as x } from "lit/directives/unsafe-html.js";
import oe from "@arcgis/core/layers/FeatureLayer.js";
import ae from "@arcgis/core/config.js";
import se from "@arcgis/core/Graphic.js";
import { b as re } from "../../chunks/language-defaults-base.js";
import { getDeclaredVoxelMembers as ce, getDeclaredPixelMembers as ne } from "@arcgis/core/applications/Components/arcadeEditorUtils.js";
import { s as le } from "../../chunks/fields.js";
/*! All material copyright Esri, All Rights Reserved, unless otherwise specified.
See https://js.arcgis.com/5.0/esri/copyright.txt for details.
v5.0.0-next.112 */
const de = Z`:host(:not([closed])){container-type:size;--calcite-block-border-color: var(--calcite-color-transparent);flex:1 0 auto;border-inline-start:var(--arcgis-coding-components-border);box-sizing:border-box;max-width:var(--arcgis-coding-components-code-editor-side-panel-max-w);width:var(--arcgis-coding-components-code-editor-side-panel-w);.submission-actions-wrapper{display:flex;flex-direction:column;width:100%;gap:.75rem}.submission-actions{display:flex;flex-direction:row;gap:.5rem;justify-content:space-between}@container (max-width: 380px){.hidden-below-380{display:none}}@container (min-width: 380px){.hidden-above-380{display:none}}.gaps{display:flex;gap:.25rem}.align-inline-end{margin-inline-start:auto}.action .error-display{display:flex;flex-direction:row;gap:.5rem;justify-content:space-between}.context-popover p{padding:0 .5rem;font-size:var(--calcite-font-size-sm)}.feedback-content{padding:1rem;display:flex;flex-direction:column;gap:.75rem;max-height:30vh;overflow-y:auto}.feedback-sheet{--calcite-sheet-height: auto;--calcite-sheet-max-height: 100%;--calcite-sheet-min-height: auto}calcite-chip[slot=header-actions-end]{align-self:center;margin-inline-end:.5rem}calcite-flow-item calcite-shell{background:transparent}calcite-block{width:100%;max-width:100%;align-self:flex-end;background-color:transparent;margin-block:0}calcite-sheet{--calcite-sheet-scrim-background: rgba(200, 200, 200, .5)}.type-suggestion{--calcite-color-foreground-1: var(--calcite-color-foreground-current);--calcite-color-text-3: var(--calcite-color-text-2);--calcite-icon-color: var(--calcite-color-brand)}.type-history{--calcite-icon-color: var(--calcite-color-text-2)}.type-response{--calcite-icon-color: var(--calcite-color-brand);--calcite-font-family: monospace}.block-response{align-self:flex-start;margin-block-end:4rem;border-block-end:0;--calcite-block-text-color: var(--calcite-color-brand)}calcite-list-item calcite-button{margin-inline-end:.25rem}.type-docs{--calcite-color-foreground-1: var(--calcite-color-foreground-3);--calcite-icon-color: var(--calcite-color-text-1)}.type-error{--calcite-icon-color: var(--calcite-color-status-danger);--calcite-font-family: monospace;border:1px solid var(--calcite-color-status-danger)}#thumbs-up{margin-inline-start:auto;--calcite-icon-color: var(--calcite-color-border-input)}#thumbs-down{--calcite-icon-color: var(--calcite-color-border-input)}calcite-flow-item calcite-shell calcite-notice{margin-block:1rem}.no-space-block,.no-space-block[open]{margin:0}calcite-block[open]:last-of-type{border-block-end:0}.text-area-wrapper{display:flex;border-radius:var(--calcite-corner-radius-round);margin:.75rem;overflow:hidden;--calcite-color-border-input: transparent;position:sticky;box-shadow:var(--calcite-shadow-sm);flex:none}calcite-text-area{height:auto;min-height:5.75rem;overflow:hidden;border-radius:var(--calcite-corner-radius-round) var(--calcite-corner-radius-round) 0 0;--calcite-font-weight-normal: 500;font-weight:500;line-height:1.2}.standalone-list{margin:1rem;width:calc(100% - 2rem)}.result-disclaimer{display:block;width:24rem;max-width:90%;margin:1rem auto;text-align:center;line-height:1.125rem;font-size:.875rem;font-style:italic}calcite-flow{height:100%}calcite-popover calcite-list{--calcite-list-background-color: transparent;--calcite-input-border-color: transparent}calcite-popover calcite-list calcite-filter{--calcite-spacing-sm: 0}.contained-popover-or-tooltip{--calcite-popover-max-size-x: 100%;--calcite-tooltip-max-size-x: 100%}.break-spaces{white-space:break-spaces}.feedback-button-container{margin-inline-start:auto;gap:0}.info-heading{font-size:var(--calcite-font-size-1);color:var(--calcite-color-text-1)}.unstyled-h3{margin:unset;font-size:var(--calcite-font-size-md)}.unstyled-shell{position:unset;inset:unset;display:unset;block-size:unset;inline-size:unset}.suggestion-button{font-weight:var(--calcite-font-weight-medium)}.info-block{max-width:450px}#result-block{calcite-card-group{--calcite-card-group-gap: 1.25rem}calcite-card{--calcite-card-corner-radius: var(--calcite-corner-radius-round);--calcite-card-border-color: transparent;width:100%}.positioned-code-content{display:flex;flex-direction:row;gap:.5rem;padding:.5rem}calcite-card [slot=heading] calcite-chip{margin-block-start:.25rem}.code-response-wrapper{position:relative;background:var(--calcite-color-foreground-2);border-radius:var(--calcite-corner-radius-round);margin-top:-1.5rem}.prior-prompt{display:flex;flex-direction:row;padding:0;overflow-y:hidden;overflow-x:auto;margin:.25rem 0 .75rem;align-items:center;max-width:100%;span{overflow-x:auto;overflow-y:hidden}}.copy-feedback{display:none}.copy-prompt-button{align-self:flex-start;margin-inline-start:auto}.response-secondary-action-button[data-copied]+.copy-feedback,.copy-prompt-button[data-copied]+.copy-feedback{display:block;span{padding:.75rem 1rem;font-size:var(--calcite-font-size--2);line-height:1.375;color:var(--calcite-color-text--2);font-weight:var(--calcite-font-weight-medium)}}.copy-prompt-button[data-copied]~.copy-tooltip,.response-secondary-action-button[data-copied]~.copy-tooltip{display:none}code{white-space:pre;font-size:12px;margin:0;overflow-x:auto;font-family:Fira Mono,Consolas,Menlo,monospace;display:block;max-height:12rem;position:relative;padding:.5rem}.code-collapse{margin-inline-start:auto}.response-secondary-action-button{margin-left:.5rem}.add-to-editor-button{--calcite-internal-button-border-color: unset}}.collapsible-code{padding:.5rem}.collapsible-code summary{cursor:pointer;font-weight:500;color:var(--calcite-color-brand);outline:none;padding:.25rem 0}.collapsible-code[open] summary{color:var(--calcite-color-text-2)}.collapsible-error{padding:.5rem}.collapsible-error summary{cursor:pointer;font-weight:500;color:var(--calcite-color-status-danger);outline:none;padding:.25rem 0}.collapsible-error[open] summary{color:var(--calcite-color-text-2)}.response-error-container{padding:.5rem;background:color-mix(in srgb,var(--calcite-color-status-warning) 10%,transparent);border-radius:var(--calcite-corner-radius-round);margin:1rem 0;font-size:var(--calcite-font-size--2);--calcite-input-message-icon-color: var(--calcite-color-status-warning)}.response-error-chip{--calcite-internal-chip-background-color: var(--calcite-color-status-warning);--calcite-chip-icon-color: var(--calcite-color-foreground-1);--calcite-chip-border-color: var(--calcite-color-transparent)}.feedback-actions{gap:unset}.contained{max-width:100%;max-height:100%;max-width:100cqi;max-height:75cqb;overflow-y:auto}}:host([closed]){display:none}`;
class v extends Error {
  constructor({
    message: e,
    code: t,
    subCode: o,
    details: r,
    source: n
  }) {
    super(e), this.name = "ArcadeAssistantError", this.code = t, this.subCode = o, this.details = r, this.source = n;
  }
}
function R(i) {
  if (!i)
    return;
  const e = i.indexOf('{"error":');
  if (e !== -1)
    try {
      const t = i.slice(e), o = JSON.parse(t);
      if (o && typeof o == "object" && o.error)
        return o.error;
    } catch {
      return;
    }
}
async function pe(i) {
  const { baseUrl: e, skillId: t, message: o, authToken: r, previousConversationId: n, context: u } = i, d = t ? `${e}/skills/${t}/chat` : `${e}/chat`, s = [], a = {
    message: o,
    context: u
  };
  n && (a.conversation_id = n);
  let l;
  try {
    l = await E(d, {
      method: "post",
      headers: {
        "Content-Type": "application/json",
        token: r
      },
      body: JSON.stringify(a),
      responseType: "json"
    });
  } catch (m) {
    const f = m, w = f.details?.rawResponse || f.message || String(m), g = R(w);
    throw g ? new v(g) : m;
  }
  const p = l.data;
  s.push(p);
  const $ = p.conversationId, H = p.inquiryId;
  let C = p.sequenceNumber;
  async function B() {
    let m = 0;
    const f = 25;
    for (; m < f; ) {
      await new Promise((y) => setTimeout(y, 1e3));
      const w = ue($, C, H);
      let g;
      try {
        g = await E(d, {
          method: "post",
          headers: {
            "Content-Type": "application/json",
            token: r
          },
          body: JSON.stringify(w),
          responseType: "json"
        });
      } catch (y) {
        const S = y, W = S.details?.rawResponse || S.message || String(y), I = R(W);
        throw I ? new v(I) : y;
      }
      const h = g.data;
      if (h.context?.kind === "ArcgisErrorAsContext" && h.context.error)
        throw new v({
          message: h.context.error.message || "ArcGIS Assistant error",
          code: h.context.error.code,
          subCode: h.context.error.subCode,
          details: h.context.error.details,
          source: "polling-response"
        });
      if (s.push(h), C = h.sequenceNumber, m++, !h.hasMore)
        break;
    }
    if (m === f)
      throw new v({
        message: "Request timed out",
        code: "TIMEOUT",
        source: "polling"
      });
  }
  const j = 120 * 1e3;
  return await Promise.race([
    B(),
    new Promise(
      (m, f) => setTimeout(
        () => f(
          new v({
            message: "Request timed out",
            code: "TIMEOUT",
            source: "hard-timeout"
          })
        ),
        j
      )
    )
  ]), s;
}
function ue(i, e, t) {
  return {
    conversationId: i,
    inquiryId: t,
    ackSequenceNumber: e
  };
}
function he(i) {
  return i.message.match(/Error in prompt shield/u) ? "I'm having trouble with this request. Try again by rephrasing the question." : i.code === "TIMEOUT" ? "I'm having trouble with this request. Try again by re-asking the same question or rephrasing it." : i.message;
}
const me = (i) => {
  const e = i.value.length, t = 72, o = 180, r = i.offsetWidth, u = Math.max(1, Math.floor(r / 8)), d = Math.ceil(e / u), s = t + (d - 2) * 24;
  i.style.setProperty("--calcite-text-area-min-height", `${Math.min(s, o)}px`);
};
function fe({ messages: i }) {
  return c`<calcite-chip slot=header-actions-end scale=s appearance=outline-fill .label=${i.beta ?? "Beta"}>${i.beta ?? "Beta"}</calcite-chip>`;
}
function be({ popoverContent: i }) {
  return c`<calcite-action icon=information slot=header-actions-end id=legal-disclaimer text></calcite-action><calcite-popover reference-element=legal-disclaimer label=legal-disclaimer placement=bottom auto-close focus-trap-disabled><div class="contained">${i}</div></calcite-popover>`;
}
function O({ errorMessage: i, slot: e }) {
  return c`<div class="error-display"><calcite-input-message id=error-message status=invalid icon=exclamation-mark-triangle scale=m slot=${e ?? V}>${i}</calcite-input-message></div>`;
}
function ge({ active: i, setActive: e, messages: t }) {
  return c`<calcite-alert slot=alerts .open=${i} placement=bottom kind=success icon=check-circle-f auto-close @calciteAlertClose=${() => e(!1)} .label=${t.expressionapplied ?? "Expression applied"}><div slot=message>${t.expressionapplied ?? "Expression applied to editor."}</div></calcite-alert>`;
}
function ye({ context: i, messages: e }) {
  return i ? c`<div class="gaps">${i.profileId && c`<calcite-popover auto-close placement=top .label=${(e.profilecontextlabel ?? "Profile context: {profileId}").replace("{profileId}", i.profileId)} reference-element=profile-context-button class="context-popover contained-popover-or-tooltip"><p>${(e.profilecontextlabel ?? "Profile context: {profileId}").replace("{profileId}", i.profileId)}</p></calcite-popover><calcite-button round kind=neutral icon-start=map-information id=profile-context-button></calcite-button>` || ""}${i.layerName && c`<calcite-popover auto-close placement=top .label=${(e.layercontextlabel ?? "Layer context: {layerName}").replace("{layerName}", i.layerName)} reference-element=layer-context-button class="context-popover contained-popover-or-tooltip"><p>${(e.layercontextlabel ?? "Layer context: {layerName}").replace("{layerName}", i.layerName)}</p></calcite-popover><calcite-button round kind=neutral icon-start=layers id=layer-context-button></calcite-button>` || ""}</div>` : null;
}
function ve({ isDisabled: i, isReadOnly: e, setQuestion: t, setIsViewingResult: o, textAreaRef: r, question: n, errorMessage: u, setErrorMessage: d, submitQuestion: s, messages: a, mode: l, context: p }) {
  return c`<div class="text-area-wrapper"><calcite-text-area resize=vertical .readOnly=${i || e} class="styled-text-area" .placeholder=${a.askaquestion ?? `Specify the calculation or logic you need in an Arcade expression. (e.g., 'Return "Yes" if value > 10')`} .value=${n} @calciteTextAreaInput=${($) => {
    me($.target), t($.target.value);
  }} ${J(r)}><div class="submission-actions-wrapper" slot=footer-start>${u && O({ errorMessage: u, slot: "footer-start" }) || ""}<div class="submission-actions">${ye({ context: p, messages: a })}<div class="align-inline-end gaps"><calcite-button round kind=neutral .hidden=${l !== "refine"} icon-start=arrow-left icon-flip-rtl=both appearance=solid .disabled=${i} @click=${async () => {
    o(!1), t("");
  }} .label=${a.startover ?? "Start Over"} class="hidden-above-380" id=small-start-over-button></calcite-button><calcite-tooltip reference-element=small-start-over-button placement=top-start class="hidden-above-380">${a.startover ?? "Start Over"}</calcite-tooltip><calcite-button round kind=neutral .hidden=${l !== "refine"} icon-start=arrow-left icon-flip-rtl=both appearance=solid .disabled=${i} @click=${async () => {
    o(!1), t("");
  }} class="hidden-below-380">${a.startover ?? "Start Over"}</calcite-button><calcite-button round icon-end=effects appearance=solid .loading=${i} .disabled=${i} @click=${async () => {
    d(n ? "" : a.enteraprompt ?? "Please enter a prompt"), await s();
  }}>${l === "prompt" ? a.ask ?? "Generate" : a.refine ?? "Refine"}</calcite-button></div></div></div></calcite-text-area></div>`;
}
const $e = "https://www.esri.com/en-us/privacy/privacy-statements/privacy-statement", xe = "https://www.esri.com/en-us/privacy/privacy-statements/privacy-supplement";
function we({ setOpen: i, messages: e, feedback: t, setFeedback: o, onSubmit: r }) {
  return t.active ? c`<calcite-sheet class="feedback-sheet" .label=${e.feedback ?? "Feedback"} slot=sheets display-mode=float position=block-end .open=${t.active} @calciteSheetClose=${() => i(!1)}><calcite-panel .heading=${e.providefeedback ?? "Provide feedback"} .description=${e.experiencehelps ?? "Your experience helps guide future improvements"}><div class="feedback-content"><calcite-label>${e.experiencehelpful ?? "Was the assistant helpful?"}<calcite-segmented-control scale=l .disabled=${t.submitting}><calcite-segmented-control-item icon-start=thumbs-up .checked=${t.value === "good"} @click=${() => o({ ...t, value: "good" })}></calcite-segmented-control-item><calcite-segmented-control-item icon-start=thumbs-down .checked=${t.value === "bad"} @click=${() => o({ ...t, value: "bad" })}></calcite-segmented-control-item></calcite-segmented-control></calcite-label><calcite-label>${e.describeexperience ?? "Describe your experience"}<calcite-text-area resize=vertical .value=${t.text} @calciteTextAreaInput=${(n) => o({ ...t, text: n.target.value })} .disabled=${t.submitting}></calcite-text-area></calcite-label><calcite-label layout=inline scale=s><calcite-checkbox scale=l .checked=${t.termsAccepted} @calciteCheckboxChange=${(n) => {
    o({ ...t, termsAccepted: n.target.checked });
  }} .disabled=${t.submitting}></calcite-checkbox><span>${x((e.agreement ?? "I agree to the {EsriPrivacyStatement} (and {Supplement}).").replace("{EsriPrivacyStatement}", `<calcite-link href=${$e} target="_blank">${e.esriprivacystatement ?? "Esri Privacy Statement"}</calcite-link>`).replace("{Supplement}", `<calcite-link href=${xe} target="_blank">${e.supplement ?? "Supplement"}</calcite-link>`))}</span></calcite-label></div><calcite-button slot=footer width=full @click=${r} .disabled=${!t.termsAccepted || t.submitting} .loading=${t.submitting}>${e.submitfeedback ?? "Submit Feedback"}</calcite-button></calcite-panel></calcite-sheet>` : null;
}
function P({ assistantsEnabled: i, messages: e, slot: t, assistantHelpUrl: o, helpTopicUrl: r }) {
  return c`<calcite-block .label=${e.assistantinformation ?? "Assistant information"} slot=${t ?? V} expanded class="info-block"><calcite-chip .label=${e.new ?? "New"} kind=brand>${e.new ?? "New"}</calcite-chip><h1 class="info-heading">${e.introducing ?? "Introducing Arcade Assistant (beta)"}</h1><p>${e.capabilities ?? "The assistant uses artificial intelligence to generate Arcade expressions."}</p>${i ? c`<p>${e.keepinmind ?? "Keep in mind the following:"}<ul><li>${e.beconsise ?? "Be concise, but also clear in your request"}</li><li>${e.avoidambiguity ?? "Avoid ambiguity and vagueness"}</li><li>${e.moredetails ?? "you do not need to use exact field names in your instructions, but more detail is generally better"}</li></ul>${x((e.seedocumentation ?? "Please see the {documentation} for more information, including limitations and additional resources.").replace("{documentation}", `<calcite-link href=${r} target="_blank">${e.documentation ?? "documentation"}</calcite-link>`))}</p>` : c`<p>${x(e.useofassistant?.replace("{aiassistants}", `<strong>${e.aiassistants ?? "Ai Assistants"}</strong>`))}<calcite-link .href=${o} target=_blank icon-end=launch2>${e.configureassistants ?? "Configure Assistants"}</calcite-link></p>`}</calcite-block>`;
}
function ke({ messages: i, onProceed: e, onExit: t, helpTopicUrl: o }) {
  return c`<calcite-dialog close-disabled placement=top .heading=${i.welcome ?? "Welcome to the new assistant experience"} slot=dialogs open width-scale=m id=welcome-dialog><h3 class="unstyled-h3">${i.beforeyougetstarted ?? "Before you get started be aware:"}</h3><ul><li>${i.maybeincorrect ?? "AI generated code may occasionally be incorrect or biased. Review carefully."}</li><li>${x((i.pleasereadhelp ?? "Read the Arcade Assistant (beta) {helpTopic} to get started and learn details on security, privacy and limitations.").replace("{helpTopic}", `<calcite-link href=${o} target="_blank">${i.helptopic ?? "help topic"}</calcite-link>`))}</li></ul><calcite-button id=welcome-proceed slot=footer-end @click=${e}>${i.proceed ?? "Proceed"}</calcite-button><calcite-button id=welcome-decline slot=footer-start @click=${t} kind=neutral>${i.exit ?? "Exit"}</calcite-button></calcite-dialog>`;
}
function Ae({ messages: i, suggestions: e, onSuggestionClick: t }) {
  return c`<calcite-block .heading=${i.promptsuggestions} expanded collapsible id=suggestion-block><calcite-chip-group class="suggestions" .label=${i.promptsuggestions ?? "Prompt Suggestions"}>${z(e, (o) => o, (o) => c`<calcite-button round appearance=outline-fill kind=neutral .label=${i.promptsuggestion} class="suggestion-button" @click=${() => t?.(o)}>${o}</calcite-button>`)}</calcite-chip-group></calcite-block>`;
}
const M = 200;
function q({ hidden: i = !1, expanded: e = !1, messages: t, cards: o, heading: r, collapsible: n = !1, showEffectsIcon: u = !1, onCopyCode: d, standalone: s }) {
  return c`<calcite-block .hidden=${i} id=result-block .heading=${r ?? t.besteffort ?? "Here is the assistant's best effort"} .expanded=${e} .collapsible=${n}>${u && c`<calcite-chip .label=${t.assistantresponses ?? "Assistant responses"} slot=content-start icon=effects scale=m class="suggestion-chips"></calcite-chip>` || ""}<calcite-card-group .label=${t.assistantresponses ?? "Assistant responses"}>${z(o, (a) => a.conversationId, (a) => c`<calcite-card><div slot=heading><div class="prior-prompt"><span>${a.priorPrompt.length > M ? `${a.priorPrompt.slice(0, M)}...` : a.priorPrompt}</span><calcite-action icon=duplicate scale=s slot=actions-end class="copy-prompt-button" text .id=${`copy-prompt-${a.conversationId}-${s ? "standalone" : "list"}`} @click=${(l) => {
    const p = l.currentTarget;
    navigator.clipboard.writeText(a.priorPrompt).then(() => {
      p.setAttribute("data-copied", "true"), setTimeout(() => p.removeAttribute("data-copied"), 1500);
    });
  }}></calcite-action><calcite-popover .referenceElement=${`copy-prompt-${a.conversationId}-${s ? "standalone" : "list"}`} placement=top-start class="copy-feedback" .label=${t.copiedsuccessfully ?? "copied successfully"} open trigger-disabled><span>${t.copiedsuccessfully ?? "copied successfully"}</span></calcite-popover><calcite-tooltip .referenceElement=${`copy-prompt-${a.conversationId}-${s ? "standalone" : "list"}`} placement=top-start class="copy-tooltip">${t.copyprompttoclipboard ?? "Copy prompt to clipboard"}</calcite-tooltip></div>${a.message && s && c`<div class="response-error-container">${O({ errorMessage: a.message })}</div>` || ""}</div><div><div class="code-response-wrapper"><div class="positioned-code-content"><calcite-chip-group .label=${t.responsecontext ?? "Response Context"} scale=s>${a.message && !s && c`<calcite-tooltip .referenceElement=${`response-chip-${a.conversationId}-error`} placement=top-start>${a.message}</calcite-tooltip><calcite-chip .id=${`response-chip-${a.conversationId}-error`} .label=${t.error ?? "Error"} scale=s appearance=outline icon=exclamation-mark-triangle-f class="response-error-chip"></calcite-chip>` || ""}${a.chips?.map((l) => {
    const p = ie();
    return c`${l.tooltip && c`<calcite-tooltip .referenceElement=${`response-chip-${l.conversationId}-${p}`} placement=top-start class="contained-popover-or-tooltip">${l.tooltip}</calcite-tooltip>` || ""}<calcite-chip .label=${l.label} .scale=${l.scale ?? "s"} .appearance=${l.appearance ?? "outline"} .icon=${l.icon} .id=${`response-chip-${l.conversationId}-${p}`}>${l.label}</calcite-chip>`;
  })}</calcite-chip-group></div><details class="collapsible-code" open><summary>Code response</summary><arcgis-code-viewer language=arcade round>${a.code}</arcgis-code-viewer></details></div></div><div slot=footer-start class="feedback-actions"><calcite-button class="add-to-editor-button hidden-above-380" @click=${() => a.onAddToEditor("add")} scale=s icon-start=plus round .label=${t.addtoeditor ?? "Add to editor"} .id=${`add-to-editor-button-${a.conversationId}-${s ? "standalone" : "list"}`}></calcite-button><calcite-tooltip class="hidden-above-380" .referenceElement=${`add-to-editor-button-${a.conversationId}-${s ? "standalone" : "list"}`} placement=top-start>${t.addtoeditor ?? "Add to editor"}</calcite-tooltip><calcite-button class="add-to-editor-button hidden-below-380" @click=${() => a.onAddToEditor("add")} scale=s icon-start=plus round>${t.addtoeditor ?? "Add to editor"}</calcite-button><calcite-button round icon-start=file-code kind=neutral scale=s @click=${() => a.onAddToEditor("replace")} class="response-secondary-action-button" .id=${`replace-${a.conversationId}-${s ? "standalone" : "list"}`}></calcite-button><calcite-tooltip .referenceElement=${`replace-${a.conversationId}-${s ? "standalone" : "list"}`} placement=top-start><span>${t.replaceineditor ?? "Replace all code in editor"}</span></calcite-tooltip><calcite-button round icon-start=copy-to-clipboard kind=neutral scale=s @click=${(l) => {
    const p = l.currentTarget;
    d(a.code).then(() => {
      p.setAttribute("data-copied", "true"), setTimeout(() => p.removeAttribute("data-copied"), 1500);
    });
  }} class="response-secondary-action-button" .id=${`copy-response-${a.conversationId}-${s ? "standalone" : "list"}`}></calcite-button><calcite-popover .referenceElement=${`copy-response-${a.conversationId}-${s ? "standalone" : "list"}`} placement=top-start class="copy-feedback" .label=${t.copiedsuccessfully ?? "copied successfully"} open trigger-disabled><span>${t.copiedsuccessfully ?? "copied successfully"}</span></calcite-popover><calcite-tooltip .referenceElement=${`copy-response-${a.conversationId}-${s ? "standalone" : "list"}`} placement=top-start class="copy-tooltip">${t.copytoclipboard ?? "Copy code to clipboard"}</calcite-tooltip></div><div slot=footer-end class="feedback-actions"><calcite-action .text=${t.thumbsup ?? "Thumbs up"} scale=s icon=thumbs-up @click=${a.onThumbsUp} .id=${`thumbs-up-${a.conversationId}-${s ? "standalone" : "list"}`}></calcite-action><calcite-tooltip .referenceElement=${`thumbs-up-${a.conversationId}-${s ? "standalone" : "list"}`} placement=top-start><span>${t.helpful ?? "Helpful"}</span></calcite-tooltip><calcite-action .text=${t.thumbsdown ?? "Thumbs down"} scale=s icon=thumbs-down @click=${a.onThumbsDown} .id=${`thumbs-down-${a.conversationId}-${s ? "standalone" : "list"}`}></calcite-action><calcite-tooltip .referenceElement=${`thumbs-down-${a.conversationId}-${s ? "standalone" : "list"}`} placement=top-start><span>${t.unhelpful ?? "Unhelpful"}</span></calcite-tooltip></div></calcite-card>`)}</calcite-card-group></calcite-block>`;
}
const F = (i) => i.type === "featureSet", Ce = (i) => le(i).map((e) => ({
  alias: e.alias,
  name: e.name,
  type: e.type,
  ...e.domain ? { domain: e.domain } : {}
})), A = (i) => i ? { fields: Ce(i) } : {};
async function U(i) {
  const e = await i.loadSource();
  return {
    name: i.name,
    type: "featureSet",
    ...A(e?.fields)
  };
}
async function L(i) {
  switch (i.type) {
    case "feature": {
      const e = await i.loadSource();
      return {
        name: i.name,
        type: i.type,
        ...A(e?.fields)
      };
    }
    case "featureSet": {
      const e = await i.loadSource();
      return {
        name: i.name,
        type: "featureSet",
        ...A(e?.fields)
      };
    }
    case "featureSetCollection": {
      const e = await i.loadSource(), t = e?.layers.filter(F) ?? [], o = e?.tables.filter(F) ?? [], r = await Promise.all(t.map(U)), n = await Promise.all(o.map(U));
      return {
        name: i.name,
        type: "featureSetCollection",
        layers: r,
        tables: n
      };
    }
    case "dictionary": {
      const e = await Promise.all(i.dictionaryVariables.map(L));
      return {
        name: i.name,
        type: "dictionary",
        attributes: e
      };
    }
    case "pixel": {
      const e = await i.loadSource();
      if (!e)
        return {
          name: i.name,
          type: "pixel"
        };
      const t = await ne(e);
      return {
        name: i.name,
        type: "pixel",
        members: t.map(N)
      };
    }
    case "voxel": {
      const e = await i.loadSource();
      if (!e)
        return {
          name: i.name,
          type: "voxel"
        };
      const t = await ce(e);
      return {
        name: i.name,
        type: "voxel",
        members: t.map(N)
      };
    }
    case "array":
      return {
        name: i.name,
        type: "array",
        elementType: i.elementType.type
      };
    case "number":
    case "text":
    case "boolean":
    case "date":
    case "knowledgeGraph":
    case "dateOnly":
    case "geometry":
    case "time":
      return {
        name: i.name,
        type: i.type
      };
  }
}
function N(i) {
  return i.type === "array" ? {
    name: i.name,
    type: "array",
    elementType: i.elementType.type
  } : {
    name: i.name,
    type: i.type
    // casting bc member types shouldn't be feature, featureset, etc.
  };
}
async function Se(i) {
  return {
    variables: await Promise.all(i.variables.map(L))
  };
}
const Ie = "arcade_generation", Te = "ArcadeCodeRequest", k = "visualization", Ee = "ArcadeAssistant", Re = [
  "your_comments",
  "user_evaluation",
  "question",
  "answer",
  "useragent",
  "_source",
  "version",
  "context",
  "extras"
];
let D = [], _ = !0;
class Pe extends Q {
  constructor() {
    super(...arguments), this.textAreaRef = K(), this.messages = X(), this._feedbackService = void 0, this.handleFeedbackButton = (e, t) => {
      this.feedback = { active: !0, value: e, item: t, termsAccepted: !1, text: "", submitting: !1 };
    }, this.handleFeedbackSheetClose = () => {
      this.feedback = {
        active: !1
      };
    }, this.handleFeedbackSubmit = async () => {
      if (!this.feedback.active)
        return;
      this.feedback = { ...this.feedback, submitting: !0 };
      const e = await this.ensureFeedbackService();
      if (!e) {
        this.handleFeedbackSheetClose();
        return;
      }
      const t = this.getModel(), o = t ? await this.getProfileAndMetadata(t.uri) : void 0, r = ae.applicationName;
      !r && !this.appVersion && b("warn", this, "esriConfig.applicationName is not set. Consider setting it to help identify the application version in feedback.");
      const n = {
        user_evaluation: this.feedback.value,
        your_comments: this.feedback.text || void 0,
        question: this.feedback.item?.question ?? "",
        /**
         * The answer may contain invalid or partial HTML, which causes the feature service's HTML sanitizer to strip or reject it.
         * To preserve the content reliably, we encode it using encodeURIComponent, which escapes all non-ASCII and special characters.
         * This ensures the content passes through the sanitizer safely and can be decoded later. This is a temporary workaround until
         * the sanitizer can be disabled on the service.
         */
        answer: encodeURIComponent(this.feedback.item?.formattedScript ?? ""),
        useragent: navigator.userAgent,
        _source: Ee,
        version: this.appVersion || r || "NOT_SET",
        context: o ? JSON.stringify(o) : "",
        extras: o?.profileId ?? "",
        conversation_id: this.feedback.item?.conversationId ?? "",
        privacy_statement: this.feedback.termsAccepted ? "I_agree" : ""
      };
      try {
        await e.applyEdits({ addFeatures: [new se({ attributes: n })] });
      } catch (u) {
        b("error", this, "Error submitting feedback.", { detail: { error: u } });
      }
      this.handleFeedbackSheetClose();
    }, this.handleClose = (e) => {
      this.closed = !0, this.closePanel?.(e);
    }, this.setQuestion = (e) => {
      this.question = e;
    }, this.onSuggestionClick = (e) => {
      this.textAreaRef.value && (this.textAreaRef.value.value = e, this.textAreaRef.value.setFocus(), this.setQuestion(e));
    }, this.isViewingResult = !1, this.confirmationActive = !1, this.isSubmitting = !1, this.errorMessage = void 0, this.question = "", this.history = [], this.feedback = {
      active: !1
    }, this.splashActive = !0, this.context = void 0, this.historyCards = [], this.helpBase = "", this.assistantsEnabled = !1, this.closed = !1;
  }
  static {
    this.properties = { isViewingResult: 16, confirmationActive: 16, isSubmitting: 16, errorMessage: 16, question: 16, history: 16, feedback: 16, splashActive: 16, context: 16, historyCards: 16, closePanel: 0, insertText: 0, helpBase: 1, assistantsEnabled: 5, layer: [1, { type: Object }], portalUrl: 1, serviceUrl: 1, closed: 7, editorRef: 0, feedbackServiceUrl: 1, appVersion: 1 };
  }
  static {
    this.styles = de;
  }
  get disclaimerComment() {
    return `// ${this.messages.disclaimercomment}
// ${this.messages.disclaimerpt2 ?? "AI-generated content may be inaccurate. Review before using."}`;
  }
  get assistantHelpUrl() {
    return `${this.helpBase ?? "https://doc.arcgis.com/en/arcgis-online/"}administer/configure-assistants.htm`;
  }
  get assistantOverviewDocUrl() {
    return `${this.helpBase ?? "https://doc.arcgis.com/en/arcgis-online/"}create-maps/understand-arcade-assistant.htm`;
  }
  get usingTheAssitantDocUrl() {
    return `${this.helpBase ?? "https://doc.arcgis.com/en/arcgis-online/"}create-maps/use-arcade-assistant.htm`;
  }
  async destroy() {
  }
  load() {
    const e = async () => {
      const t = this.getModel();
      if (!t) {
        this.context = void 0;
        return;
      }
      const o = await this.getProfileAndMetadata(t.uri);
      this.context = o;
    };
    e().catch((t) => {
      b("error", this, "Error setting initial context.", { detail: { error: t } });
    }), this.manager.onLifecycle(() => ({ remove: T.onModelContextDidChange(async () => {
      e().catch((o) => {
        b("error", this, "Error setting context.", { detail: { error: o } });
      });
    }).dispose }));
  }
  willUpdate(e) {
    (e.has("history") || e.has("messages")) && (this.historyCards = this.getHistoryCards());
  }
  connectedCallback() {
    super.connectedCallback(), this.history = D, this.splashActive = _;
  }
  disconnectedCallback() {
    super.disconnectedCallback(), D = this.history, _ = this.splashActive, this.copySuccessTimer && (clearTimeout(this.copySuccessTimer), this.copySuccessTimer = void 0);
  }
  getHistoryCards() {
    return this.history.reduce((e, t) => (!t.script || (e.push({
      priorPrompt: t.question,
      code: t.formattedScript || t.error || "",
      chips: [
        {
          label: t.profile ?? k,
          icon: "map-information",
          appearance: "outline",
          scale: "s",
          conversationId: t.conversationId ?? "",
          tooltip: (this.messages.profilecontextlabel ?? "Profile context: {profileName}").replace("{profileName}", t.profile ?? k)
        },
        ...t.layerName ? [
          {
            label: (this.messages.numlayers ?? "{numLayers} {layerOrLayers}").replace("{numLayers}", "1").replace("{layerOrLayers}", this.messages.numlayerssingular ?? "layer"),
            icon: "layer",
            appearance: "outline",
            scale: "s",
            conversationId: t.conversationId ?? "",
            tooltip: (this.messages.layercontextlabel ?? "Layer context: {layerName}").replace("{layerName}", t.layerName ?? "No layer")
          }
        ] : []
      ],
      onAddToEditor: (o) => {
        ee(this.editorRef.editorInstance, t.formattedScript ?? "", o, this.disclaimerComment);
      },
      onThumbsUp: () => this.handleFeedbackButton("good", t),
      onThumbsDown: () => this.handleFeedbackButton("bad", t),
      conversationId: t.conversationId ?? "",
      message: t.message
    }), this.isViewingResult), e), []);
  }
  setFeedbackState(e) {
    this.feedback = e;
  }
  async ensureFeedbackService() {
    if (this._feedbackService)
      return this._feedbackService;
    if (!this.feedbackServiceUrl)
      return;
    const e = new oe({ url: this.feedbackServiceUrl });
    await e.load();
    const t = Re.filter((o) => !e.fields.some((r) => r.name === o));
    if (t.length > 0) {
      b("error", this, `Missing the following fields in feedback service: ${t.join(", ")}. Feedback will not be logged.`);
      return;
    }
    return this._feedbackService = e, e;
  }
  getModel() {
    return this.editorRef.editorInstance?.getModel();
  }
  async submitQuestion() {
    if (this.question) {
      this.isSubmitting = !0;
      try {
        const e = await this.getToken(), t = this.getModel();
        if (!t)
          return;
        const { profileId: o, metadata: r, layerName: n } = await this.getProfileAndMetadata(t.uri), d = (await pe({
          baseUrl: this.serviceUrl,
          skillId: Ie,
          message: this.question,
          authToken: e,
          context: {
            kind: Te,
            context: {
              profile_id: o,
              metadata: [r]
            }
          }
        })).find((s) => s.context?.kind === "ArcadeCodeResponse");
        if (!d)
          return;
        d.context?.kind === "ArcadeCodeResponse" && (this.history = [
          {
            script: d?.context?.arcadeCode?.code,
            formattedScript: te(d?.context?.arcadeCode?.code ?? ""),
            error: void 0,
            question: this.question,
            profile: o,
            conversationId: d.conversationId,
            layerName: n ?? void 0,
            ...d.message ? { message: d.message } : {}
          },
          ...this.history
        ], this.isViewingResult = !0, this.errorMessage = void 0);
      } catch (e) {
        e instanceof Error && e.name === "ArcadeAssistantError" ? this.errorMessage = he(e) || this.messages.erroroccurred || "An error occurred." : this.errorMessage = this.messages.erroroccurred || "An error occurred.", b("error", this, "Error submitting question", { detail: { error: e } });
      } finally {
        this.isSubmitting = !1;
      }
    }
  }
  async getToken() {
    const { token: e } = await Y.getCredential(this.portalUrl);
    return e;
  }
  async getProfileAndMetadata(e) {
    let t = k;
    const o = T.getEditorProfileForModel(e);
    o?.loaded || await o?.loadSource();
    const r = this.editorRef.profile;
    r && "id" in r && (t = r.id);
    const n = o?.definition?.variables?.find((s) => s.type === "feature"), u = o ? await Se(o) : { variables: [] };
    let d;
    return re(n?.definition) && (d = n.definition.title), { profileId: t, metadata: u, layerName: d };
  }
  onCopyCode(e) {
    const t = e ? `${this.disclaimerComment}
${e}` : "";
    return navigator.clipboard.writeText(t);
  }
  render() {
    return this.closed ? null : this.assistantsEnabled ? c`<calcite-flow><calcite-flow-item closable heading-level=2 .heading=${this.messages.arcadeassistant ?? "Arcade assistant"} @calciteFlowItemClose=${this.handleClose}>${this.splashActive && c`<calcite-scrim></calcite-scrim>` || ""}${fe({ messages: this.messages })}${be({ popoverContent: P({ assistantsEnabled: this.assistantsEnabled, messages: this.messages, assistantHelpUrl: this.assistantHelpUrl, helpTopicUrl: this.usingTheAssitantDocUrl }) })}<calcite-shell class="unstyled-shell">${this.splashActive && ke({ messages: this.messages, onProceed: () => {
      this.splashActive = !1;
    }, helpTopicUrl: this.assistantOverviewDocUrl, onExit: (e) => this.closePanel?.(e) }) || ""}${ge({ active: this.confirmationActive, setActive: (e) => this.confirmationActive = e, messages: this.messages })}${ve({ isDisabled: this.isSubmitting, isReadOnly: !1, setQuestion: this.setQuestion, setIsViewingResult: (e) => this.isViewingResult = e, mode: this.isViewingResult ? "refine" : "prompt", textAreaRef: this.textAreaRef, question: this.question, errorMessage: this.errorMessage, setErrorMessage: (e) => this.errorMessage = e, submitQuestion: this.submitQuestion.bind(this), messages: this.messages, context: this.context })}<calcite-block-group label="interactive blocks">${!this.isViewingResult && !this.isSubmitting && Ae({ messages: this.messages, suggestions: [this.messages.prompsuggestion1 ?? "", this.messages.prompsuggestion2 ?? ""], onSuggestionClick: this.onSuggestionClick }) || ""}<calcite-block .hidden=${!this.isSubmitting} .heading=${this.messages.generatingresponse ?? "Generating response..."}></calcite-block>${q({
      expanded: this.isViewingResult,
      messages: this.messages,
      collapsible: !0,
      showEffectsIcon: !0,
      /** Only show the latest history card */
      cards: this.historyCards.length ? [this.historyCards[0]] : [],
      heading: this.messages.besteffort ?? "Here's the assistant's best effort",
      hidden: this.isSubmitting || !this.isViewingResult,
      onCopyCode: this.onCopyCode.bind(this),
      standalone: !0
    })}${q({
      expanded: !this.isViewingResult,
      messages: this.messages,
      collapsible: !0,
      /**
       * When the user is viewing the latest result, we display the first history card
       * (historyCards[0]) separately at the top in "standalone" mode.
       * To avoid showing the same card twice, we remove (slice out) the first card
       * from the list of recent prompts below.
       */
      cards: this.isViewingResult ? this.historyCards.slice(1) : this.historyCards,
      heading: this.messages.recentprompts ?? "Recent prompts",
      hidden: this.isSubmitting || this.history.length === 0,
      onCopyCode: this.onCopyCode.bind(this)
    })}</calcite-block-group>${this.feedback.active ? we({ setOpen: this.handleFeedbackSheetClose, messages: this.messages, onSubmit: this.handleFeedbackSubmit, feedback: this.feedback, setFeedback: this.setFeedbackState.bind(this) }) : null}</calcite-shell></calcite-flow-item></calcite-flow>` : c`<calcite-flow><calcite-flow-item .selected=${!this.isViewingResult} closable heading-level=2 .heading=${this.messages.arcadeassistant ?? "Arcade assistant"} @calciteFlowItemClose=${this.handleClose}>${P({ slot: "content-top", messages: this.messages, assistantsEnabled: this.assistantsEnabled, assistantHelpUrl: this.assistantHelpUrl, helpTopicUrl: this.usingTheAssitantDocUrl })}</calcite-flow-item></calcite-flow>`;
  }
}
G("arcgis-arcade-coding-assistant", Pe);
export {
  Pe as ArcgisArcadeCodingAssistant
};
