vibe64 0.1.47 → 0.1.49
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/bin/run.js +1734 -1687
- package/bin/server.js +75 -75
- package/bin/upgrade-state.js +4539 -4471
- package/dist/assets/GithubBrowserTabs-BwpiRS2u.js +1 -0
- package/dist/assets/{LocalDatabaseServer-6VzPWZxG.js → LocalDatabaseServer-u_Ky7bNS.js} +1 -1
- package/dist/assets/{Vibe64AuthSettingsButton-TLwqAxDo.js → Vibe64AuthSettingsButton-BCwswT1G.js} +1 -1
- package/dist/assets/{Vibe64DashboardShell-B4dQ-oHD.js → Vibe64DashboardShell-CWlgrR2B.js} +1 -1
- package/dist/assets/{Vibe64DatabaseWorkspace-Bh5WIPOj.js → Vibe64DatabaseWorkspace-Dhs8_H0P.js} +1 -1
- package/dist/assets/Vibe64OutputControls-Dn548CZa.js +8 -0
- package/dist/assets/{Vibe64RepositoryWorkspace-idDg94lc.js → Vibe64RepositoryWorkspace-C-8S4JUF.js} +1 -1
- package/dist/assets/{Vibe64SessionFiles-Z9zxosyl.js → Vibe64SessionFiles-Cx6J7DDN.js} +2 -3
- package/dist/assets/{Vibe64UiStoryboardView-CrCDWMdR.js → Vibe64UiStoryboardView-DHyhJiWS.js} +1 -1
- package/dist/assets/{Vibe64UnavailableSessions-TqsxvGSf.js → Vibe64UnavailableSessions-Da4RxIhA.js} +1 -1
- package/dist/assets/{_sessionId_-7F1VGOou.js → _sessionId_-DCpgDPSI.js} +1 -1
- package/dist/assets/_slug_-BbEWp01a.js +25 -0
- package/dist/assets/{_slug_-B16mTWjj.css → _slug_-DerKOisL.css} +1 -1
- package/dist/assets/{access-Cx9RH95J.js → access-D4di2sCr.js} +1 -1
- package/dist/assets/{app-DPx4KKOa.js → app-Adr9Iz8p.js} +1 -1
- package/dist/assets/asyncModuleRecovery-DJsn5NrL.js +1 -0
- package/dist/assets/{changes-DYsuQLFW.js → changes-3Dd1O8Lu.js} +1 -1
- package/dist/assets/client-BAXHGUOC.js +1 -0
- package/dist/assets/{client-BYsDPxR3.js → client-CCZIu6yc.js} +1 -1
- package/dist/assets/{conversation-3ln-WnbL.css → conversation-CSDHdGDb.css} +1 -1
- package/dist/assets/conversation-DG9lp25w.js +8 -0
- package/dist/assets/conversation-ErAO1CmH.js +13 -0
- package/dist/assets/{dashboard-CWswAbYP.js → dashboard-0tCzDYCX.js} +1 -1
- package/dist/assets/english-definitions-DeiQ-jTT.js +1 -0
- package/dist/assets/env-DsyQ2MFX.js +1 -0
- package/dist/assets/{health-C0f6s-G1.js → health-DyTXU-nb.js} +1 -1
- package/dist/assets/{history-BQjETNB9.js → history-BXGAdPMI.js} +1 -1
- package/dist/assets/{incoming-COpY201m.js → incoming-yajkdGBY.js} +1 -1
- package/dist/assets/{index-MWACm8Pp.css → index-B-dukXUB.css} +1 -1
- package/dist/assets/index-CGz4Yow6.js +136 -0
- package/dist/assets/{integrations-BBkvNRHu.js → integrations-BMrXET36.js} +10 -2
- package/dist/assets/issues-kc1XBZCK.js +1 -0
- package/dist/assets/{learning-B8_wHoe1.js → learning-CIE5ghYv.js} +1 -1
- package/dist/assets/linkPath-Ch9eft18.js +1 -0
- package/dist/assets/{placement-DXvgK433.js → placement-BNmlke_j.js} +1 -1
- package/dist/assets/placement-DYM3JJ-F.js +1 -0
- package/dist/assets/publish-DTh6amqi.js +3 -0
- package/dist/assets/pull-requests-CbfGSSIh.js +1 -0
- package/dist/assets/{repository-BNPt7UWc.js → repository-BstMh-bG.js} +1 -1
- package/dist/assets/settings-Bf8C6dls.js +1 -0
- package/dist/assets/{studioGateApi-BVdclhPL.js → studioGateApi-mkX1eOTX.js} +1 -1
- package/dist/assets/{studioUrls-CGKCbM_d.js → studioUrls-B0-GdWh8.js} +1 -1
- package/dist/assets/useArchivedVibe64Sessions-DIOpfUxD.js +1 -0
- package/dist/assets/useCommand-CVuya6vG.js +1 -0
- package/dist/assets/useEndpointResource-7-YDfAxX.js +1 -0
- package/dist/assets/usePaths-Y6UuQxmI.js +1 -0
- package/dist/assets/{useUiFeedback-B51xtCAK.js → useUiFeedback-Bd3rao6E.js} +1 -1
- package/dist/assets/useVibe64ConversationLog-ChJOU2SD.js +1 -0
- package/dist/assets/{useVibe64DatabaseTools-BE_yXZFn.js → useVibe64DatabaseTools-DKV-TeNJ.js} +1 -1
- package/dist/assets/{useVibe64ProjectScope-D7b8n1gx.js → useVibe64ProjectScope-DXjsKKhl.js} +1 -1
- package/dist/assets/useVibe64SessionData-BkIHUrP5.js +1 -0
- package/dist/assets/useVibe64SessionSelection-N8wX5oqo.js +1 -0
- package/dist/assets/{useVibe64SystemGraph-CDDcsye4.js → useVibe64SystemGraph-Db_eD-X8.js} +1 -1
- package/dist/assets/{useVibe64Terminal-Zr3Mig2L.js → useVibe64Terminal-B9EWJ9Ba.js} +2 -2
- package/dist/assets/vibe64ProjectScope.local-l5_-E6pq.js +1 -0
- package/dist/assets/vibe64RepositoryRealtime-CHT4-6VN.js +1 -0
- package/dist/assets/vibe64SessionFocus-CS6Ex53G.js +1 -0
- package/dist/assets/vibe64SessionFocus-CSm4YJQD.css +1 -0
- package/dist/assets/vibe64SessionRequestConfig-xIx-5jxQ.js +1 -0
- package/dist/index.html +26 -22
- package/docs/colleague-usage/ai-accounts.md +6 -2
- package/docs/colleague-usage/ai-balance-and-allowance.md +15 -2
- package/docs/colleague-usage/coding-agent-failures.md +2 -1
- package/docs/colleague-usage/coding-agent-goals.md +8 -3
- package/docs/colleague-usage/coding-agents.md +16 -0
- package/docs/colleague-usage/github-work.md +14 -0
- package/docs/colleague-usage/preview-browser-checks.md +5 -3
- package/docs/colleague-usage/project-setup.md +6 -3
- package/docs/colleague-usage/running-vibe64-on-your-computer.md +3 -1
- package/docs/colleague-usage/sessions.md +35 -7
- package/docs/colleague-usage/starter-apps.md +3 -0
- package/docs/colleague-usage/temporary-chat-context.md +2 -1
- package/docs/colleague-usage/temporary-chats.md +17 -5
- package/node_modules/@jskit-ai/assistant-core/CHANGELOG.md +539 -0
- package/node_modules/@jskit-ai/assistant-core/locales/en.json +383 -0
- package/node_modules/@jskit-ai/assistant-core/package.json +3 -2
- package/node_modules/@jskit-ai/assistant-runtime/CHANGELOG.md +138 -0
- package/node_modules/@jskit-ai/assistant-runtime/README.md +2 -1
- package/node_modules/@jskit-ai/assistant-runtime/locales/en.json +137 -0
- package/node_modules/@jskit-ai/assistant-runtime/package.json +3 -2
- package/node_modules/@jskit-ai/assistant-runtime/src/server/repositories/assistantConfigRepository.js +223 -203
- package/node_modules/@jskit-ai/assistant-runtime/src/server/repositories/conversationsRepository.js +286 -266
- package/node_modules/@jskit-ai/assistant-runtime/src/server/repositories/messagesRepository.js +270 -250
- package/node_modules/@jskit-ai/assistant-voice/locales/en.json +182 -0
- package/node_modules/@jskit-ai/assistant-voice/package.json +3 -2
- package/node_modules/@jskit-ai/connector-google-calendar/CHANGELOG.md +83 -0
- package/node_modules/@jskit-ai/connector-google-calendar/locales/en.json +91 -0
- package/node_modules/@jskit-ai/connector-google-calendar/package.json +4 -3
- package/node_modules/@jskit-ai/connectors-catalog/CHANGELOG.md +1722 -0
- package/node_modules/@jskit-ai/connectors-catalog/README.md +11 -0
- package/node_modules/@jskit-ai/connectors-catalog/locales/en.json +3139 -0
- package/node_modules/@jskit-ai/connectors-catalog/package.json +5 -4
- package/node_modules/@jskit-ai/connectors-core/CHANGELOG.md +183 -0
- package/node_modules/@jskit-ai/connectors-core/locales/en.json +92 -0
- package/node_modules/@jskit-ai/connectors-core/package.json +3 -2
- package/node_modules/@jskit-ai/http-runtime/CHANGELOG.md +31 -0
- package/node_modules/@jskit-ai/http-runtime/locales/en.json +14 -0
- package/node_modules/@jskit-ai/http-runtime/package.json +3 -2
- package/node_modules/@jskit-ai/kernel/CHANGELOG.md +182 -0
- package/node_modules/@jskit-ai/kernel/locales/en.json +94 -0
- package/node_modules/@jskit-ai/kernel/package.json +6 -2
- package/node_modules/@jskit-ai/payments-core/CHANGELOG.md +128 -0
- package/node_modules/@jskit-ai/payments-core/locales/en.json +77 -0
- package/node_modules/@jskit-ai/payments-core/package.json +3 -2
- package/node_modules/@jskit-ai/realtime/CHANGELOG.md +20 -0
- package/node_modules/@jskit-ai/realtime/locales/en.json +14 -0
- package/node_modules/@jskit-ai/realtime/package.json +3 -2
- package/node_modules/@jskit-ai/resource-core/package.json +1 -1
- package/node_modules/@jskit-ai/resource-crud-core/package.json +1 -1
- package/node_modules/@jskit-ai/uploads-runtime/CHANGELOG.md +35 -0
- package/node_modules/@jskit-ai/uploads-runtime/locales/en.json +15 -0
- package/node_modules/@jskit-ai/uploads-runtime/package.json +3 -2
- package/node_modules/@local/vibe64-execution/src/host/execHelper.js +49 -48
- package/node_modules/@local/vibe64-execution/src/server/gitTurnCheckpointCommand.js +1327 -0
- package/node_modules/@local/vibe64-genesis/bin/vibe64-genesis-host-context +430 -390
- package/node_modules/@local/vibe64-genesis/src/server/index.js +45 -45
- package/node_modules/@local/vibe64-genesis/src/server/promptContext.js +119 -119
- package/node_modules/@local/vibe64-runtime/src/server/codexAppServerProcess.js +57 -57
- package/node_modules/@local/vibe64-sessions/package.json +2 -1
- package/node_modules/@local/vibe64-terminals/src/server/opencodeSessionEnvironmentPlugin.js +195 -175
- package/node_modules/@local/vibe64-terminals/src/server/sessionWorkOperationCommand.js +1385 -1362
- package/package.json +15 -15
- package/server.bundle.mjs +44206 -42825
- package/dist/assets/GithubBrowserTabs-D-Z3TlA8.js +0 -1
- package/dist/assets/Vibe64OutputControls-DtybwgL3.js +0 -8
- package/dist/assets/_slug_-Bq84T_Iv.js +0 -24
- package/dist/assets/conversation-Bn7wpATa.js +0 -2
- package/dist/assets/conversation-CNcCrV-R.js +0 -16
- package/dist/assets/definitions-CEbi4qae.js +0 -1
- package/dist/assets/env-X7EOFLtl.js +0 -1
- package/dist/assets/index-CBo1BEk6.js +0 -138
- package/dist/assets/issues-BiSiUd5o.js +0 -1
- package/dist/assets/placement-B5T1LR7m.js +0 -1
- package/dist/assets/publish-CeLZE2AG.js +0 -3
- package/dist/assets/pull-requests-pTdQOT7i.js +0 -1
- package/dist/assets/settings-lecRzZ-r.js +0 -1
- package/dist/assets/useArchivedVibe64Sessions-DHYRnyJD.js +0 -1
- package/dist/assets/useCommand-Epd2yHhQ.js +0 -1
- package/dist/assets/useEndpointResource-DBRQISI_.js +0 -1
- package/dist/assets/usePaths-DdAnjVDj.js +0 -1
- package/dist/assets/useVibe64ConversationLog-DboM3tYN.js +0 -1
- package/dist/assets/useVibe64SessionData-CreWtQAO.js +0 -1
- package/dist/assets/useVibe64SessionSelection-CDaX4uwY.js +0 -1
- package/dist/assets/vibe64ProjectScope.local-BxTBYuRg.js +0 -1
- package/dist/assets/vibe64RepositoryRealtime-C-J0I5jY.js +0 -1
- package/dist/assets/vibe64SessionFocus-DSW5Irm6.css +0 -1
- package/dist/assets/vibe64SessionFocus-DzqbVq60.js +0 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pages-DuMgH61T.js","assets/runtime-core.esm-bundler-DGXg_mpN.js","assets/useApi-BPuI6ZR9-CFWU1m37.js","assets/route-block-DbL-SuOj.js","assets/app-Adr9Iz8p.js","assets/VBtn-Sj5jAuOx.js","assets/VAvatar-H2hyOWlB.js","assets/rolldown-runtime-DBalRfVu.js","assets/VAvatar-nHaK192T.css","assets/VBtn-uSpaN2Ha.css","assets/VSkeletonLoader-pc4bBTxv.js","assets/VSkeletonLoader-LCPSxykp.css","assets/_plugin-vue_export-helper-DNW4j-dv.js","assets/StudioErrorNotice-DudSuU3G.js","assets/VChip-Uixfx461.js","assets/VChip-PprDbmQn.css","assets/mdi-X9prU-DG.js","assets/VSheet-CMhyReNa.js","assets/VSheet-BbLSwuzR.css","assets/StudioErrorNotice-1K8E_MXD.css","assets/Vibe64AuthSettingsButton-BCwswT1G.js","assets/VMenu-DnhVIMrr.js","assets/VOverlay-Bi97WKy3.js","assets/lazy-DPw3syqC.js","assets/VOverlay-DG-PukqI.css","assets/ssrBoot-Rlh6kLbD.js","assets/VDivider-AUQb_N9d.js","assets/VDivider-DvkP_iX7.css","assets/VMenu-D_W8zRGm.css","assets/VTextField-CnkGeXaT.js","assets/VTextField-BiatYyd3.css","assets/vibe64AssistantHost-CP6oxv5b.js","assets/VDialog-Drp3yzSH.js","assets/VDialog-DP-kc9Gx.css","assets/VCard-DExT9Cji.js","assets/VCard-dv-Dc592.css","assets/VSpacer-BSTt0_VA.js","assets/VSpacer-DfbUir7X.css","assets/client-CCZIu6yc.js","assets/useEndpointResource-7-YDfAxX.js","assets/normalize-BNAdWJYg.js","assets/vibe64ProjectScope.local-l5_-E6pq.js","assets/returnToPath-gKtcu91D.js","assets/deepFreeze-BgoYkoTa.js","assets/useRealtimeEvent-BNXVwzFG.js","assets/VSelect-Dqnp_CFi.js","assets/VSelect-y7fezdfU.css","assets/studioUrls-B0-GdWh8.js","assets/surface-DzO5xqc8.js","assets/VAlert-7_VM9EUm.js","assets/VAlert-DVXMoK42.css","assets/VAutocomplete-Ck14ZtUL.js","assets/VAutocomplete-D48FgPMA.css","assets/VCheckbox-CHFec5Bg.js","assets/VCheckbox-ChRKi1kj.css","assets/VRow--oHnzZ1V.js","assets/VRow-DIr3-SqU.css","assets/VExpansionPanels-BgimJBV2.js","assets/VExpansionPanels-cvCWEkWz.css","assets/VRadioGroup-OHg3N6_i.js","assets/VRadioGroup-C9f4tbih.css","assets/VSwitch-B_DmcTxG.js","assets/VSwitch-FGoTnWb6.css","assets/shared-TUhK_uYM.js","assets/assistantRouting-D_9PZkWu.js","assets/useCommand-CVuya6vG.js","assets/error-W1ZAEk4a.js","assets/placement-DYM3JJ-F.js","assets/linkPath-Ch9eft18.js","assets/usePaths-Y6UuQxmI.js","assets/pathname-Bb895US8.js","assets/useUiFeedback-Bd3rao6E.js","assets/useVibe64Terminal-B9EWJ9Ba.js","assets/preload-helper-BvdcsxN9.js","assets/asyncModuleRecovery-DJsn5NrL.js","assets/browserLocalStorage-B4C7rHrs.js","assets/clipboard-CZs9aH3L.js","assets/useVibe64Terminal-fDhiQNz6.css","assets/shared-BEwrtWSp.js","assets/vibe64ApiResponses-B4VY77Q_.js","assets/studioGateApi-mkX1eOTX.js","assets/client-Dh1mE5bc.css","assets/Vibe64AuthSettingsButton-D2lltUhi.css","assets/app-CZu7oxUO.css","assets/learning-CIE5ghYv.js","assets/_slug_-BbEWp01a.js","assets/Vibe64SessionFiles-Cx6J7DDN.js","assets/VTextarea-wqoRFl1K.js","assets/VTextarea-DDl63AeD.css","assets/conversation-ErAO1CmH.js","assets/client-BAXHGUOC.js","assets/conversation-DG9lp25w.js","assets/conversation-CSDHdGDb.css","assets/vibe64BrowserTabOrigin-SF9E31vi.js","assets/vibe64SessionRequestConfig-xIx-5jxQ.js","assets/useVibe64SystemGraph-Db_eD-X8.js","assets/useVibe64ProjectScope-DXjsKKhl.js","assets/dist-CDa9Iec1.js","assets/vibe64SessionViewModel-B0cCumM8.js","assets/vibe64SessionDebugLog-C06bcdUN.js","assets/libesm-CR-iGldz.js","assets/Vibe64SessionFiles-Kjjk1LKW.css","assets/Vibe64TemporaryAiFixAction-CV26vPTg.js","assets/Vibe64TemporaryAiFixAction-D_mq1dFE.css","assets/Vibe64DashboardBackButton-CE9ig_nO.js","assets/Vibe64DashboardBackButton-DD9UR77P.css","assets/vibe64GithubProject-Bct-bzKq.js","assets/vibe64SessionFocus-CS6Ex53G.js","assets/vibe64SessionFocus-CSm4YJQD.css","assets/Vibe64AsyncModuleState-CPEGxBWZ.js","assets/Vibe64AsyncModuleState-CgINkpFP.css","assets/vibe64SessionInfo-Cr7EeBBT.js","assets/Vibe64DashboardShell-CWlgrR2B.js","assets/placement-BNmlke_j.js","assets/vibe64SessionToolDefinitions-hqh6mSY8.js","assets/Vibe64DashboardShell-De2mbdpI.css","assets/useVibe64SessionData-BkIHUrP5.js","assets/vibe64SessionPanelModel-DoorGDCG.js","assets/useVibe64SessionSelection-N8wX5oqo.js","assets/useVibe64ConversationLog-ChJOU2SD.js","assets/english-definitions-DeiQ-jTT.js","assets/Vibe64UnavailableSessions-Da4RxIhA.js","assets/Vibe64UnavailableSessions-Bi75Pum7.css","assets/vibe64RepositoryRealtime-CHT4-6VN.js","assets/_slug_-DerKOisL.css","assets/dashboard-0tCzDYCX.js","assets/_sessionTool_-BG4aZtgz.js","assets/_sessionTool_-DiYoi-BF.css","assets/access-D4di2sCr.js","assets/access-BBYAFCPS.css","assets/changes-3Dd1O8Lu.js","assets/Vibe64RepositoryWorkspace-C-8S4JUF.js","assets/Vibe64DashboardPageHeader-BhPHQu6p.js","assets/Vibe64DashboardPageHeader-CdlzsyKQ.css","assets/Vibe64RepositoryWorkspace-_KjvQk32.css","assets/env-DsyQ2MFX.js","assets/vibe64SavedEnvValues-9FX5u8Ht.js","assets/contracts-CCZaLqSE.js","assets/env-ClR9iA1v.css","assets/health-DyTXU-nb.js","assets/health-92hh8xXh.css","assets/history-BXGAdPMI.js","assets/useArchivedVibe64Sessions-DIOpfUxD.js","assets/history-u5qeKP7n.css","assets/_sessionId_-DCpgDPSI.js","assets/_sessionId_-BFZvs68k.css","assets/incoming-yajkdGBY.js","assets/incoming-Bdqo8z25.css","assets/integrations-BMrXET36.js","assets/integrations-C55gakBe.css","assets/issues-kc1XBZCK.js","assets/GithubBrowserTabs-BwpiRS2u.js","assets/issues-eB0Oxnb4.css","assets/publish-DTh6amqi.js","assets/publish-CY4SgtA-.css","assets/pull-requests-CbfGSSIh.js","assets/pull-requests-BjwokcU0.css","assets/repository-BstMh-bG.js","assets/session-Ba1UbZT7.js","assets/session-5qADMzDP.css","assets/settings-Bf8C6dls.js","assets/settings-Bz8gPl_R.css","assets/error-N8LVB16H.js","assets/Vibe64DatabaseWorkspace-Dhs8_H0P.js","assets/useVibe64DatabaseTools-DKV-TeNJ.js","assets/sqlQuoting-BingbgQf.js","assets/vue-flow-core-BlVEnES8.js","assets/Vibe64DatabaseWorkspace-DGy2M_Ih.css","assets/LocalDatabaseServer-u_Ky7bNS.js","assets/LocalDatabaseServer-BgUqJs_c.css","assets/Vibe64UiStoryboardView-DHyhJiWS.js","assets/Vibe64UiStoryboardView-B3Y3xQ6G.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r as __exportAll}from"./rolldown-runtime-DBalRfVu.js";import{$ as mergeModels,$n as normalizeProps,B as h$1,D as createVNode,E as createTextVNode,En as toValue,Ft as useModel,H as hasInjectionContext,Ht as watch,J as inject$1,L as getCurrentInstance,Lt as useSlots,Nt as useAttrs,On as unref,Pt as useId,T as createStaticVNode,Ut as watchEffect,Wt as watchPostEffect,Yt as withDirectives,Zn as normalizeClass,_ as createBaseVNode,_n as readonly,an as getCurrentScope,b as createElementBlock,bt as renderList,ct as onMounted,er as normalizeStyle,et as mergeProps,ft as onUnmounted,g as computed,gn as reactive,gt as provide,hn as proxyRefs,in as effectScope,it as onBeforeUnmount,k as defineComponent,mt as openBlock,o as Fragment,pn as onScopeDispose,qt as withCtx,tr as toDisplayString,tt as nextTick$1,u as Teleport,un as isRef,v as createBlock,vn as ref,w as createSlots,wn as toRef,wt as resolveDynamicComponent,xn as shallowRef,xt as renderSlot,y as createCommentVNode,yn as shallowReactive,z as guardReactiveProps}from"./runtime-core.esm-bundler-DGXg_mpN.js";import{$ as useResizeObserver,$t as clamp$1,A as useLocation,An as wrapInArray,At as createDefaults,B as useRounded,C as makeVariantProps,Cn as omit,D as makeDensityProps,Dn as refElement,Dt as genericComponent,En as pickWithRest,Et as defineComponent$1,F as VImg,Ft as makeComponentProps,G as useDimension,Gn as isNumber,Hn as isFunction,I as Intersect,It as propsFactory,Jt as EventProp,K as VDefaultsProvider,Kn as isObject$1,Kt as toPhysical,L as MaybeTransition,M as useElevation,Mn as PREFERS_REDUCED_MOTION,Mt as provideDefaults,N as makeBorderProps,O as useDensity,On as resolveSize,Ot as DefaultsSymbol,P as useBorder,Q as makeTagProps,Qt as chunkArray,S as genOverlays,Sn as noop,Tn as pick$1,Tt as deepEqual,U as useTextColor,V as useBackgroundColor,Vn as isBoolean,W as makeDimensionProps,Wn as isNullOrUndefined,Xt as camelizeProps,Y as VFadeTransition,Zn as range,Zt as checkPrintable,_ as VIcon,_n as isPercentage,_t as IconValue,an as escapeForRegex,at as DisplaySymbol,b as useGroup,bt as useRender,c as makePositionProps,cr as withKeys,ct as makeDisplayProps,dn as getActiveElement,dt as createLocale,en as convertToUnit,et as ThemeSymbol,ft as useLocale,gt as IconSymbol,hn as isComposingIgnoreKey,ht as useToggleScope,in as ensureValidVNode,ir as createApp,it as useTheme,j as makeElevationProps,jn as IN_BROWSER,jt as injectNestedDefaults,k as makeLocationProps,kn as templateRef,kt as RootDefaultsSymbol,l as usePosition,lr as withModifiers,lt as useDisplay,mt as useProxiedModel,n as VBadge,nt as makeThemeProps,p as VProgressLinear,pt as useRtl,q as VExpandTransition,qn as isString,qt as CircularBuffer,rr as Transition,rt as provideTheme,s as useRouter,sr as vShow,st as createDisplay,t as VAvatar,tr as consoleWarn,tt as createTheme,ut as LocaleSymbol,v as makeGroupItemProps,vt as VClassIcon,w as useVariant,wn as padStart,wt as standardEasing,x as useGroupItem,xn as mergeDeep,y as makeGroupProps,yn as keys,yt as VSvgIcon,z as makeRoundedProps}from"./VAvatar-H2hyOWlB.js";import{a as normalizeAction,c as normalizeErrorIntent,d as normalizeText,f as createPinia,i as createDefaultErrorPolicy,l as normalizeNonNegativeInteger,m as storeToRefs,n as SHELL_WEB_ERROR_RUNTIME_KEY,o as normalizeAdditionalActions,p as defineStore,r as useShellWebErrorRuntime,s as normalizeChannel,t as useShellErrorPresentationStore,u as normalizeSeverity}from"./error-W1ZAEk4a.js";import{$ as resolveQueryValue,A as useJskitText,B as hasPreviousPage,C as resolveEnabledRef,D as ROUTE_VISIBILITY_PUBLIC,F as useBaseQuery,G as environmentManager,H as notifyManager,I as Mutation,J as hashQueryKeyByOptions,K as functionalUpdate,L as QueryObserver,M as formatMessage,N as useMutation,O as registerJskitMessages,P as useQuery,Q as partialMatchKey,R as Query,S as ROUTE_VISIBILITY_WORKSPACE,U as focusManager,V as onlineManager,W as Subscribable,X as matchQuery,Y as matchMutation,Z as noop$1,a as mergeQueryMeta,d as asPlainObject,et as skipToken,i as useRealtimeQueryInvalidation,j as catalogMessage,l as toUiFieldErrors,n as resolveOperationRealtimeOptions,nt as cloneDeepUnref,o as mergeRequestRecoveryQueryMeta,q as hashKey,rt as getClientKey,s as toQueryErrorMessage,t as useEndpointResource,tt as useQueryClient,u as en_default$11,w as resolveTextRef,x as resolveResourceMessages,z as hasNextPage}from"./useEndpointResource-7-YDfAxX.js";import{_ as useRouter$1,a as isAbsolutePath,c as isNavigationFailure,d as mergeOptions,f as noop$2,g as useRoute,h as routerViewLocationKey,i as createRouterError,l as isRouteComponent$1,m as routerKey,n as applyToParams,o as isArray,p as routeLocationKey,r as assign,s as isESModule,t as NavigationFailureType,u as matchedRouteKey,v as viewDepthKey}from"./useApi-BPuI6ZR9-CFWU1m37.js";import{o as normalizeSurfaceId$1,r as normalizePathname$1}from"./returnToPath-gKtcu91D.js";import{a as normalizeBoolean,d as normalizeRecordId,f as normalizeText$1,l as normalizeObject$1,m as normalizeUniqueTextList,o as normalizeCanonicalRecordIdText,r as isRecord$1,s as normalizeInteger,t as TRANSACTION_OUTCOMES,u as normalizePositiveInteger$1}from"./normalize-BNAdWJYg.js";import{n as resolveLinkPath,r as splitPathQueryHash,t as isExternalLinkTarget}from"./linkPath-Ch9eft18.js";import{C as validateSchemaPayload,D as createSchema,E as isJsonRestSchemaInstance,M as splitPathQueryAndHash,O as buildJsonApiFieldsetsToken,S as RECORD_ID_PATTERN,T as normalizeSingleSchemaDefinition,_ as transientQueryRetryDelay,a as projectSlugFromPathname,d as getHttpWebClient,f as httpWebClient,g as shouldRetryTransientQueryFailure,h as createHttpClient,j as appendQueryString,k as normalizeJsonApiFieldsets,l as configureHttpWebClient,o as projectSlugFromRoute,p as client_exports$12,r as projectAppPath,s as vibe64ProjectQueryScope,u as createHttpWebClient,w as createCursorListValidator,x as encodeJsonApiResourceQueryObject}from"./vibe64ProjectScope.local-l5_-E6pq.js";import{t as __vitePreload}from"./preload-helper-BvdcsxN9.js";import{a as useFilter,c as useScrolling,d as VVirtualScroll,i as makeFilterProps,l as useFocusRepair,n as makeSelectProps,o as useFocusGroups,r as useMenuActivator,s as useSelectionMenu,t as VSelect,u as VHighlight}from"./VSelect-Dqnp_CFi.js";import{a as useFocusTrap,d as getScrollParent,f as animate,i as makeFocusTrapProps,l as forwardRefs,n as makeVOverlayProps,o as makeDelayProps,r as useScopeId,s as useDelay,t as VOverlay}from"./VOverlay-Bi97WKy3.js";import{n as useLazy,r as createSimpleFunctional,t as makeLazyProps}from"./lazy-DPw3syqC.js";import{a as useItems,i as transformItem,n as VList,o as VListSubheader,s as VListItem,t as VMenu}from"./VMenu-DnhVIMrr.js";import{a as GoToSymbol,i as makeVSlideGroupProps,o as createGoTo,r as VSlideGroup,t as VChip}from"./VChip-Uixfx461.js";import{a as useLayout,i as makeLayoutProps,n as createLayout,o as useLayoutItem,r as makeLayoutItemProps,t as VuetifyLayoutKey}from"./layout-BtR_9hCB.js";import{g as VCheckboxBtn,h as useInputIcon,n as makeVTextFieldProps,p as useForm,t as VTextField}from"./VTextField-CnkGeXaT.js";import{a as VIBE64_COLLEAGUE_INTEGRATIONS_KEY,c as VIBE64_COLLEAGUE_PLAN_KEY,f as VIBE64_LEARNING_KEY,i as VIBE64_COLLEAGUE_DATABASE_KEY,l as VIBE64_COLLEAGUE_PREVIEW_KEY,m as VIBE64_PAGE_FOCUS_KEY,n as VIBE64_ASSISTANT_VIEWER_KEY,o as VIBE64_COLLEAGUE_LAUNCHER_KEY,p as VIBE64_PAGE_ACTIVITY_KEY,r as VIBE64_BROWSER_NAVIGATION_KEY,s as VIBE64_COLLEAGUE_LAYOUT_KEY,t as VIBE64_ASSISTANT_HOST_KEY,u as VIBE64_COLLEAGUE_VIEW_KEY}from"./vibe64AssistantHost-CP6oxv5b.js";import{t as deepFreeze}from"./deepFreeze-BgoYkoTa.js";import{t as resolveScopedApiBasePath}from"./surface-DzO5xqc8.js";import{n as resolveWebSocketUrl$1,t as resolveStudioRequestUrl}from"./studioUrls-B0-GdWh8.js";import{a as summarizeRouterRoutes,c as getClientAppConfig,i as createStructuredLogger,l as resolveMobileConfig,n as createSurfaceShellRouter,o as createSurfaceRuntime,r as resolveClientBootstrapDebugEnabled,s as filterRoutesBySurface,t as bootstrapClientShellApp}from"./client-BAXHGUOC.js";import{a as isDynamicImportError,i as installAsyncModuleRecoveryHandlers,o as notifyAsyncModuleLoadError,r as guardedReloadApp,t as createAsyncModuleRecoveryState}from"./asyncModuleRecovery-DJsn5NrL.js";import{Br as mdiViewDashboardOutline,C as mdiArrowRight,Cn as mdiLinkVariant,Dn as mdiLogin,Dt as mdiEyeOutline,En as mdiLockOutline,Hr as mdiVolumeHigh,Ht as mdiFolderOutline,Ir as mdiTuneVariant,J as mdiClipboardListOutline,Jt as mdiHeadset,L as mdiCheck,Mn as mdiMicrophone,Nn as mdiMicrophoneOff,On as mdiLogout,Pn as mdiMinus,Qt as mdiHomeVariantOutline,S as mdiArrowLeft,T as mdiArrowTopRight,Tr as mdiStop,Ur as mdiVolumeOff,Vr as mdiViewListOutline,X as mdiClose,Zt as mdiHistory,ar as mdiRobotOutline,bt as mdiDeleteOutline,cr as mdiSchoolOutline,dr as mdiShieldCheckOutline,fr as mdiShieldCrownOutline,ht as mdiCreditCardOutline,i as mdiAccountGroupOutline,it as mdiCogOutline,jn as mdiMessageTextOutline,lr as mdiSend,lt as mdiConsoleNetworkOutline,n as mdiAccountCircleOutline,p as mdiAlertOutline,r as mdiAccountCogOutline,rn as mdiInformationOutline,rt as mdiCog,w as mdiArrowRightCircleOutline,z as mdiCheckCircleOutline}from"./mdi-X9prU-DG.js";import{t as useSsrBoot}from"./ssrBoot-Rlh6kLbD.js";import{a as VBtnToggleSymbol,n as makeVBtnProps,r as VProgressCircular,t as VBtn}from"./VBtn-Sj5jAuOx.js";import{t as VAlert}from"./VAlert-7_VM9EUm.js";import{t as VAutocomplete}from"./VAutocomplete-Ck14ZtUL.js";import{t as VCheckbox}from"./VCheckbox-CHFec5Bg.js";import{t as VDivider}from"./VDivider-AUQb_N9d.js";import{n as makeVSheetProps,t as VSheet}from"./VSheet-CMhyReNa.js";import{n as makeVDialogProps,t as VDialog}from"./VDialog-Drp3yzSH.js";import{a as VCardSubtitle,i as VCardTitle,n as VCardText,o as VCardActions,r as VCardItem,t as VCard}from"./VCard-DExT9Cji.js";import{t as VRow}from"./VRow--oHnzZ1V.js";import{t as VSpacer}from"./VSpacer-BSTt0_VA.js";import{i as VExpansionPanelText,n as VExpansionPanel,t as VExpansionPanels}from"./VExpansionPanels-BgimJBV2.js";import{C as VIBE64_CONNECTIONS_CHANGED_EVENT,S as VIBE64_ACCOUNTS_CHANGED_EVENT,T as VForm,a as _sfc_main$63,c as aiOnboardingNeeded,h as registerVibe64ColleagueModel,i as AiOnboardingNudge_default,o as aiOnboardingAvailable,t as client_exports$13,u as requestVibe64AiOnboarding,w as VTooltip}from"./client-CCZIu6yc.js";import{t as VSkeletonLoader}from"./VSkeletonLoader-pc4bBTxv.js";import{t as VSwitch}from"./VSwitch-B_DmcTxG.js";import{t as VTextarea}from"./VTextarea-wqoRFl1K.js";import{t as _plugin_vue_export_helper_default}from"./_plugin-vue_export-helper-DNW4j-dv.js";import{C as en_default$12,b as LongTextPreviewBlocks_default,g as AssistantTranscript_default,h as AssistantPromptInput_default,l as AssistantConversationElement_default,n as unmatchedOptimisticMessages,s as useAssistantQuestions,t as createAssistantMessageDelivery,x as parseLongTextReviewBlocks,y as _sfc_main$64}from"./conversation-ErAO1CmH.js";import{a as normalizeConversationLogPage,c as conversationTurnMessages,i as mergeConversationLogPages,l as conversationTurnsFromMessages,o as normalizeConversationLogPagination,s as mergeConversationStream,t as applyConversationLogPatch}from"./conversation-DG9lp25w.js";import{n as useRealtimeEvent,r as useRealtimeSocket,t as EMPTY_REALTIME_SOCKET}from"./useRealtimeEvent-BNXVwzFG.js";import{a as resolveSurfaceNavigationTargetFromPlacementContext,c as useWebPlacementContext,d as isRenderableComponent,f as normalizePlacementDefinition,g as normalizePlacementTopologyDefinition,h as normalizePlacementLayoutClass,i as resolveSurfaceIdFromPlacementPathname,l as useWebPlacementRuntime,m as normalizeSurface,n as readPlacementSurfaceConfig,p as normalizePlacementTarget,r as resolveSurfaceDefinitionFromPlacementContext,s as SHELL_WEB_PLACEMENT_RUNTIME_KEY,t as buildSurfaceConfigContext}from"./placement-DYM3JJ-F.js";import{t as resolveRuntimePathname}from"./pathname-Bb895US8.js";import{n as resolveShellLinkPath,r as useSurfaceRouteContext,t as usePaths}from"./usePaths-Y6UuQxmI.js";import{u as VIBE64_AGENT_PROVIDERS}from"./shared-TUhK_uYM.js";import{f as assistantRoutingFromMetadata}from"./assistantRouting-D_9PZkWu.js";import{a as useOperationScope,c as resolveRouteParamNamesInOrder,d as validateOperationInput,i as useFieldErrorBag,l as toRouteParamValue,n as setupOperationErrorReporting,o as createRouteTemplateResolver,r as setupRouteChangeCleanup,s as normalizeRouteParamName,t as useCommand,u as useAccess}from"./useCommand-CVuya6vG.js";import{t as useUiFeedback}from"./useUiFeedback-Bd3rao6E.js";import{i as useShellAsyncModuleRecoveryRuntime,r as SHELL_ASYNC_MODULE_RECOVERY_RUNTIME_KEY}from"./useVibe64Terminal-B9EWJ9Ba.js";import{r as writeLocalStorageJson,t as readLocalStorageJson}from"./browserLocalStorage-B4C7rHrs.js";import{n as useVibe64ProjectSlug}from"./useVibe64ProjectScope-DXjsKKhl.js";import{n as vibe64RealtimeOriginPayload}from"./vibe64BrowserTabOrigin-SF9E31vi.js";import{F as vibe64SessionPath,_ as vibe64AssistantCapabilitiesQueryKey,i as VIBE64_ASSISTANT_MODEL_ACCESS_API_SUFFIX,o as VIBE64_SESSIONS_API_SUFFIX,r as VIBE64_ASSISTANTS_API_SUFFIX,v as vibe64AssistantModelAccessPath}from"./vibe64SessionRequestConfig-xIx-5jxQ.js";import{r as useVibe64DatabaseTools}from"./useVibe64DatabaseTools-DKV-TeNJ.js";import{t as useVibe64SystemGraph}from"./useVibe64SystemGraph-Db_eD-X8.js";(function polyfill(){const relList=document.createElement(`link`).relList;if(relList&&relList.supports&&relList.supports(`modulepreload`))return;for(const link of document.querySelectorAll(`link[rel="modulepreload"]`))processPreload(link);new MutationObserver(mutations=>{for(const mutation of mutations){if(mutation.type!==`childList`)continue;for(const node of mutation.addedNodes)if(node.tagName===`LINK`&&node.rel===`modulepreload`)processPreload(node)}}).observe(document,{childList:true,subtree:true});function getFetchOpts(link){const fetchOpts={};if(link.integrity)fetchOpts.integrity=link.integrity;if(link.referrerPolicy)fetchOpts.referrerPolicy=link.referrerPolicy;if(link.crossOrigin===`use-credentials`)fetchOpts.credentials=`include`;else if(link.crossOrigin===`anonymous`)fetchOpts.credentials=`omit`;else fetchOpts.credentials=`same-origin`;return fetchOpts}function processPreload(link){if(link.ep)return;link.ep=true;const fetchOpts=getFetchOpts(link);fetch(link.href,fetchOpts)}})();var InfiniteQueryObserver=class extends QueryObserver{constructor(client,options){super(client,options)}bindMethods(){super.bindMethods();this.fetchNextPage=this.fetchNextPage.bind(this);this.fetchPreviousPage=this.fetchPreviousPage.bind(this)}setOptions(options){options._type=`infinite`;super.setOptions(options)}getOptimisticResult(options){options._type=`infinite`;return super.getOptimisticResult(options)}fetchNextPage(options){return this.fetch({...options,meta:{fetchMore:{direction:`forward`}}})}fetchPreviousPage(options){return this.fetch({...options,meta:{fetchMore:{direction:`backward`}}})}createResult(query,options){const{state}=query;const parentResult=super.createResult(query,options);const{isFetching,isRefetching,isError,isRefetchError}=parentResult;const fetchDirection=state.fetchMeta?.fetchMore?.direction;const isFetchNextPageError=isError&&fetchDirection===`forward`;const isFetchingNextPage=isFetching&&fetchDirection===`forward`;const isFetchPreviousPageError=isError&&fetchDirection===`backward`;const isFetchingPreviousPage=isFetching&&fetchDirection===`backward`;return{...parentResult,fetchNextPage:this.fetchNextPage,fetchPreviousPage:this.fetchPreviousPage,hasNextPage:hasNextPage(options,state.data),hasPreviousPage:hasPreviousPage(options,state.data),isFetchNextPageError,isFetchingNextPage,isFetchPreviousPageError,isFetchingPreviousPage,isRefetchError:isRefetchError&&!isFetchNextPageError&&!isFetchPreviousPageError,isRefetching:isRefetching&&!isFetchingNextPage&&!isFetchingPreviousPage}}};var MutationCache$1=class extends Subscribable{#mutations;#scopes;#mutationId;constructor(config={}){super();this.config=config;this.#mutations=new Set;this.#scopes=new Map;this.#mutationId=0}build(client,options,state){const mutation=new Mutation({client,mutationCache:this,mutationId:++this.#mutationId,options:client.defaultMutationOptions(options),state});this.add(mutation);return mutation}add(mutation){this.#mutations.add(mutation);const scope=scopeFor(mutation);if(typeof scope===`string`){const scopedMutations=this.#scopes.get(scope);if(scopedMutations)scopedMutations.push(mutation);else this.#scopes.set(scope,[mutation])}this.notify({type:`added`,mutation})}remove(mutation){if(this.#mutations.delete(mutation)){const scope=scopeFor(mutation);if(typeof scope===`string`){const scopedMutations=this.#scopes.get(scope);if(scopedMutations){if(scopedMutations.length>1){const index=scopedMutations.indexOf(mutation);if(index!==-1)scopedMutations.splice(index,1)}else if(scopedMutations[0]===mutation)this.#scopes.delete(scope)}}}this.notify({type:`removed`,mutation})}canRun(mutation){const scope=scopeFor(mutation);if(typeof scope===`string`){const firstPendingMutation=this.#scopes.get(scope)?.find(m=>m.state.status===`pending`);return!firstPendingMutation||firstPendingMutation===mutation}else return true}runNext(mutation){const scope=scopeFor(mutation);if(typeof scope===`string`)return(this.#scopes.get(scope)?.find(m=>m!==mutation&&m.state.isPaused))?.continue()??Promise.resolve();else return Promise.resolve()}clear(){notifyManager.batch(()=>{this.#mutations.forEach(mutation=>{this.notify({type:`removed`,mutation})});this.#mutations.clear();this.#scopes.clear()})}getAll(){return Array.from(this.#mutations)}find(filters){const defaultedFilters={exact:true,...filters};return this.getAll().find(mutation=>matchMutation(defaultedFilters,mutation))}findAll(filters={}){return this.getAll().filter(mutation=>matchMutation(filters,mutation))}notify(event){notifyManager.batch(()=>{this.listeners.forEach(listener=>{listener(event)})})}resumePausedMutations(){const pausedMutations=this.getAll().filter(x=>x.state.isPaused);return notifyManager.batch(()=>Promise.all(pausedMutations.map(mutation=>mutation.continue().catch(noop$1))))}};function scopeFor(mutation){return mutation.options.scope?.id}var QueryCache$1=class extends Subscribable{#queries;constructor(config={}){super();this.config=config;this.#queries=new Map}build(client,options,state){const queryKey=options.queryKey;const queryHash=options.queryHash??hashQueryKeyByOptions(queryKey,options);let query=this.get(queryHash);if(!query){query=new Query({client,queryKey,queryHash,options:client.defaultQueryOptions(options),state,defaultOptions:client.getQueryDefaults(queryKey)});this.add(query)}return query}add(query){if(!this.#queries.has(query.queryHash)){this.#queries.set(query.queryHash,query);this.notify({type:`added`,query})}}remove(query){const queryInMap=this.#queries.get(query.queryHash);if(queryInMap){query.destroy();if(queryInMap===query)this.#queries.delete(query.queryHash);this.notify({type:`removed`,query})}}clear(){notifyManager.batch(()=>{this.getAll().forEach(query=>{this.remove(query)})})}get(queryHash){return this.#queries.get(queryHash)}getAll(){return[...this.#queries.values()]}find(filters){const defaultedFilters={exact:true,...filters};return this.getAll().find(query=>matchQuery(defaultedFilters,query))}findAll(filters={}){const queries=this.getAll();return Object.keys(filters).length>0?queries.filter(query=>matchQuery(filters,query)):queries}notify(event){notifyManager.batch(()=>{this.listeners.forEach(listener=>{listener(event)})})}onFocus(){notifyManager.batch(()=>{this.getAll().forEach(query=>{query.onFocus()})})}onOnline(){notifyManager.batch(()=>{this.getAll().forEach(query=>{query.onOnline()})})}};var QueryClient$1=class{#queryCache;#mutationCache;#defaultOptions;#queryDefaults;#mutationDefaults;#mountCount;#unsubscribeFocus;#unsubscribeOnline;constructor(config={}){this.#queryCache=config.queryCache||new QueryCache$1;this.#mutationCache=config.mutationCache||new MutationCache$1;this.#defaultOptions=config.defaultOptions||{};this.#queryDefaults=new Map;this.#mutationDefaults=new Map;this.#mountCount=0}mount(){this.#mountCount++;if(this.#mountCount!==1)return;this.#unsubscribeFocus=focusManager.subscribe(async focused=>{if(focused){await this.resumePausedMutations();this.#queryCache.onFocus()}});this.#unsubscribeOnline=onlineManager.subscribe(async online=>{if(online){await this.resumePausedMutations();this.#queryCache.onOnline()}})}unmount(){this.#mountCount--;if(this.#mountCount!==0)return;this.#unsubscribeFocus?.();this.#unsubscribeFocus=void 0;this.#unsubscribeOnline?.();this.#unsubscribeOnline=void 0}isFetching(filters){return this.#queryCache.findAll({...filters,fetchStatus:`fetching`}).length}isMutating(filters){return this.#mutationCache.findAll({...filters,status:`pending`}).length}getQueryData(queryKey){const options=this.defaultQueryOptions({queryKey});return this.#queryCache.get(options.queryHash)?.state.data}ensureQueryData(options){const defaultedOptions=this.defaultQueryOptions(options);const query=this.#queryCache.build(this,defaultedOptions);const cachedData=query.state.data;if(cachedData===void 0)return this.fetchQuery(options);if(options.revalidateIfStale&&query.isStaleByTime(resolveQueryValue(defaultedOptions.staleTime,query)))this.prefetchQuery(defaultedOptions);return Promise.resolve(cachedData)}getQueriesData(filters){return this.#queryCache.findAll(filters).map(({queryKey,state})=>{return[queryKey,state.data]})}setQueryData(queryKey,updater,options){const defaultedOptions=this.defaultQueryOptions({queryKey});const prevData=this.#queryCache.get(defaultedOptions.queryHash)?.state.data;const data=functionalUpdate(updater,prevData);if(data===void 0)return;return this.#queryCache.build(this,defaultedOptions).setData(data,{...options,manual:true})}setQueriesData(filters,updater,options){return notifyManager.batch(()=>this.#queryCache.findAll(filters).map(({queryKey})=>[queryKey,this.setQueryData(queryKey,updater,options)]))}getQueryState(queryKey){const options=this.defaultQueryOptions({queryKey});return this.#queryCache.get(options.queryHash)?.state}removeQueries(filters){const queryCache=this.#queryCache;notifyManager.batch(()=>{queryCache.findAll(filters).forEach(query=>{queryCache.remove(query)})})}resetQueries(filters,options){const queryCache=this.#queryCache;return notifyManager.batch(()=>{const matched=queryCache.findAll(filters);const queriesToRefetch=new Set(matched);matched.forEach(query=>{query.reset()});return this.refetchQueries({type:`active`,predicate:query=>queriesToRefetch.has(query)},options)})}cancelQueries(filters,cancelOptions={}){const defaultedCancelOptions={revert:true,...cancelOptions};const promises=notifyManager.batch(()=>this.#queryCache.findAll(filters).map(query=>query.cancel(defaultedCancelOptions)));return Promise.all(promises).then(noop$1).catch(noop$1)}invalidateQueries(filters,options={}){return notifyManager.batch(()=>{this.#queryCache.findAll(filters).forEach(query=>{query.invalidate()});if(filters?.refetchType===`none`)return Promise.resolve();return this.refetchQueries({...filters,type:filters?.refetchType??filters?.type??`active`},options)})}refetchQueries(filters,options={}){const fetchOptions={...options,cancelRefetch:options.cancelRefetch??true};const promises=notifyManager.batch(()=>this.#queryCache.findAll(filters).filter(query=>!query.isDisabled()&&!query.isStatic()).map(query=>{let promise=query.fetch(void 0,fetchOptions);if(!fetchOptions.throwOnError)promise=promise.catch(noop$1);return query.state.fetchStatus===`paused`?Promise.resolve():promise}));return Promise.all(promises).then(noop$1)}async query(options){const defaultedOptions=this.defaultQueryOptions(options);if(defaultedOptions.retry===void 0)defaultedOptions.retry=false;const query=this.#queryCache.build(this,defaultedOptions);const queryData=query.isStaleByTime(resolveQueryValue(defaultedOptions.staleTime,query))?await query.fetch(defaultedOptions):query.state.data;const select=defaultedOptions.select;if(select)return select(queryData);return queryData}fetchQuery(options){const defaultedOptions=this.defaultQueryOptions(options);if(defaultedOptions.retry===void 0)defaultedOptions.retry=false;const query=this.#queryCache.build(this,defaultedOptions);return query.isStaleByTime(resolveQueryValue(defaultedOptions.staleTime,query))?query.fetch(defaultedOptions):Promise.resolve(query.state.data)}prefetchQuery(options){return this.fetchQuery(options).then(noop$1).catch(noop$1)}infiniteQuery(options){options._type=`infinite`;return this.query(options)}fetchInfiniteQuery(options){options._type=`infinite`;return this.fetchQuery(options)}prefetchInfiniteQuery(options){return this.fetchInfiniteQuery(options).then(noop$1).catch(noop$1)}ensureInfiniteQueryData(options){options._type=`infinite`;return this.ensureQueryData(options)}resumePausedMutations(){if(onlineManager.isOnline())return this.#mutationCache.resumePausedMutations();return Promise.resolve()}getQueryCache(){return this.#queryCache}getMutationCache(){return this.#mutationCache}getDefaultOptions(){return this.#defaultOptions}setDefaultOptions(options){this.#defaultOptions=options}setQueryDefaults(queryKey,options){this.#queryDefaults.set(hashKey(queryKey),{queryKey,defaultOptions:options})}getQueryDefaults(queryKey){const defaults=[...this.#queryDefaults.values()];const result={};defaults.forEach(queryDefault=>{if(partialMatchKey(queryKey,queryDefault.queryKey))Object.assign(result,queryDefault.defaultOptions)});return result}setMutationDefaults(mutationKey,options){this.#mutationDefaults.set(hashKey(mutationKey),{mutationKey,defaultOptions:options})}getMutationDefaults(mutationKey){const defaults=[...this.#mutationDefaults.values()];const result={};defaults.forEach(queryDefault=>{if(partialMatchKey(mutationKey,queryDefault.mutationKey))Object.assign(result,queryDefault.defaultOptions)});return result}defaultQueryOptions(options){if(options._defaulted)return options;const defaultedOptions={...this.#defaultOptions.queries,...this.getQueryDefaults(options.queryKey),...options,_defaulted:true};if(!defaultedOptions.queryHash)defaultedOptions.queryHash=hashQueryKeyByOptions(defaultedOptions.queryKey,defaultedOptions);if(defaultedOptions.refetchOnReconnect===void 0)defaultedOptions.refetchOnReconnect=defaultedOptions.networkMode!==`always`;if(defaultedOptions.throwOnError===void 0)defaultedOptions.throwOnError=!!defaultedOptions.suspense;if(!defaultedOptions.networkMode&&defaultedOptions.persister)defaultedOptions.networkMode=`offlineFirst`;if(defaultedOptions.queryFn===skipToken)defaultedOptions.enabled=false;return defaultedOptions}defaultMutationOptions(options){if(options?._defaulted)return options;return{...this.#defaultOptions.mutations,...options?.mutationKey&&this.getMutationDefaults(options.mutationKey),...options,_defaulted:true}}clear(){this.#queryCache.clear();this.#mutationCache.clear()}};var QueryCache=class extends QueryCache$1{find(filters){return super.find(cloneDeepUnref(filters))}findAll(filters={}){return super.findAll(cloneDeepUnref(filters))}};var MutationCache=class extends MutationCache$1{find(filters){return super.find(cloneDeepUnref(filters))}findAll(filters={}){return super.findAll(cloneDeepUnref(filters))}};var QueryClient=class extends QueryClient$1{constructor(config={}){const vueQueryConfig={defaultOptions:config.defaultOptions,queryCache:config.queryCache||new QueryCache,mutationCache:config.mutationCache||new MutationCache};super(vueQueryConfig);this.isRestoring=ref(false)}isFetching(filters={}){return super.isFetching(cloneDeepUnref(filters))}isMutating(filters={}){return super.isMutating(cloneDeepUnref(filters))}getQueryData(queryKey){return super.getQueryData(cloneDeepUnref(queryKey))}ensureQueryData(options){return super.ensureQueryData(cloneDeepUnref(options))}getQueriesData(filters){return super.getQueriesData(cloneDeepUnref(filters))}setQueryData(queryKey,updater,options={}){return super.setQueryData(cloneDeepUnref(queryKey),updater,cloneDeepUnref(options))}setQueriesData(filters,updater,options={}){return super.setQueriesData(cloneDeepUnref(filters),updater,cloneDeepUnref(options))}getQueryState(queryKey){return super.getQueryState(cloneDeepUnref(queryKey))}removeQueries(filters={}){return super.removeQueries(cloneDeepUnref(filters))}resetQueries(filters={},options={}){return super.resetQueries(cloneDeepUnref(filters),cloneDeepUnref(options))}cancelQueries(filters={},options={}){return super.cancelQueries(cloneDeepUnref(filters),cloneDeepUnref(options))}invalidateQueries(filters={},options={}){const filtersCloned=cloneDeepUnref(filters);const optionsCloned=cloneDeepUnref(options);super.invalidateQueries({...filtersCloned,refetchType:`none`},optionsCloned);if(filtersCloned.refetchType===`none`)return Promise.resolve();const refetchFilters={...filtersCloned,type:filtersCloned.refetchType??filtersCloned.type??`active`};return nextTick$1().then(()=>{return super.refetchQueries(refetchFilters,optionsCloned)})}refetchQueries(filters={},options={}){return super.refetchQueries(cloneDeepUnref(filters),cloneDeepUnref(options))}query(options){return super.query(cloneDeepUnref(options))}fetchQuery(options){return super.fetchQuery(cloneDeepUnref(options))}prefetchQuery(options){return super.prefetchQuery(cloneDeepUnref(options))}infiniteQuery(options){return super.infiniteQuery(cloneDeepUnref(options))}fetchInfiniteQuery(options){return super.fetchInfiniteQuery(cloneDeepUnref(options))}prefetchInfiniteQuery(options){return super.prefetchInfiniteQuery(cloneDeepUnref(options))}setDefaultOptions(options){super.setDefaultOptions(cloneDeepUnref(options))}setQueryDefaults(queryKey,options){super.setQueryDefaults(cloneDeepUnref(queryKey),cloneDeepUnref(options))}getQueryDefaults(queryKey){return super.getQueryDefaults(cloneDeepUnref(queryKey))}setMutationDefaults(mutationKey,options){super.setMutationDefaults(cloneDeepUnref(mutationKey),cloneDeepUnref(options))}getMutationDefaults(mutationKey){return super.getMutationDefaults(cloneDeepUnref(mutationKey))}};var VueQueryPlugin={install:(app,options={})=>{const clientKey=getClientKey(options.queryClientKey);let client;if(`queryClient`in options&&options.queryClient)client=options.queryClient;else{const clientConfig=`queryClientConfig`in options?options.queryClientConfig:void 0;client=new QueryClient(clientConfig)}if(!environmentManager.isServer())client.mount();let persisterUnmount=()=>{};if(options.clientPersister){if(client.isRestoring)client.isRestoring.value=true;const[unmount,promise]=options.clientPersister(client);persisterUnmount=unmount;promise.then(()=>{if(client.isRestoring)client.isRestoring.value=false;options.clientPersisterOnSuccess?.(client)})}const cleanup=()=>{client.unmount();persisterUnmount()};if(app.onUnmount)app.onUnmount(cleanup);else{const originalUnmount=app.unmount;app.unmount=function vueQueryUnmount(){cleanup();originalUnmount()}}if(false)app.mixin({beforeCreate(){if(!this._provided){const provideCache={};Object.defineProperty(this,"_provided",{get:()=>provideCache,set:v=>Object.assign(provideCache,v)})}this._provided[clientKey]=client}});else app.provide(clientKey,client)}};function useInfiniteQuery(options,queryClient){return useBaseQuery(InfiniteQueryObserver,options,queryClient)}var isBrowser=typeof document!==`undefined`;var HASH_RE=/#/g;var AMPERSAND_RE=/&/g;var SLASH_RE=/\//g;var EQUAL_RE=/=/g;var IM_RE=/\?/g;var PLUS_RE=/\+/g;var ENC_BRACKET_OPEN_RE=/%5B/g;var ENC_BRACKET_CLOSE_RE=/%5D/g;var ENC_CARET_RE=/%5E/g;var ENC_BACKTICK_RE=/%60/g;var ENC_CURLY_OPEN_RE=/%7B/g;var ENC_PIPE_RE=/%7C/g;var ENC_CURLY_CLOSE_RE=/%7D/g;var ENC_SPACE_RE=/%20/g;function commonEncode(text){return text==null?``:encodeURI(``+text).replace(ENC_PIPE_RE,`|`).replace(ENC_BRACKET_OPEN_RE,`[`).replace(ENC_BRACKET_CLOSE_RE,`]`)}function encodeHash(text){return commonEncode(text).replace(ENC_CURLY_OPEN_RE,`{`).replace(ENC_CURLY_CLOSE_RE,`}`).replace(ENC_CARET_RE,`^`)}function encodeQueryValue(text){return commonEncode(text).replace(PLUS_RE,`%2B`).replace(ENC_SPACE_RE,`+`).replace(HASH_RE,`%23`).replace(AMPERSAND_RE,`%26`).replace(ENC_BACKTICK_RE,"`").replace(ENC_CURLY_OPEN_RE,`{`).replace(ENC_CURLY_CLOSE_RE,`}`).replace(ENC_CARET_RE,`^`)}function encodeQueryKey(text){return encodeQueryValue(text).replace(EQUAL_RE,`%3D`)}function encodePath(text){return commonEncode(text).replace(HASH_RE,`%23`).replace(IM_RE,`%3F`)}function encodeParam(text){return encodePath(text).replace(SLASH_RE,`%2F`)}function decode$2(text){if(text==null)return null;try{return decodeURIComponent(``+text)}catch{}return``+text}var TRAILING_SLASH_RE=/\/$/;var removeTrailingSlash=path=>path.replace(TRAILING_SLASH_RE,``);function parseURL(parseQuery,location,currentLocation=`/`){let path,query={},searchString=``,hash=``;const hashPos=location.indexOf(`#`);let searchPos=location.indexOf(`?`);searchPos=hashPos>=0&&searchPos>hashPos?-1:searchPos;if(searchPos>=0){path=location.slice(0,searchPos);searchString=location.slice(searchPos,hashPos>0?hashPos:location.length);query=parseQuery(searchString.slice(1))}if(hashPos>=0){path=path||location.slice(0,hashPos);hash=location.slice(hashPos,location.length)}path=resolveRelativePath(path!=null?path:location,currentLocation);return{fullPath:path+searchString+hash,path,query,hash:decode$2(hash)}}function stringifyURL(stringifyQuery,location){const query=location.query?stringifyQuery(location.query):``;return location.path+(query&&`?`)+query+(location.hash||``)}function stripBase(pathname,base){if(!base||!pathname.toLowerCase().startsWith(base.toLowerCase()))return pathname;return pathname.slice(base.length)||`/`}function isSameRouteLocation(stringifyQuery,a,b){const aLastIndex=a.matched.length-1;const bLastIndex=b.matched.length-1;return aLastIndex>-1&&aLastIndex===bLastIndex&&isSameRouteRecord(a.matched[aLastIndex],b.matched[bLastIndex])&&isSameRouteLocationParams(a.params,b.params)&&stringifyQuery(a.query)===stringifyQuery(b.query)&&a.hash===b.hash}function isSameRouteRecord(a,b){return(a.aliasOf||a)===(b.aliasOf||b)}function isSameRouteLocationParams(a,b){if(Object.keys(a).length!==Object.keys(b).length)return false;for(var key in a)if(!isSameRouteLocationParamsValue(a[key],b[key]))return false;return true}function isSameRouteLocationParamsValue(a,b){return isArray(a)?isEquivalentArray(a,b):isArray(b)?isEquivalentArray(b,a):(a&&a.valueOf())===(b&&b.valueOf())}function isEquivalentArray(a,b){return isArray(b)?a.length===b.length&&a.every((value,i)=>value===b[i]):a.length===1&&a[0]===b}function resolveRelativePath(to,from){if(isAbsolutePath(to))return to;if(!to)return from;const fromSegments=from.split(`/`);const toSegments=to.split(`/`);const lastToSegment=toSegments[toSegments.length-1];if(lastToSegment===`..`||lastToSegment===`.`)toSegments.push(``);let position=fromSegments.length-1;let toPosition;let segment;for(toPosition=0;toPosition<toSegments.length;toPosition++){segment=toSegments[toPosition];if(segment===`.`)continue;if(segment===`..`){if(position>1)position--}else break}return fromSegments.slice(0,position).join(`/`)+`/`+toSegments.slice(toPosition).join(`/`)}var START_LOCATION_NORMALIZED={path:`/`,name:void 0,params:{},query:{},hash:``,fullPath:`/`,matched:[],meta:{},redirectedFrom:void 0};function normalizeBase(base){if(!base){if(isBrowser){const baseEl=document.querySelector(`base`);base=baseEl&&baseEl.getAttribute(`href`)||`/`;base=base.replace(/^\w+:\/\/[^/]+/,``)}else base=`/`}if(base[0]!==`/`&&base[0]!==`#`)base=`/`+base;return removeTrailingSlash(base)}var BEFORE_HASH_RE=/^[^#]+#/;function createHref(base,location){return base.replace(BEFORE_HASH_RE,`#`)+location}function getElementPosition(el,offset){const docRect=document.documentElement.getBoundingClientRect();const elRect=el.getBoundingClientRect();return{behavior:offset.behavior,left:elRect.left-docRect.left-(offset.left||0),top:elRect.top-docRect.top-(offset.top||0)}}var computeScrollPosition=()=>history.scrollRestoration===`manual`?{left:window.scrollX,top:window.scrollY}:null;function scrollToPosition(position){let scrollToOptions;if(`el`in position){const positionEl=position.el;const isIdSelector=typeof positionEl===`string`&&positionEl.startsWith(`#`);const el=typeof positionEl===`string`?isIdSelector?document.getElementById(positionEl.slice(1)):document.querySelector(positionEl):positionEl;if(!el)return;scrollToOptions=getElementPosition(el,position)}else scrollToOptions=position;if(`scrollBehavior`in document.documentElement.style)window.scrollTo(scrollToOptions);else window.scrollTo(scrollToOptions.left!=null?scrollToOptions.left:window.scrollX,scrollToOptions.top!=null?scrollToOptions.top:window.scrollY)}function getScrollKey(path,delta){return(history.state?history.state.position-delta:-1)+path}var scrollPositions=new Map;function saveScrollPosition(key){scrollPositions.set(key,computeScrollPosition())}function getSavedScrollPosition(key){const scroll=scrollPositions.get(key);scrollPositions.delete(key);return scroll}function isRouteLocation(route){return typeof route===`string`||route&&typeof route===`object`}function isRouteName(name){return typeof name===`string`||typeof name===`symbol`}function parseQuery(search){const query={};if(search===``||search===`?`)return query;const searchParams=(search[0]===`?`?search.slice(1):search).split(`&`);for(let i=0;i<searchParams.length;++i){const searchParam=searchParams[i].replace(PLUS_RE,` `);const eqPos=searchParam.indexOf(`=`);const key=decode$2(eqPos<0?searchParam:searchParam.slice(0,eqPos));const value=eqPos<0?null:decode$2(searchParam.slice(eqPos+1));if(key in query){let currentValue=query[key];if(!isArray(currentValue))currentValue=query[key]=[currentValue];currentValue.push(value)}else query[key]=value}return query}function stringifyQuery(query){let search=``;for(let key in query){const value=query[key];key=encodeQueryKey(key);if(value==null){if(value!==void 0)search+=(search.length?`&`:``)+key;continue}(isArray(value)?value.map(v=>v&&encodeQueryValue(v)):[value&&encodeQueryValue(value)]).forEach(value=>{if(value!==void 0){search+=(search.length?`&`:``)+key;if(value!=null)search+=`=`+value}})}return search}function normalizeQuery(query){const normalizedQuery={};for(const key in query){const value=query[key];if(value!==void 0)normalizedQuery[key]=isArray(value)?value.map(v=>v==null?null:``+v):value==null?value:``+value}return normalizedQuery}function useCallbacks(){let handlers=[];function add(handler){handlers.push(handler);return()=>{const i=handlers.indexOf(handler);if(i>-1)handlers.splice(i,1)}}function reset(){handlers=[]}return{add,list:()=>handlers.slice(),reset}}function guardToPromiseFn(guard,to,from,record,name,runWithContext=fn=>fn()){const enterCallbackArray=record&&(record.enterCallbacks[name]=record.enterCallbacks[name]||[]);return()=>new Promise((resolve,reject)=>{const next=valid=>{if(valid===false)reject(createRouterError(4,{from,to}));else if(valid instanceof Error)reject(valid);else if(isRouteLocation(valid))reject(createRouterError(2,{from:to,to:valid}));else{if(enterCallbackArray&&record.enterCallbacks[name]===enterCallbackArray&&typeof valid===`function`)enterCallbackArray.push(valid);resolve()}};const guardReturn=runWithContext(()=>guard.call(record&&record.instances[name],to,from,next));let guardCall=Promise.resolve(guardReturn);if(guard.length<3)guardCall=guardCall.then(next);guardCall.catch(err=>reject(err))})}function extractComponentsGuards(matched,guardType,to,from,runWithContext=fn=>fn()){const guards=[];for(const record of matched)for(const name in record.components){let rawComponent=record.components[name];if(guardType!==`beforeRouteEnter`&&!record.instances[name])continue;if(isRouteComponent$1(rawComponent)){const guard=(rawComponent.__vccOpts||rawComponent)[guardType];guard&&guards.push(guardToPromiseFn(guard,to,from,record,name,runWithContext))}else{let componentPromise=rawComponent();guards.push(()=>componentPromise.then(resolved=>{if(!resolved)throw new Error(`Couldn't resolve component "${name}" at "${record.path}"`);const resolvedComponent=isESModule(resolved)?resolved.default:resolved;record.mods[name]=resolved;record.components[name]=resolvedComponent;const guard=(resolvedComponent.__vccOpts||resolvedComponent)[guardType];return guard&&guardToPromiseFn(guard,to,from,record,name,runWithContext)()}))}}return guards}function extractChangingRecords(to,from){const leavingRecords=[];const updatingRecords=[];const enteringRecords=[];const len=Math.max(from.matched.length,to.matched.length);for(let i=0;i<len;i++){const recordFrom=from.matched[i];if(recordFrom){if(to.matched.find(record=>isSameRouteRecord(record,recordFrom)))updatingRecords.push(recordFrom);else leavingRecords.push(recordFrom)}const recordTo=to.matched[i];if(recordTo){if(!from.matched.find(record=>isSameRouteRecord(record,recordTo)))enteringRecords.push(recordTo)}}return[leavingRecords,updatingRecords,enteringRecords]}var createBaseLocation=()=>location.protocol+`//`+location.host;function createCurrentLocation(base,location){const{pathname,search,hash}=location;const hashPos=base.indexOf(`#`);if(hashPos>-1){let slicePos=hash.includes(base.slice(hashPos))?base.slice(hashPos).length:1;let pathFromHash=hash.slice(slicePos);if(pathFromHash[0]!==`/`)pathFromHash=`/`+pathFromHash;return stripBase(pathFromHash,``)}return stripBase(pathname,base)+search+hash}function useHistoryListeners(base,historyState,currentLocation,replace){let listeners=[];let teardowns=[];let pauseState=null;const popStateHandler=({state})=>{const to=createCurrentLocation(base,location);const from=currentLocation.value;const fromState=historyState.value;let delta=0;if(state){currentLocation.value=to;historyState.value=state;if(pauseState&&pauseState===from){pauseState=null;return}delta=fromState?state.position-fromState.position:0}else replace(to);listeners.forEach(listener=>{listener(currentLocation.value,from,{delta,type:`pop`,direction:delta?delta>0?`forward`:`back`:``})})};function pauseListeners(){pauseState=currentLocation.value}function listen(callback){listeners.push(callback);const teardown=()=>{const index=listeners.indexOf(callback);if(index>-1)listeners.splice(index,1)};teardowns.push(teardown);return teardown}function beforeUnloadListener(){const{history}=window;if(!history.state)return;history.replaceState(assign({},history.state,{scroll:computeScrollPosition()}),``)}function destroy(){for(const teardown of teardowns)teardown();teardowns=[];window.removeEventListener(`popstate`,popStateHandler);window.removeEventListener(`pagehide`,beforeUnloadListener)}window.addEventListener(`popstate`,popStateHandler);window.addEventListener(`pagehide`,beforeUnloadListener);return{pauseListeners,listen,destroy}}function buildState(back,current,forward,replaced=false){return{back,current,forward,replaced,position:window.history.length,scroll:null}}function useHistoryStateNavigation(base){const{history,location}=window;const currentLocation={value:createCurrentLocation(base,location)};const historyState={value:history.state};if(!historyState.value)changeLocation(currentLocation.value,{back:null,current:currentLocation.value,forward:null,position:history.length-1,replaced:true,scroll:null},true);function changeLocation(to,state,replace){const hashIndex=base.indexOf(`#`);const url=hashIndex>-1?(location.host&&document.querySelector(`base`)?base:base.slice(hashIndex))+to:createBaseLocation()+base+to;try{history[replace?`replaceState`:`pushState`](state,``,url);historyState.value=state}catch(err){console.error(err);location[replace?`replace`:`assign`](url)}}function replace(to,data){changeLocation(to,assign({},history.state,buildState(historyState.value.back,to,historyState.value.forward,true),data,{position:historyState.value.position}),true);currentLocation.value=to}function push(to,data){const currentState=assign({},historyState.value,history.state,{forward:to,scroll:computeScrollPosition()});changeLocation(currentState.current,currentState,true);changeLocation(to,assign({},buildState(currentLocation.value,to,null),{position:currentState.position+1},data),false);currentLocation.value=to}return{location:currentLocation,state:historyState,push,replace}}function createWebHistory(base){base=normalizeBase(base);const historyNavigation=useHistoryStateNavigation(base);const historyListeners=useHistoryListeners(base,historyNavigation.state,historyNavigation.location,historyNavigation.replace);function go(delta,triggerListeners=true){if(!triggerListeners)historyListeners.pauseListeners();history.go(delta)}const routerHistory=assign({location:``,base,go,createHref:createHref.bind(null,base)},historyNavigation,historyListeners);Object.defineProperty(routerHistory,"location",{enumerable:true,get:()=>historyNavigation.location.value});Object.defineProperty(routerHistory,"state",{enumerable:true,get:()=>historyNavigation.state.value});return routerHistory}var ROOT_TOKEN={type:0,value:``};var VALID_PARAM_RE=/[a-zA-Z0-9_]/;function tokenizePath(path){if(!path)return[[]];if(path===`/`)return[[ROOT_TOKEN]];if(!isAbsolutePath(path))throw new Error(`Invalid path "${path}"`);function crash(message){throw new Error(`ERR (${state})/"${buffer}": ${message}`)}let state=0;let previousState=state;const tokens=[];let segment;function finalizeSegment(){if(segment)tokens.push(segment);segment=[]}let i=0;let char;let buffer=``;let customRe=``;function consumeBuffer(){if(!buffer)return;if(state===0)segment.push({type:0,value:buffer});else if(state===1||state===2||state===3){if(segment.length>1&&(char===`*`||char===`+`))crash(`A repeatable param (${buffer}) must be alone in its segment. eg: '/:ids+.`);segment.push({type:1,value:buffer,regexp:customRe,repeatable:char===`*`||char===`+`,optional:char===`*`||char===`?`})}else crash(`Invalid state to consume buffer`);buffer=``}function addCharToBuffer(){buffer+=char}while(i<path.length){char=path[i++];switch(state){case 0:if(char===`\\`){previousState=state;state=4}else if(char===`/`){if(buffer)consumeBuffer();finalizeSegment()}else if(char===`:`){consumeBuffer();state=1}else addCharToBuffer();break;case 4:addCharToBuffer();state=previousState;break;case 1:if(char===`(`)state=2;else if(VALID_PARAM_RE.test(char))addCharToBuffer();else{consumeBuffer();state=0;if(char!==`*`&&char!==`?`&&char!==`+`)i--}break;case 2:if(char===`)`){if(customRe[customRe.length-1]==`\\`)customRe=customRe.slice(0,-1)+char;else state=3}else customRe+=char;break;case 3:consumeBuffer();state=0;if(char!==`*`&&char!==`?`&&char!==`+`)i--;customRe=``;break;default:crash(`Unknown state`)}}if(state===2)crash(`Unfinished custom RegExp for param "${buffer}"`);consumeBuffer();finalizeSegment();return tokens}var BASE_PARAM_PATTERN=`[^/]+?`;var BASE_PATH_PARSER_OPTIONS={sensitive:false,strict:false,start:true,end:true};var REGEX_CHARS_RE=/[.+*?^${}()[\]/\\]/g;function tokensToParser(segments,extraOptions){const options=assign({},BASE_PATH_PARSER_OPTIONS,extraOptions);const score=[];let pattern=options.start?`^`:``;const keys=[];for(const segment of segments){const segmentScores=segment.length?[]:[90];if(options.strict&&!segment.length)pattern+=`/`;for(let tokenIndex=0;tokenIndex<segment.length;tokenIndex++){const token=segment[tokenIndex];let subSegmentScore=40+(options.sensitive?.25:0);if(token.type===0){if(!tokenIndex)pattern+=`/`;pattern+=token.value.replace(REGEX_CHARS_RE,`\\$&`);subSegmentScore+=40}else if(token.type===1){const{value,repeatable,optional,regexp}=token;keys.push({name:value,repeatable,optional});const re=regexp?regexp:BASE_PARAM_PATTERN;if(re!==BASE_PARAM_PATTERN){subSegmentScore+=10;try{new RegExp(`(${re})`)}catch(err){throw new Error(`Invalid custom RegExp for param "${value}" (${re}): `+err.message)}}let subPattern=repeatable?`((?:${re})(?:/(?:${re}))*)`:`(${re})`;if(!tokenIndex)subPattern=optional&&segment.length<2?`(?:/${subPattern})`:`/`+subPattern;if(optional)subPattern+=`?`;pattern+=subPattern;subSegmentScore+=20;if(optional)subSegmentScore+=-8;if(repeatable)subSegmentScore+=-20;if(re===`.*`)subSegmentScore+=-50}segmentScores.push(subSegmentScore)}score.push(segmentScores)}if(options.strict&&options.end){const i=score.length-1;score[i][score[i].length-1]+=.7000000000000001}if(!options.strict)pattern+=`/?`;if(options.end)pattern+=`$`;else if(options.strict&&!pattern.endsWith(`/`))pattern+=`(?:/|$)`;const re=new RegExp(pattern,options.sensitive?``:`i`);function parse(path){const match=path.match(re);const params={};if(!match)return null;for(let i=1;i<match.length;i++){const value=match[i]||``;const key=keys[i-1];params[key.name]=value&&key.repeatable?value.split(`/`):value}return params}function stringify(params){let path=``;let avoidDuplicatedSlash=false;for(const segment of segments){if(!avoidDuplicatedSlash||!path.endsWith(`/`))path+=`/`;avoidDuplicatedSlash=false;for(const token of segment)if(token.type===0)path+=token.value;else if(token.type===1){const{value,repeatable,optional}=token;const param=value in params?params[value]:``;if(isArray(param)&&!repeatable)throw new Error(`Provided param "${value}" is an array but it is not repeatable (* or + modifiers)`);const text=isArray(param)?param.join(`/`):param;if(!text){if(optional){if(segment.length<2){if(path.endsWith(`/`))path=path.slice(0,-1);else avoidDuplicatedSlash=true}}else throw new Error(`Missing required param "${value}"`)}path+=text}}return path||`/`}return{re,score,keys,parse,stringify}}function compareScoreArray(a,b){let i=0;while(i<a.length&&i<b.length){const diff=b[i]-a[i];if(diff)return diff;i++}if(a.length<b.length)return a.length===1&&a[0]===80?-1:1;else if(a.length>b.length)return b.length===1&&b[0]===80?1:-1;return 0}function comparePathParserScore(a,b){let i=0;const aScore=a.score;const bScore=b.score;while(i<aScore.length&&i<bScore.length){const comp=compareScoreArray(aScore[i],bScore[i]);if(comp)return comp;i++}if(Math.abs(bScore.length-aScore.length)===1){if(isLastScoreNegative(aScore))return 1;if(isLastScoreNegative(bScore))return-1}return bScore.length-aScore.length}function isLastScoreNegative(score){const last=score[score.length-1];return score.length>0&&last[last.length-1]<0}var PATH_PARSER_OPTIONS_DEFAULTS={strict:false,end:true,sensitive:false};function createRouteRecordMatcher(record,parent,options){const parser=tokensToParser(tokenizePath(record.path),options);const matcher=assign(parser,{record,parent,children:[],alias:[]});if(parent){if(!matcher.record.aliasOf===!parent.record.aliasOf)parent.children.push(matcher)}return matcher}function createRouterMatcher(routes,globalOptions){const matchers=[];const matcherMap=new Map;globalOptions=mergeOptions(PATH_PARSER_OPTIONS_DEFAULTS,globalOptions);function getRecordMatcher(name){return matcherMap.get(name)}function addRoute(record,parent,originalRecord){const isRootAdd=!originalRecord;const mainNormalizedRecord=normalizeRouteRecord(record);mainNormalizedRecord.aliasOf=originalRecord&&originalRecord.record;const options=mergeOptions(globalOptions,record);const normalizedRecords=[mainNormalizedRecord];if(`alias`in record){const aliases=typeof record.alias===`string`?[record.alias]:record.alias;for(const alias of aliases)normalizedRecords.push(normalizeRouteRecord(assign({},mainNormalizedRecord,{components:originalRecord?originalRecord.record.components:mainNormalizedRecord.components,path:alias,aliasOf:originalRecord?originalRecord.record:mainNormalizedRecord})))}let matcher;let originalMatcher;for(const normalizedRecord of normalizedRecords){const{path}=normalizedRecord;if(parent&&!isAbsolutePath(path)){const parentPath=parent.record.path;const connectingSlash=parentPath[parentPath.length-1]===`/`?``:`/`;normalizedRecord.path=parent.record.path+(path&&connectingSlash+path)}matcher=createRouteRecordMatcher(normalizedRecord,parent,options);if(originalRecord)originalRecord.alias.push(matcher);else{originalMatcher=originalMatcher||matcher;if(originalMatcher!==matcher)originalMatcher.alias.push(matcher);if(isRootAdd&&record.name&&!isAliasRecord(matcher))removeRoute(record.name)}if(isMatchable(matcher))insertMatcher(matcher);if(mainNormalizedRecord.children){const children=mainNormalizedRecord.children;for(let i=0;i<children.length;i++)addRoute(children[i],matcher,originalRecord&&originalRecord.children[i])}originalRecord=originalRecord||matcher}return originalMatcher?()=>{removeRoute(originalMatcher)}:noop$2}function removeRoute(matcherRef){if(isRouteName(matcherRef)){const matcher=matcherMap.get(matcherRef);if(matcher){matcherMap.delete(matcherRef);matchers.splice(matchers.indexOf(matcher),1);matcher.children.forEach(removeRoute);matcher.alias.forEach(removeRoute)}}else{const index=matchers.indexOf(matcherRef);if(index>-1){matchers.splice(index,1);if(matcherRef.record.name)matcherMap.delete(matcherRef.record.name);matcherRef.children.forEach(removeRoute);matcherRef.alias.forEach(removeRoute)}}}function getRoutes(){return matchers}function insertMatcher(matcher){const index=findInsertionIndex(matcher,matchers);matchers.splice(index,0,matcher);if(matcher.record.name&&!isAliasRecord(matcher))matcherMap.set(matcher.record.name,matcher)}function resolve(location,currentLocation){let matcher;let params={};let path;let name;if(`name`in location&&location.name){matcher=matcherMap.get(location.name);if(!matcher)throw createRouterError(1,{location});name=matcher.record.name;params=assign(pickParams(currentLocation.params,matcher.keys.filter(k=>!k.optional).concat(matcher.parent?matcher.parent.keys.filter(k=>k.optional):[]).map(k=>k.name)),location.params&&pickParams(location.params,matcher.keys.map(k=>k.name)));path=matcher.stringify(params)}else if(location.path!=null){path=location.path;matcher=matchers.find(m=>m.re.test(path));if(matcher){params=matcher.parse(path);name=matcher.record.name;matcher.keys.forEach(key=>{if(key.optional&&!params[key.name])delete params[key.name]})}}else{matcher=currentLocation.name?matcherMap.get(currentLocation.name):matchers.find(m=>m.re.test(currentLocation.path));if(!matcher)throw createRouterError(1,{location,currentLocation});name=matcher.record.name;params=assign({},currentLocation.params,location.params);path=matcher.stringify(params)}const matched=[];let parentMatcher=matcher;while(parentMatcher){matched.unshift(parentMatcher.record);parentMatcher=parentMatcher.parent}return{name,path,params,matched,meta:mergeMetaFields(matched)}}routes.forEach(route=>addRoute(route));function clearRoutes(){matchers.length=0;matcherMap.clear()}return{addRoute,resolve,removeRoute,clearRoutes,getRoutes,getRecordMatcher}}function pickParams(params,keys){const newParams={};for(const key of keys)if(key in params)newParams[key]=params[key];return newParams}function normalizeRouteRecord(record){const normalized={path:record.path,redirect:record.redirect,name:record.name,meta:record.meta||{},aliasOf:record.aliasOf,beforeEnter:record.beforeEnter,props:normalizeRecordProps(record),children:record.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:`components`in record?record.components||null:record.component&&{default:record.component}};Object.defineProperty(normalized,"mods",{value:{}});return normalized}function normalizeRecordProps(record){const propsObject={};const props=record.props||false;if(`component`in record)propsObject.default=props;else for(const name in record.components)propsObject[name]=typeof props===`object`?props[name]:props;return propsObject}function isAliasRecord(record){while(record){if(record.record.aliasOf)return true;record=record.parent}return false}function mergeMetaFields(matched){return matched.reduce((meta,record)=>assign(meta,record.meta),{})}function findInsertionIndex(matcher,matchers){let lower=0;let upper=matchers.length;while(lower!==upper){const mid=lower+upper>>1;if(comparePathParserScore(matcher,matchers[mid])<0)upper=mid;else lower=mid+1}const insertionAncestor=getInsertionAncestor(matcher);if(insertionAncestor)upper=matchers.lastIndexOf(insertionAncestor,upper-1);return upper}function getInsertionAncestor(matcher){let ancestor=matcher;while(ancestor=ancestor.parent)if(isMatchable(ancestor)&&comparePathParserScore(matcher,ancestor)===0)return ancestor}function isMatchable({record}){return!!(record.name||record.components&&Object.keys(record.components).length||record.redirect)}function useLink(props){const router=inject$1(routerKey);const currentRoute=inject$1(routeLocationKey);const route=computed(()=>{const to=unref(props.to);return router.resolve(to)});const activeRecordIndex=computed(()=>{const{matched}=route.value;const{length}=matched;const routeMatched=matched[length-1];const currentMatched=currentRoute.matched;if(!routeMatched||!currentMatched.length)return-1;const index=currentMatched.findIndex(isSameRouteRecord.bind(null,routeMatched));if(index>-1)return index;const parentRecordPath=getOriginalPath(matched[length-2]);return length>1&&getOriginalPath(routeMatched)===parentRecordPath&¤tMatched[currentMatched.length-1].path!==parentRecordPath?currentMatched.findIndex(isSameRouteRecord.bind(null,matched[length-2])):index});const isActive=computed(()=>activeRecordIndex.value>-1&&includesParams(currentRoute.params,route.value.params));const isExactActive=computed(()=>activeRecordIndex.value>-1&&activeRecordIndex.value===currentRoute.matched.length-1&&isSameRouteLocationParams(currentRoute.params,route.value.params));function navigate(e={}){if(guardEvent(e)){const p=router[unref(props.replace)?`replace`:`push`](unref(props.to)).catch(noop$2);if(props.viewTransition&&typeof document!==`undefined`&&`startViewTransition`in document)document.startViewTransition(()=>p);return p}return Promise.resolve()}return{route,href:computed(()=>route.value.href),isActive,isExactActive,navigate}}function preferSingleVNode(vnodes){return vnodes.length===1?vnodes[0]:vnodes}var RouterLink=defineComponent({name:`RouterLink`,compatConfig:{MODE:3},props:{to:{type:[String,Object],required:true},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:`page`},viewTransition:Boolean},useLink,setup(props,{slots}){const link=reactive(useLink(props));const{options}=inject$1(routerKey);const elClass=computed(()=>({[getLinkClass(props.activeClass,options.linkActiveClass,`router-link-active`)]:link.isActive,[getLinkClass(props.exactActiveClass,options.linkExactActiveClass,`router-link-exact-active`)]:link.isExactActive}));return()=>{const children=slots.default&&preferSingleVNode(slots.default(link));return props.custom?children:h$1(`a`,{"aria-current":link.isExactActive?props.ariaCurrentValue:null,href:link.href,onClick:link.navigate,class:elClass.value},children)}}});function guardEvent(e){if(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)return;if(e.defaultPrevented)return;if(e.button!==void 0&&e.button!==0)return;if(e.currentTarget&&e.currentTarget.getAttribute){const target=e.currentTarget.getAttribute(`target`);if(/\b_blank\b/i.test(target))return}if(e.preventDefault)e.preventDefault();return true}function includesParams(outer,inner){for(const key in inner){const innerValue=inner[key];const outerValue=outer[key];if(isArray(innerValue)){if(!isArray(outerValue)||outerValue.length!==innerValue.length||innerValue.some((value,i)=>value.valueOf()!==outerValue[i].valueOf()))return false}else if(innerValue!==outerValue)return false}return true}function getOriginalPath(record){return record?record.aliasOf?record.aliasOf.path:record.path:``}var getLinkClass=(propClass,globalClass,defaultClass)=>propClass!=null?propClass:globalClass!=null?globalClass:defaultClass;var RouterViewImpl=defineComponent({name:`RouterView`,inheritAttrs:false,props:{name:{type:String,default:`default`},route:Object},compatConfig:{MODE:3},setup(props,{attrs,slots}){const injectedRoute=inject$1(routerViewLocationKey);const routeToDisplay=computed(()=>props.route||injectedRoute.value);const injectedDepth=inject$1(viewDepthKey,0);const depth=computed(()=>{let initialDepth=unref(injectedDepth);const{matched}=routeToDisplay.value;let matchedRoute;while((matchedRoute=matched[initialDepth])&&!matchedRoute.components)initialDepth++;return initialDepth});const matchedRouteRef=computed(()=>routeToDisplay.value.matched[depth.value]);provide(viewDepthKey,computed(()=>depth.value+1));provide(matchedRouteKey,matchedRouteRef);provide(routerViewLocationKey,routeToDisplay);const viewRef=ref();watch(()=>[viewRef.value,matchedRouteRef.value,props.name],([instance,to,name],[oldInstance,from,_oldName])=>{if(to){to.instances[name]=instance;if(from&&from!==to&&instance&&instance===oldInstance){if(!to.leaveGuards.size)to.leaveGuards=from.leaveGuards;if(!to.updateGuards.size)to.updateGuards=from.updateGuards}}if(instance&&to&&(!from||!isSameRouteRecord(to,from)||!oldInstance))(to.enterCallbacks[name]||[]).forEach(callback=>callback(instance))},{flush:`post`});return()=>{const route=routeToDisplay.value;const currentName=props.name;const matchedRoute=matchedRouteRef.value;const ViewComponent=matchedRoute&&matchedRoute.components[currentName];if(!ViewComponent)return normalizeSlot(slots.default,{Component:ViewComponent,route});const routePropsOption=matchedRoute.props[currentName];const routeProps=routePropsOption?routePropsOption===true?route.params:typeof routePropsOption===`function`?routePropsOption(route):routePropsOption:null;const onVnodeUnmounted=vnode=>{if(vnode.component.isUnmounted)matchedRoute.instances[currentName]=null};const component=h$1(ViewComponent,assign({},routeProps,attrs,{onVnodeUnmounted,ref:viewRef}));return normalizeSlot(slots.default,{Component:component,route})||component}}});function normalizeSlot(slot,data){if(!slot)return null;const slotContent=slot(data);return slotContent.length===1?slotContent[0]:slotContent}var RouterView=RouterViewImpl;function createRouter(options){const matcher=createRouterMatcher(options.routes,options);const parseQuery$1=options.parseQuery||parseQuery;const stringifyQuery$1=options.stringifyQuery||stringifyQuery;const routerHistory=options.history;const beforeGuards=useCallbacks();const beforeResolveGuards=useCallbacks();const afterGuards=useCallbacks();const currentRoute=shallowRef(START_LOCATION_NORMALIZED);const routesVersion=shallowRef(0);let pendingLocation=START_LOCATION_NORMALIZED;if(isBrowser&&options.scrollBehavior&&`scrollRestoration`in history)history.scrollRestoration=`manual`;const normalizeParams=applyToParams.bind(null,paramValue=>``+paramValue);const encodeParams=applyToParams.bind(null,encodeParam);const decodeParams=applyToParams.bind(null,decode$2);function addRoute(parentOrRoute,route){let parent;let record;if(isRouteName(parentOrRoute)){parent=matcher.getRecordMatcher(parentOrRoute);record=route}else record=parentOrRoute;const removeRoute=matcher.addRoute(record,parent);routesVersion.value++;return()=>{removeRoute();routesVersion.value++}}function removeRoute(name){const recordMatcher=matcher.getRecordMatcher(name);if(recordMatcher){matcher.removeRoute(recordMatcher);routesVersion.value++}}function clearRoutes(){matcher.clearRoutes();routesVersion.value++}function getRoutes(){return matcher.getRoutes().map(routeMatcher=>routeMatcher.record)}function hasRoute(name){return!!matcher.getRecordMatcher(name)}function resolve(rawLocation,currentLocation){routesVersion.value;if(typeof rawLocation===`string`){currentLocation=currentLocation||(rawLocation.startsWith(`/`)?START_LOCATION_NORMALIZED:currentRoute.value);const locationNormalized=parseURL(parseQuery$1,rawLocation,currentLocation.path);const matchedRoute=matcher.resolve({path:locationNormalized.path},currentLocation);const href=routerHistory.createHref(locationNormalized.fullPath);return assign(locationNormalized,matchedRoute,{params:decodeParams(matchedRoute.params),redirectedFrom:void 0,href})}currentLocation=assign({},currentLocation||(rawLocation.path!=null&&rawLocation.path.startsWith(`/`)&&!(`name`in rawLocation&&rawLocation.name)?START_LOCATION_NORMALIZED:currentRoute.value));let matcherLocation;if(rawLocation.path!=null)matcherLocation=assign({},rawLocation,{path:parseURL(parseQuery$1,rawLocation.path,currentLocation.path).path});else{const targetParams=assign({},rawLocation.params);for(const key in targetParams)if(targetParams[key]==null)delete targetParams[key];matcherLocation=assign({},rawLocation,{params:encodeParams(targetParams)});currentLocation.params=encodeParams(currentLocation.params)}const matchedRoute=matcher.resolve(matcherLocation,currentLocation);const hash=rawLocation.hash||``;matchedRoute.params=normalizeParams(decodeParams(matchedRoute.params));const fullPath=stringifyURL(stringifyQuery$1,assign({},rawLocation,{hash:encodeHash(hash),path:matchedRoute.path}));const href=routerHistory.createHref(fullPath);return assign({fullPath,hash,query:stringifyQuery$1===stringifyQuery?normalizeQuery(rawLocation.query):rawLocation.query||{}},matchedRoute,{redirectedFrom:void 0,href})}function locationAsObject(to){return typeof to===`string`?parseURL(parseQuery$1,to,currentRoute.value.path):assign({},to)}function checkCanceledNavigation(to,from){if(pendingLocation!==to)return createRouterError(8,{from,to})}function push(to){return pushWithRedirect(to)}function replace(to){return push(assign(locationAsObject(to),{replace:true}))}function handleRedirectRecord(to,from){const lastMatched=to.matched[to.matched.length-1];if(lastMatched&&lastMatched.redirect){const{redirect}=lastMatched;let newTargetLocation=typeof redirect===`function`?redirect(to,from):redirect;if(typeof newTargetLocation===`string`){newTargetLocation=newTargetLocation.includes(`?`)||newTargetLocation.includes(`#`)?newTargetLocation=locationAsObject(newTargetLocation):{path:newTargetLocation};newTargetLocation.params={}}return assign({query:to.query,hash:to.hash,params:newTargetLocation.path!=null?{}:to.params},newTargetLocation)}}function pushWithRedirect(to,redirectedFrom){const targetLocation=pendingLocation=resolve(to);const from=currentRoute.value;const data=to.state;const force=to.force;const replace=to.replace===true;const shouldRedirect=handleRedirectRecord(targetLocation,from);if(shouldRedirect)return pushWithRedirect(assign(locationAsObject(shouldRedirect),{state:typeof shouldRedirect===`object`?assign({},data,shouldRedirect.state):data,force,replace}),redirectedFrom||targetLocation);const toLocation=targetLocation;toLocation.redirectedFrom=redirectedFrom;let failure;if(!force&&isSameRouteLocation(stringifyQuery$1,from,targetLocation)){failure=createRouterError(16,{to:toLocation,from});handleScroll(from,from,true,false)}return(failure?Promise.resolve(failure):navigate(toLocation,from)).catch(error=>isNavigationFailure(error)?isNavigationFailure(error,2)?error:markAsReady(error):triggerError(error,toLocation,from)).then(failure=>{if(failure){if(isNavigationFailure(failure,2))return pushWithRedirect(assign({replace},locationAsObject(failure.to),{state:typeof failure.to===`object`?assign({},data,failure.to.state):data,force}),redirectedFrom||toLocation)}else failure=finalizeNavigation(toLocation,from,true,replace,data);triggerAfterEach(toLocation,from,failure);return failure})}function checkCanceledNavigationAndReject(to,from){const error=checkCanceledNavigation(to,from);return error?Promise.reject(error):Promise.resolve()}function runWithContext(fn){const app=installedApps.values().next().value;return app&&typeof app.runWithContext===`function`?app.runWithContext(fn):fn()}function navigate(to,from){let guards;const[leavingRecords,updatingRecords,enteringRecords]=extractChangingRecords(to,from);guards=extractComponentsGuards(leavingRecords.reverse(),`beforeRouteLeave`,to,from);for(const record of leavingRecords)record.leaveGuards.forEach(guard=>{guards.push(guardToPromiseFn(guard,to,from))});const canceledNavigationCheck=checkCanceledNavigationAndReject.bind(null,to,from);guards.push(canceledNavigationCheck);return runGuardQueue(guards).then(()=>{guards=[];for(const guard of beforeGuards.list())guards.push(guardToPromiseFn(guard,to,from));guards.push(canceledNavigationCheck);return runGuardQueue(guards)}).then(()=>{guards=extractComponentsGuards(updatingRecords,`beforeRouteUpdate`,to,from);for(const record of updatingRecords)record.updateGuards.forEach(guard=>{guards.push(guardToPromiseFn(guard,to,from))});guards.push(canceledNavigationCheck);return runGuardQueue(guards)}).then(()=>{guards=[];for(const record of enteringRecords)if(record.beforeEnter){if(isArray(record.beforeEnter))for(const beforeEnter of record.beforeEnter)guards.push(guardToPromiseFn(beforeEnter,to,from));else guards.push(guardToPromiseFn(record.beforeEnter,to,from))}guards.push(canceledNavigationCheck);return runGuardQueue(guards)}).then(()=>{to.matched.forEach(record=>record.enterCallbacks={});guards=extractComponentsGuards(enteringRecords,`beforeRouteEnter`,to,from,runWithContext);guards.push(canceledNavigationCheck);return runGuardQueue(guards)}).then(()=>{guards=[];for(const guard of beforeResolveGuards.list())guards.push(guardToPromiseFn(guard,to,from));guards.push(canceledNavigationCheck);return runGuardQueue(guards)}).catch(err=>isNavigationFailure(err,8)?err:Promise.reject(err))}function triggerAfterEach(to,from,failure){afterGuards.list().forEach(guard=>runWithContext(()=>guard(to,from,failure)))}function finalizeNavigation(toLocation,from,isPush,replace,data){const error=checkCanceledNavigation(toLocation,from);if(error)return error;const isFirstNavigation=from===START_LOCATION_NORMALIZED;const state=!isBrowser?{}:history.state;if(isPush){if(replace||isFirstNavigation)routerHistory.replace(toLocation.fullPath,assign({scroll:isFirstNavigation&&state&&state.scroll},data));else routerHistory.push(toLocation.fullPath,data)}currentRoute.value=toLocation;handleScroll(toLocation,from,isPush,isFirstNavigation);markAsReady()}let removeHistoryListener;function setupListeners(){if(removeHistoryListener)return;removeHistoryListener=routerHistory.listen((to,_from,info)=>{if(!router.listening)return;const toLocation=resolve(to);const shouldRedirect=handleRedirectRecord(toLocation,router.currentRoute.value);if(shouldRedirect){pushWithRedirect(assign(shouldRedirect,{replace:true,force:true}),toLocation).catch(noop$2);return}pendingLocation=toLocation;const from=currentRoute.value;if(isBrowser&&info.delta)saveScrollPosition(getScrollKey(from.fullPath,info.delta));navigate(toLocation,from).catch(error=>{if(isNavigationFailure(error,12))return error;if(isNavigationFailure(error,2)){pushWithRedirect(assign(locationAsObject(error.to),{force:true}),toLocation).then(failure=>{if(isNavigationFailure(failure,20)&&!info.delta&&info.type===`pop`)routerHistory.go(-1,false)}).catch(noop$2);return Promise.reject()}if(info.delta)routerHistory.go(-info.delta,false);return triggerError(error,toLocation,from)}).then(failure=>{failure=failure||finalizeNavigation(toLocation,from,false);if(failure){if(info.delta&&!isNavigationFailure(failure,8))routerHistory.go(-info.delta,false);else if(info.type===`pop`&&isNavigationFailure(failure,20))routerHistory.go(-1,false)}triggerAfterEach(toLocation,from,failure)}).catch(noop$2)})}let readyHandlers=useCallbacks();let errorListeners=useCallbacks();let ready;function triggerError(error,to,from){markAsReady(error);const list=errorListeners.list();if(list.length)list.forEach(handler=>handler(error,to,from));else console.error(error);return Promise.reject(error)}function isReady(){if(ready&¤tRoute.value!==START_LOCATION_NORMALIZED)return Promise.resolve();return new Promise((resolve,reject)=>{readyHandlers.add([resolve,reject])})}function markAsReady(err){if(!ready){ready=!err;setupListeners();readyHandlers.list().forEach(([resolve,reject])=>err?reject(err):resolve());readyHandlers.reset()}return err}function handleScroll(to,from,isPush,isFirstNavigation){const{scrollBehavior}=options;if(!isBrowser||!scrollBehavior)return Promise.resolve();const scrollPosition=!isPush&&getSavedScrollPosition(getScrollKey(to.fullPath,0))||(isFirstNavigation||!isPush)&&history.state&&history.state.scroll||null;return nextTick$1().then(()=>scrollBehavior(to,from,scrollPosition)).then(position=>to===currentRoute.value&&position&&scrollToPosition(position)).catch(err=>to===currentRoute.value&&triggerError(err,to,from))}const go=delta=>routerHistory.go(delta);let started;const installedApps=new Set;const router={currentRoute,listening:true,addRoute,removeRoute,clearRoutes,hasRoute,getRoutes,resolve,options,push,replace,go,back:()=>go(-1),forward:()=>go(1),beforeEach:beforeGuards.add,beforeResolve:beforeResolveGuards.add,afterEach:afterGuards.add,onError:errorListeners.add,isReady,install(app){app.component(`RouterLink`,RouterLink);app.component(`RouterView`,RouterView);app.config.globalProperties.$router=router;Object.defineProperty(app.config.globalProperties,"$route",{enumerable:true,get:()=>unref(currentRoute)});if(isBrowser&&!started&¤tRoute.value===START_LOCATION_NORMALIZED){started=true;push(routerHistory.location).catch(err=>{})}const reactiveRoute={};for(const key in START_LOCATION_NORMALIZED)Object.defineProperty(reactiveRoute,key,{get:()=>currentRoute.value[key],enumerable:true});app.provide(routerKey,router);app.provide(routeLocationKey,shallowReactive(reactiveRoute));app.provide(routerViewLocationKey,currentRoute);const unmountApp=app.unmount;installedApps.add(app);app.unmount=function(){installedApps.delete(app);if(installedApps.size<1){pendingLocation=START_LOCATION_NORMALIZED;removeHistoryListener&&removeHistoryListener();removeHistoryListener=null;currentRoute.value=START_LOCATION_NORMALIZED;started=false;ready=false}unmountApp()}}};function runGuardQueue(guards){return guards.reduce((promise,guard)=>promise.then(()=>runWithContext(guard)),Promise.resolve())}return router}function queryStringToObject(queryString=``){const normalizedQueryString=String(queryString||``).trim().replace(/^\?+/,``);if(!normalizedQueryString)return;const params=new URLSearchParams(normalizedQueryString);const query={};for(const[key,value]of params.entries()){if(!Object.prototype.hasOwnProperty.call(query,key)){query[key]=value;continue}if(Array.isArray(query[key])){query[key].push(value);continue}query[key]=[query[key],value]}return query}function redirectToChild(childTarget=``){const normalizedChildTarget=String(childTarget||``).trim();return function redirectToChildRoute(to={}){const resolvedTarget=resolveLinkPath(String(to?.path||`/`),normalizedChildTarget);const{pathname,queryString,hash}=splitPathQueryAndHash(resolvedTarget);return{path:pathname||`/`,query:queryStringToObject(queryString)??to?.query,hash:hash||String(to?.hash||``)}}}var dashboard_vue_definePage_vue_lang_default={redirect:redirectToChild(`env`)};function _mergeRouteRecord(main,...routeRecords){return routeRecords.reduce((acc,routeRecord)=>{const meta=Object.assign({},acc.meta,routeRecord.meta);const alias=[].concat(acc.alias||[],routeRecord.alias||[]);Object.assign(acc,routeRecord);acc.meta=meta;acc.alias=alias;return acc},main)}var routes=[{path:`/`,name:`/`,component:()=>__vitePreload(()=>import(`./pages-DuMgH61T.js`),__vite__mapDeps([0,1,2,3])),meta:{"jskit":{"scope":`global`}}},{path:`/app`,children:[{path:``,name:`/app/`,component:()=>__vitePreload(()=>import(`./app-Adr9Iz8p.js`),__vite__mapDeps([4,1,2,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,3,83])),meta:{"jskit":{"surface":`app`}}},{path:`learning`,name:`/app/learning`,component:()=>__vitePreload(()=>import(`./learning-CIE5ghYv.js`),__vite__mapDeps([84,1,85,7,6,8,66,40,39,41,42,43,44,2,73,45,22,23,24,21,25,26,27,28,14,15,29,30,17,18,46,31,47,48,74,16,5,9,49,50,53,54,32,33,86,34,35,36,37,10,11,87,88,12,89,90,68,51,52,91,92,69,67,70,63,64,65,71,75,76,78,79,93,94,95,96,97,98,99,100,101,57,58,38,55,56,59,60,61,62,72,13,19,77,80,81,102,103,20,82,3,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124])),meta:{"jskit":{"surface":`app`}}},{path:`project`,children:[{path:`:slug`,name:`/app/project/[slug]`,component:()=>__vitePreload(()=>import(`./_slug_-BbEWp01a.js`).then(n=>n.n),__vite__mapDeps([85,7,1,6,8,66,40,39,41,42,43,44,2,73,45,22,23,24,21,25,26,27,28,14,15,29,30,17,18,46,31,47,48,74,16,5,9,49,50,53,54,32,33,86,34,35,36,37,10,11,87,88,12,89,90,68,51,52,91,92,69,67,70,63,64,65,71,75,76,78,79,93,94,95,96,97,98,99,100,101,57,58,38,55,56,59,60,61,62,72,13,19,77,80,81,102,103,20,82,3,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124])),children:[_mergeRouteRecord({path:`dashboard`,name:`/app/project/[slug]/dashboard`,component:()=>__vitePreload(()=>import(`./dashboard-0tCzDYCX.js`),__vite__mapDeps([125,1,112,39,40,41,7,42,43,44,2,45,6,8,22,23,24,21,25,26,27,28,14,15,29,30,17,18,46,47,48,12,113,16,67,68,106,114,115])),children:[{path:`:sessionTool`,name:`/app/project/[slug]/dashboard/[sessionTool]`,component:()=>__vitePreload(()=>import(`./_sessionTool_-BG4aZtgz.js`),__vite__mapDeps([126,1,2,12,114,43,16,127]))},{path:`access`,children:[{path:``,name:`/app/project/[slug]/dashboard/access/`,component:()=>__vitePreload(()=>import(`./access-D4di2sCr.js`),__vite__mapDeps([128,1,39,40,41,7,42,43,44,45,6,8,22,23,24,21,25,26,27,28,14,15,29,30,17,18,46,5,9,49,50,12,65,66,48,67,68,69,2,70,71,80,47,96,109,16,10,11,110,118,94,93,129]))}]},{path:`changes`,children:[{path:``,name:`/app/project/[slug]/dashboard/changes/`,component:()=>__vitePreload(()=>import(`./changes-3Dd1O8Lu.js`),__vite__mapDeps([130,1,131,7,6,8,41,42,40,43,14,15,16,5,9,49,23,50,26,27,17,18,32,22,24,33,34,35,36,37,12,44,13,19,75,78,79,94,93,102,103,100,123,132,133,134]))}]},{path:`env`,children:[{path:``,name:`/app/project/[slug]/dashboard/env/`,component:()=>__vitePreload(()=>import(`./env-DsyQ2MFX.js`),__vite__mapDeps([135,1,6,7,8,39,40,41,42,43,44,2,14,15,29,22,23,24,30,16,5,9,49,50,53,54,32,33,34,35,36,37,57,58,12,65,66,48,67,68,69,70,71,80,47,96,109,10,11,110,118,94,93,132,133,136,137,138]))}]},{path:`health`,children:[{path:``,name:`/app/project/[slug]/dashboard/health/`,component:()=>__vitePreload(()=>import(`./health-DyTXU-nb.js`),__vite__mapDeps([139,1,6,7,8,39,40,41,42,43,44,16,5,9,49,23,50,38,2,45,22,24,21,25,26,27,28,14,15,29,30,17,18,46,31,47,48,51,52,53,54,32,33,34,35,55,56,36,37,57,58,59,60,10,11,61,62,12,63,64,65,66,67,68,69,70,71,72,73,74,13,19,75,76,77,78,79,80,81,132,133,140]))}]},{path:`history`,children:[{path:``,name:`/app/project/[slug]/dashboard/history/`,component:()=>__vitePreload(()=>import(`./history-BXGAdPMI.js`),__vite__mapDeps([141,1,6,7,8,14,15,16,5,9,49,23,50,17,18,34,35,10,11,12,98,121,57,58,71,66,40,39,41,42,43,44,76,96,2,122,132,133,142,91,69,68,48,67,70,94,93,117,119,63,120,143]))},{path:`:sessionId`,name:`/app/project/[slug]/dashboard/history/[sessionId]`,component:()=>__vitePreload(()=>import(`./_sessionId_-DCpgDPSI.js`),__vite__mapDeps([144,1,6,7,8,16,5,9,49,23,50,17,18,86,39,40,41,42,43,44,21,22,24,25,26,27,28,14,15,29,30,47,48,32,33,34,35,36,37,10,11,87,88,12,89,45,46,90,68,74,51,52,91,92,69,2,67,70,63,64,65,66,71,75,76,78,79,93,94,95,96,97,98,99,100,101,142,117,119,120,145]))}]},{path:`incoming`,children:[{path:``,name:`/app/project/[slug]/dashboard/incoming/`,component:()=>__vitePreload(()=>import(`./incoming-yajkdGBY.js`),__vite__mapDeps([146,1,39,40,41,7,42,43,44,2,45,6,8,22,23,24,21,25,26,27,28,14,15,29,30,17,18,46,47,48,16,5,9,49,50,32,33,34,35,36,37,10,11,12,71,66,79,102,103,147]))}]},{path:`integrations`,children:[{path:``,name:`/app/project/[slug]/dashboard/integrations/`,component:()=>__vitePreload(()=>import(`./integrations-BMrXET36.js`),__vite__mapDeps([148,7,1,6,8,39,40,41,42,43,44,2,45,22,23,24,21,25,26,27,28,14,15,29,30,17,18,46,31,16,5,9,49,50,53,54,32,33,34,35,55,56,57,58,10,11,87,88,12,65,66,48,67,68,69,70,71,75,96,93,94,109,110,120,136,137,149]))}]},{path:`issues`,children:[{path:``,name:`/app/project/[slug]/dashboard/issues/`,component:()=>__vitePreload(()=>import(`./issues-kc1XBZCK.js`),__vite__mapDeps([150,1,6,7,8,39,40,41,42,43,44,2,22,23,24,21,25,26,27,28,14,15,29,30,47,48,16,5,9,49,50,51,45,17,18,46,52,32,33,34,35,36,37,10,11,87,88,12,71,66,93,104,105,106,151,152]))}]},{path:`publish`,children:[{path:``,name:`/app/project/[slug]/dashboard/publish/`,component:()=>__vitePreload(()=>import(`./publish-DTh6amqi.js`),__vite__mapDeps([153,1,6,7,8,41,42,40,43,45,22,23,24,21,25,26,27,28,14,15,29,30,17,18,46,47,48,16,5,9,49,50,53,54,32,33,34,35,36,37,59,60,10,11,87,88,12,132,133,154]))}]},{path:`pull-requests`,children:[{path:``,name:`/app/project/[slug]/dashboard/pull-requests/`,component:()=>__vitePreload(()=>import(`./pull-requests-CbfGSSIh.js`),__vite__mapDeps([155,1,6,7,8,39,40,41,42,43,44,2,45,22,23,24,21,25,26,27,28,14,15,29,30,17,18,46,47,48,16,5,9,49,50,32,33,34,35,36,37,10,11,12,89,90,68,74,51,52,87,88,91,92,71,66,98,104,105,106,107,38,31,53,54,55,56,57,58,59,60,61,62,63,64,65,67,69,70,72,73,13,19,75,76,77,78,79,80,81,94,93,108,151,156]))}]},{path:`repository`,children:[{path:``,name:`/app/project/[slug]/dashboard/repository/`,component:()=>__vitePreload(()=>import(`./repository-BstMh-bG.js`),__vite__mapDeps([157,1,131,7,6,8,41,42,40,43,14,15,16,5,9,49,23,50,26,27,17,18,32,22,24,33,34,35,36,37,12,44,13,19,75,78,79,94,93,102,103,100,123,132,133,134]))}]},{path:`session`,children:[{path:``,name:`/app/project/[slug]/dashboard/session/`,component:()=>__vitePreload(()=>import(`./session-Ba1UbZT7.js`),__vite__mapDeps([158,1,6,7,8,14,15,16,5,9,17,18,12,111,98,132,133,159]))}]},{path:`settings`,children:[{path:``,name:`/app/project/[slug]/dashboard/settings/`,component:()=>__vitePreload(()=>import(`./settings-Bf8C6dls.js`),__vite__mapDeps([160,1,39,40,41,7,42,43,44,2,45,6,8,22,23,24,21,25,26,27,28,14,15,29,30,17,18,46,47,48,5,9,49,50,53,54,59,60,61,62,87,88,12,65,66,67,68,69,70,71,80,96,94,93,109,16,10,11,110,116,98,99,78,117,118,161]))}]}]},dashboard_vue_definePage_vue_lang_default)],meta:{"jskit":{"surface":`app`}}}]}]}];var aliases$1={collapse:`mdi-chevron-up`,complete:`mdi-check`,cancel:`mdi-close-circle`,close:`mdi-close`,delete:`mdi-close-circle`,clear:`mdi-close-circle`,success:`mdi-check-circle`,info:`mdi-information`,warning:`mdi-alert-circle`,error:`mdi-close-circle`,prev:`mdi-chevron-left`,next:`mdi-chevron-right`,checkboxOn:`mdi-checkbox-marked`,checkboxOff:`mdi-checkbox-blank-outline`,checkboxIndeterminate:`mdi-minus-box`,delimiter:`mdi-circle`,sortAsc:`mdi-arrow-up`,sortDesc:`mdi-arrow-down`,expand:`mdi-chevron-down`,menu:`mdi-menu`,subgroup:`mdi-menu-down`,dropdown:`mdi-menu-down`,radioOn:`mdi-radiobox-marked`,radioOff:`mdi-radiobox-blank`,edit:`mdi-pencil`,ratingEmpty:`mdi-star-outline`,ratingFull:`mdi-star`,ratingHalf:`mdi-star-half-full`,loading:`mdi-cached`,first:`mdi-page-first`,last:`mdi-page-last`,unfold:`mdi-unfold-more-horizontal`,file:`mdi-paperclip`,plus:`mdi-plus`,minus:`mdi-minus`,calendar:`mdi-calendar`,treeviewCollapse:`mdi-menu-down`,treeviewExpand:`mdi-menu-right`,tableGroupCollapse:`mdi-chevron-down`,tableGroupExpand:`mdi-chevron-right`,eyeDropper:`mdi-eyedropper`,upload:`mdi-cloud-upload`,color:`mdi-palette`,command:`mdi-apple-keyboard-command`,ctrl:`mdi-apple-keyboard-control`,space:`mdi-keyboard-space`,shift:`mdi-apple-keyboard-shift`,alt:`mdi-apple-keyboard-option`,enter:`mdi-keyboard-return`,arrowup:`mdi-arrow-up`,arrowdown:`mdi-arrow-down`,arrowleft:`mdi-arrow-left`,arrowright:`mdi-arrow-right`,backspace:`mdi-backspace`,play:`mdi-play`,pause:`mdi-pause`,fullscreen:`mdi-fullscreen`,fullscreenExit:`mdi-fullscreen-exit`,volumeHigh:`mdi-volume-high`,volumeMedium:`mdi-volume-medium`,volumeLow:`mdi-volume-low`,volumeOff:`mdi-volume-variant-off`,search:`mdi-magnify`};var mdi$1={component:props=>h$1(VClassIcon,{...props,class:`mdi`})};function genDefaults(){return{svg:{component:VSvgIcon},class:{component:VClassIcon}}}function createIcons(options){const sets=genDefaults();const defaultSet=options?.defaultSet??`mdi`;if(defaultSet===`mdi`&&!sets.mdi)sets.mdi=mdi$1;return mergeDeep({defaultSet,sets,aliases:{...aliases$1,vuetify:[`M8.2241 14.2009L12 21L22 3H14.4459L8.2241 14.2009Z`,[`M7.26303 12.4733L7.00113 12L2 3H12.5261C12.5261 3 12.5261 3 12.5261 3L7.26303 12.4733Z`,.6]],"vuetify-outline":`svg:M7.26 12.47 12.53 3H2L7.26 12.47ZM14.45 3 8.22 14.2 12 21 22 3H14.45ZM18.6 5 12 16.88 10.51 14.2 15.62 5ZM7.26 8.35 5.4 5H9.13L7.26 8.35Z`,"vuetify-play":[`m6.376 13.184-4.11-7.192C1.505 4.66 2.467 3 4.003 3h8.532l-.953 1.576-.006.01-.396.677c-.429.732-.214 1.507.194 2.015.404.503 1.092.878 1.869.806a3.72 3.72 0 0 1 1.005.022c.276.053.434.143.523.237.138.146.38.635-.25 2.09-.893 1.63-1.553 1.722-1.847 1.677-.213-.033-.468-.158-.756-.406a4.95 4.95 0 0 1-.8-.927c-.39-.564-1.04-.84-1.66-.846-.625-.006-1.316.27-1.693.921l-.478.826-.911 1.506Z`,[`M9.093 11.552c.046-.079.144-.15.32-.148a.53.53 0 0 1 .43.207c.285.414.636.847 1.046 1.2.405.35.914.662 1.516.754 1.334.205 2.502-.698 3.48-2.495l.014-.028.013-.03c.687-1.574.774-2.852-.005-3.675-.37-.391-.861-.586-1.333-.676a5.243 5.243 0 0 0-1.447-.044c-.173.016-.393-.073-.54-.257-.145-.18-.127-.316-.082-.392l.393-.672L14.287 3h5.71c1.536 0 2.499 1.659 1.737 2.992l-7.997 13.996c-.768 1.344-2.706 1.344-3.473 0l-3.037-5.314 1.377-2.278.004-.006.004-.007.481-.831Z`,.6]]}},options)}function weekInfo(locale){const code=locale.slice(-2).toUpperCase();switch(true){case locale===`GB-alt-variant`:return{firstDay:0,firstWeekSize:4};case locale===`001`:return{firstDay:1,firstWeekSize:1};case`AG AS BD BR BS BT BW BZ CA CO DM DO ET GT GU HK HN ID IL IN JM JP KE
|
|
3
|
+
KH KR LA MH MM MO MT MX MZ NI NP PA PE PH PK PR PY SA SG SV TH TT TW UM US
|
|
4
|
+
VE VI WS YE ZA ZW`.includes(code):return{firstDay:0,firstWeekSize:1};case`AI AL AM AR AU AZ BA BM BN BY CL CM CN CR CY EC GE HR KG KZ LB LK LV
|
|
5
|
+
MD ME MK MN MY NZ RO RS SI TJ TM TR UA UY UZ VN XK`.includes(code):return{firstDay:1,firstWeekSize:1};case`AD AN AT AX BE BG CH CZ DE DK EE ES FI FJ FO FR GB GF GP GR HU IE IS
|
|
6
|
+
IT LI LT LU MC MQ NL NO PL RE RU SE SK SM VA`.includes(code):return{firstDay:1,firstWeekSize:4};case`AE AF BH DJ DZ EG IQ IR JO KW LY OM QA SD SY`.includes(code):return{firstDay:6,firstWeekSize:1};case code===`MV`:return{firstDay:5,firstWeekSize:1};case code===`PT`:return{firstDay:0,firstWeekSize:4};default:return null}}function getWeekArray(date,locale,firstDayOfWeek){const weeks=[];let currentWeek=[];const firstDayOfMonth=startOfMonth(date);const lastDayOfMonth=endOfMonth(date);const first=firstDayOfWeek??weekInfo(locale)?.firstDay??0;const firstDayWeekIndex=(firstDayOfMonth.getDay()-first+7)%7;const lastDayWeekIndex=(lastDayOfMonth.getDay()-first+7)%7;for(let i=0;i<firstDayWeekIndex;i++){const adjacentDay=new Date(firstDayOfMonth);adjacentDay.setDate(adjacentDay.getDate()-(firstDayWeekIndex-i));currentWeek.push(adjacentDay)}for(let i=1;i<=lastDayOfMonth.getDate();i++){const day=new Date(date.getFullYear(),date.getMonth(),i);currentWeek.push(day);if(currentWeek.length===7){weeks.push(currentWeek);currentWeek=[]}}for(let i=1;i<7-lastDayWeekIndex;i++){const adjacentDay=new Date(lastDayOfMonth);adjacentDay.setDate(adjacentDay.getDate()+i);currentWeek.push(adjacentDay)}if(currentWeek.length>0)weeks.push(currentWeek);return weeks}function startOfWeek(date,locale,firstDayOfWeek){let day=(firstDayOfWeek??weekInfo(locale)?.firstDay??0)%7;if(![0,1,2,3,4,5,6].includes(day)){consoleWarn(`Invalid firstDayOfWeek, expected discrete number in range [0-6]`);day=0}const d=new Date(date);while(d.getDay()!==day)d.setDate(d.getDate()-1);return d}function endOfWeek(date,locale){const d=new Date(date);const lastDay=((weekInfo(locale)?.firstDay??0)+6)%7;while(d.getDay()!==lastDay)d.setDate(d.getDate()+1);return d}function startOfMonth(date){return new Date(date.getFullYear(),date.getMonth(),1)}function endOfMonth(date){return new Date(date.getFullYear(),date.getMonth()+1,0)}function parseLocalDate(value){const parts=value.split(`-`).map(Number);return new Date(parts[0],parts[1]-1,parts[2])}var _YYYMMDD=/^([12]\d{3}-([1-9]|0[1-9]|1[0-2])-([1-9]|0[1-9]|[12]\d|3[01]))$/;function date(value){if(value==null)return new Date;if(value instanceof Date)return value;if(typeof value===`string`){let parsed;if(_YYYMMDD.test(value))return parseLocalDate(value);else parsed=Date.parse(value);if(!isNaN(parsed))return new Date(parsed)}return null}var sundayJanuarySecond2000=new Date(2e3,0,2);function getWeekdays(locale,firstDayOfWeek,weekdayFormat){const daysFromSunday=firstDayOfWeek??weekInfo(locale)?.firstDay??0;return range(7).map(i=>{const weekday=new Date(sundayJanuarySecond2000);weekday.setDate(sundayJanuarySecond2000.getDate()+daysFromSunday+i);return new Intl.DateTimeFormat(locale,{weekday:weekdayFormat??`narrow`}).format(weekday)})}function format(value,formatString,locale,formats){const newDate=date(value)??new Date;const customFormat=formats?.[formatString];if(typeof customFormat===`function`)return customFormat(newDate,formatString,locale);let options={};switch(formatString){case`fullDate`:options={year:`numeric`,month:`short`,day:`numeric`};break;case`fullDateWithWeekday`:options={weekday:`long`,year:`numeric`,month:`long`,day:`numeric`};break;case`normalDate`:return`${newDate.getDate()} ${new Intl.DateTimeFormat(locale,{month:`long`}).format(newDate)}`;case`normalDateWithWeekday`:options={weekday:`short`,day:`numeric`,month:`short`};break;case`shortDate`:options={month:`short`,day:`numeric`};break;case`year`:options={year:`numeric`};break;case`month`:options={month:`long`};break;case`monthShort`:options={month:`short`};break;case`monthAndYear`:options={month:`long`,year:`numeric`};break;case`monthAndDate`:options={month:`long`,day:`numeric`};break;case`weekday`:options={weekday:`long`};break;case`weekdayShort`:options={weekday:`short`};break;case`dayOfMonth`:return new Intl.NumberFormat(locale).format(newDate.getDate());case`hours12h`:options={hour:`numeric`,hour12:true};break;case`hours24h`:options={hour:`numeric`,hour12:false};break;case`minutes`:options={minute:`numeric`};break;case`seconds`:options={second:`numeric`};break;case`fullTime`:options={hour:`numeric`,minute:`numeric`};break;case`fullTime12h`:options={hour:`numeric`,minute:`numeric`,hour12:true};break;case`fullTime24h`:options={hour:`numeric`,minute:`numeric`,hour12:false};break;case`fullDateTime`:options={year:`numeric`,month:`short`,day:`numeric`,hour:`numeric`,minute:`numeric`};break;case`fullDateTime12h`:options={year:`numeric`,month:`short`,day:`numeric`,hour:`numeric`,minute:`numeric`,hour12:true};break;case`fullDateTime24h`:options={year:`numeric`,month:`short`,day:`numeric`,hour:`numeric`,minute:`numeric`,hour12:false};break;case`keyboardDate`:options={year:`numeric`,month:`2-digit`,day:`2-digit`};break;case`keyboardDateTime`:options={year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`numeric`,minute:`numeric`};return new Intl.DateTimeFormat(locale,options).format(newDate).replace(/, /g,` `);case`keyboardDateTime12h`:options={year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`numeric`,minute:`numeric`,hour12:true};return new Intl.DateTimeFormat(locale,options).format(newDate).replace(/, /g,` `);case`keyboardDateTime24h`:options={year:`numeric`,month:`2-digit`,day:`2-digit`,hour:`numeric`,minute:`numeric`,hour12:false};return new Intl.DateTimeFormat(locale,options).format(newDate).replace(/, /g,` `);default:options=customFormat??{timeZone:`UTC`,timeZoneName:`short`}}return new Intl.DateTimeFormat(locale,options).format(newDate)}function toISO(adapter,value){const date=adapter.toJsDate(value);return`${date.getFullYear()}-${padStart(String(date.getMonth()+1),2,`0`)}-${padStart(String(date.getDate()),2,`0`)}`}function parseISO(value){const[year,month,day]=value.split(`-`).map(Number);return new Date(year,month-1,day)}function addMinutes(date,amount){const d=new Date(date);d.setMinutes(d.getMinutes()+amount);return d}function addHours(date,amount){const d=new Date(date);d.setHours(d.getHours()+amount);return d}function addDays(date,amount){const d=new Date(date);d.setDate(d.getDate()+amount);return d}function addWeeks(date,amount){const d=new Date(date);d.setDate(d.getDate()+amount*7);return d}function addMonths(date,amount){const d=new Date(date);d.setDate(1);d.setMonth(d.getMonth()+amount);return d}function getYear(date){return date.getFullYear()}function getMonth(date){return date.getMonth()}function getWeek(date,locale,firstDayOfWeek,firstDayOfYear){const weekInfoFromLocale=weekInfo(locale);const weekStart=firstDayOfWeek??weekInfoFromLocale?.firstDay??0;const minWeekSize=weekInfoFromLocale?.firstWeekSize??1;return firstDayOfYear!==void 0?calculateWeekWithFirstDayOfYear(date,locale,weekStart,firstDayOfYear):calculateWeekWithMinWeekSize(date,locale,weekStart,minWeekSize)}function calculateWeekWithFirstDayOfYear(date,locale,weekStart,firstDayOfYear){const firstDayOfYearOffset=(7+firstDayOfYear-weekStart)%7;const currentWeekStart=startOfWeek(date,locale,weekStart);const currentWeekEnd=addDays(currentWeekStart,6);function yearStartWeekdayOffset(year){return(7+new Date(year,0,1).getDay()-weekStart)%7}let year=getYear(currentWeekStart);if(year<getYear(currentWeekEnd)&&yearStartWeekdayOffset(year+1)<=firstDayOfYearOffset)year++;const yearStart=new Date(year,0,1);const offset=yearStartWeekdayOffset(year);const d1w1=offset<=firstDayOfYearOffset?addDays(yearStart,-offset):addDays(yearStart,7-offset);return 1+getDiff(endOfDay(currentWeekStart),startOfDay(d1w1),`weeks`)}function calculateWeekWithMinWeekSize(date,locale,weekStart,minWeekSize){const currentWeekStart=startOfWeek(date,locale,weekStart);const currentWeekEnd=addDays(startOfWeek(date,locale,weekStart),6);function firstWeekSize(year){const yearStart=new Date(year,0,1);return 7-getDiff(yearStart,startOfWeek(yearStart,locale,weekStart),`days`)}let year=getYear(currentWeekStart);if(year<getYear(currentWeekEnd)&&firstWeekSize(year+1)>=minWeekSize)year++;const yearStart=new Date(year,0,1);const size=firstWeekSize(year);const d1w1=size>=minWeekSize?addDays(yearStart,size-7):addDays(yearStart,size);return 1+getDiff(endOfDay(currentWeekStart),startOfDay(d1w1),`weeks`)}function getDate(date){return date.getDate()}function getNextMonth(date){return new Date(date.getFullYear(),date.getMonth()+1,1)}function getPreviousMonth(date){return new Date(date.getFullYear(),date.getMonth()-1,1)}function getHours(date){return date.getHours()}function getMinutes(date){return date.getMinutes()}function startOfYear(date){return new Date(date.getFullYear(),0,1)}function endOfYear(date){return new Date(date.getFullYear(),11,31)}function isWithinRange(date,range){return isEqual(date,range[0])||isEqual(date,range[1])||isAfter(date,range[0])&&isBefore(date,range[1])}function isValid(date){const d=new Date(date);return d instanceof Date&&!isNaN(d.getTime())}function isAfter(date,comparing){return date.getTime()>comparing.getTime()}function isAfterDay(date,comparing){return isAfter(startOfDay(date),startOfDay(comparing))}function isBefore(date,comparing){return date.getTime()<comparing.getTime()}function isEqual(date,comparing){return date.getTime()===comparing.getTime()}function isSameDay(date,comparing){return date.getDate()===comparing.getDate()&&date.getMonth()===comparing.getMonth()&&date.getFullYear()===comparing.getFullYear()}function isSameMonth(date,comparing){return date.getMonth()===comparing.getMonth()&&date.getFullYear()===comparing.getFullYear()}function isSameYear(date,comparing){return date.getFullYear()===comparing.getFullYear()}function getDiff(date,comparing,unit){const d=new Date(date);const c=new Date(comparing);switch(unit){case`years`:return d.getFullYear()-c.getFullYear();case`quarters`:return Math.floor((d.getMonth()-c.getMonth()+(d.getFullYear()-c.getFullYear())*12)/4);case`months`:return d.getMonth()-c.getMonth()+(d.getFullYear()-c.getFullYear())*12;case`weeks`:return Math.floor((d.getTime()-c.getTime())/6048e5);case`days`:return Math.floor((d.getTime()-c.getTime())/864e5);case`hours`:return Math.floor((d.getTime()-c.getTime())/36e5);case`minutes`:return Math.floor((d.getTime()-c.getTime())/6e4);case`seconds`:return Math.floor((d.getTime()-c.getTime())/1e3);default:return d.getTime()-c.getTime()}}function setHours(date,count){const d=new Date(date);d.setHours(count);return d}function setMinutes(date,count){const d=new Date(date);d.setMinutes(count);return d}function setMonth(date,count){const d=new Date(date);d.setMonth(count);return d}function setDate(date,day){const d=new Date(date);d.setDate(day);return d}function setYear(date,year){const d=new Date(date);d.setFullYear(year);return d}function startOfDay(date){return new Date(date.getFullYear(),date.getMonth(),date.getDate(),0,0,0,0)}function endOfDay(date){return new Date(date.getFullYear(),date.getMonth(),date.getDate(),23,59,59,999)}var VuetifyDateAdapter=class{constructor(options){this.locale=options.locale;this.formats=options.formats}date(value){return date(value)}toJsDate(date){return date}toISO(date){return toISO(this,date)}parseISO(date){return parseISO(date)}addMinutes(date,amount){return addMinutes(date,amount)}addHours(date,amount){return addHours(date,amount)}addDays(date,amount){return addDays(date,amount)}addWeeks(date,amount){return addWeeks(date,amount)}addMonths(date,amount){return addMonths(date,amount)}getWeekArray(date,firstDayOfWeek){const firstDay=firstDayOfWeek!==void 0?Number(firstDayOfWeek):void 0;return getWeekArray(date,this.locale,firstDay)}startOfWeek(date,firstDayOfWeek){const firstDay=firstDayOfWeek!==void 0?Number(firstDayOfWeek):void 0;return startOfWeek(date,this.locale,firstDay)}endOfWeek(date){return endOfWeek(date,this.locale)}startOfMonth(date){return startOfMonth(date)}endOfMonth(date){return endOfMonth(date)}format(date,formatString){return format(date,formatString,this.locale,this.formats)}isEqual(date,comparing){return isEqual(date,comparing)}isValid(date){return isValid(date)}isWithinRange(date,range){return isWithinRange(date,range)}isAfter(date,comparing){return isAfter(date,comparing)}isAfterDay(date,comparing){return isAfterDay(date,comparing)}isBefore(date,comparing){return!isAfter(date,comparing)&&!isEqual(date,comparing)}isSameDay(date,comparing){return isSameDay(date,comparing)}isSameMonth(date,comparing){return isSameMonth(date,comparing)}isSameYear(date,comparing){return isSameYear(date,comparing)}setMinutes(date,count){return setMinutes(date,count)}setHours(date,count){return setHours(date,count)}setMonth(date,count){return setMonth(date,count)}setDate(date,day){return setDate(date,day)}setYear(date,year){return setYear(date,year)}getDiff(date,comparing,unit){return getDiff(date,comparing,unit)}getWeekdays(firstDayOfWeek,weekdayFormat){const firstDay=firstDayOfWeek!==void 0?Number(firstDayOfWeek):void 0;return getWeekdays(this.locale,firstDay,weekdayFormat)}getYear(date){return getYear(date)}getMonth(date){return getMonth(date)}getWeek(date,firstDayOfWeek,firstDayOfYear){const firstDay=firstDayOfWeek!==void 0?Number(firstDayOfWeek):void 0;const firstWeekStart=firstDayOfYear!==void 0?Number(firstDayOfYear):void 0;return getWeek(date,this.locale,firstDay,firstWeekStart)}getDate(date){return getDate(date)}getNextMonth(date){return getNextMonth(date)}getPreviousMonth(date){return getPreviousMonth(date)}getHours(date){return getHours(date)}getMinutes(date){return getMinutes(date)}startOfDay(date){return startOfDay(date)}endOfDay(date){return endOfDay(date)}startOfYear(date){return startOfYear(date)}endOfYear(date){return endOfYear(date)}};var DateOptionsSymbol=Symbol.for(`vuetify:date-options`);var DateAdapterSymbol=Symbol.for(`vuetify:date-adapter`);function createDate(options,locale){const _options=mergeDeep({adapter:VuetifyDateAdapter,locale:{af:`af-ZA`,bg:`bg-BG`,ca:`ca-ES`,ckb:``,cs:`cs-CZ`,de:`de-DE`,el:`el-GR`,en:`en-US`,et:`et-EE`,fa:`fa-IR`,fi:`fi-FI`,hr:`hr-HR`,hu:`hu-HU`,he:`he-IL`,id:`id-ID`,it:`it-IT`,ja:`ja-JP`,ko:`ko-KR`,lv:`lv-LV`,lt:`lt-LT`,nl:`nl-NL`,no:`no-NO`,pl:`pl-PL`,pt:`pt-PT`,ro:`ro-RO`,ru:`ru-RU`,sk:`sk-SK`,sl:`sl-SI`,srCyrl:`sr-SP`,srLatn:`sr-SP`,sv:`sv-SE`,th:`th-TH`,tr:`tr-TR`,az:`az-AZ`,uk:`uk-UA`,vi:`vi-VN`,zhHans:`zh-CN`,zhHant:`zh-TW`}},options);return{options:_options,instance:createInstance(_options,locale)}}function daysDiff(adapter,start,stop){const iso=[`${adapter.toISO(stop??start).split(`T`)[0]}T00:00:00Z`,`${adapter.toISO(start).split(`T`)[0]}T00:00:00Z`];return isString(adapter.date())?adapter.getDiff(iso[0],iso[1],`days`):adapter.getDiff(adapter.date(iso[0]),adapter.date(iso[1]),`days`)}function createInstance(options,locale){const instance=reactive(isFunction(options.adapter)?new options.adapter({locale:options.locale[locale.current.value]??locale.current.value,formats:options.formats}):options.adapter);watch(locale.current,value=>{instance.locale=options.locale[value]??value??instance.locale});return instance}function useDate(){const options=inject$1(DateOptionsSymbol);if(!options)throw new Error(`[Vuetify] Could not find injected date options`);return createInstance(options,useLocale())}function createVuetify(vuetify={}){const{blueprint,...rest}=vuetify;const options=mergeDeep(blueprint,rest);const{aliases={},components={},directives={}}=options;const scope=effectScope();return scope.run(()=>{const defaults=createDefaults(options.defaults);const display=createDisplay(options.display,options.ssr);const theme=createTheme(options.theme);const icons=createIcons(options.icons);const locale=createLocale(options.locale);const date=createDate(options.date,locale);const goTo=createGoTo(options.goTo,locale);function install(app){for(const key in directives)app.directive(key,directives[key]);for(const key in components)app.component(key,components[key]);for(const key in aliases)app.component(key,defineComponent$1({...aliases[key],name:key,aliasName:aliases[key].name}));const appScope=effectScope();appScope.run(()=>{theme.install(app)});app.onUnmount(()=>appScope.stop());app.provide(DefaultsSymbol,defaults);app.provide(RootDefaultsSymbol,defaults);app.provide(DisplaySymbol,display);app.provide(ThemeSymbol,theme);app.provide(IconSymbol,icons);app.provide(LocaleSymbol,locale);app.provide(DateOptionsSymbol,date.options);app.provide(DateAdapterSymbol,date.instance);app.provide(GoToSymbol,goTo);if(IN_BROWSER&&options.ssr){if(app.$nuxt)app.$nuxt.hook(`app:suspense:resolve`,()=>{display.update()});else{const{mount}=app;app.mount=(...args)=>{const vm=mount(...args);nextTick$1(()=>display.update());app.mount=mount;return vm}}}app.mixin({computed:{$vuetify(){return reactive({defaults:inject.call(this,DefaultsSymbol),display:inject.call(this,DisplaySymbol),theme:inject.call(this,ThemeSymbol),icons:inject.call(this,IconSymbol),locale:inject.call(this,LocaleSymbol),date:inject.call(this,DateAdapterSymbol)})}}})}function unmount(){scope.stop()}return{install,unmount,defaults,display,theme,icons,locale,date,goTo}})}var version=`4.2.1`;createVuetify.version=version;function inject(key){const vm=this.$;const provides=vm.parent?.provides??vm.vnode.appContext?.provides;if(provides&&key in provides)return provides[key]}var aliases={collapse:`svg:M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z`,complete:`svg:M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z`,cancel:`svg:M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z`,close:`svg:M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z`,delete:`svg:M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z`,clear:`svg:M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z`,success:`svg:M12,2C17.52,2 22,6.48 22,12C22,17.52 17.52,22 12,22C6.48,22 2,17.52 2,12C2,6.48 6.48,2 12,2M11,16.5L18,9.5L16.59,8.09L11,13.67L7.91,10.59L6.5,12L11,16.5Z`,info:`svg:M13,9H11V7H13M13,17H11V11H13M12,2C6.48,2 2,6.48 2,12C2,17.52 6.48,22 12,22C17.52,22 22,17.52 22,12C22,6.48 17.52,2 12,2Z`,warning:`svg:M13,13H11V7H13M13,17H11V15H13M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2Z`,error:`svg:M12,2C17.53,2 22,6.47 22,12C22,17.53 17.53,22 12,22C6.47,22 2,17.53 2,12C2,6.47 6.47,2 12,2M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z`,prev:`svg:M15.41,16.58L10.83,12L15.41,7.41L14,6L8,12L14,18L15.41,16.58Z`,next:`svg:M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z`,checkboxOn:`svg:M10,17L5,12L6.41,10.58L10,14.17L17.59,6.58L19,8M19,3H5C3.89,3 3,3.89 3,5V19C3,20.1 3.9,21 5,21H19C20.1,21 21,20.1 21,19V5C21,3.89 20.1,3 19,3Z`,checkboxOff:`svg:M19,3H5C3.89,3 3,3.89 3,5V19C3,20.1 3.9,21 5,21H19C20.1,21 21,20.1 21,19V5C21,3.89 20.1,3 19,3M19,5V19H5V5H19Z`,checkboxIndeterminate:`svg:M17,13H7V11H17M19,3H5C3.89,3 3,3.89 3,5V19C3,20.1 3.9,21 5,21H19C20.1,21 21,20.1 21,19V5C21,3.89 20.1,3 19,3Z`,delimiter:`svg:M12,2C6.48,2 2,6.48 2,12C2,17.52 6.48,22 12,22C17.52,22 22,17.52 22,12C22,6.48 17.52,2 12,2Z`,sortAsc:`svg:M13,20H11V8L5.5,13.5L4.08,12.08L12,4.16L19.92,12.08L18.5,13.5L13,8V20Z`,sortDesc:`svg:M11,4H13V16L18.5,10.5L19.92,11.92L12,19.84L4.08,11.92L5.5,10.5L11,16V4Z`,expand:`svg:M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z`,menu:`svg:M3,6H21V8H3V6M3,11H21V13H3V11M3,16H21V18H3V16Z`,subgroup:`svg:M7,10L12,15L17,10H7Z`,dropdown:`svg:M7,10L12,15L17,10H7Z`,radioOn:`svg:M12,20C7.58,20 4,16.42 4,12C4,7.58 7.58,4 12,4C16.42,4 20,7.58 20,12C20,16.42 16.42,20 12,20M12,2C6.48,2 2,6.48 2,12C2,17.52 6.48,22 12,22C17.52,22 22,17.52 22,12C22,6.48 17.52,2 12,2M12,7C9.24,7 7,9.24 7,12C7,14.76 9.24,17 12,17C14.76,17 17,14.76 17,12C17,9.24 14.76,7 12,7Z`,radioOff:`svg:M12,20C7.58,20 4,16.42 4,12C4,7.58 7.58,4 12,4C16.42,4 20,7.58 20,12C20,16.42 16.42,20 12,20M12,2C6.48,2 2,6.48 2,12C2,17.52 6.48,22 12,22C17.52,22 22,17.52 22,12C22,6.48 17.52,2 12,2Z`,edit:`svg:M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z`,ratingEmpty:`svg:M12,15.39L8.24,17.66L9.23,13.38L5.91,10.5L10.29,10.13L12,6.09L13.71,10.13L18.09,10.5L14.77,13.38L15.76,17.66M22,9.24L14.81,8.63L12,2L9.19,8.63L2,9.24L7.45,13.97L5.82,21L12,17.27L18.18,21L16.54,13.97L22,9.24Z`,ratingFull:`svg:M12,17.27L18.18,21L16.54,13.97L22,9.24L14.81,8.62L12,2L9.19,8.62L2,9.24L7.45,13.97L5.82,21L12,17.27Z`,ratingHalf:`svg:M12,15.4V6.1L13.71,10.13L18.09,10.5L14.77,13.39L15.76,17.67M22,9.24L14.81,8.63L12,2L9.19,8.63L2,9.24L7.45,13.97L5.82,21L12,17.27L18.18,21L16.54,13.97L22,9.24Z`,loading:`svg:M19,8L15,12H18C18,15.31 15.31,18 12,18C11,18 10.03,17.75 9.2,17.3L7.74,18.76C8.97,19.54 10.43,20 12,20C16.42,20 20,16.42 20,12H23M6,12C6,8.69 8.69,6 12,6C13,6 13.97,6.25 14.8,6.7L16.26,5.24C15.03,4.46 13.57,4 12,4C7.58,4 4,7.58 4,12H1L5,16L9,12`,first:`svg:M18.41,16.59L13.82,12L18.41,7.41L17,6L11,12L17,18L18.41,16.59M6,6H8V18H6V6Z`,last:`svg:M5.59,7.41L10.18,12L5.59,16.59L7,18L13,12L7,6L5.59,7.41M16,6H18V18H16V6Z`,unfold:`svg:M12,18.17L8.83,15L7.42,16.41L12,21L16.59,16.41L15.17,15M12,5.83L15.17,9L16.58,7.59L12,3L7.41,7.59L8.83,9L12,5.83Z`,file:`svg:M16.5,6V17.5C16.5,19.71 14.71,21.5 12.5,21.5C10.29,21.5 8.5,19.71 8.5,17.5V5C8.5,3.62 9.62,2.5 11,2.5C12.38,2.5 13.5,3.62 13.5,5V15.5C13.5,16.05 13.05,16.5 12.5,16.5C11.95,16.5 11.5,16.05 11.5,15.5V6H10V15.5C10,16.88 11.12,18 12.5,18C13.88,18 15,16.88 15,15.5V5C15,2.79 13.21,1 11,1C8.79,1 7,2.79 7,5V17.5C7,20.54 9.46,23 12.5,23C15.54,23 18,20.54 18,17.5V6H16.5Z`,plus:`svg:M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z`,minus:`svg:M19,13H5V11H19V13Z`,calendar:`svg:M19,19H5V8H19M16,1V3H8V1H6V3H5C3.89,3 3,3.89 3,5V19A2,2 0 0,0 5,21H19A2,2 0 0,0 21,19V5C21,3.89 20.1,3 19,3H18V1M17,12H12V17H17V12Z`,treeviewCollapse:`svg:M7,10L12,15L17,10H7Z`,treeviewExpand:`svg:M10,17L15,12L10,7V17Z`,tableGroupExpand:`svg:M8.59,16.58L13.17,12L8.59,7.41L10,6L16,12L10,18L8.59,16.58Z`,tableGroupCollapse:`svg:M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z`,eyeDropper:`svg:M19.35,11.72L17.22,13.85L15.81,12.43L8.1,20.14L3.5,22L2,20.5L3.86,15.9L11.57,8.19L10.15,6.78L12.28,4.65L19.35,11.72M16.76,3C17.93,1.83 19.83,1.83 21,3C22.17,4.17 22.17,6.07 21,7.24L19.08,9.16L14.84,4.92L16.76,3M5.56,17.03L4.5,19.5L6.97,18.44L14.4,11L13,9.6L5.56,17.03Z`,upload:`svg:M11 20H6.5q-2.28 0-3.89-1.57Q1 16.85 1 14.58q0-1.95 1.17-3.48q1.18-1.53 3.08-1.95q.63-2.3 2.5-3.72Q9.63 4 12 4q2.93 0 4.96 2.04Q19 8.07 19 11q1.73.2 2.86 1.5q1.14 1.28 1.14 3q0 1.88-1.31 3.19T18.5 20H13v-7.15l1.6 1.55L16 13l-4-4l-4 4l1.4 1.4l1.6-1.55Z`,color:`svg:M17.5 12a1.5 1.5 0 0 1-1.5-1.5A1.5 1.5 0 0 1 17.5 9a1.5 1.5 0 0 1 1.5 1.5a1.5 1.5 0 0 1-1.5 1.5m-3-4A1.5 1.5 0 0 1 13 6.5A1.5 1.5 0 0 1 14.5 5A1.5 1.5 0 0 1 16 6.5A1.5 1.5 0 0 1 14.5 8m-5 0A1.5 1.5 0 0 1 8 6.5A1.5 1.5 0 0 1 9.5 5A1.5 1.5 0 0 1 11 6.5A1.5 1.5 0 0 1 9.5 8m-3 4A1.5 1.5 0 0 1 5 10.5A1.5 1.5 0 0 1 6.5 9A1.5 1.5 0 0 1 8 10.5A1.5 1.5 0 0 1 6.5 12M12 3a9 9 0 0 0-9 9a9 9 0 0 0 9 9a1.5 1.5 0 0 0 1.5-1.5c0-.39-.15-.74-.39-1c-.23-.27-.38-.62-.38-1a1.5 1.5 0 0 1 1.5-1.5H16a5 5 0 0 0 5-5c0-4.42-4.03-8-9-8`,command:`svg:M6,2A4,4 0 0,1 10,6V8H14V6A4,4 0 0,1 18,2A4,4 0 0,1 22,6A4,4 0 0,1 18,10H16V14H18A4,4 0 0,1 22,18A4,4 0 0,1 18,22A4,4 0 0,1 14,18V16H10V18A4,4 0 0,1 6,22A4,4 0 0,1 2,18A4,4 0 0,1 6,14H8V10H6A4,4 0 0,1 2,6A4,4 0 0,1 6,2M16,18A2,2 0 0,0 18,20A2,2 0 0,0 20,18A2,2 0 0,0 18,16H16V18M14,10H10V14H14V10M6,16A2,2 0 0,0 4,18A2,2 0 0,0 6,20A2,2 0 0,0 8,18V16H6M8,6A2,2 0 0,0 6,4A2,2 0 0,0 4,6A2,2 0 0,0 6,8H8V6M18,8A2,2 0 0,0 20,6A2,2 0 0,0 18,4A2,2 0 0,0 16,6V8H18Z`,ctrl:`svg:M19.78,11.78L18.36,13.19L12,6.83L5.64,13.19L4.22,11.78L12,4L19.78,11.78Z`,space:`svg:M3 15H5V19H19V15H21V19C21 20.1 20.1 21 19 21H5C3.9 21 3 20.1 3 19V15Z`,shift:`svg:M15 18v-6h2.17L12 6.83L6.83 12H9v6zM12 4l10 10h-5v6H7v-6H2z`,alt:`svg:M3 4h6.11l7.04 14H21v2h-6.12L7.84 6H3zm11 0h7v2h-7z`,enter:`svg:M19 7v4H5.83l3.58-3.59L8 6l-6 6l6 6l1.41-1.42L5.83 13H21V7z`,arrowup:`svg:M13 20h-2V8l-5.5 5.5l-1.42-1.42L12 4.16l7.92 7.92l-1.42 1.42L13 8z`,arrowdown:`svg:M11 4h2v12l5.5-5.5l1.42 1.42L12 19.84l-7.92-7.92L5.5 10.5L11 16z`,arrowleft:`svg:M20 11v2H8l5.5 5.5l-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5L8 11z`,arrowright:`svg:M4 11v2h12l-5.5 5.5l1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5L16 11z`,backspace:`svg:M19 15.59L17.59 17L14 13.41L10.41 17L9 15.59L12.59 12L9 8.41L10.41 7L14 10.59L17.59 7L19 8.41L15.41 12zM22 3a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H7c-.69 0-1.23-.36-1.59-.89L0 12l5.41-8.12C5.77 3.35 6.31 3 7 3zm0 2H7l-4.72 7L7 19h15z`,play:`svg:M8,5.14V19.14L19,12.14L8,5.14Z`,pause:`svg:M14,19H18V5H14M6,19H10V5H6V19Z`,fullscreen:`svg:M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z`,fullscreenExit:`svg:M14,14H19V16H16V19H14V14M5,14H10V19H8V16H5V14M8,5H10V10H5V8H8V5M19,8V10H14V5H16V8H19Z`,volumeHigh:`svg:M14,3.23V5.29C16.89,6.15 19,8.83 19,12C19,15.17 16.89,17.84 14,18.7V20.77C18,19.86 21,16.28 21,12C21,7.72 18,4.14 14,3.23M16.5,12C16.5,10.23 15.5,8.71 14,7.97V16C15.5,15.29 16.5,13.76 16.5,12M3,9V15H7L12,20V4L7,9H3Z`,volumeMedium:`svg:M5,9V15H9L14,20V4L9,9M18.5,12C18.5,10.23 17.5,8.71 16,7.97V16C17.5,15.29 18.5,13.76 18.5,12Z`,volumeLow:`svg:M7,9V15H11L16,20V4L11,9H7Z`,volumeOff:`svg:M5.64,3.64L21.36,19.36L19.95,20.78L16,16.83V20L11,15H7V9H8.17L4.22,5.05L5.64,3.64M16,4V11.17L12.41,7.58L16,4Z`,search:`svg:M9.5,3A6.5,6.5 0 0,1 16,9.5C16,11.11 15.41,12.59 14.44,13.73L14.71,14H15.5L20.5,19L19,20.5L14,15.5V14.71L13.73,14.44C12.59,15.41 11.11,16 9.5,16A6.5,6.5 0 0,1 3,9.5A6.5,6.5 0 0,1 9.5,3M9.5,5C7,5 5,7 5,9.5C5,12 7,14 9.5,14C12,14 14,12 14,9.5C14,7 12,5 9.5,5Z`};var mdi={component:VSvgIcon};var TRAINING_GUIDE_DURATION_MS=8e3;var trainingGuide=shallowRef(null);var overlays=0;var sequence=0;function registerTrainingGuideOverlay(){overlays+=1;let registered=true;return()=>{if(!registered)return;registered=false;overlays-=1;if(overlays===0)trainingGuide.value=null}}function cssString(value){return String(value).replace(/["\\]/gu,`\\$&`)}function stepSelectors(step){if(step.id===`file`)return[`[data-vibe64-guide-path="${cssString(step.path)}"]`];const id=cssString(step.id);return[`[data-vibe64-guide="${id}"]`,`[data-vibe64-guide-pane="${id}"]`]}function visibleStepElement(step,root){for(const selector of stepSelectors(step)){const element=[...root.querySelectorAll(selector)].find(guideElementVisible);if(element)return element}return null}function guideElementVisible(element){if(!element?.isConnected||element.closest(`[inert], [aria-hidden='true']`))return false;if(typeof element.checkVisibility===`function`&&!element.checkVisibility({visibilityProperty:true}))return false;const rect=element.getBoundingClientRect();return rect.width>0&&rect.height>0}function findTrainingGuideStep(steps=[],root=globalThis.document){if(!root)return null;for(let index=steps.length-1;index>=0;index-=1){const element=visibleStepElement(steps[index],root);if(element)return{step:steps[index],element,final:index===steps.length-1}}return null}var PANE_SWITCH=`pane-switch`;function findPaneSwitch(root=globalThis.document){if(!root)return null;return[...root.querySelectorAll(`[data-vibe64-guide="${PANE_SWITCH}"]`)].filter(guideElementVisible).at(-1)||null}function currentTrainingGuideElement(guide){const element=guide?.element;if(!element||guideElementVisible(element))return element||null;if(element.isConnected||!guide.target)return null;return guide.target.id===PANE_SWITCH?findPaneSwitch():visibleStepElement(guide.target,globalThis.document)}function clearTrainingGuide(id){if(!id||trainingGuide.value?.id===id)trainingGuide.value=null}async function showTrainingGuide(guide,{settleMs=0,durationMs=TRAINING_GUIDE_DURATION_MS}={}){if(!guide?.highlight)return{shown:false,reason:`highlight-off`};if(overlays===0)return{shown:false,reason:`overlay-unavailable`};const deadline=Date.now()+settleMs;let found=findTrainingGuideStep(guide.steps);while(!found?.final&&Date.now()<deadline){await new Promise(resolve=>setTimeout(resolve,50));found=findTrainingGuideStep(guide.steps)}if(!found){const element=findPaneSwitch();if(element)found={step:{id:PANE_SWITCH},element}}if(!found)return{shown:false,reason:`target-hidden`};if(overlays===0)return{shown:false,reason:`overlay-unavailable`};sequence+=1;trainingGuide.value=Object.freeze({id:`guide-${sequence}`,element:found.element,step:found.step.id,target:found.step,caption:String(guide.caption||``),expiresAt:Date.now()+durationMs});return{shown:true,step:found.step.id}}async function runTrainingGuideCommand(command,{navigateBrowser,view}={}){const{guide,...navigation}=command;let focus=null;if(guide.navigate){if(typeof navigateBrowser!==`function`)throw new Error(`Lesson workspace navigation is unavailable in this installation.`);focus=await navigateBrowser(navigation);if(guide.filePath&&(typeof view?.openFile!==`function`||view.openFile(guide.filePath)!==true))throw new Error(`This lesson's Files view could not open that practice project file.`)}const receipt=await showTrainingGuide(guide,{settleMs:guide.navigate?1500:0});return{...focus?{focus}:{},guide:receipt}}var PRACTICE_SLUG_PATTERN=/^training-[a-f0-9]{32}$/u;function isPracticeProjectSlug(slug=``){return PRACTICE_SLUG_PATTERN.test(String(slug||``))}function practiceProjectName({lessonTitle=``,lessonCode=``}={}){const lesson=String(lessonTitle||``).trim()||String(lessonCode||``).trim();return lesson?`Practice: ${lesson}`:`Practice project`}function projectDisplayName(project=null,{lessonTitle=``}={}){const slug=String(project?.slug||``);return isPracticeProjectSlug(slug)?practiceProjectName({lessonTitle}):slug}function projectSubtitle(project=null){return isPracticeProjectSlug(project?.slug)?`For your current lesson`:String(project?.projectRoot||``)}var ID=/^[a-z][a-z0-9-]{0,63}$/u;var SCOPES=new Set([`studio`,`project`]);var WHO=new Set([`everyone`,`owner`]);var step=(id,label)=>Object.freeze({id,label});var PREVIEW=step(`preview`,`Preview`);var DASHBOARD=step(`dashboard`,`Dashboard`);var DATABASE=step(`database`,`Database`);var ACCOUNT_MENU=step(`account-menu`,`Account menu`);var BUILT_IN_PLACES=[{id:`preview`,label:`Preview`,scope:`project`,open:{pane:`preview`},steps:[PREVIEW]},{id:`dashboard`,label:`Dashboard`,scope:`project`,open:null,steps:[DASHBOARD]},{id:`database-erd`,label:`ERD`,scope:`project`,open:{pane:`database`,databaseView:`erd`},steps:[DASHBOARD,DATABASE,step(`database-erd`,`ERD`)]},{id:`database-data`,label:`Data`,scope:`project`,open:{pane:`database`,databaseView:`data`},steps:[DASHBOARD,DATABASE,step(`database-data`,`Data`)]},{id:`files`,label:`Files`,scope:`project`,open:{pane:`files`},steps:[DASHBOARD,step(`files`,`Files`)]},{id:`changes`,label:`Current changes`,scope:`project`,open:{pane:`changes`},steps:[DASHBOARD,step(`changes`,`Current changes`)]},{id:`git-log`,label:`Git log`,scope:`project`,open:{pane:`repository`},steps:[DASHBOARD,step(`git-log`,`Git log`)]},{id:`session-info`,label:`Session info`,scope:`project`,open:{pane:`session`},steps:[DASHBOARD,step(`session-info`,`Session info`)]},{id:`architecture`,label:`Architecture`,scope:`project`,open:{pane:`system`},steps:[DASHBOARD,step(`architecture`,`Architecture`)]},{id:`publish`,label:`Publish`,scope:`project`,open:{pane:`publish`},steps:[DASHBOARD,step(`publish`,`Publish`)]},{id:`chat`,label:`Coding chat`,scope:`project`,open:null,shown:[{pane:`chat`},{chatVisible:true}],steps:[step(`chat`,`Coding chat`)]},{id:`save`,label:`Save`,scope:`project`,open:null,event:`saved`,steps:[step(`save`,`Save`)]},{id:`reload-preview`,label:`Reload preview`,scope:`project`,open:null,event:`preview-reloaded`,steps:[PREVIEW,step(`reload-preview`,`Reload preview`)]},{id:`learning`,label:`Learning`,scope:`studio`,open:{learning:true},shown:[],event:`learn-toggled`,steps:[step(`learning`,`Learning`)]},{id:`lesson`,label:`Lesson`,scope:`studio`,open:null,shown:[{pane:`lesson`}],steps:[step(`lesson`,`Lesson`)]},{id:`lesson-bar`,label:`Lesson step bar`,scope:`studio`,open:null,steps:[step(`lesson-bar`,`Lesson step bar`)]},{id:`courses`,label:`Courses`,scope:`studio`,open:null,shown:[{learningOpen:true}],steps:[step(`courses`,`Courses`)]},{id:`colleague`,label:`Colleague`,scope:`studio`,open:null,event:`colleague-opened`,steps:[step(`colleague`,`Colleague`)]},{id:`account-menu`,label:`Account menu`,scope:`studio`,open:null,steps:[ACCOUNT_MENU]},{id:`account-settings`,label:`Account settings`,scope:`studio`,open:null,steps:[ACCOUNT_MENU,step(`account-settings`,`Account settings`)]},{id:`ai-setup`,label:`AI setup`,scope:`studio`,open:null,steps:[ACCOUNT_MENU,step(`ai-setup`,`AI setup`)]}];var BUILT_IN_ACTIVITIES=[{id:`send-message`,event:`message-sent`,place:`chat`},{id:`agent-finished`,event:`agent-finished`},{id:`file-opened`,event:`file-opened`,place:`files`},{id:`app-pressed`,event:`app-pressed`,place:`preview`},{id:`colleague-minimised`,event:`colleague-minimised`,place:`colleague`}];var BUILT_IN_FACTS=[`ai-ready`];function vocabularyFailure(message){return Object.assign(new Error(message),{code:`VIBE64_TRAINING_VOCABULARY_INVALID`})}var plainObject=value=>Boolean(value)&&typeof value===`object`&&!Array.isArray(value);var label=value=>typeof value===`string`&&value.trim().length>0&&value.length<=64;function definePlace(value){if(!plainObject(value)||!ID.test(value.id||``))throw vocabularyFailure(`A place needs a lowercase id.`);const name=`Place ${value.id}`;if(!label(value.label))throw vocabularyFailure(`${name} needs a label.`);if(!SCOPES.has(value.scope))throw vocabularyFailure(`${name} scope is studio or project.`);const who=value.who??`everyone`;if(!WHO.has(who))throw vocabularyFailure(`${name} who is everyone or owner.`);const open=value.open??null;if(open!==null){const keys=Object.keys(open||{}).sort().join(`,`);if(!(keys===`pane`||keys===`databaseView,pane`?value.scope===`project`&&ID.test(open.pane):keys===`route`?value.scope===`studio`&&typeof open.route===`string`&&/^\/app(?:\/[a-z0-9-]+)*$/u.test(open.route):keys===`learning`&&open.learning===true))throw vocabularyFailure(`${name} opens a project pane, a studio /app route, Courses, or nothing.`)}if(!Array.isArray(value.steps)||!value.steps.length||value.steps.length>6||value.steps.some(item=>!ID.test(item?.id||``)||!label(item.label))||value.steps.at(-1).id!==value.id)throw vocabularyFailure(`${name} needs 1 to 6 labelled steps ending with itself.`);const shown=value.shown??(open?.pane?[{pane:open.pane,...open.databaseView?{databaseView:open.databaseView}:{}}]:open?.route?[{route:open.route}]:[]);if(!Array.isArray(shown)||shown.some(item=>!plainObject(item)||!Object.keys(item).length))throw vocabularyFailure(`${name} shown is a list of page focus matchers.`);if(value.event!==void 0&&!ID.test(value.event))throw vocabularyFailure(`${name} event is a lowercase activity name.`);return Object.freeze({id:value.id,label:value.label,scope:value.scope,who,open:open&&Object.freeze({...open}),steps:Object.freeze(value.steps.map(item=>step(item.id,item.label))),shown:Object.freeze(shown.map(item=>Object.freeze({...item}))),...value.event?{event:value.event}:{}})}function defineActivity(value){if(!plainObject(value)||!ID.test(value.id||``))throw vocabularyFailure(`An activity needs a lowercase id.`);if(!ID.test(value.event||``))throw vocabularyFailure(`Activity ${value.id} needs its page activity event.`);if(value.place!==void 0&&!ID.test(value.place))throw vocabularyFailure(`Activity ${value.id} place is a place id.`);return Object.freeze({id:value.id,event:value.event,...value.place?{place:value.place}:{}})}function createLearningVocabulary({places=BUILT_IN_PLACES,activities=BUILT_IN_ACTIVITIES,facts=BUILT_IN_FACTS}={}){const placeMap=new Map;const activityMap=new Map;const factSet=new Set;const same=(left,right)=>JSON.stringify(left)===JSON.stringify(right);function register({places:newPlaces=[],activities:newActivities=[],facts:newFacts=[]}={}){const placed=newPlaces.map(definePlace);const acted=newActivities.map(defineActivity);for(const value of[...placed,...acted])if(placeMap.has(value.id)&&!same(placeMap.get(value.id),value)||activityMap.has(value.id)&&!same(activityMap.get(value.id),value)||placed.includes(value)&&activityMap.has(value.id)||acted.includes(value)&&placeMap.has(value.id))throw vocabularyFailure(`${value.id} is already registered with another meaning.`);for(const fact of newFacts)if(!ID.test(fact||``))throw vocabularyFailure(`A fact needs a lowercase id.`);for(const value of placed)placeMap.set(value.id,value);for(const value of acted)activityMap.set(value.id,value);for(const fact of newFacts)factSet.add(fact)}register({places,activities,facts});return Object.freeze({register,place:id=>placeMap.get(id)||null,activity:id=>activityMap.get(id)||null,hasFact:id=>factSet.has(id),places:()=>[...placeMap.values()],events:()=>new Set([...[...activityMap.values()].map(value=>value.event),...[...placeMap.values()].filter(value=>value.event).map(value=>value.event)])})}var learningVocabulary=createLearningVocabulary({facts:[]});var filePathExpression=/^(?!\/)(?!.*(?:^|\/)\.\.(?:\/|$))[^\u0000-\u001f\\]{1,512}$/u;var TRAINING_GUIDE_CAPTION_LIMIT=256;function guideFailure(message){return Object.assign(new Error(message),{code:`VIBE64_TRAINING_GUIDE_INVALID`,statusCode:422})}var placeOpens=place=>Boolean(place?.open);function trainingGuideRequest(input={},vocabulary=learningVocabulary){const place=typeof input.target===`string`?vocabulary.place(input.target):null;const declared=!place&&typeof vocabulary.declaredPlace===`function`&&vocabulary.declaredPlace(input.target);if(!place&&!declared)throw guideFailure(`Use one of this installation's guide places: ${vocabulary.places().map(value=>value.id).join(`, `)}.`);const target=input.target;const navigate=input.navigate??false;const highlight=input.highlight??true;if(typeof navigate!==`boolean`||typeof highlight!==`boolean`)throw guideFailure(`navigate and highlight are booleans.`);if(!navigate&&!highlight)throw guideFailure(`Point at the place (highlight) or open it (navigate); this request does neither.`);if(navigate&&target===`dashboard`)throw guideFailure(`Dashboard has no single view to open. Point at it, or open one Dashboard section such as files or database-erd.`);if(navigate&&place&&!placeOpens(place))throw guideFailure(`${place.label} has no view to open; point at it instead.`);const request={target,navigate,highlight};if(input.filePath!==void 0){if(target!==`files`)throw guideFailure(`filePath is only for the files place.`);if(typeof input.filePath!==`string`||!filePathExpression.test(input.filePath))throw guideFailure(`Use a relative practice project file path without '..'.`);request.filePath=input.filePath}if(input.caption!==void 0){if(typeof input.caption!==`string`||!input.caption.trim()||input.caption.length>256)throw guideFailure(`Use a caption of 1 to ${256} characters.`);request.caption=input.caption.trim()}return request}function trainingGuideSteps(request,vocabulary=learningVocabulary){const steps=vocabulary.place(request.target).steps.map(value=>({...value}));if(request.filePath)steps.push({id:`file`,path:request.filePath,label:request.filePath});return steps}function trainingPlaceShown(target,focus={},vocabulary=learningVocabulary){const place=vocabulary.place(target);if(!place?.shown.length)return null;return place.shown.some(matcher=>Object.entries(matcher).every(([key,value])=>key===`route`?typeof focus.route===`string`&&(focus.route===value||focus.route.startsWith(`${value}/`)):focus[key]===value))}var TRAINING_BEAT_CHECKS=Object.freeze({auto:`auto`,review:`review`,done:`self`,fact:`fact`});function beatPlace(beat,vocabulary=learningVocabulary){if(!beat||beat.kind===`check`)return``;const activity=vocabulary.activity(beat.target);return activity?activity.place||``:beat.target}var SHOW_MIN_MS=5e3;var SHOW_MAX_MS=12e3;var SHOW_PER_CHARACTER_MS=50;var TICK_MS=100;var DO_RING_MS=15e3;var POINT_SETTLE_MS=1500;var CONFIRM_MS=1500;var showDuration=text=>Math.min(SHOW_MAX_MS,Math.max(SHOW_MIN_MS,SHOW_MIN_MS+SHOW_PER_CHARACTER_MS*String(text||``).length));function reducedMotion(){try{return Boolean(globalThis.matchMedia?.(`(prefers-reduced-motion: reduce)`)?.matches)}catch{return false}}function documentHidden(){return globalThis.document?.visibilityState===`hidden`}var beatIdentity=value=>value?JSON.stringify([value.kind,value.target,value.text,value.path||``]):``;var sameBeat=(a,b)=>Boolean(a&&b)&&beatIdentity(a)===beatIdentity(b);var stepEnd=beats=>beats.length?beats.length-(beats.at(-1)?.kind===`check`?1:0):0;function beatEvent(beat){return learningVocabulary.activity(beat.target)?.event||learningVocabulary.place(beat.target)?.event||``}function createLessonPlayer({state,steps,currentStep,active,selectStep,remember,focus=()=>null,activity=null,practiceSlug=()=>``,allDone=()=>{},passed=()=>false,showGuide=showTrainingGuide,clearGuide=clearTrainingGuide,shownGuide=()=>trainingGuide.value?.id||``,motionReduced=reducedMotion,hidden=documentHidden}={}){const local=reactive({remaining:0,duration:0,held:false,ring:``,confirmed:``});const detected=new Set;const heard={stepId:``,events:[],used:-1};function stepActivity(){const stepId=currentStep.value?.id||``;if(heard.stepId!==stepId)Object.assign(heard,{stepId,events:[],used:-1});return heard}const activityMatches=(value,event)=>value?.kind===`do`&&beatEvent(value)===event.name&&(!value.path||event.path===value.path);const beats=computed(()=>Array.isArray(currentStep.value?.beats)?currentStep.value.beats:[]);const end=computed(()=>stepEnd(beats.value));const index=computed(()=>Math.max(0,Math.min(Number.isSafeInteger(state.beat)?state.beat:0,end.value)));const beat=computed(()=>beats.value[index.value]||null);const stepIndex=computed(()=>steps.value.findIndex(step=>step.id===currentStep.value?.id));const playing=computed(()=>Boolean(active()&&beat.value?.kind===`show`&&!state.beatPaused&&!local.held&&!state.open));function moveTo(value){local.confirmed=``;state.beat=value;remember()}function next(){if(index.value<end.value)return moveTo(index.value+1);const following=steps.value[stepIndex.value+1];if(following)selectStep(following.id,0)}function back(){if(index.value>0)return moveTo(index.value-1);const previous=steps.value[stepIndex.value-1];if(!previous)return;selectStep(previous.id,stepEnd(Array.isArray(previous.beats)?previous.beats:[]))}function start(stepId=currentStep.value?.id){state.beatPaused=false;if(stepId===currentStep.value?.id)moveTo(0);else selectStep(stepId,0)}function togglePause(){state.beatPaused=!state.beatPaused;remember()}function hold(value){local.held=value===true}let timer=null;let confirmTimer=null;function stopTimer(){clearInterval(timer);timer=null}function tick(){if(!playing.value||hidden()||motionReduced())return;local.remaining=Math.max(0,local.remaining-TICK_MS);if(local.remaining>0)return;stopTimer();next()}watch([active,()=>currentStep.value?.id,index,()=>beatIdentity(beat.value)],([shown])=>{const value=beat.value;stopTimer();clearTimeout(confirmTimer);local.confirmed=``;if(local.ring)clearGuide(local.ring);local.ring=``;local.duration=value?.kind===`show`?showDuration(value.text):0;local.remaining=local.duration;if(!shown||!value)return;if(value.kind===`show`)timer=setInterval(tick,TICK_MS);if(value.kind===`do`&&placeShown(value))return confirm(value,`✓ You're already here.`);if(value.kind===`do`&&passed(currentStep.value?.id))return confirm(value,`✓ Done.`);if(value.kind===`do`&&!detected.has(`${currentStep.value?.id}:${index.value}`)){const history=stepActivity();const position=history.events.findIndex((event,at)=>at>history.used&&activityMatches(value,event));if(position>=0)return confirm(value,`✓ Done.`,position)}point(value)},{immediate:true});function placeShown(value){const current=focus();return Boolean(current&&!learningVocabulary.activity(value.target)&&trainingPlaceShown(value.target,{...current,learningOpen:state.open})===true)}function confirm(value,line=`✓ Done.`,position=-1){const stepId=currentStep.value?.id;const at=index.value;detected.add(`${stepId}:${at}`);if(position>=0)stepActivity().used=position;if(local.ring)clearGuide(local.ring);local.ring=``;local.confirmed=line;clearTimeout(confirmTimer);if(beats.value.map((item,position)=>[item,position]).filter(([item])=>item.kind===`do`).every(([,position])=>detected.has(`${stepId}:${position}`)))allDone(stepId);confirmTimer=setTimeout(()=>{local.confirmed=``;if(currentStep.value?.id===stepId&&index.value===at&&sameBeat(beat.value,value))next()},CONFIRM_MS)}watch(()=>beat.value?.kind===`do`&&active()&&!local.confirmed&&placeShown(beat.value),shown=>{if(shown)confirm(beat.value)});activity?.subscribe(event=>{if(practiceSlug()&&event.projectSlug&&event.projectSlug!==practiceSlug())return;const history=stepActivity();history.events.push(event);const value=beat.value;if(local.confirmed||!active()||!activityMatches(value,event))return;confirm(value,`✓ Done.`,history.events.length-1)});watch(()=>state.open,covered=>{if(covered&&local.ring)clearGuide(local.ring)});async function point(value){const place=beatPlace(value);if(!place||!learningVocabulary.place(place)||state.open)return null;const request={target:place,...value.path?{filePath:value.path}:{}};const guideSteps=trainingGuideSteps(request);const receipt=await showGuide({...request,highlight:true,navigate:false,steps:guideSteps,caption:guideSteps.map(item=>item.label).join(` → `)},{settleMs:POINT_SETTLE_MS,durationMs:value.kind===`show`?local.duration:DO_RING_MS});if(receipt?.shown){if(sameBeat(beat.value,value)&&!state.open)local.ring=shownGuide();else clearGuide(shownGuide())}return receipt}return Object.freeze({beats,beat,index,end,get final(){return Boolean(beats.value.length)&&index.value===end.value},get paused(){return Boolean(state.beatPaused)},get playing(){return playing.value&&!motionReduced()},get progress(){return local.duration?1-local.remaining/local.duration:0},get atStart(){return index.value===0&&stepIndex.value<=0},get atEnd(){return index.value>=end.value&&stepIndex.value>=steps.value.length-1},get confirmed(){return local.confirmed},next,back,start,togglePause,hold,point:()=>beat.value&&point(beat.value)})}var TRAINING_LESSON_IN_PROGRESS_CODE=`VIBE64_TRAINING_LESSON_IN_PROGRESS`;var TRAINING_PRACTICE_AI_REQUIRED_CODE=`VIBE64_TRAINING_PRACTICE_AI_REQUIRED`;var TRAINING_NOTES_CHANGED_CODE=`VIBE64_TRAINING_NOTES_CHANGED`;var LEARNER_NOTES_MAX_CHARS=4e3;var TRAINING_PATH=`/api/vibe64/training`;var attemptPath=(attemptId,suffix=``)=>`${TRAINING_PATH}/attempts/${encodeURIComponent(attemptId)}${suffix}`;var VIBE64_LEARNING_ROUTES=Object.freeze({lessonRead:attemptId=>attemptPath(attemptId,`/lesson`),stepObserve:attemptId=>attemptPath(attemptId,`/steps/observe`),stepCheck:attemptId=>attemptPath(attemptId,`/steps/check`),stepAnswer:attemptId=>attemptPath(attemptId,`/steps/answer`),stepDone:attemptId=>attemptPath(attemptId,`/steps/done`),stepReview:attemptId=>attemptPath(attemptId,`/steps/review`),readerSave:attemptId=>attemptPath(attemptId,`/reader`),visual:(attemptId,visualId)=>attemptPath(attemptId,`/visuals/${encodeURIComponent(visualId)}`),lessonRestart:attemptId=>attemptPath(attemptId,`/restart`),lessonFinish:attemptId=>attemptPath(attemptId,`/finish`),lessonDelete:attemptId=>attemptPath(attemptId,`/delete`),learning:`${TRAINING_PATH}/learning`,courses:`${TRAINING_PATH}/courses`,available:`${TRAINING_PATH}/available`,courseInstall:`${TRAINING_PATH}/courses/install`,lessonStart:`${TRAINING_PATH}/lessons/start`,lessonResume:attemptId=>attemptPath(attemptId,`/resume`),notes:`${TRAINING_PATH}/teacher-notes`,notesClear:`${TRAINING_PATH}/teacher-notes/clear`,learningMode:`${TRAINING_PATH}/learning-mode`,practice:`${TRAINING_PATH}/practice`,archiveDelete:attemptId=>`${TRAINING_PATH}/archives/${encodeURIComponent(attemptId)}/delete`});var VIBE64_LEARNING_PAGE_PATH=`/app/learning`;var DEVELOP_HOME_PATH=`/app`;var VIBE64_LEARNING_MODE_NOTE=`You're in Learn mode. Press L to go back to your projects.`;var VIBE64_DEVELOP_MODE_NOTE=`This is a practice project. Press L to switch to Learn.`;var VIBE64_LEARNING_MODE_PROJECT_CODE=`vibe64_learning_mode_project`;var VIBE64_LESSON_IN_PROGRESS_CODE=TRAINING_LESSON_IN_PROGRESS_CODE;var VIBE64_LEARNING_AI_REQUIRED_CODE=TRAINING_PRACTICE_AI_REQUIRED_CODE;var VIBE64_LEARNING_NOTES_MAX=LEARNER_NOTES_MAX_CHARS;var SURFACES=Object.freeze([`courses`,`progress`,`archived`]);var STORAGE_PREFIX=`vibe64:learning-environment:v2:`;var MODE_PLACE_PREFIX=`vibe64:mode-place:v1:`;var READER_SAVE_DELAY_MS=800;var PROJECT_VIEW_WAIT_MS=5e3;var MAX_EXERCISE_OBSERVATIONS=8;var VIBE64_LEARNING_TEACH_MESSAGE=`Teach me this step.`;var VIBE64_LEARNING_STUCK_MESSAGE=`I'm stuck on this step.`;var EMPTY_PRACTICE=Object.freeze({current:null,archived:Object.freeze([]),loaded:false});var text$7=value=>typeof value===`string`&&value.length>0;function storage(kind){try{return globalThis.window?.[kind]||null}catch{return null}}function readJson(kind,key){try{const value=JSON.parse(storage(kind)?.getItem(key)||`null`);return value&&typeof value===`object`?value:null}catch{return null}}function writeJson(kind,key,value){try{storage(kind)?.setItem(key,JSON.stringify(value))}catch{}}function readPlace(actorKey){const value=readJson(`sessionStorage`,`${STORAGE_PREFIX}${actorKey}`);if(!value)return null;return{surface:SURFACES.includes(value.surface)?value.surface:`courses`,attemptId:text$7(value.attemptId)?value.attemptId:``,stepId:text$7(value.stepId)?value.stepId:``,trialAttemptId:text$7(value.trialAttemptId)&&value.trialAttemptId===value.attemptId?value.trialAttemptId:``,scroll:Number.isSafeInteger(value.scroll)&&value.scroll>=0?value.scroll:0,beat:Number.isSafeInteger(value.beat)&&value.beat>=0?value.beat:0,beatPaused:value.beatPaused===true}}var lessonShownIn=query=>query?.lesson===`1`;var withLesson=path=>`${path}?lesson=1`;function withoutLesson(query={}){const{lesson:_lesson,...rest}=query||{};return rest}var modePlaceKey=(actorKey,side)=>`${MODE_PLACE_PREFIX}${actorKey}:${side}`;var modeSide=on=>on?`learn`:`develop`;function normalizeLesson(result){if(!result||result.ok===false||result.available===false)return null;const lesson=result.lesson||{};const steps=Array.isArray(lesson.steps)?lesson.steps.filter(step=>text$7(step?.id)):[];const attempt=result.attempt||null;return Object.freeze({schemaVersion:lesson.schemaVersion??(steps.length?2:1),stage:lesson.stage===`studio`||lesson.stage===`project`?lesson.stage:``,code:lesson.code||attempt?.pin?.lesson?.code||``,title:lesson.title||``,notesText:text$7(lesson.notesText)?lesson.notesText:``,visuals:Array.isArray(lesson.visuals)?lesson.visuals:[],steps,attempt,practiceProjectSlug:attempt?.practiceSlug||``,reader:result.reader&&text$7(result.reader.stepId)?result.reader:null,results:Array.isArray(result.results)?result.results:[],passedStepIds:Array.isArray(result.passedStepIds)?result.passedStepIds.filter(text$7):[]})}function normalizeLearningMode(result){const mode=result?.ok===true&&result.available!==false?result.learningMode:null;if(!mode||typeof mode!==`object`)return null;const value=key=>text$7(mode[key])?mode[key]:``;return Object.freeze({on:mode.on===true,currentAttemptId:value(`currentAttemptId`),lessonCode:value(`lessonCode`),lessonTitle:value(`lessonTitle`),practiceSlug:value(`practiceSlug`),lessonStage:[`studio`,`project`].includes(mode.lessonStage)?mode.lessonStage:``})}function normalizePractice(result){if(result?.ok!==true)return EMPTY_PRACTICE;const lessonName=lesson=>String(lesson?.title||lesson?.code||``)||`Lesson`;const current=result.current&&text$7(result.current.attemptId)?Object.freeze({attemptId:result.current.attemptId,name:lessonName(result.current.lesson),projectName:text$7(result.current.slug)?practiceProjectName({lessonTitle:result.current.lesson?.title,lessonCode:result.current.lesson?.code}):``,slug:text$7(result.current.slug)?result.current.slug:``,status:result.current.status===`deleting`?`deleting`:`in-progress`}):null;const archived=(Array.isArray(result.archived)?result.archived:[]).filter(entry=>text$7(entry?.attemptId)).map(entry=>Object.freeze({attemptId:entry.attemptId,name:lessonName(entry.lesson),reason:entry.reason===`finished`?`finished`:`archived`,archivedAt:String(entry.archivedAt||``),hasProject:entry.hasProject===true}));return Object.freeze({current,archived:Object.freeze(archived),loaded:true})}var studioHome=VIBE64_LEARNING_PAGE_PATH;function learnHomePath(mode){return mode?.lessonStage===`project`&&mode.practiceSlug?projectAppPath(mode.practiceSlug):studioHome}function modeRedirect({mode=null,slug=``,path=``}={}){if(!mode)return null;const projectSlug=String(slug||``).trim();const atLearnPage=String(path||``).replace(/\/+$/u,``)===VIBE64_LEARNING_PAGE_PATH;if(mode.on){if(projectSlug?projectSlug===mode.practiceSlug:!(atLearnPage&&learnHomePath(mode)!==`/app/learning`))return null;return Object.freeze({path:learnHomePath(mode),note:projectSlug?VIBE64_LEARNING_MODE_NOTE:``})}if(atLearnPage)return Object.freeze({path:DEVELOP_HOME_PATH,note:``});if(projectSlug&&projectSlug===mode.practiceSlug)return Object.freeze({path:DEVELOP_HOME_PATH,note:VIBE64_DEVELOP_MODE_NOTE});return null}var STEP_STATUS_LABELS=Object.freeze({passed:`Passed`,"not-yet-passed":`Not yet passed`,"not-started":`Not checked yet`});var ALREADY_PASSED_NOTE=`You already passed this step, so this was not checked again. Your earlier pass counts.`;function checkNote(result){if(result?.alreadyPassed)return ALREADY_PASSED_NOTE;return result?.outcome===`not-yet-passed`&&result.reason?String(result.reason):``}function reviewNote(result){if(!result)return``;if(result.alreadyPassed)return ALREADY_PASSED_NOTE;const comment=String(result.review?.comment||``).trim();const hint=String(result.review?.hint||``).trim();if(result.outcome===`passed`)return comment?`Passed ✓ ${comment}`:`Passed ✓`;if(!comment)return String(result.reason||``).trim();return`Not yet: ${comment}${hint?` Hint: ${hint}`:``}`}function reviewRunNote(result,lessonError=``){return result?reviewNote(result):lessonError||`Your work could not be checked. Try again.`}function stepStatus(results,stepId,passedStepIds=[]){const own=results.filter(result=>result?.stepId===stepId);if(passedStepIds.includes(stepId)||own.some(result=>result.outcome===`passed`))return`passed`;return own.length?own.at(-1).outcome||`not-yet-passed`:`not-started`}function showMeCommand(guide,{projectSlug=``,sessionId=``}={}){const request=trainingGuideRequest({target:guide?.target,...guide?.navigate!==void 0?{navigate:guide.navigate}:{},...guide?.filePath!==void 0?{filePath:guide.filePath}:{}});const steps=trainingGuideSteps(request);const caption=text$7(guide?.caption)?guide.caption.slice(0,256):steps.map(value=>value.label).join(` → `);const open=learningVocabulary.place(request.target).open;const navigate=request.navigate&&Boolean(open?.route||open?.pane&&projectSlug);const command={guide:{...request,navigate,highlight:true,steps,caption}};if(!navigate)return command;if(open.route)return{...command,route:open.route};return{...command,projectSlug,...text$7(sessionId)?{sessionId}:{},pane:open.pane,...open.databaseView?{databaseView:open.databaseView}:{}}}function createVibe64Learning({request:requestOverride=null,browserNavigation=null,colleagueView=null,layout=null,pageFocus=null,pageActivity=null,router=null,runGuide=null,now=()=>Date.now()}={}){const state=reactive({open:false,minimised:false,surface:`courses`,attemptId:``,stepId:``,scroll:0,loading:false,lessonError:``,attemptsError:``,actorKey:``,busy:``,hiddenBy:``,finished:false,notice:``,modeBusy:``,modeRead:false,trialAttemptId:``,beat:0,beatPaused:false,orientationRequested:false});const lesson=shallowRef(null);const mode=shallowRef(null);const practice=shallowRef(EMPTY_PRACTICE);const confirmArchive=shallowRef(null);const colleagueRequest=shallowRef(null);const notes=shallowRef(null);const notesState=reactive({loading:false,saving:false,error:``});const pending=new Map;const exerciseObservations=new Set;let viewer=0;let reads=0;let modeReads=0;let modeLoad=null;let practiceReads=0;let attemptsErrorFromRead=false;let saveTimer=null;let lastSaved=``;let finishRun=null;let lessonLoad=null;function pendingRequestId(key){const requestId=pending.get(key)||globalThis.crypto.randomUUID();pending.set(key,requestId);return requestId}async function request(url,options={}){if(requestOverride)return requestOverride(url,options);return getHttpWebClient().request(resolveStudioRequestUrl(url),options)}const learnMode=computed(()=>Boolean(state.actorKey&&mode.value?.on));const results=computed(()=>lesson.value?.results||[]);const steps=computed(()=>lesson.value?.steps||[]);const currentStep=computed(()=>steps.value.find(step=>step.id===state.stepId)||steps.value[0]||null);const focus=computed(()=>({learningOpen:state.open,learningSurface:state.surface,...state.attemptId?{learningAttemptId:state.attemptId}:{},...state.attemptId&¤tStep.value?{learningStepId:currentStep.value.id}:{}}));const complete=computed(()=>Boolean(lesson.value?.schemaVersion>=2&&steps.value.length&&steps.value.filter(step=>step.required).every(step=>stepStatus(results.value,step.id,lesson.value.passedStepIds)===`passed`)));const lessonAttemptId=computed(()=>state.finished?state.attemptId:state.trialAttemptId||mode.value?.currentAttemptId||``);const stepBarVisible=computed(()=>Boolean(learnMode.value&&!state.finished&&lessonAttemptId.value&&state.attemptId===lessonAttemptId.value&¤tStep.value));const aiRequired=computed(()=>!lesson.value?.attempt?.ended&&lesson.value?.attempt?.preparation?.failure?.code===VIBE64_LEARNING_AI_REQUIRED_CODE);const player=createLessonPlayer({state,steps,currentStep,selectStep:(...value)=>selectStep(...value),remember:()=>remember(),active:()=>stepBarVisible.value&&!lesson.value?.attempt?.ended&&!aiRequired.value,activity:pageActivity,focus:()=>pageFocus?.value?{...pageFocus.value,chatVisible:Boolean(layout?.value?.chatVisible)}:null,practiceSlug:()=>lesson.value?.practiceProjectSlug||``,passed:stepId=>stepStatus(results.value,stepId,lesson.value?.passedStepIds)===`passed`,allDone:stepId=>{if(steps.value.find(value=>value.id===stepId)?.check?.kind===`self`&&stepStatus(results.value,stepId,lesson.value?.passedStepIds)!==`passed`)done(stepId)}});function remember(){if(!state.actorKey)return;writeJson(`sessionStorage`,`${STORAGE_PREFIX}${state.actorKey}`,{surface:state.surface,attemptId:state.attemptId,stepId:state.stepId,scroll:state.scroll,trialAttemptId:state.trialAttemptId,beat:state.beat,beatPaused:state.beatPaused})}function setViewer(actorKey){const next=String(actorKey||``);if(next===state.actorKey)return;viewer+=1;reads+=1;modeReads+=1;practiceReads+=1;attemptsErrorFromRead=false;clearTimeout(saveTimer);pending.clear();exerciseObservations.clear();lesson.value=null;mode.value=null;practice.value=EMPTY_PRACTICE;confirmArchive.value=null;colleagueRequest.value=null;notes.value=null;Object.assign(notesState,{loading:false,saving:false,error:``});Object.assign(state,{open:false,minimised:false,surface:`courses`,attemptId:``,stepId:``,scroll:0,loading:false,lessonError:``,attemptsError:``,busy:``,hiddenBy:``,finished:false,notice:``,modeBusy:``,modeRead:false,trialAttemptId:``,beat:0,beatPaused:false,orientationRequested:false,actorKey:next});finishRun=null;const place=next?readPlace(next):null;if(place)Object.assign(state,place);if(state.attemptId)loadLesson();if(next)readLearningMode()}function acceptMode(value){mode.value=value;state.modeRead=true;const current=state.trialAttemptId||value?.currentAttemptId||``;if(!value||state.finished||current===state.attemptId)return;selectAttempt(current);remember();if(current)loadLesson()}async function readLearningMode(){if(!state.actorKey)return null;const expected=++modeReads;let value=null;const load=request(VIBE64_LEARNING_ROUTES.learningMode,{method:`GET`});modeLoad=load;try{value=normalizeLearningMode(await load)}catch{value=null}finally{if(modeLoad===load)modeLoad=null}if(expected!==modeReads)return mode.value;acceptMode(value);return value}async function settledMode(){if(modeLoad)await modeLoad.catch(()=>null);await Promise.resolve()}async function modeWith(attemptId){await settledMode();return mode.value?.on&&mode.value.currentAttemptId===attemptId?mode.value:readLearningMode()}function currentPath(){return String(router?.currentRoute?.value?.fullPath||``)}function readModePlace(side){const path=readJson(`localStorage`,modePlaceKey(state.actorKey,side))?.path;return text$7(path)&&path.startsWith(`/app`)?path:``}function modePlace(value=mode.value){const saved=readModePlace(modeSide(value?.on));const pathname=saved.split(/[?#]/u)[0];if(saved&&!modeRedirect({mode:value,slug:projectSlugFromPathname(pathname),path:pathname}))return saved;return value?.on?learnHomePath(value):DEVELOP_HOME_PATH}async function setMode(on){if(!state.actorKey||state.modeBusy)return null;const expected=viewer;const path=currentPath();if(path.startsWith(`/app`))writeJson(`localStorage`,modePlaceKey(state.actorKey,modeSide(learnMode.value)),{path});state.modeBusy=`set`;try{const value=normalizeLearningMode(await request(VIBE64_LEARNING_ROUTES.learningMode,{method:`POST`,body:{on:on===true}}));if(!value)throw new Error(`The switch was not confirmed. Press L again.`);if(expected!==viewer)return null;modeReads+=1;acceptMode(value);if(!value.on)minimise();const target=modePlace(value);if(router&&target!==path)await router.push(target);if(value.on&&!value.currentAttemptId)openCourses(`courses`);pageActivity?.report(`learn-toggled`,{projectSlug:projectSlugFromPathname(currentPath())});return value}catch(cause){if(expected===viewer)showNotice(cause?.message||`The switch was not confirmed. Press L again.`);return null}finally{if(state.modeBusy===`set`)state.modeBusy=``}}const toggleMode=()=>setMode(!learnMode.value);function selectAttempt(attemptId,stepId=``){lesson.value=null;state.attemptId=attemptId;state.stepId=text$7(stepId)?stepId:``;state.scroll=0;state.beat=0;lastSaved=``}function showNotice(value){state.notice=String(value||``)}function clearNotice(){state.notice=``}async function readAllPages(attemptId){const first=await request(VIBE64_LEARNING_ROUTES.lessonRead(attemptId),{method:`GET`});const count=Number.isSafeInteger(first?.page?.count)?Math.min(first.page.count,32):1;const steps=Array.isArray(first?.lesson?.steps)?first.lesson.steps:null;if(count<=1||!steps)return first;const bodies=new Map;for(let index=1;index<count;index++){const page=await request(`${VIBE64_LEARNING_ROUTES.lessonRead(attemptId)}?page=${index}`,{method:`GET`});for(const step of page?.lesson?.steps||[])if(typeof step?.bodyText===`string`)bodies.set(step.id,step.bodyText)}return{...first,lesson:{...first.lesson,steps:steps.map(step=>typeof step?.bodyText===`string`||!bodies.has(step?.id)?step:{...step,bodyText:bodies.get(step.id)})}}}function loadLesson(attemptId=state.attemptId){lessonLoad=readLesson(attemptId);return lessonLoad}async function readLesson(attemptId){if(!attemptId||!state.actorKey)return null;const expected=++reads;state.loading=true;state.lessonError=``;try{const result=await readAllPages(attemptId);if(expected!==reads||attemptId!==state.attemptId)return null;const value=normalizeLesson(result);if(!value)throw new Error(result?.error||`This lesson could not be read. Refresh and try again.`);lesson.value=value;const known=id=>value.steps.some(step=>step.id===id);if(!known(state.stepId)){const saved=value.reader?.attemptId===void 0||value.reader?.attemptId===attemptId?value.reader:null;const passed=step=>stepStatus(value.results,step.id,value.passedStepIds)===`passed`;const unpassed=value.steps.some(passed)?value.steps.find(step=>step.required&&!passed(step)):null;state.stepId=saved&&known(saved.stepId)?saved.stepId:(unpassed||value.steps[0])?.id||``;state.scroll=saved&&known(saved.stepId)&&Number.isSafeInteger(saved.scroll)?saved.scroll:0;state.beat=0}remember();return value}catch(cause){if(expected===reads)state.lessonError=String(cause?.message||`This lesson could not be read.`);return null}finally{if(expected===reads)state.loading=false}}async function show({surface,attemptId,stepId}={}){if(!state.actorKey)throw new Error(`Sign in before opening Courses.`);if(text$7(attemptId)||text$7(stepId))return openLesson({attemptId,stepId});state.open=true;state.minimised=false;state.hiddenBy=``;if(SURFACES.includes(surface))state.surface=surface;if(state.finished){state.finished=false;if(mode.value)acceptMode(mode.value)}remember();if(state.surface===`progress`||state.surface===`archived`)readPractice();return focus.value}const openCourses=surface=>show({surface});async function openLesson({attemptId,stepId}={}){if(!state.actorKey)throw new Error(`Sign in before opening a lesson.`);let value=state.modeRead?mode.value:await readLearningMode();if(!value?.on)value=await setMode(true);if(!value?.on)return null;minimise();const changed=text$7(attemptId)&&attemptId!==state.attemptId;if(text$7(attemptId)&&attemptId!==state.trialAttemptId)state.trialAttemptId=``;if(changed){state.finished=false;selectAttempt(attemptId,stepId)}else if(text$7(stepId)&&stepId!==state.stepId){if(steps.value.length)selectStep(stepId);else Object.assign(state,{stepId,beat:0})}remember();const here=String(router?.currentRoute?.value?.path||``);const home=!state.finished&&Boolean(value.practiceSlug)&&projectSlugFromPathname(here)===value.practiceSlug?here:value.lessonStage===`project`?learnHomePath(value):layout?.value?.studio&&here?here:learnHomePath(value);const target=withLesson(home);if(router&¤tPath()!==target)await router.push(target);await nextTick$1();layout?.value?.showProject?.();if(changed||!lesson.value&&!state.loading)await loadLesson();else if(!lesson.value)await lessonLoad;return focus.value}function minimise(by=``){if(!state.open)return;state.hiddenBy=by===`learner`?`learner`:``;state.open=false;state.minimised=true;flushReader()}const closeCourses=()=>minimise(`learner`);function hideLesson(){layout?.value?.hideLesson?.()}const toggleLesson=()=>layout?.value?.lessonShown?hideLesson():openLesson();async function showFinished(){if(!state.attemptId)return null;state.finished=Boolean(complete.value);return openLesson()}function finishedBy(before,attemptId){if(!before&&complete.value&&attemptId===state.attemptId)showFinished().catch(()=>{})}function selectStep(stepId,beat=0){if(!steps.value.some(step=>step.id===stepId)||stepId===state.stepId)return;state.stepId=stepId;state.scroll=0;state.beat=beat;remember();scheduleReaderSave()}function setScroll(scroll){const value=Math.max(0,Math.round(Number(scroll)||0));if(value===state.scroll)return;state.scroll=value;remember();scheduleReaderSave()}function scheduleReaderSave(){clearTimeout(saveTimer);saveTimer=setTimeout(flushReader,READER_SAVE_DELAY_MS)}function flushReader(){clearTimeout(saveTimer);saveTimer=null;if(!state.actorKey||!state.attemptId||!state.stepId||lesson.value?.attempt?.ended)return null;const body={stepId:state.stepId,scroll:state.scroll};const key=JSON.stringify([state.attemptId,body]);if(key===lastSaved)return null;lastSaved=key;return Promise.resolve(request(VIBE64_LEARNING_ROUTES.readerSave(state.attemptId),{method:`POST`,body})).catch(()=>{if(lastSaved===key)lastSaved=``})}async function stepAction(kind,route,stepId,extra={}){if(!state.attemptId||state.busy)return null;const attemptId=state.attemptId;const key=JSON.stringify([attemptId,kind,stepId,extra]);const requestId=pendingRequestId(key);const expected=viewer;const before=complete.value;state.busy=`${kind}:${stepId}`;state.lessonError=``;try{const result=await request(route(attemptId),{method:`POST`,body:{stepId,...extra,requestId}});if(result?.ok===false)throw new Error(result.error||`The step result was not confirmed. Try again.`);pending.delete(key);if(expected===viewer&&attemptId===state.attemptId){await loadLesson(attemptId);finishedBy(before,attemptId)}return result}catch(cause){if(expected===viewer)state.lessonError=String(cause?.message||`The step result was not confirmed. Try again.`);return null}finally{if(state.busy===`${kind}:${stepId}`)state.busy=``}}function exerciseStep(projectSlug){const value=lesson.value;const step=currentStep.value;const attempt=value?.attempt;if(!state.actorKey||!state.attemptId||state.open||!text$7(projectSlug)||!(value?.schemaVersion>=2)||attempt?.attemptId!==state.attemptId||attempt.ended||attempt.preparation?.phase!==`ready`||value.practiceProjectSlug!==projectSlug||step?.check?.kind!==`auto`||step.check.files?.length)return null;return{attemptId:state.attemptId,stepId:step.id}}function beginExercise(projectSlug){const target=exerciseStep(projectSlug);if(!target||exerciseObservations.size>=MAX_EXERCISE_OBSERVATIONS)return null;return Object.freeze({...target,projectSlug,actorKey:state.actorKey,viewer})}function exerciseCurrent(ticket){const target=ticket&&ticket.viewer===viewer&&ticket.actorKey===state.actorKey?exerciseStep(ticket.projectSlug):null;return Boolean(target&&target.attemptId===ticket.attemptId&&target.stepId===ticket.stepId)}async function finishExercise(ticket,{sessionId,instanceId,interactionId,requestId}={}){if(!exerciseCurrent(ticket)||!text$7(sessionId)||exerciseObservations.has(requestId))return null;exerciseObservations.add(requestId);const expected=viewer;const before=complete.value;try{const result=await request(VIBE64_LEARNING_ROUTES.stepObserve(ticket.attemptId),{method:`POST`,body:{stepId:ticket.stepId,observation:{control:`exercise-response`,exercise:{instanceId,interactionId,requestId},workspace:{projectSlug:ticket.projectSlug,sessionId,projectVisible:true,pane:`preview`,ready:true}}}});if(result?.ok===false)throw new Error(result.error||`The App press was not recorded. Press the App's button again.`);if(expected===viewer&&ticket.attemptId===state.attemptId){await loadLesson(ticket.attemptId);finishedBy(before,ticket.attemptId)}return result}catch(cause){if(expected===viewer)state.lessonError=String(cause?.message||`The App press was not recorded. Press the App's button again.`);return null}finally{exerciseObservations.delete(requestId)}}function prepareExercise(projectSlug){if(!text$7(projectSlug)||!state.actorKey||!state.attemptId||lesson.value||state.loading)return null;return loadLesson(state.attemptId)}const runCheck=stepId=>stepAction(`check`,VIBE64_LEARNING_ROUTES.stepCheck,stepId);const answer=(stepId,selected)=>stepAction(`answer`,VIBE64_LEARNING_ROUTES.stepAnswer,stepId,{selected:[...selected].map(Number).sort((left,right)=>left-right)});const done=stepId=>stepAction(`done`,VIBE64_LEARNING_ROUTES.stepDone,stepId);const review=stepId=>stepAction(`review`,VIBE64_LEARNING_ROUTES.stepReview,stepId);const savedReview=stepId=>results.value.filter(result=>result?.stepId===stepId&&result.review).at(-1)||null;async function showMe(stepId=currentStep.value?.id){const step=steps.value.find(value=>value.id===stepId);if(step?.beats?.length){minimise();player.start(stepId);return{beats:true}}if(!step?.guide)throw new Error(`This step has nothing to show.`);minimise();return goTo(step.guide)}async function goTo(guide){let command=showMeCommand(guide,{projectSlug:lesson.value?.practiceProjectSlug||``});const navigator=browserNavigation?.value||null;if(navigator&&command.databaseView){if(!selectedSession(command.projectSlug)){await navigator({projectSlug:command.projectSlug});await waitForProjectView(command.projectSlug,selectedSession)}const sessionId=selectedSession(command.projectSlug);if(sessionId)command={...command,sessionId}}const navigateBrowser=navigator&&command.guide.filePath?async navigation=>{const focus=await navigator(navigation);await waitForProjectView(command.projectSlug);return focus}:navigator;return(runGuide||runTrainingGuideCommand)(command,{navigateBrowser,view:{openFile(path){const handle=projectView(command.projectSlug);return handle?handle.openFile(path)===true:false}}})}function projectView(projectSlug){const handle=colleagueView?.value;return projectSlug&&handle?.projectSlug===projectSlug&&handle.ready!==false&&typeof handle.openFile===`function`?handle:null}function selectedSession(projectSlug){const handle=colleagueView?.value;return projectSlug&&handle?.projectSlug===projectSlug&&text$7(handle.sessionId)?handle.sessionId:``}async function waitForProjectView(projectSlug,published=projectView){const deadline=now()+PROJECT_VIEW_WAIT_MS;while(!published(projectSlug)&&now()<deadline)await new Promise(resolve=>setTimeout(resolve,50))}function teachMe(stepId=currentStep.value?.id){if(!state.attemptId||!stepId)throw new Error(`Open a lesson step before asking Colleague to teach it.`);selectStep(stepId);return askColleague(`teach`,{message:VIBE64_LEARNING_TEACH_MESSAGE,stepId})}function askColleague(kind,{message,stepId}){colleagueRequest.value=Object.freeze({id:`${kind}-${now()}-${Math.random().toString(36).slice(2,8)}`,kind,...message?{message}:{},actorKey:state.actorKey,attemptId:state.attemptId,stepId});return colleagueRequest.value}function doItForMeKind(beat=player.beat.value){if(beat?.kind!==`do`)return``;if(beat.target===`send-message`)return`send`;if(beat.target===`file-opened`)return beat.path?`navigate`:``;if([`agent-finished`,`app-pressed`,`colleague-minimised`].includes(beat.target))return``;if(beat.target===`learning`)return`point`;if([`chat`,`courses`,`colleague`,`lesson`,`reload-preview`].includes(beat.target))return beat.target;const open=learningVocabulary.place(beat.target)?.open;return open?.pane||open?.route?`navigate`:`point`}async function doItForMe(){const beat=player.beat.value;const kind=doItForMeKind(beat);const projectSlug=lesson.value?.practiceProjectSlug||``;if(kind===`send`){const view=colleagueView?.value;if(!projectSlug||view?.projectSlug!==projectSlug||typeof view.sendLessonMessage!==`function`)return false;return await view.sendLessonMessage(beat.prompt)===true}if(kind===`navigate`)return goTo({target:beat.target===`file-opened`?`files`:beat.target,navigate:true,...beat.path?{filePath:beat.path}:{}});if(kind===`chat`){layout?.value?.showChat?.();await nextTick$1();globalThis.document?.querySelector?.(`[data-vibe64-guide="chat"] textarea`)?.focus();return true}if(kind===`courses`)return show();if(kind===`lesson`)return openLesson({stepId:currentStep.value?.id});if(kind===`colleague`){askColleague(`open`,{stepId:currentStep.value?.id||``});return true}if(kind===`reload-preview`){await goTo({target:`preview`,navigate:true});await nextTick$1();const reload=globalThis.document?.querySelector?.(`[data-vibe64-guide="reload-preview"]`);if(!reload)return false;reload.click();return true}if(kind===`point`)return player.point();return false}function stuck(stepId=currentStep.value?.id){if(!state.attemptId||!stepId)throw new Error(`Open a lesson step before asking Colleague for help.`);return askColleague(`stuck`,{message:VIBE64_LEARNING_STUCK_MESSAGE,stepId})}function consumeColleagueRequest(id){if(colleagueRequest.value?.id!==id)return null;const value=colleagueRequest.value;colleagueRequest.value=null;return value}const openCurrent=()=>openLesson();async function opened(outcome){if(!outcome?.attemptId||outcome.current===false)return outcome;const value=await modeWith(outcome.attemptId);state.trialAttemptId=value&&value.currentAttemptId!==outcome.attemptId?outcome.attemptId:``;await openLesson({attemptId:outcome.attemptId});readPractice();return outcome}function admitted(attemptId){minimise();(async()=>{await settledMode();if(mode.value?.on&&mode.value.currentAttemptId===attemptId)await openLesson({attemptId})})().catch(()=>{})}async function startLesson(selection,start){confirmArchive.value=null;try{return await opened(await start(selection,{onAdmitted:admitted}))}catch(cause){if(cause?.code!==VIBE64_LESSON_IN_PROGRESS_CODE)throw cause;confirmArchive.value=Object.freeze({next:selection,start,current:Object.freeze({attemptId:String(cause.details?.attemptId||mode.value?.currentAttemptId||``),lessonTitle:String(cause.details?.lessonTitle||mode.value?.lessonTitle||mode.value?.lessonCode||``)})});return null}}function openOrientation(){if(state.actorKey)state.orientationRequested=true}function orientationAnswered(){state.orientationRequested=false}async function confirmArchiveAndStart(){const value=confirmArchive.value;if(!value)return null;confirmArchive.value=null;return opened(await value.start({...value.next,archiveCurrent:true},{onAdmitted:admitted}))}function cancelArchive(){confirmArchive.value=null}async function readRevision(){const result=await request(VIBE64_LEARNING_ROUTES.learning,{method:`GET`});if(result?.ok!==true||!Number.isSafeInteger(result.revision))throw new Error(result?.error||`Your saved lessons could not be read. Try again.`);return result.revision}async function attemptAction(kind,url,body=()=>({}),fallback=`The change was not confirmed. Try again.`){if(!state.actorKey||state.busy)return null;const expected=viewer;state.busy=kind;state.attemptsError=``;attemptsErrorFromRead=false;try{const result=await request(url,{method:`POST`,body:await body()});if(result?.ok!==true)throw new Error(result?.error||fallback);if(expected===viewer)await Promise.all([readLearningMode(),readPractice()]);return result}catch(cause){if(expected===viewer){state.attemptsError=String(cause?.message||fallback);attemptsErrorFromRead=false}return null}finally{if(state.busy===kind)state.busy=``}}const currentAttemptId=()=>mode.value?.currentAttemptId||``;function finish(summary=null){const attemptId=state.attemptId;if(!attemptId)return Promise.resolve(null);if(finishRun?.attemptId===attemptId)return finishRun.promise;const run={attemptId,summary,promise:attemptAction(`finish`,VIBE64_LEARNING_ROUTES.lessonFinish(attemptId),async()=>({expectedRevision:await readRevision()}),`Finishing the lesson was not confirmed. Try again.`).then(result=>{if(finishRun===run&&!result)finishRun=null;if(result&&state.trialAttemptId===attemptId)state.trialAttemptId=``;return result})};finishRun=run;return run.promise}const finishSummary=()=>finishRun?.attemptId&&finishRun.attemptId===state.attemptId?finishRun.summary:null;async function restart(){const attemptId=currentAttemptId();if(!attemptId)return null;const key=JSON.stringify([attemptId,`restart`]);const result=await attemptAction(`restart`,VIBE64_LEARNING_ROUTES.lessonRestart(attemptId),async()=>({requestId:pendingRequestId(key),expectedRevision:await readRevision()}),`Restarting the lesson was not confirmed. Try again.`);if(!result)return null;pending.delete(key);await opened({attemptId:mode.value?.currentAttemptId||result.active?.attemptId||``});return result}async function deleteAttempt(){const attemptId=currentAttemptId();if(!attemptId)return null;return attemptAction(`delete`,VIBE64_LEARNING_ROUTES.lessonDelete(attemptId),()=>({confirmed:true}),`Deleting the lesson was not confirmed. Try again.`)}const deleteArchived=attemptId=>attemptAction(`archive-delete:${attemptId}`,VIBE64_LEARNING_ROUTES.archiveDelete(attemptId),()=>({confirmed:true}),`Deleting the archived lesson was not confirmed. Try again.`);async function readPractice(){if(!state.actorKey)return null;const expected=++practiceReads;try{const value=normalizePractice(await request(VIBE64_LEARNING_ROUTES.practice,{method:`GET`}));if(expected===practiceReads){practice.value=value;if(attemptsErrorFromRead){state.attemptsError=``;attemptsErrorFromRead=false}}}catch(cause){if(expected===practiceReads&&(!state.attemptsError||attemptsErrorFromRead)){state.attemptsError=String(cause?.message||`Your lessons could not be read. Try again.`);attemptsErrorFromRead=true}}return practice.value}async function readNotes(){if(!state.actorKey)return null;const expected=viewer;notesState.loading=true;notesState.error=``;try{const result=await request(VIBE64_LEARNING_ROUTES.notes,{method:`GET`});if(result?.ok!==true||!result.notes)throw new Error(result?.error||`The notes could not be read.`);if(expected===viewer&&!(result.notes.revision<(notes.value?.revision??0)))notes.value=Object.freeze({...result.notes});return expected===viewer?notes.value:null}catch(cause){if(expected===viewer)notesState.error=String(cause?.message||`The notes could not be read.`);return null}finally{if(expected===viewer)notesState.loading=false}}async function writeNotes(kind,route,body){if(!state.actorKey||notesState.saving)return null;const expected=viewer;const expectedRevision=notes.value?.revision??0;const key=JSON.stringify([`notes`,kind,body.text??``,expectedRevision]);const requestId=pendingRequestId(key);notesState.saving=true;notesState.error=``;try{const result=await request(route,{method:`POST`,body:{...body,requestId,expectedRevision}});if(result?.ok!==true||!result.notes)throw new Error(result?.error||`The notes save was not confirmed. Try again.`);pending.delete(key);if(expected===viewer)notes.value=Object.freeze({...result.notes});return result}catch(cause){if(expected===viewer){notesState.error=String(cause?.message||`The notes save was not confirmed. Try again.`);if(cause?.code===`VIBE64_TRAINING_NOTES_CHANGED`){pending.delete(key);const message=notesState.error;await readNotes();notesState.error=message}}return null}finally{if(expected===viewer)notesState.saving=false}}function saveNotes(text){const value=String(text??``);if(!value||value.length>VIBE64_LEARNING_NOTES_MAX){notesState.error=`Write between 1 and ${VIBE64_LEARNING_NOTES_MAX} characters, or clear the notes.`;return Promise.resolve(null)}return writeNotes(`update`,VIBE64_LEARNING_ROUTES.notes,{text:value})}const clearNotes=()=>writeNotes(`clear`,VIBE64_LEARNING_ROUTES.notesClear,{});function learnerChanged(payload={}){if(payload.reason===`notes`)return notes.value?readNotes():null;if(!state.actorKey)return null;if(payload.reason!==`steps`){readLearningMode();if(practice.value.loaded)readPractice()}if(state.attemptId&&(!payload.attemptId||payload.attemptId===state.attemptId)&&lesson.value)return loadLesson(state.attemptId);return null}return Object.freeze({state:readonly(state),get open(){return state.open},get coursesOpen(){return state.open},get minimised(){return state.minimised},get hiddenBy(){return state.hiddenBy},get surface(){return state.surface},get attemptId(){return state.attemptId},get stepId(){return currentStep.value?.id||``},get scroll(){return state.scroll},get complete(){return complete.value},get finished(){return state.finished},get mode(){return mode.value},get learnMode(){return learnMode.value},get lessonAttemptId(){return lessonAttemptId.value},get stepBarVisible(){return stepBarVisible.value},get aiRequired(){return aiRequired.value},get lessonTitle(){return mode.value?.currentAttemptId?mode.value.lessonTitle||mode.value.lessonCode||``:``},get practice(){return practice.value},get confirmArchive(){return confirmArchive.value},get lessonSwitchable(){return Boolean(layout?.value?.studio)},get lessonShown(){return Boolean(layout?.value?.lessonShown)},get notice(){return state.notice},get orientationRequested(){return state.orientationRequested},lesson,results,steps,currentStep,focus,colleagueRequest,notes,notesState:readonly(notesState),player,stepStatus:stepId=>stepStatus(results.value,stepId,lesson.value?.passedStepIds||[]),setViewer,show,openCourses,openLesson,hideLesson,toggleLesson,closeCourses,showFinished,finishSummary,minimise,selectStep,setScroll,flushReader,loadLesson,runCheck,answer,done,review,savedReview,reviewNote,showMe,teachMe,stuck,doItForMe,doItForMeKind,consumeColleagueRequest,learnerChanged,exerciseStep,beginExercise,exerciseCurrent,finishExercise,prepareExercise,readNotes,saveNotes,clearNotes,readLearningMode,setMode,toggleMode,modePlace,openCurrent,showNotice,clearNotice,startLesson,openOrientation,orientationAnswered,admitted,opened,confirmArchiveAndStart,cancelArchive,restart,finish,deleteAttempt,readPractice,deleteArchived})}function orientationSelection(catalogue,saved){if(catalogue?.ok!==true||!Array.isArray(catalogue.courses)||saved?.ok!==true||saved.available!==true||!Number.isSafeInteger(saved.revision))return null;const startable=catalogue.courses.filter(course=>course?.enabled===true&&text$7(course.orientation)&&(course.status===`released`||catalogue.canTryPreviews===true)&&course.lessons?.some(lesson=>lesson?.code===course.orientation&&lesson.status===`published`));const course=startable.find(value=>value.status===`released`)||startable[0];return course?Object.freeze({courseId:course.courseId,release:course.release,lessonCode:course.orientation,expectedRevision:saved.revision}):null}function openLessonLink(event,browser=globalThis){const link=event?.target?.closest?.(`a[href]`);if(!link||event.defaultPrevented||event.button>0||event.metaKey||event.ctrlKey||event.shiftKey||event.altKey)return false;let url;try{url=new URL(link.getAttribute(`href`),browser.location?.href)}catch{return false}if(!/^https?:$/u.test(url.protocol)||url.origin===browser.location?.origin)return false;event.preventDefault();browser.open?.(url.href,`_blank`,`noopener,noreferrer`);return true}function revealCurrentStep(list){const current=list?.querySelector?.(`[aria-current="step"]`);if(!current||!(list.scrollWidth>list.clientWidth))return false;const row=list.getBoundingClientRect();const item=current.getBoundingClientRect();if(item.left<row.left)list.scrollLeft-=row.left-item.left;else if(item.right>row.right)list.scrollLeft+=item.right-row.right;else return false;return true}function createPageActivity(){const listeners=new Set;return Object.freeze({report(name,detail={}){if(!learningVocabulary.events().has(name))throw new TypeError(`Unknown page activity: ${name}`);const event=Object.freeze({name,projectSlug:String(detail.projectSlug||``),sessionId:String(detail.sessionId||``),path:String(detail.path||``)});for(const listener of[...listeners])listener(event)},subscribe(listener){listeners.add(listener);return()=>listeners.delete(listener)}})}function usePageActivity(){const activity=inject$1(VIBE64_PAGE_ACTIVITY_KEY,null);return(name,detail)=>activity?.report(name,detail)}var _sfc_main$62={__name:`Vibe64AssistantShellContext`,props:{local:Boolean},setup(__props){if(__props.local)provide(VIBE64_ASSISTANT_VIEWER_KEY,Object.freeze({actorKey:`local`}));provide(VIBE64_ASSISTANT_HOST_KEY,shallowRef(null));const colleagueView=shallowRef(null);provide(VIBE64_COLLEAGUE_VIEW_KEY,colleagueView);provide(VIBE64_COLLEAGUE_PREVIEW_KEY,shallowRef(null));provide(VIBE64_COLLEAGUE_INTEGRATIONS_KEY,shallowRef(null));provide(VIBE64_COLLEAGUE_DATABASE_KEY,shallowRef(null));provide(VIBE64_COLLEAGUE_PLAN_KEY,shallowRef(null));const layout=shallowRef(null);provide(VIBE64_COLLEAGUE_LAYOUT_KEY,layout);const browserNavigation=shallowRef(null);provide(VIBE64_BROWSER_NAVIGATION_KEY,browserNavigation);const pageFocus=shallowRef(null);provide(VIBE64_PAGE_FOCUS_KEY,pageFocus);const pageActivity=createPageActivity();provide(VIBE64_PAGE_ACTIVITY_KEY,pageActivity);provide(VIBE64_LEARNING_KEY,createVibe64Learning({browserNavigation,colleagueView,layout,pageFocus,pageActivity,router:useRouter$1()}));provide(VIBE64_COLLEAGUE_LAUNCHER_KEY,shallowRef(null));return(_ctx,_cache)=>{return renderSlot(_ctx.$slots,`default`)}}};function projectConversationVoiceState({turns=[],status=`ready`,interimReply=null}={}){const messages=[];let streamingReply=null;for(const turn of turns){if(turn.user)messages.push({...turn.user,role:`user`,id:turn.user.messageId||`${turn.turnId}:user`});if(turn.assistant?.text){const reply={...turn.assistant,role:`assistant`,id:turn.assistant.outputId||`${turn.turnId}:assistant`};if(turn.pending||[`starting`,`inProgress`].includes(reply.status)){if(reply.origin===`application`)Object.assign(reply,{id:`${reply.id}:stream`,autonomous:true});streamingReply=reply}else messages.push(reply)}}return{messages,streamingReply:interimReply?{...interimReply,id:interimReply.outputId||interimReply.id}:streamingReply,status}}var jskit$10={"assistant":{"voice":{"assistant":`Assistant`,"dialog":{"label":`{title} conversation`,"minimize":`Minimize conversation`,"close":`Close conversation`,"modes":`Conversation mode`,"talk":`Talk`,"text":`Text`},"host":{"close":`Close voice chat`,"switchPrompt":`Finish or discard your recording for {current} before switching to {next}.`,"thisConversation":`this conversation`,"anotherConversation":`another conversation`,"stayHere":`Stay here`,"discardAndSwitch":`Discard and switch`,"switch":`Switch`,"stopWork":`Stop agent work`,"reopen":`{label} · Voice chat`},"conversation":{"listening":`Listening`,"speaking":`Speaking`,"captions":`Voice conversation text`,"recognizedWords":`Recognized words`,"you":`You`,"youHearing":`You · Hearing…`,"youNotSent":`You · Not sent`,"latestAnswer":`{target} latest answer`},"controls":{"label":`{target} voice chat controls`,"sendOrDiscard":`Send or discard speech to send text.`,"listening":`Listening…`,"recordingFinish":`Recording · finish speech to send text.`,"finishSpeech":`Finish speech to send text.`,"connecting":`Connecting…`,"releaseToSend":`Release to send`,"pause":`Pause`,"talk":`Talk`,"notSent":`Not sent · {words}`,"soundBlocked":`Sound is blocked. Enable sound to hear future replies.`,"enableSound":`Enable sound`,"review":`Review voice message`,"reviewMessage":`Review your message`,"discard":`Discard`,"sending":`Sending…`,"send":`Send`,"stopTargetSpeaking":`Stop {target} speaking`,"stopSpeaking":`Stop speaking`,"talkHint":`click or long press to talk`,"readAloudOff":`Turn {target} read-aloud off`,"readAloudOn":`Read {target} answers aloud`,"spokenRepliesOn":`Spoken replies on`,"spokenRepliesOff":`Spoken replies off`,"tapToPause":`Tap to pause · hold to speak`,"tapForHandsFree":`Tap for hands-free · hold to speak`},"settings":{"title":`Voice settings`,"speakingVoice":`Speaking voice`,"speakingVoiceHint":`Applies to the next spoken reply`},"avatar":{"label":`Assistant avatar`},"status":{"interrupted":`Voice interrupted`,"needsAttention":`Voice needs attention`,"starting":`Starting voice…`,"active":`Voice active`,"off":`Voice off`,"reconnecting":`Reconnecting…`,"connecting":`Connecting…`,"openingMicrophone":`Opening microphone…`,"openingMic":`Opening mic…`,"listeningToYou":`Listening to you`,"listening":`Listening`,"targetSpeaking":`{target} is speaking`,"speaking":`Speaking`,"preparingSpeech":`Preparing speech…`,"thinking":`Thinking`,"sending":`Sending your message…`,"review":`Review your message below`,"microphoneMuted":`Microphone muted`,"transcribing":`Transcribing…`,"holdToSpeak":`Hold to speak`,"preparingMicrophone":`Preparing microphone…`,"live":`Live conversation`},"narration":{"murmur":`Hmm...`},"speech":{"codeOnScreen":`I put the code on screen.`,"sqlOnScreen":`I put the SQL on screen.`,"detailsInChat":`The details are in the chat.`,"image":`an image`,"link":`a link`},"errors":{"notAccepted":`The conversation did not accept this message. Review it before retrying.`,"setupTimeout":`Voice setup took too long. Try Talk again.`,"finishAndReview":`{message} Tap the microphone to finish and review this recording.`,"microphoneNotReady":`The microphone was not ready. Hold the avatar again to record.`,"recordingInterrupted":`The connection interrupted this recording. These words may be incomplete. Review before sending, or discard and record again.`,"noSpeech":`No speech was recognized. Try again.`,"couldNotContinue":`Voice could not continue.`,"interruptedRecording":`Voice connection was interrupted. Your unfinished recording needs review; use Talk to resume.`,"interrupted":`Voice connection was interrupted. The answer remains in chat; use Talk to resume.`,"speechStalled":`Speech generation stalled. The answer remains in chat; use Talk to resume.`,"notConnected":`Voice is not connected.`,"playbackUnsupported":`This browser does not support streamed audio playback.`,"soundBlocked":`Sound is blocked by this browser.`,"busy":`Voice is busy. Try again shortly.`,"serviceCouldNotContinue":`Voice service could not continue.`,"invalidResponse":`Voice service sent an invalid response.`,"conversationRequired":`Voice requires an available conversation.`,"connectTimeout":`Voice service took too long to connect.`,"couldNotConnect":`Voice could not connect. Try again.`,"unreachable":`Voice service could not be reached.`,"closedWhileConnecting":`Voice service closed while connecting.`,"microphoneInUse":`Finish the recording in the other conversation before starting this microphone.`,"microphoneBehind":`The microphone connection fell behind. Review the unfinished recording before sending.`,"microphoneDenied":`Microphone access was denied. Allow it in your browser to talk to the assistant.`,"microphoneUnavailable":`The microphone could not be opened on this device.`,"pageSuspended":`Voice paused when this page was suspended. Review any unfinished words and use Talk to resume.`,"speechNotConfigured":`A speech service is not configured for this conversation.`,"noLongerAvailable":`This conversation is no longer available for voice.`,"hostDisposed":`The voice host has been disposed.`,"notAvailable":`This conversation is not available for voice.`,"finishBeforeEnding":`Finish or discard your recording before ending voice.`},"protocol":{"chooseVoice":`Choose an available voice before starting speech.`},"daemon":{"operationFailed":`Voice operation failed.`,"speechFailed":`Speech could not be generated.`,"queueClosing":`Voice speech queue is shutting down.`,"queueUnavailable":`Voice speech queue is unavailable.`,"capacityBusy":`Voice speech capacity is currently busy. Try again shortly.`,"speechTooFast":`Speech is arriving faster than playback.`,"audioWithoutRecording":`Audio arrived without an active recording.`,"noRecording":`No matching voice recording is active.`,"voiceUnavailable":`This voice is unavailable. Choose another voice.`},"proxy":{"voicesUnavailable":`Speaking voices could not load. Check the speech service and retry.`,"notInstalled":`Voice is not installed on this server.`,"unreachable":`Voice service could not be reached.`,"busy":`Voice is busy. Try again shortly.`,"sessionFailed":`Voice could not open for this conversation.`}}},"errors":{"voice_turn_id_invalid":`Voice control messages require a valid turn ID.`,"voice_control_size_invalid":`Voice control message size is invalid.`,"voice_control_json_invalid":`Voice control messages must be valid JSON.`,"voice_control_object_required":`Voice control messages must be JSON objects.`,"voice_control_type_invalid":`Unsupported voice control type: {type}.`,"voice_input_sample_rate_invalid":`Voice input must be {sampleRate} Hz mono PCM.`,"voice_segment_invalid":`Choose the current spoken phrase.`,"voice_revision_invalid":`Choose the current recognized utterance.`,"voice_speech_text_invalid":`Speech text must contain 1-{maximum} characters.`,"voice_audio_frame_invalid":`Voice audio frames must contain bounded 16-bit mono PCM.`,"voice_utterance_too_long":`Voice recordings are limited to {seconds} seconds.`,"voice_recognition_backpressure":`Speech recognition fell behind. Your recording may be incomplete; review the recognized words.`,"voice_speech_not_active":`No matching speech stream is open.`,"voice_access_revoked":`This application's voice access was revoked.`,"voice_playback_backpressure":`Voice playback fell behind. Speech stopped; the answer remains in chat.`,"voice_auth_required":`Voice access was denied.`,"voice_frame_too_large":`Voice message is too large.`,"voice_connecting":`Voice is still connecting. Try again.`}};var en_default$10={jskit:jskit$10};var VOICE_INPUT_SAMPLE_RATE=16e3;var VOICE_OUTPUT_SAMPLE_RATE=22050;var VOICE_DEFAULT_SYNTHESIS_TIMEOUT_MS=2e4;var VOICE_MAX_SYNTHESIS_TIMEOUT_MS=12e4;var VOICE_MAX_SPEECH_TEXT_CHARACTERS=4e3;var VOICE_MAX_SPEECH_CHUNK_CHARACTERS=280;var VOICE_SPEECH_EM_DASH_PAUSE_MS=140;var VOICE_SPEECH_SENTENCE_PAUSE_MS=220;var VOICE_SPEECH_LINE_PAUSE_MS=350;var VOICE_SPEECH_PARAGRAPH_PAUSE_MS=650;var VOICE_SPEECH_WORDING=Object.freeze({code:catalogMessage(en_default$10,`jskit.assistant.voice.speech.codeOnScreen`),sql:catalogMessage(en_default$10,`jskit.assistant.voice.speech.sqlOnScreen`),details:catalogMessage(en_default$10,`jskit.assistant.voice.speech.detailsInChat`),image:catalogMessage(en_default$10,`jskit.assistant.voice.speech.image`),link:catalogMessage(en_default$10,`jskit.assistant.voice.speech.link`)});var BUILT_IN_RECOGNITION_PHRASES=Object.freeze([[/\bc plus plus\b/giu,`C++`],[/\b(?:j|jay)\s+(?:s|ess)\s+kit\b/giu,`JSKIT`],[/\bnode\s+(?:(?:j|jay)\s+(?:s|ess)|js)\b/giu,`Node.js`],[/\bpostgres\s+(?:s\s+)?q\s+l\b/giu,`PostgreSQL`],[/\bweb socket\b/giu,`WebSocket`],[/\bsherpa onnx\b/giu,`sherpa-onnx`]]);var BUILT_IN_RECOGNITION_SPELLINGS=Object.freeze({acl:`ACL`,ai:`AI`,api:`API`,cmake:`CMake`,codex:`Codex`,env:`ENV`,erd:`ERD`,fastify:`Fastify`,git:`Git`,github:`GitHub`,http:`HTTP`,https:`HTTPS`,hmac:`HMAC`,id:`ID`,javascript:`JavaScript`,jskit:`JSKIT`,json:`JSON`,mariadb:`MariaDB`,mysql:`MySQL`,npm:`npm`,onnx:`ONNX`,opencode:`OpenCode`,openai:`OpenAI`,playwright:`Playwright`,postgresql:`PostgreSQL`,pty:`PTY`,sql:`SQL`,systemd:`systemd`,typescript:`TypeScript`,uuid:`UUID`,vitest:`Vitest`,vue:`Vue`,vuetify:`Vuetify`,websocket:`WebSocket`,zipformer:`Zipformer`});var BUILT_IN_RECOGNITION_WORD_PATTERN=new RegExp(`\\b(?:${Object.keys(BUILT_IN_RECOGNITION_SPELLINGS).join(`|`)})\\b`,`giu`);function speechTextFromAssistant(value=``,maximumCharacters=VOICE_MAX_SPEECH_TEXT_CHARACTERS,wording=VOICE_SPEECH_WORDING){let omittedCode=false;let omittedTable=false;let text=String(value||``).slice(0,maximumCharacters*2);text=text.replace(/```([a-z0-9_-]*)[^\n]*\n[\s\S]*?```/giu,(_match,language)=>{omittedCode=true;return String(language||``).toLowerCase()===`sql`?` ${wording.sql} `:` ${wording.code} `});text=text.replace(/(?:^|\n)\s*\|[^\n]+\|\s*(?=\n|$)/gu,()=>{omittedTable=true;return`
|
|
7
|
+
`});text=text.replace(/!\[[^\]]*\]\([^)]*\)/gu,()=>` ${wording.image} `).replace(/\[([^\]]+)\]\([^)]*\)/gu,`$1`).replace(/https?:\/\/\S+/giu,()=>` ${wording.link} `).replace(/`([^`\n]+)`/gu,`$1`).replace(/^[\t ]{0,3}#{1,6}[\t ]+/gmu,``);text=text.split(/\r?\n/u).map((line,index)=>{const marker=line.match(/^[\t ]*(?:[-*+]|\d+[.)])[\t ]+/u);return(index?marker?`
|
|
8
|
+
|
|
9
|
+
`:`
|
|
10
|
+
`:``)+line.slice(marker?.[0].length||0).replace(/_+/gu,` `).replace(/[*~>]/gu,``).replace(/[^\S\r\n]+/gu,` `).trim()}).join(``).replace(/\n{3,}/gu,`
|
|
11
|
+
|
|
12
|
+
`);if(omittedTable&&!/details (?:are|remain) in (?:the )?chat/iu.test(text)&&!text.includes(wording.details))text=`${text}${text?` `:``}${wording.details}`;if(omittedCode&&!text)text=wording.code;return text.slice(0,maximumCharacters)}function speechPhrases(value=``){const text=String(value||``);const phrases=[];let start=0;const appendThrough=end=>{const phrase=text.slice(start,end).replace(/^[\t ]+|[\t ]+$/gu,``);if(phrase)phrases.push(phrase);start=end};for(let index=0;index<text.length;index+=1){const character=text[index];if(character===`
|
|
13
|
+
`){let end=index+1;while(/\s/u.test(text[end]||``))end+=1;appendThrough(end);index=end-1;continue}if([`—`,`–`].includes(character)){let end=index+1;while(/\s/u.test(text[end]||``))end+=1;if(!text.slice(index+1,end).includes(`
|
|
14
|
+
`))end=index+1;appendThrough(end);index=end-1;continue}if(![`.`,`!`,`?`].includes(character))continue;let end=index+1;while([`.`,`!`,`?`].includes(text[end]))end+=1;while([`"`,`'`,`”`,`’`,`»`,`)`,`]`].includes(text[end]))end+=1;if(end===text.length||/\s/u.test(text[end])){let whitespaceEnd=end;while(/\s/u.test(text[whitespaceEnd]||``))whitespaceEnd+=1;if(text.slice(end,whitespaceEnd).includes(`
|
|
15
|
+
`))end=whitespaceEnd;appendThrough(end);index=end-1}}appendThrough(text.length);return phrases}function speechPauseDurationMs(value=``){const raw=String(value||``).replace(/[\t ]+$/u,``);if(/\n\s*\n$/u.test(raw))return VOICE_SPEECH_PARAGRAPH_PAUSE_MS;if(raw.endsWith(`
|
|
16
|
+
`))return VOICE_SPEECH_LINE_PAUSE_MS;const text=raw.trim();if(/[.!?]+["'”’»)\]]*$/u.test(text))return VOICE_SPEECH_SENTENCE_PAUSE_MS;if(/[—–]+$/u.test(text))return VOICE_SPEECH_EM_DASH_PAUSE_MS;return 0}function splitSpeechText(value=``,maximumCharacters=280){const text=speechTextFromAssistant(value);const maximum=Number.isInteger(maximumCharacters)&&maximumCharacters>=80?maximumCharacters:280;if(!text)return[];const chunks=[];for(const phraseValue of speechPhrases(text)){let phrase=phraseValue;while(phrase.length>maximum){const boundary=Math.max(phrase.lastIndexOf(` `,maximum),phrase.lastIndexOf(`,`,maximum),phrase.lastIndexOf(`;`,maximum));const splitAt=boundary>=Math.floor(maximum*.55)?boundary:maximum;chunks.push(phrase.slice(0,splitAt).trim());phrase=phrase.slice(splitAt).replace(/^[\t ]+/u,``)}if(phrase)chunks.push(phrase)}return chunks}function takeStreamingSpeech(text=``,final=false,maximumCharacters=140,wording=VOICE_SPEECH_WORDING){const source=String(text);if(/^\s*\|/u.test(source)){const lines=source.split(`
|
|
17
|
+
`);let consumed=0;for(const[index,line]of lines.entries()){if(line.trim()&&!/^\s*\|/u.test(line))break;if(index===lines.length-1&&!final)return null;consumed+=line.length+(index<lines.length-1?1:0)}if(consumed){const boundary=source.slice(0,consumed).match(/(?:\r?\n[\t ]*)+$/u)?.[0]||``;return{text:speechTextFromAssistant(`${wording.details}${boundary}`,void 0,wording),consumed}}}let fence=false;let inline=false;let link=0;let target=false;let end=0;for(let index=0;index<source.length;index+=1){const character=source[index];if(source.slice(index,index+3)==="```"){fence=!fence;index+=2;continue}if(fence)continue;if(character==="`"){inline=!inline;continue}if(inline)continue;if(character===`[`)link+=1;if(character===`]`&&link){link-=1;if(source[index+1]===`(`)target=true;else if(index===source.length-1&&!final)break}if(target&&character===`)`)target=false;if(link||target)continue;if(!/\s/u.test(character))continue;let whitespaceEnd=index+1;while(/\s/u.test(source[whitespaceEnd]||``))whitespaceEnd+=1;const hasLineBreak=source.slice(index,whitespaceEnd).includes(`
|
|
18
|
+
`);if(!final&&hasLineBreak&&(whitespaceEnd===source.length||/^(?:[-*+]|\d+[.)]?)$/u.test(source.slice(whitespaceEnd))))break;const prefix=source.slice(0,index).trimEnd();if(/[.!?]["'”’»)\]]*$/u.test(prefix)||prefix.length>=Math.min(40,maximumCharacters/2)&&/[,;:—–]$/u.test(prefix)||prefix.length>=maximumCharacters||hasLineBreak){end=whitespaceEnd;break}index=whitespaceEnd-1}if(!end&&final)end=source.length;if(!end)return null;let raw=source.slice(0,end);if(/\n[\t ]*$/u.test(raw)&&/^(?:[-*+]|\d+[.)])[\t ]+/u.test(source.slice(end)))raw=`${raw.trimEnd()}\n\n`;if(final&&fence)raw=raw.replace(/```[\s\S]*$/u,()=>` ${wording.code} `);return{text:speechTextFromAssistant(raw,void 0,wording),consumed:end}}var CAPTURE_WORKLET_NAME=`jskit-voice-capture`;var CAPTURE_FLUSH_TIMEOUT_MS=500;var CAPTURE_WORKLET_SOURCE=`
|
|
19
|
+
class AssistantVoiceCapture extends AudioWorkletProcessor {
|
|
20
|
+
constructor() {
|
|
21
|
+
super();
|
|
22
|
+
this.accepting = true;
|
|
23
|
+
this.muted = false;
|
|
24
|
+
this.frames = [];
|
|
25
|
+
this.length = 0;
|
|
26
|
+
this.port.onmessage = (event) => {
|
|
27
|
+
if (event.data?.type === "mute") {
|
|
28
|
+
this.muted = event.data.muted;
|
|
29
|
+
if (!event.data.preserveBuffered) {
|
|
30
|
+
this.frames = [];
|
|
31
|
+
this.length = 0;
|
|
32
|
+
}
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (event.data?.type !== "flush") return;
|
|
36
|
+
this.accepting = false;
|
|
37
|
+
this.emit();
|
|
38
|
+
this.port.postMessage({ type: "flushed" });
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
emit() {
|
|
43
|
+
if (!this.length) return;
|
|
44
|
+
const samples = new Float32Array(this.length);
|
|
45
|
+
let offset = 0;
|
|
46
|
+
for (const frame of this.frames) {
|
|
47
|
+
samples.set(frame, offset);
|
|
48
|
+
offset += frame.length;
|
|
49
|
+
}
|
|
50
|
+
this.frames = [];
|
|
51
|
+
this.length = 0;
|
|
52
|
+
this.port.postMessage(samples, [samples.buffer]);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
process(inputs) {
|
|
56
|
+
if (!this.accepting || this.muted) return true;
|
|
57
|
+
const input = inputs[0]?.[0];
|
|
58
|
+
if (!input?.length) return true;
|
|
59
|
+
this.frames.push(Float32Array.from(input));
|
|
60
|
+
this.length += input.length;
|
|
61
|
+
if (this.length >= 1024) this.emit();
|
|
62
|
+
return true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
registerProcessor("${CAPTURE_WORKLET_NAME}", AssistantVoiceCapture);
|
|
66
|
+
`;function float32ToPcm16ArrayBuffer(samples){const output=new ArrayBuffer(samples.length*2);const view=new DataView(output);for(let index=0;index<samples.length;index+=1){const sample=Math.max(-1,Math.min(1,Number(samples[index])||0));view.setInt16(index*2,sample<0?sample*32768:sample*32767,true)}return output}async function createMicrophoneCapture({onLevel,onPcm,targetSampleRate=16e3}={}){const AudioContextCtor=window.AudioContext||window.webkitAudioContext;if(!AudioContextCtor)throw new Error(`This browser does not support microphone audio processing.`);const stream=await navigator.mediaDevices.getUserMedia({audio:{autoGainControl:true,channelCount:1,echoCancellation:true,noiseSuppression:true,sampleRate:{ideal:targetSampleRate}},video:false});const stopTracks=()=>{for(const track of stream.getTracks())track.stop()};let context=null;try{context=new AudioContextCtor({latencyHint:`interactive`,sampleRate:targetSampleRate});await context.resume();if(Number(context.sampleRate)!==targetSampleRate)throw new Error(`This browser could not capture ${targetSampleRate} Hz microphone audio.`);const workletUrl=URL.createObjectURL(new Blob([CAPTURE_WORKLET_SOURCE],{type:`text/javascript`}));try{await context.audioWorklet.addModule(workletUrl)}finally{URL.revokeObjectURL(workletUrl)}const source=context.createMediaStreamSource(stream);const capture=new AudioWorkletNode(context,CAPTURE_WORKLET_NAME,{channelCount:1,numberOfInputs:1,numberOfOutputs:1,outputChannelCount:[1]});const silence=context.createGain();silence.gain.value=0;let finishFlush=null;let muted=false;let preserveBuffered=false;capture.port.onmessage=event=>{if(event.data?.type===`flushed`){finishFlush?.();return}if(muted&&!preserveBuffered)return;const samples=event.data instanceof Float32Array?event.data:new Float32Array(event.data);let squaredTotal=0;for(const sample of samples)squaredTotal+=sample*sample;onLevel?.(samples.length?Math.min(1,Math.sqrt(squaredTotal/samples.length)*7):0);onPcm?.(float32ToPcm16ArrayBuffer(samples))};source.connect(capture);capture.connect(silence);silence.connect(context.destination);let closePromise=null;const flush=()=>new Promise(resolve=>{let finished=false;const timeout=globalThis.setTimeout(()=>{if(!finished){finished=true;finishFlush=null;resolve()}},CAPTURE_FLUSH_TIMEOUT_MS);finishFlush=()=>{if(finished)return;finished=true;globalThis.clearTimeout(timeout);finishFlush=null;resolve()};try{capture.port.postMessage({type:`flush`})}catch{finishFlush()}});return Object.freeze({setMuted(value,{preserveBuffered:retainTail=false}={}){const nextPreserveBuffered=Boolean(value)&&retainTail;if(muted===Boolean(value)&&preserveBuffered===nextPreserveBuffered)return;const keepBuffered=nextPreserveBuffered||!value&&preserveBuffered;muted=Boolean(value);preserveBuffered=nextPreserveBuffered;for(const track of stream.getTracks())track.enabled=!muted;capture.port.postMessage({type:`mute`,muted,...keepBuffered?{preserveBuffered:true}:{}});if(muted)onLevel?.(0)},close(){if(!closePromise)closePromise=(async()=>{try{await flush()}finally{onLevel?.(0);capture.port.onmessage=null;try{source.disconnect();capture.disconnect();silence.disconnect()}finally{stopTracks();await context.close()}}})();return closePromise}})}catch(error){stopTracks();if(context&&context.state!==`closed`)await context.close().catch(()=>null);throw error}}registerJskitMessages(en_default$10);var{errorMessage:errorMessage$1,t:t$21}=useJskitText();function voiceError(key,params={}){return Object.assign(new Error(formatMessage(catalogMessage(en_default$10,key),params)),{messageCode:key.slice(6),messageParams:params})}function voiceEventError(event,fallbackKey){if(!event?.message)return voiceError(fallbackKey);const{code,params,messageCode,messageParams}=event;return Object.assign(new Error(String(event.message)),Object.fromEntries(Object.entries({code,params,messageCode,messageParams}).filter(([,value])=>value!==void 0)))}function voiceErrorText(cause){return errorMessage$1(cause,typeof cause===`string`?cause:``)}function voiceSpeechWording(){return{code:t$21(`jskit.assistant.voice.speech.codeOnScreen`),sql:t$21(`jskit.assistant.voice.speech.sqlOnScreen`),details:t$21(`jskit.assistant.voice.speech.detailsInChat`),image:t$21(`jskit.assistant.voice.speech.image`),link:t$21(`jskit.assistant.voice.speech.link`)}}var MOUTH_POSES=new Set([`closed`,`open`,`round`,`small`,`wide`]);function pcm16ArrayBufferToFloat32(buffer){const source=new DataView(buffer);const samples=new Float32Array(Math.floor(source.byteLength/2));for(let index=0;index<samples.length;index+=1)samples[index]=source.getInt16(index*2,true)/32768;return samples}function normalizeSpeechSegment(message={},sampleRate=VOICE_OUTPUT_SAMPLE_RATE){const sampleCount=Math.max(0,Math.floor(Number(message.sampleCount)||0));const durationMs=sampleCount?sampleCount/Math.max(1,Number(sampleRate)||22050)*1e3:Math.max(0,Number(message.durationMs)||0);return{cues:(Array.isArray(message.cues)?message.cues:[]).map(cue=>({atMs:Math.min(durationMs,Math.max(0,Number(cue?.atMs)||0)),level:Math.min(1,Math.max(0,Number(cue?.level)||0)),pose:MOUTH_POSES.has(String(cue?.pose||``))?String(cue.pose):`closed`})).sort((left,right)=>left.atMs-right.atMs),durationMs,remainingSamples:sampleCount,sampleCount,startedAt:null}}function visemeCueAtTime(segments=[],currentTime=0){const segment=segments.find(entry=>Number.isFinite(entry?.startedAt)&¤tTime>=entry.startedAt&¤tTime<=entry.startedAt+entry.durationMs/1e3);if(!segment)return null;const elapsedMs=Math.max(0,(currentTime-segment.startedAt)*1e3);let active=null;for(const cue of segment.cues){if(cue.atMs>elapsedMs)break;active=cue}return active}var WEBSOCKET_OPEN=1;var microphoneOwner=null;var speechOwner=ref(null);function createVoiceTurnId(prefix=`turn`){return`${prefix}-${globalThis.crypto?.randomUUID?.()||`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`}`}function resolveWebSocketUrl(value){const url=new URL(value,globalThis.location?.href);if(url.protocol===`http:`)url.protocol=`ws:`;if(url.protocol===`https:`)url.protocol=`wss:`;if(![`ws:`,`wss:`].includes(url.protocol)||url.username||url.password||url.hash)throw new TypeError(`Voice requires a ws:// or wss:// endpoint without embedded credentials.`);return url.toString()}function useVoiceTransport({socketUrl,speechEnabled=true,interruptSpeechOnListen=false,autoReconnect=false,voiceId=``,onPlayback}={}){const{serverMessage,t}=useJskitText();const availableVoices=ref([]);const selectedVoice=ref(voiceId);const connectionState=ref(`idle`);const captureState=ref(`idle`);const speechState=ref(`idle`);const error=ref(``);const playbackBlocked=ref(false);const transcript=ref(``);const endpoint=ref(null);const completedUtterance=ref(null);const utteranceReset=ref(null);const utteranceStale=ref(null);const partialTranscript=ref(``);const muted=ref(false);const microphoneMuted=ref(false);const inputLevel=ref(0);const mouthLevel=ref(0);const mouthPose=ref(`closed`);const ready=ref(false);const reconnecting=ref(false);const bufferedSeconds=ref(0);const synthesisPending=ref(0);const activeListenTurnId=ref(``);const activeSpeechTurnId=ref(``);let socket=null;let connectedSocketPath=``;let connectPromise=null;let recoveryTimer;let recoveryAttempt=0;let recoveryWanted=false;let heartbeatTimer;let lastPongAt=0;let lastSpeechProgressAt=0;let synthesisTimeoutMs=VOICE_DEFAULT_SYNTHESIS_TIMEOUT_MS;let lastStartedSegmentIndex=-1;let microphone=null;let preserveBufferedMicrophone=false;const openingMicrophones=new Set;let microphoneClaim=null;const speechClaim=Symbol(`voice playback`);let pendingListenTurnId=``;let unmounted=false;let playbackContext=null;let playbackGain=null;let playbackAnalyser=null;let playbackFrame=0;let playbackPreparation=0;let nextPlaybackTime=0;let playbackEpoch=0;let playbackReceipt=null;let playbackQueue=Promise.resolve();let queuedPlaybackFrames=0;let speechStreamEnded=false;let speechSampleRate=VOICE_OUTPUT_SAMPLE_RATE;let receivingTurnId=``;let receivingSegment=null;const speechInputEnded=ref(true);let stopAfterSegment=Infinity;const streamedSegments=new Map;let pendingVisemeSegments=[];let scheduledVisemeSegments=[];const playbackSources=new Set;const speechOutputEnabled=computed(()=>{return(typeof speechEnabled===`function`?speechEnabled():speechEnabled?.value??speechEnabled)!==false&&!muted.value});const selectedSocketPath=computed(()=>typeof socketUrl===`function`?socketUrl():socketUrl?.value||socketUrl||``);const state=computed(()=>error.value?`error`:captureState.value!==`idle`?captureState.value:speechState.value!==`idle`?speechState.value:connectionState.value);const listening=computed(()=>captureState.value===`listening`);const speaking=computed(()=>speechState.value===`speaking`);const busy=computed(()=>captureState.value!==`idle`||connectionState.value===`connecting`||speechState.value===`thinking`);const canAppendSpeech=computed(()=>Boolean(activeSpeechTurnId.value)&&!speechInputEnded.value&&synthesisPending.value<2&&bufferedSeconds.value<4);function emitPlayback(phase,reason){const receipt=playbackReceipt;if(!receipt||receipt.terminal||phase===`started`&&receipt.started)return;if(phase===`started`)receipt.started=true;else receipt.terminal=true;try{Promise.resolve(onPlayback?.({turnId:receipt.turnId,phase,...reason?{reason}:{}})).catch(()=>{})}catch{}}function observePlaybackStart(source){if(!source.voiceCancelled&&playbackContext.state===`running`&&playbackContext.currentTime>=source.voiceStartsAt)emitPlayback(`started`)}function setError(message=``,reason=`playback-error`){pendingListenTurnId=``;endpoint.value=null;activeListenTurnId.value=``;closeMicrophone().catch(()=>null);stopPlayback(`failed`,reason);error.value=String(message||t(`jskit.assistant.voice.errors.couldNotContinue`));captureState.value=`idle`;connectionState.value=`idle`}function scheduleRecovery(){if(!autoReconnect||unmounted||!recoveryWanted||recoveryTimer)return;if(recoveryAttempt>=5){reconnecting.value=false;return}reconnecting.value=true;recoveryTimer=setTimeout(()=>{recoveryTimer=null;recoveryAttempt+=1;connect({recovery:true}).catch(()=>scheduleRecovery())},Math.min(8e3,750*2**recoveryAttempt)+Math.floor(Math.random()*250))}function connectionLost(message){message||=activeListenTurnId.value||pendingListenTurnId?t(`jskit.assistant.voice.errors.interruptedRecording`):t(`jskit.assistant.voice.errors.interrupted`);const wasActive=Boolean(activeListenTurnId.value||pendingListenTurnId||activeSpeechTurnId.value||reconnecting.value);setError(message,`disconnected`);disconnect({preserveError:true});recoveryWanted=autoReconnect&&wasActive;scheduleRecovery()}function heartbeat(){if(!activeListenTurnId.value&&!activeSpeechTurnId.value){lastPongAt=Date.now();return}if(Date.now()-lastPongAt>12e3){connectionLost();return}if(activeSpeechTurnId.value&&synthesisPending.value&&Date.now()-lastSpeechProgressAt>synthesisTimeoutMs){connectionLost(t(`jskit.assistant.voice.errors.speechStalled`));return}if(socket?.readyState===WEBSOCKET_OPEN)sendControl({type:`ping`,turnId:`heartbeat`})}function sendControl(payload){if(socket?.readyState!==WEBSOCKET_OPEN)throw voiceError(`jskit.assistant.voice.errors.notConnected`);socket.send(JSON.stringify(payload))}async function closeMicrophone(){const current=microphone;const claim=microphoneClaim;microphone=null;inputLevel.value=0;try{await current?.close?.()}finally{if(microphoneOwner===claim)microphoneOwner=null}}function stopMouthMeter(){if(playbackFrame){cancelAnimationFrame(playbackFrame);playbackFrame=0}mouthLevel.value=0;mouthPose.value=`closed`}function startMouthMeter(){if(playbackFrame||!playbackAnalyser)return;const samples=new Float32Array(playbackAnalyser.fftSize);const spectrum=new Uint8Array(playbackAnalyser.frequencyBinCount);const averageBand=(fromHz,toHz)=>{const binWidth=playbackContext.sampleRate/playbackAnalyser.fftSize;const start=Math.max(0,Math.floor(fromHz/binWidth));const end=Math.min(spectrum.length,Math.ceil(toHz/binWidth));let total=0;for(let index=start;index<end;index+=1)total+=spectrum[index];return total/Math.max(1,end-start)};const update=()=>{for(const source of playbackSources)observePlaybackStart(source);bufferedSeconds.value=Math.max(0,nextPlaybackTime-playbackContext.currentTime);playbackAnalyser.getFloatTimeDomainData(samples);playbackAnalyser.getByteFrequencyData(spectrum);let sum=0;for(const sample of samples)sum+=sample*sample;const level=Math.min(1,Math.sqrt(sum/samples.length)*7);scheduledVisemeSegments=scheduledVisemeSegments.filter(segment=>playbackContext.currentTime<=segment.startedAt+segment.durationMs/1e3+.5);const viseme=visemeCueAtTime(scheduledVisemeSegments,playbackContext.currentTime);mouthLevel.value=viseme?Math.max(level,viseme.level):level;if(viseme?.pose===`closed`||!viseme&&level<.035)mouthPose.value=`closed`;else if(viseme)mouthPose.value=viseme.pose;else{const low=averageBand(120,700);const middle=averageBand(700,2100);const high=averageBand(2100,4800);if(level>.63)mouthPose.value=`open`;else if(low>(middle+high)*.72)mouthPose.value=`round`;else if(middle+high>low*1.55)mouthPose.value=`wide`;else mouthPose.value=`small`}if(speaking.value||playbackSources.size)playbackFrame=requestAnimationFrame(update);else stopMouthMeter()};playbackFrame=requestAnimationFrame(update)}async function preparePlayback(){const AudioContextCtor=window.AudioContext||window.webkitAudioContext;if(!AudioContextCtor){playbackBlocked.value=true;throw voiceError(`jskit.assistant.voice.errors.playbackUnsupported`)}if(!playbackContext||playbackContext.state===`closed`){playbackContext=new AudioContextCtor({latencyHint:`interactive`});playbackGain=playbackContext.createGain();playbackAnalyser=playbackContext.createAnalyser();playbackAnalyser.fftSize=1024;playbackAnalyser.smoothingTimeConstant=.58;playbackGain.connect(playbackAnalyser);playbackAnalyser.connect(playbackContext.destination)}playbackGain.gain.value=speechOutputEnabled.value?1:0;const context=playbackContext;const preparation=++playbackPreparation;try{const resumed=context.resume();if(preparation===playbackPreparation&&context.state!==`running`)playbackBlocked.value=true;await resumed;if(context.state!==`running`)throw voiceError(`jskit.assistant.voice.errors.soundBlocked`);if(preparation===playbackPreparation&&!unmounted)playbackBlocked.value=false}catch(cause){if(preparation!==playbackPreparation&&context===playbackContext&&context.state===`running`&&!unmounted)return;if(preparation===playbackPreparation&&!unmounted)playbackBlocked.value=true;throw cause}}function finishPlaybackWhenDrained(){if(!activeSpeechTurnId.value||!speechStreamEnded||playbackSources.size||queuedPlaybackFrames)return;if(playbackReceipt?.started)emitPlayback(`completed`);else emitPlayback(`failed`,`playback-error`);activeSpeechTurnId.value=``;speechState.value=`idle`;if(speechOwner.value===speechClaim)speechOwner.value=null;stopMouthMeter()}function claimVisemeTiming(sampleCount,startsAt){let remaining=sampleCount;let offsetSamples=0;while(remaining>0&&pendingVisemeSegments.length){const segment=pendingVisemeSegments[0];if(!Number.isFinite(segment.startedAt)){segment.startedAt=startsAt+offsetSamples/speechSampleRate;scheduledVisemeSegments.push(segment)}const consumed=Math.min(remaining,segment.remainingSamples);segment.remainingSamples-=consumed;remaining-=consumed;offsetSamples+=consumed;if(segment.remainingSamples<=0)pendingVisemeSegments.shift()}}async function schedulePcm(buffer,epoch=playbackEpoch,segment=null){if(epoch!==playbackEpoch||segment&&segment.index>stopAfterSegment)return;await preparePlayback();if(epoch!==playbackEpoch)return;if(segment&&segment.index>stopAfterSegment)return;const samples=pcm16ArrayBufferToFloat32(buffer);if(!samples.length)return;const audioBuffer=playbackContext.createBuffer(1,samples.length,speechSampleRate);audioBuffer.copyToChannel(samples,0);const source=playbackContext.createBufferSource();source.buffer=audioBuffer;source.voiceSegment=segment;source.connect(playbackGain);const startsAt=Math.max(playbackContext.currentTime+.025,nextPlaybackTime);nextPlaybackTime=startsAt+audioBuffer.duration;source.voiceStartsAt=startsAt;source.voiceEndsAt=nextPlaybackTime;if(segment){if(!Number.isFinite(segment.startedAt)){segment.startedAt=startsAt;if(segment.metadata)scheduledVisemeSegments.push({...segment.metadata,startedAt:startsAt})}}else claimVisemeTiming(samples.length,startsAt);bufferedSeconds.value=Math.max(0,nextPlaybackTime-playbackContext.currentTime);playbackSources.add(source);speechState.value=`speaking`;source.onended=()=>{source.disconnect();if(epoch!==playbackEpoch)return;if(!source.voiceCancelled&&playbackContext.state===`running`)emitPlayback(`started`);playbackSources.delete(source);bufferedSeconds.value=playbackSources.size?Math.max(0,nextPlaybackTime-playbackContext.currentTime):0;if(!playbackSources.size)speechState.value=`thinking`;finishPlaybackWhenDrained()};source.start(startsAt);startMouthMeter()}function enqueuePcm(buffer){const epoch=playbackEpoch;const segment=receivingSegment;queuedPlaybackFrames+=1;playbackQueue=playbackQueue.then(()=>schedulePcm(buffer,epoch,segment)).catch(playbackError=>{if(epoch===playbackEpoch)setError(voiceErrorText(playbackError))}).finally(()=>{if(epoch!==playbackEpoch)return;queuedPlaybackFrames-=1;finishPlaybackWhenDrained()})}function stopPlayback(phase=`interrupted`,reason=`cancelled`){emitPlayback(phase,reason);playbackEpoch+=1;activeSpeechTurnId.value=``;speechState.value=`idle`;if(speechOwner.value===speechClaim)speechOwner.value=null;playbackQueue=Promise.resolve();queuedPlaybackFrames=0;for(const source of playbackSources)try{source.voiceCancelled=true;source.stop()}catch{}playbackSources.clear();nextPlaybackTime=0;speechStreamEnded=true;speechInputEnded.value=true;stopAfterSegment=Infinity;bufferedSeconds.value=0;synthesisPending.value=0;synthesisTimeoutMs=VOICE_DEFAULT_SYNTHESIS_TIMEOUT_MS;lastStartedSegmentIndex=-1;receivingTurnId=``;receivingSegment=null;streamedSegments.clear();pendingVisemeSegments=[];scheduledVisemeSegments=[];stopMouthMeter()}function handleControlMessage(message={}){const type=String(message.type||``);if(type===`pong`){lastPongAt=Date.now();return}if(type===`voice.ready`){availableVoices.value=Array.isArray(message.voices)?message.voices:[];if(!availableVoices.value.some(voice=>voice.id===selectedVoice.value))selectedVoice.value=message.defaultVoice||``;lastPongAt=Date.now();clearInterval(heartbeatTimer);heartbeatTimer=setInterval(heartbeat,4e3);reconnecting.value=false;recoveryWanted=false;recoveryAttempt=0;ready.value=true;error.value=``;connectionState.value=`idle`;return}if(type===`transcript.partial`&&message.turnId===activeListenTurnId.value){endpoint.value=null;partialTranscript.value=String(message.text||``);transcript.value=partialTranscript.value;return}if(type===`transcript.endpoint`&&message.turnId===activeListenTurnId.value){endpoint.value={turnId:message.turnId,revision:message.revision,text:String(message.text||``)};return}if([`transcript.reset`,`transcript.stale`].includes(type)&&message.turnId===activeListenTurnId.value){endpoint.value=null;if(type===`transcript.reset`){utteranceReset.value={turnId:message.turnId,revision:message.revision};transcript.value=``;partialTranscript.value=``}else utteranceStale.value={turnId:message.turnId,revision:message.revision};return}if(type===`transcript.final`&&message.turnId===activeListenTurnId.value){inputLevel.value=0;transcript.value=String(message.text||``);partialTranscript.value=``;endpoint.value=null;if(message.continuous)completedUtterance.value={text:transcript.value,turnId:message.turnId,revision:message.revision};else{activeListenTurnId.value=``;captureState.value=`idle`}return}if(type===`speech.start`){receivingTurnId=String(message.turnId||``);receivingSegment=null;if(!message.turnId||message.turnId!==activeSpeechTurnId.value)return;speechSampleRate=Number(message.sampleRate)||22050;speechStreamEnded=false;speechState.value=`thinking`;nextPlaybackTime=0;return}if(type===`speech.segment.start`&&message.turnId===activeSpeechTurnId.value){if(!speechStreamEnded&&Number.isSafeInteger(message.segmentIndex)&&message.segmentIndex>lastStartedSegmentIndex){lastStartedSegmentIndex=message.segmentIndex;synthesisTimeoutMs=VOICE_DEFAULT_SYNTHESIS_TIMEOUT_MS;if(Number.isSafeInteger(message.synthesisTimeoutMs)&&message.synthesisTimeoutMs>2e4&&message.synthesisTimeoutMs<=12e4){synthesisTimeoutMs=message.synthesisTimeoutMs;lastSpeechProgressAt=Date.now()}}receivingSegment={index:message.segmentIndex};streamedSegments.set(message.segmentIndex,receivingSegment);return}if(type===`speech.chunk.end`&&message.turnId===activeSpeechTurnId.value){synthesisTimeoutMs=VOICE_DEFAULT_SYNTHESIS_TIMEOUT_MS;lastSpeechProgressAt=Date.now();synthesisPending.value=Math.max(0,synthesisPending.value-1);return}if(type===`speech.segment`&&message.turnId===activeSpeechTurnId.value&&!speechStreamEnded){const segment=normalizeSpeechSegment(message,speechSampleRate);const streamed=streamedSegments.get(message.segmentIndex);if(streamed){streamed.metadata=segment;if(Number.isFinite(streamed.startedAt))scheduledVisemeSegments.push({...segment,startedAt:streamed.startedAt});streamedSegments.delete(message.segmentIndex)}else if(segment.sampleCount)pendingVisemeSegments.push(segment);return}if(type===`speech.end`&&message.turnId===activeSpeechTurnId.value){speechStreamEnded=true;finishPlaybackWhenDrained();return}if(type===`busy`||type===`error`){const turnId=String(message.turnId||``);if(turnId&&turnId!==activeListenTurnId.value&&turnId!==activeSpeechTurnId.value)return;setError(serverMessage(message,type===`busy`?t(`jskit.assistant.voice.errors.busy`):t(`jskit.assistant.voice.errors.serviceCouldNotContinue`)))}}function handleSocketMessage(event){if(event.data instanceof ArrayBuffer){if(speechOutputEnabled.value&&activeSpeechTurnId.value&&receivingTurnId===activeSpeechTurnId.value&&!speechStreamEnded){synthesisTimeoutMs=VOICE_DEFAULT_SYNTHESIS_TIMEOUT_MS;lastSpeechProgressAt=Date.now();enqueuePcm(event.data)}return}let message;try{message=JSON.parse(String(event.data||``))}catch{setError(t(`jskit.assistant.voice.errors.invalidResponse`));return}handleControlMessage(message)}function disconnect({preserveError=false}={}){clearInterval(heartbeatTimer);const current=socket;socket=null;connectedSocketPath=``;connectPromise=null;ready.value=false;current?.close?.(1e3,`Voice client closed`);connectionState.value=`idle`;if(!preserveError)error.value=``}async function connect({recovery=false}={}){if(!recovery){clearTimeout(recoveryTimer);recoveryTimer=null;recoveryAttempt=0;recoveryWanted=false;reconnecting.value=false}const path=selectedSocketPath.value;if(!path)throw voiceError(`jskit.assistant.voice.errors.conversationRequired`);if(connectedSocketPath===path&&socket?.readyState===WEBSOCKET_OPEN&&ready.value)return true;if(connectedSocketPath===path&&connectPromise)return connectPromise;disconnect({preserveError:recovery});connectionState.value=`connecting`;if(!recovery)error.value=``;ready.value=false;connectedSocketPath=path;const nextSocket=new WebSocket(resolveWebSocketUrl(path));socket=nextSocket;nextSocket.binaryType=`arraybuffer`;connectPromise=new Promise((resolve,reject)=>{const timeout=setTimeout(()=>{reject(voiceError(`jskit.assistant.voice.errors.connectTimeout`));nextSocket.close()},8e3);const onReady=event=>{if(event.data instanceof ArrayBuffer)return;try{const message=JSON.parse(String(event.data||``));if(![`voice.ready`,`error`,`busy`].includes(message.type))return;clearTimeout(timeout);nextSocket.removeEventListener(`message`,onReady);if(message.type===`voice.ready`)resolve(true);else reject(voiceEventError(message,`jskit.assistant.voice.errors.couldNotConnect`))}catch{}};nextSocket.addEventListener(`message`,onReady);nextSocket.addEventListener(`error`,()=>{clearTimeout(timeout);reject(voiceError(`jskit.assistant.voice.errors.unreachable`))},{once:true});nextSocket.addEventListener(`close`,()=>{clearTimeout(timeout);reject(voiceError(`jskit.assistant.voice.errors.closedWhileConnecting`))},{once:true})});nextSocket.addEventListener(`message`,event=>{if(socket===nextSocket)handleSocketMessage(event)});nextSocket.addEventListener(`close`,()=>{if(socket!==nextSocket)return;socket=null;connectPromise=null;ready.value=false;clearInterval(heartbeatTimer);if(pendingListenTurnId||![`idle`,`error`].includes(state.value))connectionLost()});try{return await connectPromise}catch(connectionError){if(socket===nextSocket){if(!recovery)setError(voiceErrorText(connectionError));disconnect({preserveError:true})}throw connectionError}}async function startListening({continuous=false}={}){if(unmounted||pendingListenTurnId||activeListenTurnId.value)return false;if(microphoneOwner&µphoneOwner!==microphoneClaim){error.value=t(`jskit.assistant.voice.errors.microphoneInUse`);return false}microphoneClaim=Symbol(`voice microphone`);microphoneOwner=microphoneClaim;preserveBufferedMicrophone=false;const turnId=createVoiceTurnId(`listen`);pendingListenTurnId=turnId;if(interruptSpeechOnListen)stopSpeaking();captureState.value=`connecting`;error.value=``;try{await connect();if(pendingListenTurnId!==turnId)return false;captureState.value=`opening`;let capture;try{const opening=createMicrophoneCapture({onLevel(level){if(activeListenTurnId.value===turnId&&!microphoneMuted.value)inputLevel.value=Number(level)||0},onPcm(frame){if((!microphoneMuted.value||preserveBufferedMicrophone)&&socket?.readyState===WEBSOCKET_OPEN&&activeListenTurnId.value===turnId){if(socket.bufferedAmount>32768){connectionLost(t(`jskit.assistant.voice.errors.microphoneBehind`));return}socket.send(frame)}},targetSampleRate:VOICE_INPUT_SAMPLE_RATE});openingMicrophones.add(opening);try{capture=await opening}finally{openingMicrophones.delete(opening)}}catch(microphoneError){if(pendingListenTurnId!==turnId)return false;setError([`NotAllowedError`,`PermissionDeniedError`].includes(microphoneError?.name)?t(`jskit.assistant.voice.errors.microphoneDenied`):t(`jskit.assistant.voice.errors.microphoneUnavailable`));return false}if(pendingListenTurnId!==turnId){await capture.close();return false}microphone=capture;microphone.setMuted(microphoneMuted.value);activeListenTurnId.value=turnId;transcript.value=``;partialTranscript.value=``;try{endpoint.value=null;completedUtterance.value=null;sendControl({sampleRate:VOICE_INPUT_SAMPLE_RATE,turnId,type:`listen.start`,...continuous?{continuous:true}:{}});captureState.value=`listening`}catch(controlError){activeListenTurnId.value=``;await closeMicrophone();throw controlError}return true}catch(startError){if(pendingListenTurnId!==turnId)return false;setError(voiceErrorText(startError));throw startError}finally{if(pendingListenTurnId===turnId)pendingListenTurnId=``}}function finishUtterance(candidate,{discard=false}={}){if(candidate!==endpoint.value||candidate?.turnId!==activeListenTurnId.value)return false;sendControl({turnId:candidate.turnId,revision:candidate.revision,type:discard?`listen.discard`:`listen.commit`});endpoint.value=null;return true}async function stopListening(){if(!activeListenTurnId.value||!microphone)return;const turnId=activeListenTurnId.value;captureState.value=`transcribing`;await closeMicrophone();if(activeListenTurnId.value!==turnId)return;sendControl({turnId,type:`listen.stop`})}async function speak(text,turnId=createVoiceTurnId(`speak`),{stream=false}={}){const speechText=speechTextFromAssistant(text,void 0,voiceSpeechWording());if(unmounted||!speechOutputEnabled.value||!speechText)return false;if(activeSpeechTurnId.value&&socket?.readyState===WEBSOCKET_OPEN)sendControl({turnId:activeSpeechTurnId.value,type:`cancel`});stopPlayback();const epoch=playbackEpoch;playbackReceipt={turnId,started:false,terminal:false};activeSpeechTurnId.value=turnId;speechState.value=`thinking`;try{await preparePlayback();if(epoch!==playbackEpoch)return false;await connect();if(epoch!==playbackEpoch)return false;if(speechOwner.value)await new Promise(resolve=>{const unwatch=watch([speechOwner,activeSpeechTurnId],()=>{if(epoch!==playbackEpoch||!speechOwner.value){if(epoch===playbackEpoch)speechOwner.value=speechClaim;unwatch();resolve()}},{flush:`sync`})});else speechOwner.value=speechClaim;if(epoch!==playbackEpoch)return false;speechState.value=`thinking`;speechInputEnded.value=!stream;synthesisPending.value=1;lastSpeechProgressAt=Date.now();sendControl({text:speechText,turnId,type:`speak.start`,...stream?{stream:true}:{},...selectedVoice.value?{voiceId:selectedVoice.value}:{}});return true}catch(speechError){if(epoch!==playbackEpoch)return false;stopPlayback(`failed`,`playback-error`);speechState.value=`idle`;throw speechError}}function appendSpeech(text){if(!canAppendSpeech.value)return false;const speechText=speechTextFromAssistant(text,void 0,voiceSpeechWording());if(!speechText)return false;if(!synthesisPending.value)lastSpeechProgressAt=Date.now();synthesisPending.value+=1;sendControl({text:speechText,turnId:activeSpeechTurnId.value,type:`speak.append`});return true}function endSpeech(){if(!activeSpeechTurnId.value||speechInputEnded.value)return;speechInputEnded.value=true;sendControl({turnId:activeSpeechTurnId.value,type:`speak.end`})}function finishCurrentPhrase(){if(!activeSpeechTurnId.value)return;emitPlayback(`interrupted`,`cancelled`);const now=playbackContext?.currentTime||0;const current=[...playbackSources].find(source=>source.voiceEndsAt>now);if(!current?.voiceSegment){stopSpeaking();return}stopAfterSegment=current.voiceSegment.index;speechInputEnded.value=true;for(const source of[...playbackSources]){if(source.voiceSegment?.index<=stopAfterSegment)continue;source.voiceCancelled=true;source.stop();playbackSources.delete(source)}nextPlaybackTime=Math.max(now,...[...playbackSources].map(source=>source.voiceEndsAt));bufferedSeconds.value=Math.max(0,nextPlaybackTime-now);sendControl({type:`speak.stop-after`,turnId:activeSpeechTurnId.value,segmentIndex:stopAfterSegment})}function stopSpeaking(reason=`cancelled`){const turnId=activeSpeechTurnId.value;const pending=turnId&&!ready.value&&!activeListenTurnId.value&&!pendingListenTurnId;stopPlayback(`interrupted`,reason);if(turnId&&socket?.readyState===WEBSOCKET_OPEN)sendControl({turnId,type:`cancel`});if(pending)disconnect()}async function cancelListening(){const pending=pendingListenTurnId&&!activeSpeechTurnId.value&&!ready.value;pendingListenTurnId=``;const turnId=activeListenTurnId.value;endpoint.value=null;activeListenTurnId.value=``;captureState.value=`idle`;partialTranscript.value=``;transcript.value=``;try{if(turnId&&socket?.readyState===WEBSOCKET_OPEN)sendControl({turnId,type:`cancel`})}finally{const closing=closeMicrophone();if(pending)disconnect();await closing}}async function cancel(){const closing=cancelListening();stopSpeaking();await closing}async function close(){recoveryWanted=false;reconnecting.value=false;clearTimeout(recoveryTimer);recoveryTimer=null;const closing=cancel();disconnect();await Promise.all([closing,...[...openingMicrophones].map(opening=>opening.then(capture=>capture.close(),()=>{}))])}function toggleMuted(){muted.value=!muted.value}function setMicrophoneMuted(value,{preserveBuffered=false}={}){microphoneMuted.value=Boolean(value);preserveBufferedMicrophone=microphoneMuted.value&&preserveBuffered;microphone?.setMuted(microphoneMuted.value,{preserveBuffered});if(microphoneMuted.value)inputLevel.value=0}watch(speechOutputEnabled,enabled=>{if(playbackGain)playbackGain.gain.value=enabled?1:0;if(!enabled&&activeSpeechTurnId.value)stopSpeaking(`muted`)},{flush:`sync`});watch(selectedSocketPath,()=>{transcript.value=``;partialTranscript.value=``;close().catch(()=>null)},{flush:`sync`});function pauseForPageExit(){if(activeListenTurnId.value||pendingListenTurnId||activeSpeechTurnId.value)setError(t(`jskit.assistant.voice.errors.pageSuspended`));recoveryWanted=false;reconnecting.value=false;clearTimeout(recoveryTimer);recoveryTimer=null;disconnect({preserveError:true})}const page=globalThis.window||globalThis;page.addEventListener?.(`pagehide`,pauseForPageExit);onScopeDispose(()=>{page.removeEventListener?.(`pagehide`,pauseForPageExit);unmounted=true;clearTimeout(recoveryTimer);clearInterval(heartbeatTimer);pendingListenTurnId=``;activeListenTurnId.value=``;closeMicrophone().catch(()=>null);stopPlayback();disconnect();playbackContext?.close?.().catch(()=>null);playbackContext=null});return{availableVoices,selectedVoice,activeListenTurnId,activeSpeechTurnId,appendSpeech,bufferedSeconds,canAppendSpeech,endSpeech,captureState,completedUtterance,utteranceReset,utteranceStale,endpoint,finishUtterance,finishCurrentPhrase,busy,cancel,cancelListening,close,connect,error,inputLevel,listening,mouthLevel,mouthPose,microphoneMuted,muted,partialTranscript,playbackBlocked,preparePlayback,ready,reconnecting,speak,speaking,startListening,setMicrophoneMuted,state,stopListening,stopSpeaking,toggleMuted,transcript}}var ACTIVITY_SPEECH_CHARACTERS=300;function latestConversationFinalNarrationEntry(turns=[]){const conversationTurns=Array.isArray(turns)?turns:[];for(let turnIndex=conversationTurns.length-1;turnIndex>=0;turnIndex-=1){const turn=conversationTurns[turnIndex];const turnId=String(turn?.turnId||turnIndex+1).trim();const finalText=String(turn?.assistant?.text||``).trim();if(finalText&&turn.assistant.status!==`inProgress`)return{key:`final:${turnId}`,kind:`final`,text:finalText}}return null}function createConversationNarrationTracker(){let primed=false;let activityTurnId=``;const finalKeys=new Set;const activityText=new Map;function reset(){primed=false;activityTurnId=``;finalKeys.clear();activityText.clear()}function observe(turns=[],{includeFinals=false,settled=false,enabled=true,vocalizeThinking=false,vocalizeInterimTurns=false}={}){const conversationTurns=Array.isArray(turns)?turns:[];const turn=conversationTurns.at(-1);const turnId=String(turn?.turnId||conversationTurns.length).trim();if(turnId!==activityTurnId){activityTurnId=turnId;activityText.clear()}const activity=(Array.isArray(turn?.messages)?turn.messages:[]).filter(message=>[`thinking`,`commentary`].includes(message?.role));if(!activity.length)activity.push(...[...Array.isArray(turn?.thinking)?turn.thinking:[],...Array.isArray(turn?.commentary)?turn.commentary:[]].sort((left,right)=>String(left?.at||``).localeCompare(String(right?.at||``))));const entries=[];for(const[index,message]of activity.entries()){const kind=message?.role;if(![`thinking`,`commentary`].includes(kind)||message.status===`inProgress`)continue;const key=`${turnId}:${kind}:${message.messageId||index}`;const rawText=String(message.text||``);const phrases=speechPhrases(speechTextFromAssistant(rawText,Math.max(rawText.length,VOICE_MAX_SPEECH_TEXT_CHARACTERS)));const fullText=phrases.join(` `);if(!(settled||index<activity.length-1||Boolean(turn?.assistant))&&!speechPauseDurationMs(phrases.at(-1)))phrases.pop();const text=phrases.join(` `);const previous=activityText.get(key)||``;if(text.length<previous.length&&fullText.startsWith(previous))continue;activityText.set(key,text);if(!primed||!enabled||!(kind===`thinking`?vocalizeThinking:vocalizeInterimTurns)||!text.startsWith(previous))continue;for(const chunk of splitSpeechText(text.slice(previous.length),ACTIVITY_SPEECH_CHARACTERS))entries.push({kind,text:chunk})}const final=latestConversationFinalNarrationEntry(conversationTurns);if(!primed){if(final)finalKeys.add(final.key);primed=true;return[]}if(includeFinals&&final&&!finalKeys.has(final.key)){finalKeys.add(final.key);return enabled?[final]:[]}return entries}return{observe,reset}}function useVoiceConversation(binding,{socketUrl,createTransport=useVoiceTransport}={}){const{serverMessage,t}=useJskitText();const targetLabel=computed(()=>binding.label||t(`jskit.assistant.voice.assistant`));const readAloud=ref(binding.defaults?.readAloud===true);const readAloudChangePending=computed(()=>binding.readAloudChangePending===true);const soundPreparing=ref(false);let soundRevision=0;const conversationId=binding.conversationId||binding.id;const error=ref(``);const pendingTranscript=ref(null);const heldReview=ref(false);const holding=ref(false);const sending=ref(false);const takingTranscript=ref(false);const live=ref(false);const starting=ref(false);const callMode=ref(binding.defaults?.mode===`hands-free`?`hands-free`:`push-to-talk`);const changingCallMode=ref(false);const pushHolding=ref(false);let pushInput=null;let startupAbort=null;let decidedCandidate=``;let stopTimer;let committing=null;const voice=createTransport({socketUrl,voiceId:binding.defaults?.voiceId||``,speechEnabled:readAloud,interruptSpeechOnListen:false,autoReconnect:true,onPlayback:receivePlayback});watch([()=>binding.defaults?.voiceId,voice.availableVoices],([voiceId,voices])=>{if(voiceId===void 0)return;voice.selectedVoice.value=!voices.length||voices.some(voice=>voice.id===voiceId)?voiceId:``});const microphoneMuted=voice.microphoneMuted;const capturing=computed(()=>voice.captureState.value!==`idle`);const speechActive=computed(()=>Boolean(voice.activeSpeechTurnId.value));const callConnection=computed(()=>{if(voice.reconnecting.value)return t(`jskit.assistant.voice.status.interrupted`);if(error.value||voice.error.value)return t(`jskit.assistant.voice.status.needsAttention`);if(starting.value)return t(`jskit.assistant.voice.status.starting`);if(live.value)return t(`jskit.assistant.voice.status.active`);return t(`jskit.assistant.voice.status.off`)});const callStatus=computed(()=>{if(voice.reconnecting.value)return t(`jskit.assistant.voice.status.reconnecting`);if(starting.value)return t(`jskit.assistant.voice.status.starting`);if(live.value&&voice.captureState.value===`connecting`)return t(`jskit.assistant.voice.status.connecting`);if(live.value&&voice.captureState.value===`opening`)return t(`jskit.assistant.voice.status.openingMicrophone`);if(error.value||voice.error.value)return t(`jskit.assistant.voice.status.needsAttention`);if(!live.value)return``;if(pushHolding.value&&voice.listening.value)return t(`jskit.assistant.voice.status.listeningToYou`);if(voice.speaking.value)return t(`jskit.assistant.voice.status.targetSpeaking`,{target:targetLabel.value});if(speechActive.value)return t(`jskit.assistant.voice.status.preparingSpeech`);if(binding.state.status===`working`)return t(`jskit.assistant.voice.status.thinking`);if(sending.value)return t(`jskit.assistant.voice.status.sending`);if(pendingTranscript.value)return t(`jskit.assistant.voice.status.review`);if(microphoneMuted.value)return t(`jskit.assistant.voice.status.microphoneMuted`);if(voice.captureState.value===`transcribing`)return t(`jskit.assistant.voice.status.transcribing`);if(voice.listening.value)return t(`jskit.assistant.voice.status.listeningToYou`);return callMode.value===`push-to-talk`?t(`jskit.assistant.voice.status.holdToSpeak`):t(`jskit.assistant.voice.status.preparingMicrophone`)});const callModeBusy=computed(()=>starting.value||changingCallMode.value||pushHolding.value||sending.value||Boolean(pendingTranscript.value)||capturing.value&&Boolean(voice.partialTranscript.value.trim())||capturing.value&&!voice.listening.value);const avatarVisual=computed(()=>({avatar:binding.avatar,state:voice.speaking.value?`speaking`:pushHolding.value&&voice.listening.value?`listening`:binding.state.status===`working`?`thinking`:voice.listening.value&&!microphoneMuted.value?`listening`:`idle`,mouthLevel:voice.mouthLevel.value,mouthPose:voice.mouthPose.value}));const callAudioLevel=computed(()=>Math.max(0,Math.min(1,voice.speaking.value?voice.mouthLevel.value:voice.listening.value&&!microphoneMuted.value?voice.inputLevel.value:0)));const status=computed(()=>{const capture={connecting:`jskit.assistant.voice.status.connecting`,opening:`jskit.assistant.voice.status.openingMic`,listening:`jskit.assistant.voice.status.listening`,transcribing:`jskit.assistant.voice.status.transcribing`}[voice.captureState.value];return[starting.value?`jskit.assistant.voice.status.starting`:``,voice.reconnecting.value?`jskit.assistant.voice.status.reconnecting`:``,live.value?`jskit.assistant.voice.status.live`:``,microphoneMuted.value?`jskit.assistant.voice.status.microphoneMuted`:capture,voice.speaking.value?`jskit.assistant.voice.status.speaking`:speechActive.value?`jskit.assistant.voice.status.preparingSpeech`:``].filter(Boolean).map(key=>t(key)).join(` · `)});const heldTranscript=computed(()=>pendingTranscript.value?.text||([`listening`,`transcribing`].includes(voice.captureState.value)?voice.partialTranscript.value:``));const voiceWords=computed(()=>heldTranscript.value||binding.state.messages?.findLast(message=>message.role===`user`)?.text||``);const voiceAnswer=computed(()=>binding.state.streamingReply?.text||binding.state.messages?.findLast(message=>message.role===`assistant`)?.text||``);let recording=null;let primed=false;let draining=false;let disposed=false;const seen=new Set;const speechQueue=[];const replies=new Map;let speechSuppressed=false;let requestedMessageId=``;let speechInvitation=``;let lastStreamingId=``;const narrationTracker=createConversationNarrationTracker();const narrationPageVisible=ref(globalThis.document?.visibilityState!==`hidden`);const hiddenNarrationPage=computed(()=>Boolean(binding.narration)&&!narrationPageVisible.value);let narrationSettleTimer;let thinkingMurmurTimer;let narrationEpoch=0;function clearNarrationTimers(){++narrationEpoch;clearTimeout(narrationSettleTimer);clearTimeout(thinkingMurmurTimer)}function retireNarration(selected=()=>true){for(let index=speechQueue.length-1;index>=0;--index){const reply=speechQueue[index];if(!reply.narrationKind||!selected(reply.narrationKind))continue;cancelReply(reply,`narration-retired`);speechQueue.splice(index,1);if(reply.turnId&&voice.activeSpeechTurnId.value===reply.turnId)voice.stopSpeaking(`narration-retired`)}}function narrationEnabled(){const narration=binding.narration;return Boolean(narration&&narration.eligible&&!narration.loading&&readAloud.value&&binding.state.available!==false&&narrationPageVisible.value&&!capturing.value&&!starting.value&&!speechSuppressed&&!disposed)}function queueNarration(kind,text){if(!narrationEnabled())return;if(kind===`murmur`&&(speechQueue.length||speechActive.value))return;speechQueue.push({narrationKind:kind,raw:text,consumed:0,final:true,started:false});drainSpeech()}function observeNarration(settled=false,enabled=narrationEnabled()){const narration=binding.narration;if(!narration)return;const entries=narrationTracker.observe(narration.turns,{includeFinals:false,settled,enabled,vocalizeThinking:narration.vocalizeThinking,vocalizeInterimTurns:narration.vocalizeInterimTurns});for(const entry of entries)queueNarration(entry.kind,entry.text)}function scheduleThinkingMurmur(epoch){const narration=binding.narration;if(!narrationEnabled()||!narration.working||!narration.thinkingSounds)return;thinkingMurmurTimer=setTimeout(()=>{if(epoch!==narrationEpoch||!narrationEnabled()||!binding.narration?.working||!binding.narration.thinkingSounds)return;if(!speechQueue.length&&!draining&&!speechActive.value&&voice.state.value===`idle`)queueNarration(`murmur`,t(`jskit.assistant.voice.narration.murmur`));scheduleThinkingMurmur(epoch)},2e4)}function refreshNarration(settled=false){clearNarrationTimers();observeNarration(settled);const narration=binding.narration;if(!narrationEnabled()||!narration.working)return;const epoch=narrationEpoch;if(narration.vocalizeThinking||narration.vocalizeInterimTurns)narrationSettleTimer=setTimeout(()=>{if(epoch===narrationEpoch&&narrationEnabled())observeNarration(true)},700);scheduleThinkingMurmur(epoch)}function observe(callback,value){try{Promise.resolve(callback?.(value)).catch(()=>{})}catch{}}function emitReply(reply,phase,reason){if(reply.terminal||phase===`started`&&reply.audible)return;if(phase===`started`)reply.audible=true;else reply.terminal=true;if(reply.narrationKind)return;observe(binding.onPlayback,{conversationId,outputId:reply.outputId,phase,...reason?{reason}:{}})}function receivePlayback(event){const reply=[...replies.values()].find(reply=>reply.turnId===event.turnId)||speechQueue.find(reply=>reply.narrationKind&&reply.turnId===event.turnId);if(!reply)return;if(event.phase===`completed`){reply.drained=true;if(reply.canonicalFinal||reply.narrationKind)emitReply(reply,`completed`)}else emitReply(reply,event.phase,event.reason)}function cancelReply(reply,reason=`cancelled`,phase=`interrupted`){reply.cancelled=true;emitReply(reply,phase,reason)}function stopSpeech(){cancelSpeech()}function cancelSpeech(reason=`cancelled`,phase=`interrupted`){clearNarrationTimers();retireNarration();for(const reply of replies.values())if(!reply.terminal)cancelReply(reply,reason,phase);speechQueue.length=0;speechSuppressed=true;speechInvitation=``;voice.stopSpeaking(reason)}function inviteSpeech(messageId){if(!messageId||messageId===requestedMessageId||seen.has(messageId))return;requestedMessageId=messageId;speechInvitation=messageId}async function drainSpeech(){if(draining||disposed||!readAloud.value||speechSuppressed||soundPreparing.value||voice.playbackBlocked?.value)return;draining=true;const wording=voiceSpeechWording();try{while(speechQueue.length){const reply=speechQueue[0];if(reply.cancelled){speechQueue.shift();continue}if(reply.started&&!speechActive.value){speechQueue.shift();continue}if(speechActive.value&&!reply.started)return;if(reply.started&&!voice.canAppendSpeech.value)return;const previousSpeech=reply.narrationKind?``:speechTextFromAssistant(reply.raw.slice(0,reply.consumed),void 0,wording);const maximumCharacters=reply.narrationKind?reply.started?140:64:Math.max(1,Math.min(reply.started?140:64,VOICE_MAX_SPEECH_TEXT_CHARACTERS-previousSpeech.length,VOICE_MAX_SPEECH_TEXT_CHARACTERS-reply.spokenCharacters));const chunk=reply.speechCapped?null:takeStreamingSpeech(reply.raw.slice(reply.consumed),reply.final,maximumCharacters,wording);if(!chunk){if(reply.final&&reply.started)voice.endSpeech();else if(reply.final){cancelReply(reply,`no-audio`);speechQueue.shift();continue}return}reply.consumed+=chunk.consumed;let text=chunk.text;if(!reply.narrationKind){const speech=speechTextFromAssistant(reply.raw.slice(0,reply.consumed),void 0,wording);const boundary=speech.startsWith(previousSpeech)?speech.slice(previousSpeech.length).match(/^\s*/u)[0].length:0;text=text.slice(0,Math.max(0,Math.min(VOICE_MAX_SPEECH_TEXT_CHARACTERS-previousSpeech.length-boundary,VOICE_MAX_SPEECH_TEXT_CHARACTERS-reply.spokenCharacters)));reply.spokenCharacters+=text.length;reply.speechCapped=speech.length>=4e3||reply.spokenCharacters>=4e3;reply.final||=reply.speechCapped}if(!text)continue;if(!reply.started){reply.started=true;reply.turnId=createVoiceTurnId(`speak`);const accepted=await voice.speak(text,reply.turnId,{stream:true});if(disposed)return;if(reply.cancelled){if(reply.narrationKind)continue;return}if(accepted===false){cancelReply(reply,`no-audio`);continue}}else if(!voice.appendSpeech(text))return;if(reply.speechCapped||reply.final&&reply.consumed>=reply.raw.length){voice.endSpeech();return}}}catch(cause){error.value=voiceErrorText(cause);stopSpeech()}finally{draining=false}}function queueReply(message,final){let reply=replies.get(message.id);if(!reply){if(!primed||!readAloud.value||speechSuppressed||seen.has(message.id)||!final&&message.autonomous)return;retireNarration(kind=>kind===`murmur`);reply={id:message.id,outputId:message.outputId||message.id,streamId:message.streamId,raw:``,consumed:0,spokenCharacters:0,speechCapped:false,final:false,canonicalFinal:false,started:false};replies.set(message.id,reply);speechQueue.push(reply)}if(reply.cancelled)return;if(hiddenNarrationPage.value&&!reply.canonicalFinal&&(final||!reply.raw)){cancelReply(reply,`page-hidden`);if(reply.turnId&&voice.activeSpeechTurnId.value===reply.turnId)voice.stopSpeaking(`page-hidden`);return}if(final)retireNarration(kind=>kind===`murmur`);const text=String(message.text||``).slice(0,VOICE_MAX_SPEECH_TEXT_CHARACTERS*2);const spokenPrefix=reply.raw.slice(0,reply.consumed);if(!text.startsWith(spokenPrefix)&&!(final&&text.trimEnd()===spokenPrefix.trimEnd())){cancelReply(reply);if(speechQueue[0]===reply)voice.stopSpeaking();return}reply.consumed=Math.min(reply.consumed,text.length);reply.raw=text;reply.canonicalFinal||=final;reply.final=final||reply.speechCapped||text.length>=4e3*2;if(reply.canonicalFinal&&reply.drained)emitReply(reply,`completed`)}async function enableSound(){const revision=++soundRevision;soundPreparing.value=true;try{await voice.preparePlayback()}catch{}finally{if(revision===soundRevision&&!disposed){soundPreparing.value=false;drainSpeech()}}}async function toggleReadAloud(){if(readAloudChangePending.value)return;error.value=``;readAloud.value=!readAloud.value;observe(binding.onReadAloudChange,readAloud.value);await applyReadAloud()}async function applyReadAloud(){if(!readAloud.value){++soundRevision;soundPreparing.value=false;cancelSpeech(`muted`);return}speechSuppressed=false;speechInvitation=``;await enableSound();if(!disposed)refreshNarration()}watch(()=>binding.defaults?.readAloud,value=>{if(disposed||typeof value!==`boolean`||value===readAloud.value)return;readAloud.value=value;applyReadAloud()});async function deliverTranscript(){const pending=pendingTranscript.value;if(!pending||sending.value)return;sending.value=true;error.value=``;try{inviteSpeech(pending.messageId);const receipt=await binding.submitText(pending.text,{messageId:pending.messageId,context:pending.focus});if(receipt===false||receipt?.ok===false)throw new Error(serverMessage(receipt||{},t(`jskit.assistant.voice.errors.notAccepted`)));if(pendingTranscript.value===pending)dismissTranscript()}catch(cause){if(pendingTranscript.value===pending)error.value=voiceErrorText(cause)}finally{sending.value=false}}async function cancelRecording(){startupAbort?.abort();startupAbort=null;starting.value=false;releaseEditCapturePause();recording=null;await voice.cancelListening()}async function discardRecording(){live.value=false;committing=null;clearTimeout(stopTimer);await cancelRecording()}function dismissTranscript(){releaseEditCapturePause();pendingTranscript.value=null;heldReview.value=false;holding.value=false;error.value=``}function releaseEditCapturePause(){const pending=pendingTranscript.value;const captureId=pending?.editPausedCaptureId;if(!captureId)return;delete pending.editPausedCaptureId;if(recording?.messageId===captureId&&!disposed&&live.value&&callMode.value===`hands-free`)voice.setMicrophoneMuted(false)}async function talk(){error.value=``;try{if(voice.listening.value){await voice.stopListening();return}if(capturing.value){await discardRecording();return}if(pendingTranscript.value)return;await startRecording(false)}catch(cause){recording=null;error.value=voiceErrorText(cause)}}async function startRecording(reviewBeforeSend,continuous=false){if(disposed||hiddenNarrationPage.value||starting.value||microphoneMuted.value||capturing.value||committing||(pendingTranscript.value||sending.value)&&!(continuous&&live.value&&(callMode.value===`hands-free`||pushHolding.value)))return;error.value=``;reviewBeforeSend||=binding.defaults?.reviewBeforeSend===true;heldReview.value=reviewBeforeSend;holding.value=reviewBeforeSend;const next={focus:{...binding.captureContext?.()||{}},messageId:crypto.randomUUID(),started:false,reviewBeforeSend,continuous};recording=next;try{const started=await voice.startListening({continuous});if(recording===next){next.started=started;if(!started)recording=null}}catch(cause){if(recording===next){recording=null;error.value=voiceErrorText(cause)}}}async function toggleMicrophoneMuted({preserveBuffered=false}={}){if(pendingTranscript.value)delete pendingTranscript.value.editPausedCaptureId;voice.setMicrophoneMuted(!microphoneMuted.value,{preserveBuffered});if(!microphoneMuted.value&&recording)delete recording.finishAfterPending;clearTimeout(stopTimer);if(microphoneMuted.value&&starting.value)await cancelRecording();else if(!microphoneMuted.value&&live.value&&callMode.value===`hands-free`&&!capturing.value)await startRecording(false,true)}async function changeCallMode(mode){if(![`push-to-talk`,`hands-free`].includes(mode)||mode===callMode.value||callModeBusy.value||committing)return;changingCallMode.value=true;callMode.value=mode;try{if(capturing.value)await cancelRecording();if(live.value&&mode===`hands-free`&&!microphoneMuted.value)await startRecording(false,true)}finally{changingCallMode.value=false}}async function startPushToTalk(event){if(event?.repeat||event?.isPrimary===false||event?.button!==void 0&&event.button!==0||pushHolding.value||disposed||hiddenNarrationPage.value||starting.value||capturing.value&&!voice.listening.value||committing)return;if(event?.pointerId!==void 0)event.currentTarget.setPointerCapture(event.pointerId);pushInput=event?.pointerId??event?.key??null;pushHolding.value=true;callMode.value=`push-to-talk`;voice.setMicrophoneMuted(false);if(recording)delete recording.finishAfterPending;if(!live.value)await toggleLive();if(!pushHolding.value||!live.value||disposed)return;if(recording&&voice.listening.value){recording.continuous=false;return}await startRecording(false,Boolean(pendingTranscript.value||sending.value));if(!recording)pushHolding.value=false}async function finishPushToTalk(event){if(!pushHolding.value||event&&(event.pointerId??event.key??null)!==pushInput)return;pushHolding.value=false;pushInput=null;try{if(voice.listening.value&&(pendingTranscript.value||sending.value||committing)){if(recording)recording.finishAfterPending=true;voice.setMicrophoneMuted(true,{preserveBuffered:true});return}if(voice.listening.value)await voice.stopListening();else await cancelRecording()}catch(cause){await cancelRecording();error.value=voiceErrorText(cause)}}async function cancelPushToTalk(event){if(!pushHolding.value||event?.pointerId!==void 0&&event.pointerId!==pushInput)return;pushHolding.value=false;pushInput=null;await cancelRecording()}async function toggleHandsFree(){if(disposed||hiddenNarrationPage.value||pushHolding.value)return;if(live.value&&callMode.value===`hands-free`&&voice.listening.value&&(pendingTranscript.value||sending.value||committing)){if(!microphoneMuted.value&&recording)recording.finishAfterPending=true;await toggleMicrophoneMuted({preserveBuffered:true});return}if(committing)return;if(starting.value){await cancelRecording();return}if(capturing.value&&!voice.listening.value)return;if(live.value&&callMode.value===`hands-free`){if(!microphoneMuted.value&&voice.listening.value){voice.setMicrophoneMuted(true,{preserveBuffered:true});await voice.stopListening()}else if(microphoneMuted.value)await toggleMicrophoneMuted();else await startRecording(false,true);return}if(callMode.value===`hands-free`&&(pendingTranscript.value||sending.value)){voice.setMicrophoneMuted(false);await toggleLive();return}if(pendingTranscript.value||sending.value||callModeBusy.value)return;voice.setMicrophoneMuted(false);await changeCallMode(`hands-free`);if(!live.value)await toggleLive()}async function toggleLive(){error.value=``;if(starting.value){await cancelRecording();return}if(live.value){live.value=false;pushHolding.value=false;committing=null;clearTimeout(stopTimer);await cancelRecording();return}if(disposed||hiddenNarrationPage.value||microphoneMuted.value||capturing.value||committing||(pendingTranscript.value||sending.value)&&callMode.value!==`hands-free`&&!pushHolding.value)return;const controller=new AbortController;startupAbort=controller;starting.value=true;const signal=AbortSignal.any([controller.signal,AbortSignal.timeout(1e4)]);try{if(readAloud.value)enableSound();signal.throwIfAborted();await voice.connect();signal.throwIfAborted();if(disposed)return;starting.value=false;live.value=true;if(callMode.value===`hands-free`){await startRecording(false,true);if(startupAbort===controller&&!recording?.started)live.value=false}}catch(cause){if(startupAbort===controller&&!controller.signal.aborted){live.value=false;error.value=signal.aborted?t(`jskit.assistant.voice.errors.setupTimeout`):voiceErrorText(cause)}}finally{if(startupAbort===controller){startupAbort=null;starting.value=false}}}function currentSpokenText(){const reply=speechQueue[0];return reply?reply.raw.slice(0,reply.consumed).slice(-2e3):``}function explicitSilence(text){return/^(?:please )?(?:st[oa]p (?:talking|speaking)|be quiet|wait[, ]+let me (?:explain|finish)|let me finish)[.!]?$/iu.test(text.trim())}function decideTurn(){const candidate=voice.endpoint.value;if(takingTranscript.value||!live.value||callMode.value!==`hands-free`||!voice.listening.value||microphoneMuted.value||pendingTranscript.value||sending.value||!candidate)return;const key=`${candidate.turnId}:${candidate.revision}`;if(decidedCandidate===key)return;decidedCandidate=key;const captured={focus:{...recording?.focus||binding.captureContext?.()||{}},messageId:recording?.messageId||crypto.randomUUID(),text:candidate.text,...recording?.reviewBeforeSend?{reviewBeforeSend:true}:{}};try{const text=candidate.text.trim();const spoken=currentSpokenText();if(explicitSilence(text)){if(!spoken.toLowerCase().includes(text.toLowerCase()))stopSpeech();voice.finishUtterance(candidate,{discard:true});return}if(/(?:^|\s)(?:u+m+|u+h+|e+r+|h+m+)[.!?,…]*$/iu.test(text))return;const acknowledgement=speechActive.value&&!spoken.includes(`?`)&&/^(?:m+[- ]?h*m+|u+h[- ]?huh)[.!?,]*$/iu.test(text);const words=text.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,` `).trim();const spokenWords=spoken.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,` `).trim();const echo=speechActive.value&&words.split(` `).length>=4&&` ${spokenWords} `.includes(` ${words} `);if(!words||/^\[(?:cough|sneeze|noise|silence)\]$/iu.test(text)||acknowledgement||echo){voice.finishUtterance(candidate,{discard:true});return}committing={...captured,turnId:candidate.turnId,revision:candidate.revision};if(!voice.finishUtterance(candidate)){committing=null;return}publishTranscript()}catch(cause){if(live.value&&candidate===voice.endpoint.value){live.value=false;if(recording)recording.reviewBeforeSend=true;error.value=t(`jskit.assistant.voice.errors.finishAndReview`,{message:voiceErrorText(cause)})}}}watch([voice.endpoint,pendingTranscript,sending,takingTranscript],decideTurn);watch(voice.completedUtterance,utterance=>{if(!utterance||!live.value||!committing||committing.turnId!==utterance.turnId||committing.revision!==utterance.revision)return;pendingTranscript.value={...committing,text:utterance.text};committing=null;if(!pendingTranscript.value.reviewBeforeSend)deliverTranscript();else holding.value=false});watch(voice.utteranceReset,reset=>{if(reset?.turnId!==voice.activeListenTurnId.value||!live.value||!recording)return;recording={focus:{...binding.captureContext?.()||{}},messageId:crypto.randomUUID(),started:true,continuous:true,...recording.reviewBeforeSend?{reviewBeforeSend:true}:{},...recording.finishAfterPending?{finishAfterPending:true}:{}}});watch(voice.partialTranscript,(text,previous)=>{clearTimeout(stopTimer);if(!live.value||microphoneMuted.value)return;if(text&&!previous&&recording)recording.focus={...binding.captureContext?.()||{}};if(!explicitSilence(text)||currentSpokenText().toLowerCase().includes(text.toLowerCase()))return;stopTimer=setTimeout(()=>{if(live.value&&!microphoneMuted.value&&voice.partialTranscript.value===text)stopSpeech()},120)});watch([pendingTranscript,sending,voice.utteranceReset,voice.utteranceStale],()=>{const stale=voice.utteranceStale.value;if(committing&&stale?.turnId===committing.turnId&&stale.revision===committing.revision)committing=null;if(!disposed&&live.value&&!pushHolding.value&&!changingCallMode.value&&!pendingTranscript.value&&!sending.value&&!committing&µphoneMuted.value&&recording?.finishAfterPending&&voice.listening.value){delete recording.finishAfterPending;voice.stopListening().catch(cause=>{error.value=voiceErrorText(cause)});return}if(live.value&&callMode.value===`hands-free`&&!changingCallMode.value&&!microphoneMuted.value&&!capturing.value&&!pendingTranscript.value&&!sending.value&&!voice.error.value)startRecording(false,true)});async function startHeldRecording(){await startRecording(true)}async function finishHeldRecording(){holding.value=false;if(!recording?.reviewBeforeSend)return;try{if(voice.listening.value)await voice.stopListening();else{await cancelRecording();error.value=t(`jskit.assistant.voice.errors.microphoneNotReady`)}}catch(cause){await cancelRecording();error.value=voiceErrorText(cause)}}async function discardHeldRecording(){if(sending.value)return;await cancelRecording();dismissTranscript()}watch([voice.captureState,voice.transcript,voice.error],()=>{if(!recording?.started||capturing.value)return;const finished=recording;recording=null;if(voice.error.value){if(committing?.messageId===finished.messageId)committing=null;live.value=false;const text=voice.partialTranscript.value.trim()||voice.transcript.value.trim();if(text){pendingTranscript.value={...finished,text,reviewBeforeSend:true};holding.value=false;error.value=t(`jskit.assistant.voice.errors.recordingInterrupted`)}return}const text=voice.transcript.value.trim();if(!text){if(!finished.continuous)error.value=t(`jskit.assistant.voice.errors.noSpeech`);return}if(live.value&&!finished.reviewBeforeSend&&explicitSilence(text)){stopSpeech();return}pendingTranscript.value={...finished,text};if(!finished.reviewBeforeSend)deliverTranscript();else holding.value=false});watch(()=>({messages:binding.state.messages,reply:binding.state.streamingReply,text:binding.state.streamingReply?.text}),({messages=[],reply})=>{if(!binding.id)return;if(pendingTranscript.value&&messages.some(message=>message.role===`user`&&message.id===pendingTranscript.value.messageId&&message.receipt!==false))dismissTranscript();let invited=false;for(const message of messages){if(message.role===`user`&&message.receipt===false)continue;if(seen.has(message.id))continue;if(message.role===`user`&&message.id===speechInvitation){speechSuppressed=false;speechInvitation=``;invited=true}if(message.role===`assistant`)queueReply(message,true);seen.add(message.id)}if(lastStreamingId&&lastStreamingId!==reply?.id&&!messages.some(message=>message.id===lastStreamingId)){const retired=replies.get(lastStreamingId);if(retired&&!retired.canonicalFinal&&!retired.cancelled){cancelReply(retired);if(speechQueue[0]===retired)voice.finishCurrentPhrase()}}lastStreamingId=reply?.id||``;if(reply?.text){queueReply(reply,reply.status===`completed`);if(!readAloud.value||!primed||reply.autonomous||hiddenNarrationPage.value)seen.add(reply.id)}const retained=new Set([...messages.map(message=>message.id),reply?.id,...speechQueue.map(item=>item.id),...[...replies.values()].filter(item=>!item.terminal).map(item=>item.id)]);for(const id of seen)if(!retained.has(id))seen.delete(id);for(const id of replies.keys())if(!retained.has(id))replies.delete(id);primed=true;if(invited)refreshNarration();drainSpeech()},{immediate:true});watch(()=>{const narration=binding.narration;return{id:binding.id,conversationId:binding.conversationId,narration,loading:narration?.loading,eligible:narration?.eligible,working:narration?.working,thinking:narration?.vocalizeThinking,interim:narration?.vocalizeInterimTurns,sounds:narration?.thinkingSounds,turns:narration?.turns,enabled:narrationEnabled()}},(current,previous)=>{clearNarrationTimers();if(!current.narration||current.loading||current.id!==previous?.id||current.conversationId!==previous?.conversationId){narrationTracker.reset();retireNarration();if(!current.narration||current.loading)return}if(!current.enabled)retireNarration();else retireNarration(kind=>kind===`thinking`?!current.thinking:kind===`commentary`?!current.interim:!current.sounds||!current.working);if(previous&&(current.enabled!==previous.enabled||current.thinking!==previous.thinking||current.interim!==previous.interim))observeNarration(true,false);refreshNarration(!current.enabled)},{immediate:true,deep:true});watch(voice.error,message=>{if(message)cancelSpeech(`playback-error`,`failed`)});watch(()=>error.value||voice.error.value,message=>{if(message)binding.onError?.(message)});watch([voice.activeSpeechTurnId,voice.canAppendSpeech],()=>{drainSpeech()});function currentTranscript(){const pending=pendingTranscript.value;return recording&&[`listening`,`transcribing`].includes(voice.captureState.value)&&voice.partialTranscript.value&&recording.messageId!==pending?.messageId?{id:recording.messageId,text:voice.partialTranscript.value}:pending?{id:pending.messageId,text:pending.text}:null}function canTakeTranscript(messageId){return!disposed&&!starting.value&&!sending.value&&!committing&&!takingTranscript.value&&(pendingTranscript.value?.messageId===messageId||currentTranscript()?.id===messageId)&&!binding.state.messages?.some(message=>message.role===`user`&&message.id===messageId&&message.receipt!==false)}async function beginTranscriptEdit(messageId){if(!canTakeTranscript(messageId))return false;const pending=pendingTranscript.value;if(pending&&pending.messageId!==messageId)return false;const selected=pending?{id:pending.messageId,text:pending.text}:currentTranscript();const capture=recording;takingTranscript.value=true;try{pendingTranscript.value={...pending?.messageId===messageId?pending:capture,messageId,text:selected.text,reviewBeforeSend:true,editing:true};if(capture){if(capture.messageId!==messageId&&live.value&&callMode.value===`hands-free`){if(!microphoneMuted.value){pendingTranscript.value.editPausedCaptureId=capture.messageId;voice.setMicrophoneMuted(true)}}else if(pushHolding.value)await cancelPushToTalk();else await cancelRecording()}return true}finally{takingTranscript.value=false}}async function takeTranscript(messageId,transfer){if(!canTakeTranscript(messageId))return false;const pending=pendingTranscript.value;const selected=pending?.messageId===messageId?{id:messageId,text:pending.text}:currentTranscript();takingTranscript.value=true;try{if(transfer&&transfer(selected.text)!==true)return false;if(pendingTranscript.value?.messageId===messageId)dismissTranscript();else if(recording?.messageId===messageId){if(pushHolding.value)await cancelPushToTalk();else await cancelRecording();if(!disposed&&live.value&&callMode.value===`hands-free`&&!microphoneMuted.value)await startRecording(false,true)}return true}finally{takingTranscript.value=false}}function publishTranscript(){const transcript=currentTranscript();binding.onTranscript?.(transcript,{canTake:Boolean(transcript&&canTakeTranscript(transcript.id))})}watch([pendingTranscript,voice.captureState,voice.partialTranscript,voice.endpoint,sending,starting,takingTranscript],publishTranscript,{immediate:true});watch(avatarVisual,visual=>binding.onVisual?.(visual),{immediate:true});const page=globalThis.window||globalThis;const updateNarrationVisibility=()=>{narrationPageVisible.value=globalThis.document?.visibilityState!==`hidden`;if(disposed||!hiddenNarrationPage.value||!(recording||starting.value||committing||capturing.value))return;pushHolding.value=false;pushInput=null;if(!pendingTranscript.value){holding.value=false;heldReview.value=false}discardRecording();voice.stopSpeaking(`page-hidden`)};globalThis.document?.addEventListener?.(`visibilitychange`,updateNarrationVisibility);const cancelStartup=()=>{if(starting.value)discardRecording();else cancelPushToTalk()};page.addEventListener?.(`pagehide`,cancelStartup);page.addEventListener?.(`blur`,cancelPushToTalk);onScopeDispose(()=>{globalThis.document?.removeEventListener?.(`visibilitychange`,updateNarrationVisibility);page.removeEventListener?.(`pagehide`,cancelStartup);page.removeEventListener?.(`blur`,cancelPushToTalk);startupAbort?.abort();startupAbort=null;stopSpeech();binding.onTranscript?.(null);binding.onVisual?.(null);disposed=true;live.value=false;clearTimeout(stopTimer);recording=null;speechQueue.length=0});async function close(){startupAbort?.abort();disposed=true;live.value=false;clearTimeout(stopTimer);recording=null;committing=null;stopSpeech();await voice.close()}function editTranscript(text,messageId=pendingTranscript.value?.messageId){if(pendingTranscript.value&&pendingTranscript.value.messageId===messageId&&!sending.value)pendingTranscript.value={...pendingTranscript.value,text:String(text)}}const composerBlocked=computed(()=>starting.value||(!live.value||callMode.value!==`hands-free`)&&(sending.value||Boolean(pendingTranscript.value)||capturing.value));return{targetLabel,voice,readAloud,readAloudChangePending,error,pendingTranscript,heldReview,holding,sending,live,starting,callMode,changingCallMode,pushHolding,microphoneMuted,capturing,speechActive,callConnection,callStatus,callModeBusy,avatarVisual,callAudioLevel,status,heldTranscript,voiceWords,voiceAnswer,stopSpeech,inviteSpeech,toggleReadAloud,enableSound,soundPreparing,deliverTranscript,cancelRecording,discardRecording,dismissTranscript,talk,toggleMicrophoneMuted,changeCallMode,startPushToTalk,finishPushToTalk,cancelPushToTalk,toggleLive,toggleHandsFree,startHeldRecording,finishHeldRecording,discardHeldRecording,close,editTranscript,canTakeTranscript,beginTranscriptEdit,takeTranscript,hasUnsentSpeech:computed(()=>capturing.value||starting.value||sending.value||Boolean(pendingTranscript.value)),composerBlocked}}function createVoiceConversationController({connectSpeech,createSession=useVoiceConversation}={}){if(typeof connectSpeech!==`function`)throw new TypeError(`Voice requires an application speech connection.`);const{t}=useJskitText();const state=shallowReactive({binding:null,session:null,visible:false,nextTarget:null,busy:false,error:``});let scope;let revision=0;let operations=Promise.resolve();let disposed=false;function serialize(operation){const result=operations.then(operation);operations=result.catch(()=>{});return result}async function release(){const session=state.session;if(session)await session.close();scope?.stop();scope=null;await state.binding?.release?.();state.binding=null;state.session=null}async function activate(binding,requestRevision){const socketUrl=await connectSpeech(binding);if(disposed||requestRevision!==revision)return false;if(!socketUrl)throw voiceError(`jskit.assistant.voice.errors.speechNotConfigured`);await release();if(disposed||requestRevision!==revision)return false;const nextScope=effectScope(true);try{binding.retain?.();const session=nextScope.run(()=>createSession(binding,{socketUrl}));scope=nextScope;state.binding=binding;state.session=session;state.visible=true;state.nextTarget=null;nextScope.run(()=>watch(()=>binding.available,available=>{if(available!==false)return;state.error=t(`jskit.assistant.voice.errors.noLongerAvailable`);end({discard:true})},{immediate:true}));return true}catch(error){nextScope.stop();binding.release?.();throw error}}function open({conversation}={}){if(!conversation?.id||!conversation.state||typeof conversation.submitText!==`function`)return Promise.reject(new TypeError(`Voice requires a conversation identity, state and text submission.`));if(disposed)return Promise.reject(voiceError(`jskit.assistant.voice.errors.hostDisposed`));const requestRevision=++revision;return serialize(async()=>{if(requestRevision!==revision||disposed)return false;state.error=``;if(state.binding?.id===conversation.id){state.visible=true;state.nextTarget=null;return true}if(conversation.available===false)throw voiceError(`jskit.assistant.voice.errors.notAvailable`);if(state.session?.hasUnsentSpeech.value){state.nextTarget=conversation;state.visible=true;return false}state.busy=true;try{return await activate(conversation,requestRevision)}catch(error){state.error=voiceErrorText(error);throw error}finally{state.busy=false}})}function switchTarget({discard=false}={}){const target=state.nextTarget;if(!target)return Promise.resolve(false);if(!discard&&state.session?.hasUnsentSpeech.value)return Promise.resolve(false);if(state.session?.sending.value)return Promise.resolve(false);const requestRevision=++revision;return serialize(async()=>{state.busy=true;try{return await activate(target,requestRevision)}catch(error){state.error=voiceErrorText(error);throw error}finally{state.busy=false}})}function end({discard=false}={}){if(!discard&&state.session?.hasUnsentSpeech.value){state.visible=true;state.error=t(`jskit.assistant.voice.errors.finishBeforeEnding`);return Promise.resolve(false)}++revision;return serialize(async()=>{state.busy=true;try{await release();state.visible=false;state.nextTarget=null;return true}finally{state.busy=false}})}return{state,open,switchTarget,end,minimize(){state.visible=false},reveal(){if(state.session)state.visible=true},cancelSwitch(){state.nextTarget=null},async dispose(){disposed=true;await end({discard:true})}}}var makeVAppProps=propsFactory({...makeComponentProps(),...omit(makeLayoutProps(),[`fullHeight`]),...makeThemeProps()},`VApp`);var VApp=genericComponent()({name:`VApp`,props:makeVAppProps(),setup(props,{slots}){const theme=provideTheme(props);const{layoutClasses,getLayoutItem,items,layoutRef}=createLayout({...props,fullHeight:true});const{rtlClasses}=useRtl();useRender(()=>createBaseVNode(`div`,{"ref":layoutRef,"class":normalizeClass([`v-application`,theme.themeClasses.value,layoutClasses.value,rtlClasses.value,props.class]),"style":normalizeStyle([props.style])},[createBaseVNode(`div`,{"class":`v-application__wrap`},[slots.default?.()])]));return{getLayoutItem,items,theme}}});var makeVToolbarTitleProps=propsFactory({text:String,...makeComponentProps(),...makeTagProps()},`VToolbarTitle`);var VToolbarTitle=genericComponent()({name:`VToolbarTitle`,props:makeVToolbarTitleProps(),setup(props,{slots}){useRender(()=>{const hasText=!!(slots.default||slots.text||props.text);return createVNode(props.tag,{"class":normalizeClass([`v-toolbar-title`,props.class]),"style":normalizeStyle(props.style)},{default:()=>[hasText&&createBaseVNode(`div`,{"class":`v-toolbar-title__placeholder`},[slots.text?slots.text():props.text,slots.default?.()])]})});return{}}});var allowedDensities=[null,`prominent`,`default`,`comfortable`,`compact`];var makeVToolbarProps=propsFactory({absolute:Boolean,collapse:Boolean,collapsePosition:{type:String,default:`start`},color:String,density:{type:String,default:`default`,validator:v=>allowedDensities.includes(v)},extended:{type:Boolean,default:null},extensionHeight:{type:[Number,String],default:48},flat:Boolean,floating:Boolean,height:{type:[Number,String],default:64},image:String,title:String,...makeBorderProps(),...makeComponentProps(),...makeElevationProps(),...makeLocationProps(),...makeRoundedProps(),...makeTagProps({tag:`header`}),...makeThemeProps()},`VToolbar`);var VToolbar=genericComponent()({name:`VToolbar`,props:makeVToolbarProps(),setup(props,{slots}){const{backgroundColorClasses,backgroundColorStyles}=useBackgroundColor(()=>props.color);const{borderClasses}=useBorder(props);const{elevationClasses}=useElevation(props);const{locationStyles}=useLocation(props);const{roundedClasses,roundedStyles}=useRounded(props);const{themeClasses}=provideTheme(props);const{rtlClasses}=useRtl();const isExtended=shallowRef(props.extended===null?!!slots.extension?.():props.extended);const contentHeight=computed(()=>parseInt(Number(props.height)+(props.density===`prominent`?Number(props.height):0)-(props.density===`comfortable`?8:0)-(props.density===`compact`?16:0),10));const extensionHeight=computed(()=>isExtended.value?parseInt(Number(props.extensionHeight)+(props.density===`prominent`?Number(props.extensionHeight):0)-(props.density===`comfortable`?4:0)-(props.density===`compact`?8:0),10):0);provideDefaults({VBtn:{variant:`text`}});useRender(()=>{const hasTitle=!!(props.title||slots.title);const hasImage=!!(slots.image||props.image);const extension=slots.extension?.();isExtended.value=props.extended===null?!!extension:props.extended;return createVNode(props.tag,{"class":normalizeClass([`v-toolbar`,`v-toolbar--collapse-${props.collapsePosition}`,{"v-toolbar--absolute":props.absolute,"v-toolbar--collapse":props.collapse,"v-toolbar--flat":props.flat,"v-toolbar--floating":props.floating,[`v-toolbar--density-${props.density}`]:true},backgroundColorClasses.value,borderClasses.value,elevationClasses.value,roundedClasses.value,themeClasses.value,rtlClasses.value,props.class]),"style":normalizeStyle([backgroundColorStyles.value,locationStyles.value,roundedStyles.value,props.style])},{default:()=>[hasImage&&createBaseVNode(`div`,{"key":`image`,"class":`v-toolbar__image`},[!slots.image?createVNode(VImg,{"key":`image-img`,"cover":true,"src":props.image},null):createVNode(VDefaultsProvider,{"key":`image-defaults`,"disabled":!props.image,"defaults":{VImg:{cover:true,src:props.image}}},slots.image)]),createVNode(VDefaultsProvider,{"defaults":{VTabs:{height:convertToUnit(contentHeight.value)}}},{default:()=>[createBaseVNode(`div`,{"class":`v-toolbar__content`,"style":{height:convertToUnit(contentHeight.value)}},[slots.prepend&&createBaseVNode(`div`,{"class":`v-toolbar__prepend`},[slots.prepend?.()]),hasTitle&&createVNode(VToolbarTitle,{"key":`title`,"text":props.title},{text:slots.title}),slots.default?.(),slots.append&&createBaseVNode(`div`,{"class":`v-toolbar__append`},[slots.append?.()])])]}),createVNode(VDefaultsProvider,{"defaults":{VTabs:{height:convertToUnit(extensionHeight.value)}}},{default:()=>[createVNode(VExpandTransition,null,{default:()=>[isExtended.value&&createBaseVNode(`div`,{"class":`v-toolbar__extension`,"style":{height:convertToUnit(extensionHeight.value)}},[extension])]})]})]})});return{contentHeight,extensionHeight}}});var makeScrollProps=propsFactory({scrollTarget:{type:String},scrollThreshold:{type:[String,Number],default:300}},`scroll`);function useScroll(props,args={}){const{canScroll,layoutSize}=args;let previousScroll=0;let previousScrollHeight=0;const target=ref(null);const currentScroll=shallowRef(0);const savedScroll=shallowRef(0);const currentThreshold=shallowRef(0);const isScrollActive=shallowRef(false);const isScrollingUp=shallowRef(false);const isAtBottom=shallowRef(false);const reachedBottomWhileScrollingDown=shallowRef(false);const hasEnoughScrollableSpace=shallowRef(true);const scrollThreshold=computed(()=>{return Number(props.scrollThreshold)});const scrollRatio=computed(()=>{return clamp$1((scrollThreshold.value-currentScroll.value)/scrollThreshold.value||0)});function getScrollMetrics(targetEl){return{clientHeight:`window`in targetEl?window.innerHeight:targetEl.clientHeight,scrollHeight:`window`in targetEl?document.documentElement.scrollHeight:targetEl.scrollHeight}}function checkScrollableSpace(){const targetEl=target.value;if(!targetEl)return;const{clientHeight,scrollHeight}=getScrollMetrics(targetEl);const maxScrollableDistance=scrollHeight-clientHeight;const elementHeight=layoutSize?.value||0;const minRequiredDistance=scrollThreshold.value+elementHeight;hasEnoughScrollableSpace.value=maxScrollableDistance>minRequiredDistance}function onResize(){checkScrollableSpace()}function onScroll(){const targetEl=target.value;if(!targetEl||canScroll&&!canScroll.value)return;previousScroll=currentScroll.value;currentScroll.value=`window`in targetEl?targetEl.pageYOffset:targetEl.scrollTop;const currentScrollHeight=targetEl instanceof Window?document.documentElement.scrollHeight:targetEl.scrollHeight;if(previousScrollHeight!==currentScrollHeight){if(currentScrollHeight>previousScrollHeight)checkScrollableSpace();previousScrollHeight=currentScrollHeight}isScrollingUp.value=currentScroll.value<previousScroll;currentThreshold.value=Math.abs(currentScroll.value-scrollThreshold.value);const{clientHeight,scrollHeight}=getScrollMetrics(targetEl);const atBottom=currentScroll.value+clientHeight>=scrollHeight-5;if(!isScrollingUp.value&&atBottom&¤tScroll.value>=scrollThreshold.value&&hasEnoughScrollableSpace.value)reachedBottomWhileScrollingDown.value=true;const scrollJumped=Math.abs(currentScroll.value-previousScroll)>100;const atTop=currentScroll.value<=5;if(isScrollingUp.value&&previousScroll-currentScroll.value>1&&!atBottom||scrollJumped&¤tScroll.value<scrollThreshold.value||atTop)reachedBottomWhileScrollingDown.value=false;isAtBottom.value=atBottom}watch(isScrollingUp,()=>{savedScroll.value=savedScroll.value||currentScroll.value});watch(isScrollActive,()=>{savedScroll.value=0});onMounted(()=>{watch(()=>props.scrollTarget,scrollTarget=>{const newTarget=scrollTarget?document.querySelector(scrollTarget):window;if(!newTarget){consoleWarn(`Unable to locate element with identifier ${scrollTarget}`);return}if(newTarget===target.value)return;target.value?.removeEventListener(`scroll`,onScroll);target.value=newTarget;target.value.addEventListener(`scroll`,onScroll,{passive:true});Promise.resolve().then(()=>{checkScrollableSpace()})},{immediate:true});window.addEventListener(`resize`,onResize,{passive:true})});onBeforeUnmount(()=>{target.value?.removeEventListener(`scroll`,onScroll);window.removeEventListener(`resize`,onResize)});canScroll&&watch(canScroll,onScroll,{immediate:true});return{scrollThreshold,currentScroll,currentThreshold,isScrollActive,scrollRatio,isScrollingUp,savedScroll,isAtBottom,reachedBottomWhileScrollingDown,hasEnoughScrollableSpace}}var makeVAppBarProps=propsFactory({scrollBehavior:String,modelValue:{type:Boolean,default:true},location:{type:String,default:`top`,validator:value=>[`top`,`bottom`].includes(value)},...omit(makeVToolbarProps(),[`location`]),...makeLayoutItemProps(),...makeScrollProps(),height:{type:[Number,String],default:64}},`VAppBar`);var VAppBar=genericComponent()({name:`VAppBar`,props:makeVAppBarProps(),emits:{"update:modelValue":value=>true},setup(props,{slots}){const vToolbarRef=ref();const isActive=useProxiedModel(props,`modelValue`);const scrollBehavior=computed(()=>{const behavior=new Set(props.scrollBehavior?.split(` `)??[]);return{hide:behavior.has(`hide`),fullyHide:behavior.has(`fully-hide`),inverted:behavior.has(`inverted`),collapse:behavior.has(`collapse`),elevate:behavior.has(`elevate`),fadeImage:behavior.has(`fade-image`)}});const canScroll=computed(()=>{const behavior=scrollBehavior.value;return behavior.hide||behavior.fullyHide||behavior.inverted||behavior.collapse||behavior.elevate||behavior.fadeImage||!isActive.value});const appBarHeight=computed(()=>{return(vToolbarRef.value?.contentHeight??0)+(vToolbarRef.value?.extensionHeight??0)});const{currentScroll,scrollThreshold,isScrollingUp,scrollRatio,isAtBottom,reachedBottomWhileScrollingDown,hasEnoughScrollableSpace}=useScroll(props,{canScroll,layoutSize:appBarHeight});const canHide=toRef(()=>scrollBehavior.value.hide||scrollBehavior.value.fullyHide);const isCollapsed=computed(()=>props.collapse||scrollBehavior.value.collapse&&(scrollBehavior.value.inverted?scrollRatio.value>0:scrollRatio.value===0));const isFlat=computed(()=>props.flat||scrollBehavior.value.fullyHide&&!isActive.value||scrollBehavior.value.elevate&&(scrollBehavior.value.inverted?currentScroll.value>0:currentScroll.value===0));const opacity=computed(()=>scrollBehavior.value.fadeImage?scrollBehavior.value.inverted?1-scrollRatio.value:scrollRatio.value:void 0);const height=computed(()=>{if(scrollBehavior.value.hide&&scrollBehavior.value.inverted)return 0;const height=vToolbarRef.value?.contentHeight??0;const extensionHeight=vToolbarRef.value?.extensionHeight??0;if(!canHide.value)return height+extensionHeight;return currentScroll.value<scrollThreshold.value||scrollBehavior.value.fullyHide?height+extensionHeight:height});useToggleScope(()=>!!props.scrollBehavior,()=>{watchEffect(()=>{if(!canHide.value){isActive.value=true;return}if(scrollBehavior.value.inverted){isActive.value=currentScroll.value>scrollThreshold.value;return}if(!hasEnoughScrollableSpace.value){isActive.value=true;return}if(reachedBottomWhileScrollingDown.value){isActive.value=false;return}isActive.value=isScrollingUp.value&&!isAtBottom.value||currentScroll.value<scrollThreshold.value})});const{ssrBootStyles}=useSsrBoot();const{layoutItemStyles}=useLayoutItem({id:props.name,order:computed(()=>parseInt(props.order,10)),position:toRef(()=>props.location),layoutSize:height,elementSize:shallowRef(void 0),active:isActive,absolute:toRef(()=>props.absolute)});useRender(()=>{const toolbarProps=omit(VToolbar.filterProps(props),[`location`]);return createVNode(VToolbar,mergeProps({"ref":vToolbarRef,"class":[`v-app-bar`,{"v-app-bar--bottom":props.location===`bottom`},props.class],"style":[{...layoutItemStyles.value,"--v-toolbar-image-opacity":opacity.value,height:void 0,...ssrBootStyles.value},props.style]},toolbarProps,{"collapse":isCollapsed.value,"flat":isFlat.value}),slots)});return{}}});var makeVAppBarNavIconProps=propsFactory({...omit(makeVBtnProps({icon:`$menu`,variant:`text`}),[`spaced`])},`VAppBarNavIcon`);var VAppBarNavIcon=genericComponent()({name:`VAppBarNavIcon`,props:makeVAppBarNavIconProps(),setup(props,{slots}){useRender(()=>createVNode(VBtn,mergeProps(props,{"class":[`v-app-bar-nav-icon`]}),slots));return{}}});var makeVBottomNavigationProps=propsFactory({baseColor:String,bgColor:String,color:String,grow:Boolean,mode:{type:String,validator:v=>!v||[`horizontal`,`shift`].includes(v)},height:{type:[Number,String],default:56},active:{type:Boolean,default:true},...makeBorderProps(),...makeComponentProps(),...makeDensityProps(),...makeElevationProps(),...makeRoundedProps(),...makeLayoutItemProps({name:`bottom-navigation`}),...makeTagProps({tag:`header`}),...makeGroupProps({selectedClass:`v-btn--selected`}),...makeThemeProps()},`VBottomNavigation`);var VBottomNavigation=genericComponent()({name:`VBottomNavigation`,props:makeVBottomNavigationProps(),emits:{"update:active":value=>true,"update:modelValue":value=>true},setup(props,{slots}){const{themeClasses}=useTheme();const{borderClasses}=useBorder(props);const{backgroundColorClasses,backgroundColorStyles}=useBackgroundColor(()=>props.bgColor);const{densityClasses}=useDensity(props);const{elevationClasses}=useElevation(props);const{roundedClasses,roundedStyles}=useRounded(props);const{ssrBootStyles}=useSsrBoot();const height=computed(()=>{if(isPercentage(props.height))return props.height;return Number(props.height)-(props.density===`comfortable`?8:0)-(props.density===`compact`?16:0)});const isActive=useProxiedModel(props,`active`,props.active);const{layoutItemStyles}=useLayoutItem({id:props.name,order:computed(()=>parseInt(props.order,10)),position:toRef(()=>`bottom`),layoutSize:toRef(()=>isActive.value?height.value:0),elementSize:height,active:isActive,absolute:toRef(()=>props.absolute)});useGroup(props,VBtnToggleSymbol);provideDefaults({VBtn:{baseColor:toRef(()=>props.baseColor),color:toRef(()=>props.color),density:toRef(()=>props.density),stacked:toRef(()=>props.mode!==`horizontal`),variant:`text`}},{scoped:true});useRender(()=>{return createVNode(props.tag,{"class":normalizeClass([`v-bottom-navigation`,{"v-bottom-navigation--active":isActive.value,"v-bottom-navigation--grow":props.grow,"v-bottom-navigation--shift":props.mode===`shift`},themeClasses.value,backgroundColorClasses.value,borderClasses.value,densityClasses.value,elevationClasses.value,roundedClasses.value,props.class]),"style":normalizeStyle([backgroundColorStyles.value,layoutItemStyles.value,{height:convertToUnit(height.value)},ssrBootStyles.value,roundedStyles.value,props.style])},{default:()=>[slots.default&&createBaseVNode(`div`,{"class":`v-bottom-navigation__content`},[slots.default()])]})});return{}}});var makeVBottomSheetProps=propsFactory({inset:Boolean,...makeVDialogProps({transition:`bottom-sheet-transition`,location:`bottom center`,origin:`bottom center`,viewportMargin:0})},`VBottomSheet`);var VBottomSheet=genericComponent()({name:`VBottomSheet`,props:makeVBottomSheetProps(),emits:{"update:modelValue":value=>true},setup(props,{slots}){const isActive=useProxiedModel(props,`modelValue`);useRender(()=>{const dialogProps=VDialog.filterProps(props);return createVNode(VDialog,mergeProps(dialogProps,{"contentClass":[`v-bottom-sheet__content`,props.contentClass],"modelValue":isActive.value,"onUpdate:modelValue":$event=>isActive.value=$event,"class":[`v-bottom-sheet`,{"v-bottom-sheet--inset":props.inset},props.class],"style":props.style}),slots)});return{}}});var handleGesture=(wrapper,scrolled)=>{const{touchstartX,touchendX,touchstartY,touchendY}=wrapper;const dirRatio=.5;const minDistance=16;wrapper.offsetX=touchendX-touchstartX;wrapper.offsetY=touchendY-touchstartY;if(!scrolled.x&&Math.abs(wrapper.offsetY)<dirRatio*Math.abs(wrapper.offsetX)){wrapper.left&&touchendX<touchstartX-minDistance&&wrapper.left(wrapper);wrapper.right&&touchendX>touchstartX+minDistance&&wrapper.right(wrapper)}if(!scrolled.y&&Math.abs(wrapper.offsetX)<dirRatio*Math.abs(wrapper.offsetY)){wrapper.up&&touchendY<touchstartY-minDistance&&wrapper.up(wrapper);wrapper.down&&touchendY>touchstartY+minDistance&&wrapper.down(wrapper)}};function trackScroll(target){const origins=[];for(let el=target instanceof Element?target:null;el;el=el.parentElement)origins.push([el,el.scrollLeft,el.scrollTop]);return()=>({x:origins.some(([el,left])=>el.scrollLeft!==left),y:origins.some(([el,,top])=>el.scrollTop!==top)})}function touchstart(event,wrapper){const touch=event.changedTouches[0];wrapper.touchstartX=touch.clientX;wrapper.touchstartY=touch.clientY;wrapper.start?.({originalEvent:event,...wrapper})}function touchend(event,wrapper,scrolled){const touch=event.changedTouches[0];wrapper.touchendX=touch.clientX;wrapper.touchendY=touch.clientY;wrapper.end?.({originalEvent:event,...wrapper});handleGesture(wrapper,scrolled)}function touchmove(event,wrapper){const touch=event.changedTouches[0];wrapper.touchmoveX=touch.clientX;wrapper.touchmoveY=touch.clientY;wrapper.move?.({originalEvent:event,...wrapper})}function createHandlers(value={}){const wrapper={touchstartX:0,touchstartY:0,touchendX:0,touchendY:0,touchmoveX:0,touchmoveY:0,offsetX:0,offsetY:0,left:value.left,right:value.right,up:value.up,down:value.down,start:value.start,move:value.move,end:value.end};let getScrolled=()=>({x:false,y:false});return{touchstart:e=>{getScrolled=trackScroll(e.target);touchstart(e,wrapper)},touchend:e=>touchend(e,wrapper,getScrolled()),touchmove:e=>touchmove(e,wrapper)}}function mounted(el,binding){const value=binding.value;const target=value?.parent?el.parentElement:el;const options=value?.options??{passive:true};const uid=binding.instance?.$.uid;if(!value||!target||uid===void 0)return;const handlers=createHandlers(binding.value);target._touchHandlers=target._touchHandlers??Object.create(null);target._touchHandlers[uid]=handlers;keys(handlers).forEach(eventName=>{target.addEventListener(eventName,handlers[eventName],options)})}function unmounted(el,binding){const target=binding.value?.parent?el.parentElement:el;const uid=binding.instance?.$.uid;if(!target?._touchHandlers||uid===void 0)return;const handlers=target._touchHandlers[uid];if(!handlers)return;keys(handlers).forEach(eventName=>{target.removeEventListener(eventName,handlers[eventName])});delete target._touchHandlers[uid];if(!keys(target._touchHandlers).length)delete target._touchHandlers}function updated(el,binding){if(binding.value===binding.oldValue)return;unmounted(el,{...binding,value:binding.oldValue});mounted(el,binding)}var Touch={mounted,unmounted,updated};var VWindowSymbol=Symbol.for(`vuetify:v-window`);var VWindowGroupSymbol=Symbol.for(`vuetify:v-window-group`);var makeVWindowProps=propsFactory({continuous:Boolean,nextIcon:{type:[Boolean,String,Function,Object],default:`$next`},prevIcon:{type:[Boolean,String,Function,Object],default:`$prev`},reverse:Boolean,showArrows:{type:[Boolean,String],validator:v=>isBoolean(v)||v===`hover`},verticalArrows:[Boolean,String],touch:{type:[Object,Boolean],default:void 0},direction:{type:String,default:`horizontal`},modelValue:null,disabled:Boolean,selectedClass:{type:String,default:`v-window-item--active`},mandatory:{type:[Boolean,String],default:`force`},crossfade:Boolean,transitionDuration:Number,...makeComponentProps(),...makeTagProps(),...makeThemeProps()},`VWindow`);var VWindow=genericComponent()({name:`VWindow`,directives:{vTouch:Touch},props:makeVWindowProps(),emits:{"update:modelValue":value=>true},setup(props,{slots}){const{themeClasses}=provideTheme(props);const{isRtl}=useRtl();const{t}=useLocale();const group=useGroup(props,VWindowGroupSymbol);const rootRef=ref();const isRtlReverse=computed(()=>isRtl.value?!props.reverse:props.reverse);const isReversed=shallowRef(false);const transition=computed(()=>{if(props.crossfade)return`v-window-crossfade-transition`;return`v-window-${props.direction===`vertical`?`y`:`x`}${(isRtlReverse.value?!isReversed.value:isReversed.value)?`-reverse`:``}-transition`});const transitionCount=shallowRef(0);const transitionHeight=ref(void 0);const activeIndex=computed(()=>{return group.items.value.findIndex(item=>group.selected.value.includes(item.id))});watch(activeIndex,(newVal,oldVal)=>{let scrollableParent;const savedScrollPosition={left:0,top:0};if(IN_BROWSER&&oldVal>=0){scrollableParent=getScrollParent(rootRef.value);savedScrollPosition.left=scrollableParent?.scrollLeft;savedScrollPosition.top=scrollableParent?.scrollTop}const itemsLength=group.items.value.length;const lastIndex=itemsLength-1;if(itemsLength<=2)isReversed.value=newVal<oldVal;else if(newVal===lastIndex&&oldVal===0)isReversed.value=false;else if(newVal===0&&oldVal===lastIndex)isReversed.value=true;else isReversed.value=newVal<oldVal;nextTick$1(()=>{if(!IN_BROWSER||!scrollableParent)return;if(scrollableParent.scrollTop!==savedScrollPosition.top)scrollableParent.scrollTo({...savedScrollPosition,behavior:`instant`});requestAnimationFrame(()=>{if(!scrollableParent)return;if(scrollableParent.scrollTop!==savedScrollPosition.top)scrollableParent.scrollTo({...savedScrollPosition,behavior:`instant`})})})},{flush:`sync`});provide(VWindowSymbol,{transition,isReversed,transitionCount,transitionHeight,rootRef});const canMoveBack=toRef(()=>props.continuous||activeIndex.value!==0);const canMoveForward=toRef(()=>props.continuous||activeIndex.value!==group.items.value.length-1);function prev(){canMoveBack.value&&group.prev()}function next(){canMoveForward.value&&group.next()}const arrows=computed(()=>{const arrows=[];const prevProps={icon:isRtl.value?props.nextIcon:props.prevIcon,class:`v-window__${isRtlReverse.value?`right`:`left`}`,onClick:group.prev,"aria-label":t(`$vuetify.carousel.prev`)};arrows.push(canMoveBack.value?slots.prev?slots.prev({props:prevProps}):createVNode(VBtn,prevProps,null):createBaseVNode(`div`,null,null));const nextProps={icon:isRtl.value?props.prevIcon:props.nextIcon,class:`v-window__${isRtlReverse.value?`left`:`right`}`,onClick:group.next,"aria-label":t(`$vuetify.carousel.next`)};arrows.push(canMoveForward.value?slots.next?slots.next({props:nextProps}):createVNode(VBtn,nextProps,null):createBaseVNode(`div`,null,null));return arrows});const touchOptions=computed(()=>{if(props.touch===false)return props.touch;return{left:()=>{isRtlReverse.value?prev():next()},right:()=>{isRtlReverse.value?next():prev()},start:({originalEvent})=>{originalEvent.stopPropagation()},...props.touch===true?{}:props.touch}});function onKeyDown(e){if(props.direction===`horizontal`&&e.key===`ArrowLeft`||props.direction===`vertical`&&e.key===`ArrowUp`){e.preventDefault();prev();nextTick$1(()=>{canMoveBack.value?focusArrow(0):focusArrow(1)})}if(props.direction===`horizontal`&&e.key===`ArrowRight`||props.direction===`vertical`&&e.key===`ArrowDown`){e.preventDefault();next();nextTick$1(()=>{canMoveForward.value?focusArrow(1):focusArrow(0)})}}function focusArrow(index){const arrow=arrows.value[index];if(!arrow)return;(Array.isArray(arrow)?arrow[0]:arrow).el?.focus()}useRender(()=>withDirectives(createVNode(props.tag,{"ref":rootRef,"class":normalizeClass([`v-window`,{"v-window--show-arrows-on-hover":props.showArrows===`hover`,"v-window--vertical-arrows":!!props.verticalArrows,"v-window--crossfade":!!props.crossfade},themeClasses.value,props.class]),"style":normalizeStyle([props.style,{"--v-window-transition-duration":!PREFERS_REDUCED_MOTION()?convertToUnit(props.transitionDuration,`ms`):null}])},{default:()=>[createBaseVNode(`div`,{"class":`v-window__container`,"style":{height:transitionHeight.value}},[slots.default?.({group}),props.showArrows!==false&&createBaseVNode(`div`,{"class":normalizeClass([`v-window__controls`,{"v-window__controls--left":props.verticalArrows===`left`||props.verticalArrows===true},{"v-window__controls--right":props.verticalArrows===`right`}]),"onKeydown":onKeyDown},[arrows.value])]),slots.additional?.({group})]}),[[Touch,touchOptions.value]]));return{group}}});var makeVWindowItemProps=propsFactory({reverseTransition:{type:[Boolean,String],default:void 0},transition:{type:[Boolean,String],default:void 0},...makeComponentProps(),...makeGroupItemProps(),...makeLazyProps()},`VWindowItem`);var VWindowItem=genericComponent()({name:`VWindowItem`,directives:{vTouch:Touch},props:makeVWindowItemProps(),emits:{"group:selected":val=>true},setup(props,{slots}){const window=inject$1(VWindowSymbol);const groupItem=useGroupItem(props,VWindowGroupSymbol);const{isBooted}=useSsrBoot();if(!window||!groupItem)throw new Error(`[Vuetify] VWindowItem must be used inside VWindow`);const isTransitioning=shallowRef(false);const hasTransition=computed(()=>isBooted.value&&(window.isReversed.value?props.reverseTransition!==false:props.transition!==false));function onAfterTransition(){if(!isTransitioning.value||!window)return;isTransitioning.value=false;if(window.transitionCount.value>0){window.transitionCount.value-=1;if(window.transitionCount.value===0)window.transitionHeight.value=void 0}}function onBeforeTransition(){if(isTransitioning.value||!window)return;isTransitioning.value=true;if(window.transitionCount.value===0)window.transitionHeight.value=convertToUnit(window.rootRef.value?.clientHeight);window.transitionCount.value+=1}function onTransitionCancelled(){onAfterTransition()}function onEnterTransition(el){if(!isTransitioning.value)return;nextTick$1(()=>{if(!hasTransition.value||!isTransitioning.value||!window)return;window.transitionHeight.value=convertToUnit(el.clientHeight)})}const transition=computed(()=>{const name=window.isReversed.value?props.reverseTransition:props.transition;return!hasTransition.value?false:{name:!isString(name)?window.transition.value:name,onBeforeEnter:onBeforeTransition,onAfterEnter:onAfterTransition,onEnterCancelled:onTransitionCancelled,onBeforeLeave:onBeforeTransition,onAfterLeave:onAfterTransition,onLeaveCancelled:onTransitionCancelled,onEnter:onEnterTransition}});const{hasContent}=useLazy(props,groupItem.isSelected);useRender(()=>createVNode(MaybeTransition,{"transition":transition.value,"disabled":!isBooted.value},{default:()=>[withDirectives(createBaseVNode(`div`,{"class":normalizeClass([`v-window-item`,groupItem.selectedClass.value,props.class]),"style":normalizeStyle(props.style)},[hasContent.value&&slots.default?.()]),[[vShow,groupItem.isSelected.value]])]}));return{groupItem}}});var VPickerTitle=createSimpleFunctional(`v-picker-title`);var makeVPickerProps=propsFactory({bgColor:String,divided:Boolean,landscape:Boolean,title:String,hideHeader:Boolean,hideTitle:Boolean,...makeVSheetProps()},`VPicker`);var VPicker=genericComponent()({name:`VPicker`,props:makeVPickerProps(),setup(props,{slots}){const{backgroundColorClasses,backgroundColorStyles}=useBackgroundColor(()=>props.color);useRender(()=>{const sheetProps=VSheet.filterProps(props);const hasTitle=!props.hideTitle&&!!(props.title||slots.title);return createVNode(VSheet,mergeProps(sheetProps,{"color":props.bgColor,"class":[`v-picker`,{"v-picker--divided":props.divided,"v-picker--landscape":props.landscape,"v-picker--with-actions":!!slots.actions},props.class],"style":props.style}),{default:()=>[!props.hideHeader&&createBaseVNode(`div`,{"key":`header`,"class":normalizeClass([`v-picker__header-wrapper`,backgroundColorClasses.value]),"style":normalizeStyle([backgroundColorStyles.value])},[hasTitle&&createVNode(VPickerTitle,{"key":`picker-title`},{default:()=>[slots.title?.()??props.title]}),slots.header&&createBaseVNode(`div`,{"class":`v-picker__header`},[slots.header()])]),createBaseVNode(`div`,{"class":`v-picker__body`},[slots.default?.()]),slots.actions&&createVNode(VDefaultsProvider,{"defaults":{VBtn:{slim:true,variant:`text`}}},{default:()=>[createBaseVNode(`div`,{"class":`v-picker__actions`},[slots.actions()])]})]})});return{}}});var makeVComboboxProps=propsFactory({alwaysFilter:Boolean,autoSelectFirst:{type:[Boolean,String]},clearOnSelect:{type:Boolean,default:true},delimiters:Array,closeOnInputClick:Boolean,trimValues:Boolean,...makeFilterProps({filterKeys:[`title`]}),...makeSelectProps({hideNoData:true,returnObject:true}),...omit(makeVTextFieldProps({modelValue:null,role:`combobox`}),[`validationValue`,`dirty`])},`VCombobox`);var VCombobox=genericComponent()({name:`VCombobox`,props:makeVComboboxProps(),emits:{"update:focused":focused=>true,"update:modelValue":value=>true,"update:search":value=>true,"update:menu":value=>true,"item:added":item=>true,"item:removed":item=>true,"item:created":item=>true},setup(props,{emit,slots}){const{t}=useLocale();const vTextFieldRef=ref();const vMenuRef=ref();const listRef=ref();const headerRef=ref();const footerRef=ref();const vVirtualScrollRef=ref();const isFocused=shallowRef(false);const isPristine=shallowRef(true);const listHasFocus=shallowRef(false);const selectionIndex=shallowRef(-1);let cleared=false;const{items,transformIn,transformOut}=useItems(props);const{textColorClasses,textColorStyles}=useTextColor(()=>vTextFieldRef.value?.color);const{InputIcon}=useInputIcon(props);const model=useProxiedModel(props,`modelValue`,[],v=>transformIn(wrapInArray(v)),v=>{const transformed=transformOut(v);return props.multiple?transformed:transformed[0]??null});const form=useForm(props);const closableChips=toRef(()=>props.closableChips&&!form.isReadonly.value&&!form.isDisabled.value);const chipDefaults=injectNestedDefaults(`VChip`);const hasChips=computed(()=>!!(props.chips||slots.chip));const hasSelectionSlot=computed(()=>hasChips.value||!!slots.selection);const _search=shallowRef(!props.multiple&&!hasSelectionSlot.value?model.value[0]?.title??``:``);const _searchLock=shallowRef(null);const search=computed({get:()=>{return _search.value},set:async val=>{_search.value=val??``;if(val===null||val===``&&!props.multiple&&!hasSelectionSlot.value){for(const item of model.value)emit(`item:removed`,item);model.value=[]}else if(!props.multiple&&!hasSelectionSlot.value){model.value=[transformItem(props,val)];nextTick$1(()=>vVirtualScrollRef.value?.scrollToIndex(0))}if(val&&props.multiple&&props.delimiters?.length){const values=splitByDelimiters(val);if(values.length>1){selectMultiple(values);_search.value=``}}if(!val)selectionIndex.value=-1;isPristine.value=!val}});const counterValue=computed(()=>{return isFunction(props.counterValue)?props.counterValue(model.value):isNumber(props.counterValue)?props.counterValue:props.multiple?model.value.length:search.value.length});const{filteredItems,getMatches}=useFilter(props,items,()=>_searchLock.value??(props.alwaysFilter||!isPristine.value?search.value:``));const displayItems=computed(()=>{if(props.hideSelected&&_searchLock.value===null)return filteredItems.value.filter(filteredItem=>!model.value.some(s=>s.value===filteredItem.value));return filteredItems.value});const menuDisabled=computed(()=>props.hideNoData&&!displayItems.value.length||form.isReadonly.value||form.isDisabled.value);const{menu,closeOnSelect}=useSelectionMenu(props,{vMenuRef,menuDisabled,isFocused});const{menuId,ariaExpanded,ariaControls}=useMenuActivator(props,menu);const{listEvents,onActivatorKeydown,setPendingFocus,flushPendingFocus}=useScrolling(listRef,vTextFieldRef,vVirtualScrollRef,displayItems,{selectedIndex:()=>isPristine.value?getSelectedIndex():-1,headerEl:()=>headerRef.value,menuContentEl:()=>vMenuRef.value?.contentEl,noAutoScroll:()=>props.noAutoScroll});watch(_search,value=>{if(cleared)nextTick$1(()=>cleared=false);else if(isFocused.value&&!menu.value)menu.value=true;if(menu.value&&isFocused.value)nextTick$1(()=>{vVirtualScrollRef.value?.scrollToIndex(0);if(listRef.value?.$el?.contains(getActiveElement()))vTextFieldRef.value?.focus()});emit(`update:search`,value)});watch(model,value=>{if(!props.multiple&&!hasSelectionSlot.value)_search.value=value[0]?.title??``});const selectedValues=computed(()=>model.value.map(selection=>selection.value));const firstSelectableItem=computed(()=>displayItems.value.find(x=>x.type===`item`&&!x.props.disabled));const highlightFirst=computed(()=>{return(props.autoSelectFirst===true||props.autoSelectFirst===`exact`&&search.value===firstSelectableItem.value?.title)&&displayItems.value.length>0&&!isPristine.value&&!listHasFocus.value});const repairOrphanedFocus=useFocusRepair(menu,()=>vMenuRef.value?.contentEl,()=>vTextFieldRef.value?.controlRef);const{onTabKeydown}=useFocusGroups({groups:[{type:`element`,contentRef:headerRef},{type:`list`,contentRef:listRef,displayItemsCount:()=>displayItems.value.length},{type:`element`,contentRef:footerRef}],onLeave:()=>{menu.value=false;vTextFieldRef.value?.focus()}});function onClear(e){cleared=true;nextTick$1(()=>cleared=false);if(props.openOnClear)menu.value=true}function onMousedownControl(){if(menuDisabled.value)return;menu.value=props.closeOnInputClick?!menu.value:true}function onMousedownMenuIcon(e){if(menuDisabled.value)return;if(isFocused.value){e.preventDefault();e.stopPropagation()}menu.value=!menu.value}function onMenuKeydown(e){if(e.key===`Tab`)onTabKeydown(e);if(listRef.value?.$el.contains(e.target)&&(checkPrintable(e)||e.key===`Backspace`))vTextFieldRef.value?.focus()}function onKeydown(e){if(isComposingIgnoreKey(e)||form.isReadonly.value)return;switch(e.key){case`Escape`:menu.value=false;break;case`ArrowDown`:case`ArrowUp`:e.preventDefault();if(onActivatorKeydown(e,menu))break;if(e.key===`ArrowDown`&&highlightFirst.value)listRef.value?.focus(`next`);break;case`Enter`:e.preventDefault();menu.value=true;selectHighlighted();if(search.value)selectFreeText();break;case`Tab`:selectHighlighted();menu.value=false;break;default:onSelectionKeydown(e)}}function selectHighlighted(){const item=firstSelectableItem.value;if(!highlightFirst.value||!item)return;if(model.value.some(({value})=>value===item.value))return;select(item)}function selectFreeText(){const value=props.trimValues?search.value.trim():search.value;if(!value){search.value=``;return}select(transformItem(props,value),true,true);if(hasSelectionSlot.value)_search.value=``}function onSelectionKeydown(e){const length=model.value.length;if([`Backspace`,`Delete`].includes(e.key)){if(!props.multiple&&hasSelectionSlot.value&&length>0&&!search.value)return select(model.value[0],false);if(~selectionIndex.value){e.preventDefault();const originalSelectionIndex=selectionIndex.value;select(model.value[selectionIndex.value],false);selectionIndex.value=originalSelectionIndex>=length-1?length-2:originalSelectionIndex}else if(e.key===`Backspace`&&!search.value)selectionIndex.value=length-1;return}if(!props.multiple)return;if(e.key===`ArrowLeft`){if(selectionIndex.value<0&&(vTextFieldRef.value?.selectionStart??0)>0)return;const prev=selectionIndex.value>-1?selectionIndex.value-1:length-1;if(model.value[prev])selectionIndex.value=prev;else{selectionIndex.value=-1;vTextFieldRef.value?.setSelectionRange(search.value.length,search.value.length)}}else if(e.key===`ArrowRight`){if(selectionIndex.value<0)return;const next=selectionIndex.value+1;if(model.value[next])selectionIndex.value=next;else{selectionIndex.value=-1;vTextFieldRef.value?.setSelectionRange(0,0)}}else if(~selectionIndex.value&&checkPrintable(e))selectionIndex.value=-1}function onPaste(e){const values=splitByDelimiters(e?.clipboardData?.getData(`Text`)??``);if(values.length>1&&props.multiple){e.preventDefault();selectMultiple(values)}}function getSelectedIndex(){return displayItems.value.findIndex(item=>model.value.some(s=>(props.valueComparator||deepEqual)(s.value,item.value)))}function onAfterEnter(){if(props.eager)vVirtualScrollRef.value?.calculateVisibleItems();flushPendingFocus()}function onAfterLeave(){if(isFocused.value){if(vMenuRef.value?.contentEl?._clickOutside?.lastMousedownWasOutside)isFocused.value=false;else vTextFieldRef.value?.focus()}isPristine.value=true;_searchLock.value=null}function isExistingItem(item){const comparator=props.valueComparator||deepEqual;return items.value.some(i=>comparator(i.value,item.value))}function select(item,set=true,keepMenu=false){if(!item||item.props.disabled)return;const comparator=props.valueComparator||deepEqual;if(props.multiple){const index=model.value.findIndex(selection=>comparator(selection.value,item.value));const add=set==null?!~index:set;if(~index){const value=add?[...model.value,item]:[...model.value];const[removed]=value.splice(index,1);if(!add)emit(`item:removed`,removed);model.value=value}else if(add){emit(`item:added`,item);if(!isExistingItem(item))emit(`item:created`,item);model.value=[...model.value,item]}if(props.clearOnSelect)search.value=``}else{const add=set!==false;const old=model.value[0];if(add){if(old&&!comparator(old.value,item.value)){emit(`item:removed`,old);emit(`item:added`,item);if(!isExistingItem(item))emit(`item:created`,item)}else if(!old){emit(`item:added`,item);if(!isExistingItem(item))emit(`item:created`,item)}model.value=[item]}else{if(old)emit(`item:removed`,old);model.value=[]}if((!isPristine.value||props.alwaysFilter)&&_search.value)_searchLock.value=_search.value;_search.value=add&&!hasSelectionSlot.value?item.title:``;nextTick$1(()=>{if(!keepMenu)closeOnSelect();isPristine.value=true})}}function splitByDelimiters(val){const signsToMatch=[`
|
|
67
|
+
`,...props.delimiters??[]].map(escapeForRegex).join(`|`);return val.split(new RegExp(`(?:${signsToMatch})+`))}async function selectMultiple(values){for(let value of values){value=value.trim();if(value){select(transformItem(props,value));await nextTick$1()}}}function onFocusin(e){isFocused.value=true;setTimeout(()=>{listHasFocus.value=true})}function onFocusout(e){listHasFocus.value=false;if(!vTextFieldRef.value?.$el.contains(e.relatedTarget)){if(repairOrphanedFocus(e))return;isFocused.value=false}}let mousedownInsideContentAt=0;function onMousedownContent(){mousedownInsideContentAt=performance.now()}function onBlur(e){const next=e.relatedTarget;if((vMenuRef.value?.contentEl)?.contains(next)||!next&&performance.now()-mousedownInsideContentAt<10)isFocused.value=true}watch(isFocused,(val,oldVal)=>{if(val||val===oldVal)return;selectionIndex.value=-1;menu.value=false;if(search.value){const value=props.trimValues?search.value.trim():search.value;if(!value){search.value=``;return}if(props.multiple){select(transformItem(props,value));return}if(!hasSelectionSlot.value){if(value!==search.value)select(transformItem(props,value));return}if(model.value.some(({title})=>title===value))_search.value=``;else select(transformItem(props,value))}});watch(menu,val=>{if(!val)setPendingFocus(null);if(!props.hideSelected&&val&&model.value.length&&isPristine.value){const index=getSelectedIndex();IN_BROWSER&&!props.noAutoScroll&&window.requestAnimationFrame(()=>{index>=0&&vVirtualScrollRef.value?.scrollToIndex(index,`center`)})}if(val)_searchLock.value=null});watch(items,(newVal,oldVal)=>{if(menu.value)return;if(isFocused.value&&!oldVal.length&&newVal.length)menu.value=true});useRender(()=>{const hasList=!!(!props.hideNoData||displayItems.value.length||slots[`prepend-item`]||slots[`append-item`]||slots[`no-data`]);const isDirty=model.value.length>0;const textFieldProps=VTextField.filterProps(props);const menuSlotProps={search,filteredItems:filteredItems.value};return createVNode(VTextField,mergeProps({"ref":vTextFieldRef},textFieldProps,{"form":``,"modelValue":search.value,"onUpdate:modelValue":$event=>search.value=$event,"focused":isFocused.value,"onUpdate:focused":$event=>isFocused.value=$event,"validationValue":model.externalValue,"counterValue":counterValue.value,"dirty":isDirty,"class":[`v-combobox`,{"v-combobox--active-menu":menu.value,"v-combobox--chips":!!props.chips,"v-combobox--selection-slot":!!hasSelectionSlot.value,"v-combobox--selecting-index":selectionIndex.value>-1,[`v-combobox--${props.multiple?`multiple`:`single`}`]:true},props.class],"style":props.style,"readonly":form.isReadonly.value,"placeholder":isDirty?void 0:props.placeholder,"onClick:clear":onClear,"onMousedown:control":onMousedownControl,"onKeydown":onKeydown,"onPaste":onPaste,"onBlur":onBlur,"aria-expanded":ariaExpanded.value,"aria-controls":ariaControls.value}),{...slots,default:({id})=>createBaseVNode(Fragment,null,[selectedValues.value.map((value,i)=>createBaseVNode(`input`,{"key":i,"type":`hidden`,"name":props.name,"value":value,"form":props.form},null)),createVNode(VMenu,mergeProps({"id":menuId.value,"ref":vMenuRef,"modelValue":menu.value,"onUpdate:modelValue":$event=>menu.value=$event,"activator":`parent`,"captureFocus":false,"openOnArrow":false,"disabled":menuDisabled.value,"_disableKeys":true,"eager":props.eager,"maxHeight":310,"openOnClick":false,"closeOnContentClick":false,"onAfterEnter":onAfterEnter,"onAfterLeave":onAfterLeave},props.menuProps,{"contentClass":[`v-combobox__content`,props.menuProps?.contentClass]}),{default:()=>[createVNode(VSheet,{"elevation":props.menuElevation,"onFocusin":onFocusin,"onKeydown":onMenuKeydown,"onMousedown":onMousedownContent},{default:()=>[slots[`menu-header`]&&createBaseVNode(`header`,{"ref":headerRef},[slots[`menu-header`](menuSlotProps)]),hasList&&createVNode(VList,mergeProps({"key":`combobox-list`,"ref":listRef,"class":`v-list--navigable`,"filterable":true,"selected":selectedValues.value,"selectStrategy":props.multiple?`independent`:`single-independent`,"onMousedown":e=>e.preventDefault(),"selectable":!!displayItems.value.length,"onFocusout":onFocusout,"tabindex":`-1`,"aria-live":`polite`,"aria-labelledby":`${id.value}-label`,"aria-multiselectable":props.multiple,"color":props.itemColor??props.color},listEvents,props.listProps),{default:()=>[slots[`prepend-item`]?.(),!displayItems.value.length&&!props.hideNoData&&(slots[`no-data`]?.()??createVNode(VListItem,{"key":`no-data`,"title":t(props.noDataText)},null)),createVNode(VVirtualScroll,{"ref":vVirtualScrollRef,"renderless":true,"items":displayItems.value,"itemKey":`value`},{default:({item,index,itemRef})=>{const camelizedProps=camelizeProps(item.props);const itemProps=mergeProps(item.props,{ref:itemRef,key:item.value,active:highlightFirst.value&&item===firstSelectableItem.value?true:void 0,onClick:()=>select(item,null),"aria-posinset":index+1,"aria-setsize":displayItems.value.length});if(item.type===`divider`)return slots.divider?.({props:item.raw,index})??createVNode(VDivider,mergeProps(item.props,{"ref":itemRef,"key":`divider-${index}`}),null);if(item.type===`subheader`)return slots.subheader?.({props:item.raw,index})??createVNode(VListSubheader,mergeProps(item.props,{"ref":itemRef,"key":`subheader-${index}`}),null);return slots.item?.({item:item.raw,internalItem:item,index,props:itemProps})??createVNode(VListItem,mergeProps(itemProps,{"role":`option`}),{prepend:({isSelected})=>createBaseVNode(Fragment,null,[props.multiple&&!props.hideSelected?createVNode(VCheckboxBtn,{"key":item.value,"modelValue":isSelected,"ripple":false,"tabindex":`-1`,"aria-hidden":true,"onClick":event=>event.preventDefault()},null):void 0,camelizedProps.prependAvatar&&createVNode(VAvatar,{"image":camelizedProps.prependAvatar},null),camelizedProps.prependIcon&&createVNode(VIcon,{"icon":camelizedProps.prependIcon},null)]),title:()=>{return isPristine.value?item.title:createVNode(VHighlight,{"text":item.title,"matches":getMatches(item)?.title,"markClass":`v-combobox__mask`,"matchAll":true,"ignoreCase":true},null)}})}}),slots[`append-item`]?.()]}),slots[`menu-footer`]&&createBaseVNode(`footer`,{"ref":footerRef},[slots[`menu-footer`](menuSlotProps)])]})]}),model.value.map((item,index)=>{function onChipClose(e){e.stopPropagation();e.preventDefault();select(item,false)}const slotProps=mergeProps(VChip.filterProps(item.props),{"onClick:close":onChipClose,onKeydown(e){if(e.key!==`Enter`&&e.key!==` `)return;e.preventDefault();e.stopPropagation();onChipClose(e)},onMousedown(e){e.preventDefault();e.stopPropagation()},modelValue:true,"onUpdate:modelValue":void 0});const hasSlot=hasChips.value?!!slots.chip:!!slots.selection;const slotContent=hasSlot?ensureValidVNode(hasChips.value?slots.chip({item:item.raw,internalItem:item,index,props:slotProps}):slots.selection({item:item.raw,internalItem:item,index})):void 0;if(hasSlot&&!slotContent)return void 0;return createBaseVNode(`div`,{"key":item.value,"class":normalizeClass([`v-combobox__selection`,index===selectionIndex.value&&[`v-combobox__selection--selected`,textColorClasses.value]]),"style":normalizeStyle(index===selectionIndex.value?textColorStyles.value:{})},[hasChips.value?!slots.chip?createVNode(VChip,mergeProps({"key":`chip`,"closable":closableChips.value,"size":chipDefaults.value?.size??`small`,"text":item.title,"disabled":item.props.disabled},slotProps),null):createVNode(VDefaultsProvider,{"key":`chip-defaults`,"defaults":{VChip:{closable:closableChips.value,size:chipDefaults.value?.size??`small`,text:item.title}}},{default:()=>[slotContent]}):slotContent??createBaseVNode(`span`,{"class":`v-combobox__selection-text`},[item.title,props.multiple&&index<model.value.length-1&&createBaseVNode(`span`,{"class":`v-combobox__selection-comma`},[createTextVNode(`,`)])])])})]),"append-inner":(...args)=>createBaseVNode(Fragment,null,[slots[`append-inner`]?.(...args),(!props.hideNoData||props.items.length)&&props.menuIcon?createVNode(VIcon,{"class":`v-combobox__menu-icon`,"color":vTextFieldRef.value?.fieldIconColor,"icon":props.menuIcon,"onMousedown":onMousedownMenuIcon,"onClick":noop,"aria-hidden":true,"tabindex":`-1`},null):void 0,props.appendInnerIcon&&createVNode(InputIcon,{"key":`append-icon`,"name":`appendInner`,"color":args[0].iconColor.value},null)])})});return forwardRefs({isFocused,isPristine,menu,search,selectionIndex,filteredItems,select},vTextFieldRef)}});var makeVTableProps=propsFactory({gridlines:{type:[Boolean,String],default:`horizontal`,validator:v=>isBoolean(v)||[`horizontal`,`vertical`,`all`].includes(v)},fixedHeader:Boolean,fixedFooter:Boolean,height:[Number,String],hover:Boolean,striped:{type:String,default:null,validator:v=>[`even`,`odd`].includes(v)},...makeComponentProps(),...makeDensityProps(),...makeTagProps(),...makeThemeProps()},`VTable`);var VTable=genericComponent()({name:`VTable`,inheritAttrs:false,props:makeVTableProps(),setup(props,{attrs,slots,emit}){const{themeClasses}=provideTheme(props);const{densityClasses}=useDensity(props);const gridlinesVariant=computed(()=>{if(props.gridlines===false)return`none`;if(props.gridlines===true)return`all`;return props.gridlines});useRender(()=>{const[tableAttrs,rootAttrs]=pickWithRest(attrs,[/^aria-label/]);return createVNode(props.tag,mergeProps(rootAttrs,{"class":[`v-table`,`v-table--gridlines-${gridlinesVariant.value}`,{"v-table--fixed-height":!!props.height,"v-table--fixed-header":props.fixedHeader,"v-table--fixed-footer":props.fixedFooter,"v-table--has-top":!!slots.top,"v-table--has-bottom":!!slots.bottom,"v-table--hover":props.hover,"v-table--striped-even":props.striped===`even`,"v-table--striped-odd":props.striped===`odd`},themeClasses.value,densityClasses.value,props.class],"style":props.style}),{default:()=>[slots.top?.(),slots.default?createBaseVNode(`div`,{"class":`v-table__wrapper`,"style":{height:convertToUnit(props.height)}},[createBaseVNode(`table`,normalizeProps(guardReactiveProps(tableAttrs)),[slots.caption?.(),slots.default()])]):slots.wrapper?.(),slots.bottom?.()]})});return{}}});var makeVContainerProps=propsFactory({fluid:{type:Boolean,default:false},...makeComponentProps(),...makeDimensionProps(),...makeTagProps()},`VContainer`);var VContainer=genericComponent()({name:`VContainer`,props:makeVContainerProps(),setup(props,{slots}){const{rtlClasses}=useRtl();const{dimensionStyles}=useDimension(props);useRender(()=>createVNode(props.tag,{"class":normalizeClass([`v-container`,{"v-container--fluid":props.fluid},rtlClasses.value,props.class]),"style":normalizeStyle([dimensionStyles.value,props.style])},slots));return{}}});var makeVDatePickerControlsProps=propsFactory({active:{type:[String,Array],default:void 0},controlHeight:[Number,String],controlVariant:{type:String,default:`docked`},noMonthPicker:Boolean,disabled:{type:[Boolean,String,Array],default:null},nextIcon:{type:IconValue,default:`$next`},prevIcon:{type:IconValue,default:`$prev`},modeIcon:{type:IconValue,default:`$subgroup`},text:String,monthText:String,yearText:String,viewMode:{type:String,default:`month`}},`VDatePickerControls`);var VDatePickerControls=genericComponent()({name:`VDatePickerControls`,props:makeVDatePickerControlsProps(),emits:{"click:year":()=>true,"click:month":()=>true,"click:prev":()=>true,"click:next":()=>true,"click:prev-year":()=>true,"click:next-year":()=>true},setup(props,{emit,slots}){const{t}=useLocale();const disableMonth=computed(()=>{return Array.isArray(props.disabled)?props.disabled.includes(`text`):!!props.disabled});const disableYear=computed(()=>{return Array.isArray(props.disabled)?props.disabled.includes(`mode`):!!props.disabled});const disablePrevMonth=computed(()=>{return Array.isArray(props.disabled)?props.disabled.includes(`prev-month`):!!props.disabled});const disableNextMonth=computed(()=>{return Array.isArray(props.disabled)?props.disabled.includes(`next-month`):!!props.disabled});const disablePrevYear=computed(()=>{return Array.isArray(props.disabled)?props.disabled.includes(`prev-year`):!!props.disabled});const disableNextYear=computed(()=>{return Array.isArray(props.disabled)?props.disabled.includes(`next-year`):!!props.disabled});function onClickPrevMonth(){emit(`click:prev`)}function onClickNextMonth(){emit(`click:next`)}function onClickPrevYear(){emit(`click:prev-year`)}function onClickNextYear(){emit(`click:next-year`)}function onClickYear(){emit(`click:year`)}function onClickMonth(){emit(`click:month`)}useRender(()=>{const innerDefaults={VBtn:{density:`comfortable`,variant:`text`}};const prevMonth=createVNode(VBtn,{"data-testid":`prev-month`,"disabled":disablePrevMonth.value,"icon":props.prevIcon,"aria-label":t(`$vuetify.datePicker.ariaLabel.previousMonth`),"onClick":onClickPrevMonth},null);const nextMonth=createVNode(VBtn,{"data-testid":`next-month`,"disabled":disableNextMonth.value,"icon":props.nextIcon,"aria-label":t(`$vuetify.datePicker.ariaLabel.nextMonth`),"onClick":onClickNextMonth},null);const prevYear=createVNode(VBtn,{"data-testid":`prev-year`,"disabled":disablePrevYear.value,"icon":props.prevIcon,"aria-label":t(`$vuetify.datePicker.ariaLabel.previousYear`),"onClick":onClickPrevYear},null);const nextYear=createVNode(VBtn,{"data-testid":`next-year`,"disabled":disableNextYear.value,"icon":props.nextIcon,"aria-label":t(`$vuetify.datePicker.ariaLabel.nextYear`),"onClick":onClickNextYear},null);const onlyMonthBtn=createVNode(VBtn,{"class":`v-date-picker-controls__only-month-btn`,"data-testid":`month-btn`,"density":`default`,"disabled":disableMonth.value,"text":props.monthText,"appendIcon":props.modeIcon,"rounded":true,"aria-label":t(`$vuetify.datePicker.ariaLabel.selectMonth`),"onClick":onClickMonth},null);const onlyYearBtn=createVNode(VBtn,{"class":`v-date-picker-controls__only-year-btn`,"data-testid":`year-btn`,"density":`default`,"disabled":disableYear.value,"text":props.yearText,"appendIcon":props.modeIcon,"rounded":true,"aria-label":t(`$vuetify.datePicker.ariaLabel.selectYear`),"onClick":onClickYear},null);const monthYearBtn=createVNode(VBtn,{"class":`v-date-picker-controls__year-btn`,"data-testid":`year-btn`,"density":`default`,"disabled":disableYear.value,"text":props.text,"appendIcon":props.modeIcon,"rounded":true,"aria-label":t(`$vuetify.datePicker.ariaLabel.selectYear`),"onClick":onClickYear},null);const monthYearSplit=createBaseVNode(Fragment,null,[createVNode(VBtn,{"class":`v-date-picker-controls__month-btn`,"data-testid":`month-btn`,"height":`36`,"disabled":disableMonth.value,"text":props.text,"rounded":true,"aria-label":t(`$vuetify.datePicker.ariaLabel.selectMonth`),"onClick":onClickMonth},null),createVNode(VBtn,{"class":`v-date-picker-controls__mode-btn`,"data-testid":`year-btn`,"disabled":disableYear.value,"icon":props.modeIcon,"aria-label":t(`$vuetify.datePicker.ariaLabel.selectYear`),"onClick":onClickYear},null)]);const slotProps={viewMode:props.viewMode,disabled:Array.isArray(props.disabled)?props.disabled:[],monthYearText:props.text??``,monthText:props.monthText??``,yearText:props.yearText??``,openMonths:onClickMonth,openYears:onClickYear,prevMonth:onClickPrevMonth,nextMonth:onClickNextMonth,prevYear:onClickPrevYear,nextYear:onClickNextYear};const modalControls=createBaseVNode(Fragment,null,[props.noMonthPicker?monthYearBtn:monthYearSplit,createVNode(VSpacer,null,null),createBaseVNode(`div`,{"class":`v-date-picker-controls__month`},[prevMonth,nextMonth])]);const dockedControls=createBaseVNode(Fragment,null,[createBaseVNode(`div`,{"class":`v-date-picker-controls__month`},[prevMonth,onlyMonthBtn,nextMonth]),createVNode(VSpacer,null,null),createBaseVNode(`div`,{"class":`v-date-picker-controls__year`},[prevYear,onlyYearBtn,nextYear])]);return createVNode(VDefaultsProvider,{"defaults":innerDefaults},{default:()=>[createBaseVNode(`div`,{"class":normalizeClass([`v-date-picker-controls`,`v-date-picker-controls--variant-${props.controlVariant}`]),"style":{"--v-date-picker-controls-height":convertToUnit(props.controlHeight)}},[slots.default?.(slotProps)??createBaseVNode(Fragment,null,[props.controlVariant===`modal`&&modalControls,props.controlVariant===`docked`&&dockedControls])])]})});return{}}});var makeVDatePickerHeaderProps=propsFactory({appendIcon:IconValue,color:String,header:String,transition:String,onClick:EventProp(),onClickOnce:EventProp()},`VDatePickerHeader`);var VDatePickerHeader=genericComponent()({name:`VDatePickerHeader`,props:makeVDatePickerHeaderProps(),emits:{click:()=>true,"click:append":()=>true},setup(props,{emit,slots}){const{backgroundColorClasses,backgroundColorStyles}=useBackgroundColor(()=>props.color);function onClick(){emit(`click`)}function onClickAppend(){emit(`click:append`)}useRender(()=>{const hasContent=!!(slots.default||props.header);const hasAppend=!!(slots.append||props.appendIcon);return createBaseVNode(`div`,{"class":normalizeClass([`v-date-picker-header`,{"v-date-picker-header--clickable":!!(props.onClick||props.onClickOnce)},backgroundColorClasses.value]),"style":normalizeStyle(backgroundColorStyles.value),"onClick":(props.onClick||props.onClickOnce)&&onClick},[slots.prepend&&createBaseVNode(`div`,{"key":`prepend`,"class":`v-date-picker-header__prepend`},[slots.prepend()]),hasContent&&createVNode(MaybeTransition,{"key":`content`,"name":props.transition},{default:()=>[createBaseVNode(`div`,{"key":props.header,"class":`v-date-picker-header__content`},[slots.default?.()??props.header])]}),hasAppend&&createBaseVNode(`div`,{"class":`v-date-picker-header__append`},[!slots.append?createVNode(VBtn,{"key":`append-btn`,"icon":props.appendIcon,"variant":`text`,"onClick":onClickAppend},null):createVNode(VDefaultsProvider,{"key":`append-defaults`,"disabled":!props.appendIcon,"defaults":{VBtn:{icon:props.appendIcon,variant:`text`}}},{default:()=>[slots.append?.()]})])])});return{}}});var makeCalendarProps=propsFactory({allowedDates:[Array,Function],disabled:{type:Boolean,default:null},displayValue:null,modelValue:Array,month:[Number,String],max:null,min:null,showAdjacentMonths:Boolean,year:[Number,String],weekdays:{type:Array,default:()=>[0,1,2,3,4,5,6]},weeksInMonth:{type:String,default:`dynamic`},firstDayOfWeek:{type:[Number,String],default:void 0},firstDayOfYear:{type:[Number,String],default:void 0},weekdayFormat:String},`calendar`);function useCalendar(props){const adapter=useDate();const model=useProxiedModel(props,`modelValue`,[],v=>wrapInArray(v).map(i=>adapter.date(i)));const displayValue=computed(()=>{if(props.displayValue)return adapter.date(props.displayValue);if(model.value.length>0)return adapter.date(model.value[0]);if(props.min)return adapter.date(props.min);if(Array.isArray(props.allowedDates))return adapter.date(props.allowedDates[0]);return adapter.date()});const year=useProxiedModel(props,`year`,void 0,v=>{const value=!isNullOrUndefined(v)?Number(v):adapter.getYear(displayValue.value);return adapter.startOfYear(adapter.setYear(adapter.date(),value))},v=>adapter.getYear(v));const month=useProxiedModel(props,`month`,void 0,v=>{const value=!isNullOrUndefined(v)?Number(v):adapter.getMonth(displayValue.value);const date=adapter.setYear(adapter.startOfMonth(adapter.date()),adapter.getYear(year.value));return adapter.setMonth(date,value)},v=>adapter.getMonth(v));const weekdayLabels=computed(()=>{const firstDayOfWeek=adapter.toJsDate(adapter.startOfWeek(adapter.date(),props.firstDayOfWeek)).getDay();return adapter.getWeekdays(props.firstDayOfWeek,props.weekdayFormat).filter((_,i)=>props.weekdays.includes((i+firstDayOfWeek)%7))});const weeksInMonth=computed(()=>{const weeks=adapter.getWeekArray(month.value,props.firstDayOfWeek);const days=weeks.flat();const daysInMonth=42;if(props.weeksInMonth===`static`&&days.length<daysInMonth){const lastDay=days[days.length-1];let week=[];for(let day=1;day<=daysInMonth-days.length;day++){week.push(adapter.addDays(lastDay,day));if(day%7===0){weeks.push(week);week=[]}}}return weeks});function genDays(days,today){return days.filter(date=>{return props.weekdays.includes(adapter.toJsDate(date).getDay())}).map((date,index)=>{const isoDate=adapter.toISO(date);const isAdjacent=!adapter.isSameMonth(date,month.value);const isStart=adapter.isSameDay(date,adapter.startOfMonth(month.value));const isEnd=adapter.isSameDay(date,adapter.endOfMonth(month.value));const isSame=adapter.isSameDay(date,month.value);const weekdaysCount=props.weekdays.length;return{date,formatted:adapter.format(date,`keyboardDate`),isAdjacent,isDisabled:isDisabled(date),isEnd,isHidden:isAdjacent&&!props.showAdjacentMonths,isSame,isSelected:model.value.some(value=>adapter.isSameDay(date,value)),isStart,isToday:adapter.isSameDay(date,today),isWeekEnd:index%weekdaysCount===weekdaysCount-1,isWeekStart:index%weekdaysCount===0,isoDate,localized:adapter.format(date,`dayOfMonth`),month:adapter.getMonth(date),year:adapter.getYear(date)}})}const daysInWeek=computed(()=>{const lastDay=adapter.startOfWeek(displayValue.value,props.firstDayOfWeek);const week=[];for(let day=0;day<=6;day++)week.push(adapter.addDays(lastDay,day));return genDays(week,adapter.date())});const daysInMonth=computed(()=>{return genDays(weeksInMonth.value.flat(),adapter.date())});const weekNumbers=computed(()=>{return weeksInMonth.value.map(week=>{return week.length?adapter.getWeek(week[0],props.firstDayOfWeek,props.firstDayOfYear):null})});const{minDate,maxDate}=useCalendarRange(props);function isDisabled(value){if(props.disabled)return true;const date=adapter.date(value);if(minDate.value&&adapter.isBefore(adapter.endOfDay(date),minDate.value))return true;if(maxDate.value&&adapter.isAfter(date,maxDate.value))return true;if(Array.isArray(props.allowedDates)&&props.allowedDates.length>0)return!props.allowedDates.some(d=>adapter.isSameDay(adapter.date(d),date));if(isFunction(props.allowedDates))return!props.allowedDates(date);return false}return{displayValue,daysInMonth,daysInWeek,genDays,model,weeksInMonth,weekdayLabels,weekNumbers}}function useCalendarRange(props){const adapter=useDate();const minDate=computed(()=>{if(!props.min)return null;const date=adapter.date(props.min);return adapter.isValid(date)?date:null});const maxDate=computed(()=>{if(!props.max)return null;const date=adapter.date(props.max);return adapter.isValid(date)?date:null});function clampDate(date){if(minDate.value&&adapter.isBefore(date,minDate.value))return minDate.value;if(maxDate.value&&adapter.isAfter(date,maxDate.value))return maxDate.value;return date}function isInAllowedRange(date){return(!minDate.value||adapter.isAfter(date,minDate.value))&&(!maxDate.value||adapter.isBefore(date,maxDate.value))}return{minDate,maxDate,clampDate,isInAllowedRange}}function useVirtualFocus(items,options){const{control,orientation=`vertical`,circular=false,columns:_columns,onHighlight}=options;const highlightedId=shallowRef();let previousEl=null;function applyHighlight(id){const item=items().find(i=>i.id===id);if(!item?.el)return false;const el=toValue(item.el);if(!el)return false;const controlEl=toValue(control);if(controlEl){const itemId=el.getAttribute(`id`);if(itemId)controlEl.setAttribute(`aria-activedescendant`,itemId)}if(previousEl)delete previousEl.dataset.highlighted;el.dataset.highlighted=``;previousEl=el;el.scrollIntoView?.({block:`nearest`});onHighlight?.(id);return true}function mod(n,i){return(i%n+n)%n}function indexOf(id){return items().findIndex(item=>item.id===id)}function go(id){highlightedId.value=id;applyHighlight(id)}function step(stride){const all=items();if(!all.length)return;const current=isNullOrUndefined(highlightedId.value)?-1:indexOf(highlightedId.value);const dir=stride>0?1:-1;const abs=Math.abs(stride);const maxHops=Math.ceil(all.length/abs);let index=current+stride;let hops=0;if(circular)index=mod(all.length,index);else if(index<0||index>=all.length)return;while(hops<maxHops){const item=all[index];if(item&&!toValue(item.disabled)){go(item.id);return}hops++;index=circular?mod(all.length,index+stride):index+dir*abs;if(!circular&&(index<0||index>=all.length))return}}function first(){const item=items().find(i=>!toValue(i.disabled));if(item)go(item.id)}function last(){const item=[...items()].reverse().find(i=>!toValue(i.disabled));if(item)go(item.id)}function rowFirst(){const cols=toValue(_columns)??0;if(!cols)return first();const all=items();const cur=isNullOrUndefined(highlightedId.value)?0:Math.max(0,indexOf(highlightedId.value));const start=cur-cur%cols;for(let i=start;i<Math.min(start+cols,all.length);i++)if(!toValue(all[i]?.disabled)){go(all[i].id);return}}function rowLast(){const cols=toValue(_columns)??0;if(!cols)return last();const all=items();const cur=isNullOrUndefined(highlightedId.value)?0:Math.max(0,indexOf(highlightedId.value));const start=cur-cur%cols;const end=Math.min(start+cols,all.length);for(let i=end-1;i>=start;i--)if(!toValue(all[i]?.disabled)){go(all[i].id);return}}function highlight(id){const prev=highlightedId.value;highlightedId.value=id;if(!applyHighlight(id))highlightedId.value=prev}function focusHighlighted(){if(isNullOrUndefined(highlightedId.value))return;const item=items().find(i=>i.id===highlightedId.value);if(!item?.el)return;toValue(item.el)?.focus()}function clear(){highlightedId.value=void 0;toValue(control)?.removeAttribute(`aria-activedescendant`);if(previousEl){delete previousEl.dataset.highlighted;previousEl=null}}function isRtl(e){const el=e.currentTarget;return el?getComputedStyle(el).direction===`rtl`:false}function onKeydown(e){const cols=toValue(_columns);const rtl=isRtl(e);if(cols){switch(e.key){case`ArrowRight`:e.preventDefault();step(rtl?-1:1);break;case`ArrowLeft`:e.preventDefault();step(rtl?1:-1);break;case`ArrowDown`:e.preventDefault();step(cols);break;case`ArrowUp`:e.preventDefault();step(-cols);break;case`Home`:e.preventDefault();e.ctrlKey?first():rowFirst();break;case`End`:e.preventDefault();e.ctrlKey?last():rowLast()}return}const prevKeys=[];const nextKeys=[];if(orientation===`vertical`||orientation===`both`){prevKeys.push(`ArrowUp`);nextKeys.push(`ArrowDown`)}if(orientation===`horizontal`||orientation===`both`){prevKeys.push(rtl?`ArrowRight`:`ArrowLeft`);nextKeys.push(rtl?`ArrowLeft`:`ArrowRight`)}if(prevKeys.includes(e.key)){e.preventDefault();step(-1)}else if(nextKeys.includes(e.key)){e.preventDefault();step(1)}else if(e.key===`Home`){e.preventDefault();first()}else if(e.key===`End`){e.preventDefault();last()}}onScopeDispose(clear);return{highlightedId,highlight,focusHighlighted,clear,next:()=>step(1),prev:()=>step(-1),first,last,onKeydown}}function keyToDirection(key){switch(key){case`ArrowUp`:return`up`;case`ArrowDown`:return`down`;case`ArrowLeft`:return`left`;case`ArrowRight`:return`right`;default:return null}}function useGridSelection({items,columns,initialValue,itemAttribute,onSelect,onNavigation,onHighlight,onEscape}){const hasFocusIn=shallowRef(false);const containerEl=shallowRef();const virtualFocus=useVirtualFocus(()=>items().map(item=>({id:item.value,disabled:item.isDisabled,el:()=>containerEl.value?.querySelector(`[${itemAttribute}="${item.value}"]`)})),{control:containerEl,columns});if(onHighlight)watch(virtualFocus.highlightedId,id=>onHighlight(id));function onFocusin(e){const grid=containerEl.value;if(!grid||grid.contains(e.relatedTarget))return;hasFocusIn.value=true;const targetId=e.target?.getAttribute?.(itemAttribute);if(!isNullOrUndefined(targetId)&&items().some(item=>String(item.value)===targetId)){virtualFocus.highlight(targetId);return}const initial=initialValue(virtualFocus.highlightedId.value);if(!isNullOrUndefined(initial))virtualFocus.highlight(initial);virtualFocus.focusHighlighted()}function onFocusout(e){if(containerEl.value?.contains(e.relatedTarget))return;hasFocusIn.value=false;virtualFocus.clear()}function onActivate(){const id=virtualFocus.highlightedId.value;if(isNullOrUndefined(id))return;const item=items().find(x=>x.value===id);if(item&&!item.isDisabled)onSelect(id)}function selectItem(value){virtualFocus.highlight(value);virtualFocus.focusHighlighted();onSelect(value)}function focusItem(value){virtualFocus.highlight(value);if(isNullOrUndefined(virtualFocus.highlightedId.value))virtualFocus.first();virtualFocus.focusHighlighted()}function onContainerKeydown(e){if(e.key===`Escape`){e.preventDefault();onEscape?.();return}if((e.key===`Enter`||e.key===` `)&&!isNullOrUndefined(virtualFocus.highlightedId.value)){e.preventDefault();onActivate();return}const direction=keyToDirection(e.key);if(direction&&onNavigation?.(direction,e,virtualFocus.highlightedId.value))return;virtualFocus.onKeydown(e);virtualFocus.focusHighlighted()}return{containerProps:computed(()=>({ref:el=>containerEl.value=el??void 0,tabindex:hasFocusIn.value?-1:0,onKeydown:onContainerKeydown,onFocusin,onFocusout})),containerEl,selectItem,focusItem,clear:virtualFocus.clear}}function useRangePicker({multiple,model,compare,normalizeEnd=v=>v,previewValue:externalPreview}){const rangeStart=computed(()=>model.value.length>=1?model.value[0]:void 0);const rangeEnd=computed(()=>model.value.length>=2?model.value[model.value.length-1]:void 0);const previewValue=externalPreview??shallowRef();const previewRange=computed(()=>{if(multiple.value!==`range`)return null;if(!rangeStart.value||rangeEnd.value)return null;if(!previewValue.value)return null;const start=rangeStart.value;const preview=previewValue.value;if(compare(start,preview)===0)return null;return compare(start,preview)<0?[start,preview]:[preview,start]});function isSelected(value){if(multiple.value===`range`&&model.value.length===2)return isWithinRange(value);for(const v of model.value)if(compare(v,value)===0)return true;return false}function isWithinRange(value){if(multiple.value!==`range`||model.value.length<2)return false;const[start,end]=[model.value[0],model.value[model.value.length-1]];return compare(value,start)>=0&&compare(value,end)<=0}function isRangeStart(value){if(multiple.value!==`range`||model.value.length<2)return false;return compare(value,model.value[0])===0}function isRangeEnd(value){if(multiple.value!==`range`||model.value.length<2)return false;return compare(value,model.value[model.value.length-1])===0}function isRangeMiddle(value){return isWithinRange(value)&&!isRangeStart(value)&&!isRangeEnd(value)}function select(value){if(multiple.value===`range`)onRangeSelect(value);else if(multiple.value)onMultipleSelect(value);else model.value=[value]}function onRangeSelect(value){if(model.value.length===0)model.value=[value];else if(model.value.length===1){const start=model.value[0];if(compare(value,start)===0)model.value=[];else if(compare(value,start)<0)model.value=[value,normalizeEnd(start)];else model.value=[start,normalizeEnd(value)]}else model.value=[value]}function setPreview(value){previewValue.value=value}function clearPreview(){previewValue.value=void 0}function isPreviewStart(value){const range=previewRange.value;if(!range)return false;return compare(value,range[0])===0}function isPreviewEnd(value){const range=previewRange.value;if(!range)return false;return compare(value,range[1])===0}function isPreviewMiddle(value){const range=previewRange.value;if(!range)return false;return compare(value,range[0])>0&&compare(value,range[1])<0}function isInPreviewRange(value){return isPreviewStart(value)||isPreviewEnd(value)||isPreviewMiddle(value)}function onMultipleSelect(value){const index=model.value.findIndex(v=>compare(v,value)===0);if(index===-1)model.value=[...model.value,value];else{const copy=[...model.value];copy.splice(index,1);model.value=copy}}return{isSelected,isRangeStart,isRangeEnd,isRangeMiddle,select,setPreview,clearPreview,isPreviewStart,isPreviewEnd,isPreviewMiddle,isInPreviewRange}}var makeVDatePickerMonthProps=propsFactory({color:String,hideWeekdays:Boolean,multiple:[Boolean,Number,String],showWeek:Boolean,readonly:Boolean,transition:{type:String,default:`picker-transition`},reverseTransition:{type:String,default:`picker-reverse-transition`},events:{type:[Array,Function,Object],default:()=>null},eventColor:{type:[Array,Function,Object,String],default:()=>null},noAutoNavigation:Boolean,previewValue:null,...omit(makeCalendarProps(),[`displayValue`])},`VDatePickerMonth`);var VDatePickerMonth=genericComponent()({name:`VDatePickerMonth`,props:makeVDatePickerMonthProps(),emits:{"update:modelValue":date=>true,"update:month":date=>true,"update:year":date=>true,"update:previewValue":_value=>true,"boundary-navigate":_payload=>true},setup(props,{emit,slots}){const uid=useId();const{t}=useLocale();const{daysInMonth,model,weekNumbers,weekdayLabels}=useCalendar(props);const adapter=useDate();const isReverse=shallowRef(false);const transition=toRef(()=>{return!isReverse.value?props.transition:props.reverseTransition});function compareDays(a,b){if(adapter.isSameDay(a,b))return 0;return adapter.isBefore(a,b)?-1:1}const previewValue=useProxiedModel(props,`previewValue`);const range=useRangePicker({multiple:computed(()=>{if(props.multiple===`range`)return`range`;return!!props.multiple}),model,compare:compareDays,normalizeEnd:value=>adapter.endOfDay(value),previewValue});const selectionColor=toRef(()=>props.color||`surface-variant`);const{backgroundColorClasses:rangeColorClasses,backgroundColorStyles:rangeColorStyles}=useBackgroundColor(selectionColor);const atMax=computed(()=>{const max=[`number`,`string`].includes(typeof props.multiple)?Number(props.multiple):Infinity;return model.value.length>=max});const dayRows=computed(()=>{return chunkArray(daysInMonth.value,props.weekdays.length)});function isSelectedDay(item){return range.isSelected(item.date)}function isDayDisabled(item){return item.isDisabled||item.isHidden||atMax.value&&!isSelectedDay(item)}function getDateAriaLabel(item){const fullDate=adapter.format(item.date,`fullDateWithWeekday`);const localeKey=item.isToday?`currentDate`:`selectDate`;return t(`$vuetify.datePicker.ariaLabel.${localeKey}`,fullDate)}function onClick(value){range.select(adapter.startOfDay(value))}function initialFocusDate(current){const isVisible=d=>!d.isAdjacent&&!d.isDisabled;if(current!=null){const cur=daysInMonth.value.find(d=>d.isoDate===current);if(cur&&!cur.isAdjacent)return current}return(daysInMonth.value.find(d=>isVisible(d)&&model.value.some(m=>adapter.isSameDay(m,d.date)))??daysInMonth.value.find(isVisible))?.isoDate}const{containerProps,containerEl,selectItem,focusItem,clear}=useGridSelection({items:()=>daysInMonth.value.map(d=>({value:d.isoDate,isDisabled:isDayDisabled(d)})),columns:()=>props.weekdays.length,initialValue:initialFocusDate,itemAttribute:`data-v-date`,onSelect:onDaySelect,onNavigation:onNavigationBoundary,onEscape});function onDaySelect(isoDate){const item=daysInMonth.value.find(d=>d.isoDate===isoDate);if(!item||isDayDisabled(item))return;onClick(item.date);if(item.isAdjacent){emit(`update:month`,adapter.getMonth(item.date));emit(`update:year`,adapter.getYear(item.date));nextTick$1(()=>focusItem(isoDate))}}function onNavigationBoundary(direction,e,curId){if(curId==null)return false;const cols=props.weekdays.length;const rtl=getComputedStyle(e.currentTarget).direction===`rtl`;let stride;let calendarDays;if(direction===`left`){stride=rtl?1:-1;calendarDays=stride}else if(direction===`right`){stride=rtl?-1:1;calendarDays=stride}else if(direction===`up`){stride=-cols;calendarDays=-7}else{stride=cols;calendarDays=7}const all=daysInMonth.value;const curIndex=all.findIndex(d=>d.isoDate===curId);if(curIndex<0)return false;const targetItem=all[curIndex+stride];if(targetItem&&!targetItem.isHidden)return false;e.preventDefault();let targetIsoDate;if(targetItem)targetIsoDate=targetItem.isoDate;else{const step=calendarDays<0?-1:1;let candidate=adapter.addDays(adapter.date(curId),calendarDays);while(!props.weekdays.includes(adapter.toJsDate(candidate).getDay()))candidate=adapter.addDays(candidate,step);targetIsoDate=adapter.toISO(candidate)}if(props.noAutoNavigation){emit(`boundary-navigate`,{direction,targetIsoDate});return true}const targetDate=adapter.date(targetIsoDate);emit(`update:month`,adapter.getMonth(targetDate));emit(`update:year`,adapter.getYear(targetDate));nextTick$1(()=>focusItem(targetIsoDate));return true}function onEscape(){const rawTarget=model.value[0]??adapter.date();const targetIso=adapter.toISO(adapter.date(rawTarget));if(daysInMonth.value.find(d=>d.isoDate===targetIso&&!d.isAdjacent)){focusItem(targetIso);return}const targetDate=adapter.date(rawTarget);emit(`update:month`,adapter.getMonth(targetDate));emit(`update:year`,adapter.getYear(targetDate));nextTick$1(()=>focusItem(targetIso))}function onDayClick(item){if(item.isAdjacent)onDaySelect(item.isoDate);else selectItem(item.isoDate)}function focusGrid(){containerEl.value?.focus()}watch(daysInMonth,(val,oldVal)=>{if(!oldVal||val[0].isoDate===oldVal[0].isoDate)return;isReverse.value=adapter.isBefore(val[0].date,oldVal[0].date);clear()});function getEventColors(date){const{events,eventColor}=props;let eventData;let eventColors=[];if(Array.isArray(events))eventData=events.includes(date);else if(events instanceof Function)eventData=events(date)||false;else if(events)eventData=events[date]||false;else eventData=false;if(!eventData)return[];else if(eventData!==true)eventColors=wrapInArray(eventData);else if(isString(eventColor))eventColors=[eventColor];else if(isFunction(eventColor))eventColors=wrapInArray(eventColor(date));else if(Array.isArray(eventColor))eventColors=eventColor;else if(isObject$1(eventColor))eventColors=wrapInArray(eventColor[date]);return!eventColors.length?[`surface-variant`]:eventColors.filter(Boolean).map(color=>isString(color)?color:`surface-variant`)}function genEvents(date){const eventColors=getEventColors(date);if(!eventColors.length)return null;return createBaseVNode(`div`,{"class":`v-date-picker-month__events`},[eventColors.map(color=>createVNode(VBadge,{"dot":true,"color":color},null))])}useRender(()=>createBaseVNode(`div`,{"class":`v-date-picker-month`,"style":{"--v-date-picker-days-in-week":props.weekdays.length}},[props.showWeek&&createBaseVNode(`div`,{"key":`weeks`,"class":`v-date-picker-month__weeks`},[!props.hideWeekdays&&createBaseVNode(`div`,{"key":`hide-week-days`,"class":`v-date-picker-month__day`},[createTextVNode(`\xA0`)]),weekNumbers.value.map(week=>createBaseVNode(`div`,{"class":normalizeClass([`v-date-picker-month__day`,`v-date-picker-month__day--adjacent`])},[week]))]),createVNode(MaybeTransition,{"name":transition.value},{default:()=>[createBaseVNode(`div`,mergeProps({"key":daysInMonth.value[0].date?.toString(),"class":`v-date-picker-month__days`,"role":`grid`,"onMouseleave":range.clearPreview},containerProps.value),[!props.hideWeekdays&&createBaseVNode(`div`,{"key":`weekday-labels`,"class":`v-date-picker-month__days-row`},[weekdayLabels.value.map(weekDay=>createBaseVNode(`div`,{"class":normalizeClass([`v-date-picker-month__day`,`v-date-picker-month__weekday`])},[weekDay]))]),dayRows.value.map((row,rowIndex)=>createBaseVNode(`div`,{"class":`v-date-picker-month__days-row`,"role":`row`},[row.map((item,colIndex)=>{const i=rowIndex*props.weekdays.length+colIndex;const isSelected=isSelectedDay(item);const disabled=isDayDisabled(item);const rangeStart=range.isRangeStart(item.date);const rangeEnd=range.isRangeEnd(item.date);const rangeMiddle=range.isRangeMiddle(item.date);const previewStart=range.isPreviewStart(item.date);const previewEnd=range.isPreviewEnd(item.date);const previewMiddle=range.isPreviewMiddle(item.date);const slotProps={props:{class:`v-date-picker-month__day-btn`,color:isSelected&&!rangeMiddle||item.isToday?props.color:void 0,disabled,readonly:props.readonly,icon:true,ripple:false,tabindex:-1,variant:isSelected&&!rangeMiddle?`flat`:item.isToday?`outlined`:`text`,"aria-label":getDateAriaLabel(item),"aria-current":item.isToday?`date`:void 0,id:`${uid}-day-${item.isoDate}`,"data-v-date":!disabled?item.isoDate:void 0,onMousedown:e=>e.preventDefault(),onClick:()=>onDayClick(item),onMouseenter:()=>range.setPreview(item.date),onFocus:()=>range.setPreview(item.date),onBlur:range.clearPreview},item,i};const hasRangeBg=rangeStart||rangeEnd||rangeMiddle;const hasPreviewBg=previewStart||previewEnd||previewMiddle;return createBaseVNode(`div`,{"class":normalizeClass([`v-date-picker-month__day`,{"v-date-picker-month__day--adjacent":item.isAdjacent,"v-date-picker-month__day--hide-adjacent":item.isHidden,"v-date-picker-month__day--selected":isSelected,"v-date-picker-month__day--week-end":item.isWeekEnd,"v-date-picker-month__day--week-start":item.isWeekStart,"v-date-picker-month__day--range-start":rangeStart,"v-date-picker-month__day--range-end":rangeEnd,"v-date-picker-month__day--range-middle":rangeMiddle,"v-date-picker-month__day--preview-start":previewStart,"v-date-picker-month__day--preview-end":previewEnd,"v-date-picker-month__day--preview-middle":previewMiddle}]),"role":`gridcell`},[(hasRangeBg||hasPreviewBg)&&createBaseVNode(`div`,{"key":`range-bg`,"class":normalizeClass([`v-date-picker-month__range-bg`,hasRangeBg?`v-date-picker-month__range-bg--range`:`v-date-picker-month__range-bg--preview`,rangeColorClasses.value]),"style":normalizeStyle(rangeColorStyles.value)},null),(props.showAdjacentMonths||!item.isAdjacent)&&(slots.day?.(slotProps)??createVNode(VBtn,slotProps.props,{default:()=>[item.localized,genEvents(item.isoDate)]}))])})]))])]})]));return{focusGrid,focusItem}}});var makeVDatePickerMonthsProps=propsFactory({color:String,columns:{type:Number,default:2},height:[String,Number],min:null,max:null,modelValue:Number,year:Number,allowedMonths:[Array,Function]},`VDatePickerMonths`);var VDatePickerMonths=genericComponent()({name:`VDatePickerMonths`,props:makeVDatePickerMonthsProps(),emits:{"update:modelValue":date=>true,escape:()=>true},setup(props,{emit,slots}){const adapter=useDate();const model=useProxiedModel(props,`modelValue`);const uid=useId();const months=computed(()=>{let date=adapter.startOfYear(adapter.date());if(props.year)date=adapter.setYear(date,props.year);return range(12).map(i=>{const text=adapter.format(date,`monthShort`);const label=adapter.format(date,`month`);const isDisabled=!!(!isMonthAllowed(i)||props.min&&adapter.isAfter(adapter.startOfMonth(adapter.date(props.min)),date)||props.max&&adapter.isAfter(date,adapter.startOfMonth(adapter.date(props.max))));date=adapter.getNextMonth(date);return{isDisabled,text,label,value:i}})});watchEffect(()=>{model.value=model.value??adapter.getMonth(adapter.date())});function isMonthAllowed(month){if(Array.isArray(props.allowedMonths)&&props.allowedMonths.length)return props.allowedMonths.includes(month);if(isFunction(props.allowedMonths))return props.allowedMonths(month);return true}function onMonthSelect(value){if(model.value===value)emit(`update:modelValue`,value);else model.value=value}const{containerProps,selectItem}=useGridSelection({items:()=>months.value,columns:()=>props.columns,initialValue:current=>current??model.value??adapter.getMonth(adapter.date()),itemAttribute:`data-v-month`,onSelect:onMonthSelect,onEscape:()=>emit(`escape`)});useRender(()=>createBaseVNode(`div`,{"class":`v-date-picker-months`,"style":{height:convertToUnit(props.height)}},[createBaseVNode(`div`,mergeProps({"class":`v-date-picker-months__content`,"style":{"--v-date-picker-months-columns":props.columns}},containerProps.value),[months.value.map((month,i)=>{const btnProps={id:`${uid}-month-${i}`,active:model.value===i,ariaLabel:month.label,color:model.value===i?props.color:void 0,disabled:month.isDisabled,rounded:true,tabindex:-1,text:month.text,variant:model.value===month.value?`flat`:`text`,"data-v-month":month.value,onMousedown:e=>e.preventDefault(),onClick:()=>selectItem(i)};return slots.month?.({month,i,props:btnProps})??createVNode(VBtn,mergeProps({"key":`month`},btnProps),null)})])]));return{}}});var makeVDatePickerYearsProps=propsFactory({color:String,columns:{type:Number,default:3},height:[String,Number],min:null,max:null,modelValue:Number,allowedYears:[Array,Function]},`VDatePickerYears`);var VDatePickerYears=genericComponent()({name:`VDatePickerYears`,props:makeVDatePickerYearsProps(),directives:{vIntersect:Intersect},emits:{"update:modelValue":year=>true,escape:()=>true},setup(props,{emit,slots}){const adapter=useDate();const model=useProxiedModel(props,`modelValue`);const containerRef=templateRef();const uid=useId();const years=computed(()=>{const year=adapter.getYear(adapter.date());let min=year-100;let max=year+52;if(props.min)min=adapter.getYear(adapter.date(props.min));if(props.max)max=adapter.getYear(adapter.date(props.max));let date=adapter.startOfYear(adapter.date());date=adapter.setYear(date,min);return range(max-min+1,min).map(i=>{const text=adapter.format(date,`year`);date=adapter.setYear(date,adapter.getYear(date)+1);return{text,value:i,isDisabled:!isYearAllowed(i)}})});watchEffect(()=>{model.value=model.value??adapter.getYear(adapter.date())});function isYearAllowed(year){if(Array.isArray(props.allowedYears)&&props.allowedYears.length)return props.allowedYears.includes(year);if(isFunction(props.allowedYears))return props.allowedYears(year);return true}function onYearSelect(value){if(model.value===value)emit(`update:modelValue`,value);else model.value=value}const{containerProps,containerEl,selectItem}=useGridSelection({items:()=>years.value,columns:()=>props.columns,initialValue:current=>current??model.value??adapter.getYear(adapter.date()),itemAttribute:`data-v-year`,onSelect:onYearSelect,onEscape:()=>emit(`escape`)});function scrollToSelected(){const container=containerRef.el;const target=containerEl.value?.querySelector(`[data-v-year="${model.value}"]`);if(!container||!target)return;const containerRect=container.getBoundingClientRect();const targetRect=target.getBoundingClientRect();container.scrollTop+=targetRect.top-containerRect.top-container.clientHeight/2+targetRect.height/2}useRender(()=>withDirectives(createBaseVNode(`div`,{"class":`v-date-picker-years`,"ref":containerRef,"tabindex":-1,"style":{height:convertToUnit(props.height)}},[createBaseVNode(`div`,mergeProps({"class":`v-date-picker-years__content`,"style":{"--v-date-picker-years-columns":props.columns}},containerProps.value),[years.value.map((year,i)=>{const btnProps={id:`${uid}-year-${year.value}`,active:model.value===year.value,color:model.value===year.value?props.color:void 0,rounded:true,tabindex:-1,text:year.text,disabled:year.isDisabled,variant:model.value===year.value?`flat`:`text`,"data-v-year":year.value,onMousedown:e=>e.preventDefault(),onClick:()=>selectItem(year.value)};return slots.year?.({year,i,props:btnProps})??createVNode(VBtn,mergeProps({"key":`month`},btnProps),null)})])]),[[Intersect,{handler:scrollToSelected},null,{once:true}]]));return{}}});var makeVDatePickerProps=propsFactory({header:{type:String,default:`$vuetify.datePicker.header`},headerColor:String,headerDateFormat:{type:String,default:`normalDateWithWeekday`},landscapeHeaderWidth:[Number,String],...omit(makeVDatePickerControlsProps(),[`active`,`monthText`,`yearText`]),...makeVDatePickerMonthProps({weeksInMonth:`static`}),...omit(makeVDatePickerMonthsProps(),[`modelValue`,`columns`]),...omit(makeVDatePickerYearsProps(),[`modelValue`,`columns`]),...makeVPickerProps({title:`$vuetify.datePicker.title`}),modelValue:null},`VDatePicker`);var VDatePicker=genericComponent()({name:`VDatePicker`,props:makeVDatePickerProps(),emits:{"update:modelValue":date=>true,"update:month":date=>true,"update:year":date=>true,"update:previewValue":_value=>true,"update:viewMode":date=>true,"boundary-navigate":_payload=>true},setup(props,{emit,slots}){const adapter=useDate();const{t}=useLocale();const{rtlClasses}=useRtl();const model=useProxiedModel(props,`modelValue`,void 0,v=>wrapInArray(v).map(i=>adapter.date(i)),v=>props.multiple?v:v[0]);const viewMode=useProxiedModel(props,`viewMode`);const previewValue=useProxiedModel(props,`previewValue`);const{minDate,maxDate,clampDate}=useCalendarRange(props);const internal=computed(()=>{const today=adapter.date();const value=model.value?.[0]?adapter.date(model.value[0]):clampDate(today);return value&&adapter.isValid(value)?value:today});const headerColor=toRef(()=>props.headerColor??props.color);const _month=useProxiedModel(props,`month`);const month=computed({get:()=>Number(_month.value??adapter.getMonth(adapter.startOfMonth(internal.value))),set:v=>_month.value=v});const _year=useProxiedModel(props,`year`);const year=computed({get:()=>Number(_year.value??adapter.getYear(adapter.startOfYear(adapter.setMonth(internal.value,month.value)))),set:v=>_year.value=v});const isReversing=shallowRef(false);const header=computed(()=>{if(props.multiple===`range`&&model.value.length===2){const[startDate,endDate]=model.value;const daysBetween=adapter.getDiff(endDate,startDate,`days`)+1;return t(`$vuetify.datePicker.itemsSelected`,daysBetween)}if(props.multiple&&model.value.length>1)return t(`$vuetify.datePicker.itemsSelected`,model.value.length);const formattedDate=model.value[0]&&adapter.isValid(model.value[0])?adapter.format(adapter.date(model.value[0]),props.headerDateFormat):t(props.header);return props.landscape&&formattedDate.split(` `).length===3?formattedDate.replace(` `,`
|
|
68
|
+
`):formattedDate});const monthStart=toRef(()=>{let date=adapter.date();date=adapter.setDate(date,1);date=adapter.setMonth(date,month.value);date=adapter.setYear(date,year.value);return date});const monthYearText=toRef(()=>adapter.format(monthStart.value,`monthAndYear`));const monthText=toRef(()=>adapter.format(monthStart.value,`monthShort`));const yearText=toRef(()=>adapter.format(monthStart.value,`year`));const headerTransition=toRef(()=>`date-picker-header${isReversing.value?`-reverse`:``}-transition`);const disabled=computed(()=>{if(props.disabled)return true;const targets=[];if(viewMode.value!==`month`)targets.push(...[`prev-month`,`next-month`,`prev-year`,`next-year`]);else{let _date=adapter.date();_date=adapter.startOfMonth(_date);_date=adapter.setMonth(_date,month.value);_date=adapter.setYear(_date,year.value);if(minDate.value){const prevMonthEnd=adapter.addDays(adapter.startOfMonth(_date),-1);const prevYearEnd=adapter.addDays(adapter.startOfYear(_date),-1);adapter.isAfter(minDate.value,prevMonthEnd)&&targets.push(`prev-month`);adapter.isAfter(minDate.value,prevYearEnd)&&targets.push(`prev-year`)}if(maxDate.value){const nextMonthStart=adapter.addDays(adapter.endOfMonth(_date),1);const nextYearStart=adapter.addDays(adapter.endOfYear(_date),1);adapter.isAfter(nextMonthStart,maxDate.value)&&targets.push(`next-month`);adapter.isAfter(nextYearStart,maxDate.value)&&targets.push(`next-year`)}}return targets});const allowedYears=computed(()=>{return props.allowedYears||isYearAllowed});const allowedMonths=computed(()=>{return props.allowedMonths||isMonthAllowed});function isAllowedInRange(start,end){const allowedDates=props.allowedDates;if(!isFunction(allowedDates))return true;const days=1+daysDiff(adapter,start,end);for(let i=0;i<days;i++)if(allowedDates(adapter.addDays(start,i)))return true;return false}function isYearAllowed(year){if(isFunction(props.allowedDates)){const startOfYear=adapter.parseISO(`${year}-01-01`);return isAllowedInRange(startOfYear,adapter.endOfYear(startOfYear))}if(Array.isArray(props.allowedDates)&&props.allowedDates.length){for(const date of props.allowedDates)if(adapter.getYear(adapter.date(date))===year)return true;return false}return true}function isMonthAllowed(month){if(isFunction(props.allowedDates)){const monthTwoDigits=String(month+1).padStart(2,`0`);const startOfMonth=adapter.parseISO(`${year.value}-${monthTwoDigits}-01`);return isAllowedInRange(startOfMonth,adapter.endOfMonth(startOfMonth))}if(Array.isArray(props.allowedDates)&&props.allowedDates.length){for(const date of props.allowedDates)if(adapter.getYear(adapter.date(date))===year.value&&adapter.getMonth(adapter.date(date))===month)return true;return false}return true}function onClickNextMonth(){if(month.value<11)month.value++;else{year.value++;month.value=0;onUpdateYear()}onUpdateMonth()}function onClickPrevMonth(){if(month.value>0)month.value--;else{year.value--;month.value=11;onUpdateYear()}onUpdateMonth()}function onClickNextYear(){year.value++;if(maxDate.value){const monthTwoDigits=String(month.value+1).padStart(2,`0`);const monthStart=adapter.parseISO(`${year.value}-${monthTwoDigits}-01`);if(adapter.isAfter(monthStart,maxDate.value))month.value=adapter.getMonth(maxDate.value)}onUpdateYear()}function onClickPrevYear(){year.value--;if(minDate.value){const monthTwoDigits=String(month.value+1).padStart(2,`0`);const monthStart=adapter.endOfMonth(adapter.parseISO(`${year.value}-${monthTwoDigits}-01`));if(adapter.isAfter(minDate.value,monthStart))month.value=adapter.getMonth(minDate.value)}onUpdateYear()}const monthGridRef=shallowRef();function focusDate(isoDate){monthGridRef.value?.focusItem(isoDate)}function onClickDate(){viewMode.value=`month`}function onEscape(){viewMode.value=`month`;nextTick$1(()=>monthGridRef.value?.focusGrid())}function onClickMonth(){viewMode.value=viewMode.value===`months`?`month`:`months`}function onClickYear(){viewMode.value=viewMode.value===`year`?`month`:`year`}function onUpdateMonth(){if(viewMode.value===`months`)onClickMonth()}function onUpdateYear(){if(viewMode.value===`year`)onClickYear()}watch(model,(val,oldVal)=>{if(props.noAutoNavigation)return;const arrBefore=wrapInArray(oldVal);const arrAfter=wrapInArray(val);if(!arrAfter.length)return;const before=adapter.date(arrBefore[arrBefore.length-1]);const after=adapter.date(arrAfter[arrAfter.length-1]);if(adapter.isSameDay(before,after))return;const newMonth=adapter.getMonth(after);const newYear=adapter.getYear(after);if(newMonth!==month.value){month.value=newMonth;onUpdateMonth()}if(newYear!==year.value){year.value=newYear;onUpdateYear()}isReversing.value=adapter.isBefore(before,after)});useRender(()=>{const pickerProps=VPicker.filterProps(props);const datePickerControlsProps=omit(VDatePickerControls.filterProps(props),[`viewMode`]);const datePickerHeaderProps=VDatePickerHeader.filterProps(props);const datePickerMonthProps=VDatePickerMonth.filterProps(props);const datePickerMonthsProps=omit(VDatePickerMonths.filterProps(props),[`modelValue`]);const datePickerYearsProps=omit(VDatePickerYears.filterProps(props),[`modelValue`]);const headerProps={color:headerColor.value,header:header.value,transition:headerTransition.value};return createVNode(VPicker,mergeProps(pickerProps,{"color":headerColor.value,"class":[`v-date-picker`,`v-date-picker--${viewMode.value}`,{"v-date-picker--show-week":props.showWeek},rtlClasses.value,props.class],"style":[{"--v-date-picker-landscape-header-width":convertToUnit(props.landscapeHeaderWidth)},props.style]}),{title:()=>slots.title?.()??createBaseVNode(`div`,{"class":`v-date-picker__title`},[t(props.title)]),header:()=>slots.header?createVNode(VDefaultsProvider,{"defaults":{VDatePickerHeader:{...headerProps}}},{default:()=>[slots.header?.(headerProps)]}):createVNode(VDatePickerHeader,mergeProps({"key":`header`},datePickerHeaderProps,headerProps,{"onClick":viewMode.value!==`month`?onClickDate:void 0}),{prepend:slots.prepend,append:slots.append}),default:()=>createBaseVNode(Fragment,null,[createVNode(VDatePickerControls,mergeProps(datePickerControlsProps,{"disabled":disabled.value,"viewMode":viewMode.value,"text":monthYearText.value,"monthText":monthText.value,"yearText":yearText.value,"onClick:next":onClickNextMonth,"onClick:prev":onClickPrevMonth,"onClick:nextYear":onClickNextYear,"onClick:prevYear":onClickPrevYear,"onClick:month":onClickMonth,"onClick:year":onClickYear}),{default:slots.controls}),createVNode(VFadeTransition,{"hideOnLeave":true},{default:()=>[viewMode.value===`months`?createVNode(VDatePickerMonths,mergeProps({"key":`date-picker-months`},datePickerMonthsProps,{"modelValue":month.value,"onUpdate:modelValue":[$event=>month.value=$event,onUpdateMonth],"min":minDate.value,"max":maxDate.value,"year":year.value,"allowedMonths":allowedMonths.value,"onEscape":onEscape}),{month:slots.month}):viewMode.value===`year`?createVNode(VDatePickerYears,mergeProps({"key":`date-picker-years`},datePickerYearsProps,{"modelValue":year.value,"onUpdate:modelValue":[$event=>year.value=$event,onUpdateYear],"min":minDate.value,"max":maxDate.value,"allowedYears":allowedYears.value,"onEscape":onEscape}),{year:slots.year}):createVNode(VDatePickerMonth,mergeProps({"ref":monthGridRef,"key":`date-picker-month`},datePickerMonthProps,{"modelValue":model.value,"onUpdate:modelValue":$event=>model.value=$event,"month":month.value,"onUpdate:month":[$event=>month.value=$event,onUpdateMonth],"year":year.value,"onUpdate:year":[$event=>year.value=$event,onUpdateYear],"previewValue":previewValue.value,"onUpdate:previewValue":$event=>previewValue.value=$event,"onBoundaryNavigate":payload=>emit(`boundary-navigate`,payload),"min":minDate.value,"max":maxDate.value}),{day:slots.day})]})]),actions:slots.actions})});return{focusDate}}});var makeVMainProps=propsFactory({scrollable:Boolean,...makeComponentProps(),...makeDimensionProps(),...makeTagProps({tag:`main`})},`VMain`);var VMain=genericComponent()({name:`VMain`,props:makeVMainProps(),setup(props,{slots}){const{dimensionStyles}=useDimension(props);const{mainStyles}=useLayout();const{ssrBootStyles}=useSsrBoot();useRender(()=>createVNode(props.tag,{"class":normalizeClass([`v-main`,{"v-main--scrollable":props.scrollable},props.class]),"style":normalizeStyle([mainStyles.value,ssrBootStyles.value,dimensionStyles.value,props.style])},{default:()=>[props.scrollable?createBaseVNode(`div`,{"class":`v-main__scroller`},[slots.default?.()]):slots.default?.()]}));return{}}});function useSticky({rootEl,isSticky,layoutItemStyles}){const isStuck=shallowRef(false);const stuckPosition=shallowRef(0);const stickyStyles=computed(()=>{const side=isBoolean(isStuck.value)?`top`:isStuck.value;return[isSticky.value?{top:`auto`,bottom:`auto`,height:void 0}:void 0,isStuck.value?{[side]:convertToUnit(stuckPosition.value)}:{top:layoutItemStyles.value.top}]});onMounted(()=>{watch(isSticky,val=>{if(val)window.addEventListener(`scroll`,onScroll,{passive:true});else window.removeEventListener(`scroll`,onScroll)},{immediate:true})});onBeforeUnmount(()=>{window.removeEventListener(`scroll`,onScroll)});let lastScrollTop=0;function onScroll(){const direction=lastScrollTop>window.scrollY?`up`:`down`;const rect=rootEl.value.getBoundingClientRect();const layoutTop=parseFloat(layoutItemStyles.value.top??0);const top=window.scrollY-Math.max(0,stuckPosition.value-layoutTop);const bottom=rect.height+Math.max(stuckPosition.value,layoutTop)-window.scrollY-window.innerHeight;const bodyScroll=parseFloat(getComputedStyle(rootEl.value).getPropertyValue(`--v-body-scroll-y`))||0;if(rect.height<window.innerHeight-layoutTop){isStuck.value=`top`;stuckPosition.value=layoutTop}else if(direction===`up`&&isStuck.value===`bottom`||direction===`down`&&isStuck.value===`top`){stuckPosition.value=window.scrollY+rect.top-bodyScroll;isStuck.value=true}else if(direction===`down`&&bottom<=0){stuckPosition.value=0;isStuck.value=`bottom`}else if(direction===`up`&&top<=0){if(!bodyScroll){stuckPosition.value=rect.top+top;isStuck.value=`top`}else if(isStuck.value!==`top`){stuckPosition.value=-top+bodyScroll+layoutTop;isStuck.value=`top`}}lastScrollTop=window.scrollY}return{isStuck,stickyStyles}}var HORIZON=100;var HISTORY=20;function kineticEnergyToVelocity(work){return(work<0?-1:1)*Math.sqrt(Math.abs(work))*1.41421356237}function calculateImpulseVelocity(samples){if(samples.length<2)return 0;if(samples.length===2){if(samples[1].t===samples[0].t)return 0;return(samples[1].d-samples[0].d)/(samples[1].t-samples[0].t)}let work=0;for(let i=samples.length-1;i>0;i--){if(samples[i].t===samples[i-1].t)continue;const vprev=kineticEnergyToVelocity(work);const vcurr=(samples[i].d-samples[i-1].d)/(samples[i].t-samples[i-1].t);work+=(vcurr-vprev)*Math.abs(vcurr);if(i===samples.length-1)work*=.5}return kineticEnergyToVelocity(work)*1e3}function useVelocity(){const touches={};function addMovement(e){Array.from(e.changedTouches).forEach(touch=>{(touches[touch.identifier]??(touches[touch.identifier]=new CircularBuffer(HISTORY))).push([e.timeStamp,touch])})}function endTouch(e){Array.from(e.changedTouches).forEach(touch=>{delete touches[touch.identifier]})}function getVelocity(id){const samples=touches[id]?.values().reverse();if(!samples)throw new Error(`No samples for touch id ${id}`);const newest=samples[0];const x=[];const y=[];for(const val of samples){if(newest[0]-val[0]>HORIZON)break;x.push({t:val[0],d:val[1].clientX});y.push({t:val[0],d:val[1].clientY})}return{x:calculateImpulseVelocity(x),y:calculateImpulseVelocity(y),get direction(){const{x,y}=this;const[absX,absY]=[Math.abs(x),Math.abs(y)];return absX>absY&&x>=0?`right`:absX>absY&&x<=0?`left`:absY>absX&&y>=0?`down`:absY>absX&&y<=0?`up`:oops$1()}}}return{addMovement,endTouch,getVelocity}}function oops$1(){throw new Error}function useTouch({el,isActive,isTemporary,width,touchless,position}){onMounted(()=>{window.addEventListener(`touchstart`,onTouchstart,{passive:true});window.addEventListener(`touchmove`,onTouchmove,{passive:false});window.addEventListener(`touchend`,onTouchend,{passive:true})});onBeforeUnmount(()=>{window.removeEventListener(`touchstart`,onTouchstart);window.removeEventListener(`touchmove`,onTouchmove);window.removeEventListener(`touchend`,onTouchend)});const isHorizontal=computed(()=>[`left`,`right`].includes(position.value));const{addMovement,endTouch,getVelocity}=useVelocity();let maybeDragging=false;const isDragging=shallowRef(false);const dragProgress=shallowRef(0);const offset=shallowRef(0);let start;function getOffset(pos,active){return(position.value===`left`?pos:position.value===`right`?document.documentElement.clientWidth-pos:position.value===`top`?pos:position.value===`bottom`?document.documentElement.clientHeight-pos:oops())-(active?width.value:0)}function getProgress(pos,limit=true){const progress=position.value===`left`?(pos-offset.value)/width.value:position.value===`right`?(document.documentElement.clientWidth-pos-offset.value)/width.value:position.value===`top`?(pos-offset.value)/width.value:position.value===`bottom`?(document.documentElement.clientHeight-pos-offset.value)/width.value:oops();return limit?clamp$1(progress):progress}function onTouchstart(e){if(touchless.value)return;const touchX=e.changedTouches[0].clientX;const touchY=e.changedTouches[0].clientY;const touchZone=25;const inTouchZone=position.value===`left`?touchX<touchZone:position.value===`right`?touchX>document.documentElement.clientWidth-touchZone:position.value===`top`?touchY<touchZone:position.value===`bottom`?touchY>document.documentElement.clientHeight-touchZone:oops();const inElement=isActive.value&&(position.value===`left`?touchX<width.value:position.value===`right`?touchX>document.documentElement.clientWidth-width.value:position.value===`top`?touchY<width.value:position.value===`bottom`?touchY>document.documentElement.clientHeight-width.value:oops());if(inTouchZone||inElement||isActive.value&&isTemporary.value){start=[touchX,touchY];offset.value=getOffset(isHorizontal.value?touchX:touchY,isActive.value);dragProgress.value=getProgress(isHorizontal.value?touchX:touchY);maybeDragging=offset.value>-20&&offset.value<80;endTouch(e);addMovement(e)}}function onTouchmove(e){const touchX=e.changedTouches[0].clientX;const touchY=e.changedTouches[0].clientY;if(maybeDragging){if(!e.cancelable){maybeDragging=false;return}const dx=Math.abs(touchX-start[0]);const dy=Math.abs(touchY-start[1]);if(isHorizontal.value?dx>dy&&dx>3:dy>dx&&dy>3){isDragging.value=true;maybeDragging=false}else if((isHorizontal.value?dy:dx)>3)maybeDragging=false}if(!isDragging.value)return;e.preventDefault();addMovement(e);const progress=getProgress(isHorizontal.value?touchX:touchY,false);dragProgress.value=Math.max(0,Math.min(1,progress));if(progress>1)offset.value=getOffset(isHorizontal.value?touchX:touchY,true);else if(progress<0)offset.value=getOffset(isHorizontal.value?touchX:touchY,false)}function onTouchend(e){maybeDragging=false;if(!isDragging.value)return;addMovement(e);isDragging.value=false;const velocity=getVelocity(e.changedTouches[0].identifier);const vx=Math.abs(velocity.x);const vy=Math.abs(velocity.y);if(isHorizontal.value?vx>vy&&vx>400:vy>vx&&vy>3)isActive.value=velocity.direction===({left:`right`,right:`left`,top:`down`,bottom:`up`}[position.value]||oops());else isActive.value=dragProgress.value>.5}const dragStyles=computed(()=>{return isDragging.value?{transform:position.value===`left`?`translateX(calc(-100% + ${dragProgress.value*width.value}px))`:position.value===`right`?`translateX(calc(100% - ${dragProgress.value*width.value}px))`:position.value===`top`?`translateY(calc(-100% + ${dragProgress.value*width.value}px))`:position.value===`bottom`?`translateY(calc(100% - ${dragProgress.value*width.value}px))`:oops(),transition:`none`}:void 0});useToggleScope(isDragging,()=>{const transform=el.value?.style.transform??null;const transition=el.value?.style.transition??null;watchEffect(()=>{el.value?.style.setProperty(`transform`,dragStyles.value?.transform||`none`);el.value?.style.setProperty(`transition`,dragStyles.value?.transition||null)});onScopeDispose(()=>{el.value?.style.setProperty(`transform`,transform);el.value?.style.setProperty(`transition`,transition)})});return{isDragging,dragProgress,dragStyles}}function oops(){throw new Error}var locations=[`start`,`end`,`left`,`right`,`top`,`bottom`];var makeVNavigationDrawerProps=propsFactory({color:String,disableResizeWatcher:Boolean,disableRouteWatcher:Boolean,expandOnHover:Boolean,floating:Boolean,modelValue:{type:Boolean,default:null},permanent:Boolean,rail:{type:Boolean,default:null},railWidth:{type:[Number,String],default:56},scrim:{type:[Boolean,String],default:true},image:String,temporary:Boolean,persistent:Boolean,touchless:Boolean,width:{type:[Number,String],default:256},location:{type:String,default:`start`,validator:value=>locations.includes(value)},sticky:Boolean,...makeBorderProps(),...makeComponentProps(),...makeDelayProps(),...makeDisplayProps({mobile:null}),...makeElevationProps(),...makeLayoutItemProps(),...makeRoundedProps(),...omit(makeFocusTrapProps(),[`disableInitialFocus`]),...makeTagProps({tag:`nav`}),...makeThemeProps()},`VNavigationDrawer`);var VNavigationDrawer=genericComponent()({name:`VNavigationDrawer`,props:makeVNavigationDrawerProps(),emits:{"update:modelValue":val=>true,"update:rail":val=>true},setup(props,{attrs,emit,slots}){const{isRtl}=useRtl();const{themeClasses}=provideTheme(props);const{borderClasses}=useBorder(props);const{backgroundColorClasses,backgroundColorStyles}=useBackgroundColor(()=>props.color);const{elevationClasses}=useElevation(props);const{displayClasses,mobile}=useDisplay(props);const{roundedClasses,roundedStyles}=useRounded(props);const router=useRouter();const isActive=useProxiedModel(props,`modelValue`,null,v=>!!v);const{ssrBootStyles}=useSsrBoot();const{scopeId}=useScopeId();const rootEl=ref();const isHovering=shallowRef(false);const{runOpenDelay,runCloseDelay}=useDelay(props,value=>{isHovering.value=value});const{layoutRect}=useLayout();const location=computed(()=>toPhysical(props.location,isRtl.value));const isVertical=computed(()=>location.value===`top`||location.value===`bottom`);const layoutSpan=computed(()=>(isVertical.value?layoutRect.value?.height:layoutRect.value?.width)??0);const width=computed(()=>{return props.rail&&props.expandOnHover&&isHovering.value?props.width:props.rail?props.railWidth:props.width});const widthPx=computed(()=>resolveSize(width.value,layoutSpan.value));const isPersistent=toRef(()=>props.persistent);const isTemporary=computed(()=>!props.permanent&&(mobile.value||props.temporary));const isSticky=computed(()=>props.sticky&&!isTemporary.value&&location.value!==`bottom`);useFocusTrap(props,{isActive,localTop:isTemporary,contentEl:rootEl});useToggleScope(()=>props.expandOnHover&&props.rail!=null,()=>{watch(isHovering,val=>emit(`update:rail`,!val))});useToggleScope(()=>!props.disableResizeWatcher,()=>{watch(isTemporary,val=>!props.permanent&&nextTick$1(()=>isActive.value=!val))});useToggleScope(()=>!props.disableRouteWatcher&&!!router,()=>{watch(router.currentRoute,()=>isTemporary.value&&(isActive.value=false))});watch(()=>props.permanent,val=>{if(val)isActive.value=true});if(props.modelValue==null&&!isTemporary.value)isActive.value=props.permanent||!mobile.value;const{isDragging,dragProgress}=useTouch({el:rootEl,isActive,isTemporary,width:widthPx,touchless:toRef(()=>props.touchless),position:location});const layoutSize=computed(()=>{const size=isTemporary.value?0:props.rail&&props.expandOnHover?props.railWidth:width.value;return isDragging.value?resolveSize(size,layoutSpan.value)*dragProgress.value:size});const{layoutItemStyles,layoutItemScrimStyles}=useLayoutItem({id:props.name,order:computed(()=>parseInt(props.order,10)),position:location,layoutSize,elementSize:width,active:readonly(isActive),disableTransitions:toRef(()=>isDragging.value),absolute:computed(()=>props.absolute||isSticky.value&&!isString(isStuck.value))});const{isStuck,stickyStyles}=useSticky({rootEl,isSticky,layoutItemStyles});const scrimColor=useBackgroundColor(()=>{return isString(props.scrim)?props.scrim:null});const scrimStyles=computed(()=>({...isDragging.value?{opacity:dragProgress.value*.2,transition:`none`}:void 0,...layoutItemScrimStyles.value}));provideDefaults({VList:{bgColor:`transparent`}});useRender(()=>{const hasImage=slots.image||props.image;return createBaseVNode(Fragment,null,[createVNode(props.tag,mergeProps({"ref":rootEl,"onMouseenter":runOpenDelay,"onMouseleave":runCloseDelay,"class":[`v-navigation-drawer`,`v-navigation-drawer--${location.value}`,{"v-navigation-drawer--expand-on-hover":props.expandOnHover,"v-navigation-drawer--floating":props.floating,"v-navigation-drawer--is-hovering":isHovering.value,"v-navigation-drawer--rail":props.rail,"v-navigation-drawer--temporary":isTemporary.value,"v-navigation-drawer--persistent":isPersistent.value,"v-navigation-drawer--active":isActive.value,"v-navigation-drawer--sticky":isSticky.value},themeClasses.value,backgroundColorClasses.value,borderClasses.value,displayClasses.value,elevationClasses.value,roundedClasses.value,props.class],"style":[backgroundColorStyles.value,layoutItemStyles.value,ssrBootStyles.value,stickyStyles.value,roundedStyles.value,props.style],"inert":!isActive.value},scopeId,attrs),{default:()=>[hasImage&&createBaseVNode(`div`,{"key":`image`,"class":`v-navigation-drawer__img`},[!slots.image?createVNode(VImg,{"key":`image-img`,"alt":``,"cover":true,"height":`inherit`,"src":props.image},null):createVNode(VDefaultsProvider,{"key":`image-defaults`,"disabled":!props.image,"defaults":{VImg:{alt:``,cover:true,height:`inherit`,src:props.image}}},slots.image)]),slots.prepend&&createBaseVNode(`div`,{"class":`v-navigation-drawer__prepend`},[slots.prepend?.()]),createBaseVNode(`div`,{"class":`v-navigation-drawer__content`},[slots.default?.()]),slots.append&&createBaseVNode(`div`,{"class":`v-navigation-drawer__append`},[slots.append?.()])]}),createVNode(Transition,{"name":`fade-transition`},{default:()=>[isTemporary.value&&(isDragging.value||isActive.value)&&!!props.scrim&&createBaseVNode(`div`,mergeProps({"class":[`v-navigation-drawer__scrim`,scrimColor.backgroundColorClasses.value],"style":[scrimStyles.value,scrimColor.backgroundColorStyles.value],"onClick":()=>{if(isPersistent.value)return;isActive.value=false}},scopeId),null)]})])});return{isStuck}}});var VSnackbarQueueSymbol=Symbol.for(`vuetify:v-snackbar-queue`);function useSnackbarItem(isActive,contentEl){const queue=inject$1(VSnackbarQueueSymbol,null);if(!queue)return null;const id=useId();queue.register(id);onBeforeUnmount(()=>queue.unregister(id));watch(isActive,val=>!val&&queue.unregister(id),{flush:`sync`});const{resizeRef,contentRect}=useResizeObserver();watch(contentEl,el=>{resizeRef.value=el??null});watch(contentRect,rect=>{if(rect?.width)queue.setSize(id,rect.height,rect.width)});return{id,offset:computed(()=>queue.getOffset(id))}}function useCountdown(milliseconds){const time=shallowRef(milliseconds());let timer=-1;function clear(){clearInterval(timer)}function reset(){clear();nextTick$1(()=>time.value=milliseconds())}function start(el){const style=el?getComputedStyle(el):{transitionDuration:.2};const interval=parseFloat(style.transitionDuration)*1e3||200;clear();if(time.value<=0)return;const startTime=performance.now();timer=window.setInterval(()=>{const elapsed=performance.now()-startTime+interval;time.value=Math.max(milliseconds()-elapsed,0);if(time.value<=0)clear()},interval)}onScopeDispose(clear);return{clear,time,start,reset}}var makeVSnackbarProps=propsFactory({collapsed:Object,loading:Boolean,prependAvatar:String,prependIcon:IconValue,queueGap:Number,queueIndex:Number,title:String,text:String,reverseTimer:Boolean,timer:{type:[Boolean,String],default:false},timerColor:String,timeout:{type:[Number,String],default:5e3},vertical:Boolean,...makeLocationProps({location:`bottom center`}),...makePositionProps(),...makeRoundedProps(),...makeVariantProps(),...makeThemeProps(),...omit(makeVOverlayProps({closeOnBack:false,locationStrategy:null,transition:`v-snackbar-transition`}),[`persistent`,`noClickAnimation`,`offset`,`retainFocus`,`captureFocus`,`disableInitialFocus`,`location`,`scrim`,`scrollStrategy`,`stickToTarget`,`viewportMargin`])},`VSnackbar`);var VSnackbar=genericComponent()({name:`VSnackbar`,props:makeVSnackbarProps(),emits:{"update:modelValue":v=>true},setup(props,{slots}){const isActive=useProxiedModel(props,`modelValue`);const{positionClasses}=usePosition(props);const{scopeId}=useScopeId();const{themeClasses}=provideTheme(props);const{colorClasses,colorStyles,variantClasses}=useVariant(props);const{roundedClasses,roundedStyles}=useRounded(props);const countdown=useCountdown(()=>Number(props.timeout));const overlay=ref();const queueItem=useSnackbarItem(isActive,()=>overlay.value?.contentEl);let _lastOffset;const timerRef=ref();const isHovering=shallowRef(false);const isFocused=shallowRef(false);const startY=shallowRef(0);const mainStyles=ref();const hasLayout=inject$1(VuetifyLayoutKey,void 0);useToggleScope(()=>!!hasLayout,()=>{const layout=useLayout();watchEffect(()=>{mainStyles.value=layout.mainStyles.value})});watch(isActive,startTimeout);watch(()=>props.timeout,startTimeout);onMounted(()=>{if(isActive.value)startTimeout()});let activeTimeout=-1;function startTimeout(){countdown.clear();window.clearTimeout(activeTimeout);const timeout=Number(props.timeout);if(!isActive.value||timeout===-1)return;countdown.reset();const element=refElement(timerRef.value);nextTick$1(()=>countdown.start(element));activeTimeout=window.setTimeout(()=>{isActive.value=false},timeout)}function clearTimeout(){countdown.reset();window.clearTimeout(activeTimeout)}function onPointerenter(){isHovering.value=true;clearTimeout()}function onPointerleave(){isHovering.value=false;if(!isFocused.value)startTimeout()}function onFocusin(){isFocused.value=true;clearTimeout()}function onFocusout(event){if((overlay.value?.contentEl)?.contains(event.relatedTarget))return;isFocused.value=false;if(!isHovering.value)startTimeout()}function onTouchstart(event){startY.value=event.touches[0].clientY}function onTouchend(event){if(Math.abs(startY.value-event.changedTouches[0].clientY)>50)isActive.value=false}function onAfterLeave(){if(isHovering.value)onPointerleave();isFocused.value=false}const locationClasses=computed(()=>{return props.location.split(` `).reduce((acc,loc)=>{acc[`v-snackbar--${loc}`]=true;return acc},{})});const queueDirection=computed(()=>{const[side,align]=props.location.split(` `);return side===`bottom`||[`left`,`right`].includes(side)&&align===`end`?-1:1});const collapsedStyles=computed(()=>{if(!props.collapsed)return null;return{"--v-snackbar-collapsed-height":convertToUnit(props.collapsed.height),"--v-snackbar-collapsed-width":convertToUnit(props.collapsed.width)}});const offset=computed(()=>{if(!queueItem)return void 0;if(queueItem.offset.value===null)return _lastOffset;return _lastOffset=convertToUnit(queueItem.offset.value)});const transition=computed(()=>{if(!isString(props.transition)||!props.transition.endsWith(`-auto`))return props.transition;const prefix=props.transition.replace(`-auto`,``);const[side,align]=props.location.split(` `);return`${prefix}-${[`start`,`end`,`left`,`right`].includes(align)||[`left`,`right`].includes(side)?`x`:`y`}${[`end`,`right`].includes(align)||![`start`,`left`].includes(align)&&[`bottom`,`right`].includes(side)?`-reverse`:``}-transition`});useRender(()=>{const overlayProps=VOverlay.filterProps({...props,location:props.location,locationStrategy:props.locationStrategy??noop});const hasPrependMedia=!!(props.prependAvatar||props.prependIcon);const hasPrepend=!!(hasPrependMedia||props.loading||slots.prepend);const hasContent=!!(slots.default||slots.text||slots.title||props.text||props.title);return createVNode(VOverlay,mergeProps({"ref":overlay,"class":[`v-snackbar`,{"v-snackbar--active":isActive.value,"v-snackbar--collapsed":!!props.collapsed,"v-snackbar--timer":!!props.timer,"v-snackbar--vertical":props.vertical},locationClasses.value,positionClasses.value,props.class],"style":[mainStyles.value,{"--v-snackbar-offset":offset.value,"--v-snackbar-gap":convertToUnit(props.queueGap),"--v-snackbar-index":props.queueIndex,"--v-snackbar-direction":queueDirection.value},collapsedStyles.value,props.style]},overlayProps,{"transition":transition.value,"modelValue":isActive.value,"onUpdate:modelValue":$event=>isActive.value=$event,"contentProps":mergeProps({class:[`v-snackbar__wrapper`,themeClasses.value,colorClasses.value,roundedClasses.value,variantClasses.value],style:[colorStyles.value,roundedStyles.value],onPointerenter,onPointerleave,onFocusin,onFocusout},overlayProps.contentProps),"persistent":true,"noClickAnimation":true,"scrim":false,"scrollStrategy":`none`,"onTouchstartPassive":onTouchstart,"onTouchend":onTouchend,"onAfterLeave":onAfterLeave},scopeId),{default:()=>[genOverlays(false,`v-snackbar`),slots.header&&createBaseVNode(`div`,{"class":`v-snackbar__header`},[slots.header?.()]),props.timer&&Number(props.timeout)>0&&!isHovering.value&&createBaseVNode(`div`,{"key":`timer`,"class":normalizeClass([`v-snackbar__timer`,`v-snackbar__timer--${props.timer===`bottom`?`bottom`:`top`}`])},[createVNode(VProgressLinear,{"ref":timerRef,"color":props.timerColor??`info`,"max":props.timeout,"modelValue":props.reverseTimer?Number(props.timeout)-countdown.time.value:countdown.time.value},null)]),hasPrepend&&createVNode(VDefaultsProvider,{"key":`prepend-defaults`,"disabled":!hasPrependMedia&&!props.loading,"defaults":{VAvatar:{image:props.prependAvatar},VIcon:{icon:props.prependIcon},VProgressCircular:{indeterminate:true,size:24,width:3}}},{default:()=>[createBaseVNode(`div`,{"class":`v-snackbar__prepend`},[slots.prepend?slots.prepend():createBaseVNode(Fragment,null,[props.loading&&createVNode(VProgressCircular,null,null),!props.loading&&props.prependAvatar&&createVNode(VAvatar,null,null),!props.loading&&props.prependIcon&&createVNode(VIcon,null,null)])])]}),hasContent&&createBaseVNode(`div`,{"key":`content`,"class":`v-snackbar__content`,"role":`status`,"aria-live":`polite`},[slots.title?.()??(props.title?createBaseVNode(`div`,{"class":`v-snackbar__title`,"key":`title`},[props.title]):``),slots.text?.()??props.text,slots.default?.()]),slots.actions&&createVNode(VDefaultsProvider,{"defaults":{VBtn:{variant:`text`,ripple:false,slim:true}}},{default:()=>[createBaseVNode(`div`,{"class":`v-snackbar__actions`},[slots.actions({isActive})])]})],activator:slots.activator})});return forwardRefs({},overlay)}});var VTabsSymbol=Symbol.for(`vuetify:v-tabs`);var makeVTabProps=propsFactory({fixed:Boolean,sliderColor:String,sliderTransition:String,sliderTransitionDuration:[String,Number],hideSlider:Boolean,inset:Boolean,direction:{type:String,default:`horizontal`},...omit(makeVBtnProps({selectedClass:`v-tab--selected`,variant:`text`}),[`active`,`block`,`flat`,`location`,`position`,`symbol`])},`VTab`);var VTab=genericComponent()({name:`VTab`,props:makeVTabProps(),setup(props,{slots,attrs}){const{textColorClasses:sliderColorClasses,textColorStyles:sliderColorStyles}=useTextColor(()=>props.sliderColor);const{backgroundColorClasses:insetColorClasses,backgroundColorStyles:insetColorStyles}=useBackgroundColor(()=>props.sliderColor);const rootEl=ref();const sliderEl=ref();const isHorizontal=computed(()=>props.direction===`horizontal`);const isSelected=computed(()=>rootEl.value?.group?.isSelected.value??false);function fade(nextEl,prevEl){return{opacity:[0,1]}}function grow(nextEl,prevEl){return props.direction===`vertical`?{transform:[`scaleY(0)`,`scaleY(1)`]}:{transform:[`scaleX(0)`,`scaleX(1)`]}}function shift(nextEl,prevEl){const prevBox=prevEl.getBoundingClientRect();const nextBox=nextEl.getBoundingClientRect();const xy=isHorizontal.value?`x`:`y`;const XY=isHorizontal.value?`X`:`Y`;const rightBottom=isHorizontal.value?`right`:`bottom`;const widthHeight=isHorizontal.value?`width`:`height`;const delta=prevBox[xy]>nextBox[xy]?prevBox[rightBottom]-nextBox[rightBottom]:prevBox[xy]-nextBox[xy];const origin=Math.sign(delta)>0?isHorizontal.value?`right`:`bottom`:Math.sign(delta)<0?isHorizontal.value?`left`:`top`:`center`;const scale=(Math.abs(delta)+(Math.sign(delta)<0?prevBox[widthHeight]:nextBox[widthHeight]))/Math.max(prevBox[widthHeight],nextBox[widthHeight])||0;const initialScale=prevBox[widthHeight]/nextBox[widthHeight]||0;const sigma=1.5;return{transform:[`translate${XY}(${delta}px) scale${XY}(${initialScale})`,`translate${XY}(${delta/sigma}px) scale${XY}(${(scale-1)/sigma+1})`,`none`],transformOrigin:Array(3).fill(origin)}}function updateSlider({value}){if(value){const prevEl=rootEl.value?.$el.parentElement?.querySelector(`.v-tab--selected .v-tab__slider`);const nextEl=sliderEl.value;if(!prevEl||!nextEl)return;const color=getComputedStyle(prevEl).backgroundColor;const keyframes={fade,grow,shift}[props.sliderTransition??`shift`]??shift;const duration=Number(props.sliderTransitionDuration)||({fade:400,grow:350,shift:225}[props.sliderTransition??`shift`]??225);animate(nextEl,{backgroundColor:[color,color],...keyframes(nextEl,prevEl)},{duration,easing:standardEasing})}}useRender(()=>{const btnProps=VBtn.filterProps(props);return createVNode(VBtn,mergeProps({"symbol":VTabsSymbol,"ref":rootEl,"class":[`v-tab`,props.class,isSelected.value&&props.inset?insetColorClasses.value:[]],"style":[props.style,isSelected.value&&props.inset?insetColorStyles.value:[],{backgroundColor:isSelected.value&&props.inset?`transparent !important`:void 0}],"tabindex":isSelected.value?0:-1,"role":`tab`,"aria-selected":String(isSelected.value),"active":false},btnProps,attrs,{"block":props.fixed,"maxWidth":props.fixed?300:void 0,"onGroup:selected":updateSlider}),{...slots,default:()=>createBaseVNode(Fragment,null,[slots.default?.()??props.text,!props.hideSlider&&createBaseVNode(`div`,{"ref":sliderEl,"class":normalizeClass([`v-tab__slider`,props.inset?insetColorClasses.value:sliderColorClasses.value]),"style":normalizeStyle([sliderColorStyles.value,props.inset?insetColorStyles.value:sliderColorClasses.value])},null)])})});return forwardRefs({},rootEl)}});var makeVTabsWindowProps=propsFactory({...omit(makeVWindowProps(),[`continuous`,`nextIcon`,`prevIcon`,`showArrows`,`touch`,`mandatory`])},`VTabsWindow`);var VTabsWindow=genericComponent()({name:`VTabsWindow`,props:makeVTabsWindowProps(),emits:{"update:modelValue":v=>true},setup(props,{slots}){const group=inject$1(VTabsSymbol,null);const _model=useProxiedModel(props,`modelValue`);const model=computed({get(){if(_model.value!=null||!group)return _model.value;return group.items.value.find(item=>group.selected.value.includes(item.id))?.value},set(val){_model.value=val}});useRender(()=>{const windowProps=VWindow.filterProps(props);return createVNode(VWindow,mergeProps({"_as":`VTabsWindow`},windowProps,{"modelValue":model.value,"onUpdate:modelValue":$event=>model.value=$event,"class":[`v-tabs-window`,props.class],"style":props.style,"mandatory":false,"touch":false}),slots)});return{}}});var makeVTabsWindowItemProps=propsFactory({...makeVWindowItemProps()},`VTabsWindowItem`);var VTabsWindowItem=genericComponent()({name:`VTabsWindowItem`,props:makeVTabsWindowItemProps(),setup(props,{slots}){useRender(()=>{const windowItemProps=VWindowItem.filterProps(props);return createVNode(VWindowItem,mergeProps({"_as":`VTabsWindowItem`},windowItemProps,{"class":[`v-tabs-window-item`,props.class],"style":props.style}),slots)});return{}}});function parseItems(items){if(!items)return[];return items.map(item=>{if(!isObject$1(item))return{text:item,value:item};return item})}var makeVTabsProps=propsFactory({alignTabs:{type:String,default:`start`},color:String,fixedTabs:Boolean,items:{type:Array,default:()=>[]},stacked:Boolean,bgColor:String,grow:Boolean,height:{type:[Number,String],default:void 0},hideSlider:Boolean,inset:Boolean,insetPadding:[String,Number],insetRadius:[String,Number],sliderColor:String,...pick$1(makeVTabProps(),[`spaced`,`sliderTransition`,`sliderTransitionDuration`]),...makeVSlideGroupProps({mandatory:`force`,selectedClass:`v-tab-item--selected`}),...makeDensityProps(),...makeTagProps()},`VTabs`);var VTabs=genericComponent()({name:`VTabs`,props:makeVTabsProps(),emits:{"update:modelValue":v=>true},setup(props,{attrs,slots}){const model=useProxiedModel(props,`modelValue`);const items=computed(()=>parseItems(props.items));const{densityClasses}=useDensity(props);const{backgroundColorClasses,backgroundColorStyles}=useBackgroundColor(()=>props.bgColor);const{scopeId}=useScopeId();provideDefaults({VTab:{color:toRef(props,`color`),direction:toRef(props,`direction`),stacked:toRef(props,`stacked`),fixed:toRef(props,`fixedTabs`),inset:toRef(props,`inset`),sliderColor:toRef(props,`sliderColor`),sliderTransition:toRef(props,`sliderTransition`),sliderTransitionDuration:toRef(props,`sliderTransitionDuration`),hideSlider:toRef(props,`hideSlider`)}});useRender(()=>{const slideGroupProps=VSlideGroup.filterProps(props);const hasWindow=!!(slots.window||props.items.length>0);return createBaseVNode(Fragment,null,[createVNode(VSlideGroup,mergeProps(slideGroupProps,{"modelValue":model.value,"onUpdate:modelValue":$event=>model.value=$event,"class":[`v-tabs`,`v-tabs--${props.direction}`,`v-tabs--align-tabs-${props.alignTabs}`,{"v-tabs--fixed-tabs":props.fixedTabs,"v-tabs--grow":props.grow,"v-tabs--inset":props.inset,"v-tabs--stacked":props.stacked},densityClasses.value,backgroundColorClasses.value,props.class],"style":[{"--v-tabs-height":convertToUnit(props.height),"--v-tabs-inset-padding":props.inset?convertToUnit(props.insetPadding):void 0,"--v-tabs-inset-radius":props.inset?convertToUnit(props.insetRadius):void 0},backgroundColorStyles.value,props.style],"role":`tablist`,"symbol":VTabsSymbol},scopeId,attrs),{default:slots.default??(()=>items.value.map(item=>slots.tab?.({item})??createVNode(VTab,mergeProps(item,{"key":item.text,"value":item.value,"spaced":props.spaced}),{default:slots[`tab.${item.value}`]?()=>slots[`tab.${item.value}`]?.({item}):void 0}))),prev:slots.prev,next:slots.next}),hasWindow&&createVNode(VTabsWindow,mergeProps({"modelValue":model.value,"onUpdate:modelValue":$event=>model.value=$event,"key":`tabs-window`},scopeId),{default:()=>[items.value.map(item=>slots.item?.({item})??createVNode(VTabsWindowItem,{"value":item.value},{default:()=>slots[`item.${item.value}`]?.({item})})),slots.window?.()]})])});return{}}});var _hoisted_1$37=[`title`];var _hoisted_2$31={class:`conversation-dialog__body`};var _sfc_main$61={__name:`ConversationDialog`,props:{modelValue:Boolean,activator:{type:Object,default:null},title:{type:String,default:``},mode:{type:String,default:`talk`},showModes:Boolean,minimizable:Boolean,closeLabel:{type:String,default:``},presentation:{type:String,default:`dialog`,validator:value=>[`dialog`,`inline`].includes(value)}},emits:[`update:modelValue`,`update:mode`,`minimize`],setup(__props,{emit:__emit}){const{xs}=useDisplay();const{t}=useJskitText();const props=__props;const dialogProps=computed(()=>props.presentation===`inline`?{}:{activator:props.activator,openOnClick:false,modelValue:props.modelValue,transition:false,fullscreen:xs.value,width:xs.value?`100%`:620,maxWidth:xs.value?`100%`:`calc(100% - 32px)`,height:xs.value?`100%`:860,maxHeight:xs.value?`100%`:`calc(100% - 32px)`,contentProps:{style:{margin:xs.value?0:`16px`}},"aria-hidden":!props.modelValue});const displayTitle=computed(()=>props.title||t(`jskit.assistant.voice.assistant`));const displayCloseLabel=computed(()=>props.closeLabel||t(`jskit.assistant.voice.dialog.close`));const emit=__emit;let dismissedFromActivator=false;function outsideClick(event){const bounds=props.minimizable&&props.activator?.getBoundingClientRect();dismissedFromActivator=Boolean(bounds&&event.clientX>=bounds.left&&event.clientX<=bounds.right&&event.clientY>=bounds.top&&event.clientY<=bounds.bottom)}function updateOpen(value){if(!value&&dismissedFromActivator)emit(`minimize`);else emit(`update:modelValue`,value);dismissedFromActivator=false}return(_ctx,_cache)=>{return openBlock(),createBlock(resolveDynamicComponent(__props.presentation===`inline`?`section`:unref(VDialog)),mergeProps(dialogProps.value,{class:[`conversation-dialog`,{"conversation-dialog--inline":__props.presentation===`inline`}],"aria-label":unref(t)(`jskit.assistant.voice.dialog.label`,{title:displayTitle.value}),"onClick:outside":outsideClick,"onUpdate:modelValue":updateOpen}),{default:withCtx(()=>[(openBlock(),createBlock(resolveDynamicComponent(__props.presentation===`inline`?`div`:unref(VCard)),{class:`conversation-dialog__surface`,rounded:__props.presentation===`inline`?void 0:unref(xs)?0:`lg`},{default:withCtx(()=>[__props.presentation!==`inline`?(openBlock(),createBlock(VCardTitle,{key:0,class:`conversation-dialog__title text-title-large`},{default:withCtx(()=>[createBaseVNode(`span`,{title:displayTitle.value},toDisplayString(displayTitle.value),9,_hoisted_1$37),renderSlot(_ctx.$slots,`header-actions`,{},void 0,true),__props.minimizable?(openBlock(),createBlock(VBtn,{key:0,icon:unref(mdiMinus),variant:`text`,"aria-label":unref(t)(`jskit.assistant.voice.dialog.minimize`),title:unref(t)(`jskit.assistant.voice.dialog.minimize`),onClick:_cache[0]||(_cache[0]=$event=>_ctx.$emit(`minimize`,$event))},null,8,[`icon`,`aria-label`,`title`])):createCommentVNode(``,true),createVNode(VBtn,{icon:unref(mdiClose),variant:`text`,"aria-label":displayCloseLabel.value,title:displayCloseLabel.value,onClick:_cache[1]||(_cache[1]=$event=>_ctx.$emit(`update:modelValue`,false))},null,8,[`icon`,`aria-label`,`title`])]),_:3})):createCommentVNode(``,true),__props.showModes?(openBlock(),createBlock(VTabs,{key:1,"model-value":__props.mode,class:`conversation-dialog__tabs`,grow:``,"aria-label":unref(t)(`jskit.assistant.voice.dialog.modes`),"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>_ctx.$emit(`update:mode`,$event))},{default:withCtx(()=>[createVNode(VTab,{value:`talk`,"prepend-icon":unref(mdiMicrophone)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.voice.dialog.talk`)),1)]),_:1},8,[`prepend-icon`]),createVNode(VTab,{value:`text`,"prepend-icon":unref(mdiMessageTextOutline)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.voice.dialog.text`)),1)]),_:1},8,[`prepend-icon`])]),_:1},8,[`model-value`,`aria-label`])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_2$31,[renderSlot(_ctx.$slots,`default`,{},void 0,true)])]),_:3},8,[`rounded`]))]),_:3},16,[`class`,`aria-label`])}}};var ConversationDialog_default=_plugin_vue_export_helper_default(_sfc_main$61,[[`__scopeId`,`data-v-a008341f`]]);var CANNOT_SEND_YET=`Your words are in the chat box, but this conversation cannot send yet.`;var submissionError=(message,{messageCode})=>Object.assign(new Error(message),{messageCode,messageParams:{}});function createAssistantTextSubmission({getState,setDraft,submit,afterDraftChange=async()=>{}}){let revision=0;return async function submitText(text,{sendImmediately=true,signal,timeoutMs=2e3}={}){const request=++revision;const value=String(text||``).trim();const initial=getState();if(!value||!initial.active||signal?.aborted)throw submissionError(`The chat composer is not ready yet.`,{messageCode:`assistant.composer.notReady`});const hasDraft=Boolean(initial.draft?.trim());const writtenValue=hasDraft?`${initial.draft}\n${value}`:value;setDraft(writtenValue);if(!sendImmediately||hasDraft)return`draft`;await afterDraftChange();const deadline=Date.now()+timeoutMs;while(true){const state=getState();if(signal?.aborted||request!==revision||!state.active||state.id!==initial.id||state.draft!==writtenValue)throw submissionError(`The chat changed before sending. Review the draft before sending.`,{messageCode:`assistant.composer.chatChanged`});if(state.canSend){if(await submit()===false)throw submissionError(CANNOT_SEND_YET,{messageCode:`assistant.composer.cannotSendYet`});return state.turnActive?`steer`:`send`}if(Date.now()>=deadline)throw submissionError(CANNOT_SEND_YET,{messageCode:`assistant.composer.cannotSendYet`});await new Promise(resolve=>setTimeout(resolve,16))}}}var applicationConversations=new WeakMap;function retainAssistantConversation(app,key,createRuntime,reader={active:true}){let conversations=applicationConversations.get(app);if(!conversations){conversations=new Map;applicationConversations.set(app,conversations)}let entry=conversations.get(key);if(!entry){const scope=effectScope(true);const readers=shallowReactive(new Map);try{const runtime=app.runWithContext(()=>scope.run(()=>createRuntime(readers)));entry={scope,readers,runtime};runtime.retain=()=>retainAssistantConversation(app,key,createRuntime);conversations.set(key,entry)}catch(error){scope.stop();throw error}}const token=Symbol(`conversation reader`);entry.readers.set(token,reader);return{runtime:entry.runtime,release(){if(!entry.readers.delete(token)||entry.readers.size)return;entry.scope.stop();conversations.delete(key)}}}var IDLE_GESTURES=Object.freeze([`glance-left`,`tiny-nod`,`glance-right`,`brow-lift`,`glance-up`,`curious-tilt`,`smile-brighten`,`friendly-lean`,`shoulder-lift`,`earring-sway`]);var IDLE_MOUTH_POSES=Object.freeze({"tiny-nod":`warm-smile`,"curious-tilt":`warm-smile`,"smile-brighten":`smile`,"friendly-lean":`warm-smile`});var IDLE_GESTURE_DURATION_MS=1100;var LISTENING_EXPRESSIONS=Object.freeze([`attentive`,`tiny-nod`,`follow-left`,`tilt-left`,`follow-right`,`tilt-right`]);var LISTENING_MOUTH_POSES=Object.freeze({"attentive":`soft-smile`,"tiny-nod":`soft-smile`});var PRE_THINKING_EXPRESSIONS=Object.freeze([`settle`,`glance-left`,`center`,`glance-right`,`tiny-tilt`,`ready`]);var PRE_THINKING_MOUTH_POSES=Object.freeze({"ready":`soft-smile`,"tiny-tilt":`thoughtful`});var THINKING_EXPRESSIONS=Object.freeze([`look-up-left`,`focus`,`look-up-right`,`weigh-left`,`weigh-right`,`idea`]);var THINKING_MOUTH_POSES=Object.freeze({"idea":`soft-smile`,"weigh-left":`closed`,"weigh-right":`closed`});var ACTIVE_EXPRESSION_DURATION_MS=Object.freeze({listening:1350,"pre-thinking":1450,thinking:1700});var ACTIVE_EXPRESSION_SEQUENCES=Object.freeze({listening:LISTENING_EXPRESSIONS,"pre-thinking":PRE_THINKING_EXPRESSIONS,thinking:THINKING_EXPRESSIONS});function useVoiceAvatar(props){const blinking=ref(false);const activeExpression=ref(``);const idleGesture=ref(``);const reducedMotion=ref(false);let blinkTimer=0;let activeExpressionTimer=0;const activeExpressionIndexes={listening:Math.floor(Math.random()*LISTENING_EXPRESSIONS.length),"pre-thinking":Math.floor(Math.random()*PRE_THINKING_EXPRESSIONS.length),thinking:Math.floor(Math.random()*THINKING_EXPRESSIONS.length)};let idleGestureIndex=Math.floor(Math.random()*IDLE_GESTURES.length);let idleGestureTimer=0;let reopenTimer=0;let reducedMotionQuery=null;const expression=computed(()=>String(props.state||`idle`));const visibleMouthPose=computed(()=>{if(expression.value===`idle`)return IDLE_MOUTH_POSES[idleGesture.value]||`soft-smile`;if(expression.value===`thinking`)return THINKING_MOUTH_POSES[activeExpression.value]||`thoughtful`;if(expression.value===`pre-thinking`)return PRE_THINKING_MOUTH_POSES[activeExpression.value]||`closed`;if(expression.value===`listening`)return LISTENING_MOUTH_POSES[activeExpression.value]||`closed`;if(expression.value!==`speaking`)return`closed`;const pose=String(props.mouthPose||`closed`);if(props.mouthLevel<.045||![`open`,`round`,`small`,`wide`].includes(pose))return`closed`;return pose});function clearBlinkTimers(){window.clearTimeout(blinkTimer);window.clearTimeout(reopenTimer);blinkTimer=0;reopenTimer=0}function clearIdleGesture(){window.clearTimeout(idleGestureTimer);idleGestureTimer=0;idleGesture.value=``}function clearActiveExpression(){window.clearTimeout(activeExpressionTimer);activeExpressionTimer=0;activeExpression.value=``}function scheduleBlink(delay=2800+Math.random()*3400){window.clearTimeout(blinkTimer);if(reducedMotion.value)return;blinkTimer=window.setTimeout(()=>{const doubleBlink=Math.random()<.16;blinking.value=true;reopenTimer=window.setTimeout(()=>{blinking.value=false;if(!doubleBlink){scheduleBlink();return}blinkTimer=window.setTimeout(()=>{blinking.value=true;reopenTimer=window.setTimeout(()=>{blinking.value=false;scheduleBlink()},115)},155)},135)},delay)}function scheduleIdleGesture(delay=2400+Math.random()*2800){window.clearTimeout(idleGestureTimer);if(reducedMotion.value||expression.value!==`idle`)return;idleGestureTimer=window.setTimeout(()=>{idleGesture.value=IDLE_GESTURES[idleGestureIndex];idleGestureIndex=(idleGestureIndex+1)%IDLE_GESTURES.length;idleGestureTimer=window.setTimeout(()=>{idleGesture.value=``;scheduleIdleGesture()},IDLE_GESTURE_DURATION_MS)},delay)}function showNextActiveExpression(){const state=expression.value;const sequence=ACTIVE_EXPRESSION_SEQUENCES[state]||[];if(!sequence.length){clearActiveExpression();return}const index=activeExpressionIndexes[state]||0;activeExpression.value=sequence[index];activeExpressionIndexes[state]=(index+1)%sequence.length;if(!reducedMotion.value)activeExpressionTimer=window.setTimeout(showNextActiveExpression,ACTIVE_EXPRESSION_DURATION_MS[state])}function updateReducedMotion(event){reducedMotion.value=Boolean(event.matches);clearBlinkTimers();clearActiveExpression();clearIdleGesture();blinking.value=false;if(ACTIVE_EXPRESSION_SEQUENCES[expression.value])showNextActiveExpression();if(!reducedMotion.value){scheduleBlink();scheduleIdleGesture()}}watch(expression,()=>{clearActiveExpression();clearIdleGesture();if(ACTIVE_EXPRESSION_SEQUENCES[expression.value])showNextActiveExpression();else if(!reducedMotion.value)scheduleIdleGesture(900+Math.random()*1200)});onMounted(()=>{reducedMotionQuery=window.matchMedia(`(prefers-reduced-motion: reduce)`);reducedMotion.value=reducedMotionQuery.matches;reducedMotionQuery.addEventListener?.(`change`,updateReducedMotion);if(!reducedMotion.value){scheduleBlink(1800+Math.random()*1800);scheduleIdleGesture(900+Math.random()*1500)}if(ACTIVE_EXPRESSION_SEQUENCES[expression.value])showNextActiveExpression()});onBeforeUnmount(()=>{clearBlinkTimers();clearActiveExpression();clearIdleGesture();reducedMotionQuery?.removeEventListener?.(`change`,updateReducedMotion);reducedMotionQuery=null});return{blinking,activeExpression,idleGesture,expression,visibleMouthPose,reducedMotion}}var _hoisted_1$36=[`aria-label`];var _hoisted_2$30=[`cx`,`ry`];var _hoisted_3$28=[`rx`,`ry`];var _sfc_main$60={__name:`VoiceAvatar`,props:{state:{type:String,default:`idle`},mouthPose:{type:String,default:`closed`},mouthLevel:{type:Number,default:0}},setup(__props){const props=__props;const{blinking,visibleMouthPose,reducedMotion}=useVoiceAvatar(props);const{t}=useJskitText();const mouthHeight=computed(()=>reducedMotion.value||visibleMouthPose.value===`closed`?3:Math.max(4,Math.min(18,props.mouthLevel*28)));return(_ctx,_cache)=>{return openBlock(),createElementBlock(`svg`,{viewBox:`0 0 128 128`,"aria-label":unref(t)(`jskit.assistant.voice.avatar.label`),role:`img`,class:`voice-avatar`},[_cache[0]||(_cache[0]=createBaseVNode(`circle`,{cx:`64`,cy:`64`,r:`59`,fill:`currentColor`,opacity:`.1`},null,-1)),_cache[1]||(_cache[1]=createBaseVNode(`rect`,{x:`25`,y:`31`,width:`78`,height:`66`,rx:`24`,fill:`none`,stroke:`currentColor`,"stroke-width":`3`},null,-1)),_cache[2]||(_cache[2]=createBaseVNode(`path`,{d:`M64 31V21`,stroke:`currentColor`,"stroke-width":`3`},null,-1)),_cache[3]||(_cache[3]=createBaseVNode(`circle`,{cx:`64`,cy:`18`,r:`4`,fill:`currentColor`},null,-1)),(openBlock(),createElementBlock(Fragment,null,renderList([47,81],x=>{return createBaseVNode(`ellipse`,{key:x,cx:x,cy:`55`,rx:`5`,ry:unref(blinking)?1:7,fill:`currentColor`},null,8,_hoisted_2$30)}),64)),createBaseVNode(`ellipse`,{cx:`64`,cy:`77`,rx:unref(visibleMouthPose)===`round`?6:15,ry:mouthHeight.value,fill:`currentColor`},null,8,_hoisted_3$28)],8,_hoisted_1$36)}}};var VoiceAvatar_default=_plugin_vue_export_helper_default(_sfc_main$60,[[`__scopeId`,`data-v-795dcea6`]]);function useVoiceLauncher({open,enabled=true,onTap=null,onError=()=>{}}){const holding=ref(false);let input=null;let timer;let suppressClick=false;let revision=0;let session;function report(operation){Promise.resolve(operation).catch(onError)}function begin(identity,delay){suppressClick=false;input=identity;const expected=++revision;timer=setTimeout(()=>{holding.value=true;report((async()=>{const opened=await open();if(expected!==revision||!holding.value||!opened)return;session=opened;await session.startHeldRecording()})())},delay)}function pointerDown(event){if(!toValue(enabled)||event.button!==0||event.isPrimary===false||input!==null)return;event.currentTarget.setPointerCapture(event.pointerId);begin(event.pointerId,350)}function keyDown(event){if(!toValue(enabled)||event.repeat||input!==null||![` `,`Enter`].includes(event.key))return;begin(event.key,onTap?350:0)}function finish(discard){clearTimeout(timer);const keyboard=typeof input===`string`;input=null;++revision;if(!holding.value){if(!discard&&keyboard&&onTap)report(onTap());return}holding.value=false;suppressClick=true;if(session)report(discard?session.discardHeldRecording():session.finishHeldRecording());session=null}function pointerUp(event){if(event.pointerId===input)finish(false)}function keyUp(event){if(event.key===input)finish(false)}function cancel(event){if(event?.pointerId!==void 0&&event.pointerId!==input)return;finish(true)}function click(event){const suppressed=suppressClick&&event.detail!==0;suppressClick=false;if(suppressed){event.preventDefault();event.stopImmediatePropagation();return}if(toValue(enabled)&&onTap)report(onTap())}onScopeDispose(cancel);return{holding,pointerDown,pointerUp,keyDown,keyUp,cancel,click}}var _hoisted_1$35=[`disabled`];var _hoisted_2$29=[`disabled`];var _hoisted_3$27=[`title`];var _hoisted_4$20=[`aria-label`];var _hoisted_5$20={key:3,class:`assistant-voice-controls__status`,role:`status`};var _hoisted_6$15=[`aria-label`];var _hoisted_7$14={class:`assistant-voice__review-actions`};var _hoisted_8$13=[`disabled`,`aria-label`];var _hoisted_9$11={key:0,class:`assistant-voice-controls__stop`};var _hoisted_10$11={class:`assistant-voice__talk-action`};var _hoisted_11$11={key:0,class:`assistant-voice-controls__icon-disc`};var _hoisted_12$11={class:`assistant-voice-controls__icon-disc`};var _hoisted_13$10=[`id`];var _sfc_main$59={__name:`VoiceConversationControls`,props:{session:{type:Object,required:true},disabled:{type:Boolean,default:false},speakerDisabled:{type:Boolean,default:false},compact:{type:Boolean,default:false},iconOnly:{type:Boolean,default:false},reviewInTranscript:{type:Boolean,default:false},toolsTarget:{type:Object,default:null},feedbackTarget:{type:Object,default:null}},setup(__props){const props=__props;const{targetLabel,voice,error,microphoneMuted,live,starting,callMode,callStatus,speechActive,heldTranscript,capturing,pendingTranscript,pushHolding,sending,stopSpeech,startPushToTalk,finishPushToTalk,cancelPushToTalk,toggleHandsFree,readAloud,toggleReadAloud,enableSound,deliverTranscript,discardHeldRecording,editTranscript}=props.session;const{t}=useJskitText();const controlStatus=computed(()=>{if(props.iconOnly&&voice.listening.value&&!starting.value&&!error.value&&!voice.error.value)return``;if(!props.compact||!props.session.hasUnsentSpeech.value)return callStatus.value;if(pendingTranscript.value)return props.reviewInTranscript?``:t(`jskit.assistant.voice.controls.sendOrDiscard`);if(live.value&&callMode.value===`hands-free`&&voice.listening.value&&!microphoneMuted.value)return t(`jskit.assistant.voice.controls.listening`);return voice.listening.value?t(`jskit.assistant.voice.controls.recordingFinish`):t(`jskit.assistant.voice.controls.finishSpeech`)});const handsFreeListening=computed(()=>live.value&&callMode.value===`hands-free`&&voice.listening.value&&!microphoneMuted.value);const canTalk=computed(()=>!props.disabled&&(!capturing.value||voice.listening.value||pushHolding.value||starting.value));const talkLabel=computed(()=>t(starting.value?`jskit.assistant.voice.controls.connecting`:pushHolding.value?`jskit.assistant.voice.controls.releaseToSend`:handsFreeListening.value?`jskit.assistant.voice.controls.pause`:`jskit.assistant.voice.controls.talk`));const gestureHint=useId();const gesture=useVoiceLauncher({enabled:canTalk,open:()=>({startHeldRecording:startPushToTalk,finishHeldRecording:finishPushToTalk,discardHeldRecording:cancelPushToTalk}),onTap:toggleHandsFree,onError:cause=>{error.value=voiceErrorText(cause)}});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`fieldset`,{class:normalizeClass([`assistant-voice-controls`,{"assistant-voice-controls--compact":__props.compact}]),disabled:__props.disabled},[(openBlock(),createBlock(Teleport,{to:__props.feedbackTarget,disabled:!__props.feedbackTarget},[createBaseVNode(`fieldset`,{class:normalizeClass([`assistant-voice-controls__feedback`,{"assistant-voice-controls__feedback--compact":__props.compact}]),disabled:__props.disabled},[unref(error)||unref(voice).error.value?(openBlock(),createElementBlock(`p`,{key:0,class:normalizeClass([`assistant-voice__error`,{"text-body-small":__props.compact}]),role:`alert`},toDisplayString(unref(error)||unref(voice).error.value),3)):createCommentVNode(``,true),controlStatus.value?(openBlock(),createElementBlock(`p`,{key:1,class:`assistant-voice-controls__status text-body-small`,role:`status`,title:unref(callStatus)},toDisplayString(controlStatus.value),9,_hoisted_3$27)):createCommentVNode(``,true),__props.compact&&!__props.reviewInTranscript&&unref(heldTranscript)&&!unref(pendingTranscript)?(openBlock(),createElementBlock(`p`,{key:2,class:`assistant-voice-controls__provisional`,role:`status`,"aria-label":unref(t)(`jskit.assistant.voice.conversation.recognizedWords`)},toDisplayString(unref(t)(`jskit.assistant.voice.controls.notSent`,{words:unref(heldTranscript)})),9,_hoisted_4$20)):createCommentVNode(``,true),unref(readAloud)&&unref(voice).playbackBlocked?.value?(openBlock(),createElementBlock(`p`,_hoisted_5$20,toDisplayString(unref(t)(`jskit.assistant.voice.controls.soundBlocked`)),1)):createCommentVNode(``,true),unref(readAloud)&&unref(voice).playbackBlocked?.value?(openBlock(),createBlock(VBtn,{key:4,"min-height":`48`,onClick:unref(enableSound)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.voice.controls.enableSound`)),1)]),_:1},8,[`onClick`])):createCommentVNode(``,true),!__props.reviewInTranscript&&unref(pendingTranscript)&&(unref(pendingTranscript).reviewBeforeSend||!unref(sending))?(openBlock(),createElementBlock(`section`,{key:5,class:`assistant-voice__review`,"aria-label":unref(t)(`jskit.assistant.voice.controls.review`)},[createVNode(VTextarea,{class:`assistant-voice__review-input`,"model-value":unref(pendingTranscript).text,label:unref(t)(`jskit.assistant.voice.controls.reviewMessage`),disabled:unref(sending),density:__props.compact?`compact`:`default`,rows:__props.compact?1:2,"max-rows":__props.compact?2:3,"auto-grow":``,"hide-details":``,"onUpdate:modelValue":unref(editTranscript)},null,8,[`model-value`,`label`,`disabled`,`density`,`rows`,`max-rows`,`onUpdate:modelValue`]),createBaseVNode(`div`,_hoisted_7$14,[createVNode(VBtn,{disabled:unref(sending),"min-height":`48`,onClick:unref(discardHeldRecording)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.voice.controls.discard`)),1)]),_:1},8,[`disabled`,`onClick`]),createVNode(VBtn,{disabled:unref(sending)||!unref(pendingTranscript).text.trim(),"min-height":`48`,color:`primary`,onClick:unref(deliverTranscript)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(sending)?unref(t)(`jskit.assistant.voice.controls.sending`):unref(t)(`jskit.assistant.voice.controls.send`)),1)]),_:1},8,[`disabled`,`onClick`])])],8,_hoisted_6$15)):createCommentVNode(``,true)],10,_hoisted_2$29)],8,[`to`,`disabled`])),(openBlock(),createBlock(Teleport,{to:__props.toolsTarget,disabled:!__props.toolsTarget},[createBaseVNode(`fieldset`,{class:normalizeClass([`assistant-voice-controls__tools`,{"assistant-voice-controls__tools--compact":__props.compact,"assistant-voice-controls__tools--icons":__props.iconOnly}]),disabled:__props.disabled,"aria-label":unref(t)(`jskit.assistant.voice.controls.label`,{target:unref(targetLabel)})},[__props.compact||__props.iconOnly||unref(speechActive)?(openBlock(),createElementBlock(`div`,_hoisted_9$11,[unref(speechActive)?(openBlock(),createBlock(VBtn,{key:0,icon:unref(mdiStop),variant:`text`,"min-width":`48`,"min-height":`48`,"aria-label":unref(t)(`jskit.assistant.voice.controls.stopTargetSpeaking`,{target:unref(targetLabel)}),title:unref(t)(`jskit.assistant.voice.controls.stopSpeaking`),onClick:unref(stopSpeech)},null,8,[`icon`,`aria-label`,`title`,`onClick`])):createCommentVNode(``,true)])):createCommentVNode(``,true),renderSlot(_ctx.$slots,`work-control`,{},void 0,true),createBaseVNode(`div`,_hoisted_10$11,[createVNode(VBtn,{class:`assistant-voice__talk`,color:`primary`,variant:__props.iconOnly?`text`:handsFreeListening.value?`tonal`:`flat`,"min-height":__props.iconOnly?44:__props.compact?48:64,rounded:`xl`,icon:__props.iconOnly?unref(voice).listening.value&&!unref(microphoneMuted)?unref(mdiMicrophone):unref(mdiMicrophoneOff):void 0,"prepend-icon":__props.iconOnly?void 0:unref(voice).listening.value&&!unref(microphoneMuted)?unref(mdiMicrophone):unref(mdiMicrophoneOff),"aria-label":__props.iconOnly?talkLabel.value:void 0,title:unref(t)(`jskit.assistant.voice.controls.talkHint`),"aria-pressed":handsFreeListening.value||unref(pushHolding),"aria-describedby":unref(gestureHint),disabled:!canTalk.value,slim:__props.compact||__props.iconOnly,width:__props.iconOnly?40:__props.compact?148:void 0,"min-width":__props.iconOnly?40:__props.compact?148:void 0,onPointerdown:unref(gesture).pointerDown,onPointerup:unref(gesture).pointerUp,onPointercancel:unref(gesture).cancel,onLostpointercapture:unref(gesture).cancel,onKeydown:[withKeys(withModifiers(unref(gesture).keyDown,[`prevent`]),[`space`]),withKeys(withModifiers(unref(gesture).keyDown,[`prevent`]),[`enter`])],onKeyup:[withKeys(withModifiers(unref(gesture).keyUp,[`prevent`]),[`space`]),withKeys(withModifiers(unref(gesture).keyUp,[`prevent`]),[`enter`])],onBlur:unref(gesture).cancel,onContextmenu:_cache[0]||(_cache[0]=withModifiers(()=>{},[`prevent`])),onClick:unref(gesture).click},{default:withCtx(()=>[__props.iconOnly?(openBlock(),createElementBlock(`span`,_hoisted_11$11,[createVNode(VIcon,{size:`20`,icon:unref(voice).listening.value&&!unref(microphoneMuted)?unref(mdiMicrophone):unref(mdiMicrophoneOff)},null,8,[`icon`])])):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(toDisplayString(talkLabel.value),1)],64))]),_:1},8,[`variant`,`min-height`,`icon`,`prepend-icon`,`aria-label`,`title`,`aria-pressed`,`aria-describedby`,`disabled`,`slim`,`width`,`min-width`,`onPointerdown`,`onPointerup`,`onPointercancel`,`onLostpointercapture`,`onKeydown`,`onKeyup`,`onBlur`,`onClick`]),createVNode(VBtn,{icon:unref(readAloud)?unref(mdiVolumeHigh):unref(mdiVolumeOff),"aria-pressed":unref(readAloud),variant:__props.iconOnly?`text`:`tonal`,color:__props.iconOnly?`primary`:void 0,"min-height":__props.iconOnly?44:__props.compact?48:64,width:__props.iconOnly?40:void 0,"min-width":__props.iconOnly?40:__props.compact?48:64,rounded:`xl`,"aria-label":unref(readAloud)?unref(t)(`jskit.assistant.voice.controls.readAloudOff`,{target:unref(targetLabel)}):unref(t)(`jskit.assistant.voice.controls.readAloudOn`,{target:unref(targetLabel)}),title:unref(readAloud)?unref(t)(`jskit.assistant.voice.controls.spokenRepliesOn`):unref(t)(`jskit.assistant.voice.controls.spokenRepliesOff`),disabled:__props.speakerDisabled||__props.session.readAloudChangePending?.value===true,onClick:unref(toggleReadAloud)},createSlots({_:2},[__props.iconOnly?{name:`default`,fn:withCtx(()=>[createBaseVNode(`span`,_hoisted_12$11,[createVNode(VIcon,{size:`20`,icon:unref(readAloud)?unref(mdiVolumeHigh):unref(mdiVolumeOff)},null,8,[`icon`])])]),key:`0`}:void 0]),1032,[`icon`,`aria-pressed`,`variant`,`color`,`min-height`,`width`,`min-width`,`aria-label`,`title`,`disabled`,`onClick`]),renderSlot(_ctx.$slots,`settings-control`,{},void 0,true),createBaseVNode(`p`,{id:unref(gestureHint),class:`text-body-small text-medium-emphasis`},toDisplayString(handsFreeListening.value?unref(t)(`jskit.assistant.voice.controls.tapToPause`):unref(t)(`jskit.assistant.voice.controls.tapForHandsFree`)),9,_hoisted_13$10)])],10,_hoisted_8$13)],8,[`to`,`disabled`]))],10,_hoisted_1$35)}}};var VoiceConversationControls_default=_plugin_vue_export_helper_default(_sfc_main$59,[[`__scopeId`,`data-v-2059128e`]]);var _hoisted_1$34=[`disabled`];var _hoisted_2$28=[`aria-label`,`title`];var _hoisted_3$26=[`aria-label`,`title`];var _hoisted_4$19=[`disabled`];var _hoisted_5$19=[`aria-label`];var _hoisted_6$14={key:0,class:`assistant-voice__call-body`};var _hoisted_7$13=[`aria-label`];var _hoisted_8$12=[`aria-label`];var _hoisted_9$10={class:`text-label-medium`};var _hoisted_10$10={class:`assistant-voice__caption-text text-body-medium`};var _hoisted_11$10=[`aria-label`];var _hoisted_12$10={class:`text-label-medium`};var _hoisted_13$9={class:`assistant-voice__caption-text text-body-medium`};var _sfc_main$58={__name:`VoiceConversation`,props:{session:{type:Object,required:true},disabled:{type:Boolean,default:false},adapter:{type:Object,default:null},showAvatar:{type:Boolean,default:true},avatarSize:{type:String,default:`compact`}},emits:[`update:avatarSize`],setup(__props){const props=__props;const{t}=useJskitText();const{targetLabel,voice,microphoneMuted,heldTranscript,pendingTranscript,sending,avatarVisual,callAudioLevel,voiceWords,voiceAnswer}=props.session;const presentationAdapter=computed(()=>props.adapter&&{...props.adapter,composer:{...props.adapter.composer,canSend:props.adapter.composer?.canSend&&!props.session.composerBlocked.value}});const toolsTarget=ref(null);const voiceWordsTarget=ref(null);const voiceAnswerTarget=ref(null);const followWords=ref(true);const followAnswer=ref(true);const youLabel=computed(()=>{if(heldTranscript.value&&voice.listening.value&&!microphoneMuted.value)return t(`jskit.assistant.voice.conversation.youHearing`);if(pendingTranscript.value&&!sending.value)return t(`jskit.assistant.voice.conversation.youNotSent`);return t(`jskit.assistant.voice.conversation.you`)});function isAtBottom(element){return element.scrollHeight-element.scrollTop-element.clientHeight<24}for(const[text,target,following]of[[voiceWords,voiceWordsTarget,followWords],[voiceAnswer,voiceAnswerTarget,followAnswer]])watch(text,()=>{if(target.value&&following.value)target.value.scrollTop=target.value.scrollHeight},{flush:`post`});return(_ctx,_cache)=>{return __props.adapter?(openBlock(),createElementBlock(`fieldset`,{key:0,class:`assistant-voice-conversation`,disabled:__props.disabled},[createVNode(unref(AssistantConversationElement_default),{adapter:presentationAdapter.value,"avatar-size":__props.avatarSize,"onUpdate:avatarSize":_cache[0]||(_cache[0]=$event=>_ctx.$emit(`update:avatarSize`,$event))},createSlots({"avatar-control":withCtx(scope=>[renderSlot(_ctx.$slots,`avatar-control`,normalizeProps(guardReactiveProps(scope)),()=>[scope.size===`hidden`&&unref(voice).listening.value&&!unref(microphoneMuted)?(openBlock(),createElementBlock(`span`,{key:0,role:`img`,"aria-label":unref(t)(`jskit.assistant.voice.conversation.listening`),title:unref(t)(`jskit.assistant.voice.conversation.listening`)},[createVNode(VIcon,{icon:unref(mdiMicrophone),size:`20`,"aria-hidden":`true`},null,8,[`icon`])],8,_hoisted_2$28)):createCommentVNode(``,true),scope.size===`hidden`&&unref(voice).speaking.value?(openBlock(),createElementBlock(`span`,{key:1,role:`img`,"aria-label":unref(t)(`jskit.assistant.voice.conversation.speaking`),title:unref(t)(`jskit.assistant.voice.conversation.speaking`)},[createVNode(VIcon,{icon:unref(mdiVolumeHigh),size:`20`,"aria-hidden":`true`},null,8,[`icon`])],8,_hoisted_3$26)):createCommentVNode(``,true)],true)]),"composer-feedback":withCtx(()=>[createVNode(VoiceConversationControls_default,{session:__props.session,disabled:__props.disabled,compact:``,"icon-only":__props.showAvatar,"tools-target":toolsTarget.value,"review-in-transcript":Boolean(presentationAdapter.value?.conversation?.previewMessage)},{"work-control":withCtx(()=>[renderSlot(_ctx.$slots,`work-control`,{},void 0,true)]),"settings-control":withCtx(()=>[renderSlot(_ctx.$slots,`settings-control`,{},void 0,true)]),_:3},8,[`session`,`disabled`,`icon-only`,`tools-target`,`review-in-transcript`])]),_:2},[__props.showAvatar?{name:`avatar`,fn:withCtx(size=>[renderSlot(_ctx.$slots,`avatar`,mergeProps(unref(avatarVisual),{size:size.size,height:size.height}),()=>[createVNode(VoiceAvatar_default,normalizeProps(guardReactiveProps(unref(avatarVisual))),null,16)],true)]),key:`0`}:void 0,__props.showAvatar?{name:`avatar-tools`,fn:withCtx(()=>[createBaseVNode(`div`,{ref_key:`toolsTarget`,ref:toolsTarget,class:`assistant-voice-conversation__tools`},null,512)]),key:`1`}:void 0]),1032,[`adapter`,`avatar-size`])],8,_hoisted_1$34)):(openBlock(),createElementBlock(`fieldset`,{key:1,class:`assistant-voice`,disabled:__props.disabled},[createBaseVNode(`section`,{class:normalizeClass([`assistant-voice__call`,{"assistant-voice__call--without-avatar":!__props.showAvatar}]),"aria-label":unref(t)(`jskit.assistant.voice.controls.label`,{target:unref(targetLabel)})},[__props.showAvatar?(openBlock(),createElementBlock(`div`,_hoisted_6$14,[createBaseVNode(`div`,{class:`assistant-voice__call-portrait`,style:normalizeStyle({"--call-audio-scale":1+unref(callAudioLevel)*.16}),"aria-hidden":`true`},[renderSlot(_ctx.$slots,`avatar`,normalizeProps(guardReactiveProps(unref(avatarVisual))),()=>[createVNode(VoiceAvatar_default,normalizeProps(guardReactiveProps(unref(avatarVisual))),null,16)],true)],4)])):createCommentVNode(``,true),createBaseVNode(`div`,{class:`assistant-voice__captions`,"aria-label":unref(t)(`jskit.assistant.voice.conversation.captions`)},[createBaseVNode(`section`,{ref_key:`voiceWordsTarget`,ref:voiceWordsTarget,class:`assistant-voice__caption`,"aria-label":unref(t)(`jskit.assistant.voice.conversation.recognizedWords`),tabindex:`0`,onScroll:_cache[1]||(_cache[1]=$event=>followWords.value=isAtBottom($event.currentTarget))},[createBaseVNode(`strong`,_hoisted_9$10,toDisplayString(youLabel.value),1),createBaseVNode(`p`,_hoisted_10$10,toDisplayString(unref(voiceWords)),1)],40,_hoisted_8$12),createBaseVNode(`section`,{ref_key:`voiceAnswerTarget`,ref:voiceAnswerTarget,class:`assistant-voice__caption`,"aria-label":unref(t)(`jskit.assistant.voice.conversation.latestAnswer`,{target:unref(targetLabel)}),tabindex:`0`,onScroll:_cache[2]||(_cache[2]=$event=>followAnswer.value=isAtBottom($event.currentTarget))},[createBaseVNode(`strong`,_hoisted_12$10,toDisplayString(unref(targetLabel)),1),createBaseVNode(`p`,_hoisted_13$9,toDisplayString(unref(voiceAnswer)),1)],40,_hoisted_11$10)],8,_hoisted_7$13),createVNode(VoiceConversationControls_default,{session:__props.session,disabled:__props.disabled},{"work-control":withCtx(()=>[renderSlot(_ctx.$slots,`work-control`,{},void 0,true)]),"settings-control":withCtx(()=>[renderSlot(_ctx.$slots,`settings-control`,{},void 0,true)]),_:3},8,[`session`,`disabled`])],10,_hoisted_5$19)],8,_hoisted_4$19))}}};var VoiceConversation_default=_plugin_vue_export_helper_default(_sfc_main$58,[[`__scopeId`,`data-v-baf71cfe`]]);var _sfc_main$57={__name:`VoiceSpeakingVoiceSelect`,props:{voice:{type:Object,required:true}},setup(__props){const{t}=useJskitText();const props=__props;function selectVoice(value){const selectedVoice=props.voice.selectedVoice;selectedVoice.value=value}return(_ctx,_cache)=>{return openBlock(),createBlock(VSelect,{"model-value":__props.voice.selectedVoice.value,"onUpdate:modelValue":selectVoice,items:__props.voice.availableVoices.value,"item-title":`label`,"item-value":`id`,disabled:__props.voice.availableVoices.value.length<2,label:unref(t)(`jskit.assistant.voice.settings.speakingVoice`),density:`comfortable`,hint:unref(t)(`jskit.assistant.voice.settings.speakingVoiceHint`),"persistent-hint":``},null,8,[`model-value`,`items`,`disabled`,`label`,`hint`])}}};var _hoisted_1$33={class:`voice-settings__disc`};var _sfc_main$56={__name:`VoiceConversationSettings`,props:{voice:{type:Object,default:null},compact:Boolean},emits:[`error`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const{t}=useJskitText();const slots=useSlots();async function openSettings(open){if(!open||slots.default||!props.voice)return;try{await props.voice.connect()}catch(error){emit(`error`,error)}}return(_ctx,_cache)=>{return openBlock(),createBlock(VMenu,{"close-on-content-click":false,location:`bottom end`,"onUpdate:modelValue":openSettings},{activator:withCtx(({props:settingsButton})=>[createVNode(VBtn,mergeProps(settingsButton,{icon:unref(mdiCog),variant:`text`,color:__props.compact?`primary`:void 0,width:__props.compact?40:void 0,"min-width":__props.compact?40:48,"min-height":__props.compact?44:48,disabled:!__props.voice&&!_ctx.$slots.default,"aria-label":unref(t)(`jskit.assistant.voice.settings.title`),title:unref(t)(`jskit.assistant.voice.settings.title`)}),createSlots({_:2},[__props.compact?{name:`default`,fn:withCtx(()=>[createBaseVNode(`span`,_hoisted_1$33,[createVNode(VIcon,{size:`20`,icon:unref(mdiCog)},null,8,[`icon`])])]),key:`0`}:void 0]),1040,[`icon`,`color`,`width`,`min-width`,`min-height`,`disabled`,`aria-label`,`title`])]),default:withCtx(()=>[createVNode(VCard,{class:`voice-settings__menu`,role:`region`,"aria-label":unref(t)(`jskit.assistant.voice.settings.title`)},{default:withCtx(()=>[createVNode(VCardText,null,{default:withCtx(()=>[renderSlot(_ctx.$slots,`default`,{voice:__props.voice},()=>[__props.voice?(openBlock(),createBlock(_sfc_main$57,{key:0,voice:__props.voice},null,8,[`voice`])):createCommentVNode(``,true)],true)]),_:3})]),_:3},8,[`aria-label`])]),_:3})}}};var VoiceConversationSettings_default=_plugin_vue_export_helper_default(_sfc_main$56,[[`__scopeId`,`data-v-1038e429`]]);var _hoisted_1$32={class:`voice-host__switch-actions`};var _hoisted_2$27={class:`voice-host__body`};var _sfc_main$55={__name:`VoiceConversationHost`,props:{controller:{type:Object,required:true},activator:{type:Object,default:null},avatarSize:{type:String,default:`hidden`},presentation:{type:String,default:`dialog`,validator:value=>[`dialog`,`inline`].includes(value)}},emits:[`update:avatarSize`],setup(__props){const props=__props;const{t}=useJskitText();const state=props.controller.state;async function invoke(operation){try{await operation()}catch(error){state.error=voiceErrorText(error)}}async function openText(){const opening=state.binding.openText();props.controller.minimize();try{await opening}catch(error){props.controller.reveal();throw error}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[unref(state).session?(openBlock(),createBlock(ConversationDialog_default,{key:0,"model-value":unref(state).visible,activator:__props.activator,presentation:__props.presentation,title:unref(state).binding.label||unref(t)(`jskit.assistant.voice.assistant`),mode:`talk`,"show-modes":Boolean(unref(state).binding.openText&&!unref(state).binding.adapter),minimizable:__props.presentation===`dialog`,"close-label":unref(t)(`jskit.assistant.voice.host.close`),onMinimize:_cache[7]||(_cache[7]=$event=>__props.controller.minimize()),"onUpdate:modelValue":_cache[8]||(_cache[8]=$event=>invoke(()=>__props.controller.end({discard:true}))),"onUpdate:mode":_cache[9]||(_cache[9]=value=>value===`text`&&invoke(openText))},createSlots({default:withCtx(()=>[unref(state).error?(openBlock(),createBlock(VAlert,{key:0,type:`error`,density:`compact`,role:`alert`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(state).error),1)]),_:1})):createCommentVNode(``,true),unref(state).nextTarget?(openBlock(),createBlock(VAlert,{key:1,type:`info`,class:`voice-host__switch`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.voice.host.switchPrompt`,{current:unref(state).binding.label||unref(t)(`jskit.assistant.voice.host.thisConversation`),next:unref(state).nextTarget.label||unref(t)(`jskit.assistant.voice.host.anotherConversation`)}))+` `,1),createBaseVNode(`div`,_hoisted_1$32,[createVNode(VBtn,{variant:`text`,onClick:_cache[1]||(_cache[1]=$event=>__props.controller.cancelSwitch())},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.voice.host.stayHere`)),1)]),_:1}),createVNode(VBtn,{disabled:unref(state).busy||unref(state).session.sending.value,variant:`text`,onClick:_cache[2]||(_cache[2]=$event=>invoke(()=>__props.controller.switchTarget({discard:true})))},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.voice.host.discardAndSwitch`)),1)]),_:1},8,[`disabled`]),!unref(state).session.hasUnsentSpeech.value?(openBlock(),createBlock(VBtn,{key:0,disabled:unref(state).busy,variant:`text`,onClick:_cache[3]||(_cache[3]=$event=>invoke(()=>__props.controller.switchTarget()))},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.voice.host.switch`)),1)]),_:1},8,[`disabled`])):createCommentVNode(``,true)])]),_:1})):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_2$27,[renderSlot(_ctx.$slots,`conversation`,{binding:unref(state).binding,session:unref(state).session,disabled:unref(state).busy},()=>[(openBlock(),createBlock(VoiceConversation_default,{key:unref(state).binding.id,session:unref(state).session,disabled:unref(state).busy,adapter:unref(state).binding.adapter||null,"show-avatar":unref(state).binding.showAvatar!==false,"avatar-size":__props.avatarSize,"onUpdate:avatarSize":_cache[6]||(_cache[6]=$event=>_ctx.$emit(`update:avatarSize`,$event))},createSlots({"work-control":withCtx(()=>[unref(state).binding.cancelWork&&unref(state).binding.state.status===`working`?(openBlock(),createBlock(VBtn,{key:0,disabled:unref(state).busy,icon:unref(mdiStop),variant:`text`,"aria-label":unref(t)(`jskit.assistant.voice.host.stopWork`),title:unref(t)(`jskit.assistant.voice.host.stopWork`),onClick:_cache[5]||(_cache[5]=$event=>invoke(unref(state).binding.cancelWork))},null,8,[`disabled`,`icon`,`aria-label`,`title`])):createCommentVNode(``,true)]),_:2},[_ctx.$slots.avatar?{name:`avatar`,fn:withCtx(visual=>[renderSlot(_ctx.$slots,`avatar`,mergeProps(visual,{binding:unref(state).binding}),void 0,true)]),key:`0`}:void 0,_ctx.$slots[`avatar-control`]?{name:`avatar-control`,fn:withCtx(scope=>[renderSlot(_ctx.$slots,`avatar-control`,mergeProps(scope,{binding:unref(state).binding,session:unref(state).session}),void 0,true)]),key:`1`}:void 0,__props.presentation===`inline`||unref(state).binding.adapter?{name:`settings-control`,fn:withCtx(()=>[createVNode(VoiceConversationSettings_default,{voice:unref(state).session.voice,compact:``,onError:_cache[4]||(_cache[4]=$event=>unref(state).error=unref(voiceErrorText)($event))},createSlots({_:2},[_ctx.$slots.settings?{name:`default`,fn:withCtx(settings=>[renderSlot(_ctx.$slots,`settings`,normalizeProps(guardReactiveProps(settings)),void 0,true)]),key:`0`}:void 0]),1032,[`voice`])]),key:`2`}:void 0]),1032,[`session`,`disabled`,`adapter`,`show-avatar`,`avatar-size`]))],true)])]),_:2},[!unref(state).binding.adapter?{name:`header-actions`,fn:withCtx(()=>[createVNode(VoiceConversationSettings_default,{voice:unref(state).session.voice,onError:_cache[0]||(_cache[0]=$event=>unref(state).error=unref(voiceErrorText)($event))},createSlots({_:2},[_ctx.$slots.settings?{name:`default`,fn:withCtx(settings=>[renderSlot(_ctx.$slots,`settings`,normalizeProps(guardReactiveProps(settings)),void 0,true)]),key:`0`}:void 0]),1032,[`voice`])]),key:`0`}:void 0]),1032,[`model-value`,`activator`,`presentation`,`title`,`show-modes`,`minimizable`,`close-label`])):createCommentVNode(``,true),__props.presentation===`dialog`&&unref(state).session&&!unref(state).visible?(openBlock(),createElementBlock(Fragment,{key:1},[_ctx.$slots.reopen?renderSlot(_ctx.$slots,`reopen`,{controller:__props.controller},void 0,true,0):(openBlock(),createBlock(VBtn,{key:1,class:`voice-host__reopen`,color:`primary`,"prepend-icon":unref(mdiHeadset),"min-height":`56`,onClick:_cache[10]||(_cache[10]=$event=>__props.controller.reveal())},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.voice.host.reopen`,{label:unref(state).binding.label||unref(t)(`jskit.assistant.voice.assistant`)})),1)]),_:1},8,[`prepend-icon`]))],64)):createCommentVNode(``,true)],64)}}};var VoiceConversationHost_default=_plugin_vue_export_helper_default(_sfc_main$55,[[`__scopeId`,`data-v-453fed1f`]]);var client_exports$11=__exportAll({ConversationDialog:()=>ConversationDialog_default,VoiceAvatar:()=>VoiceAvatar_default,VoiceConversation:()=>VoiceConversation_default,VoiceConversationControls:()=>VoiceConversationControls_default,VoiceConversationHost:()=>VoiceConversationHost_default,VoiceConversationSettings:()=>VoiceConversationSettings_default,VoiceSpeakingVoiceSelect:()=>_sfc_main$57,createVoiceConversationController:()=>createVoiceConversationController,projectConversationVoiceState:()=>projectConversationVoiceState,useVoiceAvatar:()=>useVoiceAvatar,useVoiceLauncher:()=>useVoiceLauncher});var VIBE64_VOICE_KEY=Symbol.for(`vibe64.voice`);function useVibe64Voice(){return inject$1(VIBE64_VOICE_KEY,null)}var _sfc_main$54={__name:`Vibe64VoiceHost`,props:{preferences:{type:Object,default:()=>({})},preparePreferences:{type:Function,default:null}},emits:[`read-aloud-change`,`playback`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const controller=createVoiceConversationController({connectSpeech(binding){if(!binding.prepareVoice)return binding.socketUrl;return binding.prepareVoice().then(()=>binding.socketUrl)}});const launcher=shallowRef(null);const slots=useSlots();const Avatar=visual=>slots.avatar?.(visual);const Settings=settings=>slots.settings?.(settings);function preferencesFor(conversation){return props.preferences[conversation.preferenceTarget]||{}}function readAloudFor(conversation){const value=preferencesFor(conversation).readAloud;return typeof value===`boolean`?value:conversation.defaults?.readAloud===true}function readAloudChangePendingFor(conversation){return preferencesFor(conversation).isSaving===true}provide(VIBE64_VOICE_KEY,{controller,launcher,readAloudFor,readAloudChangePendingFor,Avatar:slots.avatar?Avatar:null,Settings:slots.settings?Settings:null,open(conversation){let actorKey=props.preferences.actorKey;return controller.open({conversation:{...conversation,...props.preparePreferences?{async prepareVoice(){actorKey=await props.preparePreferences(conversation.preferenceTarget);if(!actorKey||props.preferences.actorKey!==actorKey||conversation.available===false)throw new Error(`This conversation is no longer available for voice.`);await conversation.prepareVoice?.();if(props.preferences.actorKey!==actorKey||conversation.available===false)throw new Error(`This conversation is no longer available for voice.`)}}:{},get state(){return conversation.state},get available(){return conversation.available},get label(){return conversation.label},get adapter(){return conversation.adapter},get onTranscript(){return conversation.onTranscript},get presentation(){return conversation.presentation},get readAloudChangePending(){return readAloudChangePendingFor(conversation)},get narration(){const narration=conversation.narration;if(!narration)return narration;const preferences=conversation.preferenceTarget===`coding`?preferencesFor(conversation):{};return{...narration,vocalizeThinking:typeof preferences.vocalizeThinking===`boolean`?preferences.vocalizeThinking:narration.vocalizeThinking,vocalizeInterimTurns:typeof preferences.vocalizeInterimTurns===`boolean`?preferences.vocalizeInterimTurns:narration.vocalizeInterimTurns,thinkingSounds:typeof preferences.thinkingSounds===`boolean`?preferences.thinkingSounds:narration.thinkingSounds}},get defaults(){const preferences=preferencesFor(conversation);return{...conversation.defaults,readAloud:readAloudFor(conversation),...preferences.sendMode===`edit`?{reviewBeforeSend:true}:{},...preferences.voice?{voiceId:preferences.voice===`current`?``:preferences.voice}:{}}},onReadAloudChange(value){emit(`read-aloud-change`,value,{target:conversation.preferenceTarget,actorKey});return conversation.onReadAloudChange?.(value)},onPlayback(event){emit(`playback`,event);return conversation.onPlayback?.(event)},get avatar(){return preferencesFor(conversation).avatar||conversation.avatar}}})}});onScopeDispose(()=>{controller.dispose()});return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[renderSlot(_ctx.$slots,`default`,{},void 0,true),unref(controller).state.binding?.presentation!==`inline`||unref(controller).state.nextTarget?(openBlock(),createBlock(unref(VoiceConversationHost_default),{key:0,controller:unref(controller),activator:launcher.value},createSlots({reopen:withCtx(()=>[]),_:2},[unref(controller).state.binding?.setConversationTarget?{name:`conversation`,fn:withCtx(({binding})=>[createBaseVNode(`div`,{ref:binding.setConversationTarget,class:`vibe64-voice-host__conversation`},null,512)]),key:`0`}:void 0,_ctx.$slots.settings?{name:`settings`,fn:withCtx(settings=>[renderSlot(_ctx.$slots,`settings`,mergeProps(settings,{binding:unref(controller).state.binding}),void 0,true)]),key:`1`}:void 0,_ctx.$slots.avatar?{name:`avatar`,fn:withCtx(visual=>[renderSlot(_ctx.$slots,`avatar`,mergeProps(visual,{binding:unref(controller).state.binding}),void 0,true)]),key:`2`}:void 0]),1032,[`controller`,`activator`])):createCommentVNode(``,true)],64)}}};var Vibe64VoiceHost_default=_plugin_vue_export_helper_default(_sfc_main$54,[[`__scopeId`,`data-v-fd961413`]]);var _hoisted_1$31={class:`merc-avatar__head-gesture`};var _hoisted_2$26={class:`merc-avatar__head`};var _hoisted_3$25={transform:`translate(35 34) scale(.78)`};var _hoisted_4$18={class:`merc-avatar__mouth`};var _hoisted_5$18={key:0,class:`merc-avatar__mouth-pose`};var _hoisted_6$13={key:1,class:`merc-avatar__mouth-pose`};var _hoisted_7$12={key:2,class:`merc-avatar__mouth-pose`};var _hoisted_8$11={key:3,class:`merc-avatar__mouth-pose`};var _hoisted_9$9={key:4,class:`merc-avatar__mouth-pose`};var _hoisted_10$9={key:5,class:`merc-avatar__lip`,d:`M140 190q20 7 40 0`};var _hoisted_11$9={key:6,class:`merc-avatar__lip`,d:`M141 191q19 3 38 0`};var _hoisted_12$9={key:7,class:`merc-avatar__lip`,d:`M142 191q17-3 36 1`};var _hoisted_13$8={key:8,class:`merc-avatar__lip`,d:`M141 191q19 1 38 0`};var _sfc_main$53={__name:`MercBlueMangaIllustratedAvatar`,props:{mouthLevel:{default:0,type:Number},mouthPose:{default:`closed`,type:String},state:{default:`idle`,type:String}},setup(__props){const{blinking,activeExpression,idleGesture,expression,visibleMouthPose}=useVoiceAvatar(__props);return(_ctx,_cache)=>{return openBlock(),createElementBlock(`svg`,{"aria-label":`Illustrated blue-haired manga girl AI avatar of Merc`,class:normalizeClass([`merc-avatar merc-avatar--blond-girl`,[`merc-avatar--${unref(expression)}`,`merc-avatar--mouth-${unref(visibleMouthPose)}`,unref(idleGesture)?`merc-avatar--gesture-${unref(idleGesture)}`:``,unref(activeExpression)?`merc-avatar--${unref(expression)}-${unref(activeExpression)}`:``,{"merc-avatar--blinking":unref(blinking)}]]),role:`img`,viewBox:`0 0 320 320`,xmlns:`http://www.w3.org/2000/svg`},[_cache[10]||(_cache[10]=createStaticVNode(`<g class="merc-avatar__body" data-v-2d81499d><path class="merc-avatar__shirt" d="M48 320c5-36 24-62 59-78 15-7 32-11 53-11s38 4 53 11c35 16 54 42 59 78H48Z" data-v-2d81499d></path><path class="merc-avatar__undershirt" d="M119 251c12 11 26 17 41 17s29-6 41-17l17 69H102l17-69Z" data-v-2d81499d></path><path class="merc-avatar__neck" d="M138 203h44v48c-7 13-37 13-44 0v-48Z" data-v-2d81499d></path><path class="merc-avatar__hood" d="M92 246c15-9 29-14 45-16l23 28 23-28c16 2 30 7 45 16l-16 48-35-26-17 23-17-23-35 26-16-48Z" data-v-2d81499d></path><path class="merc-avatar__hood-shadow" d="M103 252c13 5 26 13 40 24l17-18 17 18c14-11 27-19 40-24-9 17-18 29-28 39l-29-19-29 19c-10-10-19-22-28-39Z" data-v-2d81499d></path><path class="merc-avatar__jacket-panel" d="M48 320c4-29 17-52 39-69l23 39-10 30H48Zm224 0c-4-29-17-52-39-69l-23 39 10 30h52Z" data-v-2d81499d></path><path class="merc-avatar__shirt-neckline" d="M125 255q35 24 70 0" data-v-2d81499d></path></g>`,1)),createBaseVNode(`g`,_hoisted_1$31,[createBaseVNode(`g`,_hoisted_2$26,[_cache[6]||(_cache[6]=createStaticVNode(`<path class="merc-avatar__hair merc-avatar__hair--back" d="M74 153C66 119 70 78 91 49c17-24 42-36 69-36 37 0 65 13 82 39 20 31 20 72 6 110-8 22-22 41-43 54H115c-22-14-34-34-41-63Z" data-v-2d81499d></path><path class="merc-avatar__hair merc-avatar__hair--crown-spikes" d="M87 82c12-33 38-55 72-62 32-6 62 1 82 19-17 2-30 7-41 16-12-7-25-10-39-9-15 1-29 7-40 16-11-3-22-2-34 0Z" data-v-2d81499d></path><path class="merc-avatar__hair merc-avatar__hair--temples" d="M92 116c-18 12-25 31-21 56 4 23 15 41 35 54-8-24-8-47 1-68l-15-42Zm136 0c18 12 25 31 21 56-4 23-15 41-35 54 8-24 8-47-1-68l15-42Z" data-v-2d81499d></path><ellipse class="merc-avatar__ear" cx="94" cy="151" rx="10" ry="18" data-v-2d81499d></ellipse><ellipse class="merc-avatar__ear" cx="226" cy="151" rx="10" ry="18" data-v-2d81499d></ellipse><path class="merc-avatar__face" d="M160 72c-41 0-67 24-67 67 0 45 27 82 67 85 40-3 67-40 67-85 0-43-26-67-67-67Z" data-v-2d81499d></path><path class="merc-avatar__hair merc-avatar__hair--cap" d="M82 118c-5-31 2-58 22-79 19-20 42-28 68-27 34 1 60 14 75 38 13 21 17 47 10 76-18-13-40-21-66-22-38-2-74 3-109 14Z" data-v-2d81499d></path><path class="merc-avatar__hair merc-avatar__hair--fringe" d="M88 105c15 2 29-3 41-15 8-7 15-15 21-24 2 11 7 20 15 27 8-10 17-18 28-24 1 13 5 23 12 30 10-7 19-15 27-25 5 19 5 37 0 53-14-8-29-13-45-15-23-3-43-1-61 5-15 5-28 11-39 18-7-18-10-35-9-54Z" data-v-2d81499d></path><path class="merc-avatar__hair-swoops" d="M91 76c22-33 56-49 99-48M103 91c29-29 65-38 107-28M117 105c28-20 61-25 97-15" data-v-2d81499d></path><path class="merc-avatar__brow merc-avatar__brow--left" d="M104 111c13-8 28-9 41-3" data-v-2d81499d></path><path class="merc-avatar__brow merc-avatar__brow--right" d="M175 108c13-6 28-5 41 3" data-v-2d81499d></path>`,11)),createBaseVNode(`g`,{class:normalizeClass([`merc-avatar__eyes`,{"merc-avatar__eyes--closed":unref(blinking)}])},[..._cache[0]||(_cache[0]=[createStaticVNode(`<g class="merc-avatar__eye" data-v-2d81499d><ellipse class="merc-avatar__eye-white" cx="126" cy="145" rx="19" ry="23" data-v-2d81499d></ellipse><ellipse class="merc-avatar__iris" cx="127" cy="145" rx="14.5" ry="19.5" data-v-2d81499d></ellipse><ellipse class="merc-avatar__pupil" cx="128" cy="145" rx="9.5" ry="14" data-v-2d81499d></ellipse><circle class="merc-avatar__eye-light" cx="121" cy="136" r="5.5" data-v-2d81499d></circle><circle class="merc-avatar__eye-light" cx="133" cy="154" r="3" data-v-2d81499d></circle><path class="merc-avatar__eye-light merc-avatar__eye-star" d="M116 147l3 5 5 2-5 2-3 5-2-5-5-2 5-2 2-5Z" data-v-2d81499d></path></g><g class="merc-avatar__eye" data-v-2d81499d><ellipse class="merc-avatar__eye-white" cx="194" cy="145" rx="19" ry="23" data-v-2d81499d></ellipse><ellipse class="merc-avatar__iris" cx="193" cy="145" rx="14.5" ry="19.5" data-v-2d81499d></ellipse><ellipse class="merc-avatar__pupil" cx="192" cy="145" rx="9.5" ry="14" data-v-2d81499d></ellipse><circle class="merc-avatar__eye-light" cx="187" cy="136" r="5.5" data-v-2d81499d></circle><circle class="merc-avatar__eye-light" cx="199" cy="154" r="3" data-v-2d81499d></circle><path class="merc-avatar__eye-light merc-avatar__eye-star" d="M181 147l3 5 5 2-5 2-3 5-2-5-5-2 5-2 2-5Z" data-v-2d81499d></path></g><path class="merc-avatar__eyeliner" d="M106 143q20-27 40 0M174 143q20-27 40 0" data-v-2d81499d></path><path class="merc-avatar__eyelashes" d="M108 132l-9-5m14 0-6-9m7 5-2-10m100 19 9-5m-14 0 6-9m-7 5 2-10" data-v-2d81499d></path>`,4)])],2),_cache[7]||(_cache[7]=createBaseVNode(`path`,{class:`merc-avatar__nose`,d:`M159 164q-2 5 2 6`},null,-1)),_cache[8]||(_cache[8]=createBaseVNode(`ellipse`,{class:`merc-avatar__cheek`,cx:`112`,cy:`180`,rx:`18`,ry:`9`},null,-1)),_cache[9]||(_cache[9]=createBaseVNode(`ellipse`,{class:`merc-avatar__cheek`,cx:`208`,cy:`180`,rx:`18`,ry:`9`},null,-1)),createBaseVNode(`g`,_hoisted_3$25,[createBaseVNode(`g`,_hoisted_4$18,[unref(visibleMouthPose)===`smile`?(openBlock(),createElementBlock(`g`,_hoisted_5$18,[..._cache[1]||(_cache[1]=[createBaseVNode(`path`,{class:`merc-avatar__mouth-inside`,d:`M134 183q26 12 52 0c-2 25-13 36-26 36s-24-11-26-36Z`},null,-1),createBaseVNode(`path`,{class:`merc-avatar__teeth`,d:`M139 184q21 8 42 0c-3 8-10 11-21 11s-18-3-21-11Z`},null,-1),createBaseVNode(`path`,{class:`merc-avatar__tongue`,d:`M147 207q13-9 26 0c-4 7-8 10-13 10s-9-3-13-10Z`},null,-1)])])):unref(visibleMouthPose)===`wide`?(openBlock(),createElementBlock(`g`,_hoisted_6$13,[..._cache[2]||(_cache[2]=[createBaseVNode(`path`,{class:`merc-avatar__mouth-inside`,d:`M130 185q30-13 60 0-5 25-30 25t-30-25Z`},null,-1),createBaseVNode(`path`,{class:`merc-avatar__teeth`,d:`M135 186q25-8 50 0-8 8-25 8t-25-8Z`},null,-1)])])):unref(visibleMouthPose)===`open`?(openBlock(),createElementBlock(`g`,_hoisted_7$12,[..._cache[3]||(_cache[3]=[createBaseVNode(`ellipse`,{class:`merc-avatar__mouth-inside`,cx:`160`,cy:`194`,rx:`19`,ry:`25`},null,-1),createBaseVNode(`path`,{class:`merc-avatar__tongue`,d:`M145 207q15-11 30 0-5 10-15 10t-15-10Z`},null,-1)])])):unref(visibleMouthPose)===`round`?(openBlock(),createElementBlock(`g`,_hoisted_8$11,[..._cache[4]||(_cache[4]=[createBaseVNode(`ellipse`,{class:`merc-avatar__mouth-inside`,cx:`160`,cy:`193`,rx:`12`,ry:`18`},null,-1),createBaseVNode(`ellipse`,{class:`merc-avatar__lip-light`,cx:`160`,cy:`193`,rx:`16`,ry:`22`},null,-1)])])):unref(visibleMouthPose)===`small`?(openBlock(),createElementBlock(`g`,_hoisted_9$9,[..._cache[5]||(_cache[5]=[createBaseVNode(`ellipse`,{class:`merc-avatar__mouth-inside`,cx:`160`,cy:`191`,rx:`19`,ry:`10`},null,-1),createBaseVNode(`path`,{class:`merc-avatar__lip`,d:`M142 191q18 12 36 0`},null,-1)])])):unref(visibleMouthPose)===`warm-smile`?(openBlock(),createElementBlock(`path`,_hoisted_10$9)):unref(visibleMouthPose)===`soft-smile`?(openBlock(),createElementBlock(`path`,_hoisted_11$9)):unref(visibleMouthPose)===`thoughtful`?(openBlock(),createElementBlock(`path`,_hoisted_12$9)):(openBlock(),createElementBlock(`path`,_hoisted_13$8))])])])])],2)}}};var MercBlueMangaIllustratedAvatar_default=_plugin_vue_export_helper_default(_sfc_main$53,[[`__scopeId`,`data-v-2d81499d`]]);var _hoisted_1$30={class:`merc-avatar__head-gesture`};var _hoisted_2$25={class:`merc-avatar__head`};var _hoisted_3$24={class:`merc-avatar__mouth`};var _hoisted_4$17={key:0,class:`merc-avatar__mouth-pose`};var _hoisted_5$17={key:1,class:`merc-avatar__mouth-pose`};var _hoisted_6$12={key:2,class:`merc-avatar__mouth-pose`};var _hoisted_7$11={key:3,class:`merc-avatar__mouth-pose`};var _hoisted_8$10={key:4,class:`merc-avatar__mouth-pose`};var _hoisted_9$8={key:5,class:`merc-avatar__lip`,d:`M140 190q20 7 40 0`};var _hoisted_10$8={key:6,class:`merc-avatar__lip`,d:`M141 191q19 3 38 0`};var _hoisted_11$8={key:7,class:`merc-avatar__lip`,d:`M142 191q17-3 36 1`};var _hoisted_12$8={key:8,class:`merc-avatar__lip`,d:`M141 191q19 1 38 0`};var _sfc_main$52={__name:`MercIllustratedAvatar`,props:{mouthLevel:{default:0,type:Number},mouthPose:{default:`closed`,type:String},state:{default:`idle`,type:String}},setup(__props){const{blinking,activeExpression,idleGesture,expression,visibleMouthPose}=useVoiceAvatar(__props);return(_ctx,_cache)=>{return openBlock(),createElementBlock(`svg`,{"aria-label":`Illustrated AI avatar of Merc`,class:normalizeClass([`merc-avatar`,[`merc-avatar--${unref(expression)}`,`merc-avatar--mouth-${unref(visibleMouthPose)}`,unref(idleGesture)?`merc-avatar--gesture-${unref(idleGesture)}`:``,unref(activeExpression)?`merc-avatar--${unref(expression)}-${unref(activeExpression)}`:``,{"merc-avatar--blinking":unref(blinking)}]]),role:`img`,viewBox:`0 0 320 320`,xmlns:`http://www.w3.org/2000/svg`},[_cache[11]||(_cache[11]=createBaseVNode(`g`,{class:`merc-avatar__body`},[createBaseVNode(`path`,{class:`merc-avatar__shirt`,d:`M52 320c4-50 28-78 75-91h66c47 13 71 41 75 91H52Z`}),createBaseVNode(`path`,{class:`merc-avatar__neck`,d:`M130 205h60v50c-8 15-52 15-60 0v-50Z`})],-1)),createBaseVNode(`g`,_hoisted_1$30,[createBaseVNode(`g`,_hoisted_2$25,[_cache[6]||(_cache[6]=createStaticVNode(`<path class="merc-avatar__hair merc-avatar__hair--back" d="M86 145c-11-35-4-68 18-90l-8-20 26 11 7-26 20 20 12-26 13 27 24-19 1 27 29-13-10 26h28l-21 20 25 12-23 10c5 12 7 25 5 39l-14-19c-5-43-28-68-59-69-34-2-58 24-62 69l-11 18Z" data-v-01ade6f0></path><ellipse class="merc-avatar__ear" cx="91" cy="148" rx="16" ry="27" data-v-01ade6f0></ellipse><ellipse class="merc-avatar__ear" cx="229" cy="148" rx="16" ry="27" data-v-01ade6f0></ellipse><path class="merc-avatar__face" d="M160 48c-44 0-70 31-70 84 0 61 29 102 70 102s70-41 70-102c0-53-26-84-70-84Z" data-v-01ade6f0></path><path class="merc-avatar__hair merc-avatar__hair--fringe" d="M91 115c5-38 29-61 66-65 35-3 61 15 72 50l-19-12-3 20-17-24-6 22-20-27-9 25-16-25-15 24-15-16-11 23-7 5Z" data-v-01ade6f0></path><path class="merc-avatar__hair-lock" d="M108 72c9-12 20-20 33-24M145 43l-2 29M176 42l5 31M204 54c9 8 15 19 18 31" data-v-01ade6f0></path><path class="merc-avatar__brow merc-avatar__brow--left" d="M113 113c11-8 24-8 34-1" data-v-01ade6f0></path><path class="merc-avatar__brow merc-avatar__brow--right" d="M173 112c11-7 24-7 34 1" data-v-01ade6f0></path>`,8)),createBaseVNode(`g`,{class:normalizeClass([`merc-avatar__eyes`,{"merc-avatar__eyes--closed":unref(blinking)}])},[..._cache[0]||(_cache[0]=[createStaticVNode(`<g class="merc-avatar__eye" data-v-01ade6f0><ellipse class="merc-avatar__eye-white" cx="130" cy="132" rx="18" ry="11" data-v-01ade6f0></ellipse><circle class="merc-avatar__iris" cx="132" cy="132" r="7.5" data-v-01ade6f0></circle><circle class="merc-avatar__pupil" cx="133" cy="132" r="3.6" data-v-01ade6f0></circle><circle class="merc-avatar__eye-light" cx="135" cy="128" r="1.8" data-v-01ade6f0></circle></g><g class="merc-avatar__eye" data-v-01ade6f0><ellipse class="merc-avatar__eye-white" cx="190" cy="132" rx="18" ry="11" data-v-01ade6f0></ellipse><circle class="merc-avatar__iris" cx="188" cy="132" r="7.5" data-v-01ade6f0></circle><circle class="merc-avatar__pupil" cx="187" cy="132" r="3.6" data-v-01ade6f0></circle><circle class="merc-avatar__eye-light" cx="190" cy="128" r="1.8" data-v-01ade6f0></circle></g>`,2)])],2),_cache[7]||(_cache[7]=createBaseVNode(`path`,{class:`merc-avatar__nose`,d:`M158 132c-1 15-6 27-3 31 4 4 10 4 14 0`},null,-1)),_cache[8]||(_cache[8]=createBaseVNode(`ellipse`,{class:`merc-avatar__cheek`,cx:`116`,cy:`166`,rx:`17`,ry:`9`},null,-1)),_cache[9]||(_cache[9]=createBaseVNode(`ellipse`,{class:`merc-avatar__cheek`,cx:`204`,cy:`166`,rx:`17`,ry:`9`},null,-1)),createBaseVNode(`g`,null,[createBaseVNode(`g`,_hoisted_3$24,[unref(visibleMouthPose)===`smile`?(openBlock(),createElementBlock(`g`,_hoisted_4$17,[..._cache[1]||(_cache[1]=[createBaseVNode(`path`,{class:`merc-avatar__mouth-inside`,d:`M132 183q28 24 56 0c-4 20-16 29-28 29s-24-9-28-29Z`},null,-1),createBaseVNode(`path`,{class:`merc-avatar__teeth`,d:`M137 185q23 14 46 0c-4 9-13 13-23 13s-19-4-23-13Z`},null,-1)])])):unref(visibleMouthPose)===`wide`?(openBlock(),createElementBlock(`g`,_hoisted_5$17,[..._cache[2]||(_cache[2]=[createBaseVNode(`path`,{class:`merc-avatar__mouth-inside`,d:`M130 185q30-13 60 0-5 25-30 25t-30-25Z`},null,-1),createBaseVNode(`path`,{class:`merc-avatar__teeth`,d:`M135 186q25-8 50 0-8 8-25 8t-25-8Z`},null,-1)])])):unref(visibleMouthPose)===`open`?(openBlock(),createElementBlock(`g`,_hoisted_6$12,[..._cache[3]||(_cache[3]=[createBaseVNode(`ellipse`,{class:`merc-avatar__mouth-inside`,cx:`160`,cy:`194`,rx:`19`,ry:`25`},null,-1),createBaseVNode(`path`,{class:`merc-avatar__tongue`,d:`M145 207q15-11 30 0-5 10-15 10t-15-10Z`},null,-1)])])):unref(visibleMouthPose)===`round`?(openBlock(),createElementBlock(`g`,_hoisted_7$11,[..._cache[4]||(_cache[4]=[createBaseVNode(`ellipse`,{class:`merc-avatar__mouth-inside`,cx:`160`,cy:`193`,rx:`12`,ry:`18`},null,-1),createBaseVNode(`ellipse`,{class:`merc-avatar__lip-light`,cx:`160`,cy:`193`,rx:`16`,ry:`22`},null,-1)])])):unref(visibleMouthPose)===`small`?(openBlock(),createElementBlock(`g`,_hoisted_8$10,[..._cache[5]||(_cache[5]=[createBaseVNode(`ellipse`,{class:`merc-avatar__mouth-inside`,cx:`160`,cy:`191`,rx:`19`,ry:`10`},null,-1),createBaseVNode(`path`,{class:`merc-avatar__lip`,d:`M142 191q18 12 36 0`},null,-1)])])):unref(visibleMouthPose)===`warm-smile`?(openBlock(),createElementBlock(`path`,_hoisted_9$8)):unref(visibleMouthPose)===`soft-smile`?(openBlock(),createElementBlock(`path`,_hoisted_10$8)):unref(visibleMouthPose)===`thoughtful`?(openBlock(),createElementBlock(`path`,_hoisted_11$8)):(openBlock(),createElementBlock(`path`,_hoisted_12$8))])]),_cache[10]||(_cache[10]=createBaseVNode(`circle`,{class:`merc-avatar__earring`,cx:`84`,cy:`165`,r:`5`},null,-1))])])],2)}}};var MercIllustratedAvatar_default=_plugin_vue_export_helper_default(_sfc_main$52,[[`__scopeId`,`data-v-01ade6f0`]]);var _sfc_main$51={__name:`MercAvatar`,props:{avatar:{default:`yu`,type:String},mouthLevel:{default:0,type:Number},mouthPose:{default:`closed`,type:String},state:{default:`idle`,type:String}},setup(__props){return(_ctx,_cache)=>{return __props.avatar===`merc`?(openBlock(),createBlock(MercIllustratedAvatar_default,{key:0,"mouth-level":__props.mouthLevel,"mouth-pose":__props.mouthPose,state:__props.state},null,8,[`mouth-level`,`mouth-pose`,`state`])):(openBlock(),createBlock(MercBlueMangaIllustratedAvatar_default,{key:1,"mouth-level":__props.mouthLevel,"mouth-pose":__props.mouthPose,state:__props.state},null,8,[`mouth-level`,`mouth-pose`,`state`]))}}};var VIBE64_AVATAR_CHOICES=Object.freeze([Object.freeze({id:`merc`,label:`Merc · male`}),Object.freeze({id:`yu`,label:`Yu · female`})]);var VIBE64_AVATAR_IDS=Object.freeze(VIBE64_AVATAR_CHOICES.map(choice=>choice.id));var VIBE64_DEFAULT_AVATARS=Object.freeze({colleague:`merc`,coding:`yu`});function isVibe64AvatarId(value){return VIBE64_AVATAR_IDS.includes(value)}var _sfc_main$50={__name:`Vibe64AvatarSetting`,props:{modelValue:{type:String,default:null},disabled:Boolean,loading:Boolean,hint:{type:String,default:``}},emits:[`update:modelValue`],setup(__props){return(_ctx,_cache)=>{return openBlock(),createBlock(VSelect,{"model-value":__props.modelValue,items:unref(VIBE64_AVATAR_CHOICES),"item-title":`label`,"item-value":`id`,label:`Avatar`,density:`comfortable`,disabled:__props.disabled,loading:__props.loading,hint:__props.hint,"persistent-hint":Boolean(__props.hint),"onUpdate:modelValue":_cache[0]||(_cache[0]=value=>_ctx.$emit(`update:modelValue`,value))},null,8,[`model-value`,`items`,`disabled`,`loading`,`hint`,`persistent-hint`])}}};var MAIN_CONVERSATION_PREFIX=`vibe64-main:`;var TEMPORARY_CONVERSATION_PREFIX=`vibe64-temporary:`;function invalidConversation(kind){return Object.assign(new TypeError(`Invalid ${kind} conversation identity.`),{code:`conversation_input_invalid`,statusCode:400})}function mainConversationId({projectSlug,sessionId}={}){if(typeof projectSlug!==`string`||!projectSlug.trim()||typeof sessionId!==`string`||!sessionId.trim())throw new TypeError(`A Main conversation requires a project and session.`);return`${MAIN_CONVERSATION_PREFIX}${JSON.stringify([projectSlug,sessionId])}`}function mainConversationTarget(id){if(typeof id!==`string`||!id.startsWith(MAIN_CONVERSATION_PREFIX))return null;let target;try{target=JSON.parse(id.slice(12))}catch{throw invalidConversation(`Main`)}if(!Array.isArray(target)||target.length!==2||target.some(value=>typeof value!==`string`||!value.trim()))throw invalidConversation(`Main`);return{projectSlug:target[0],sessionId:target[1]}}function temporaryConversationId({projectSlug,sessionId,conversationId}={}){if([projectSlug,sessionId,conversationId].some(value=>typeof value!==`string`||!value.trim()))throw new TypeError(`A temporary conversation requires its project, session and saved logical identity.`);return`${TEMPORARY_CONVERSATION_PREFIX}${JSON.stringify([projectSlug,sessionId,conversationId])}`}function projectVoiceState(runtime){return projectConversationVoiceState({turns:runtime.conversationLog.turns||[],status:runtime.mounted.session.value?.agentSession?.turn?.active?`working`:`ready`})}function createProjectVoiceBinding(runtime,view={}){const identity=runtime.identity;let retained;return{preferenceTarget:`coding`,defaults:{readAloud:true},id:JSON.stringify([`project`,identity.actorKey,identity.projectSlug,identity.sessionId]),conversationId:mainConversationId(identity),socketUrl:`/api/app/${encodeURIComponent(identity.projectSlug)}/vibe64/sessions/${encodeURIComponent(identity.sessionId)}/voice/ws`,get label(){return`${identity.projectSlug} · ${runtime.mounted.session.value?.sessionName||identity.sessionId}`},get state(){return projectVoiceState(runtime)},get available(){return runtime.available.value},get narration(){return{turns:runtime.conversationLog.turns||[],loading:runtime.conversationLog.loading===true,working:runtime.mounted.session.value?.agentSession?.turn?.active===true,eligible:runtime.available.value&&runtime.access.canUseChat.value&&view.eligible===true,vocalizeThinking:false,vocalizeInterimTurns:false,thinkingSounds:true}},get adapter(){return view.adapter||null},get presentation(){return view.presentation||`dialog`},get onTranscript(){return view.onTranscript},captureContext:()=>({...identity}),retain(){retained=runtime.retain();runtime=retained.runtime},release(){retained?.release();retained=null},submitText(text,{messageId,context}={}){if(context?.actorKey!==identity.actorKey||context?.sessionId!==identity.sessionId||context?.projectSlug!==identity.projectSlug)throw new Error(`This recording belongs to another conversation.`);return runtime.send({message:text,agentSettings:runtime.agentSettings.requestSettings.value},{messageId})},cancelWork:()=>runtime.interrupt()}}var client_exports$10=__exportAll({Vibe64AvatarSetting:()=>_sfc_main$50,Vibe64ColleagueAvatar:()=>_sfc_main$51,Vibe64VoiceHost:()=>Vibe64VoiceHost_default,createProjectVoiceBinding:()=>createProjectVoiceBinding,useVibe64Voice:()=>useVibe64Voice});var COLLEAGUE_VOICE_SOCKET_URL=`/api/vibe64/colleague/voice/ws`;var VIBE64_TRAINING_LEARNER_CHANGED_EVENT=`vibe64.training.learner.changed`;function messageText(value=``){return String(value||``).trim()}function conversationTurns(conversationLog={}){if(Array.isArray(conversationLog?.turns))return conversationLog.turns;return Array.isArray(conversationLog)?conversationLog:[]}function latestAssistantMessageAwaitingUserReply(conversationLog={}){const turns=conversationTurns(conversationLog);for(let turnIndex=turns.length-1;turnIndex>=0;turnIndex-=1){const turn=turns[turnIndex];const messages=Array.isArray(turn?.messages)?turn.messages:[];if(messages.length){for(let index=messages.length-1;index>=0;index-=1){const message=messages[index];const text=messageText(message?.text);if(!text)continue;if(message?.role===`user`)return``;if(message?.role===`assistant`){if(message.status===`inProgress`)return``;return text}}continue}if(messageText(turn?.user?.text))return``;const assistantText=messageText(turn?.assistant?.text);if(assistantText){if(turn.assistant.status===`inProgress`)return``;return assistantText}}return``}var _hoisted_1$29={key:1,class:`text-body-2 text-medium-emphasis mb-4`};var _hoisted_2$24={key:2,class:`text-body-2 text-medium-emphasis mb-4`};var _hoisted_3$23={class:`d-flex align-center justify-end ga-3 mt-2`};var _sfc_main$49={__name:`AssistantSettingsFormCard`,props:{rootClass:{type:String,required:true},title:{type:String,required:true},subtitle:{type:String,required:true},noPermissionMessage:{type:String,required:true},saveLabel:{type:String,required:true},addEdit:{type:Object,required:true},showFormSkeleton:{type:Boolean,default:false}},setup(__props){const{t}=useJskitText();const props=__props;return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:normalizeClass(props.rootClass)},[createVNode(VCard,{rounded:`lg`,elevation:`1`,border:``},{default:withCtx(()=>[createVNode(VCardItem,null,{default:withCtx(()=>[createVNode(VCardTitle,{class:`text-h6`},{default:withCtx(()=>[createTextVNode(toDisplayString(props.title),1)]),_:1}),createVNode(VCardSubtitle,null,{default:withCtx(()=>[createTextVNode(toDisplayString(props.subtitle),1)]),_:1})]),_:1}),createVNode(VDivider),createVNode(VCardText,{class:`pt-4`},{default:withCtx(()=>[props.showFormSkeleton?(openBlock(),createBlock(VSkeletonLoader,{key:0,type:`text@2, list-item-two-line@4, button`})):props.addEdit.loadError?(openBlock(),createElementBlock(`p`,_hoisted_1$29,toDisplayString(props.addEdit.loadError),1)):!props.addEdit.canView?(openBlock(),createElementBlock(`p`,_hoisted_2$24,toDisplayString(props.noPermissionMessage),1)):(openBlock(),createBlock(VForm,{key:3,onSubmit:withModifiers(props.addEdit.submit,[`prevent`]),novalidate:``},{default:withCtx(()=>[props.addEdit.isRefetching?(openBlock(),createBlock(VProgressLinear,{key:0,indeterminate:``,class:`mb-4`})):createCommentVNode(``,true),renderSlot(_ctx.$slots,`default`),createBaseVNode(`div`,_hoisted_3$23,[props.addEdit.canSave?(openBlock(),createBlock(VBtn,{key:0,type:`submit`,color:`primary`,loading:props.addEdit.isSaving,disabled:props.addEdit.isInitialLoading||props.addEdit.isRefetching},{default:withCtx(()=>[createTextVNode(toDisplayString(props.saveLabel),1)]),_:1},8,[`loading`,`disabled`])):(openBlock(),createBlock(VChip,{key:1,color:`secondary`,label:``},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.settings.readOnly`)),1)]),_:1}))])]),_:3},8,[`onSubmit`]))]),_:3})]),_:3})],2)}}};var assistantHttpClient=createHttpClient({credentials:`include`,csrf:{sessionPath:`/api/session`}});function rewriteEmbeddedTransportSchemaRefs(value,{rootRef=`#`,definitionRefByName={}}={}){if(Array.isArray(value))return value.map(entry=>rewriteEmbeddedTransportSchemaRefs(entry,{rootRef,definitionRefByName}));if(!value||typeof value!==`object`)return value;const rewritten={};for(const[key,entry]of Object.entries(value)){if(key===`$ref`&&typeof entry===`string`){if(entry===`#`){rewritten[key]=rootRef;continue}if(entry.startsWith(`#/definitions/`)){rewritten[key]=definitionRefByName[entry.slice(14)]||entry;continue}}rewritten[key]=rewriteEmbeddedTransportSchemaRefs(entry,{rootRef,definitionRefByName})}return rewritten}function createEmbeddableTransportSchemaDocument(schemaDocument={},rootDefinitionName=`TransportSchema`){const{$schema:_jsonSchemaDraft,definitions:sourceDefinitions={},...rootSchema}=schemaDocument||{};const rootRef=`#/definitions/${rootDefinitionName}`;const definitionRefByName={};const definitions={};for(const definitionName of Object.keys(sourceDefinitions))definitionRefByName[definitionName]=`#/definitions/${rootDefinitionName}__${definitionName}`;definitions[rootDefinitionName]=rewriteEmbeddedTransportSchemaRefs(rootSchema,{rootRef,definitionRefByName});for(const[definitionName,definitionSchema]of Object.entries(sourceDefinitions))definitions[`${rootDefinitionName}__${definitionName}`]=rewriteEmbeddedTransportSchemaRefs(definitionSchema,{rootRef,definitionRefByName});return{schema:{allOf:[{$ref:rootRef}]},definitions}}var fieldErrorsFieldDefinition=deepFreeze({type:`object`,values:{type:`string`,minLength:1}});var apiErrorDetailsSchema=createSchema({fieldErrors:{...fieldErrorsFieldDefinition,required:false}});var apiValidationErrorDetailsSchema=createSchema({fieldErrors:{...fieldErrorsFieldDefinition,required:true}});var errorMessageCodeFieldDefinitions=deepFreeze({params:{type:`object`,required:false,additionalProperties:true},messageCode:{type:`string`,required:false,minLength:1},messageParams:{type:`object`,required:false,additionalProperties:true}});var apiErrorOutputValidator=deepFreeze({schema:createSchema({error:{type:`string`,required:true,minLength:1},code:{type:`string`,required:false,minLength:1},...errorMessageCodeFieldDefinitions,transactionOutcome:{type:`string`,required:false,enum:TRANSACTION_OUTCOMES},details:{type:`object`,required:false,schema:apiErrorDetailsSchema,additionalProperties:true},fieldErrors:{...fieldErrorsFieldDefinition,required:false}}),mode:`replace`});var apiValidationErrorOutputValidator=deepFreeze({schema:createSchema({error:{type:`string`,required:true,minLength:1},code:{type:`string`,required:false,minLength:1},...errorMessageCodeFieldDefinitions,transactionOutcome:{type:`string`,required:false,enum:TRANSACTION_OUTCOMES},fieldErrors:{...fieldErrorsFieldDefinition,required:true},details:{type:`object`,required:true,schema:apiValidationErrorDetailsSchema,additionalProperties:true}}),mode:`replace`});var apiErrorTransportSchema=apiErrorOutputValidator.schema.toJsonSchema({mode:apiErrorOutputValidator.mode});var apiValidationErrorTransportSchema=apiValidationErrorOutputValidator.schema.toJsonSchema({mode:apiValidationErrorOutputValidator.mode});var embeddedApiErrorTransportSchema=createEmbeddableTransportSchemaDocument(apiErrorTransportSchema,`ApiErrorOutput`);var embeddedApiValidationErrorTransportSchema=createEmbeddableTransportSchemaDocument(apiValidationErrorTransportSchema,`ApiValidationErrorOutput`);var sharedErrorTransportDefinitions={...embeddedApiValidationErrorTransportSchema.definitions,...embeddedApiErrorTransportSchema.definitions};function resolveOperationSection(operation={},section=`body`){if(!operation||typeof operation!==`object`||Array.isArray(operation))return null;return operation[section]==null?null:operation[section]}function isFieldValidationError(error){return Boolean(error?.fieldErrors&&typeof error.fieldErrors===`object`)}function validateOperationSection({operation={},section=`body`,value}={}){const sectionDefinition=resolveOperationSection(operation,section);if(!sectionDefinition)return{ok:true,value,fieldErrors:{},fieldErrorCodes:{}};try{return{ok:true,value:validateSchemaPayload(sectionDefinition,value,{phase:`input`,context:`operation section "${section}"`}),fieldErrors:{},fieldErrorCodes:{}}}catch(error){if(!isFieldValidationError(error))throw error;return{ok:false,value:null,fieldErrors:error.fieldErrors,fieldErrorCodes:error.fieldErrorCodes||{}}}}var JSON_API_RESULT_KINDS=Object.freeze([`data`,`document`,`meta`]);var JSON_API_ID_SCHEMA=Object.freeze({anyOf:[{type:`string`,minLength:1},{type:`number`}]});var JSON_API_LINK_VALUE_SCHEMA=Object.freeze({anyOf:[{type:`string`,minLength:1},{type:`object`,additionalProperties:true}]});var JSON_API_LINKS_SCHEMA=Object.freeze({type:`object`,additionalProperties:JSON_API_LINK_VALUE_SCHEMA});var JSON_API_META_SCHEMA=Object.freeze({type:`object`,additionalProperties:true});var JSON_API_RESOURCE_IDENTIFIER_SCHEMA=Object.freeze({type:`object`,additionalProperties:false,required:[`type`,`id`],properties:{type:{type:`string`,minLength:1},id:JSON_API_ID_SCHEMA}});var JSON_API_RELATIONSHIP_OBJECT_SCHEMA=Object.freeze({type:`object`,additionalProperties:false,required:[`data`],properties:{data:{anyOf:[JSON_API_RESOURCE_IDENTIFIER_SCHEMA,{type:`array`,items:JSON_API_RESOURCE_IDENTIFIER_SCHEMA},{type:`null`}]}}});var JSON_API_INCLUDED_RESOURCE_SCHEMA=Object.freeze({type:`object`,additionalProperties:false,required:[`type`,`id`],properties:{type:{type:`string`,minLength:1},id:JSON_API_ID_SCHEMA,attributes:{type:`object`,additionalProperties:true},relationships:{type:`object`,additionalProperties:JSON_API_RELATIONSHIP_OBJECT_SCHEMA},links:JSON_API_LINKS_SCHEMA,meta:JSON_API_META_SCHEMA}});var JSON_API_ERROR_OBJECT_SCHEMA=Object.freeze({type:`object`,additionalProperties:false,properties:{status:{type:`string`,minLength:1},code:{type:`string`,minLength:1},title:{type:`string`,minLength:1},detail:{type:`string`,minLength:1},source:{type:`object`,additionalProperties:true},links:JSON_API_LINKS_SCHEMA,meta:JSON_API_META_SCHEMA}});var JSON_API_ERROR_DOCUMENT_SCHEMA=Object.freeze({type:`object`,additionalProperties:false,required:[`errors`],properties:{errors:{type:`array`,minItems:1,items:JSON_API_ERROR_OBJECT_SCHEMA},links:JSON_API_LINKS_SCHEMA,meta:JSON_API_META_SCHEMA}});var ASSISTANT_API_RELATIVE_PATH=`/assistant`;function materializeAssistantPath(basePath=``,{workspaceSlug=``,surfaceId=``,suffix=`/`}={}){const normalizedBasePath=String(basePath||``).trim();if(!normalizedBasePath)return``;let materializedBasePath=normalizedBasePath;if(normalizedBasePath.includes(`:workspaceSlug`)){const normalizedWorkspaceSlug=normalizeText$1(workspaceSlug).toLowerCase();if(!normalizedWorkspaceSlug)return``;materializedBasePath=normalizedBasePath.replace(`:workspaceSlug`,encodeURIComponent(normalizedWorkspaceSlug))}if(materializedBasePath.includes(`:surfaceId`)){const normalizedSurfaceId=normalizeText$1(surfaceId).toLowerCase();if(!normalizedSurfaceId)return``;materializedBasePath=materializedBasePath.replace(`:surfaceId`,encodeURIComponent(normalizedSurfaceId))}const normalizedSuffix=normalizePathname$1(suffix);return normalizedSuffix===`/`?materializedBasePath:`${materializedBasePath}${normalizedSuffix}`}function resolveAssistantApiBasePath({requiresWorkspace=false}={}){return resolveScopedApiBasePath({routeBase:requiresWorkspace===true?`/w/:workspaceSlug`:`/`,relativePath:ASSISTANT_API_RELATIVE_PATH,strictParams:false})}function buildAssistantApiPath({requiresWorkspace=false,workspaceSlug=``,suffix=`/`}={}){return materializeAssistantPath(resolveAssistantApiBasePath({requiresWorkspace}),{workspaceSlug,suffix})}var ASSISTANT_QUERY_KEY_PREFIX=Object.freeze([`assistant`]);function normalizeSurfaceId(value){return String(value||``).trim().toLowerCase()||`none`}function normalizeWorkspaceSlug(value){return String(value||``).trim()||`none`}function normalizePositiveInteger(value,fallback){const parsed=Number(value);if(!Number.isInteger(parsed)||parsed<1)return fallback;return parsed}function normalizeScopeKey({targetSurfaceId=``,workspaceSlug=``,workspaceId=null}={}){const normalizedWorkspaceId=normalizeRecordId(workspaceId,{fallback:null});const normalizedSurfaceId=normalizeSurfaceId(targetSurfaceId);if(normalizedWorkspaceId)return`${normalizedSurfaceId}:workspace:${normalizedWorkspaceId}`;const normalizedWorkspaceSlug=normalizeWorkspaceSlug(workspaceSlug);if(normalizedWorkspaceSlug!==`none`)return`${normalizedSurfaceId}:slug:${normalizedWorkspaceSlug}`;return`${normalizedSurfaceId}:global`}function normalizeStatus(value){return String(value||``).trim().toLowerCase()||`all`}function normalizeConversationId(value){return normalizeRecordId(value,{fallback:`none`})}function assistantRootQueryKey(){return[...ASSISTANT_QUERY_KEY_PREFIX]}function assistantScopeQueryKey(scope={}){return[...assistantRootQueryKey(),normalizeScopeKey(scope)]}function assistantSettingsQueryKey(scope={}){return[...assistantScopeQueryKey(scope),`settings`]}function assistantConversationsListQueryKey(scope={},{limit=20,status=``}={}){return[...assistantScopeQueryKey(scope),`conversations`,`list`,normalizePositiveInteger(limit,20),normalizeStatus(status)]}function assistantConversationMessagesQueryKey(scope={},conversationId,{page=1,pageSize=200}={}){return[...assistantScopeQueryKey(scope),`conversations`,normalizeConversationId(conversationId),`messages`,normalizePositiveInteger(page,1),normalizePositiveInteger(pageSize,200)]}var ASSISTANT_STREAM_EVENT_TYPES=Object.freeze({META:`meta`,ASSISTANT_DELTA:`assistant_delta`,ASSISTANT_MESSAGE:`assistant_message`,TOOL_CALL:`tool_call`,TOOL_RESULT:`tool_result`,ERROR:`error`,DONE:`done`});var STREAM_EVENT_TYPE_SET=new Set(Object.values(ASSISTANT_STREAM_EVENT_TYPES));function normalizeAssistantStreamEventType(value,fallback=``){const normalized=String(value||``).trim().toLowerCase();if(!normalized)return fallback;if(!STREAM_EVENT_TYPE_SET.has(normalized))return fallback;return normalized}var OPERATION_SCHEMA_SECTION_NAMES=Object.freeze([`body`,`query`,`params`,`input`,`output`]);function createSchemaDefinition(schema,mode=`patch`,{context=`schema definition`}={}){return normalizeSingleSchemaDefinition({schema,mode},{context,defaultMode:`patch`})}function normalizeSchemaDefinitionLike(value,{context=`schema definition`,defaultMode=`patch`}={}){if(value==null)return value;const definition=isJsonRestSchemaInstance(value)?{schema:value,mode:defaultMode}:value;return normalizeSingleSchemaDefinition(definition,{context,defaultMode})}function resolveDefaultOperationSchemaMode(sectionName,operation={}){const normalizedSectionName=normalizeText$1(sectionName).toLowerCase();if(normalizedSectionName===`output`)return`replace`;if(normalizedSectionName!==`body`)return`patch`;const normalizedMethod=normalizeText$1(operation?.method).toUpperCase();if(normalizedMethod===`POST`)return`create`;if(normalizedMethod===`PUT`)return`replace`;return`patch`}function normalizeOperationDefinition(operationName,operation=null,resourceMessages=null){if(!operation||typeof operation!==`object`||Array.isArray(operation))throw new TypeError(`defineResource operations.${operationName} must be an object.`);const source=normalizeObject$1(operation);const normalizedOperation={...source};if(resourceMessages&&typeof resourceMessages===`object`&&!Array.isArray(resourceMessages)&&!Object.hasOwn(source,`messages`))normalizedOperation.messages=resourceMessages;for(const sectionName of OPERATION_SCHEMA_SECTION_NAMES){if(!Object.hasOwn(source,sectionName))continue;const defaultMode=resolveDefaultOperationSchemaMode(sectionName,source);normalizedOperation[sectionName]=normalizeSchemaDefinitionLike(source[sectionName],{context:`defineResource operations.${operationName}.${sectionName}`,defaultMode})}return deepFreeze(normalizedOperation)}function normalizeResourceOperations(operations=null,resourceMessages=null){const source=normalizeObject$1(operations);const normalizedOperations={};for(const[operationName,operation]of Object.entries(source)){const normalizedOperationName=normalizeText$1(operationName);if(!normalizedOperationName)continue;normalizedOperations[normalizedOperationName]=normalizeOperationDefinition(normalizedOperationName,operation,resourceMessages)}return Object.freeze(normalizedOperations)}function requireResourceNamespace(value,{context=`defineResource resource.namespace`}={}){const normalizedNamespace=normalizeText$1(value);if(!normalizedNamespace)throw new TypeError(`${context} requires a non-empty namespace.`);return normalizedNamespace}function defineResource(resource={}){const source=normalizeObject$1(resource);const normalizedMessages=Object.hasOwn(source,`messages`)?normalizeObject$1(source.messages):null;return deepFreeze({...source,namespace:requireResourceNamespace(source.namespace),...normalizedMessages?{messages:normalizedMessages}:{},operations:normalizeResourceOperations(source.operations,normalizedMessages)})}var MAX_INPUT_CHARS=8e3;var MAX_HISTORY_MESSAGES=20;var MAX_PAGE_SIZE=200;var MAX_MESSAGE_PAGE_SIZE=500;var attachmentIdsField={type:`array`,required:false,maxItems:10,items:{type:`string`,minLength:1,maxLength:256}};var historyMessageSchema=createSchema({attachmentIds:attachmentIdsField,role:{type:`string`,required:true,enum:[`user`,`assistant`]},content:{type:`string`,required:true,minLength:1,maxLength:MAX_INPUT_CHARS}});var clientContextSchema=createSchema({locale:{type:`string`,required:false,maxLength:64},timezone:{type:`string`,required:false,maxLength:64}});var chatStreamBodySchema=createSchema({attachmentIds:attachmentIdsField,integrationId:{type:`string`,required:false,minLength:1,maxLength:128},messageId:{type:`string`,required:true,minLength:1,maxLength:128},conversationId:{type:`string`,required:false,minLength:1,pattern:RECORD_ID_PATTERN},input:{type:`string`,required:true,minLength:1,maxLength:MAX_INPUT_CHARS},history:{type:`array`,required:false,maxItems:20,items:historyMessageSchema},clientContext:{type:`object`,required:false,schema:clientContextSchema}});var conversationsListQuerySchema=createSchema({cursor:{type:`id`,required:false},limit:{type:`number`,required:false,min:1,max:MAX_PAGE_SIZE},status:{type:`string`,required:false,minLength:1,maxLength:32}});var conversationRecordSchema=createSchema({id:{type:`string`,required:true,minLength:1,pattern:RECORD_ID_PATTERN},workspaceId:{type:`string`,required:true,nullable:true,minLength:1,pattern:RECORD_ID_PATTERN},title:{type:`string`,required:true},createdByUserId:{type:`string`,required:true,nullable:true,minLength:1,pattern:RECORD_ID_PATTERN},status:{type:`string`,required:true},provider:{type:`string`,required:true},model:{type:`string`,required:true},surfaceId:{type:`string`,required:true},startedAt:{type:`string`,required:true,minLength:1},endedAt:{type:`string`,required:true,nullable:true,minLength:1},messageCount:{type:`integer`,required:true,min:0},metadata:{type:`object`,required:true,additionalProperties:true},createdAt:{type:`string`,required:true,minLength:1},updatedAt:{type:`string`,required:true,minLength:1}});var messageRecordSchema=createSchema({id:{type:`string`,required:true,minLength:1,pattern:RECORD_ID_PATTERN},conversationId:{type:`string`,required:true,minLength:1,pattern:RECORD_ID_PATTERN},workspaceId:{type:`string`,required:true,nullable:true,minLength:1,pattern:RECORD_ID_PATTERN},seq:{type:`integer`,required:true,min:1},role:{type:`string`,required:true,minLength:1},kind:{type:`string`,required:true,minLength:1},clientMessageSid:{type:`string`,required:true},actorUserId:{type:`string`,required:true,nullable:true,minLength:1,pattern:RECORD_ID_PATTERN},contentText:{type:`string`,required:true,nullable:true},createdAt:{type:`string`,required:true,minLength:1},metadata:{type:`object`,required:true,additionalProperties:true}});var conversationMessagesParamsSchema=createSchema({conversationId:{type:`id`,required:true}});var conversationMessagesQuerySchema=createSchema({page:{type:`number`,required:false,min:1},pageSize:{type:`number`,required:false,min:1,max:500}});var conversationMessagesListOutputSchema=createSchema({page:{type:`integer`,required:true,min:1},pageSize:{type:`integer`,required:true,min:1},total:{type:`integer`,required:true,min:0},totalPages:{type:`integer`,required:true,min:1},conversation:{type:`object`,required:true,schema:conversationRecordSchema},entries:{type:`array`,required:true,items:messageRecordSchema}});var assistantConversationOutputValidator=createSchemaDefinition(conversationRecordSchema,`replace`);var assistantResource=defineResource({namespace:`assistant`,operations:{chatStream:{method:`POST`,body:chatStreamBodySchema},conversationsList:{method:`GET`,query:conversationsListQuerySchema,output:createCursorListValidator(createSchemaDefinition(conversationRecordSchema,`replace`))},conversationMessagesList:{method:`GET`,params:conversationMessagesParamsSchema,query:conversationMessagesQuerySchema,output:conversationMessagesListOutputSchema}}});function buildCrudOperationSchemaFields(fields={},operationName=``){const definitions={};for(const[fieldKey,fieldDefinition]of Object.entries(fields)){const operationConfig=fieldDefinition?.operations?.[operationName];if(!operationConfig)continue;const nextDefinition={...fieldDefinition};delete nextDefinition.operations;if(operationConfig!==true)Object.assign(nextDefinition,operationConfig);definitions[fieldKey]=nextDefinition}return definitions}function normalizeCrudNamespace(value=``){return normalizeText$1(value).toLowerCase().replace(/[^a-z0-9-]+/g,`-`).replace(/-+/g,`-`).replace(/^-+|-+$/g,``)}function requireCrudNamespace(namespace,{context=`requireCrudNamespace`}={}){const normalizedNamespace=normalizeCrudNamespace(namespace);if(!normalizedNamespace)throw new TypeError(`${context} requires a non-empty namespace.`);return normalizedNamespace}function resolveCrudRecordChangedEvent(namespace=``){return`${requireCrudNamespace(namespace,{context:`resolveCrudRecordChangedEvent`}).replace(/-/g,`_`)}.record.changed`}var DEFAULT_CRUD_OPERATION_NAMES=Object.freeze([`list`,`view`,`create`,`patch`,`delete`]);var SUPPORTED_CRUD_OPERATION_NAMES=Object.freeze([`list`,`view`,`create`,`replace`,`patch`,`delete`]);var CRUD_OPERATION_SPECS=deepFreeze({list:{method:`GET`,outputKind:`list`,includeRealtimeEvent:true},view:{method:`GET`,outputKind:`record`},create:{method:`POST`,outputKind:`record`,bodyOperation:`create`,bodyMode:`create`,explicitBodyKeys:[`createBody`,`body`]},replace:{method:`PUT`,outputKind:`record`,bodyOperation:`replace`,bodyMode:`replace`,explicitBodyKeys:[`replaceBody`,`body`,`createBody`]},patch:{method:`PATCH`,outputKind:`record`,bodyOperation:`patch`,bodyMode:`patch`,explicitBodyKeys:[`patchBody`,`body`]},delete:{method:`DELETE`,outputKind:`delete`}});function createCrudRecordIdFieldDefinition(){return{type:`string`,required:true,minLength:1,pattern:RECORD_ID_PATTERN}}function resolveConfiguredLookupContainerKey(resource={}){return normalizeText$1(resource?.contract?.lookup?.containerKey)}function resolveFieldEntries(resource={},operationName=`output`){return buildCrudOperationSchemaFields(resource?.schema,operationName)}function createDerivedCrudRecordOutputDefinition(resource={}){const outputFields=resolveFieldEntries(resource,`output`);if(Object.keys(outputFields).length<1)throw new Error(`defineCrudResource derived output requires explicit crud.output or at least one schema field with operations.output.`);const fields={id:createCrudRecordIdFieldDefinition(),...outputFields};const lookupContainerKey=resolveConfiguredLookupContainerKey(resource);if(lookupContainerKey)fields[lookupContainerKey]={type:`object`,required:false};return createSchemaDefinition(createSchema(fields),`replace`,{context:`defineCrudResource derived output`})}function createDerivedCrudBodyDefinition(resource={},operationName=`patch`,bodyMode=`patch`){let fields=resolveFieldEntries(resource,operationName);if(operationName===`replace`&&Object.keys(fields).length===0)fields=resolveFieldEntries(resource,`create`);if(Object.keys(fields).length<1){const fieldHint=operationName===`replace`?`operations.replace or operations.create`:`operations.${operationName}`;throw new Error(`defineCrudResource derived ${operationName} body requires explicit crud.${operationName}Body or at least one schema field with ${fieldHint}.`)}return createSchemaDefinition(createSchema(fields),bodyMode,{context:`defineCrudResource derived ${operationName} body`})}function createCrudDeleteOutputDefinition(){return createSchemaDefinition(createSchema({id:createCrudRecordIdFieldDefinition(),deleted:{type:`boolean`,required:true}}),`replace`,{context:`defineCrudResource delete output`})}function requireCrudOperationName(value=``,{context=`crud operation name`}={}){const normalizedName=normalizeText$1(value).toLowerCase();if(SUPPORTED_CRUD_OPERATION_NAMES.includes(normalizedName))return normalizedName;throw new Error(`${context} must be one of: ${SUPPORTED_CRUD_OPERATION_NAMES.join(`, `)}. Received: ${JSON.stringify(value)}.`)}function requireCrudOperationSpec(operationName=``){const spec=CRUD_OPERATION_SPECS[operationName];if(spec)return spec;throw new Error(`createCrudOperationDefinition received unsupported operation "${operationName}".`)}function resolveCrudOperationNames(resource={}){const configuredOperations=Array.isArray(resource?.crudOperations)?resource.crudOperations:DEFAULT_CRUD_OPERATION_NAMES;const names=[];const seen=new Set;for(const rawName of configuredOperations){const operationName=requireCrudOperationName(rawName,{context:`defineCrudResource crudOperations`});if(seen.has(operationName))continue;seen.add(operationName);names.push(operationName)}return names}function resolveFirstPresentValue(source={},keys=[]){for(const key of Array.isArray(keys)?keys:[])if(Object.hasOwn(source,key)&&source[key]!=null)return source[key];return null}function resolveExplicitCrudSchemaDefinition(crudConfig={},keys=[],{context=`defineCrudResource schema definition`,defaultMode=`patch`}={}){const explicitValue=resolveFirstPresentValue(crudConfig,keys);if(explicitValue==null)return null;return normalizeSchemaDefinitionLike(explicitValue,{context,defaultMode})}function createCrudListOutputDefinition(resolveRecordOutputDefinition,crudConfig={}){const explicitListOutput=resolveExplicitCrudSchemaDefinition(crudConfig,[`listOutput`],{context:`defineCrudResource crud.listOutput`,defaultMode:`replace`});if(explicitListOutput)return explicitListOutput;const explicitListItemOutput=resolveExplicitCrudSchemaDefinition(crudConfig,[`listItemOutput`],{context:`defineCrudResource crud.listItemOutput`,defaultMode:`replace`});if(explicitListItemOutput)return createCursorListValidator(explicitListItemOutput);return createCursorListValidator(resolveRecordOutputDefinition())}function createCrudRecordOutputDefinitionResolver(resource={},crudConfig={}){let cachedDefinition=null;let hasResolved=false;return function resolveRecordOutputDefinition(){if(hasResolved)return cachedDefinition;cachedDefinition=resolveExplicitCrudSchemaDefinition(crudConfig,[`output`],{context:`defineCrudResource crud.output`,defaultMode:`replace`})||createDerivedCrudRecordOutputDefinition(resource);hasResolved=true;return cachedDefinition}}function resolveCrudBodyDefinition(spec,resource={},crudConfig={}){const explicitBody=resolveExplicitCrudSchemaDefinition(crudConfig,spec.explicitBodyKeys,{context:`defineCrudResource operations.${spec.bodyOperation}.body`,defaultMode:spec.bodyMode});if(explicitBody)return explicitBody;return createDerivedCrudBodyDefinition(resource,spec.bodyOperation,spec.bodyMode)}function resolveCrudOutputDefinition(spec,resolveRecordOutputDefinition,crudConfig={}){if(spec.outputKind===`list`)return createCrudListOutputDefinition(resolveRecordOutputDefinition,crudConfig);if(spec.outputKind===`record`)return resolveRecordOutputDefinition();if(spec.outputKind===`delete`)return resolveExplicitCrudSchemaDefinition(crudConfig,[`deleteOutput`],{context:`defineCrudResource operations.delete.output`,defaultMode:`replace`})||createCrudDeleteOutputDefinition();throw new Error(`resolveCrudOutputDefinition received unsupported output kind "${spec.outputKind}".`)}function createCrudOperationDefinition(operationName,{namespace=``,resource={},crudConfig={},resolveRecordOutputDefinition}={}){const spec=requireCrudOperationSpec(operationName);const nextOperation={method:spec.method};if(spec.includeRealtimeEvent)nextOperation.realtime={events:[resolveCrudRecordChangedEvent(namespace)]};if(spec.bodyOperation)nextOperation.body=resolveCrudBodyDefinition(spec,resource,crudConfig);nextOperation.output=resolveCrudOutputDefinition(spec,resolveRecordOutputDefinition,crudConfig);return nextOperation}function createDefaultCrudOperations(resource={}){const namespace=requireCrudNamespace(resource?.namespace,{context:`createDefaultCrudOperations resource.namespace`});const crudConfig=normalizeObject$1(resource?.crud);const resolveRecordOutputDefinition=createCrudRecordOutputDefinitionResolver(resource,crudConfig);const operations={};for(const operationName of resolveCrudOperationNames(resource))operations[operationName]=createCrudOperationDefinition(operationName,{namespace,resource,crudConfig,resolveRecordOutputDefinition});return operations}function mergeCrudOperationDefinition(baseDefinition,overrideDefinition){const normalizedBase=normalizeObject$1(baseDefinition);const normalizedOverride=normalizeObject$1(overrideDefinition);const mergedRealtime={...normalizeObject$1(normalizedBase.realtime),...normalizeObject$1(normalizedOverride.realtime)};return{...normalizedBase,...normalizedOverride,...Object.keys(mergedRealtime).length>0?{realtime:mergedRealtime}:{}}}function mergeCrudOperations(defaultOperations={},overrides={}){const baseEntries=normalizeObject$1(defaultOperations);const overrideEntries=normalizeObject$1(overrides);const merged={};for(const[operationName,baseDefinition]of Object.entries(baseEntries))merged[operationName]=mergeCrudOperationDefinition(baseDefinition,overrideEntries[operationName]);for(const[operationName,overrideDefinition]of Object.entries(overrideEntries)){if(Object.hasOwn(merged,operationName))continue;merged[operationName]=overrideDefinition}return merged}function defineCrudResource(resource={}){const source=normalizeObject$1(resource);const{crud:_crudConfig,crudOperations:_crudOperations,...authoredResource}=source;return defineResource({...authoredResource,operations:mergeCrudOperations(createDefaultCrudOperations(source),authoredResource.operations)})}var MAX_SYSTEM_PROMPT_CHARS=12e3;var assistantConfigRecordSchema=createSchema({targetSurfaceId:{type:`string`,required:true,minLength:1,maxLength:64},scopeKey:{type:`string`,required:true,minLength:1,maxLength:160},workspaceId:{type:`string`,required:true,nullable:true,minLength:1,pattern:RECORD_ID_PATTERN},settings:{type:`object`,required:true,schema:createSchema({systemPrompt:{type:`string`,required:true,maxLength:MAX_SYSTEM_PROMPT_CHARS}})}});var assistantConfigPatchSchema=createSchema({systemPrompt:{type:`string`,required:false,maxLength:MAX_SYSTEM_PROMPT_CHARS,messages:{maxLength:`Assistant system prompt must be at most ${MAX_SYSTEM_PROMPT_CHARS} characters.`,default:`Assistant system prompt must be valid text.`}}});var assistantConfigResource=defineCrudResource({namespace:`assistantConfig`,crudOperations:[`view`,`patch`],crud:{output:assistantConfigRecordSchema,patchBody:assistantConfigPatchSchema}});var ASSISTANT_SETTINGS_TRANSPORT=deepFreeze({kind:`jsonapi-resource`,responseType:`assistant-settings`,responseKind:`record`});var ASSISTANT_SETTINGS_UPDATE_TRANSPORT=deepFreeze({...ASSISTANT_SETTINGS_TRANSPORT,requestType:`assistant-settings`});var ASSISTANT_CONVERSATIONS_TRANSPORT=deepFreeze({kind:`jsonapi-resource`,responseType:`assistant-conversations`,responseKind:`collection`});var ASSISTANT_CONVERSATION_MESSAGES_TRANSPORT=deepFreeze({kind:`jsonapi-resource`,responseType:`assistant-conversation-messages`,responseKind:`record`});var assistantSettingsEvents=Object.freeze({settingsChanged:`assistant.settings.changed`});var ASSISTANT_CONVERSATION_STATUSES=Object.freeze([`active`,`completed`,`failed`,`aborted`]);var ASSISTANT_CONVERSATION_STATUS_SET=new Set(ASSISTANT_CONVERSATION_STATUSES);function normalizeConversationStatus$1(value,{fallback=``}={}){const normalized=normalizeText$1(value).toLowerCase();if(ASSISTANT_CONVERSATION_STATUS_SET.has(normalized))return normalized;return normalizeText$1(fallback).toLowerCase()}function parseJsonObject(value){if(value==null)return{};try{const parsed=typeof value===`string`?JSON.parse(value):value;if(!parsed||typeof parsed!==`object`||Array.isArray(parsed))return{};return parsed}catch{return{}}}function toPositiveInteger(value,fallback=0){return normalizePositiveInteger$1(value,{fallback})}var MAX_PROGRESS_ONLY_TEXT_CHARS=600;var PROGRESS_SENTENCE_PATTERNS=Object.freeze([/^(?:let me|i(?:'|’)ll|i will|i(?:'|’)m going to|i am going to)\s+(?:(?:first|now|quickly)\s+)*(?:analy[sz]e|call|check|confirm|do|execute|fetch|find|inspect|investigate|load|look up|open|prepare|query|read|retrieve|review|run|search|summarize|test|try|use|verify)\b/iu,/^(?:analy[sz]ing|calling|checking|confirming|executing|fetching|finding|inspecting|investigating|loading|looking up|opening|preparing|querying|reading|retrieving|reviewing|running|searching|summarizing|testing|trying|using|verifying)\b/iu,/^(?:one moment|please wait)\b/iu]);function isAssistantProgressOnlyText(value){const text=String(value||``).replace(/\s+/gu,` `).trim().replace(/^(?:okay|sure)[,;:!\s—-]+/iu,``);if(!text||text.length>MAX_PROGRESS_ONLY_TEXT_CHARS)return false;const sentences=text.split(/(?<=[.!?…])\s+/u).map(sentence=>sentence.trim()).filter(Boolean);return sentences.length>0&&sentences.every(sentence=>PROGRESS_SENTENCE_PATTERNS.some(pattern=>pattern.test(sentence)))}var isRecord=value=>Boolean(value)&&typeof value===`object`&&!Array.isArray(value);function buildStreamEventError(event){const sent=String(event?.message||``);const error=new Error(sent||`Assistant request failed.`);error.code=String(event?.code||`assistant_stream_error`);error.params=isRecord(event?.params)?event.params:{};if(event?.messageCode){error.messageCode=String(event.messageCode);error.messageParams=isRecord(event.messageParams)?event.messageParams:{}}else if(!sent){error.messageCode=`assistant.api.requestFailed`;error.messageParams={}}error.status=Number(event?.status||500);error.event=event&&typeof event===`object`?{...event}:null;return error}function appendQueryParam(params,key,value){if(value==null)return;const normalized=String(value).trim();if(!normalized)return;params.set(key,normalized)}function createAssistantQueryParams(query={},transport=null){const params=new URLSearchParams;const encodedQuery=encodeJsonApiResourceQueryObject(query,{responseType:transport?.responseType});for(const[key,value]of Object.entries(encodedQuery))appendQueryParam(params,key,value);return params}function normalizeSurfaceHeaderValue(value){return String(value||``).trim().toLowerCase()}function resolveAssistantRequestHeaders(resolveSurfaceId){if(typeof resolveSurfaceId!==`function`)return null;const surfaceId=normalizeSurfaceHeaderValue(resolveSurfaceId());if(!surfaceId)return null;return{"x-jskit-surface":surfaceId}}function resolveRequiredBasePath(resolveBasePath){if(typeof resolveBasePath!==`function`)throw new Error(`createAssistantApi requires resolveBasePath().`);const resolved=String(resolveBasePath()||``).trim();if(!resolved)throw new Error(`Assistant API base path is required.`);return resolved}function createAssistantApi({request,requestStream,resolveBasePath,resolveSurfaceId=null}={}){if(typeof request!==`function`)throw new Error(`createAssistantApi requires request().`);function requestConversation(conversationId,suffix,options){const basePath=resolveRequiredBasePath(resolveBasePath);const encodedId=encodeURIComponent(String(conversationId||``).trim());const headers=resolveAssistantRequestHeaders(resolveSurfaceId);return request(`${basePath}/conversations/${encodedId}${suffix}`,{...options,...headers?{headers}:{}})}return Object.freeze({readConversation(conversationId,{signal,beforeTurnId,limit}={}){const params=new URLSearchParams;appendQueryParam(params,`beforeTurnId`,beforeTurnId);appendQueryParam(params,`limit`,limit);return requestConversation(conversationId,params.size?`?${params}`:``,{method:`GET`,signal})},sendConversationMessage(conversationId,payload,{signal}={}){return requestConversation(conversationId,`/messages`,{method:`POST`,signal,body:{messageId:payload.messageId,text:payload.text,...Object.hasOwn(payload,`data`)?{data:payload.data}:{},...Object.hasOwn(payload,`attachmentIds`)?{attachmentIds:payload.attachmentIds}:{},...Object.hasOwn(payload,`steer`)?{steer:payload.steer}:{}}})},cancelConversation(conversationId,{signal}={}){return requestConversation(conversationId,`/cancel`,{method:`POST`,signal})},inspectConversationDelivery(conversationId,messageId,{signal}={}){return requestConversation(conversationId,`/deliveries/${encodeURIComponent(String(messageId||``).trim())}/inspect`,{method:`POST`,signal})},readConversationGoal(conversationId,{signal}={}){return requestConversation(conversationId,`/goal`,{method:`GET`,signal})},updateConversationGoal(conversationId,payload,{signal}={}){const body={};for(const key of[`action`,`expectedSegmentId`,`expectedGoalId`,`messageId`,`objective`,`tokenBudget`,`attachmentIds`])if(Object.hasOwn(payload,key))body[key]=payload[key];return requestConversation(conversationId,`/goal`,{method:`POST`,signal,body})},configureConversation(conversationId,configuration,{signal}={}){return requestConversation(conversationId,`/configuration`,{method:`PATCH`,signal,body:{configuration}})},selectConversation(conversationId,selection,{signal}={}){return requestConversation(conversationId,`/selection`,{method:`POST`,signal,body:{selection}})},replaceConversation(conversationId,replacement,{signal}={}){return requestConversation(conversationId,`/replacement`,{method:`POST`,signal,body:{replacement}})},async streamChat(payload,{signal,onEvent,onMalformedLine,rejectOnErrorEvent=true}={}){if(typeof requestStream!==`function`)throw new TypeError(`streamChat requires requestStream().`);const basePath=resolveRequiredBasePath(resolveBasePath);let streamEventError=null;const requestHeaders=resolveAssistantRequestHeaders(resolveSurfaceId);const streamHandlers={onEvent(event){const eventType=normalizeAssistantStreamEventType(event?.type,``);if(rejectOnErrorEvent&&eventType===ASSISTANT_STREAM_EVENT_TYPES.ERROR&&!streamEventError)streamEventError=buildStreamEventError(event);if(typeof onEvent===`function`)onEvent(event)}};if(typeof onMalformedLine===`function`)streamHandlers.onMalformedLine=(line,parseError)=>{onMalformedLine(line,parseError)};await requestStream(`${basePath}/chat/stream`,{method:`POST`,...requestHeaders?{headers:requestHeaders}:{},body:payload,signal},streamHandlers);if(streamEventError)throw streamEventError},listConversations(query={}){const basePath=resolveRequiredBasePath(resolveBasePath);const params=createAssistantQueryParams(query,ASSISTANT_CONVERSATIONS_TRANSPORT);const requestHeaders=resolveAssistantRequestHeaders(resolveSurfaceId);return request(appendQueryString(`${basePath}/conversations`,params.toString()),{...requestHeaders?{headers:requestHeaders}:{},transport:ASSISTANT_CONVERSATIONS_TRANSPORT})},getConversationMessages(conversationId,query={}){const basePath=resolveRequiredBasePath(resolveBasePath);const encodedConversationId=encodeURIComponent(String(conversationId||``).trim());const params=createAssistantQueryParams(query,ASSISTANT_CONVERSATION_MESSAGES_TRANSPORT);const requestHeaders=resolveAssistantRequestHeaders(resolveSurfaceId);return request(appendQueryString(`${basePath}/conversations/${encodedConversationId}/messages`,params.toString()),{...requestHeaders?{headers:requestHeaders}:{},transport:ASSISTANT_CONVERSATION_MESSAGES_TRANSPORT})},getSettings(){const basePath=resolveRequiredBasePath(resolveBasePath);const requestHeaders=resolveAssistantRequestHeaders(resolveSurfaceId);return request(`${basePath}/settings`,{...requestHeaders?{headers:requestHeaders}:{},transport:ASSISTANT_SETTINGS_TRANSPORT})},updateSettings(payload={}){const basePath=resolveRequiredBasePath(resolveBasePath);const requestHeaders=resolveAssistantRequestHeaders(resolveSurfaceId);return request(`${basePath}/settings`,{method:`PATCH`,...requestHeaders?{headers:requestHeaders}:{},body:payload,transport:ASSISTANT_SETTINGS_UPDATE_TRANSPORT})}})}var client_exports$9=__exportAll({AssistantSettingsFormCard:()=>_sfc_main$49,assistantHttpClient:()=>assistantHttpClient,buildStreamEventError:()=>buildStreamEventError,createAssistantApi:()=>createAssistantApi});var{t:t$20}=useJskitText();function defaultSelectItems(page){return Array.isArray(page?.items)?page.items:[]}function defaultGetNextPageParam(lastPage){return lastPage?.nextCursor??null}function normalizeQueryKeyValue(queryKey=null){const resolved=unref(queryKey);if(Array.isArray(resolved))return resolved;if(resolved===null||resolved===void 0||resolved===``)return[];return[resolved]}function trimInfinitePagesToFirst(data=null){if(!data||typeof data!==`object`||Array.isArray(data))return data;const sourcePages=Array.isArray(data.pages)?data.pages:[];const sourcePageParams=Array.isArray(data.pageParams)?data.pageParams:[];if(sourcePages.length<2&&sourcePageParams.length<2)return data;const pages=sourcePages.slice(0,1);const pageParams=sourcePageParams.length>0?sourcePageParams.slice(0,1):pages.length>0?[null]:[];return{...data,pages,pageParams}}function usePagedCollection({queryKey,enabled=true,initialPageParam=null,queryFn,getNextPageParam=defaultGetNextPageParam,selectItems=defaultSelectItems,dedupeBy=null,queryOptions=null,fallbackLoadError=t$20(`jskit.http.list.loadFailed`)}={}){if(typeof queryFn!==`function`)throw new TypeError(`usePagedCollection requires queryFn().`);if(typeof getNextPageParam!==`function`)throw new TypeError(`usePagedCollection requires getNextPageParam().`);if(typeof selectItems!==`function`)throw new TypeError(`usePagedCollection requires selectItems().`);if(dedupeBy!=null&&typeof dedupeBy!==`function`)throw new TypeError(`usePagedCollection dedupeBy must be a function when provided.`);const queryClient=useQueryClient();const queryEnabled=computed(()=>resolveEnabledRef(enabled));const normalizedQueryKey=computed(()=>normalizeQueryKeyValue(queryKey));const query=useInfiniteQuery({queryKey,initialPageParam,enabled:queryEnabled,queryFn,getNextPageParam:(lastPage,allPages,lastPageParam,allPageParams)=>getNextPageParam(lastPage,allPages,lastPageParam,allPageParams),...mergeQueryMeta(asPlainObject(queryOptions),{jskit:{refreshOnPull:true}})});const pages=computed(()=>{const pageList=query.data.value?.pages;return Array.isArray(pageList)?pageList:[]});const items=computed(()=>{const result=[];const seen=dedupeBy?new Set:null;for(const page of pages.value){const pageItems=selectItems(page);if(!Array.isArray(pageItems))continue;if(!seen){result.push(...pageItems);continue}for(const item of pageItems){const key=dedupeBy(item);const normalizedKey=String(key??``).trim();if(!normalizedKey){result.push(item);continue}if(seen.has(normalizedKey))continue;seen.add(normalizedKey);result.push(item)}}return result});const isInitialLoading=computed(()=>Boolean(query.isPending.value));const isFetching=computed(()=>Boolean(query.isFetching.value));const isRefetching=computed(()=>Boolean(isFetching.value&&!isInitialLoading.value));const isLoading=computed(()=>Boolean(isInitialLoading.value||isFetching.value));const isLoadingMore=computed(()=>Boolean(query.isFetchingNextPage.value));const hasMore=computed(()=>Boolean(query.hasNextPage.value));const loadError=computed(()=>toQueryErrorMessage(query.error.value,fallbackLoadError,t$20(`jskit.http.list.loadFailed`)));async function reload(){return query.refetch()}async function loadMore(){if(!hasMore.value||isLoadingMore.value)return null;return query.fetchNextPage()}function trimToFirstPage(){const key=normalizedQueryKey.value;if(key.length<1)return;queryClient.setQueryData(key,data=>trimInfinitePagesToFirst(data))}return Object.freeze({query,pages,items,isInitialLoading,isFetching,isRefetching,isLoading,isLoadingMore,hasMore,loadError,reload,loadMore,trimToFirstPage})}var CONSOLE_OWNER_ACCESS_POLICY_ID=`console_owner`;function resolveSurfaceDefinitions(appConfig={}){const source=normalizeObject$1(appConfig?.surfaceDefinitions);const resolved={};for(const[rawSurfaceId,rawDefinition]of Object.entries(source)){const surfaceId=normalizeSurfaceId$1(rawSurfaceId);const definition=normalizeObject$1(rawDefinition);if(!surfaceId||definition.enabled===false)continue;resolved[surfaceId]=Object.freeze({id:surfaceId,requiresWorkspace:definition.requiresWorkspace===true,accessPolicyId:normalizeText$1(definition.accessPolicyId).toLowerCase()})}return Object.freeze(resolved)}function resolveAssistantSurfacesConfig(appConfig={}){const source=normalizeObject$1(appConfig?.assistantSurfaces);const resolved={};for(const[rawSurfaceId,rawEntry]of Object.entries(source)){const targetSurfaceId=normalizeSurfaceId$1(rawSurfaceId);const entry=normalizeObject$1(rawEntry);if(!targetSurfaceId)continue;resolved[targetSurfaceId]=Object.freeze({settingsSurfaceId:normalizeSurfaceId$1(entry.settingsSurfaceId),configScope:normalizeAssistantConfigScope(entry.configScope)})}return Object.freeze(resolved)}function normalizeAssistantConfigScope(value=``){if(normalizeText$1(value).toLowerCase()===`workspace`)return`workspace`;return`global`}function resolveAssistantSurfaceConfig(appConfig={},targetSurfaceId=``){const normalizedTargetSurfaceId=normalizeSurfaceId$1(targetSurfaceId);if(!normalizedTargetSurfaceId)return null;const surfaceConfig=resolveAssistantSurfacesConfig(appConfig)[normalizedTargetSurfaceId];if(!surfaceConfig)return null;const surfaceDefinitions=resolveSurfaceDefinitions(appConfig);const runtimeSurface=surfaceDefinitions[normalizedTargetSurfaceId];const settingsSurface=surfaceDefinitions[surfaceConfig.settingsSurfaceId];if(!runtimeSurface||!settingsSurface)return null;if(surfaceConfig.configScope===`workspace`&&(runtimeSurface.requiresWorkspace!==true||settingsSurface.requiresWorkspace!==true))return null;return Object.freeze({targetSurfaceId:normalizedTargetSurfaceId,settingsSurfaceId:settingsSurface.id,configScope:surfaceConfig.configScope,runtimeSurfaceRequiresWorkspace:runtimeSurface.requiresWorkspace===true,settingsSurfaceRequiresWorkspace:settingsSurface.requiresWorkspace===true,settingsSurfaceRequiresConsoleOwner:settingsSurface.accessPolicyId===CONSOLE_OWNER_ACCESS_POLICY_ID})}function resolveAssistantRuntimeRoute(surface,workspaceSlug=``){const requiresWorkspace=surface?.runtimeSurfaceRequiresWorkspace===true;const workspace=requiresWorkspace?normalizeText$1(workspaceSlug):``;return Object.freeze({workspaceSlug:workspace,configured:Boolean(surface)&&(!requiresWorkspace||Boolean(workspace)),endpoint:buildAssistantApiPath({requiresWorkspace,workspaceSlug:workspace,suffix:`/${normalizeText$1(surface?.targetSurfaceId)}`})})}var jskit$9={"assistant":{"runtime":{"authenticationRequired":`Authentication required.`,"workspace":{"selectionRequired":`Workspace selection required.`},"route":{"surfaceHeaderRequired":`Assistant surface header x-jskit-surface is required.`,"notFound":`Assistant route not found.`,"surfaceForbidden":`Assistant route is not available on this surface.`,"assistantNotFound":`Assistant not found.`},"connection":{"unavailable":`This AI connection is not available in this assistant.`,"selectionNotAllowed":`This assistant does not allow selecting an AI connection.`,"applicationAi":`Application AI`,"applicationDefault":`Application default`},"provider":{"notConfigured":`Assistant provider is not configured.`},"conversation":{"notFound":`Conversation not found.`,"idInvalid":`conversationId must be a valid record id.`,"createFailed":`Assistant failed to create conversation.`,"assistantLabel":`Assistant`,"welcomeMessage":`What would you like to do?`,"placeholder":`Message the assistant…`,"startedAtUnknown":`unknown`,"status":{"active":`active`,"completed":`completed`,"failed":`failed`,"aborted":`aborted`,"unknown":`unknown`}},"request":{"messageIdInvalid":`messageId is required and must be at most 128 characters.`,"inputRequired":`input is required.`,"messageIdConflict":`This message ID belongs to a different request.`,"unconfirmed":`This message was already submitted. Its completion is not confirmed; check conversation history before sending new work.`,"failed":`Assistant request failed.`,"cancelled":`Assistant request was cancelled.`,"noOutput":`Assistant returned no output.`,"notConfirmed":`Assistant did not confirm this message.`},"attachments":{"invalidIds":`Invalid attachment identifiers.`,"notConfigured":`File attachments are not configured for this assistant.`,"noLongerAccepted":`This conversation no longer accepts attachments.`,"clearFailed":`Accepted attachments could not be cleared from the composer.`},"subscription":{"idRequired":`A conversation subscription id is required.`,"failed":`Conversation subscription failed.`},"history":{"refreshFailed":`Older conversation history could not be refreshed. Reload chat to try again.`,"loadFailed":`Older conversation history could not be loaded.`,"listFailed":`Unable to load conversation history.`,"conversationLoadFailed":`Unable to load conversation.`},"accessDenied":`Access denied.`,"delivery":{"waitingForStep":`Waiting for the assistant to finish this step`,"unconfirmedBeforeClose":`Delivery was not confirmed before this page closed. Check the conversation before retrying.`,"stillUnknown":`Delivery is still unknown. Retry to check again.`,"checkFailed":`Delivery could not be checked.`,"notConfirmed":`Message delivery is not confirmed.`},"goal":{"budgetsUnsupported":`This conversation does not support goal token budgets.`,"changeFailed":`Could not change the goal.`,"unavailable":`Goal status is unavailable.`,"resumeMessage":`Resume the goal.`,"cancelMessage":`Cancel the goal.`},"composer":{"questionsPlaceholder":`Optional additional context…`,"choicesPlaceholder":`Choose an answer above, or type another answer…`,"questionsHint":`Answer the assistant, then send one combined reply.`},"tool":{"progress":`{name} — {status}`,"status":{"pending":`pending`,"done":`done`,"failed":`failed`,"interrupted":`interrupted`}},"surface":{"newConversation":`New conversation`,"conversations":`Conversations`,"activity":`Activity`,"toolActivity":`Tool activity`,"conversation":`Conversation`,"responseCanceled":`Response canceled. A tool already running may still finish.`,"startNewConversation":`Start new conversation`,"refresh":`Refresh`,"close":`Close`,"loadingConversationsLabel":`Loading conversations`,"loadingConversations":`Loading conversations…`,"savedConversations":`Saved conversations`,"noSavedConversations":`No saved conversations`,"untitledConversation":`Untitled conversation`,"loadOlderConversations":`Load older conversations`,"messageCount":`{count} messages`},"viewer":{"you":`You`},"settings":{"title":`Assistant settings`,"noPermission":`You do not have permission to view assistant settings.`,"save":`Save assistant settings`,"systemPrompt":`System prompt`,"subtitle":`Configure assistant settings.`,"subtitleWorkspace":`Configure the prompt used on the {surface} surface for this workspace.`,"subtitleSurface":`Configure the prompt used on the {surface} surface.`,"notConfigured":`Assistant settings are not configured for this surface.`,"workspaceUnavailable":`Workspace support is not available for this assistant surface.`,"selectWorkspace":`Select a workspace to configure assistant settings.`,"updateFailed":`Unable to update assistant settings.`}}},"errors":{"assistant_history_inspection_required":`This conversation has ambiguous historical SQL rows. Inspect the reported rows offline before using the common runtime; no history was changed.`,"assistant_subscription_transport_failed":`Chat updates could not reconnect. Retrying automatically; Reload chat to try now.`,"assistant_subscription_waiting":`Chat is still loading. Waiting for the server; Reload chat to try now.`}};var en_default$9={jskit:jskit$9};registerJskitMessages(en_default$12);registerJskitMessages(en_default$9);var CONVERSATION_MESSAGE_STATUS=Object.freeze({streaming:`inProgress`,done:`completed`,error:`failed`,canceled:`interrupted`});var TOOL_STATUS_KEY=`jskit.assistant.runtime.tool.status.`;function toolStatusText(status){const{hasMessage,t}=useJskitText();const key=`${TOOL_STATUS_KEY}${status}`;return hasMessage(key)?t(key):String(status??``)}function mapAssistantConversationTurns(messages,toolEvents=[],{showToolActivity=true}={}){const{t}=useJskitText();return conversationTurnsFromMessages(messages.map(message=>({...message,messageId:String(message.id),status:CONVERSATION_MESSAGE_STATUS[message.status],progressUpdates:showToolActivity?toolEvents.filter(event=>event.messageId===message.id).map(event=>({id:event.id,text:t(`jskit.assistant.runtime.tool.progress`,{name:event.name,status:toolStatusText(event.status)})})):[]})))}function buildId(prefix=`id`){if(typeof crypto!==`undefined`&&typeof crypto.randomUUID===`function`)return`${prefix}_${crypto.randomUUID()}`;return`${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}function normalizeToolName(value){return normalizeText$1(value)||`tool`}function buildHistory(messages){return(Array.isArray(messages)?messages:[]).filter(message=>{if(!message||typeof message!==`object`)return false;if(message.kind!==`chat`)return false;if(message.role!==`user`&&message.role!==`assistant`)return false;if(normalizeText$1(message.status).toLowerCase()!==`done`)return false;const text=normalizeText$1(message.text);if(!text)return false;return message.role!==`assistant`||!isAssistantProgressOnlyText(text)}).map(message=>({role:message.role,content:String(message.text||``).slice(0,MAX_INPUT_CHARS),...message.role===`user`&&message.attachments?.length?{attachmentIds:message.attachments.map(file=>file.attachmentId)}:{}})).slice(-20)}function interruptPendingToolEvents(toolEvents){return(Array.isArray(toolEvents)?toolEvents:[]).map(toolEvent=>{if(normalizeText$1(toolEvent?.status).toLowerCase()!==`pending`)return toolEvent;return{...toolEvent,status:`interrupted`}})}function mapTranscriptEntriesToAssistantState(entries){const sourceEntries=Array.isArray(entries)?entries:[];const messages=[];const toolEventsById=new Map;let latestUserId=null;let currentAssistantId=null;const pendingAssociation=[];function ensureToolEvent(toolCallId,toolName){const key=normalizeText$1(toolCallId)||buildId(`tool_call`);if(toolEventsById.has(key))return toolEventsById.get(key);const next={id:key,name:normalizeToolName(toolName),arguments:``,status:`pending`,result:null,error:null};toolEventsById.set(key,next);return next}for(const entry of sourceEntries){const role=normalizeText$1(entry?.role).toLowerCase();const kind=normalizeText$1(entry?.kind).toLowerCase();const metadata=normalizeObject$1(entry?.metadata);const transcriptId=normalizeRecordId(entry?.id,{fallback:null});const messageId=transcriptId?`transcript_${transcriptId}`:buildId(`transcript`);if(kind===`chat`&&(role===`user`||role===`assistant`)){const text=entry?.contentText==null?``:String(entry.contentText);if(role===`assistant`&&isAssistantProgressOnlyText(text))continue;messages.push({id:messageId,role,kind:`chat`,text,...Array.isArray(metadata.attachments)?{attachments:metadata.attachments}:{},status:`done`});if(role===`user`){latestUserId=messageId;currentAssistantId=null;pendingAssociation.length=0}else{currentAssistantId=messageId;for(const event of pendingAssociation)event.messageId=messageId;pendingAssociation.length=0}continue}if(kind===`tool_call`){const toolEvent=ensureToolEvent(normalizeText$1(metadata.toolCallId)||`tool_call_${messageId}`,metadata.tool);toolEvent.arguments=String(entry?.contentText||``);toolEvent.status=`pending`;toolEvent.messageId=currentAssistantId||latestUserId;pendingAssociation.push(toolEvent);continue}if(kind===`tool_result`){const parsedResult=parseJsonObject(entry?.contentText);const toolEvent=ensureToolEvent(normalizeText$1(metadata.toolCallId||parsedResult.toolCallId)||`tool_result_${messageId}`,metadata.tool||parsedResult.tool);const failed=parsedResult.ok===false||metadata.ok===false;toolEvent.status=failed?`failed`:`done`;toolEvent.result=failed?null:parsedResult.result;toolEvent.error=failed?parsedResult.error||metadata.error||null:null}}return{messages,pendingToolEvents:interruptPendingToolEvents([...toolEventsById.values()])}}var DEFAULT_RESTORE_MESSAGES_PAGE_SIZE=200;var DEFAULT_RESTORE_MESSAGES_MAX_ENTRIES=2e3;var MAX_RESTORE_MESSAGES_MAX_ENTRIES=5e3;function normalizeBoundedPositiveInteger(value,fallback,maximum){const parsed=Number(value);if(!Number.isInteger(parsed)||parsed<1)return fallback;return Math.min(parsed,maximum)}function normalizeTotalPages(value){const parsed=Number(value);return Number.isInteger(parsed)&&parsed>0?parsed:1}function resolveConversationRestorePolicy({pageSize,maxEntries}={}){return Object.freeze({pageSize:normalizeBoundedPositiveInteger(pageSize,DEFAULT_RESTORE_MESSAGES_PAGE_SIZE,500),maxEntries:normalizeBoundedPositiveInteger(maxEntries,DEFAULT_RESTORE_MESSAGES_MAX_ENTRIES,MAX_RESTORE_MESSAGES_MAX_ENTRIES)})}async function loadConversationTranscript({fetchPage,pageSize=DEFAULT_RESTORE_MESSAGES_PAGE_SIZE,maxEntries=DEFAULT_RESTORE_MESSAGES_MAX_ENTRIES}={}){if(typeof fetchPage!==`function`)throw new TypeError(`loadConversationTranscript requires fetchPage().`);const restorePolicy=resolveConversationRestorePolicy({pageSize,maxEntries});const normalizedPageSize=restorePolicy.pageSize;const normalizedMaxEntries=restorePolicy.maxEntries;const firstResponse=await fetchPage(1,normalizedPageSize);const totalPages=normalizeTotalPages(firstResponse?.totalPages);const restoredPageCount=Math.max(1,Math.ceil(normalizedMaxEntries/normalizedPageSize));const firstRestoredPage=Math.max(1,totalPages-restoredPageCount+1);const entries=firstRestoredPage===1&&Array.isArray(firstResponse?.entries)?[...firstResponse.entries]:[];for(let page=Math.max(2,firstRestoredPage);page<=totalPages;page+=1){const response=await fetchPage(page,normalizedPageSize);if(Array.isArray(response?.entries))entries.push(...response.entries)}return Object.freeze({entries:Object.freeze(entries.slice(-normalizedMaxEntries)),firstRestoredPage,pageSize:normalizedPageSize,totalPages,truncated:firstRestoredPage>1})}var WORKSPACES_WEB_SCOPE_SUPPORT_INJECTION_KEY=`jskit.workspaces.web.scope-support`;var EMPTY_ROUTE_SCOPE=Object.freeze({workspaceSlug:``});var EMPTY_WORKSPACE_WEB_SCOPE_SUPPORT=Object.freeze({available:false,readRouteScope(){return EMPTY_ROUTE_SCOPE}});function isWorkspaceWebScopeSupport(value){return Boolean(value&&typeof value.readRouteScope===`function`)}function useWorkspaceWebScopeSupport({required=false}={}){const support=inject$1(WORKSPACES_WEB_SCOPE_SUPPORT_INJECTION_KEY,null);if(isWorkspaceWebScopeSupport(support))return support;if(required)throw new Error(`Workspace web scope support is not available in Vue injection context.`);return EMPTY_WORKSPACE_WEB_SCOPE_SUPPORT}var DEFAULT_STREAM_TIMEOUT_MS=12e4;var DEFAULT_HISTORY_PAGE_SIZE=20;var DEFAULT_HISTORY_STALE_TIME_MS=6e4;function toNonNegativeInteger(value,fallback=0){const parsed=Number(value);if(!Number.isInteger(parsed)||parsed<0)return fallback;return parsed}function buildScopeStorageKey(scope={}){return`assistant.activeConversationId:${normalizeText$1(scope?.targetSurfaceId).toLowerCase()||`assistant`}:${normalizeText$1(scope?.workspaceSlug).toLowerCase()||`global`}:${normalizeRecordId(scope?.userId,{fallback:`anonymous`})}`}function readStoredActiveConversationId(scope={}){if(typeof window===`undefined`||!window.sessionStorage)return``;try{return normalizeRecordId(window.sessionStorage.getItem(buildScopeStorageKey(scope)),{fallback:``})}catch{return``}}function writeStoredActiveConversationId(scope={},conversationId){if(typeof window===`undefined`||!window.sessionStorage)return;const normalizedConversationId=normalizeRecordId(conversationId,{fallback:null});const storageKey=buildScopeStorageKey(scope);try{if(normalizedConversationId){window.sessionStorage.setItem(storageKey,normalizedConversationId);return}window.sessionStorage.removeItem(storageKey)}catch{return}}function normalizeConversationStatus(value){return normalizeConversationStatus$1(value,{fallback:`unknown`})}function formatConversationStartedAt(value){const{formatDateTime,t}=useJskitText();const source=normalizeText$1(value);return source&&formatDateTime(source)||t(`jskit.assistant.runtime.conversation.startedAtUnknown`)}function failureText(failure){return failure?.message?normalizeText$1(useJskitText().serverMessage(failure)):``}function resolveRuntimePolicy(){const appConfig=getClientAppConfig();const assistantConfig=normalizeObject$1(appConfig?.assistant);const conversationRestorePolicy=resolveConversationRestorePolicy({pageSize:assistantConfig.restoreMessagesPageSize,maxEntries:assistantConfig.restoreMessagesMaxEntries});return Object.freeze({timeoutMs:toPositiveInteger(assistantConfig.timeoutMs,DEFAULT_STREAM_TIMEOUT_MS),historyPageSize:toPositiveInteger(assistantConfig.historyPageSize,DEFAULT_HISTORY_PAGE_SIZE),restoreMessagesPageSize:conversationRestorePolicy.pageSize,restoreMessagesMaxEntries:conversationRestorePolicy.maxEntries,historyStaleTimeMs:toNonNegativeInteger(assistantConfig.historyStaleTimeMs,DEFAULT_HISTORY_STALE_TIME_MS)})}function createRuntimeApi({overrideApi=null,resolveBasePath,resolveSurfaceId=null}={}){if(overrideApi&&typeof overrideApi.streamChat===`function`)return overrideApi;return createAssistantApi({request:assistantHttpClient.request,requestStream:assistantHttpClient.requestStream,resolveBasePath,resolveSurfaceId})}function useAssistantRuntime({api=null,surfaceId=``,integrationId=``}={}){const runtimePolicy=resolveRuntimePolicy();const queryClient=useQueryClient();const errorRuntime=useShellWebErrorRuntime();const routeContext=useSurfaceRouteContext();const workspaceScopeSupport=useWorkspaceWebScopeSupport();const{placementContext,currentSurfaceId}=routeContext;const appConfig=getClientAppConfig();const{t}=useJskitText();const messages=ref([]);const input=ref(``);const isStreaming=ref(false);const isRestoringConversation=ref(false);const error=ref(``);const pendingToolEvents=ref([]);const conversationId=ref(null);const abortController=shallowRef(null);const isCanceling=ref(false);const delivery=createAssistantMessageDelivery();let restoreVersion=0;const placementSnapshot=computed(()=>normalizeObject$1(placementContext.value));const assistantSurface=computed(()=>resolveAssistantSurfaceConfig(appConfig,toValue(surfaceId)));const routeScope=computed(()=>workspaceScopeSupport.readRouteScope(routeContext));const runtimeRoute=computed(()=>resolveAssistantRuntimeRoute(assistantSurface.value,normalizeText$1(routeScope.value.workspaceSlug).toLowerCase()));const runtimeScope=computed(()=>({targetSurfaceId:normalizeText$1(assistantSurface.value?.targetSurfaceId).toLowerCase(),userId:normalizeRecordId(placementSnapshot.value?.user?.id,{fallback:null}),workspaceSlug:runtimeRoute.value.workspaceSlug}));const hasRuntimeScope=computed(()=>runtimeRoute.value.configured&&Boolean(runtimeScope.value.userId));const runtimeApi=createRuntimeApi({overrideApi:api,resolveBasePath:()=>runtimeRoute.value.endpoint,resolveSurfaceId:()=>normalizeText$1(currentSurfaceId.value).toLowerCase()});const activeConversationId=computed(()=>normalizeRecordId(conversationId.value,{fallback:``}));const canSend=computed(()=>{return Boolean(hasRuntimeScope.value&&!isStreaming.value&&!isRestoringConversation.value&&normalizeText$1(input.value))});const canStartNewConversation=computed(()=>Boolean(hasRuntimeScope.value&&!isStreaming.value&&!isRestoringConversation.value));const scopeKey=computed(()=>JSON.stringify(runtimeScope.value));function setRuntimeError(message,dedupeKey=``){const normalizedMessage=normalizeText$1(message);error.value=normalizedMessage;if(!normalizedMessage)return;errorRuntime.report({source:`assistant.runtime`,message:normalizedMessage,severity:`error`,channel:`banner`,dedupeKey:dedupeKey||`assistant.runtime:error:${normalizedMessage}`,dedupeWindowMs:3e3})}const conversationHistoryCollection=usePagedCollection({queryKey:computed(()=>[...assistantConversationsListQueryKey(runtimeScope.value,{limit:runtimePolicy.historyPageSize}),runtimeScope.value.userId]),queryFn:({pageParam=null})=>runtimeApi.listConversations({cursor:pageParam,limit:runtimePolicy.historyPageSize}),initialPageParam:null,dedupeBy(entry){return normalizeRecordId(entry?.id,{fallback:normalizeText$1(entry?.id)})},enabled:computed(()=>hasRuntimeScope.value),queryOptions:{staleTime:runtimePolicy.historyStaleTimeMs,refetchOnMount:false,refetchOnWindowFocus:false},fallbackLoadError:t(`jskit.assistant.runtime.history.listFailed`)});const conversationHistory=conversationHistoryCollection.items;const conversationHistoryLoading=computed(()=>Boolean(conversationHistoryCollection.isLoading.value&&!conversationHistoryCollection.isLoadingMore.value));const conversationHistoryLoadingMore=conversationHistoryCollection.isLoadingMore;const conversationHistoryHasMore=conversationHistoryCollection.hasMore;const conversationHistoryError=conversationHistoryCollection.loadError;watch([hasRuntimeScope,conversationHistoryLoading,runtimeScope,conversationId,conversationHistory,isRestoringConversation],async([nextHasRuntimeScope,nextConversationHistoryLoading,nextRuntimeScope,nextConversationId,nextConversationHistory,nextIsRestoringConversation])=>{if(!nextHasRuntimeScope||nextConversationHistoryLoading||nextIsRestoringConversation||isStreaming.value)return;if(normalizeRecordId(nextConversationId,{fallback:null}))return;const sourceEntries=Array.isArray(nextConversationHistory)?nextConversationHistory:[];if(sourceEntries.length<1)return;const storedConversationId=readStoredActiveConversationId(nextRuntimeScope);if(!storedConversationId)return;if(!sourceEntries.some(entry=>normalizeRecordId(entry?.id,{fallback:null})===storedConversationId)){writeStoredActiveConversationId(nextRuntimeScope,``);return}await selectConversationById(storedConversationId,{preserveDraft:true})},{immediate:true});function appendMessage(payload){messages.value=[...messages.value,payload]}function updateMessage(messageId,updater){messages.value=messages.value.map(message=>{if(message.id!==messageId)return message;const patch=typeof updater===`function`?updater(message):updater;return{...message,...patch&&typeof patch===`object`?patch:{}}})}function findMessage(messageId){return messages.value.find(entry=>entry.id===messageId)||null}async function invalidateConversations(){if(!hasRuntimeScope.value)return;await queryClient.invalidateQueries({queryKey:[...assistantScopeQueryKey(runtimeScope.value),`conversations`]})}async function refreshConversationHistory(){if(!hasRuntimeScope.value)return;await conversationHistoryCollection.reload()}async function loadMoreConversationHistory(){await conversationHistoryCollection.loadMore()}async function selectConversationById(nextConversationId,{preserveDraft=false}={}){const normalizedConversationId=normalizeRecordId(nextConversationId,{fallback:``});if(!normalizedConversationId||isStreaming.value||isRestoringConversation.value||!hasRuntimeScope.value)return;const version=++restoreVersion;const scope=runtimeScope.value;const previousDraft=input.value;if(!preserveDraft)input.value=``;isRestoringConversation.value=true;setRuntimeError(``);try{const transcript=await loadConversationTranscript({pageSize:runtimePolicy.restoreMessagesPageSize,maxEntries:runtimePolicy.restoreMessagesMaxEntries,fetchPage:(page,pageSize)=>queryClient.fetchQuery({queryKey:[...assistantConversationMessagesQueryKey(scope,normalizedConversationId,{page,pageSize}),scope.userId],queryFn:()=>{if(version!==restoreVersion)throw new DOMException(`Conversation changed.`,`AbortError`);return runtimeApi.getConversationMessages(normalizedConversationId,{page,pageSize})},staleTime:runtimePolicy.historyStaleTimeMs})});if(version!==restoreVersion)return;const restored=mapTranscriptEntriesToAssistantState(transcript.entries);conversationId.value=normalizedConversationId;writeStoredActiveConversationId(scope,normalizedConversationId);delivery.reset();messages.value=restored.messages;pendingToolEvents.value=restored.pendingToolEvents}catch(loadError){if(version!==restoreVersion)return;if(readStoredActiveConversationId(scope)===normalizedConversationId)writeStoredActiveConversationId(scope,``);if(!input.value)input.value=previousDraft;setRuntimeError(failureText(loadError)||t(`jskit.assistant.runtime.history.conversationLoadFailed`))}finally{if(version===restoreVersion)isRestoringConversation.value=false}}async function selectConversation(conversation){await selectConversationById(conversation?.id)}function clearView(){restoreVersion+=1;delivery.reset();abortController.value?.abort();abortController.value=null;messages.value=[];pendingToolEvents.value=[];input.value=``;error.value=``;conversationId.value=null;isStreaming.value=false;isCanceling.value=false;isRestoringConversation.value=false}function startNewConversation(){if(!canStartNewConversation.value)return;writeStoredActiveConversationId(runtimeScope.value,``);clearView()}watch(scopeKey,clearView,{flush:`sync`});onScopeDispose(clearView);function cancelStream(){if(!abortController.value||isCanceling.value)return;isCanceling.value=true;abortController.value.abort()}async function sendMessage({attachments=[],onAccepted,retryMessageId=``}={}){if(isStreaming.value||isRestoringConversation.value||!hasRuntimeScope.value)return false;const retry=retryMessageId?delivery.find(retryMessageId):null;if(retryMessageId&&retry?.status!==`failed`)return false;const message=normalizeText$1(input.value).slice(0,8e3)||(attachments.length?`Please review the attached files.`:``);const parsedConversationId=normalizeRecordId(conversationId.value,{fallback:null});const payload=retry?.payload||{message,displayAttachments:attachments,request:{input:message,...parsedConversationId?{conversationId:parsedConversationId}:{},...attachments.length?{attachmentIds:attachments.map(file=>file.attachmentId)}:{},...toValue(integrationId)?{integrationId:toValue(integrationId)}:{},history:buildHistory(messages.value)}};if(!payload.message)return false;if(!retry)input.value=``;try{return await delivery.send(payload,{messageId:retryMessageId||buildId(`message`),deliver(submission){const admission=Promise.withResolvers();runStream(submission,{onAccepted,admission}).then(()=>admission.reject(new Error(t(`jskit.assistant.runtime.request.notConfirmed`))),admission.reject);return admission.promise}})}catch{return false}}async function runStream({messageId,message:normalizedInput,displayAttachments:attachments,request},{onAccepted,admission}){const assistantMessageId=buildId(`assistant`);let accepted=false;let admissionError=``;setRuntimeError(``);isStreaming.value=true;const streamAbortController=new AbortController;abortController.value=streamAbortController;const streamTimeout=setTimeout(()=>{streamAbortController.abort()},runtimePolicy.timeoutMs);let streamDoneStatus=``;const ownsStream=()=>abortController.value===streamAbortController;try{await runtimeApi.streamChat({...request,messageId},{signal:streamAbortController.signal,onEvent(event){if(!ownsStream()||streamAbortController.signal.aborted)return;const eventType=normalizeAssistantStreamEventType(event?.type,``);if(eventType===ASSISTANT_STREAM_EVENT_TYPES.META&&Object.hasOwn(event||{},`conversationId`)){if(!accepted){accepted=true;appendMessage({id:messageId,role:`user`,kind:`chat`,text:normalizedInput,attachments,status:`done`});appendMessage({id:assistantMessageId,role:`assistant`,kind:`chat`,text:``,status:`streaming`});delivery.reconcile([{user:{messageId}}]);onAccepted?.();admission.resolve(true)}conversationId.value=normalizeRecordId(event?.conversationId,{fallback:null});writeStoredActiveConversationId(runtimeScope.value,conversationId.value);return}if(eventType===ASSISTANT_STREAM_EVENT_TYPES.ASSISTANT_DELTA){const delta=String(event?.delta||``);if(!delta)return;updateMessage(assistantMessageId,message=>({text:`${String(message?.text||``)}${delta}`,status:`streaming`}));return}if(eventType===ASSISTANT_STREAM_EVENT_TYPES.ASSISTANT_MESSAGE){const text=String(event?.text||``);updateMessage(assistantMessageId,{text,status:event.status===`streaming`?`streaming`:`done`});return}if(eventType===ASSISTANT_STREAM_EVENT_TYPES.TOOL_CALL){const toolCallId=normalizeText$1(event?.toolCallId)||buildId(`tool_call`);pendingToolEvents.value=[...pendingToolEvents.value,{id:toolCallId,messageId:assistantMessageId,name:normalizeToolName(event?.name),arguments:String(event?.arguments||``),status:`pending`,result:null,error:null}];return}if(eventType===ASSISTANT_STREAM_EVENT_TYPES.TOOL_RESULT){const toolCallId=normalizeText$1(event?.toolCallId);if(toolCallId)pendingToolEvents.value=pendingToolEvents.value.map(toolEvent=>{if(toolEvent.id!==toolCallId)return toolEvent;const failed=event?.ok===false;return{...toolEvent,status:failed?`failed`:`done`,result:failed?null:event?.result,error:failed?event?.error||null:null}});return}if(eventType===ASSISTANT_STREAM_EVENT_TYPES.ERROR){if(!accepted){admissionError=failureText(event)||t(`jskit.assistant.runtime.request.failed`);return}setRuntimeError(failureText(event)||t(`jskit.assistant.runtime.request.failed`),`assistant.runtime:stream-event-error`);updateMessage(assistantMessageId,{status:`error`});return}if(eventType===ASSISTANT_STREAM_EVENT_TYPES.DONE)streamDoneStatus=normalizeText$1(event?.status).toLowerCase()}});if(!ownsStream())return;if(!accepted)throw new Error(admissionError||t(`jskit.assistant.runtime.request.notConfirmed`));if(streamAbortController.signal.aborted)streamDoneStatus=`aborted`;const assistantMessage=findMessage(assistantMessageId);if(!normalizeText$1(assistantMessage?.text)&&streamDoneStatus!==`aborted`){if(!error.value)setRuntimeError(t(`jskit.assistant.runtime.request.noOutput`),`assistant.runtime:empty-output`);updateMessage(assistantMessageId,{status:`error`})}else if(streamDoneStatus===`aborted`)updateMessage(assistantMessageId,{status:`canceled`});else updateMessage(assistantMessageId,message=>({status:message.status===`streaming`?`done`:message.status}))}catch(streamError){if(!ownsStream())return;if(!accepted)throw streamError;if(String(streamError?.name||``)===`AbortError`)updateMessage(assistantMessageId,{status:`canceled`});else{setRuntimeError(failureText(streamError)||t(`jskit.assistant.runtime.request.failed`));updateMessage(assistantMessageId,{status:`error`})}}finally{clearTimeout(streamTimeout);if(ownsStream()){const answer=findMessage(assistantMessageId);if(answer?.status===`error`){updateMessage(assistantMessageId,{error:error.value});if(!answer.text&&!input.value)input.value=normalizedInput}pendingToolEvents.value=interruptPendingToolEvents(pendingToolEvents.value);abortController.value=null;isStreaming.value=false;isCanceling.value=false;if(accepted)await invalidateConversations()}}}const viewer=computed(()=>{const user=normalizeObject$1(placementSnapshot.value.user);return{displayName:normalizeText$1(user.displayName||user.name)||t(`jskit.assistant.runtime.viewer.you`),avatarUrl:normalizeText$1(user.avatarUrl)}});return Object.freeze({meta:{normalizeConversationStatus,formatConversationStartedAt},delivery,state:{messages,input,isStreaming,isCanceling,hasRuntimeScope,scopeKey,isRestoringConversation,error,pendingToolEvents,conversationId,activeConversationId,conversationHistory,conversationHistoryLoading,conversationHistoryLoadingMore,conversationHistoryHasMore,conversationHistoryError,canSend,canStartNewConversation},actions:{sendMessage,cancelStream,startNewConversation,clearConversation:startNewConversation,selectConversation,selectConversationById,refreshConversationHistory,loadMoreConversationHistory},viewer})}var assistantRuntimeConfig=Object.freeze({configTable:`assistant_config`,conversationsTable:`assistant_conversations`,messagesTable:`assistant_messages`,turnRequestsTable:`assistant_turn_requests`});var DEFAULT_CONVERSATION_TITLE=`New conversation`;var _hoisted_1$28=[`aria-label`];var _hoisted_2$23={class:`assistant-surface__toolbar`};var _hoisted_3$22={class:`assistant-surface__title`};var _hoisted_4$16={key:0,class:`assistant-surface__message-error`,role:`status`};var _hoisted_5$16={key:1,class:`assistant-surface__notice`,role:`status`};var _hoisted_6$11={key:0,class:`assistant-surface__message-error`,role:`status`};var _hoisted_7$10={key:0,role:`alert`};var CONVERSATION_STATUS_KEY=`jskit.assistant.runtime.conversation.status.`;var _sfc_main$48={__name:`AssistantSurfaceClientElement`,props:mergeModels({surfaceId:{type:String,required:true},layout:{type:String,default:`page`,validator:value=>[`page`,`compact`].includes(value)},assistantLabel:{type:String,default:void 0},welcomeMessage:{type:String,default:void 0},placeholder:{type:String,default:void 0},showToolActivity:{type:Boolean,default:true},connections:{type:Array,default:()=>[]},attachments:{type:Object,default:null},suggestions:{type:Object,default:null},goal:{type:Object,default:null},activity:{type:Object,default:void 0},configurationMode:{type:String,default:`editable`,validator:value=>[`hidden`,`readonly`,`editable`].includes(value)}},{"integrationId":{type:String,default:``},"integrationIdModifiers":{}}),emits:[`update:integrationId`],setup(__props,{expose:__expose}){const props=__props;const integrationId=useModel(__props,`integrationId`);const{t}=useJskitText();const assistantLabelText=computed(()=>props.assistantLabel??t(`jskit.assistant.runtime.conversation.assistantLabel`));const draftIntegrationId=ref(integrationId.value);watch(integrationId,value=>{draftIntegrationId.value=value});const runtime=useAssistantRuntime({surfaceId:toRef(props,`surfaceId`),integrationId});const state=reactive(runtime.state);const conversation=ref(null);const root=ref(null);const historyOpen=ref(false);onMounted(()=>{const syncPageOffset=()=>{if(props.layout===`page`)root.value.style.setProperty(`--assistant-page-top`,`${Math.max(0,root.value.getBoundingClientRect().top)}px`)};const observer=new ResizeObserver(syncPageOffset);observer.observe(root.value.parentElement);window.addEventListener(`resize`,syncPageOffset);watchPostEffect(syncPageOffset);onScopeDispose(()=>{observer.disconnect();window.removeEventListener(`resize`,syncPageOffset)})});const selectedConversation=computed(()=>state.conversationHistory.find(entry=>String(entry.id)===state.activeConversationId));const turns=computed(()=>mapAssistantConversationTurns(state.messages,state.pendingToolEvents,props));const adapter=computed(()=>({delivery:runtime.delivery,attachments:props.attachments,suggestions:props.suggestions,goal:props.goal,activity:props.activity,models:props.connections.length&&props.configurationMode!==`hidden`?{providerRows:[{id:`application`,label:t(`jskit.assistant.runtime.connection.applicationAi`)}],modelProviderId:`application`,modelRows:props.connections,modelId:draftIntegrationId.value,selectionSummary:props.connections.find(connection=>connection.id===integrationId.value)?.label||t(`jskit.assistant.runtime.connection.applicationDefault`),changesDisabled:props.configurationMode!==`editable`||state.isStreaming,canSave:props.configurationMode===`editable`&&!state.isStreaming&&draftIntegrationId.value!==integrationId.value&&props.connections.some(connection=>connection.id===draftIntegrationId.value),selectModel(value){draftIntegrationId.value=value},apply(){integrationId.value=draftIntegrationId.value}}:null,conversation:{turns:turns.value,scrollKey:`${state.scopeKey}:${state.activeConversationId||`new`}`,loading:state.isRestoringConversation,working:state.isStreaming&&!runtime.delivery.state.sending,assistantLabel:assistantLabelText.value,welcomeMessage:state.messages.length||state.isRestoringConversation?``:props.welcomeMessage??t(`jskit.assistant.runtime.conversation.welcomeMessage`)},composer:{draft:state.input,canSend:state.canSend||Boolean(props.attachments?.enabled!==false&&props.attachments?.attachments?.length&&!state.isStreaming&&!state.isRestoringConversation&&state.hasRuntimeScope),disabled:!state.hasRuntimeScope,canStop:state.isStreaming,stopPending:state.isCanceling,placeholder:props.placeholder??t(`jskit.assistant.runtime.conversation.placeholder`),rows:2,density:props.layout===`compact`?`compact`:`default`,submitOnEnter:true,submitOnModifierEnter:true},actions:{setDraft(value){state.input=value},submit:({attachments})=>submitMessage({attachments}),resend:messageId=>submitMessage({retryMessageId:messageId}),stop:runtime.actions.cancelStream}}));function submitMessage({attachments=[],retryMessageId=``}){const attachmentOwner=props.attachments;const acceptedFiles=retryMessageId?runtime.delivery.find(retryMessageId)?.payload.displayAttachments||[]:attachments;return runtime.actions.sendMessage({attachments,retryMessageId,onAccepted:()=>attachmentOwner?.clearAttachments({accepted:true,attachmentIds:acceptedFiles.map(file=>file.attachmentId)})})}function conversationTitle(entry,fallbackKey){if(entry?.title===`New conversation`)return t(`jskit.assistant.runtime.surface.newConversation`);return entry?.title||t(fallbackKey)}function conversationSubtitle(entry){return[t(CONVERSATION_STATUS_KEY+runtime.meta.normalizeConversationStatus(entry.status)),runtime.meta.formatConversationStartedAt(entry.startedAt),t(`jskit.assistant.runtime.surface.messageCount`,{count:Number(entry.messageCount||0)})].join(` · `)}async function selectConversation(entry){historyOpen.value=false;await runtime.actions.selectConversation(entry)}function startNewConversation(){runtime.actions.startNewConversation();historyOpen.value=false}__expose({focus:()=>conversation.value?.focus()});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{ref_key:`root`,ref:root,class:normalizeClass([`assistant-surface`,`assistant-surface--${__props.layout}`]),"aria-label":assistantLabelText.value},[createBaseVNode(`div`,_hoisted_2$23,[createBaseVNode(`span`,_hoisted_3$22,toDisplayString(conversationTitle(selectedConversation.value,`jskit.assistant.runtime.surface.newConversation`)),1),createVNode(VBtn,{variant:`text`,onClick:_cache[0]||(_cache[0]=$event=>historyOpen.value=true)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.runtime.surface.conversations`)),1)]),_:1}),__props.showToolActivity&&state.pendingToolEvents.length?(openBlock(),createBlock(VMenu,{key:0,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{variant:`text`}),{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.runtime.surface.activity`)),1)]),_:1},16)]),default:withCtx(()=>[createVNode(VList,{"aria-label":unref(t)(`jskit.assistant.runtime.surface.toolActivity`),"max-height":`320`,"max-width":`360`,class:`assistant-surface__activity`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(state.pendingToolEvents,event=>{return openBlock(),createBlock(VListItem,{key:event.id,title:event.name,subtitle:unref(toolStatusText)(event.status)},null,8,[`title`,`subtitle`])}),128))]),_:1},8,[`aria-label`])]),_:1})):createCommentVNode(``,true)]),createVNode(unref(AssistantConversationElement_default),{ref_key:`conversation`,ref:conversation,adapter:adapter.value,label:unref(t)(`jskit.assistant.runtime.surface.conversation`),class:`assistant-surface__conversation`},createSlots({"message-actions":withCtx(({message})=>[message.status===`failed`&&message.error?(openBlock(),createElementBlock(`p`,_hoisted_4$16,toDisplayString(message.error),1)):createCommentVNode(``,true),message.status===`interrupted`?(openBlock(),createElementBlock(`p`,_hoisted_5$16,toDisplayString(unref(t)(`jskit.assistant.runtime.surface.responseCanceled`)),1)):createCommentVNode(``,true)]),"composer-feedback":withCtx(()=>[state.error&&!state.messages.some(message=>message.error===state.error)?(openBlock(),createElementBlock(`p`,_hoisted_6$11,toDisplayString(state.error),1)):createCommentVNode(``,true)]),"composer-tools":withCtx(()=>[renderSlot(_ctx.$slots,`composer-tools`,{runtime:unref(runtime)},void 0,true)]),_:2},[_ctx.$slots.activity?{name:`activity`,fn:withCtx(scope=>[renderSlot(_ctx.$slots,`activity`,normalizeProps(guardReactiveProps(scope)),void 0,true)]),key:`0`}:void 0,_ctx.$slots.attachments?{name:`attachments`,fn:withCtx(scope=>[renderSlot(_ctx.$slots,`attachments`,normalizeProps(guardReactiveProps(scope)),void 0,true)]),key:`1`}:void 0]),1032,[`adapter`,`label`]),createVNode(VDialog,{modelValue:historyOpen.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>historyOpen.value=$event),"max-width":`640`,scrollable:``,"aria-label":unref(t)(`jskit.assistant.runtime.surface.conversations`)},{default:withCtx(()=>[createVNode(VCard,{class:`assistant-surface__history`},{default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.runtime.surface.conversations`)),1)]),_:1}),createVNode(VCardActions,{class:`assistant-surface__history-actions`},{default:withCtx(()=>[createVNode(VBtn,{color:`primary`,disabled:!state.canStartNewConversation,onClick:startNewConversation},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.runtime.surface.startNewConversation`)),1)]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:state.conversationHistoryLoading,onClick:unref(runtime).actions.refreshConversationHistory},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.runtime.surface.refresh`)),1)]),_:1},8,[`disabled`,`onClick`]),createVNode(VBtn,{onClick:_cache[1]||(_cache[1]=$event=>historyOpen.value=false)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.assistant.runtime.surface.close`)),1)]),_:1})]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[state.conversationHistoryError?(openBlock(),createElementBlock(`p`,_hoisted_7$10,toDisplayString(state.conversationHistoryError),1)):createCommentVNode(``,true),state.conversationHistoryLoading&&!state.conversationHistory.length?(openBlock(),createBlock(VSkeletonLoader,{key:1,type:`list-item-two-line@3`,"aria-label":unref(t)(`jskit.assistant.runtime.surface.loadingConversationsLabel`)},null,8,[`aria-label`])):(openBlock(),createBlock(VList,{key:2,"aria-label":unref(t)(`jskit.assistant.runtime.surface.savedConversations`)},{default:withCtx(()=>[!state.conversationHistory.length?(openBlock(),createBlock(VListItem,{key:0,title:unref(t)(`jskit.assistant.runtime.surface.noSavedConversations`)},null,8,[`title`])):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(state.conversationHistory,entry=>{return openBlock(),createBlock(VListItem,{key:entry.id,active:String(entry.id)===state.activeConversationId,title:conversationTitle(entry,`jskit.assistant.runtime.surface.untitledConversation`),subtitle:conversationSubtitle(entry),disabled:state.isStreaming||state.isRestoringConversation,onClick:$event=>selectConversation(entry)},null,8,[`active`,`title`,`subtitle`,`disabled`,`onClick`])}),128))]),_:1},8,[`aria-label`])),state.conversationHistoryHasMore?(openBlock(),createBlock(VBtn,{key:3,disabled:state.conversationHistoryLoadingMore,variant:`text`,onClick:unref(runtime).actions.loadMoreConversationHistory},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(state.conversationHistoryLoadingMore?`jskit.assistant.runtime.surface.loadingConversations`:`jskit.assistant.runtime.surface.loadOlderConversations`)),1)]),_:1},8,[`disabled`,`onClick`])):createCommentVNode(``,true)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`aria-label`])],10,_hoisted_1$28)}}};var AssistantSurfaceClientElement_default=_plugin_vue_export_helper_default(_sfc_main$48,[[`__scopeId`,`data-v-431b2460`]]);function isAccessDenied(error){return[401,403].includes(Number(error.status||error.statusCode))}var ASSISTANT_CONVERSATION_SUBSCRIBE=`assistant.conversation.subscribe`;var ASSISTANT_CONVERSATION_UNSUBSCRIBE=`assistant.conversation.unsubscribe`;var ASSISTANT_CONVERSATION_EVENT=`assistant.conversation.event`;var refreshedHistoryPages=Symbol(`assistant.refreshedHistoryPages`);function patchLoadedHistoryPages(pages=[],patch){return pages.map(page=>page.conversationLog.some(turn=>turn.turnId===patch?.turn?.turnId)?applyConversationLogPatch(page,patch,{limit:page.pagination?.limit})||page:page)}var SNAPSHOT_EVENTS=new Set([`accepted`,`settled`,`configuration`,`phase`,`error`,`replaced`,`goal`]);var SUBSCRIPTION_NOTICE_MS=1e4;var SUBSCRIPTION_LOST_MS=12e4;function subscribeAssistantConversation({socket,conversationId,targetSurfaceId,hostSurfaceId,workspaceSlug,read,onState,onEvent=()=>{},onError=()=>{}}={}){if(typeof socket?.on!==`function`||typeof socket?.off!==`function`||typeof socket?.timeout!==`function`)throw new TypeError(`Conversation subscriptions require the application's shared realtime socket.`);if(typeof read!==`function`||typeof onState!==`function`||typeof onEvent!==`function`)throw new TypeError(`Conversation subscriptions require a canonical read operation and state listener.`);const subscriptionId=crypto.randomUUID();const input={subscriptionId,conversationId,targetSurfaceId,hostSurfaceId,...workspaceSlug===void 0?{}:{workspaceSlug}};let disposed=false;let generation=0;let epoch=null;let revision=0;let pending=[];let listening=false;let state=null;let streaming=null;let reloadInFlight=null;let reloadQueued=false;let retryTimer=null;let retryDelay=1e3;let waitingTimer=null;const completed=new Map;const settledTurns=new Set;const pendingReads=new Set;function savedMessageIds(){return new Set((state?.conversationLog||[]).flatMap(conversationTurnMessages).map(message=>message.messageId))}function receiveStreaming(snapshot){if(!Number.isSafeInteger(snapshot?.revision)||streaming&&snapshot.revision<=streaming.revision)return false;streaming=snapshot;return true}function publishState({initial=false,canonical=false}={}){if(!state)return;const saved=savedMessageIds();for(const id of completed.keys())if(saved.has(id))completed.delete(id);const messages=new Map([...completed].map(([id,entry])=>[id,entry.message]));for(const message of streaming?.messages||[])messages.set(message.messageId,message);onState({...state,streaming,turns:mergeConversationStream(state.conversationLog,{messages:[...messages.values()]})},{initial,canonical})}function receiveState(snapshot,options){state=snapshot;receiveStreaming(snapshot.streaming);publishState({canonical:true,...options})}function reload({resubscribe=false}={}){if(resubscribe)return subscribe({preserveHistory:true});if(!listening)return subscribe();if(reloadInFlight){reloadQueued=true;return reloadInFlight}const attempt=generation;const settled=new Set(settledTurns);settledTurns.clear();const current=()=>!disposed&&listening&&attempt===generation;const pendingRead={generation:attempt,patches:[]};const job=Promise.resolve().then(()=>{if(!current())return null;pendingReads.add(pendingRead);return read({current})}).then(snapshot=>{if(!current())return;for(const patch of pendingRead.patches){snapshot=applyConversationLogPatch(snapshot,patch,{limit:snapshot.pagination?.limit});if(snapshot[refreshedHistoryPages])snapshot[refreshedHistoryPages]=patchLoadedHistoryPages(snapshot[refreshedHistoryPages],patch)}for(const[id,entry]of completed)if(settled.has(entry.turnId))completed.delete(id);receiveState(snapshot)}).catch(error=>{if(current()){if(isAccessDenied(error)){if(epoch===null){disconnected();if(socket.connected)socket.emit(ASSISTANT_CONVERSATION_UNSUBSCRIBE,{subscriptionId})}else{generation+=1;reloadInFlight=null;reloadQueued=false}state=null;streaming=null;completed.clear();settledTurns.clear()}onError(error)}}).finally(()=>{pendingReads.delete(pendingRead);if(reloadInFlight!==job)return;reloadInFlight=null;if(reloadQueued&¤t()){reloadQueued=false;reload()}});reloadInFlight=job;return job}function deliver(payload){if(payload.streamEpoch!==epoch||!Number.isSafeInteger(payload.streamRevision)||payload.streamRevision<=revision)return;revision=payload.streamRevision;const event=payload.event;if(!state){if(SNAPSHOT_EVENTS.has(event.type))reload();return}let changedPresentation=Object.hasOwn(event,`interimReply`);if(changedPresentation&&state)state={...state,interimReply:event.interimReply};if(event.type===`transcript`){const next=applyConversationLogPatch(state,event.patch,{limit:state?.pagination?.limit});if(next){state=next;for(const read of pendingReads)if(read.generation===generation)read.patches.push(event.patch);receiveStreaming(event.streaming);changedPresentation=true}}else if(event.type===`message`||event.type===`message-complete`){const persisted=event.type===`message`&&event.status===`complete`&&event.persisted===true;if(persisted)changedPresentation=completed.delete(event.messageId)||changedPresentation;const older=streaming&&event.streaming?.revision<streaming.revision;const completedWhileRunning=event.type===`message`&&event.status===`complete`&&state?.conversationLog.some(turn=>turn.turnId===event.turnId&&turn.metadata?.runtime?.status===`running`);if(!older||completedWhileRunning){const previous=streaming?.messages?.find(message=>message.messageId===event.messageId);const changed=receiveStreaming(event.streaming);if(event.type===`message`&&event.status===`complete`&&event.text&&!persisted)completed.set(event.messageId,{turnId:event.turnId,message:{messageId:event.messageId,role:event.role,text:event.text,status:`complete`,...event.outputId?{outputId:event.outputId}:{},...event.turnId?{turnId:event.turnId}:{},...event.origin?{origin:event.origin}:{},...event.at||previous?.at?{at:event.at||previous.at}:{}}});changedPresentation||=changed||event.status===`complete`}}else if(SNAPSHOT_EVENTS.has(event.type)){if(event.type===`settled`)settledTurns.add(event.turnId);if(event.type===`replaced`)completed.clear();reload()}if(changedPresentation)publishState();onEvent(event)}function receive(payload){if(disposed||!listening||payload?.subscriptionId!==subscriptionId||payload.conversationId!==conversationId)return;if(epoch===null)pending.push(payload);else deliver(payload)}function clearTimers(){clearTimeout(retryTimer);retryTimer=null;clearTimeout(waitingTimer);waitingTimer=null}function subscribe({preserveHistory=false}={}){clearTimers();if(disposed||!socket.connected)return;const attempt=++generation;epoch=null;revision=0;pending=[];listening=true;state=null;streaming=null;completed.clear();settledTurns.clear();reloadInFlight=null;reloadQueued=false;waitingTimer=setTimeout(()=>onError(Object.assign(new Error(`Chat is still loading. Waiting for the server; Reload chat to try now.`),{code:`assistant_subscription_waiting`})),SUBSCRIPTION_NOTICE_MS);socket.timeout(SUBSCRIPTION_LOST_MS).emit(ASSISTANT_CONVERSATION_SUBSCRIBE,input,(error,response)=>{if(disposed||attempt!==generation)return;clearTimers();if(error||response?.ok!==true){listening=false;pending=[];if(socket.connected)socket.emit(ASSISTANT_CONVERSATION_UNSUBSCRIBE,{subscriptionId});if(error||response?.status>=500){retryTimer=setTimeout(()=>subscribe({preserveHistory}),retryDelay);retryDelay=Math.min(retryDelay*2,3e4)}onError(error?Object.assign(new Error(`Chat updates could not reconnect. Retrying automatically; Reload chat to try now.`,{cause:error}),{code:`assistant_subscription_transport_failed`}):Object.assign(new Error(response?.error||`Conversation subscription failed.`),{code:response?.code,statusCode:response?.status,params:response?.params,...response?.error?{messageCode:response.messageCode,messageParams:response.messageParams}:{messageCode:`assistant.runtime.subscription.failed`}}));return}retryDelay=1e3;epoch=response.streamEpoch;receiveState(response.state,{initial:!preserveHistory,canonical:!preserveHistory});for(const payload of pending.sort((left,right)=>left.streamRevision-right.streamRevision))deliver(payload);pending=[]})}function disconnected(){clearTimers();generation+=1;epoch=null;pending=[];listening=false;reloadInFlight=null;reloadQueued=false}socket.on(ASSISTANT_CONVERSATION_EVENT,receive);socket.on(`connect`,subscribe);socket.on(`disconnect`,disconnected);subscribe();function release(){if(disposed)return;disposed=true;clearTimers();generation+=1;pending=[];completed.clear();socket.off(ASSISTANT_CONVERSATION_EVENT,receive);socket.off(`connect`,subscribe);socket.off(`disconnect`,disconnected);if(socket.connected)socket.emit(ASSISTANT_CONVERSATION_UNSUBSCRIBE,{subscriptionId})}return Object.assign(release,{reload})}var text$6=value=>String(toValue(value)??``).trim();var{serverMessage,t:t$19}=useJskitText();var failureMessage=(failure,fallback=``)=>failure?.message?serverMessage(failure):fallback;var resultError=result=>failureMessage({...result,message:result?.error});var stateError=state=>failureMessage({message:state?.error,messageCode:state?.errorMessageCode,messageParams:state?.errorMessageParams});var conversationDefaultsKey=Symbol.for(`jskit.assistant-runtime.conversation.defaults`);var compareTurnIds=(left,right)=>String(left).localeCompare(String(right),void 0,{numeric:true});function configureAssistantConversations(app,{actorKey,api=null,request,clearDraftOn=`dispatch`}={}){if(typeof app?.provide!==`function`)throw new TypeError(`Conversation defaults require a Vue application.`);if(request!==void 0&&typeof request!==`function`)throw new TypeError(`Conversation request must be a function.`);if(![`dispatch`,`accepted`].includes(clearDraftOn))throw new TypeError(`clearDraftOn must be dispatch or accepted.`);app.provide(conversationDefaultsKey,Object.freeze({actorKey,api,request,clearDraftOn}))}var SEND_REJECTIONS=new Set([`ACTION_VALIDATION_FAILED`,`ACTION_PERMISSION_DENIED`,`ACTION_SURFACE_FORBIDDEN`,`conversation_invalid_message`,`conversation_busy`,`conversation_not_steerable`,`conversation_invalid_goal`,`conversation_goal_changed`]);function isQuestionConfiguration(value){return value===true||Boolean(value&&typeof value===`object`&&![`questions`,`choices`,`capture`].some(key=>key in value))}function questionsAnswered(prompts){return prompts.questions.every(question=>String(prompts.answers[question.name]||``).trim())}function authoredRequest(payload,{attachmentIds,steer}){return{text:String(payload.message||``),...payload.data!==void 0?{data:payload.data}:{},...attachmentIds?.length?{attachmentIds}:{},...steer?{steer:true}:{}}}function draftAfterAcceptedSubmission(currentDraft=``,submittedDraft=``){const current=String(currentDraft||``);const submitted=String(submittedDraft||``);if(current===submitted)return``;return submitted&¤t.startsWith(submitted)?current.slice(submitted.length):current}function resolveWorkingPolicy(snapshot,{deferWhileWorking,admitWhileWorking}){const resolve=(name,option)=>{const value=typeof option===`function`?option(snapshot):option;if(typeof value!==`boolean`)throw new TypeError(`${name} must return a boolean.`);return value};const deferred=resolve(`deferWhileWorking`,deferWhileWorking);const admitted=resolve(`admitWhileWorking`,admitWhileWorking);if(deferred&&admitted)throw new TypeError(`Choose either admitWhileWorking or deferWhileWorking.`);return{deferWhileWorking:deferred,admitWhileWorking:admitted}}function createConversation(identity,{api,socket,actorKey,placement,readers,queueWhileSending,deferWhileWorking,admitWhileWorking,draftStorage,application,goalReadEnabled}){const disposed=ref(false);const placementRevision=ref(0);const stopPlacement=placement.subscribe(()=>{placementRevision.value+=1});const current=computed(()=>{placementRevision.value;const actor=toValue(actorKey);return!disposed.value&&(actor===void 0?String(placement.getContext()?.user?.id||``):text$6(actor))===identity.actorKey});const active=computed(()=>current.value&&[...readers.values()].some(reader=>toValue(reader.active)!==false));const snapshot=shallowRef(null);const draft=ref(``);const draftMessageId=ref(``);const draftAttachments=ref([]);const draftRetry=ref(null);const draftRetryMatches=computed(()=>{const retry=draftRetry.value;const current=String(draft.value||``);const submitted=String(retry?.draftSnapshot||``);return Boolean(retry&&submitted&&(current===submitted||current.startsWith(submitted)))});let draftSubmissionSequence=0;const error=ref(``);const loading=ref(true);const stopping=ref(false);const goalAction=ref(``);const goalTargetCurrent=ref(false);const goalError=ref(``);const goalView=shallowRef(null);const goalLoadError=ref(``);const accessDenied=ref(false);const delivery=createAssistantMessageDelivery();const pendingMessages=new Map;const olderPages=ref([]);let historyRevision=0;let deniedHistoryRevision=0;const loadingMore=ref(false);const loadMoreError=ref(``);const turns=computed(()=>{const saved=mergeConversationLogPages([...olderPages.value,{conversationLog:snapshot.value?.conversationLog||[]}]).conversationLog;const messages=(snapshot.value?.turns||[]).flatMap(conversationTurnMessages);return mergeConversationStream(saved,{messages})});const oldestLoadedPage=computed(()=>olderPages.value[0]||snapshot.value);const hasMoreBefore=computed(()=>normalizeConversationLogPagination(oldestLoadedPage.value?.pagination).hasMoreBefore);const editable=computed(()=>active.value&&!accessDenied.value);const available=computed(()=>active.value&&!loading.value&&!accessDenied.value&&Boolean(snapshot.value));const steerable=computed(()=>snapshot.value?.status===`working`&&snapshot.value?.capabilities?.steering===true);const workingPolicy=computed(()=>resolveWorkingPolicy(snapshot.value,{deferWhileWorking,admitWhileWorking}));const queueing=computed(()=>queueWhileSending!==false&&(steerable.value||workingPolicy.value.deferWhileWorking||workingPolicy.value.admitWhileWorking));const canSubmit=computed(()=>available.value&&!stopping.value&&(snapshot.value.status===`ready`||steerable.value||(workingPolicy.value.deferWhileWorking||workingPolicy.value.admitWhileWorking)&&snapshot.value.status===`working`)&&(queueWhileSending!==false||!delivery.state.sending)&&!delivery.state.messages.some(message=>message.status===`uncertain`&&(snapshot.value.status!==`ready`||!message.payload||text$6(message.payload.draft??message.payload.message)===text$6(draft))));const savedDraft=toValue(draftStorage);if(savedDraft&&(typeof savedDraft.key!==`string`||!savedDraft.key||![`getItem`,`setItem`,`removeItem`].every(name=>typeof savedDraft.storage?.[name]===`function`)))throw new TypeError(`draftStorage requires an explicit key and storage with getItem, setItem and removeItem.`);try{const saved=savedDraft?JSON.parse(savedDraft.storage.getItem(savedDraft.key)||`null`):null;draft.value=typeof saved?.draft===`string`?saved.draft:``;draftAttachments.value=Array.isArray(saved?.attachments)?saved.attachments.filter(attachment=>typeof attachment?.attachmentId===`string`):[];const restoredMessages=(Array.isArray(saved?.messages)?saved.messages.filter(message=>typeof message?.id===`string`&&typeof message.text===`string`&&typeof message.payload?.message===`string`):[]).filter(message=>!delivery.find(message.id)).map(message=>{const status=[`failed`,`accepted`].includes(message.status)?message.status:`uncertain`;return{...message,status,checking:false,error:message.error||(status===`accepted`?``:t$19(`jskit.assistant.runtime.delivery.unconfirmedBeforeClose`))}});delivery.state.messages=unmatchedOptimisticMessages(turns.value,[...delivery.state.messages,...restoredMessages],{receiptsOnly:true})}catch{draft.value=``;draftAttachments.value=[]}function persistDraft(){if(!savedDraft||!current.value||accessDenied.value)return;try{const saved={draft:draft.value,attachments:draftAttachments.value.filter(attachment=>attachment?.attachmentId),messages:delivery.state.messages};if(saved.draft||saved.attachments.length||saved.messages.length)savedDraft.storage.setItem(savedDraft.key,JSON.stringify(saved));else savedDraft.storage.removeItem(savedDraft.key)}catch{}}persistDraft();watch([draft,draftAttachments,()=>delivery.state.messages],persistDraft,{deep:true,flush:`sync`});function settleDraftRetry(retry=draftRetry.value){if(!retry||retry.messageId!==draftRetry.value?.messageId)return false;draft.value=draftAfterAcceptedSubmission(draft.value,retry.draftSnapshot);draftRetry.value=null;return true}watch(turns,value=>{const retry=draftRetry.value;if(retry&&!unmatchedOptimisticMessages(value,[retry.optimistic],{receiptsOnly:true}).length)settleDraftRetry(retry)});const questionConfiguration=computed(()=>{for(const reader of readers.values()){const option=toValue(reader.questions);if(toValue(reader.active)!==false&&isQuestionConfiguration(option))return option}return null});const questions=useAssistantQuestions({message:()=>available.value?latestAssistantMessageAwaitingUserReply(turns.value):``,extraChoice:()=>questionConfiguration.value?.extraChoice||null});let subscription;let goalRead=null;let goalSegment=null;let goalReadController=null;let goalReadQueued=false;const readsGoals=computed(()=>goalReadEnabled||snapshot.value?.capabilities?.goals===true||[...readers.values()].some(reader=>toValue(reader.goal)===true));watch(readsGoals,enabled=>{if(enabled)refreshGoal()});function receiveState(state,{initial=false,canonical=false}={}){if(!current.value)return;const previous=snapshot.value;const goalChanged=JSON.stringify([previous?.goal,previous?.capabilities?.goals,previous?.capabilities?.goalCommands,previous?.capabilities?.goalBudgets])!==JSON.stringify([state.goal,state.capabilities?.goals,state.capabilities?.goalCommands,state.capabilities?.goalBudgets]);if(canonical){historyRevision+=1;olderPages.value=initial?[]:state[refreshedHistoryPages]||[];loadMoreError.value=``}else if(olderPages.value.length){const first=state.conversationLog?.[0]?.turnId;const evicted=first?(previous?.conversationLog||[]).filter(turn=>compareTurnIds(turn.turnId,first)<0):[];if(evicted.length){historyRevision+=1;olderPages.value=[...olderPages.value,normalizeConversationLogPage({conversationLog:evicted})]}}snapshot.value=state;loading.value=false;error.value=``;accessDenied.value=false;delivery.reconcile(state.turns);if(state.status===`unconfirmed`&&state.pendingRequest)delivery.restoreUncertain(state.pendingRequest,state.turns);if(state.segmentId!==goalSegment){goalTargetCurrent.value=false;goalLoadError.value=``;goalReadController?.abort()}if(readsGoals.value&&(initial||goalChanged||state.segmentId!==goalSegment))refreshGoal();goalSegment=state.segmentId}function receiveError(failure){if(!current.value)return;loading.value=false;error.value=failureMessage(failure);accessDenied.value=isAccessDenied(failure);if(accessDenied.value){deniedHistoryRevision+=1;clearConversationView();goalTargetCurrent.value=false}}function clearConversationView(){delivery.reset();snapshot.value=null;historyRevision+=1;olderPages.value=[];draft.value=``;draftMessageId.value=``;draftAttachments.value=[];draftRetry.value=null;goalError.value=``;goalView.value=null;goalLoadError.value=``;goalReadController?.abort()}function receiveEvent(event){if(event.type===`transcript`&&olderPages.value.some(page=>page.conversationLog.some(turn=>turn.turnId===event.patch?.turn?.turnId))){historyRevision+=1;olderPages.value=patchLoadedHistoryPages(olderPages.value,event.patch)}if(event.type===`goal`)refreshGoal();for(const[token,reader]of[...readers]){if(!current.value)return;if(!readers.has(token)||toValue(reader.active)===false||typeof reader.onEvent!==`function`)continue;try{Promise.resolve(reader.onEvent(event)).catch(()=>{})}catch{}}}async function readLoadedHistory({current:subscriptionCurrent}){const denial=deniedHistoryRevision;const valid=()=>{if(denial!==deniedHistoryRevision)throw Object.assign(new Error(`Access denied.`),{status:403,messageCode:`assistant.runtime.accessDenied`});return current.value&&active.value&&subscriptionCurrent()};while(valid()){const revision=historyRevision;const oldestTurn=olderPages.value[0]?.conversationLog?.[0];const oldest=oldestTurn?.turnId;const oldestCursor=olderPages.value[0]?.pagination?.nextBeforeTurnId||oldest;const latest=await api.readConversation(identity.conversationId);if(!valid())return latest;const pages=[];let page=normalizeConversationLogPage(latest);const cursors=new Set;while(oldest&&page.pagination.hasMoreBefore){const cursor=page.pagination.nextBeforeTurnId||page.pagination.oldestTurnId;const reachedFullOldestTurn=page.pagination.oldestTurnId===oldest&&!page.conversationLog[0]?.paginationPartial;const passedOldestTurn=compareTurnIds(page.pagination.oldestTurnId,oldest)<0;if(cursor&&(cursor===oldestCursor||passedOldestTurn||reachedFullOldestTurn))break;if(!cursor||cursors.has(cursor))throw Object.assign(new Error(`Older conversation history could not be refreshed. Reload chat to try again.`),{messageCode:`assistant.runtime.history.refreshFailed`});cursors.add(cursor);page=normalizeConversationLogPage(await api.readConversation(identity.conversationId,{beforeTurnId:cursor,limit:latest.pagination.limit}));if(!valid())return latest;const saved=page.conversationLog.filter(turn=>compareTurnIds(turn.turnId,oldest)>=0).map(turn=>{if(turn.turnId!==oldest||!oldestTurn.paginationPartial)return turn;const roles=[`system`,`user`,`assistant`];const excluded=roles.slice(0,roles.findIndex(role=>oldestTurn[role]));return{...turn,paginationPartial:true,...Object.fromEntries(excluded.map(role=>[role,null])),messages:turn.messages?.filter(message=>!excluded.includes(message.role))}});pages.unshift(normalizeConversationLogPage({...page,conversationLog:saved,pagination:{...page.pagination,count:saved.length,oldestTurnId:saved[0]?.turnId||``,hasMoreBefore:page.pagination.hasMoreBefore||saved.length<page.conversationLog.length}}))}if(revision!==historyRevision)continue;return{...latest,[refreshedHistoryPages]:pages.filter(page=>page.conversationLog.length)}}return null}watch(active,enabled=>{subscription?.();subscription=null;historyRevision+=1;if(!enabled)return;loading.value=true;subscription=subscribeAssistantConversation({socket,conversationId:identity.conversationId,targetSurfaceId:identity.targetSurfaceId,hostSurfaceId:identity.hostSurfaceId,...identity.workspaceSlug?{workspaceSlug:identity.workspaceSlug}:{},read:readLoadedHistory,onState:receiveState,onError:receiveError,onEvent:receiveEvent})},{immediate:true,flush:`sync`});watch(current,value=>{if(value)return;for(const pending of pendingMessages.values())if(!pending.dispatched)pending.controller.abort();clearConversationView();goalAction.value=``;goalReadQueued=false;questions.reset()},{flush:`sync`});onScopeDispose(()=>{disposed.value=true;subscription?.();stopPlacement();for(const pending of pendingMessages.values())pending.controller.abort();pendingMessages.clear();goalReadController?.abort();delivery.reset()});async function send(payload,{messageId=crypto.randomUUID(),onAccepted}={}){const retry=delivery.find(messageId);if(retry?.status===`failed`&&retry.payload.goalRequest)return changeGoal(retry.payload.goalRequest.action,{},{messageId});if(!canSubmit.value)return false;if(retry&&retry.status!==`failed`)return false;if(delivery.state.messages.some(message=>message.status===`uncertain`&&text$6(message.payload?.message)===text$6((retry?.payload||payload).message)))return false;const requestedSteering=(retry?.payload?.request||payload.request)?.steer===true;if(requestedSteering&&snapshot.value.capabilities?.steering!==true)return false;const steering=requestedSteering||steerable.value;const policy=workingPolicy.value;const deferred=policy.deferWhileWorking&&!retry&&!steering;const appAdmission=policy.admitWhileWorking&&!steering;if((snapshot.value.status===`working`||delivery.state.sending)&&!steering&&!deferred&&!appAdmission)return false;if((retry?.payload||payload).displayAttachments?.length&&snapshot.value.capabilities?.attachments!==true)return false;return submitRequest(retry?.payload?.request?retry.payload:{...retry?.payload||payload,request:payload.request||authoredRequest(payload,{attachmentIds:payload.displayAttachments?.map(file=>file.attachmentId),steer:steerable.value})},{messageId,onAccepted,queue:queueWhileSending!==false&&(steering||deferred||appAdmission),deferred,appAdmission})}function submitPrepared(payload,{messageId=crypto.randomUUID(),onAccepted,prepare}={}){if(typeof prepare!==`function`)throw new TypeError(`Prepared submission requires application preparation.`);const retry=delivery.find(messageId);const captured=retry?.payload||payload;if(!captured?.request||typeof captured.request!==`object`||Array.isArray(captured.request)||captured.goalRequest)throw new TypeError(`Prepared submission requires an authored conversation request.`);if(!current.value||accessDenied.value||retry&&retry.status!==`failed`)return Promise.resolve(false);return submitRequest(captured,{messageId,onAccepted,prepare,queue:queueWhileSending===true})}async function submitDraft(payload,{messageId=crypto.randomUUID(),submissionKind=steerable.value?`steer`:`send`,questionText=``,onAccepted}={}){if(!canSubmit.value)return false;const retry=draftRetryMatches.value?draftRetry.value:null;if(!retry)draftRetry.value=null;const draftSnapshot=retry?.draftSnapshot||draft.value;const captured=retry?.payload?.request?retry.payload:payload;const kind=retry?.submissionKind||submissionKind;const questionTextSnapshot=retry?.questionTextSnapshot||questionText;const id=retry?.messageId||messageId;const sequence=++draftSubmissionSequence;draftRetry.value=null;draft.value=retry?draftAfterAcceptedSubmission(draft.value,draftSnapshot):``;const result=await send(captured,{messageId:id,onAccepted});if(!current.value)return false;if(!(result!==false&&result?.ok!==false)&&kind===`steer`&&sequence===draftSubmissionSequence&&!draft.value){draft.value=draftSnapshot;const optimistic=delivery.find(id)||{createdAtMs:Date.now(),id,text:String(captured.displayMessage||captured.message||``).trim()};draftRetry.value={draftSnapshot,messageId:id,optimistic,payload:optimistic.payload||captured,questionTextSnapshot,submissionKind:kind};if(!unmatchedOptimisticMessages(turns.value,[optimistic],{receiptsOnly:true}).length)settleDraftRetry(draftRetry.value)}return result}function waitForAdmission({controller}){return new Promise(resolve=>{let stop;const finish=admission=>{stop?.();controller.signal.removeEventListener(`abort`,check);resolve(admission)};const check=()=>{if(controller.signal.aborted||!available.value)finish(false);else if(snapshot.value.status===`ready`)finish(`send`);else if(steerable.value)finish(`steer`);else if(snapshot.value.status!==`working`)finish(false)};stop=watch([available,snapshot,steerable],check,{flush:`sync`});controller.signal.addEventListener(`abort`,check,{once:true});check()})}async function submitRequest(payload,{messageId,onAccepted,queue=false,prepare,deferred=false,appAdmission=false}){if(pendingMessages.has(messageId))return false;const pending={controller:new AbortController,started:false,dispatched:false};const{controller}=pending;pendingMessages.set(messageId,pending);try{return await delivery.send(payload,{messageId,queue,isCurrent:()=>current.value,onAccepted,receiptTurns:turns,uncertainOnError:true,async deliver(submission){pending.started=true;let admission=null;try{if(controller.signal.aborted||appAdmission&&(!available.value||stopping.value||!workingPolicy.value.admitWhileWorking))return false;if(deferred){await subscription?.reload();if(error.value)return false;if(snapshot.value.status===`working`&&!steerable.value)delivery.wait(messageId,t$19(`jskit.assistant.runtime.delivery.waitingForStep`));admission=await waitForAdmission(pending);delivery.wait(messageId,``);if(!admission||controller.signal.aborted||!available.value||snapshot.value.status!==(admission===`steer`?`working`:`ready`))return false;if(submission.displayAttachments?.length&&snapshot.value.capabilities?.attachments!==true)return{ok:false,error:t$19(`jskit.assistant.runtime.attachments.noLongerAccepted`)}}let request=prepare?await prepare(submission,{signal:controller.signal}):submission.request;if(admission===`steer`){request={...request,steer:true};const retained=delivery.find(messageId);if(retained)retained.payload.request=request}if(prepare){if(!current.value||accessDenied.value||controller.signal.aborted||request===false)return false;if(!request||typeof request!==`object`||Array.isArray(request))throw new TypeError(`Application preparation must return its conversation request or false.`)}pending.dispatched=true;for(let attempt=0;;attempt+=1)try{return await(submission.goalRequest?api.updateConversationGoal(identity.conversationId,{...submission.goalRequest,messageId},{signal:controller.signal}):api.sendConversationMessage(identity.conversationId,{...request,messageId},{signal:controller.signal}))}catch(failure){if(attempt!==0||submission.goalRequest||request.steer!==true||failure.code!==`conversation_steer_turn_finished`||failure.status!==409||failure.details?.delivery&&(failure.details.delivery.status!==`not-sent`||failure.details.delivery.messageId!==messageId))throw failure;const retained=delivery.find(messageId);if(retained?.status===`accepted`||turns.value.some(turn=>turn.user?.messageId===messageId&&turn.user.receipt!==false))return{ok:true};if(!current.value||accessDenied.value||controller.signal.aborted||!retained||retained.status!==`pending`)return false;const{steer:_finishedTurn,...nextRequest}=request;request=nextRequest;retained.payload.request=nextRequest;retained.payload.submissionKind=`send`}}catch(failure){if(controller.signal.aborted)return false;if(prepare&&!pending.dispatched)return{ok:false,error:failureMessage(failure),...failure.code?{code:failure.code}:{}};const rejection=failure.details?.delivery;if(Number.isInteger(failure.status)&&failure.status>=400&&failure.status<500&&rejection&&!Array.isArray(rejection)&&rejection.status===`not-sent`&&rejection.messageId===messageId||SEND_REJECTIONS.has(failure.code)||failure.code===`conversation_steer_turn_finished`&&failure.status===409&&!failure.details?.delivery)return{ok:false,error:failureMessage(failure),...failure.code?{code:failure.code}:{}};throw failure}finally{if(pendingMessages.get(messageId)===pending)pendingMessages.delete(messageId)}}})}catch(failure){if(prepare)return{ok:false,status:`uncertain`,error:failureMessage(failure),...failure.code?{code:failure.code}:{}};return false}finally{if(!pending.started&&pendingMessages.get(messageId)===pending)pendingMessages.delete(messageId);if(current.value)subscription?.reload()}}function cancelMessage(messageId){const pending=pendingMessages.get(messageId);if(!pending)return false;pending.controller.abort();return true}async function loadMore({complete}={}){const finish=result=>{if(typeof complete===`function`)complete(result)};const pagination=normalizeConversationLogPagination(oldestLoadedPage.value?.pagination);const beforeTurnId=pagination.nextBeforeTurnId||pagination.oldestTurnId||String(turns.value[0]?.turnId||``).trim();if(!available.value||!hasMoreBefore.value||loadingMore.value||!beforeTurnId){finish({changed:false,loaded:false});return false}const revision=historyRevision;loadingMore.value=true;loadMoreError.value=``;try{const page=await api.readConversation(identity.conversationId,{beforeTurnId,limit:snapshot.value.pagination.limit});if(!available.value||revision!==historyRevision){finish({changed:false,loaded:false});return false}const previousOldestTurnId=String(turns.value[0]?.turnId||``).trim();const previousMessageCount=turns.value.reduce((count,turn)=>count+(turn.messages?.length||0),0);historyRevision+=1;olderPages.value=[normalizeConversationLogPage(page),...olderPages.value];const nextOldestTurnId=String(turns.value[0]?.turnId||``).trim();const nextMessageCount=turns.value.reduce((count,turn)=>count+(turn.messages?.length||0),0);finish({changed:Boolean(nextOldestTurnId&&(nextOldestTurnId!==previousOldestTurnId||nextMessageCount!==previousMessageCount)),loaded:true});return true}catch(failure){if(current.value){loadMoreError.value=String(failureMessage(failure)||failure||t$19(`jskit.assistant.runtime.history.loadFailed`));if(isAccessDenied(failure))receiveError(failure)}finish({changed:false,loaded:false});return false}finally{loadingMore.value=false}}function refreshGoal(){if(!active.value||!snapshot.value||!readsGoals.value||accessDenied.value)return Promise.resolve(false);if(goalRead){goalReadQueued=true;return goalRead}const segment=snapshot.value.segmentId;const capabilities=snapshot.value.capabilities;const controller=new AbortController;goalReadController=controller;const job=Promise.resolve().then(()=>api.readConversationGoal(identity.conversationId,{signal:AbortSignal.any([controller.signal,AbortSignal.timeout(3e4)])})).then(result=>{if(!current.value||controller.signal.aborted||snapshot.value?.segmentId!==segment)return false;goalView.value=result&&Object.hasOwn(result,`target`)?result:{status:`available`,goal:result,target:{segmentId:segment,capabilities}};goalTargetCurrent.value=true;goalLoadError.value=``;return true}).catch(failure=>{if(current.value&&!controller.signal.aborted&&snapshot.value?.segmentId===segment)goalLoadError.value=failureMessage(failure,t$19(`jskit.assistant.runtime.goal.unavailable`));return false}).finally(()=>{if(goalRead!==job)return;goalRead=null;goalReadController=null;if(goalReadQueued){goalReadQueued=false;refreshGoal()}});goalRead=job;return job}async function changeGoal(action,input={},{messageId=crypto.randomUUID()}={}){const view=goalView.value;const target=view?.target;const command=target?.capabilities?.goalCommands?.[action];if(!available.value||view?.status!==`available`||goalLoadError.value||goalAction.value||!goalTargetCurrent.value||![`message`,`control`].includes(command?.delivery)||delivery.state.messages.some(message=>message.status===`uncertain`))return false;if(input.tokenBudget!=null&&!target.capabilities.goalBudgets){goalError.value=t$19(`jskit.assistant.runtime.goal.budgetsUnsupported`);return false}const retry=delivery.find(messageId);if(retry&&retry.status!==`failed`)return false;const request=retry?.payload.goalRequest||{action,expectedSegmentId:target.segmentId,expectedGoalId:view.goal?.id||null,...action===`set`?{objective:String(input.objective||``).trim(),...input.tokenBudget==null?{}:{tokenBudget:input.tokenBudget}}:{}};goalAction.value=action;goalError.value=``;try{if(retry||command.delivery===`message`){const result=await submitRequest(retry?.payload||{message:action===`set`?request.objective:t$19(action===`resume`?`jskit.assistant.runtime.goal.resumeMessage`:`jskit.assistant.runtime.goal.cancelMessage`),goalRequest:request},{messageId});if(result===false||result?.ok===false){if(current.value)goalError.value=result?.error||delivery.find(messageId)?.error||t$19(`jskit.assistant.runtime.goal.changeFailed`);return false}return result}const result=await api.updateConversationGoal(identity.conversationId,request);if(result?.ok===false)throw new Error(resultError(result)||t$19(`jskit.assistant.runtime.goal.changeFailed`));return result}catch(failure){if(current.value){goalError.value=failureMessage(failure);if(isAccessDenied(failure))receiveError(failure)}return false}finally{if(current.value){goalAction.value=``;await goalRead;await refreshGoal();subscription?.reload()}}}const goalState=computed(()=>{const view=goalView.value;if(!readsGoals.value)return null;const capabilities=view?.target?.capabilities||{};const commands=capabilities.goalCommands||{};const loading=!goalTargetCurrent.value&&!goalLoadError.value;const goalAvailable=goalTargetCurrent.value&&view?.status===`available`&&!goalLoadError.value;return{enabled:active.value&&Boolean(loading||view?.status===`available`&&!goalLoadError.value||goalError.value||goalLoadError.value),loading,available:Boolean(goalAvailable),action:goalAction.value,working:snapshot.value?.status===`working`,tokenBudgetSupported:capabilities.goalBudgets===true,goal:goalAvailable&&view?.goal?{...view.goal,elapsedSeconds:view.goal.timeUsedSeconds,sampledAt:Date.parse(view.goal.updatedAt)}:null,pending:Boolean(goalAction.value)||!goalAvailable||!available.value||delivery.state.sending||delivery.state.messages.some(message=>message.status===`uncertain`),error:goalError.value||goalLoadError.value||view?.error||``,pauseInterruptsTurn:commands.pause?.interruptsTurn===true,cancelInterruptsTurn:commands.cancel?.interruptsTurn===true,...Object.fromEntries([`set`,`resume`,`pause`,`cancel`].filter(action=>[`message`,`control`].includes(commands[action]?.delivery)).map(action=>[action,input=>changeGoal(action,input)]))}});async function cancel(){if(!editable.value||stopping.value)return false;stopping.value=true;for(const pending of pendingMessages.values())if(!pending.dispatched)pending.controller.abort();try{return await api.cancelConversation(identity.conversationId)}catch(failure){receiveError(failure);return false}finally{stopping.value=false;if(current.value)subscription?.reload()}}async function inspectDelivery(messageId){if(!available.value)return false;const message=delivery.find(messageId);if(message?.checking)return false;if(message)message.checking=true;try{const receipt=await api.inspectConversationDelivery(identity.conversationId,messageId);if(!current.value)return false;if(receipt.status===`accepted`){delivery.accept(messageId);if(receipt.messageId===messageId&&message?.payload.goalRequest)goalError.value=``}else if(receipt.status===`not-sent`&&receipt.messageId===messageId)delivery.rejectUnsent(messageId,resultError(receipt));else if(receipt.status===`unknown`&&message?.status===`uncertain`)message.error=t$19(`jskit.assistant.runtime.delivery.stillUnknown`);subscription?.reload();return receipt}catch(failure){if(current.value&&message?.status===`uncertain`)message.error=failureMessage(failure,t$19(`jskit.assistant.runtime.delivery.checkFailed`));receiveError(failure);return false}finally{if(message)message.checking=false}}const runtime={identity,current,active,editable,available,canSubmit,steerable,queueWhileSending:queueing,snapshot,draft,draftMessageId,draftAttachments,draftRetry,draftRetryMatches,settleDraftRetry,error,accessDenied,loading,stopping,delivery,turns,hasMoreBefore,loadingMore,loadMoreError,loadMore,send,submitPrepared,submitDraft,cancel,cancelMessage,inspectDelivery,changeGoal,refreshGoal,goalState,goalView,goalLoadError,questions,reload(options){const job=subscription?.reload(options);refreshGoal();return job}};runtime.application=application?application(runtime):null;return runtime}function useBoundedTask({command,endpoint,scope,input,result,onResult},{active,data,presentation}){if(typeof command?.run!==`function`||!(`isRunning`in command)||typeof input!==`function`||typeof result!==`function`)throw new TypeError(`boundedTask requires its command and input/result mappings.`);if(endpoint===void 0||scope===void 0)throw new TypeError(`boundedTask requires its endpoint and application scope.`);if(onResult!==void 0&&typeof onResult!==`function`)throw new TypeError(`boundedTask.onResult must be a function.`);const draft=ref(``);const messages=ref([]);const busy=computed(()=>toValue(command.isRunning)===true);let disposed=false;onScopeDispose(()=>{disposed=true});async function submit(){const content=draft.value.trim();if(!content||busy.value||toValue(active)===false)return;const capturedScope=toValue(scope);const message={...toValue(data),content,role:`user`};messages.value.push(message);draft.value=``;const response=await command.run({path:toValue(endpoint),payload:input(messages.value)});if(!response||disposed||toValue(scope)!==capturedScope)return;messages.value.push(result(response));onResult?.(response,{message,scope:capturedScope})}return{runtime:shallowRef(Object.freeze({draft,messages,submit,clearHistory(){messages.value=[]}})),adapter:computed(()=>{const display=toValue(presentation)||{};return{conversation:{turns:conversationTurnsFromMessages(messages.value.map(message=>({...message,text:message.content}))),assistantLabel:display.assistantLabel||t$19(`jskit.assistant.runtime.conversation.assistantLabel`),welcomeMessage:display.welcomeMessage,visible:display.visible,retainWhenHidden:display.retainWhenHidden,variant:display.variant,scrollKey:toValue(scope)},composer:{draft:draft.value,disabled:busy.value,pending:busy.value,canSend:toValue(active)!==false&&!busy.value&&Boolean(draft.value.trim()),submitOnEnter:display.submitOnEnter??false,submitOnModifierEnter:display.submitOnModifierEnter??true,placeholder:display.placeholder,ariaLabel:display.ariaLabel,submitAriaLabel:display.submitAriaLabel},actions:{setDraft(value){draft.value=value},submit}}}),error:computed(()=>``)}}function conversationBindingSetup({socket,boundedTask=null}={}){const app=getCurrentInstance()?.appContext.app;if(!app)throw new Error(`Conversation binding must be acquired from the application setup.`);if(boundedTask!==null)return{app};const routeContext=useSurfaceRouteContext();const placement=inject$1(SHELL_WEB_PLACEMENT_RUNTIME_KEY,null);if(typeof placement?.getContext!==`function`||typeof placement?.subscribe!==`function`)throw new Error(`Conversation binding requires the application's placement runtime.`);return{app,routeContext,placement,defaults:inject$1(conversationDefaultsKey,{}),workspaceScope:useWorkspaceWebScopeSupport(),socket:socket||useRealtimeSocket({required:true}),config:getClientAppConfig()}}function createConversationBinding({conversationId,endpoint=``,surfaceId=``,hostSurfaceId=``,workspaceSlug,actorKey:suppliedActorKey,api:suppliedApi=null,socket:suppliedSocket=null,active=true,onEvent,clearDraftOn:suppliedClearDraftOn,queueWhileSending,deferWhileWorking=false,admitWhileWorking=false,draftWhileLoading=false,draftStorage=null,application=null,boundedTask=null,data,attachments=null,suggestions=null,models=null,questions=null,goal=null,presentation={}}={},setup){const{app,routeContext,placement,workspaceScope,socket:setupSocket,config,defaults={}}=setup||conversationBindingSetup({socket:suppliedSocket,boundedTask});const clearDraftOn=suppliedClearDraftOn??defaults.clearDraftOn??`dispatch`;const actorKey=computed(()=>{const actor=toValue(suppliedActorKey);return actor===void 0?toValue(defaults.actorKey):actor});if(![`dispatch`,`accepted`].includes(clearDraftOn))throw new TypeError(`clearDraftOn must be dispatch or accepted.`);if(queueWhileSending!==void 0&&typeof queueWhileSending!==`boolean`)throw new TypeError(`queueWhileSending must be a boolean.`);if(![`boolean`,`function`].includes(typeof deferWhileWorking))throw new TypeError(`deferWhileWorking must be a boolean.`);if(![`boolean`,`function`].includes(typeof admitWhileWorking))throw new TypeError(`admitWhileWorking must be a boolean.`);resolveWorkingPolicy(null,{deferWhileWorking,admitWhileWorking});if(typeof draftWhileLoading!==`boolean`)throw new TypeError(`draftWhileLoading must be a boolean.`);if(application!==null&&typeof application!==`function`)throw new TypeError(`application must be a factory.`);if(boundedTask!==null)return useBoundedTask(boundedTask,{active,data,presentation});const socket=suppliedSocket||setupSocket;const runtime=shallowRef(null);const initialDraft=ref(``);const attachmentOwner=computed(()=>{const owner=toValue(attachments);return owner?proxyRefs(owner):null});const suggestionOwner=computed(()=>{const owner=toValue(suggestions);return owner?proxyRefs(owner):null});const modelOwner=computed(()=>{const owner=toValue(models);return owner?proxyRefs(owner):null});const questionOwner=computed(()=>{const option=toValue(questions);const owner=isQuestionConfiguration(option)?runtime.value?.questions:option;return owner?proxyRefs(owner):null});const identity=computed(()=>{const host=(text$6(hostSurfaceId)||text$6(routeContext.currentSurfaceId)).toLowerCase();const target=(text$6(surfaceId)||host).toLowerCase();const surface=resolveAssistantSurfaceConfig(config,target);const route=resolveAssistantRuntimeRoute(surface,toValue(workspaceSlug)===void 0?workspaceScope.readRouteScope(routeContext).workspaceSlug:text$6(workspaceSlug));const actor=toValue(actorKey);return Object.freeze({conversationId:text$6(conversationId),targetSurfaceId:target,hostSurfaceId:host||target,workspaceSlug:route.workspaceSlug,configured:route.configured,actorKey:actor===void 0?String(routeContext.placementContext.value?.user?.id||``):text$6(actor),endpoint:text$6(endpoint)||route.endpoint})});const draftScope=computed(()=>{const scope=identity.value;return JSON.stringify([scope.actorKey,scope.endpoint,scope.targetSurfaceId,scope.hostSurfaceId,scope.workspaceSlug,scope.configured])});const canDraftWhileLoading=computed(()=>draftWhileLoading&&identity.value.configured&&Boolean(identity.value.actorKey&&identity.value.targetSurfaceId)&&toValue(active)!==false);watch(draftScope,()=>{initialDraft.value=``},{flush:`sync`});let retained;watch(()=>JSON.stringify(identity.value),()=>{retained?.release();retained=null;runtime.value=null;const target=identity.value;if(!target.configured||!target.conversationId||!target.actorKey||!target.targetSurfaceId)return;const key=JSON.stringify([`assistant`,target.actorKey,target.endpoint,target.targetSurfaceId,target.hostSurfaceId,target.workspaceSlug,target.conversationId]);retained=retainAssistantConversation(app,key,readers=>createConversation(target,{readers,socket,actorKey,placement,queueWhileSending,deferWhileWorking,admitWhileWorking,draftStorage,application,goalReadEnabled:toValue(goal)===true,api:suppliedApi||defaults.api||createAssistantApi({request:defaults.request||assistantHttpClient.request,resolveBasePath:()=>target.endpoint,resolveSurfaceId:()=>target.hostSurfaceId})}),{active,questions,goal,onEvent});runtime.value=retained.runtime},{immediate:true,flush:`sync`});watch(()=>runtime.value?.editable.value&&runtime.value,current=>{if(!draftWhileLoading||!current||!initialDraft.value)return;const value=initialDraft.value;if(!current.draft.value.trim())current.draft.value=value;else if(value.trim()&&text$6(current.draft)!==value.trim())createAssistantTextSubmission({getState:()=>({active:current.editable.value,draft:current.draft.value}),setDraft:value=>{current.draft.value=value},submit:()=>false})(value,{sendImmediately:false});initialDraft.value=``},{flush:`sync`});onScopeDispose(()=>{initialDraft.value=``;retained?.release()});function submit({attachments:files=[],retryMessageId=``}={}){const current=runtime.value;if(!current?.canSubmit.value)return false;const owner=attachmentOwner.value;const waitForAcceptance=clearDraftOn===`accepted`;const pending=waitForAcceptance?current.delivery.find(current.draftMessageId.value):null;const previousId=retryMessageId||(pending&&text$6(pending.payload.draft)===text$6(current.draft)?pending.id:``);const retry=previousId?current.delivery.find(previousId):null;if(retry&&retry.status!==`failed`)return false;if(!retry&&owner?.canSubmit===false)return false;const prompts=questionOwner.value;const formatsQuestions=typeof prompts?.capture===`function`;if(!retry&&formatsQuestions&&prompts.questions?.length&&!questionsAnswered(prompts))return false;const answer=!retry&&formatsQuestions?prompts.capture(current.draft.value):null;const captured=retry?.payload||{message:answer?.message??current.draft.value,displayAttachments:files,...waitForAcceptance?{draft:current.draft.value}:{},...data===void 0?{}:{data:toValue(data)}};if(!String(captured.message||``).trim()&&!captured.displayAttachments?.length)return false;if(captured.displayAttachments?.length&¤t.snapshot.value?.capabilities?.attachments!==true)return false;const messageId=previousId||crypto.randomUUID();if(!retry&&answer)prompts.markSubmitted(answer.questionText);return submitCaptured(current,captured,{messageId,retry,attachments:owner})}function submitPrepared(payload,{messageId=crypto.randomUUID(),retryMessageId=``,retry,working=false,clearDraft=true,attachments=attachmentOwner.value,isCurrent=()=>true,onSubmit,onAccepted,prepare}={}){const current=runtime.value;if(typeof prepare!==`function`)throw new TypeError(`Prepared submission requires application preparation.`);if(!current?.current.value||!isCurrent())return false;const id=retryMessageId||messageId;const previous=retry||current.delivery.find(id);if(retryMessageId&&!previous||previous&&(![`failed`,`uncertain`].includes(previous.status)||previous.checking))return false;const captured=previous?.payload?.request?previous.payload:payload;return submitCaptured(current,captured.request?captured:{...captured,request:authoredRequest(captured,{attachmentIds:captured.attachmentIds?.length?captured.attachmentIds:captured.displayAttachments?.map(file=>file.attachmentId),steer:previous?captured.submissionKind===`steer`:working})},{messageId:id,retry:previous,clearDraft,attachments,isCurrent,onSubmit,onAccepted,prepare})}function submitCaptured(current,captured,{messageId,retry,clearDraft=true,attachments,isCurrent=()=>true,onSubmit,onAccepted,prepare}={}){const waitForAcceptance=clearDraftOn===`accepted`;const attachmentIds=[...captured.request?.attachmentIds||captured.attachmentIds||(captured.displayAttachments||[]).map(file=>file.attachmentId)];let accepted=false;function acknowledge(){if(accepted||!current.current.value||!isCurrent())return;accepted=true;if(waitForAcceptance&¤t.draftMessageId.value===messageId){const receipt=current.delivery.find(messageId);current.draftMessageId.value=``;if(receipt&&text$6(current.draft)===text$6(receipt.payload.draft))current.draft.value=``}if(attachmentIds.length){current.draftAttachments.value=current.draftAttachments.value.filter(file=>!attachmentIds.includes(file.attachmentId));if(runtime.value===current)try{attachments?.clearAttachments({accepted:true,attachmentIds})}catch(failure){current.error.value=failureMessage(failure,t$19(`jskit.assistant.runtime.attachments.clearFailed`))}}onAccepted?.()}if(!retry&&clearDraft){if(waitForAcceptance){current.draftMessageId.value=messageId;captured={...captured,draft:current.draft.value}}else current.draft.value=``}onSubmit?.();const dispatch=()=>prepare?current.submitPrepared(captured,{messageId,onAccepted:acknowledge,prepare}):current.send(captured,{messageId,onAccepted:acknowledge});if(retry?.status===`uncertain`)return current.inspectDelivery(messageId).then(receipt=>{if(!current.current.value||!isCurrent())return false;if(receipt?.status===`not-sent`&&receipt.messageId===messageId&¤t.delivery.find(messageId)?.status===`failed`)return dispatch();if(receipt?.status!==`accepted`){const error=current.error.value||t$19(`jskit.assistant.runtime.delivery.notConfirmed`);const pending=current.delivery.find(messageId);if(pending)pending.error=error;return{ok:false,status:`uncertain`,error}}acknowledge();return{...receipt,ok:true}});return dispatch()}return{runtime,adapter:computed(()=>{const current=runtime.value;const display=toValue(presentation)||{};const state=current?.snapshot.value;const files=state?.capabilities?.attachments?attachmentOwner.value:null;const prompts=current?.available.value?questionOwner.value:null;const formatsQuestions=typeof prompts?.capture===`function`;const draft=current?.draft.value??initialDraft.value;const editable=canDraftWhileLoading.value?!current||current.editable.value:current?.available.value;const message=formatsQuestions?prompts.capture(draft).message:draft;const answered=!formatsQuestions||!prompts.questions?.length||questionsAnswered(prompts);const canSend=current?.canSubmit.value||false;return{delivery:current?.delivery,attachments:files,suggestions:current?.available.value?suggestionOwner.value:null,models:current?.available.value?modelOwner.value:null,questions:prompts,goal:(toValue(goal)===true?null:toValue(goal))||current?.goalState.value||null,conversation:{turns:current?.turns.value||[],interimReply:state?.interimReply||null,error:current?.error.value||stateError(state),errorReloadable:Boolean(current)&&!current.accessDenied.value,scrollKey:JSON.stringify(identity.value),hasMoreBefore:current?.hasMoreBefore.value||false,loadingMore:current?.loadingMore.value||false,loadMoreError:current?.loadMoreError.value||``,loading:current?.loading.value||false,working:!current?.error.value&&state?.status===`working`&&!current.delivery.state.sending,assistantLabel:display.assistantLabel||t$19(`jskit.assistant.runtime.conversation.assistantLabel`),welcomeMessage:display.welcomeMessage??t$19(`jskit.assistant.runtime.conversation.welcomeMessage`),systemLabel:display.systemLabel,variant:display.variant,visible:display.visible,retainWhenHidden:display.retainWhenHidden,userMessageFormat:display.userMessageFormat,progressPreviewLimit:display.progressPreviewLimit,previewMessage:current?.available.value?display.previewMessage:null},composer:{draft,disabled:!editable||queueWhileSending===false&¤t?.delivery.state.sending,canSend:canSend&&answered&&Boolean(message.trim()||files?.attachments?.length),canStop:state?.status===`working`||state?.status===`unavailable`,stopPending:current?.stopping.value||false,queueWhileSending:current?.queueWhileSending.value||false,ariaLabel:display.ariaLabel,submitAriaLabel:display.submitAriaLabel,submitLabel:display.submitLabel,placeholder:formatsQuestions&&prompts.questions?.length?t$19(`jskit.assistant.runtime.composer.questionsPlaceholder`):formatsQuestions&&prompts.choices?.length?t$19(`jskit.assistant.runtime.composer.choicesPlaceholder`):display.placeholder||t$19(`jskit.assistant.runtime.conversation.placeholder`),hint:formatsQuestions&&prompts.active?t$19(`jskit.assistant.runtime.composer.questionsHint`):``,rows:display.rows??2,density:display.layout===`compact`?`compact`:`default`,submitOnEnter:true,submitOnModifierEnter:true},actions:{setDraft(value){if(current)current.draft.value=value;else if(canDraftWhileLoading.value)initialDraft.value=value},submit,resend:messageId=>submit({retryMessageId:messageId}),stop:()=>current?.cancel(),checkDelivery:messageId=>current?.inspectDelivery(messageId),loadMore:input=>current?.loadMore(input),reload:()=>current?.reload()}}}),submitPrepared,error:computed(()=>runtime.value?.error.value||stateError(runtime.value?.snapshot.value))}}function useAssistantConversation(options){return createConversationBinding(options)}function useAssistantConversationFactory(options={}){const setup=conversationBindingSetup(options);const owner=getCurrentScope();if(!owner)throw new Error(`Conversation factories require an application setup scope.`);return(input={})=>{if(!owner.active)throw new Error(`The conversation factory's application scope has ended.`);const scope=owner.run(()=>effectScope());try{return{...scope.run(()=>createConversationBinding({...options,...input},setup)),release:()=>scope.stop()}}catch(failure){scope.stop();throw failure}}}var _sfc_main$47={__name:`AssistantConversationClientElement`,props:{conversationId:{type:String,required:true},endpoint:{type:String,default:``},surfaceId:{type:String,default:``},hostSurfaceId:{type:String,default:``},workspaceSlug:{type:String,default:void 0},actorKey:{type:String,default:void 0},api:{type:Object,default:null},active:{type:Boolean,default:true},clearDraftOn:{type:String,default:void 0,validator:value=>[`dispatch`,`accepted`].includes(value)},assistantLabel:{type:String,default:void 0},welcomeMessage:{type:String,default:void 0},placeholder:{type:String,default:void 0},layout:{type:String,default:`compact`,validator:value=>[`page`,`compact`].includes(value)},data:{type:Object,default:void 0},attachments:{type:Object,default:null},suggestions:{type:Object,default:null},models:{type:Object,default:null},questions:{type:[Boolean,Object],default:null},goal:{type:[Boolean,Object],default:null},avatarSize:{type:String,default:`compact`,validator:value=>[`hidden`,`compact`,`standard`,`large`].includes(value)}},emits:[`update:avatarSize`],setup(__props,{expose:__expose,emit:__emit}){const props=__props;const emit=__emit;const{t}=useJskitText();const assistantLabelText=computed(()=>props.assistantLabel??t(`jskit.assistant.runtime.conversation.assistantLabel`));const binding=useAssistantConversation({conversationId:toRef(props,`conversationId`),endpoint:toRef(props,`endpoint`),surfaceId:toRef(props,`surfaceId`),hostSurfaceId:toRef(props,`hostSurfaceId`),workspaceSlug:()=>props.workspaceSlug,active:toRef(props,`active`),actorKey:toRef(props,`actorKey`),api:props.api,clearDraftOn:props.clearDraftOn,data:toRef(props,`data`),attachments:toRef(props,`attachments`),suggestions:toRef(props,`suggestions`),models:toRef(props,`models`),questions:toRef(props,`questions`),goal:toRef(props,`goal`),presentation:computed(()=>({assistantLabel:assistantLabelText.value,welcomeMessage:props.welcomeMessage??t(`jskit.assistant.runtime.conversation.welcomeMessage`),placeholder:props.placeholder??t(`jskit.assistant.runtime.conversation.placeholder`),layout:props.layout}))});const conversation=ref(null);__expose({focus:()=>conversation.value?.focus(),runtime:binding.runtime});return(_ctx,_cache)=>{return openBlock(),createBlock(unref(AssistantConversationElement_default),{ref_key:`conversation`,ref:conversation,adapter:unref(binding).adapter.value,label:assistantLabelText.value,"avatar-size":__props.avatarSize,class:`assistant-client-conversation`,"onUpdate:avatarSize":_cache[0]||(_cache[0]=$event=>emit(`update:avatarSize`,$event))},createSlots({"composer-feedback":withCtx(()=>[renderSlot(_ctx.$slots,`composer-feedback`,{runtime:unref(binding).runtime.value},void 0,true)]),_:2},[renderList(Object.keys(_ctx.$slots).filter(name=>name!==`composer-feedback`),name=>{return{name,fn:withCtx(scope=>[renderSlot(_ctx.$slots,name,mergeProps(scope,{runtime:unref(binding).runtime.value}),void 0,true)])}})]),1032,[`adapter`,`label`,`avatar-size`])}}};var AssistantConversationClientElement_default=_plugin_vue_export_helper_default(_sfc_main$47,[[`__scopeId`,`data-v-e1d8b1f7`]]);var _sfc_main$46={__name:`AssistantSettingsClientElement`,props:{targetSurfaceId:{type:String,required:true}},setup(__props){const props=__props;const form=reactive({systemPrompt:``});const fieldErrors=reactive({systemPrompt:``});const{fieldErrorMessages,serverMessage,t}=useJskitText();const errorRuntime=useShellWebErrorRuntime();const queryClient=useQueryClient();const appConfig=getClientAppConfig();const routeContext=useSurfaceRouteContext();const workspaceScopeSupport=useWorkspaceWebScopeSupport();const{placementContext,currentSurfaceId}=routeContext;const assistantSurface=computed(()=>resolveAssistantSurfaceConfig(appConfig,props.targetSurfaceId));const placementSnapshot=computed(()=>normalizeObject$1(placementContext.value));const routeScope=computed(()=>workspaceScopeSupport.readRouteScope(routeContext));const scope=computed(()=>{const settingsRequiresWorkspace=assistantSurface.value?.settingsSurfaceRequiresWorkspace===true;const workspaceSlug=settingsRequiresWorkspace?normalizeText$1(routeScope.value.workspaceSlug).toLowerCase():``;return{targetSurfaceId:normalizeText$1(assistantSurface.value?.targetSurfaceId).toLowerCase(),workspaceSlug,workspaceId:settingsRequiresWorkspace?normalizeRecordId(placementSnapshot.value?.workspace?.id,{fallback:null}):null}});const hasScope=computed(()=>Boolean(assistantSurface.value)&&(assistantSurface.value?.settingsSurfaceRequiresWorkspace?Boolean(scope.value.workspaceSlug):true));const queryKey=computed(()=>assistantSettingsQueryKey(scope.value));const settingsApi=createAssistantApi({request:assistantHttpClient.request,requestStream:assistantHttpClient.requestStream,resolveBasePath:()=>buildAssistantApiPath({requiresWorkspace:assistantSurface.value?.settingsSurfaceRequiresWorkspace===true,workspaceSlug:scope.value.workspaceSlug,suffix:`/${scope.value.targetSurfaceId}`}),resolveSurfaceId:()=>normalizeText$1(currentSurfaceId.value).toLowerCase()});const subtitle=computed(()=>{if(!assistantSurface.value)return t(`jskit.assistant.runtime.settings.subtitle`);const surface=assistantSurface.value.targetSurfaceId;if(assistantSurface.value.configScope===`workspace`)return t(`jskit.assistant.runtime.settings.subtitleWorkspace`,{surface});return t(`jskit.assistant.runtime.settings.subtitleSurface`,{surface})});function clearFieldErrors(){fieldErrors.systemPrompt=``}function reportAssistantSettingsError(message,dedupeKey){const normalizedMessage=normalizeText$1(message);if(!normalizedMessage)return;errorRuntime.report({source:`assistant.settings`,message:normalizedMessage,severity:`error`,channel:`banner`,dedupeKey,dedupeWindowMs:3e3})}const settingsQuery=useQuery({queryKey,enabled:hasScope,retry:false,queryFn:()=>settingsApi.getSettings()});watch(()=>settingsQuery.data.value,payload=>{const settings=payload?.settings&&typeof payload.settings===`object`?payload.settings:{};form.systemPrompt=String(settings.systemPrompt||``);clearFieldErrors()},{immediate:true});const settingsMutation=useMutation({mutationFn:patch=>settingsApi.updateSettings(patch),onSuccess(payload){queryClient.setQueryData(queryKey.value,payload)}});const loadError=computed(()=>{if(!assistantSurface.value)return t(`jskit.assistant.runtime.settings.notConfigured`);if(hasScope.value){const failure=settingsQuery.error.value;return failure?.message?normalizeText$1(serverMessage(failure)):``}if(assistantSurface.value?.settingsSurfaceRequiresWorkspace){if(workspaceScopeSupport.available!==true)return t(`jskit.assistant.runtime.settings.workspaceUnavailable`);return t(`jskit.assistant.runtime.settings.selectWorkspace`)}return``});async function submit(){clearFieldErrors();const validation=validateOperationSection({operation:assistantConfigResource.operations.patch,section:`body`,value:{systemPrompt:form.systemPrompt}});if(!validation.ok){fieldErrors.systemPrompt=String(fieldErrorMessages(validation).systemPrompt||``);return}try{await settingsMutation.mutateAsync(validation.value)}catch(error){const nextFieldErrors=fieldErrorMessages({fieldErrors:normalizeObject$1(error?.details?.fieldErrors),fieldErrorCodes:error?.fieldErrorCodes||error?.details?.fieldErrorCodes});fieldErrors.systemPrompt=String(nextFieldErrors.systemPrompt||``);reportAssistantSettingsError(error?.message&&normalizeText$1(serverMessage(error))||t(`jskit.assistant.runtime.settings.updateFailed`),`assistant.settings:save`)}}const addEdit=computed(()=>({canView:Boolean(assistantSurface.value)&&hasScope.value,canSave:Boolean(assistantSurface.value)&&hasScope.value,loadError:loadError.value,isInitialLoading:Boolean(settingsQuery.isLoading.value),isRefetching:Boolean(settingsQuery.isFetching.value&&!settingsQuery.isLoading.value),isSaving:Boolean(settingsMutation.isPending.value),submit}));const showFormSkeleton=computed(()=>Boolean(settingsQuery.isLoading.value));return(_ctx,_cache)=>{return openBlock(),createBlock(unref(_sfc_main$49),{"root-class":`assistant-settings-client-element`,title:unref(t)(`jskit.assistant.runtime.settings.title`),subtitle:subtitle.value,"no-permission-message":unref(t)(`jskit.assistant.runtime.settings.noPermission`),"save-label":unref(t)(`jskit.assistant.runtime.settings.save`),"add-edit":addEdit.value,"show-form-skeleton":showFormSkeleton.value},{default:withCtx(()=>[createVNode(VTextarea,{modelValue:form.systemPrompt,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>form.systemPrompt=$event),label:unref(t)(`jskit.assistant.runtime.settings.systemPrompt`),variant:`outlined`,density:`comfortable`,rows:`8`,"auto-grow":``,readonly:!addEdit.value.canSave||addEdit.value.isSaving||addEdit.value.isRefetching,"error-messages":fieldErrors.systemPrompt?[fieldErrors.systemPrompt]:[]},null,8,[`modelValue`,`label`,`readonly`,`error-messages`])]),_:1},8,[`title`,`subtitle`,`no-permission-message`,`save-label`,`add-edit`,`show-form-skeleton`])}}};var ARCHITECTURE_ID_PATTERN=/^[a-z][a-z0-9_.-]*$/u;var LOCAL_NAME_PATTERN=/^[A-Za-z_$][A-Za-z0-9_$]*$/u;function normalizeArchitectureId(value,label){const normalized=String(value||``).trim().toLowerCase();if(!ARCHITECTURE_ID_PATTERN.test(normalized))throw new TypeError(`${label} must match ${ARCHITECTURE_ID_PATTERN.toString()}.`);return normalized}function normalizeCapabilityMap(value,label){if(value==null)return Object.freeze({});if(!isRecord$1(value))throw new TypeError(`${label} must be an object mapping local names to capability ids.`);const normalized={};const seenCapabilityIds=new Set;for(const[rawLocalName,rawCapabilityId]of Object.entries(value)){const localName=String(rawLocalName||``).trim();if(!LOCAL_NAME_PATTERN.test(localName))throw new TypeError(`${label} local name "${localName}" must be a JavaScript identifier.`);const capabilityId=normalizeArchitectureId(rawCapabilityId,`${label}.${localName}`);if(seenCapabilityIds.has(capabilityId))throw new TypeError(`${label} declares capability "${capabilityId}" more than once.`);seenCapabilityIds.add(capabilityId);normalized[localName]=capabilityId}return Object.freeze(normalized)}function assertDistinctLocalNames(maps){const owners=new Map;for(const[kind,entries]of Object.entries(maps))for(const localName of Object.keys(entries)){if(owners.has(localName))throw new TypeError(`Provider local name "${localName}" is declared by both ${owners.get(localName)} and ${kind}.`);owners.set(localName,kind)}}function normalizeLifecycleMethod(value,label){if(value==null)return null;if(typeof value!==`function`)throw new TypeError(`${label} must be a function when provided.`);return value}function defineProvider({id,requires={},optional={},provides={},setup,boot=null,shutdown=null}={}){const providerId=normalizeArchitectureId(id,`Provider id`);const normalizedRequires=normalizeCapabilityMap(requires,`${providerId}.requires`);const normalizedOptional=normalizeCapabilityMap(optional,`${providerId}.optional`);const normalizedProvides=normalizeCapabilityMap(provides,`${providerId}.provides`);assertDistinctLocalNames({requires:normalizedRequires,optional:normalizedOptional,provides:normalizedProvides});const setupMethod=normalizeLifecycleMethod(setup,`${providerId}.setup`);if(!setupMethod)throw new TypeError(`${providerId}.setup is required.`);return Object.freeze({id:providerId,requires:normalizedRequires,optional:normalizedOptional,provides:normalizedProvides,setup:setupMethod,boot:normalizeLifecycleMethod(boot,`${providerId}.boot`),shutdown:normalizeLifecycleMethod(shutdown,`${providerId}.shutdown`)})}function normalizeProviderDefinition(value){if(!isRecord$1(value))throw new TypeError(`Capability runtime providers must be provider definitions.`);return defineProvider(value)}function normalizeInputCapabilities(value){if(value==null)return new Map;if(!isRecord$1(value))throw new TypeError(`Capability runtime inputs must be an object keyed by capability id.`);return new Map(Object.entries(value).map(([id,capability])=>[normalizeArchitectureId(id,`Runtime input capability id`),capability]))}function providerCapabilityIds(provider,field){return Object.values(provider[field]||{})}function buildProviderOrder(providers,inputCapabilities){const normalizedProviders=providers.map(normalizeProviderDefinition);const providersById=new Map;const providerByCapability=new Map;for(const provider of normalizedProviders){if(providersById.has(provider.id))throw new Error(`Provider "${provider.id}" is duplicated.`);providersById.set(provider.id,provider);for(const capabilityId of providerCapabilityIds(provider,`provides`)){if(inputCapabilities.has(capabilityId))throw new Error(`Capability "${capabilityId}" is supplied both as a runtime input and by ${provider.id}.`);if(providerByCapability.has(capabilityId))throw new Error(`Capability "${capabilityId}" is provided by both ${providerByCapability.get(capabilityId).id} and ${provider.id}.`);providerByCapability.set(capabilityId,provider)}}for(const provider of normalizedProviders)for(const capabilityId of providerCapabilityIds(provider,`requires`)){if(!inputCapabilities.has(capabilityId)&&!providerByCapability.has(capabilityId))throw new Error(`Provider "${provider.id}" requires missing capability "${capabilityId}".`);if(providerByCapability.get(capabilityId)?.id===provider.id)throw new Error(`Provider "${provider.id}" cannot require capability "${capabilityId}" that it provides.`)}const visited=new Set;const visiting=new Set;const ordered=[];function visit(provider,lineage=[]){if(visited.has(provider.id))return;if(visiting.has(provider.id))throw new Error(`Provider capability cycle detected: ${[...lineage,provider.id].join(` -> `)}.`);visiting.add(provider.id);const dependencyProviders=[...providerCapabilityIds(provider,`requires`),...providerCapabilityIds(provider,`optional`)].map(capabilityId=>providerByCapability.get(capabilityId)||null).filter(Boolean).sort((left,right)=>left.id.localeCompare(right.id));for(const dependencyProvider of dependencyProviders)visit(dependencyProvider,[...lineage,provider.id]);visiting.delete(provider.id);visited.add(provider.id);ordered.push(provider)}for(const provider of[...normalizedProviders].sort((left,right)=>left.id.localeCompare(right.id)))visit(provider);return Object.freeze(ordered)}function resolveProviderDependencies(provider,capabilities){const dependencies={};for(const[localName,capabilityId]of Object.entries(provider.requires)){if(!capabilities.has(capabilityId))throw new Error(`Provider "${provider.id}" requires unavailable capability "${capabilityId}".`);dependencies[localName]=capabilities.get(capabilityId)}for(const[localName,capabilityId]of Object.entries(provider.optional))dependencies[localName]=capabilities.has(capabilityId)?capabilities.get(capabilityId):null;return Object.freeze(dependencies)}function normalizeProviderOutputs(provider,value){const expectedNames=Object.keys(provider.provides);if(expectedNames.length===0){if(value!=null&&(!isRecord$1(value)||Object.keys(value).length>0))throw new Error(`Provider "${provider.id}" declares no capabilities but setup() returned outputs.`);return Object.freeze({})}if(!isRecord$1(value))throw new Error(`Provider "${provider.id}" setup() must return its declared capability outputs.`);const actualNames=Object.keys(value).sort();const sortedExpectedNames=[...expectedNames].sort();if(actualNames.length!==sortedExpectedNames.length||actualNames.some((name,index)=>name!==sortedExpectedNames[index]))throw new Error(`Provider "${provider.id}" setup() outputs must be exactly: ${sortedExpectedNames.join(`, `)||`<none>`}.`);return Object.freeze({...value})}function createCapabilityRuntime({providers=[],inputs={},profile=``}={}){const capabilities=normalizeInputCapabilities(inputs);const providerOrder=buildProviderOrder(Array.isArray(providers)?providers:[],capabilities);const providerStates=new Map;const normalizedProfile=String(profile||``).trim();let lifecycleState=`created`;async function stopInitializedProviders(){const stopped=[];let firstError=null;for(const provider of[...providerOrder].reverse()){if(!providerStates.has(provider.id))continue;if(provider.shutdown){const state=providerStates.get(provider.id);try{await provider.shutdown(state.dependencies,Object.freeze({outputs:state.outputs,profile:normalizedProfile}))}catch(error){firstError||=error}}stopped.push(provider.id)}if(firstError)throw firstError;return Object.freeze(stopped)}async function start(){if(lifecycleState!==`created`)throw new Error(`Capability runtime cannot start from state "${lifecycleState}".`);lifecycleState=`starting`;try{for(const provider of providerOrder){const dependencies=resolveProviderDependencies(provider,capabilities);const outputs=normalizeProviderOutputs(provider,await provider.setup(dependencies,Object.freeze({profile:normalizedProfile})));for(const[localName,capabilityId]of Object.entries(provider.provides))capabilities.set(capabilityId,outputs[localName]);providerStates.set(provider.id,Object.freeze({dependencies,outputs}))}for(const provider of providerOrder)if(provider.boot){const state=providerStates.get(provider.id);await provider.boot(state.dependencies,Object.freeze({outputs:state.outputs,profile:normalizedProfile}))}lifecycleState=`started`;return api}catch(error){lifecycleState=`failed`;try{await stopInitializedProviders()}catch(shutdownError){throw new AggregateError([error,shutdownError],`Capability runtime startup failed and cleanup also failed.`,{cause:error})}throw error}}async function shutdown(){if(lifecycleState===`stopped`)return Object.freeze([]);if(lifecycleState!==`started`)throw new Error(`Capability runtime cannot shut down from state "${lifecycleState}".`);lifecycleState=`stopping`;try{return await stopInitializedProviders()}finally{lifecycleState=`stopped`}}function diagnostics(){return Object.freeze({profile:normalizedProfile,lifecycleState,providerOrder:Object.freeze(providerOrder.map(provider=>provider.id)),capabilityIds:Object.freeze([...capabilities.keys()].sort())})}const api=Object.freeze({start,shutdown,diagnostics});return api}var AssistantClientProvider=defineProvider({id:`assistant.web.client`,requires:{components:`client.components`},setup({components}){components.register(`assistant.web.settings.element`,_sfc_main$46)}});var client_exports$8=__exportAll({AssistantClientProvider:()=>AssistantClientProvider,AssistantConversationClientElement:()=>AssistantConversationClientElement_default,AssistantSettingsClientElement:()=>_sfc_main$46,AssistantSurfaceClientElement:()=>AssistantSurfaceClientElement_default,configureAssistantConversations:()=>configureAssistantConversations,useAssistantConversation:()=>useAssistantConversation,useAssistantConversationFactory:()=>useAssistantConversationFactory,useAssistantRuntime:()=>useAssistantRuntime});function value$1(input){return unref(input)}function normalizedText(input){return String(value$1(input)||``).trim()}function responseEngines(resource){const payload=resource.data.value;return Array.isArray(payload?.engines)?payload.engines:[]}function useVibe64AssistantCatalog({active,path:catalogPath,configuredOnly=false,allConnectedModels=false,engineId,modelProviderId,modelSearch,providerConnectedOnly=false,providerCursor,providerSearch}={}){const paths=usePaths();const selectedProjectSlug=useVibe64ProjectSlug();const catalogScope=computed(()=>normalizedText(catalogPath)||selectedProjectSlug.value);const apiPath=computed(()=>normalizedText(catalogPath)||paths.api(`/vibe64/assistants/capabilities`,{surface:`app`}));const enabled=computed(()=>Boolean(value$1(active)));const overview=useEndpointResource({enabled,fallbackLoadError:`AI choices could not be loaded.`,path:apiPath,queryKey:computed(()=>vibe64AssistantCapabilitiesQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,catalogScope.value,[`overview`,value$1(configuredOnly)?`configured`:normalizedText(engineId)||`all`,value$1(providerConnectedOnly)?`connected`:`all`,...value$1(allConnectedModels)?[`all-models`]:[]].join(`:`))),queryOptions:{refetchOnMount:true,staleTime:value$1(allConnectedModels)?3e4:0,refetchOnWindowFocus:false},readQuery:computed(()=>({...value$1(configuredOnly)?{configuredOnly:`true`}:{},...value$1(allConnectedModels)?{allConnectedModels:`true`}:{},...value$1(providerConnectedOnly)?{connectedOnly:`true`}:{},...!value$1(configuredOnly)&&normalizedText(engineId)?{engineId:normalizedText(engineId)}:{},limit:value$1(configuredOnly)?`100`:`25`})),realtime:{events:[VIBE64_ACCOUNTS_CHANGED_EVENT,VIBE64_CONNECTIONS_CHANGED_EVENT]},requestRecoveryLabel:`AI choices`});const providerPage=useEndpointResource({enabled:computed(()=>enabled.value&&!value$1(configuredOnly)&&!value$1(allConnectedModels)&&normalizedText(engineId)===`opencode`),fallbackLoadError:`OpenCode providers could not be loaded.`,path:apiPath,queryKey:computed(()=>vibe64AssistantCapabilitiesQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,catalogScope.value,(normalizedText(providerSearch)||normalizedText(providerCursor)?[`providers`,value$1(providerConnectedOnly)?`connected`:`all`,normalizedText(providerSearch),normalizedText(providerCursor)]:[`overview`,`opencode`,value$1(providerConnectedOnly)?`connected`:`all`]).join(`:`))),queryOptions:{refetchOnMount:`always`,refetchOnWindowFocus:false},readQuery:computed(()=>({...value$1(providerConnectedOnly)?{connectedOnly:`true`}:{},...normalizedText(providerCursor)?{cursor:normalizedText(providerCursor)}:{},engineId:`opencode`,limit:`25`,...normalizedText(providerSearch)?{search:normalizedText(providerSearch)}:{}})),requestRecoveryLabel:`OpenCode providers`});const modelPage=useEndpointResource({enabled:computed(()=>Boolean(enabled.value&&!value$1(configuredOnly)&&normalizedText(engineId)&&normalizedText(modelProviderId))),fallbackLoadError:`Provider models could not be loaded.`,path:apiPath,queryKey:computed(()=>vibe64AssistantCapabilitiesQueryKey(`app`,ROUTE_VISIBILITY_PUBLIC,catalogScope.value,[`models`,normalizedText(engineId),normalizedText(modelProviderId),value$1(providerConnectedOnly)?`connected`:`all`,normalizedText(modelSearch)].join(`:`))),queryOptions:{refetchOnMount:`always`,refetchOnWindowFocus:false},readQuery:computed(()=>({...value$1(providerConnectedOnly)?{connectedOnly:`true`}:{},engineId:normalizedText(engineId),limit:`100`,modelProviderId:normalizedText(modelProviderId),...normalizedText(modelSearch)?{search:normalizedText(modelSearch)}:{}})),requestRecoveryLabel:`Provider models`});const overviewEngines=computed(()=>responseEngines(overview));const providerEngine=computed(()=>responseEngines(providerPage)[0]||null);const modelEngine=computed(()=>responseEngines(modelPage)[0]||null);const selectedOverviewEngine=computed(()=>overviewEngines.value.find(engine=>String(engine?.engineId||``)===normalizedText(engineId))||null);const selectedEngine=computed(()=>modelEngine.value||providerEngine.value||selectedOverviewEngine.value);const selectedProvider=computed(()=>{const providerId=normalizedText(modelProviderId);return[...modelEngine.value?.modelProviders||[],...providerEngine.value?.modelProviders||[],...selectedOverviewEngine.value?.modelProviders||[]].find(provider=>String(provider?.id||``)===providerId)||null});async function reload(){const requests=[overview.reload()];if(!value$1(configuredOnly)){if(!value$1(allConnectedModels)&&normalizedText(engineId)===`opencode`&&(normalizedText(providerSearch)||normalizedText(providerCursor)))requests.push(providerPage.reload());if(normalizedText(modelProviderId))requests.push(modelPage.reload())}await Promise.all(requests)}return{apiPath,engines:overviewEngines,modelEngine,modelPage,overview,providerEngine,providerPage,reload,selectedEngine,selectedOverviewEngine,selectedProvider}}var VIBE64_ACCOUNT_CONNECTIONS_OPEN_EVENT=`vibe64:account-connections:open`;function requestVibe64AccountConnectionsDialog({codexReconnectRequired=false,providerLabel=``,providerId=``,providerRevision=``,refresh=true,section=``}={}){if(typeof window===`undefined`||typeof window.dispatchEvent!==`function`)return false;window.dispatchEvent(new CustomEvent(VIBE64_ACCOUNT_CONNECTIONS_OPEN_EVENT,{detail:{codexReconnectRequired:codexReconnectRequired===true,providerLabel:String(providerLabel||``),providerId:String(providerId||``),providerRevision:String(providerRevision||``),refresh:refresh!==false,section:String(section||``)}}));return true}function onVibe64AccountConnectionsDialogRequested(handler){if(typeof window===`undefined`||typeof window.addEventListener!==`function`)return()=>null;window.addEventListener(VIBE64_ACCOUNT_CONNECTIONS_OPEN_EVENT,handler);return()=>window.removeEventListener(VIBE64_ACCOUNT_CONNECTIONS_OPEN_EVENT,handler)}function readRefOrGetterValue(value){return unref(typeof value===`function`?value():value)}var _hoisted_1$27={key:1,class:`text-body-small`,role:`status`};var _hoisted_2$22={key:5,class:`vibe64-session-assistant-menu__locked-note`};var _hoisted_3$21={key:6,"aria-label":`Provider model access`,class:`vibe64-session-assistant-menu__section`};var _hoisted_4$15={class:`vibe64-session-assistant-menu__label`};var _hoisted_5$15={class:`vibe64-session-assistant-menu__access-summary`};var _sfc_main$45={__name:`Vibe64SessionAssistantMenu`,props:mergeModels({selection:{type:Object,default:null},catalogPath:{type:String,default:``},target:{default:null,type:Object},canConfigure:{default:false,type:Boolean},changesDisabled:{default:false,type:Boolean},session:{default:null,type:Object},saveSelection:{type:Function,default:null},sessionsApiPath:{default:``,type:[Function,Object,String]}},{"modelValue":{type:Boolean,default:false},"modelModifiers":{}}),emits:mergeModels([`saved`],[`update:modelValue`]),setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const saveError=ref(``);const routingMode=computed(()=>assistantRoutingFromMetadata(props.session?.metadata)?.mode||``);const menuOpen=useModel(__props,`modelValue`);const saving=ref(false);const modelAccessUpdating=ref(false);const unlockConfirmOpen=ref(false);const modelProviderId=ref(``);const modelId=ref(``);const agentId=ref(``);const variantId=ref(``);const assistantSelection=computed(()=>props.selection||assistantRoutingFromMetadata(props.session?.metadata)?.override||props.session?.assistantSelection||null);const engineId=ref(``);const catalogActive=computed(()=>Boolean(menuOpen.value&&(props.session?.sessionId||props.saveSelection)));const connections=useVibe64AssistantCatalog({active:catalogActive,configuredOnly:true,path:computed(()=>props.catalogPath)});const engineRows=computed(()=>connections.engines.value.filter(engine=>engine.health?.status===`ready`&&engine.modelProviders?.some(provider=>provider.connected)));const catalogs=Object.fromEntries(VIBE64_AGENT_PROVIDERS.map(({id})=>[id,useVibe64AssistantCatalog({active:computed(()=>catalogActive.value&&engineRows.value.some(engine=>engine.engineId===id)),path:computed(()=>props.catalogPath),engineId:id,allConnectedModels:true,providerConnectedOnly:true,modelProviderId:computed(()=>engineId.value===id?modelProviderId.value:``)})]));const catalog=computed(()=>catalogs[engineId.value]);const catalogLoading=computed(()=>connections.overview.isInitialLoading.value||catalog.value?.overview.isInitialLoading.value||catalog.value?.modelPage.isInitialLoading.value);const catalogError=computed(()=>String(connections.overview.loadError.value||catalog.value?.overview.loadError.value||catalog.value?.modelPage.loadError.value||``));const selectedOverviewEngine=computed(()=>catalog.value?.selectedOverviewEngine.value||null);const currentModelEngine=selectedOverviewEngine;const providerRows=computed(()=>(currentModelEngine.value?.modelProviders||[]).filter(provider=>provider.connected));const selectedProvider=computed(()=>providerRows.value.find(provider=>provider.id===modelProviderId.value));const savedProviderUnavailable=computed(()=>!catalogLoading.value&&assistantSelection.value?.engineId===engineId.value&&!providerRows.value.some(provider=>provider.id===assistantSelection.value.modelProviderId));const modelRows=computed(()=>providerRows.value.flatMap(provider=>provider.models.filter(model=>model.status===`available`).map(model=>({...model,modelProviderId:provider.id,props:{subtitle:provider.label},key:JSON.stringify([provider.id,model.id])}))));const modelKey=computed(()=>JSON.stringify([modelProviderId.value,modelId.value]));const modelAccess=computed(()=>selectedProvider.value?.modelAccess||{});const modelAccessUnlocked=computed(()=>modelAccess.value.mode===`all`);const recommendedModel=computed(()=>modelRows.value.find(model=>model.modelProviderId===modelProviderId.value&&model.id===modelAccess.value.recommendedModelId&&model.status===`available`)||null);const canRestoreRecommendedModel=computed(()=>Boolean(recommendedModel.value&&modelId.value!==recommendedModel.value.id));const modelAccessPendingLabel=computed(()=>modelAccessUnlocked.value?`Returning to ${recommendedModel.value?.label||`the recommended model`}…`:`Unlocking paid models…`);const selectedModel=computed(()=>modelRows.value.find(model=>model.key===modelKey.value)||null);function agentsForModel(targetModelId=``){return(currentModelEngine.value?.agents||[]).filter(agent=>[`all`,`primary`].includes(agent.mode)&&(!agent.modelProviderId||agent.modelProviderId===modelProviderId.value)&&(!agent.modelId||agent.modelId===targetModelId))}const compatibleAgents=computed(()=>agentsForModel(modelId.value));const selectedAgent=computed(()=>compatibleAgents.value.find(agent=>agent.id===agentId.value)||null);const variantRows=computed(()=>[{id:``,label:`Default`},...selectedModel.value?.variants||[]]);const selectionRevision=computed(()=>String(catalog.value?.modelEngine.value?.revision||``));const draftSelection=computed(()=>({agentId:agentId.value,catalogRevision:selectionRevision.value,engineId:engineId.value,modelId:modelId.value,modelProviderId:modelProviderId.value,variantId:variantId.value}));const selectionChanged=computed(()=>{const current=assistantSelection.value||{};return[`agentId`,`engineId`,`modelId`,`modelProviderId`,`variantId`].some(field=>String(current[field]||``)!==String(draftSelection.value[field]||``))});const canSave=computed(()=>Boolean(!props.changesDisabled&&(selectionChanged.value||routingMode.value!==`custom`)&&selectedProvider.value&&selectedModel.value&&selectedAgent.value&&selectionRevision.value&&!catalogLoading.value&&!catalogError.value&&!modelAccessUpdating.value));const updateCommand=useCommand({access:`never`,apiSuffix:VIBE64_SESSIONS_API_SUFFIX,buildCommandOptions:(_model,{context})=>({method:`PATCH`,path:String(context?.path||``)}),buildRawPayload:(_model,{context})=>vibe64RealtimeOriginPayload({assistantSelection:context?.assistantSelection||{}}),fallbackRunError:`AI session choices could not be updated.`,suppressSuccessMessage:true,onRunSuccess(response){if(response?.ok===false)throw new Error(response.error||`The custom model could not be saved.`)},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.sessions.assistant-selection.update`,surfaceId:`app`,writeMethod:`PATCH`});const modelAccessCommand=useCommand({access:`never`,apiSuffix:VIBE64_ASSISTANT_MODEL_ACCESS_API_SUFFIX,buildCommandOptions:(_model,{context})=>({method:`PATCH`,path:String(context?.path||``)}),buildRawPayload:(_model,{context})=>({engineId:String(context?.engineId||``),modelProviderId:String(context?.modelProviderId||``),unlocked:context?.unlocked===true}),fallbackRunError:`Provider model access could not be changed.`,messages:{error:`Provider model access could not be changed.`,success:`Provider model access updated.`},ownershipFilter:ROUTE_VISIBILITY_PUBLIC,placementSource:`vibe64.assistants.model-access.update`,surfaceId:`app`,writeMethod:`PATCH`});function hydrateSelection(){const selection=assistantSelection.value||{};engineId.value=String(selection.engineId||``);modelProviderId.value=String(selection.modelProviderId||``);modelId.value=String(selection.modelId||``);agentId.value=String(selection.agentId||``);variantId.value=String(selection.variantId||``)}async function reloadCatalog(){await Promise.all([connections.reload(),catalog.value?.reload()])}function selectEngine(value){if(props.changesDisabled||value===engineId.value)return;engineId.value=value;modelProviderId.value=``;modelId.value=``;agentId.value=``;variantId.value=``}function selectModel(key){if(props.changesDisabled)return;const model=modelRows.value.find(row=>row.key===key);if(!model||model.key===modelKey.value)return;modelProviderId.value=model.modelProviderId;modelId.value=model.id;agentId.value=``;variantId.value=``}function selectVariant(value=``){if(props.changesDisabled)return;variantId.value=String(value||``)}function selectionForModel(model=null){if(!model||model.status!==`available`||!selectionRevision.value)return null;const agents=agentsForModel(model.id);const agent=agents.find(candidate=>candidate.id===selectedOverviewEngine.value?.defaults?.agentId)||agents[0]||null;if(!agent)return null;const requestedVariantId=String(agent.variantId||``);const variants=Array.isArray(model.variants)?model.variants:[];return{agentId:agent.id,catalogRevision:selectionRevision.value,engineId:engineId.value,modelId:model.id,modelProviderId:modelProviderId.value,variantId:variants.some(variant=>variant.id===requestedVariantId)?requestedVariantId:``}}function openConnectionSettings(){if(props.changesDisabled)return;menuOpen.value=false;requestVibe64AccountConnectionsDialog({section:`ai`})}async function applySelection(selection,{closeMenu=true}={}){const sessionId=String(props.session?.sessionId||``).trim();const sessionsPath=String(readRefOrGetterValue(props.sessionsApiPath)||``).trim();if(props.changesDisabled||!selection||!props.saveSelection&&(!sessionId||!sessionsPath)||saving.value)return null;saving.value=true;saveError.value=``;try{const response=props.saveSelection?await props.saveSelection(selection):await updateCommand.run({assistantSelection:selection,path:vibe64SessionPath(sessionsPath,sessionId,`/assistant-selection`)});if(response?.ok===false)throw new Error(response.error||`The custom model could not be saved.`);if(response?.ok!==false){emit(`saved`);modelId.value=selection.modelId;agentId.value=selection.agentId;variantId.value=selection.variantId;if(closeMenu)menuOpen.value=false}return response}catch(error){saveError.value=error.message||`The custom model could not be saved.`;reloadCatalog().catch(()=>{});return{ok:false,error:saveError.value}}finally{saving.value=false}}async function save(){if(!canSave.value)return;await applySelection(draftSelection.value)}async function restoreRecommendedModel({closeMenu=true}={}){return applySelection(selectionForModel(recommendedModel.value),{closeMenu})}function requestModelAccessChange(unlocked){if(props.changesDisabled||!props.canConfigure||modelAccessUpdating.value||saving.value)return;if(unlocked===true){unlockConfirmOpen.value=true;return}updateModelAccess(false)}async function confirmUnlockModelAccess(){unlockConfirmOpen.value=false;await updateModelAccess(true)}async function updateModelAccess(unlocked){const providerId=String(modelProviderId.value||``).trim();const path=vibe64AssistantModelAccessPath(connections.apiPath.value);if(!props.canConfigure||props.changesDisabled||!providerId||!path||!modelAccess.value.configurable||modelAccessUpdating.value)return null;modelAccessUpdating.value=true;try{const current=assistantSelection.value||{};if(unlocked!==true&¤t.modelProviderId===providerId&&recommendedModel.value&¤t.modelId!==recommendedModel.value.id){const recovery=await restoreRecommendedModel({closeMenu:false});if(recovery?.ok===false||!recovery)return recovery;await nextTick$1()}const response=await modelAccessCommand.run({engineId:engineId.value,modelProviderId:providerId,path,unlocked:unlocked===true});if(response?.ok!==false)await catalog.value?.reload();return response}finally{modelAccessUpdating.value=false}}watch(()=>JSON.stringify(assistantSelection.value),hydrateSelection,{immediate:true});watch(menuOpen,open=>{if(open){hydrateSelection();saveError.value=``}});watch([menuOpen,engineRows,connections.overview.isInitialLoading],([open,rows,loading])=>{if(!open||loading||rows.some(row=>row.engineId===engineId.value))return;if(rows.length)selectEngine(rows[0].engineId)});watch([menuOpen,modelRows,catalogLoading],([open,models,loading])=>{if(!open||loading||models.some(model=>model.key===modelKey.value))return;const defaults=currentModelEngine.value?.defaults;const preferred=models.find(model=>model.modelProviderId===defaults?.modelProviderId&&model.id===defaults?.modelId);if(preferred||models[0])selectModel((preferred||models[0]).key)});watch([compatibleAgents,modelKey],([agents])=>{if(!menuOpen.value)return;if(!agents.some(agent=>agent.id===agentId.value))agentId.value=agents.find(agent=>agent.id===selectedOverviewEngine.value?.defaults?.agentId)?.id||agents[0]?.id||``},{immediate:true});watch([selectedModel,selectedAgent],([model,agent])=>{if(!menuOpen.value||!model)return;const fixedVariant=String(agent?.variantId||``);if(fixedVariant)variantId.value=fixedVariant;else if(variantId.value&&!model.variants.some(variant=>variant.id===variantId.value))variantId.value=``},{immediate:true});return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(VDialog,{modelValue:menuOpen.value,"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>menuOpen.value=$event),"max-width":`34rem`,scrollable:``,persistent:saving.value,"aria-label":`Custom AI`,onAfterLeave:_cache[3]||(_cache[3]=$event=>__props.target?.focus())},{default:withCtx(()=>[createVNode(VCard,{rounded:`xl`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`pt-5 px-6`},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(`Custom AI`,-1)])]),_:1}),createVNode(VCardText,{class:`d-flex flex-column ga-4`},{default:withCtx(()=>[saveError.value?(openBlock(),createBlock(VAlert,{key:0,type:`error`,variant:`tonal`,density:`compact`},{default:withCtx(()=>[createTextVNode(toDisplayString(saveError.value),1)]),_:1})):createCommentVNode(``,true),savedProviderUnavailable.value?(openBlock(),createElementBlock(`p`,_hoisted_1$27,` This conversation's saved AI connection is unavailable. Choose an available model and Apply to reconnect. `)):createCommentVNode(``,true),catalogError.value?(openBlock(),createBlock(VAlert,{key:2,type:`error`,variant:`tonal`,density:`compact`},{default:withCtx(()=>[createTextVNode(toDisplayString(catalogError.value)+` `,1),createVNode(VBtn,{variant:`text`,onClick:reloadCatalog},{default:withCtx(()=>[..._cache[7]||(_cache[7]=[createTextVNode(`Retry`,-1)])]),_:1})]),_:1})):createCommentVNode(``,true),createVNode(VSelect,{label:`Orchestrator`,items:engineRows.value,"item-title":`label`,"item-value":`engineId`,"model-value":engineId.value,disabled:__props.changesDisabled||saving.value||unref(connections).overview.isInitialLoading.value,"hide-details":``,variant:`outlined`,"onUpdate:modelValue":selectEngine},null,8,[`items`,`model-value`,`disabled`]),catalogLoading.value?(openBlock(),createBlock(VSkeletonLoader,{key:3,type:`list-item-two-line@2`})):(openBlock(),createElementBlock(Fragment,{key:4},[createVNode(VAutocomplete,{label:`Model`,items:modelRows.value,"item-title":`label`,"item-value":`key`,"model-value":selectedModel.value?modelKey.value:null,disabled:__props.changesDisabled||saving.value,"hide-details":``,variant:`outlined`,"no-data-text":`No model is available yet`,"persistent-placeholder":``,placeholder:`None`,"onUpdate:modelValue":selectModel},null,8,[`items`,`model-value`,`disabled`]),createVNode(VSelect,{label:`Thinking`,items:variantRows.value,"item-title":`label`,"item-value":`id`,"model-value":variantId.value,disabled:__props.changesDisabled||saving.value||Boolean(selectedAgent.value?.variantId),"hide-details":``,variant:`outlined`,"onUpdate:modelValue":selectVariant},null,8,[`items`,`model-value`,`disabled`])],64)),modelAccess.value.configurable&&!modelAccess.value.managementOnly&&!modelAccessUnlocked.value?(openBlock(),createElementBlock(`small`,_hoisted_2$22,[createVNode(VIcon,{icon:unref(mdiLockOutline),size:`14`},null,8,[`icon`]),_cache[8]||(_cache[8]=createTextVNode(` Additional paid models are hidden until they are enabled. `,-1))])):createCommentVNode(``,true),modelAccess.value.configurable&&!modelAccess.value.managementOnly?(openBlock(),createElementBlock(`section`,_hoisted_3$21,[createBaseVNode(`div`,_hoisted_4$15,toDisplayString(selectedProvider.value?.label||`Provider`)+` access`,1),createVNode(VSheet,{class:normalizeClass([`vibe64-session-assistant-menu__access`,{"vibe64-session-assistant-menu__access--paid":modelAccessUnlocked.value}]),rounded:`lg`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_5$15,[createVNode(VAvatar,{color:modelAccessUnlocked.value?`warning`:`success`,size:`36`,variant:`tonal`},{default:withCtx(()=>[createVNode(VIcon,{icon:modelAccessUnlocked.value?unref(mdiCreditCardOutline):unref(mdiShieldCheckOutline),size:`19`},null,8,[`icon`])]),_:1},8,[`color`]),createBaseVNode(`span`,null,[createBaseVNode(`strong`,null,toDisplayString(modelAccessUnlocked.value?`Paid models unlocked`:`Free-only mode`),1),createBaseVNode(`small`,null,toDisplayString(modelAccessUnlocked.value?`Other ${selectedProvider.value?.label||`provider`} models can consume API credit.`:`${recommendedModel.value?.label||`The recommended model`} stays available without paid credit.`),1)])]),createVNode(VSwitch,{color:`primary`,disabled:__props.changesDisabled||!__props.canConfigure||modelAccessUpdating.value||saving.value,"hide-details":``,inset:``,label:modelAccessUpdating.value?modelAccessPendingLabel.value:modelAccess.value.label,"model-value":modelAccessUnlocked.value,onClick:_cache[0]||(_cache[0]=withModifiers($event=>requestModelAccessChange(!modelAccessUnlocked.value),[`prevent`]))},null,8,[`disabled`,`label`,`model-value`]),canRestoreRecommendedModel.value?(openBlock(),createBlock(VBtn,{key:0,block:``,color:`primary`,disabled:__props.changesDisabled||saving.value||modelAccessUpdating.value,size:`small`,type:`button`,variant:`tonal`,onClick:restoreRecommendedModel},{default:withCtx(()=>[createTextVNode(toDisplayString(saving.value?`Switching to ${recommendedModel.value.label}…`:`Use ${recommendedModel.value.label}`),1)]),_:1},8,[`disabled`])):createCommentVNode(``,true)]),_:1},8,[`class`])])):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,{class:`px-6 pb-5 flex-wrap`},{default:withCtx(()=>[__props.canConfigure?(openBlock(),createBlock(VBtn,{key:0,disabled:__props.changesDisabled||saving.value,variant:`text`,onClick:openConnectionSettings},{default:withCtx(()=>[..._cache[9]||(_cache[9]=[createTextVNode(`Configure more AIs`,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true),createVNode(VSpacer),createVNode(VBtn,{disabled:saving.value,variant:`text`,onClick:_cache[1]||(_cache[1]=$event=>menuOpen.value=false)},{default:withCtx(()=>[..._cache[10]||(_cache[10]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:!canSave.value||saving.value,"aria-busy":saving.value?`true`:void 0,color:`primary`,variant:`flat`,onClick:save},{default:withCtx(()=>[createTextVNode(toDisplayString(saving.value?`Applying…`:`Apply`),1)]),_:1},8,[`disabled`,`aria-busy`])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`persistent`]),createVNode(VDialog,{modelValue:unlockConfirmOpen.value,"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>unlockConfirmOpen.value=$event),"max-width":`31rem`,persistent:``},{default:withCtx(()=>[createVNode(VCard,{rounded:`xl`},{default:withCtx(()=>[createVNode(VCardItem,{class:`vibe64-session-assistant-menu__confirm-header`},{prepend:withCtx(()=>[createVNode(VAvatar,{color:`warning`,size:`44`,variant:`tonal`},{default:withCtx(()=>[createVNode(VIcon,{icon:unref(mdiCreditCardOutline),size:`23`},null,8,[`icon`])]),_:1})]),default:withCtx(()=>[createVNode(VCardTitle,null,{default:withCtx(()=>[createTextVNode(toDisplayString(modelAccess.value.label||`Unlock provider models`)+`?`,1)]),_:1}),createVNode(VCardSubtitle,{class:`vibe64-session-assistant-menu__confirm-subtitle`},{default:withCtx(()=>[createTextVNode(toDisplayString(recommendedModel.value?.label||`The recommended model`)+` stays available either way. `,1)]),_:1})]),_:1}),createVNode(VCardText,{class:`text-body-medium`},{default:withCtx(()=>[createTextVNode(toDisplayString(modelAccess.value.warning||`These models may consume paid provider credit.`),1)]),_:1}),createVNode(VCardActions,{class:`vibe64-session-assistant-menu__confirm-actions`},{default:withCtx(()=>[createVNode(VBtn,{disabled:modelAccessUpdating.value,type:`button`,variant:`text`,onClick:_cache[4]||(_cache[4]=$event=>unlockConfirmOpen.value=false)},{default:withCtx(()=>[..._cache[11]||(_cache[11]=[createTextVNode(` Keep free only `,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{color:`warning`,disabled:modelAccessUpdating.value,type:`button`,variant:`flat`,onClick:confirmUnlockModelAccess},{default:withCtx(()=>[..._cache[12]||(_cache[12]=[createTextVNode(` Unlock paid models `,-1)])]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`modelValue`])],64)}}};var Vibe64SessionAssistantMenu_default=_plugin_vue_export_helper_default(_sfc_main$45,[[`__scopeId`,`data-v-f014d071`]]);function selectionLabels(catalog,selection){const engine=(catalog?.engines||[]).find(item=>item?.engineId===selection.engineId);const model=(engine?.modelProviders||[]).find(provider=>provider.id===selection.modelProviderId)?.models?.find(item=>item.id===selection.modelId);return{engineLabel:engine?.label||selection.engineId,modelLabel:model?.label||selection.modelId}}var COLLEAGUE_FOCUS_UPDATE=`vibe64.colleague.focus.update`;var COLLEAGUE_FOCUS_RELEASE=`vibe64.colleague.focus.release`;function createColleagueFocusBinding({socket,readFocus,onError}){let closed=false;let revision=0;function update(){const expected=++revision;if(closed||!socket.connected)return;socket.timeout(1e4).emit(COLLEAGUE_FOCUS_UPDATE,readFocus(),(error,result)=>{if(closed||expected!==revision)return;if(error||result?.ok!==true)onError(error?.message||result?.error||`Colleague could not update this browser's focus.`)})}function disconnected(){revision+=1}function release(){revision+=1;if(socket.connected)socket.emit(COLLEAGUE_FOCUS_RELEASE,{clientId:readFocus().clientId})}socket.on(`connect`,update);socket.on(`disconnect`,disconnected);return{update,release,close(){closed=true;revision+=1;socket.off(`connect`,update);socket.off(`disconnect`,disconnected);release()}}}function createColleagueNavigation({scope,navigate,beforeNavigate,acknowledge,error}){let navigating=null;let navigationReceipt=null;async function handle(command){if(navigating||command?.status!==`pending`||!navigate())return;navigating=command.id;const expectedActor=scope().actorKey;try{const before=beforeNavigate(command);if(before)await before;if(navigationReceipt?.commandId!==command.id){let receipt;try{const result=await navigate()(command);receipt={commandId:command.id,clientId:scope().clientId,ok:true,...command.guide?{...result.focus?{focus:result.focus}:{},guide:result.guide}:{focus:result}}}catch(error){receipt={commandId:command.id,clientId:scope().clientId,ok:false,error:error.message}}if(!scope().mounted||expectedActor!==scope().actorKey)return;navigationReceipt=receipt}if(!scope().mounted||expectedActor!==scope().actorKey)return;await acknowledge(navigationReceipt)}catch(cause){if(scope().mounted&&expectedActor===scope().actorKey)error.value=cause.message}finally{if(expectedActor===scope().actorKey)navigating=null}}function reset(){navigationReceipt=null;navigating=null}return{handle,reset}}function watchColleagueLearningRequests({learning,actorKey,reveal,send,report}){if(!learning?.colleagueRequest||typeof learning.consumeColleagueRequest!==`function`)return()=>{};let running=``;return watch(()=>learning.colleagueRequest.value,async request=>{if(!request?.id||running===request.id)return;if(request.actorKey&&request.actorKey!==actorKey())return;running=request.id;try{const value=learning.consumeColleagueRequest(request.id);if(!value)return;if(await reveal()===false)return;if(value.kind===`open`)return;if(await send(value.message)===false)throw new Error(value.kind===`stuck`?`Colleague could not receive I'm stuck. Open Colleague and tell it where you are stuck.`:`Colleague could not receive Teach me. Open Colleague and ask it to teach this step.`)}catch(error){report(error)}finally{if(running===request.id)running=``}},{immediate:true})}function learningPanelMatches(command,focus){const learning=command.learning;if(!learning)return true;if(typeof learning.open===`boolean`)return focus?.learningOpen===true===learning.open;return focus?.learningOpen!==true&&focus?.pane===`lesson`&&focus.learningAttemptId===learning.attemptId&&(!learning.stepId||focus.learningStepId===learning.stepId)}var read=value=>value?.__v_isRef===true?value.value:value;function learningPanelFocus(controller){if(!controller)return{};const learningOpen=read(controller.coursesOpen)===true;const surface=read(controller.surface);const attemptId=read(controller.lessonAttemptId)??read(controller.mode)?.currentAttemptId;const stepId=read(controller.stepId);const beat=read(controller.player?.beats)?.length?read(controller.player.index):void 0;return{learningOpen,...learningOpen&&[`courses`,`progress`,`archived`].includes(surface)?{learningSurface:surface}:{},...attemptId?{learningAttemptId:attemptId,...stepId?{learningStepId:stepId,...Number.isSafeInteger(beat)?{learningBeat:beat}:{}}:{}}:{}}}async function applyLearningNavigation(controller,learning){if(!controller)throw new Error(`Courses is unavailable in this view.`);const{open,attemptId,stepId}=learning;if(open===true)await controller.show();else if(open===false)await controller.minimise();else await controller.openLesson({attemptId,...stepId?{stepId}:{}})}var _hoisted_1$26={class:`vibe64-colleague__launcher-avatar`};var _hoisted_2$21=[`aria-label`];var _hoisted_3$20={class:`vibe64-colleague__drawer`};var _hoisted_4$14={class:`vibe64-colleague__drawer-header`};var _hoisted_5$14={class:`text-title-large`};var _hoisted_6$10=[`aria-label`];var _hoisted_7$9={key:0,class:`vibe64-colleague__nudge`};var _hoisted_8$9={key:0,"data-test":`colleague-teach-needs-model`};var _hoisted_9$7={key:1};var _hoisted_10$7={class:`vibe64-colleague__conversation`};var _hoisted_11$7={key:0,role:`img`,"aria-label":`Listening`,title:`Listening`,class:`d-inline-flex align-center text-primary`};var _hoisted_12$7={key:1,role:`img`,"aria-label":`Speaking`,title:`Speaking`,class:`d-inline-flex align-center text-primary`};var _hoisted_13$7={class:`vibe64-colleague__composer-region`};var _hoisted_14$7={key:0,class:`text-body-small text-error`,role:`alert`};var _hoisted_15$7=[`title`];var _hoisted_16$6={class:`vibe64-colleague__composer-actions`};var _hoisted_17$6={class:`ms-1`};var _hoisted_18$6={class:`vibe64-colleague__delivery`};var _hoisted_19$5={class:`vibe64-colleague__watch-badge`,"aria-hidden":`true`};var _hoisted_20$5={key:0,class:`vibe64-colleague__watch-card`,"aria-label":`Watches`};var _hoisted_21$5={class:`text-title-medium`};var _hoisted_22$5=[`data-status`];var _hoisted_23$5={key:0,class:`text-error`};var _hoisted_24$4={class:`d-flex flex-wrap ga-1`};var _hoisted_25$3={key:1,class:`vibe64-colleague__watch-card`,"aria-label":`Ongoing assignments`};var _hoisted_26$2={class:`text-title-medium`};var _hoisted_27$2={key:2,class:`vibe64-colleague__watch-empty`,role:`status`};var _hoisted_28$2={key:0};var _hoisted_29$2={key:0};var _hoisted_30$2={key:1,class:`text-error`};var _hoisted_31$2={class:`d-flex flex-wrap ga-1`};var _hoisted_32$2={key:0,role:`status`};var _hoisted_33$2={key:1,role:`alert`};var _hoisted_34$2={class:`vibe64-colleague__history`};var _hoisted_35$1={key:0,role:`alert`};var _hoisted_36$1={key:0,role:`status`};var _hoisted_37$1={key:1};var _hoisted_38$1={key:0};var _sfc_main$44={__name:`Vibe64Colleague`,props:{name:{type:String,default:`Colleague`},holdToTalk:Boolean,request:{type:Function,required:true},navigate:{type:Function,default:null},focus:{type:Object,default:()=>({})}},emits:[`message-submit`,`voice-visual`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const open=ref(false);const{xs}=useDisplay();const voice=useVibe64Voice();const isColleagueBinding=binding=>binding?.socketUrl===COLLEAGUE_VOICE_SOCKET_URL;const inlineVoice=computed(()=>voice?.controller.state.binding?.presentation===`inline`&&!isColleagueBinding(voice.controller.state.binding)&&!voice.controller.state.nextTarget);const shown=computed(()=>open.value||Boolean(voice?.controller.state.visible&&!inlineVoice.value));const minimizedVoice=computed(()=>Boolean(voice?.controller.state.session&&!shown.value&&!inlineVoice.value));const listeningVoice=computed(()=>Boolean(minimizedVoice.value&&voice.controller.state.session.voice.listening.value&&!voice.controller.state.session.microphoneMuted.value));const viewer=inject$1(VIBE64_ASSISTANT_VIEWER_KEY,{actorKey:`local`});const voiceTranscript=ref(null);const companionView=inject$1(VIBE64_COLLEAGUE_VIEW_KEY,null);const pageActivity=inject$1(VIBE64_PAGE_ACTIVITY_KEY,null);watch(shown,(value,was)=>{if(value!==was)pageActivity?.report(value?`colleague-opened`:`colleague-minimised`,{projectSlug:props.focus?.projectSlug})});const learningOwner=inject$1(VIBE64_LEARNING_KEY,null);const learningController=computed(()=>unref(learningOwner)||null);const learningStep=computed(()=>{const controller=learningController.value;const mode=unref(controller?.mode);const attemptId=mode?.on===true?unref(controller.lessonAttemptId)??mode.currentAttemptId:``;const stepId=unref(controller?.stepId);const lesson=unref(controller?.lesson);const steps=Array.isArray(lesson?.steps)?lesson.steps:[];const index=steps.findIndex(step=>step?.id===stepId);if(!attemptId||!stepId||index<0||lesson.attempt?.ended)return null;const results=unref(controller.results);const passed=Array.isArray(lesson?.passedStepIds)&&lesson.passedStepIds.includes(stepId)||Array.isArray(results)&&results.some(result=>result?.stepId===stepId&&result.outcome===`passed`);return{attemptId,stepId,lessonTitle:String(lesson.title||``),title:String(steps[index].title||``),position:index+1,total:steps.length,passed}});const stepButton=computed(()=>learningStep.value&&{class:[`vibe64-colleague__step-button`,{"vibe64-colleague__step-button--passed":learningStep.value.passed}],variant:`flat`,rounded:`pill`,height:32,"data-test":`colleague-current-step`,"aria-label":`Show the current lesson step: ${learningStep.value.title}`,title:`Current lesson step: ${learningStep.value.title}`});function showLearningStep(){const step=learningStep.value;const controller=learningController.value;if(!step||typeof controller?.openLesson!==`function`)return;const show=()=>applyLearningNavigation(controller,{attemptId:step.attemptId,stepId:step.stepId});if(xs.value&&shown.value)toggleConversation().then(show).catch(reportFailure);else Promise.resolve(show()).catch(reportFailure)}let returnFromLearning=false;function leaveForLearning(){returnFromLearning=true;return toggleConversation()}function reopenConversation(){if(shown.value)return;if(voice?.controller.state.session&&!inlineVoice.value&&!staleVoice.value)voice.controller.reveal();else open.value=true}watch(()=>unref(learningController.value?.coursesOpen)===true,(learningOpen,wasOpen)=>{if(learningOpen||!wasOpen)return;const back=returnFromLearning&&learningController.value?.hiddenBy===`learner`;returnFromLearning=false;if(back&&xs.value)reopenConversation()});const{holding:holdingAvatar,pointerDown:startAvatarPress,pointerUp:endAvatarPress,cancel:cancelAvatarPress,click:avatarClick}=useVoiceLauncher({open:openVoice,enabled:()=>props.holdToTalk&&!shown.value&&!voice?.controller.state.session,onError:reportFailure});async function toggleConversation(){const opening=!shown.value;if(shown.value){voice?.controller.minimize();open.value=false;launcher.value?.$el?.focus()}else if(voice?.controller.state.session&&!inlineVoice.value&&!staleVoice.value)voice.controller.reveal();else if(voice){open.value=true;await openVoice()}else open.value=true;if(opening&&bodyVisible.value)await focusConversationComposer()}async function openVoice(){if(!voice||freshOperation.value||freshBusy.value)return false;if(!conversation.runtime.value)await refresh();const target=conversation.runtime.value;if(!target)throw new Error(connectionError.value||`Colleague is not connected yet. Try again.`);let retained;const binding={preferenceTarget:`colleague`,presentation:`inline`,id:JSON.stringify([`colleague`,target.identity.actorKey]),conversationId:target.identity.conversationId,get label(){return props.name},get state(){return projectConversationVoiceState({turns:target.turns.value,status:target.snapshot.value?.status,interimReply:target.snapshot.value?.interimReply})},get available(){return mounted&&target.current.value},get adapter(){return conversation.runtime.value===target?adapter.value:null},setConversationTarget(element){voicePanelTarget.value=element},retain(){retained=target.retain()},release(){retained?.release();retained=null},socketUrl:COLLEAGUE_VOICE_SOCKET_URL,captureContext:()=>({...props.focus}),submitText(text,{messageId,context}){return sendMessage(text,{messageId,focus:context||{}},target)},cancelWork:()=>target.cancel(),onTranscript(value,{canTake=false}={}){if(mounted&&conversation.runtime.value===target)voiceTranscript.value=value?{...value,canTake}:null},onVisual(value){emit(`voice-visual`,value)},onError:reportFailure};const opened=await voice.open(binding);if(!mounted||conversation.runtime.value!==target)return false;open.value=false;if(opened)return voice.controller.state.session;return false}async function closeText(){try{if(voice?.controller.state.session)await voice.controller.end({discard:true});open.value=false;launcher.value?.$el?.focus()}catch(error){reportFailure(error)}}const launcherTarget=inject$1(VIBE64_COLLEAGUE_LAUNCHER_KEY,null);const launcher=ref(null);const composerInput=ref(null);async function focusConversationComposer(){await nextTick$1();composerInput.value?.focus?.({preventScroll:true})}const panelTarget=ref(null);const desktopPanelTarget=ref(null);const conversationTarget=computed(()=>xs.value?panelTarget.value:desktopPanelTarget.value);const voicePanelTarget=ref(null);const voiceToolsTarget=ref(null);const avatarSize=ref(`compact`);const product=ref({conversationId:``,error:``});const productError=ref(``);const pointerNotice=ref(``);const actorKey=computed(()=>viewer?.value?.actorKey||viewer?.actorKey||``);const feedback=useShellWebErrorRuntime();const watchDetails=ref(false);const watchButton=ref(null);const operationDetails=ref(false);const operationButton=ref(null);const modelMenu=ref(false);const modelButton=ref(null);const sendButton=ref(null);const clientId=crypto.randomUUID();const working=computed(()=>conversation.runtime.value?.snapshot.value?.status===`working`);const watches=computed(()=>(product.value.watches||[]).filter(item=>!item.assignmentId&&[`active`,`pending`,`paused`].includes(item.status)));const operations=computed(()=>product.value.operations||(product.value.operation?[product.value.operation]:[]));const assignments=computed(()=>(product.value.assignments||[]).filter(item=>[`active`,`waiting`,`needs-user`].includes(item.status)));const watchControlCount=computed(()=>watches.value.length+assignments.value.length);let mounted=true;let revision=0;function reportFailure(error){const message=String(error?.message||error||`Colleague could not complete this request.`);feedback.report({source:`vibe64.colleague`,intent:`action-feedback`,severity:`error`,message,dedupeKey:`vibe64.colleague:${message}`,dedupeWindowMs:1e3})}async function requestColleague(suffix=``,options={}){const result=await props.request(`/api/vibe64/colleague${suffix}`,options);if(result?.ok===false)throw new Error(result.error||result.errors?.[0]?.message||`Colleague could not complete this request.`);return result}function apply(result,expectedRevision,expectedActor,allowRetarget=false){if(!mounted||expectedRevision!==revision||expectedActor!==actorKey.value)return false;const runtime=conversation.runtime.value;const changingConversation=Boolean(product.value.conversationId&&result.conversationId&&product.value.conversationId!==result.conversationId);const changingThread=Boolean(product.value.thread&&result.thread&&(product.value.thread.kind!==result.thread.kind||product.value.thread.attemptId!==result.thread.attemptId));if(changingConversation&&!changingThread&&runtime?.current.value&&runtime.identity.actorKey===expectedActor){if(voiceSession.value?.hasUnsentSpeech.value||pointerNotice.value&&!allowRetarget){pointerNotice.value=`Colleague changed in another tab. Resolve the old speech first: pause the microphone and discard newer words, or explicitly Stop voice chat. Then choose Refresh conversation. Your typed draft stays unsent.`;return false}}const savedDraft=changingConversation&&!changingThread&&runtime?.current.value&&runtime.identity.actorKey===expectedActor?runtime.draft.value:null;const{conversationId,thread,assistantSelection,watches,assignments,navigation,operation,operations,modelSetupRequired,error}=result;product.value={conversationId,thread,assistantSelection,watches,assignments,navigation,operation,operations,modelSetupRequired,error};if(savedDraft!==null&&actorKey.value===expectedActor)conversation.adapter.value.actions.setDraft(savedDraft);pointerNotice.value=``;handleNavigation(navigation);return true}async function navigateBrowser(command){const controller=learningController.value;if((command.projectSlug||command.route||command.guide&&command.guide.target!==`learning`)&&!command.learning&&unref(controller?.coursesOpen)&&typeof controller.minimise===`function`)await applyLearningNavigation(controller,{open:false});if(!command.guide)return props.navigate(command);return runTrainingGuideCommand(command,{navigateBrowser:props.navigate,view:{openFile(path){const view=companionView?.value;return view?.projectSlug===command.projectSlug&&view.sessionId===command.sessionId&&typeof view.openFile===`function`&&view.openFile(path)===true}}})}const colleagueNavigation=createColleagueNavigation({scope:()=>({mounted,actorKey:actorKey.value,clientId}),navigate:()=>props.navigate?navigateBrowser:null,beforeNavigate(command){if(xs.value&&shown.value&&typeof command.learning?.open===`boolean`)return leaveForLearning();if(xs.value&&shown.value&&command.learning)return toggleConversation();if(xs.value&&shown.value&&command.guide)return toggleConversation()},acknowledge:body=>requestColleague(`/navigation/ack`,{method:`POST`,body}),error:productError});const handleNavigation=colleagueNavigation.handle;const realtimeSocket=useRealtimeSocket();const api=createAssistantApi({request:(url,options)=>props.request(url,options),resolveBasePath:()=>`/api/assistant/app`,resolveSurfaceId:()=>`app`});const nativeApplicationAdmission=snapshot=>[`codex`,`claude`,`opencode`].includes(snapshot?.engine);const conversation=useAssistantConversation({conversationId:()=>product.value.conversationId,actorKey,surfaceId:`app`,hostSurfaceId:`app`,workspaceSlug:``,socket:realtimeSocket,api:{...api,sendConversationMessage(id,input){emit(`message-submit`,input.messageId);const activeVoice=voice?.controller.state;if(isColleagueBinding(activeVoice?.binding))activeVoice.session.inviteSpeech(input.messageId);return api.sendConversationMessage(id,input)}},clearDraftOn:`accepted`,queueWhileSending:true,admitWhileWorking:nativeApplicationAdmission,deferWhileWorking:snapshot=>!nativeApplicationAdmission(snapshot),draftWhileLoading:true,draftStorage:()=>{try{const storage=typeof window!==`undefined`?window.sessionStorage:null;return storage&&actorKey.value&&product.value.conversationId?{storage,key:`vibe64:colleague-composer:v1:${JSON.stringify([actorKey.value,product.value.conversationId])}`}:null}catch{return null}},data:()=>({clientId,focus:{...props.focus}}),onEvent(event){if(event.type===`application`){conversation.runtime.value?.reload();refresh()}},presentation:()=>({assistantLabel:props.name,systemLabel:`Vibe64`,variant:`task`,visible:open.value,userMessageFormat:`plain`,progressPreviewLimit:0,welcomeMessage:product.value.thread?.kind===`learn`?`I'm your teacher here. Ask me about a lesson, or press Teach me on a step.`:`Let's think it through. I can discuss an idea, check on your agents, or help you operate Vibe64.`,previewMessage:voicePreview.value,ariaLabel:`Message ${props.name}`,placeholder:`Talk it through with ${props.name}…`,rows:1,layout:`compact`,submitAriaLabel:conversation.runtime.value?.steerable.value?`Steer ${props.name}`:`Send to ${props.name}`,submitLabel:conversation.runtime.value?.steerable.value?`Steer`:`Send`})});const voiceSession=computed(()=>{const state=voice?.controller.state;const identity=conversation.runtime.value?.identity;return isColleagueBinding(state?.binding)&&state.binding.conversationId===identity?.conversationId&&state.binding.id===JSON.stringify([`colleague`,identity?.actorKey])?state.session:null});const staleVoice=computed(()=>isColleagueBinding(voice?.controller.state.binding)&&!voiceSession.value);watch(()=>conversation.runtime.value?.identity.conversationId,(id,previous)=>{if(!id||!previous||!staleVoice.value||!voice.controller.state.visible)return;waitForConversation().then(()=>staleVoice.value&&openVoice()).catch(reportFailure)});function voicePreviewActionsAllowed(messageId){const transcript=voiceTranscript.value;const session=voiceSession.value;const runtime=conversation.runtime.value;const selected=(session?.pendingTranscript.value)?.messageId===messageId||transcript?.id===messageId&&transcript.canTake;const receipt=runtime?.delivery.find?.(messageId);return Boolean(selected&&session&&session.canTakeTranscript(messageId)&&!session.sending.value&&(!receipt||receipt.status===`failed`)&&(!receipt||!runtime?.delivery.state.messages.some(message=>message.status===`uncertain`)))}function selectedVoiceTranscriptSession(messageId){const runtime=conversation.runtime.value;if(!mounted||!runtime?.current.value||!voicePreviewActionsAllowed(messageId))return null;return voiceSession.value}async function takeVoiceTranscript(messageId){const session=selectedVoiceTranscriptSession(messageId);if(!session)return false;const runtime=conversation.runtime.value;if(!await session.takeTranscript(messageId))return false;if(runtime.delivery.find?.(messageId)?.status===`failed`)runtime.delivery.cancel(messageId);return true}async function editVoiceTranscript(messageId){const session=selectedVoiceTranscriptSession(messageId);if(!session)return false;const runtime=conversation.runtime.value;if(!await session.beginTranscriptEdit(messageId))return false;if(runtime.delivery.find?.(messageId)?.status===`failed`)return runtime.delivery.cancel(messageId);return true}function updateVoiceTranscript(messageId,text){const session=selectedVoiceTranscriptSession(messageId);if(session?.pendingTranscript.value?.messageId!==messageId)return false;session.editTranscript(text,messageId);return true}async function sendVoiceTranscript(messageId){const session=selectedVoiceTranscriptSession(messageId);const pending=session?.pendingTranscript.value;if(pending?.messageId!==messageId||!pending.text.trim()||conversation.runtime.value?.delivery.state.messages.some(message=>message.status===`uncertain`))return false;await session.deliverTranscript();return true}const voicePreviews=computed(()=>{const transcript=voiceTranscript.value;const session=voiceSession.value;const pending=session?.pendingTranscript.value;const previews=pending?[{id:pending.messageId,text:pending.text}]:[];if(transcript&&transcript.id!==pending?.messageId)previews.push(transcript);return previews.map(preview=>{const review=pending?.messageId===preview.id;const allowed=voicePreviewActionsAllowed(preview.id);return{...preview,actions:{canDiscard:allowed,canEdit:allowed&&(!pending||review),discard:takeVoiceTranscript,edit:editVoiceTranscript,editing:review&&pending.editing===true,update:updateVoiceTranscript,send:review&&(pending.reviewBeforeSend||!session.sending.value)?sendVoiceTranscript:null,canSend:Boolean(review&&allowed&&!session.sending.value&&pending.text.trim()&&!conversation.runtime.value?.delivery.state.messages.some(message=>message.status===`uncertain`)),sending:Boolean(review&&session.sending.value)}}})});const voicePreview=computed(()=>voicePreviews.value.find(preview=>preview.id===voiceTranscript.value?.id)||voicePreviews.value[0]||null);const bodyVisible=computed(()=>open.value||Boolean((voiceSession.value||staleVoice.value)&&voice.controller.state.visible));const adapter=computed(()=>{const supplied=conversation.adapter.value;return{...supplied,conversation:{...supplied.conversation,reloadable:false,retainWhenHidden:true,visible:bodyVisible.value,previewMessages:voicePreviews.value},composer:{...supplied.composer,canSend:supplied.composer.canSend&&!voiceSession.value?.composerBlocked.value&&!freshOperation.value&&!freshBusy.value}}});const draft=computed({get:()=>adapter.value.composer.draft,set:value=>adapter.value.actions.setDraft(value)});const voiceFeedbackTarget=ref(null);const sending=computed(()=>conversation.runtime.value?.delivery.state.sending===true);const connectionError=computed(()=>productError.value||conversation.runtime.value?.error.value||``);const turnError=computed(()=>conversation.runtime.value?.snapshot.value?.error||product.value.error);const freshConfirm=ref(false);const freshBusy=ref(false);const freshError=ref(``);const freshOperation=shallowRef(null);const freshBlocked=computed(()=>{if(pointerNotice.value)return`Colleague already changed in another tab. Resolve the old speech, then choose Refresh conversation instead of starting another fresh request.`;const runtime=conversation.runtime.value;if(!runtime?.current.value||working.value||sending.value||runtime.stopping.value)return`Wait for the current request or Stop to finish before starting fresh.`;if(voice?.controller.state.busy||voice?.controller.state.nextTarget)return`Finish the pending voice switch before starting fresh.`;const session=voiceSession.value;if(!session)return``;if(session.starting?.value||session.capturing?.value||session.sending.value)return`Pause the microphone, then discard newer unsent speech with its X before starting fresh. You can also explicitly stop voice chat.`;const pending=session.pendingTranscript.value;if(pending&&runtime.delivery.find(pending.messageId)?.status!==`uncertain`)return`Send or discard the reviewed speech before starting fresh.`;return``});function showFreshConfirmation(){closeHistory();freshError.value=``;freshConfirm.value=true}function closeFreshConfirmation(){if(!freshBusy.value)freshConfirm.value=false}function freshScopeCurrent(operation){return mounted&&actorKey.value===operation.actor&&conversation.runtime.value===operation.runtime&&product.value.conversationId===operation.body.expectedConversationId}async function startFresh(){if(freshBusy.value)return false;if(freshBlocked.value){freshError.value=freshBlocked.value;return false}let operation=freshOperation.value;if(!operation){const runtime=conversation.runtime.value;const unconfirmedMessages=runtime.delivery.state.messages.filter(message=>message.status===`uncertain`).map(message=>{const request=message.payload?.request;const data=request?.data||message.payload?.data;return{messageId:message.id,text:request?.text??message.payload?.message,clientId:data?.clientId,...data?.focus?{focus:{...data.focus}}:{}}});if(unconfirmedMessages.length>8||unconfirmedMessages.some(message=>typeof message.text!==`string`||!message.text.trim()||message.text.length>24e3||!message.clientId)){freshError.value=`The original uncertain delivery evidence is incomplete or too large. Check delivery before starting fresh.`;return false}operation={actor:actorKey.value,runtime,session:voiceSession.value,binding:voiceSession.value?voice.controller.state.binding:null,body:{operationId:crypto.randomUUID(),expectedConversationId:product.value.conversationId,unconfirmedMessages}};revision+=1;freshOperation.value=operation}if(!freshScopeCurrent(operation))return false;freshBusy.value=true;freshError.value=``;try{const result=await requestColleague(`/conversations/fresh`,{method:`POST`,body:operation.body});if(!freshScopeCurrent(operation))return false;if(result.fresh?.operationId!==operation.body.operationId||result.fresh.previousConversationId!==operation.body.expectedConversationId||!result.fresh.conversationId||!result.conversationId)throw new Error(`The fresh conversation receipt did not match this request. Retry the same operation.`);if(freshBlocked.value||operation.session&&voice.controller.state.session&&(voice.controller.state.session!==operation.session||voice.controller.state.binding!==operation.binding))throw new Error(freshBlocked.value||`The voice conversation changed. Return to the original conversation before retrying this fresh operation.`);if(operation.session&&voice.controller.state.session===operation.session)await voice.controller.end({discard:true});if(!freshScopeCurrent(operation))return false;if(operation.session&&(voice.controller.state.session||voice.controller.state.busy||voice.controller.state.nextTarget))throw new Error(`Another voice conversation opened during retirement. Resolve it before retrying this fresh operation.`);apply(result,++revision,operation.actor,true);if(mounted&&actorKey.value===operation.actor&&product.value.conversationId===result.conversationId){freshBusy.value=false;freshOperation.value=null;freshConfirm.value=false;productError.value=``;open.value=true;voiceTranscript.value=null;const controller=voice?.controller;if(controller&&!controller.state.session&&!controller.state.binding&&!controller.state.busy&&!controller.state.nextTarget){try{await openVoice()}catch(error){if(mounted&&actorKey.value===operation.actor&&product.value.conversationId===result.conversationId)reportFailure(new Error(`The fresh conversation is ready, but its voice controls could not open. Reopen Colleague to try again. ${error.message}`))}if(!mounted||actorKey.value!==operation.actor||product.value.conversationId!==result.conversationId)return false;open.value=true}return true}return false}catch(error){if(freshScopeCurrent(operation))freshError.value=`${error.message} Nothing was resent. Retry this same fresh operation to check its result.`;return false}finally{if(freshOperation.value===operation)freshBusy.value=false}}const historyOpen=ref(false);const historyLoading=ref(false);const historyError=ref(``);const historyConversations=ref([]);const historyNextOffset=ref(null);const historyHasMore=ref(false);const historyId=ref(``);const historyPages=ref([]);const historyUnconfirmed=ref([]);const historyUnconfirmedDelivery=ref(null);const historyTurns=computed(()=>mergeConversationLogPages(historyPages.value).conversationLog);const historyPagination=computed(()=>historyPages.value[0]?.pagination||{});let historyRevision=0;function closeHistory(){historyRevision+=1;historyOpen.value=false;historyLoading.value=false;historyId.value=``;historyPages.value=[];historyConversations.value=[];historyUnconfirmed.value=[];historyUnconfirmedDelivery.value=null;historyError.value=``}async function loadHistory({more=false}={}){if(historyLoading.value)return;const expectedActor=actorKey.value;const expectedHistory=++historyRevision;historyOpen.value=true;historyId.value=``;historyPages.value=[];historyUnconfirmed.value=[];historyUnconfirmedDelivery.value=null;historyLoading.value=true;historyError.value=``;try{const result=await requestColleague(`/conversations/history?offset=${more?historyNextOffset.value:0}&limit=20`,{method:`GET`});if(!mounted||expectedActor!==actorKey.value||expectedHistory!==historyRevision||!historyOpen.value)return;historyConversations.value=more?[...historyConversations.value,...result.conversations]:result.conversations;historyNextOffset.value=result.nextOffset;historyHasMore.value=result.hasMore}catch(error){if(mounted&&expectedActor===actorKey.value&&expectedHistory===historyRevision)historyError.value=error.message}finally{if(expectedHistory===historyRevision)historyLoading.value=false}}async function readHistoryPage(conversationId,{more=false,complete}={}){if(historyLoading.value){complete?.({changed:false});return}let changed=false;const expectedActor=actorKey.value;const expectedHistory=++historyRevision;const before=more?historyPagination.value.nextBeforeTurnId:``;historyId.value=conversationId;if(!more){historyPages.value=[];historyUnconfirmed.value=[];historyUnconfirmedDelivery.value=null}historyLoading.value=true;historyError.value=``;try{const result=await requestColleague(`/conversations/history/page?conversationId=${encodeURIComponent(conversationId)}&limit=20${before?`&beforeTurnId=${encodeURIComponent(before)}`:``}`,{method:`GET`});if(!mounted||expectedActor!==actorKey.value||expectedHistory!==historyRevision||!historyOpen.value)return;if(result.id!==conversationId||result.readOnly!==true)throw new Error(`The saved conversation response did not match this read-only history.`);historyPages.value=[normalizeConversationLogPage(result),...more?historyPages.value:[]];historyUnconfirmed.value=result.unconfirmedMessages||[];historyUnconfirmedDelivery.value=result.unconfirmedDelivery||null;changed=true}catch(error){if(mounted&&expectedActor===actorKey.value&&expectedHistory===historyRevision)historyError.value=error.message}finally{if(expectedHistory===historyRevision)historyLoading.value=false;complete?.({changed})}}realtimeSocket.on(`connect`,refresh);useRealtimeEvent({event:VIBE64_TRAINING_LEARNER_CHANGED_EVENT,matches:({payload}={})=>[`learning-mode`,`lesson`].includes(payload?.reason),onEvent:()=>{refresh()}});async function refresh(options={}){if(freshOperation.value)return;const expectedRevision=++revision;const expectedActor=actorKey.value;try{apply(await requestColleague(`?clientId=${encodeURIComponent(clientId)}`,{method:`GET`}),expectedRevision,expectedActor,options?.allowRetarget===true);if(mounted&&expectedRevision===revision&&expectedActor===actorKey.value)productError.value=``}catch(error){if(mounted&&expectedRevision===revision&&expectedActor===actorKey.value)productError.value=error.message}}async function sendMessage(message,options={},target=conversation.runtime.value){if(!target?.available.value)return false;return target.send({message,data:{clientId,focus:options.focus}},{messageId:options.messageId})}function waitForConversation(timeoutMs=1e4){return new Promise((resolve,reject)=>{let stop=null;const timer=setTimeout(()=>finish(new Error(connectionError.value||`Colleague is not connected yet. Press Teach me again.`)),timeoutMs);function finish(error,target){clearTimeout(timer);if(stop)stop();else queueMicrotask(()=>stop?.());if(error)reject(error);else resolve(target)}stop=watch(()=>conversation.runtime.value?.available.value?conversation.runtime.value:null,target=>{if(!mounted)finish(new Error(`Colleague left this browser view.`));else if(target)finish(null,target)},{immediate:true})})}const teachNeedsModel=ref(false);async function revealForLearning(){teachNeedsModel.value=false;reopenConversation();await refresh();if(product.value.modelSetupRequired){teachNeedsModel.value=true;return false}await waitForConversation();if(bodyVisible.value)await focusConversationComposer();return true}watch(()=>product.value.modelSetupRequired,required=>{if(!required)teachNeedsModel.value=false});const stopLearningRequests=watchColleagueLearningRequests({learning:learningController.value,actorKey:()=>actorKey.value,reveal:revealForLearning,report:reportFailure,send:async message=>sendMessage(message,{focus:{...props.focus}})});onBeforeUnmount(stopLearningRequests);async function submit(){if(freshOperation.value||freshBusy.value||voiceSession.value?.composerBlocked.value)return;const target=conversation.runtime.value;if(product.value.modelSetupRequired)return;if(!target?.canSubmit.value){if(draft.value.trim()&&connectionError.value)reportFailure(connectionError.value);return}const result=await adapter.value.actions.submit();if((result===false||result?.ok===false)&&target.current.value){const failure=target.delivery.find(target.draftMessageId.value)?.error||target.error.value;await refresh();if(failure&&!product.value.modelSetupRequired)reportFailure(failure)}}async function stop(){const target=conversation.runtime.value;if(await target?.cancel()===false&&target.current.value&&target.error.value)reportFailure(target.error.value)}async function saveSelection(selection,{report=true}={}){if(freshOperation.value||freshBusy.value)return{ok:false,error:`Colleague is busy; try again in a moment.`};const expectedRevision=++revision;const expectedActor=actorKey.value;try{const result=await api.selectConversation(product.value.conversationId,selection);apply(result,expectedRevision,expectedActor);if(mounted&&expectedActor===actorKey.value){productError.value=``;conversation.runtime.value?.reload()}return result}catch(error){if(report&&expectedActor===actorKey.value)reportFailure(error);return{ok:false,error:String(error?.message||error)}}}const selectModel=assistantSelection=>saveSelection({assistantSelection});async function withLabels(selection){try{const query=new URLSearchParams({engineId:selection.engineId,modelProviderId:selection.modelProviderId,allConnectedModels:`true`,connectedOnly:`true`});return{selection,...selectionLabels(await requestColleague(`/models?${query}`,{method:`GET`}),selection)}}catch{return{selection,...selectionLabels(null,selection)}}}async function conversationReady(){if(!product.value.conversationId)await refresh();return Boolean(product.value.conversationId)}const colleagueModel={async current(){await conversationReady();return product.value.assistantSelection?withLabels(product.value.assistantSelection):null},async select(assistantSelection){if(!await conversationReady())return{ok:false,error:productError.value||`Colleague is not ready yet; try again in a moment.`};const result=await saveSelection({assistantSelection},{report:false});const selection=result?.ok===false?null:result?.assistantSelection;if(!selection)return{ok:false,error:result?.error||`Colleague could not switch to this AI.`};return{ok:true,...await withLabels(selection)}},async sayHello(message){if(!await conversationReady())return{ok:false,error:productError.value||`Colleague is not ready yet.`};const target=await waitForConversation();const sent=target.turns.value.length;if(!await sendMessage(message,{focus:{...props.focus}},target))return{ok:false,error:target.error.value||`Colleague didn't receive it.`};const outcome=()=>{if(target.turns.value.length<=sent)return null;const{status,error}=target.turns.value.at(-1)?.assistant||{};const failure=target.snapshot.value?.status===`working`?``:target.snapshot.value?.error;if([`failed`,`interrupted`].includes(status)||failure)return{ok:false,error:failure||error||`It stopped with an error.`};const reply=latestAssistantMessageAwaitingUserReply(target.turns.value);return reply?{ok:true,reply}:null};let stop=null;const result=await new Promise(resolve=>{const timer=setTimeout(()=>resolve({ok:false,error:`It took too long to reply.`}),15e3);stop=watch(outcome,value=>{if(value){clearTimeout(timer);resolve(value)}},{immediate:true})});stop();return result},async reveal(){reopenConversation();await focusConversationComposer()}};let unregisterModel=null;async function changeWatch(watch,operation){try{await requestColleague(`/watches/${operation}`,{method:`POST`,body:{watchId:watch.watchId}});await refresh()}catch(error){reportFailure(error)}}async function openOperationTarget(item){const target=item?.target;if(!target?.projectSlug||!props.navigate)return reportFailure(`This operation target cannot be opened from the current app.`);try{const result=await props.navigate({projectSlug:target.projectSlug,...target.sessionId?{sessionId:target.sessionId}:{},...target.conversationId?{conversationId:target.conversationId}:{}});const opened=result?.focus||result;if(opened?.projectSlug!==target.projectSlug||target.sessionId&&opened.sessionId!==target.sessionId||target.conversationId&&opened.conversationId!==target.conversationId)throw new Error(`The operation target did not open.`);operationDetails.value=false}catch(error){reportFailure(error)}}function prepareOperationRecovery(item){if(!item?.id||![`failed`,`unknown`].includes(item.status))return false;const target=[item.target?.projectSlug,item.target?.sessionId,item.target?.conversationId].filter(Boolean).join(` / `)||`its saved target`;draft.value=item.status===`unknown`?`Inspect the saved target for the uncertain ${item.label} receipt (${item.id}) at ${target}. Tell me what actually happened. Do not repeat the operation unless inspection proves no effect and I explicitly ask you to continue.`:`Recheck the saved target for the failed ${item.label} receipt (${item.id}) at ${target}, then retry only if the operation is still needed and safe. Do not repeat any confirmed side effect.`;operationDetails.value=false;return true}watch(open,value=>{if(value)refresh()});watch(actorKey,()=>{revision+=1;freshOperation.value=null;freshConfirm.value=false;freshBusy.value=false;freshError.value=``;closeHistory();watchDetails.value=false;product.value={conversationId:``,error:``};productError.value=``;pointerNotice.value=``;colleagueNavigation.reset();voiceTranscript.value=null;refresh()},{flush:`sync`});const focusBinding=createColleagueFocusBinding({socket:realtimeSocket,readFocus:()=>({clientId,focus:props.focus}),onError:message=>{if(mounted)productError.value=message}});watch([actorKey,()=>props.focus],([actor],[previousActor])=>{if(previousActor!==void 0&&actor!==previousActor)focusBinding.release();focusBinding.update()},{deep:true,immediate:true});onMounted(()=>{if(voice)voice.launcher.value=launcher.value?.$el;refresh();unregisterModel=registerVibe64ColleagueModel(colleagueModel);window.addEventListener(`blur`,cancelAvatarPress);window.addEventListener(`pagehide`,cancelAvatarPress)});onBeforeUnmount(()=>{if(voice?.launcher.value===launcher.value?.$el)voice.launcher.value=null;realtimeSocket.off(`connect`,refresh);focusBinding.close();unregisterModel?.();mounted=false;if(isColleagueBinding(voice?.controller.state.binding))voice.controller.end({discard:true});cancelAvatarPress();revision+=1;window.removeEventListener(`blur`,cancelAvatarPress);window.removeEventListener(`pagehide`,cancelAvatarPress)});return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[(openBlock(),createBlock(Teleport,{to:unref(launcherTarget)||`body`,disabled:!unref(launcherTarget)},[createVNode(VBtn,{ref_key:`launcher`,ref:launcher,class:normalizeClass([`vibe64-colleague__launcher`,{"vibe64-colleague__launcher--floating":!unref(launcherTarget),"vibe64-colleague__launcher--listening":unref(holdingAvatar)}]),icon:``,variant:`text`,width:`48`,height:`48`,"data-vibe64-guide":`colleague`,"aria-label":shown.value?`Minimize ${unref(voice)?.controller.state.binding?.label||__props.name}`:minimizedVoice.value?`Reopen ${unref(voice).controller.state.binding.label||`Assistant`} voice chat${listeningVoice.value?` · Listening`:``}`:`Open ${__props.name}`,title:shown.value?`Minimize conversation`:listeningVoice.value?`Listening · Reopen voice chat`:minimizedVoice.value?`Reopen voice chat`:__props.holdToTalk?`${__props.name} · Hold to talk`:__props.name,"aria-haspopup":`dialog`,"aria-expanded":shown.value,onPointerdown:unref(startAvatarPress),onPointerup:unref(endAvatarPress),onPointercancel:unref(cancelAvatarPress),onLostpointercapture:unref(cancelAvatarPress),onClickCapture:unref(avatarClick),onClick:_cache[0]||(_cache[0]=$event=>toggleConversation($event).catch(reportFailure)),onContextmenu:_cache[1]||(_cache[1]=withModifiers(()=>{},[`prevent`]))},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_1$26,[renderSlot(_ctx.$slots,`avatar`,{state:working.value?`thinking`:`idle`},void 0,true)]),minimizedVoice.value?(openBlock(),createElementBlock(`span`,{key:0,class:normalizeClass([`vibe64-colleague__voice-badge`,{"vibe64-colleague__voice-badge--listening":listeningVoice.value}]),"aria-hidden":`true`},[createVNode(VIcon,{icon:listeningVoice.value?unref(mdiMicrophone):unref(mdiHeadset),size:`14`},null,8,[`icon`])],2)):createCommentVNode(``,true),working.value?(openBlock(),createElementBlock(`span`,{key:1,class:`vibe64-colleague__working`,"aria-label":`${__props.name} is working`},null,8,_hoisted_2$21)):createCommentVNode(``,true)]),_:3},8,[`class`,`aria-label`,`title`,`aria-expanded`,`onPointerdown`,`onPointerup`,`onPointercancel`,`onLostpointercapture`,`onClickCapture`]),minimizedVoice.value?(openBlock(),createBlock(VBtn,{key:0,class:normalizeClass([`vibe64-colleague__voice-stop`,{"vibe64-colleague__voice-stop--floating":!unref(launcherTarget)}]),icon:unref(mdiClose),variant:`text`,width:`48`,height:`48`,"aria-label":`Stop voice chat`,title:`Stop voice chat`,onClick:closeText},null,8,[`class`,`icon`])):createCommentVNode(``,true)],8,[`to`,`disabled`])),createVNode(unref(VNavigationDrawer),{"model-value":bodyVisible.value&&!unref(xs),location:`right`,width:380,order:1,mobile:false,scrim:false,"disable-resize-watcher":``,"disable-route-watcher":``,touchless:``,tag:`section`,"aria-label":`${__props.name} conversation`,onKeydown:withKeys(withModifiers(closeText,[`stop`]),[`esc`])},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_3$20,[createBaseVNode(`header`,_hoisted_4$14,[createBaseVNode(`span`,_hoisted_5$14,toDisplayString(__props.name),1),learningStep.value&&!unref(xs)?(openBlock(),createBlock(VBtn,mergeProps({key:0},stepButton.value,{onClick:showLearningStep}),{default:withCtx(()=>[createVNode(VIcon,{icon:learningStep.value.passed?unref(mdiCheck):unref(mdiSchoolOutline),size:`18`,start:``},null,8,[`icon`]),createTextVNode(`Step `+toDisplayString(learningStep.value.position)+`/`+toDisplayString(learningStep.value.total),1)]),_:1},16)):createCommentVNode(``,true),createVNode(VBtn,{icon:unref(mdiMinus),variant:`text`,"aria-label":`Minimize conversation`,title:`Minimize conversation`,onClick:_cache[2]||(_cache[2]=$event=>toggleConversation($event).catch(reportFailure))},null,8,[`icon`]),createVNode(VBtn,{icon:unref(mdiClose),variant:`text`,"aria-label":`Close ${__props.name}`,title:`Close ${__props.name}`,onClick:closeText},null,8,[`icon`,`aria-label`,`title`])]),createVNode(unref(ConversationDialog_default),{presentation:`inline`,title:__props.name,class:`vibe64-colleague__inline`},{default:withCtx(()=>[createBaseVNode(`div`,{ref_key:`desktopPanelTarget`,ref:desktopPanelTarget,class:`vibe64-colleague__panel`},null,512)]),_:1},8,[`title`])])]),_:1},8,[`model-value`,`aria-label`,`onKeydown`]),createVNode(unref(ConversationDialog_default),{"model-value":bodyVisible.value&&unref(xs),title:__props.name,"close-label":`Close ${__props.name}`,minimizable:``,activator:launcher.value?.$el,"open-on-click":false,eager:``,"onUpdate:modelValue":_cache[3]||(_cache[3]=value=>!value&&closeText()),onMinimize:_cache[4]||(_cache[4]=$event=>toggleConversation($event).catch(reportFailure))},createSlots({default:withCtx(()=>[createBaseVNode(`div`,{ref_key:`panelTarget`,ref:panelTarget,class:`vibe64-colleague__panel`},null,512)]),_:2},[learningStep.value&&unref(xs)?{name:`header-actions`,fn:withCtx(()=>[createVNode(VBtn,mergeProps(stepButton.value,{onClick:showLearningStep}),{default:withCtx(()=>[createVNode(VIcon,{icon:learningStep.value.passed?unref(mdiCheck):unref(mdiSchoolOutline),size:`18`,start:``},null,8,[`icon`]),createTextVNode(`Step `+toDisplayString(learningStep.value.position)+`/`+toDisplayString(learningStep.value.total),1)]),_:1},16)]),key:`0`}:void 0]),1032,[`model-value`,`title`,`close-label`,`activator`]),(openBlock(),createBlock(Teleport,{to:voicePanelTarget.value||conversationTarget.value||`body`,disabled:!voicePanelTarget.value&&!conversationTarget.value},[withDirectives(createBaseVNode(`aside`,{class:`vibe64-colleague`,"aria-label":__props.name},[!product.value.modelSetupRequired?(openBlock(),createElementBlock(`div`,_hoisted_7$9,[createVNode(unref(AiOnboardingNudge_default))])):createCommentVNode(``,true),voiceSession.value&&!voicePanelTarget.value&&unref(voice).controller.state.error?(openBlock(),createBlock(VAlert,{key:1,type:`error`,density:`compact`,role:`alert`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(voice).controller.state.error),1)]),_:1})):createCommentVNode(``,true),pointerNotice.value?(openBlock(),createBlock(VAlert,{key:2,variant:`tonal`,type:`info`,role:`status`},{default:withCtx(()=>[createBaseVNode(`p`,null,toDisplayString(pointerNotice.value),1),createVNode(VBtn,{disabled:Boolean(voiceSession.value?.hasUnsentSpeech.value),onClick:_cache[5]||(_cache[5]=$event=>refresh({allowRetarget:true}))},{default:withCtx(()=>[..._cache[26]||(_cache[26]=[createTextVNode(`Refresh conversation`,-1)])]),_:1},8,[`disabled`])]),_:1})):createCommentVNode(``,true),product.value.modelSetupRequired?(openBlock(),createBlock(VAlert,{key:3,class:`vibe64-colleague__notice`,variant:`tonal`,type:`warning`,role:`status`},{default:withCtx(()=>[teachNeedsModel.value?(openBlock(),createElementBlock(`p`,_hoisted_8$9,`Connect an AI first, then press Teach me again. Nothing was sent.`)):(openBlock(),createElementBlock(`p`,_hoisted_9$7,`Connect an AI first. Your message stays here until you do.`)),createVNode(VBtn,{variant:`flat`,color:`primary`,"min-height":`48`,onClick:_cache[6]||(_cache[6]=$event=>unref(requestVibe64AiOnboarding)())},{default:withCtx(()=>[..._cache[27]||(_cache[27]=[createTextVNode(`Set up your AI`,-1)])]),_:1})]),_:1})):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_10$7,[createVNode(unref(AssistantConversationElement_default),{adapter:adapter.value,label:`${__props.name} conversation`,"avatar-size":avatarSize.value,"onUpdate:avatarSize":_cache[15]||(_cache[15]=$event=>avatarSize.value=$event)},createSlots({"avatar-tools":withCtx(()=>[createBaseVNode(`div`,{ref_key:`voiceToolsTarget`,ref:voiceToolsTarget,class:`vibe64-colleague__voice-tools`},null,512)]),"avatar-control":withCtx(()=>[avatarSize.value===`hidden`&&voiceSession.value?.voice.listening.value&&!voiceSession.value.microphoneMuted.value?(openBlock(),createElementBlock(`span`,_hoisted_11$7,[createVNode(VIcon,{size:`20`,icon:unref(mdiMicrophone)},null,8,[`icon`])])):createCommentVNode(``,true),avatarSize.value===`hidden`&&voiceSession.value?.voice.speaking.value?(openBlock(),createElementBlock(`span`,_hoisted_12$7,[createVNode(VIcon,{size:`20`,icon:unref(mdiVolumeHigh)},null,8,[`icon`])])):createCommentVNode(``,true)]),"system-message":withCtx(({message})=>[createVNode(unref(_sfc_main$64),{message,onCheckDelivery:_cache[7]||(_cache[7]=$event=>adapter.value.actions.checkDelivery($event))},null,8,[`message`]),message.delivery?(openBlock(),createBlock(VBtn,{key:0,variant:`tonal`,"min-height":`48`,disabled:freshBusy.value,onClick:showFreshConfirmation},{default:withCtx(()=>[..._cache[28]||(_cache[28]=[createTextVNode(`Start fresh`,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true)]),composer:withCtx(({adapter:{composer}})=>[createBaseVNode(`div`,_hoisted_13$7,[createVNode(unref(AssistantPromptInput_default),{ref_key:`composerInput`,ref:composerInput,modelValue:draft.value,"onUpdate:modelValue":_cache[12]||(_cache[12]=$event=>draft.value=$event),class:`vibe64-colleague__composer`,"aria-label":composer.ariaLabel,placeholder:composer.placeholder,disabled:composer.disabled,"submit-enabled":composer.canSend,rows:composer.rows,density:composer.density,"tab-to-submit":``,onSubmit:submit,onTabToSubmit:_cache[13]||(_cache[13]=$event=>sendButton.value?.$el?.focus()),onKeydown:_cache[14]||(_cache[14]=withKeys($event=>$event.defaultPrevented&&$event.stopPropagation(),[`tab`]))},{"input-start":withCtx(()=>[turnError.value&&turnError.value!==adapter.value.conversation.error?(openBlock(),createElementBlock(`span`,_hoisted_14$7,toDisplayString(turnError.value),1)):connectionError.value&&connectionError.value!==adapter.value.conversation.error?(openBlock(),createElementBlock(`span`,{key:1,class:`text-body-small`,role:`status`,title:connectionError.value},`Reconnecting…`,8,_hoisted_15$7)):createCommentVNode(``,true)]),footer:withCtx(()=>[createBaseVNode(`div`,_hoisted_16$6,[createVNode(VBtn,{ref_key:`modelButton`,ref:modelButton,icon:unref(mdiTuneVariant),size:`small`,variant:`text`,"aria-label":`Choose ${__props.name} model`,title:product.value.assistantSelection?.modelId||`Choose model`,disabled:working.value||sending.value||Boolean(freshOperation.value),onClick:_cache[8]||(_cache[8]=$event=>modelMenu.value=true)},null,8,[`icon`,`aria-label`,`title`,`disabled`]),createVNode(VBtn,{icon:unref(mdiHistory),size:`small`,variant:`text`,"aria-label":`Previous conversations`,title:`Previous conversations`,onClick:_cache[9]||(_cache[9]=$event=>loadHistory())},null,8,[`icon`]),operations.value.length?(openBlock(),createBlock(VBtn,{key:0,ref_key:`operationButton`,ref:operationButton,size:`small`,"min-height":`48`,variant:`text`,"aria-label":`Recent operations (${operations.value.length})`,title:`Recent operations`,"aria-haspopup":`dialog`,"aria-expanded":operationDetails.value,onClick:_cache[10]||(_cache[10]=$event=>operationDetails.value=true)},{default:withCtx(()=>[createTextVNode(` Operations `+toDisplayString(operations.value.length),1)]),_:1},8,[`aria-label`,`aria-expanded`])):createCommentVNode(``,true),watches.value.length||assignments.value.length?(openBlock(),createBlock(VBtn,{key:1,ref_key:`watchButton`,ref:watchButton,size:`small`,"min-height":`48`,variant:`text`,"aria-label":`Watches and assignments (${watchControlCount.value})`,title:`Watches and assignments`,"aria-haspopup":`dialog`,"aria-expanded":watchDetails.value,onClick:_cache[11]||(_cache[11]=$event=>watchDetails.value=true)},{default:withCtx(()=>[createVNode(VIcon,{icon:unref(mdiEyeOutline)},null,8,[`icon`]),createBaseVNode(`span`,_hoisted_17$6,toDisplayString(watchControlCount.value),1)]),_:1},8,[`aria-label`,`aria-expanded`])):createCommentVNode(``,true),freshOperation.value?(openBlock(),createBlock(VBtn,{key:2,variant:`text`,disabled:freshBusy.value,onClick:showFreshConfirmation},{default:withCtx(()=>[..._cache[29]||(_cache[29]=[createTextVNode(`Resume fresh operation`,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_18$6,[composer.canStop?(openBlock(),createBlock(VBtn,{key:0,icon:unref(mdiStop),size:`small`,variant:`text`,"aria-label":`Stop ${__props.name}`,title:`Stop assistant`,onClick:stop},null,8,[`icon`,`aria-label`])):createCommentVNode(``,true),createVNode(VBtn,{ref_key:`sendButton`,ref:sendButton,icon:working.value?unref(mdiArrowTopRight):unref(mdiSend),size:`small`,variant:`flat`,color:`primary`,"aria-label":composer.submitAriaLabel,title:composer.submitLabel,disabled:!composer.canSend,onClick:submit},null,8,[`icon`,`aria-label`,`title`,`disabled`])])]),createBaseVNode(`div`,{ref_key:`voiceFeedbackTarget`,ref:voiceFeedbackTarget,class:`vibe64-colleague__voice-feedback`},null,512)]),_:2},1032,[`modelValue`,`aria-label`,`placeholder`,`disabled`,`submit-enabled`,`rows`,`density`]),voiceSession.value?(openBlock(),createBlock(unref(VoiceConversationControls_default),{key:unref(voice).controller.state.binding.id,session:voiceSession.value,disabled:unref(voice).controller.state.busy,compact:``,"icon-only":``,"tools-target":voiceToolsTarget.value,"feedback-target":voiceFeedbackTarget.value,"review-in-transcript":Boolean(voicePreview.value)},{"settings-control":withCtx(()=>[createVNode(unref(VoiceConversationSettings_default),{voice:voiceSession.value.voice,compact:``,onError:reportFailure},createSlots({_:2},[unref(voice).Settings?{name:`default`,fn:withCtx(settings=>[(openBlock(),createBlock(resolveDynamicComponent(unref(voice).Settings),mergeProps(settings,{binding:unref(voice).controller.state.binding}),null,16,[`binding`]))]),key:`0`}:void 0]),1032,[`voice`])]),_:1},8,[`session`,`disabled`,`tools-target`,`feedback-target`,`review-in-transcript`])):createCommentVNode(``,true)])]),_:2},[_ctx.$slots.avatar?{name:`avatar`,fn:withCtx(size=>[renderSlot(_ctx.$slots,`avatar`,mergeProps(voiceSession.value?.avatarVisual.value||{state:working.value?`thinking`:`idle`},{size:size.size,height:size.height}),void 0,true)]),key:`0`}:void 0]),1032,[`adapter`,`label`,`avatar-size`])]),createVNode(Vibe64SessionAssistantMenu_default,{modelValue:modelMenu.value,"onUpdate:modelValue":_cache[16]||(_cache[16]=$event=>modelMenu.value=$event),target:modelButton.value?.$el,selection:product.value.assistantSelection,"save-selection":selectModel,"catalog-path":`/api/vibe64/colleague/models`,"changes-disabled":working.value||sending.value||Boolean(freshOperation.value)},null,8,[`modelValue`,`target`,`selection`,`changes-disabled`])],8,_hoisted_6$10),[[vShow,bodyVisible.value]])],8,[`to`,`disabled`])),createVNode(VDialog,{modelValue:watchDetails.value,"onUpdate:modelValue":_cache[18]||(_cache[18]=$event=>watchDetails.value=$event),activator:watchButton.value?.$el||modelButton.value?.$el,"open-on-click":false,fullscreen:unref(xs),"max-width":`620`,scrollable:``,"aria-label":`Watches and assignments`},{default:withCtx(()=>[createVNode(VCard,{class:`vibe64-colleague__watch-dialog`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`vibe64-colleague__watch-title d-flex align-center text-title-large`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_19$5,[createVNode(VIcon,{icon:unref(mdiEyeOutline),size:`22`},null,8,[`icon`])]),_cache[30]||(_cache[30]=createBaseVNode(`span`,{class:`flex-grow-1`},`Watches and assignments`,-1)),createVNode(VBtn,{icon:unref(mdiClose),variant:`text`,"aria-label":`Close watches and assignments`,title:`Close watches and assignments`,onClick:_cache[17]||(_cache[17]=$event=>watchDetails.value=false)},null,8,[`icon`])]),_:1}),createVNode(VCardText,{class:`vibe64-colleague__watch-details`},{default:withCtx(()=>[watches.value.length?(openBlock(),createElementBlock(`section`,_hoisted_20$5,[createBaseVNode(`p`,_hoisted_21$5,`Watches (`+toDisplayString(watches.value.length)+`)`,1),createBaseVNode(`ul`,null,[(openBlock(true),createElementBlock(Fragment,null,renderList(watches.value,item=>{return openBlock(),createElementBlock(`li`,{key:item.watchId},[createBaseVNode(`div`,null,[createBaseVNode(`strong`,null,toDisplayString(item.projectSlug||`Workspace`),1),_cache[31]||(_cache[31]=createTextVNode(` · `,-1)),createBaseVNode(`span`,{class:`vibe64-colleague__watch-chip`,"data-status":item.status},toDisplayString(item.status),9,_hoisted_22$5),createBaseVNode(`p`,null,toDisplayString(item.question),1),item.error?(openBlock(),createElementBlock(`p`,_hoisted_23$5,toDisplayString(item.error),1)):createCommentVNode(``,true)]),createBaseVNode(`div`,_hoisted_24$4,[item.status===`paused`?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,"min-height":`48`,"aria-label":`Resume watch: ${item.question}`,onClick:$event=>changeWatch(item,`resume`)},{default:withCtx(()=>[..._cache[32]||(_cache[32]=[createTextVNode(`Resume`,-1)])]),_:1},8,[`aria-label`,`onClick`])):createCommentVNode(``,true),createVNode(VBtn,{variant:`text`,"min-height":`48`,"aria-label":`Cancel watch: ${item.question}`,onClick:$event=>changeWatch(item,`cancel`)},{default:withCtx(()=>[..._cache[33]||(_cache[33]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`aria-label`,`onClick`])])])}),128))])])):createCommentVNode(``,true),assignments.value.length?(openBlock(),createElementBlock(`section`,_hoisted_25$3,[createBaseVNode(`p`,_hoisted_26$2,`Ongoing assignments (`+toDisplayString(assignments.value.length)+`)`,1),createBaseVNode(`ul`,null,[(openBlock(true),createElementBlock(Fragment,null,renderList(assignments.value,item=>{return openBlock(),createElementBlock(`li`,{key:item.assignmentId},[createBaseVNode(`strong`,null,toDisplayString(item.projectSlug),1),createTextVNode(` · `+toDisplayString(item.status)+` · `+toDisplayString(item.turnLimit-item.turnsUsed)+` turns left `,1),createBaseVNode(`p`,null,toDisplayString(item.summary),1),createBaseVNode(`p`,null,toDisplayString(item.criteria),1)])}),128))])])):createCommentVNode(``,true),!watches.value.length&&!assignments.value.length?(openBlock(),createElementBlock(`p`,_hoisted_27$2,`No ongoing watches or assignments.`)):createCommentVNode(``,true)]),_:1})]),_:1})]),_:1},8,[`modelValue`,`activator`,`fullscreen`]),createVNode(VDialog,{modelValue:operationDetails.value,"onUpdate:modelValue":_cache[20]||(_cache[20]=$event=>operationDetails.value=$event),activator:operationButton.value?.$el||modelButton.value?.$el,"open-on-click":false,fullscreen:unref(xs),"max-width":`620`,scrollable:``,"aria-label":`Recent operations`},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,{class:`d-flex align-center text-title-large`},{default:withCtx(()=>[_cache[34]||(_cache[34]=createBaseVNode(`span`,{class:`flex-grow-1`},`Recent operations`,-1)),createVNode(VBtn,{icon:unref(mdiClose),variant:`text`,"aria-label":`Close recent operations`,title:`Close recent operations`,onClick:_cache[19]||(_cache[19]=$event=>operationDetails.value=false)},null,8,[`icon`])]),_:1}),createVNode(VCardText,{class:`vibe64-colleague__operation-details`},{default:withCtx(()=>[_cache[38]||(_cache[38]=createBaseVNode(`p`,null,`These receipts report what Vibe64 actually recorded. An uncertain receipt is not safe to repeat until its target is inspected.`,-1)),createBaseVNode(`ol`,null,[(openBlock(true),createElementBlock(Fragment,null,renderList(operations.value,item=>{return openBlock(),createElementBlock(`li`,{key:item.id},[createBaseVNode(`p`,null,[createBaseVNode(`strong`,null,toDisplayString(item.label),1),createTextVNode(` · `+toDisplayString(item.status),1),item.at?(openBlock(),createElementBlock(`span`,_hoisted_28$2,` · `+toDisplayString(item.at),1)):createCommentVNode(``,true)]),item.target?(openBlock(),createElementBlock(`p`,_hoisted_29$2,toDisplayString([item.target.projectSlug,item.target.sessionId,item.target.conversationId].filter(Boolean).join(` · `)),1)):createCommentVNode(``,true),item.error?(openBlock(),createElementBlock(`p`,_hoisted_30$2,toDisplayString(item.error),1)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_31$2,[item.target?.projectSlug&&props.navigate?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,"min-height":`48`,onClick:$event=>openOperationTarget(item)},{default:withCtx(()=>[..._cache[35]||(_cache[35]=[createTextVNode(`Open target`,-1)])]),_:1},8,[`onClick`])):createCommentVNode(``,true),item.status===`unknown`?(openBlock(),createBlock(VBtn,{key:1,variant:`text`,"min-height":`48`,onClick:$event=>prepareOperationRecovery(item)},{default:withCtx(()=>[..._cache[36]||(_cache[36]=[createTextVNode(`Prepare inspection`,-1)])]),_:1},8,[`onClick`])):item.status===`failed`&&item.canPrepareRetry?(openBlock(),createBlock(VBtn,{key:2,variant:`text`,"min-height":`48`,onClick:$event=>prepareOperationRecovery(item)},{default:withCtx(()=>[..._cache[37]||(_cache[37]=[createTextVNode(`Prepare retry`,-1)])]),_:1},8,[`onClick`])):createCommentVNode(``,true)])])}),128))])]),_:1})]),_:1})]),_:1},8,[`modelValue`,`activator`,`fullscreen`]),createVNode(VDialog,{"model-value":freshConfirm.value,"max-width":`520`,persistent:freshBusy.value,"onUpdate:modelValue":_cache[21]||(_cache[21]=value=>!value&&closeFreshConfirmation())},{default:withCtx(()=>[createVNode(VCard,{title:`Start a fresh conversation?`},{default:withCtx(()=>[createVNode(VCardText,null,{default:withCtx(()=>[_cache[39]||(_cache[39]=createBaseVNode(`p`,null,`This ends the old voice conversation. Nothing will be resent. Its history and any unconfirmed words remain available in Previous conversations. Watches and assignments continue.`,-1)),_cache[40]||(_cache[40]=createBaseVNode(`p`,null,`Your typed draft and personal microphone, speaker, avatar and voice preferences stay. The new conversation does not automatically start voice.`,-1)),freshBlocked.value?(openBlock(),createElementBlock(`p`,_hoisted_32$2,toDisplayString(freshBlocked.value),1)):createCommentVNode(``,true),freshError.value?(openBlock(),createElementBlock(`p`,_hoisted_33$2,toDisplayString(freshError.value),1)):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VBtn,{disabled:freshBusy.value,onClick:closeFreshConfirmation},{default:withCtx(()=>[createTextVNode(toDisplayString(freshOperation.value?`Close`:`Cancel`),1)]),_:1},8,[`disabled`]),createVNode(VBtn,{disabled:freshBusy.value||Boolean(freshBlocked.value),color:`primary`,onClick:startFresh},{default:withCtx(()=>[createTextVNode(toDisplayString(freshBusy.value?`Checking fresh conversation…`:freshOperation.value?`Retry same fresh operation`:`Start fresh`),1)]),_:1},8,[`disabled`])]),_:1})]),_:1})]),_:1},8,[`model-value`,`persistent`]),createVNode(unref(ConversationDialog_default),{"model-value":historyOpen.value,title:`Previous conversations`,"close-label":`Close previous conversations`,"onUpdate:modelValue":_cache[25]||(_cache[25]=value=>!value&&closeHistory())},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_34$2,[_cache[45]||(_cache[45]=createBaseVNode(`p`,null,`Read-only history. Unconfirmed words are annotations, not accepted messages.`,-1)),historyError.value?(openBlock(),createElementBlock(`p`,_hoisted_35$1,toDisplayString(historyError.value),1)):createCommentVNode(``,true),historyLoading.value&&!historyId.value?(openBlock(),createBlock(VSkeletonLoader,{key:1,type:`list-item-two-line@3`,"aria-label":`Loading previous conversations`})):createCommentVNode(``,true),!historyId.value?(openBlock(),createElementBlock(Fragment,{key:2},[createVNode(VBtn,{variant:`tonal`,"min-height":`48`,disabled:freshBusy.value||Boolean(freshBlocked.value),onClick:showFreshConfirmation},{default:withCtx(()=>[..._cache[41]||(_cache[41]=[createTextVNode(`Start fresh`,-1)])]),_:1},8,[`disabled`]),freshBlocked.value?(openBlock(),createElementBlock(`p`,_hoisted_36$1,toDisplayString(freshBlocked.value),1)):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(historyConversations.value,item=>{return openBlock(),createBlock(VBtn,{key:item.conversationId,variant:`text`,"min-height":`48`,disabled:historyLoading.value,onClick:$event=>readHistoryPage(item.conversationId)},{default:withCtx(()=>[createTextVNode(toDisplayString(item.archivedAt)+` · `+toDisplayString(item.unconfirmedCount)+` unconfirmed `,1)]),_:2},1032,[`disabled`,`onClick`])}),128)),!historyLoading.value&&!historyConversations.value.length&&!historyError.value?(openBlock(),createElementBlock(`p`,_hoisted_37$1,`No previous conversations.`)):createCommentVNode(``,true),historyHasMore.value?(openBlock(),createBlock(VBtn,{key:2,disabled:historyLoading.value,onClick:_cache[22]||(_cache[22]=$event=>loadHistory({more:true}))},{default:withCtx(()=>[..._cache[42]||(_cache[42]=[createTextVNode(`More conversations`,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true)],64)):(openBlock(),createElementBlock(Fragment,{key:3},[createVNode(VBtn,{disabled:historyLoading.value,onClick:_cache[23]||(_cache[23]=$event=>loadHistory())},{default:withCtx(()=>[..._cache[43]||(_cache[43]=[createTextVNode(`Back to previous conversations`,-1)])]),_:1},8,[`disabled`]),createVNode(unref(AssistantTranscript_default),{turns:historyTurns.value,"assistant-label":__props.name,"scroll-key":historyId.value,loading:historyLoading.value&&!historyPages.value.length,"has-more-before":historyPagination.value.hasMoreBefore,"loading-more":historyLoading.value&&Boolean(historyPages.value.length),"load-more-error":historyError.value,onLoadMore:_cache[24]||(_cache[24]=$event=>readHistoryPage(historyId.value,{more:true,complete:$event.complete}))},{"system-message":withCtx(({message})=>[createBaseVNode(`p`,null,toDisplayString(message.text),1)]),_:1},8,[`turns`,`assistant-label`,`scroll-key`,`loading`,`has-more-before`,`loading-more`,`load-more-error`]),(openBlock(true),createElementBlock(Fragment,null,renderList(historyUnconfirmed.value,message=>{return openBlock(),createElementBlock(`div`,{key:message.messageId,class:`vibe64-colleague__history-annotation`},[_cache[44]||(_cache[44]=createBaseVNode(`strong`,null,`Unconfirmed · client-reported words`,-1)),createBaseVNode(`p`,null,toDisplayString(message.text),1)])}),128)),historyUnconfirmedDelivery.value?(openBlock(),createElementBlock(`p`,_hoisted_38$1,`Delivery of `+toDisplayString(historyUnconfirmedDelivery.value.messageId)+` remains unconfirmed.`,1)):createCommentVNode(``,true)],64))])]),_:1},8,[`model-value`])],64)}}};var Vibe64Colleague_default=_plugin_vue_export_helper_default(_sfc_main$44,[[`__scopeId`,`data-v-e8a2048b`]]);var client_exports$7=__exportAll({Vibe64Colleague:()=>Vibe64Colleague_default});var VIBE64_LOCAL_AVATAR_STORAGE_KEY=`vibe64:assistant-avatars`;function readStoredAvatars(){const stored=readLocalStorageJson(VIBE64_LOCAL_AVATAR_STORAGE_KEY,{});return Object.freeze(Object.fromEntries(Object.entries(VIBE64_DEFAULT_AVATARS).map(([target,fallback])=>[target,isVibe64AvatarId(stored?.[target])?stored[target]:fallback])))}var avatars=null;function useVibe64LocalAvatarPreferences(){avatars||=shallowRef(readStoredAvatars());function setAvatar(target,value){if(!Object.hasOwn(VIBE64_DEFAULT_AVATARS,target)||!isVibe64AvatarId(value))return;if(avatars.value[target]===value)return;avatars.value=Object.freeze({...avatars.value,[target]:value});writeLocalStorageJson(VIBE64_LOCAL_AVATAR_STORAGE_KEY,avatars.value)}return{avatars,setAvatar}}var VIBE64_COLLEAGUE_PANES=Object.freeze([`preview`,`settings`,`env`,`integrations`,`access`,`publish`,`history`,`health`,`session`,`changes`,`repository`,`files`,`database`,`system`,`ai-terminal`,`issues`,`pull-requests`]);var VIBE64_COLLEAGUE_SESSION_PANES=Object.freeze([`session`,`changes`,`repository`,`files`,`database`,`system`,`ai-terminal`]);var NAVIGATION_TIMEOUT_MS=15e3;var TARGET_CHANGED=`The browser navigation target changed before it opened.`;function useVibe64ColleagueNavigation({panes=[],routePanes={},actorKey=null,conversationQuery=false}={}){const route=useRoute();const router=useRouter$1();const assistantLayer=inject$1(VIBE64_ASSISTANT_HOST_KEY,null);const colleagueView=inject$1(VIBE64_COLLEAGUE_VIEW_KEY);const colleaguePreview=inject$1(VIBE64_COLLEAGUE_PREVIEW_KEY,null);const colleagueIntegrations=inject$1(VIBE64_COLLEAGUE_INTEGRATIONS_KEY);const colleagueDatabase=inject$1(VIBE64_COLLEAGUE_DATABASE_KEY);const colleaguePlan=inject$1(VIBE64_COLLEAGUE_PLAN_KEY);const colleagueLayout=inject$1(VIBE64_COLLEAGUE_LAYOUT_KEY);const browserNavigation=inject$1(VIBE64_BROWSER_NAVIGATION_KEY,null);const learningOwner=inject$1(VIBE64_LEARNING_KEY,null);const learningController=computed(()=>unref(learningOwner)||null);const allPanes=new Set([...VIBE64_COLLEAGUE_PANES,...panes]);const currentView=computed(()=>colleagueView.value?.projectSlug===projectSlugFromRoute(route)?colleagueView.value:null);const restoringSelection=ref(false);const selectionError=ref(``);const navigationGeneration=ref(0);if(conversationQuery){watch([()=>route.fullPath,currentView,()=>currentView.value?.ready,()=>currentView.value?.sessionId],async(_value,_previous,onCleanup)=>{let current=true;onCleanup(()=>{current=false});restoringSelection.value=false;selectionError.value=``;const view=currentView.value;const conversationId=typeof route.query.conversation===`string`?route.query.conversation:``;if(!view?.ready||view.sessionId!==route.query.session||!conversationId&&route.query.chat!==`main`)return;if(!view.hostConversationSelected&&view.conversationId===conversationId&&(conversationId||!view.temporarySelected))return;const revision=view.selectionRevision;const hostSelected=view.hostConversationSelected;restoringSelection.value=true;try{await view.openConversation(conversationId,()=>current&¤tView.value===view)}catch(error){if(current&&view.selectionRevision===revision&&view.hostConversationSelected===hostSelected)selectionError.value=error.message||`The selected conversation could not be opened.`}finally{if(current)restoringSelection.value=false}},{immediate:true});watch(()=>({view:currentView.value,sessionId:currentView.value?.sessionId,ready:currentView.value?.ready,revision:currentView.value?.selectionRevision,conversationId:currentView.value?.conversationId,temporarySelected:currentView.value?.temporarySelected,hostSelected:currentView.value?.hostConversationSelected,restoring:restoringSelection.value,path:route.path,routeSession:route.query.session}),(selection,previous)=>{if(!selection.ready||!selection.sessionId||selection.routeSession&&selection.routeSession!==selection.sessionId)return;const manual=selection.view===previous?.view&&selection.revision!==previous.revision;if((selection.restoring||selectionError.value)&&!manual&&!selection.hostSelected)return;const query={...route.query,session:selection.sessionId};delete query.conversation;delete query.chat;if(!selection.hostSelected){if(selection.conversationId)query.conversation=selection.conversationId;else if(!selection.temporarySelected)query.chat=`main`}if(query.session!==route.query.session||query.conversation!==route.query.conversation||query.chat!==route.query.chat)router.replace({path:route.path,query})},{flush:`post`})}const focus=computed(()=>{const routePane=Object.hasOwn(routePanes,route.path)?routePanes[route.path]:``;if(routePane)return{projectSlug:``,sessionId:``,conversationId:``,pane:routePane,route:route.path,...learningPanelFocus(learningController.value)};const projectSlug=projectSlugFromRoute(route);const sessionId=projectSlug?currentView.value?.sessionId||unref(assistantLayer)?.sessionId||String(route.query.session||``):``;const layout=colleagueLayout.value;const pane=(projectSlug||layout?.lessonVisible)&&layout?.projectSlug===projectSlug&&layout.ready?!layout.projectVisible?`chat`:layout.lessonVisible?`lesson`:route.path.split(`/dashboard/`)[1]?.split(`/`)[0]||`preview`:``;const preview=unref(colleaguePreview);const integration=colleagueIntegrations.value;const database=colleagueDatabase.value;const plan=colleaguePlan.value;const databaseFocus={};if(pane===`database`&&database?.projectSlug===projectSlug&&database.sessionId===sessionId){databaseFocus.databaseScreen=database.screen;if(database.screen===`workspace`){databaseFocus.databaseView=database.view;if(database.view===`data`&&database.table&&database.table.length<=256)databaseFocus.databaseTable=database.table}}return{projectSlug,sessionId,conversationId:currentView.value?.conversationId||``,pane,route:route.path,...learningPanelFocus(learningController.value),...pane===`preview`&&preview?.projectSlug===projectSlug&&preview.sessionId===sessionId?{previewScreen:preview.screen}:{},...pane===`integrations`&&integration?.projectSlug===projectSlug&&(integration.environment===`production`||integration.sessionId===sessionId)&&integration.ready?{integrationEnvironment:integration.environment,integrationDirty:integration.dirty,...integration.exists&&integration.integrationId.length<=200?{integrationId:integration.integrationId}:{}}:{},...databaseFocus,...plan?.projectSlug===projectSlug&&plan.sessionId===sessionId&&plan.open?{planView:plan.view}:{}}});const pageFocus=inject$1(VIBE64_PAGE_FOCUS_KEY,null);if(pageFocus){watch(focus,value=>{pageFocus.value=value},{immediate:true});onScopeDispose(()=>{pageFocus.value=null})}function waitFor(ready,failure,isCurrent,error=()=>``){if(ready())return Promise.resolve();return new Promise((resolve,reject)=>{const timer=setTimeout(()=>{unwatch();reject(new Error(failure))},NAVIGATION_TIMEOUT_MS);const unwatch=watch([ready,error,isCurrent],([isReady,message,current])=>{if(!isReady&&!message&¤t)return;clearTimeout(timer);unwatch();if(!current)reject(new Error(TARGET_CHANGED));else if(message)reject(new Error(message));else resolve()})})}async function navigate(command={}){const generation=++navigationGeneration.value;const expectedActor=unref(actorKey);const isCurrent=()=>generation===navigationGeneration.value&&unref(actorKey)===expectedActor;const assertCurrent=()=>{if(!isCurrent())throw new Error(TARGET_CHANGED)};if(command.route){const result=await router.push(command.route);assertCurrent();if(isNavigationFailure(result)&&!isNavigationFailure(result,NavigationFailureType.duplicated)||route.path!==command.route)throw new Error(`The page did not open.`);return{...focus.value}}if(command.learning){await applyLearningNavigation(learningController.value,command.learning);assertCurrent();if(!command.projectSlug){await waitFor(()=>learningPanelMatches(command,focus.value),`Learning did not show the requested lesson.`,isCurrent);return{...focus.value}}}if(command.pane&&!allPanes.has(command.pane))throw new Error(`This project view is unavailable.`);const integrationSelection=Boolean(command.integrationId||command.integrationEnvironment);const integrationEnvironment=command.integrationEnvironment||`development`;if(integrationSelection&&(command.pane!==`integrations`||![`development`,`production`].includes(integrationEnvironment)||integrationEnvironment===`development`&&!command.sessionId))throw new Error(`Choose Integrations and either a development session or the production environment.`);if(command.databaseTable&&(command.databaseView!==`data`||command.pane!==`database`||!command.sessionId))throw new Error(`A table requires its exact session and Database Data view.`);if(command.databaseView&&(command.pane!==`database`||!command.sessionId||![`overview`,`erd`,`data`].includes(command.databaseView)))throw new Error(`A database view requires its exact session and Database pane.`);if(command.planView&&(!command.sessionId||command.pane||command.conversationId||![`default`,`current`,`history`].includes(command.planView)))throw new Error(`A plan viewer requires its exact session's Main chat, without another pane or conversation.`);if(!command.projectSlug)throw new Error(`Choose a project before opening this view.`);const path=projectAppPath(command.projectSlug,command.pane&&command.pane!==`preview`?`/dashboard/${command.pane}`:``);const query={...command.sessionId?{session:command.sessionId,...conversationQuery?command.conversationId?{conversation:command.conversationId}:{chat:`main`}:{}}:{},...integrationSelection?{integrationEnvironment,...integrationEnvironment===`development`?{integrationSession:command.sessionId}:{},...command.integrationId?{integration:command.integrationId}:{}}:{},...command.databaseView?{databaseView:command.databaseTable?`overview`:command.databaseView}:{}};const result=await router.push({path,query});assertCurrent();if(isNavigationFailure(result)&&!isNavigationFailure(result,NavigationFailureType.duplicated))throw new Error(`The project did not open.`);const integration=computed(()=>{const panel=colleagueIntegrations.value;return panel&&route.path===path&&panel.projectSlug===command.projectSlug&&(integrationEnvironment===`production`||panel.sessionId===command.sessionId)?panel:null});const layout=computed(()=>{const owner=colleagueLayout.value;return route.path===path&&owner?.projectSlug===command.projectSlug&&owner.ready?owner:null});const database=computed(()=>{const panel=colleagueDatabase.value;return panel&&route.path===path&&panel.projectSlug===command.projectSlug&&panel.sessionId===command.sessionId?panel:null});const plan=computed(()=>{const viewer=colleaguePlan.value;return viewer&&route.path===path&&viewer.projectSlug===command.projectSlug&&viewer.sessionId===command.sessionId?viewer:null});const openChat=!command.pane&&Boolean(command.sessionId);const stopLayout=watch(layout,owner=>{if(openChat)owner?.showChat();else owner?.showProject()},{immediate:true});const stopSelection=integrationSelection?watch(integration,panel=>panel?.select(command.integrationId||``,integrationEnvironment),{immediate:true}):()=>{};try{if(command.sessionId&&!conversationQuery){await waitFor(()=>currentView.value?.ready&¤tView.value.sessionId===command.sessionId,`The requested session did not become ready.`,isCurrent);await currentView.value.openConversation(command.conversationId||``,isCurrent);assertCurrent()}const matches=()=>{const owner=layout.value;const view=currentView.value;const panel=integration.value;const displayed=focus.value;if(!learningPanelMatches(command,displayed))return false;if(!owner||!(openChat?owner.chatVisible:owner.projectVisible))return false;if(command.sessionId&&(!view?.ready||restoringSelection.value||view.hostConversationSelected||view.sessionId!==command.sessionId||view.conversationId!==(command.conversationId||``)||!command.conversationId&&view.temporarySelected))return false;if(command.databaseView&&(database.value?.screen!==`workspace`||!command.databaseTable&&database.value.view!==command.databaseView))return false;if(command.planView&&!plan.value?.ready)return false;return!integrationSelection||Boolean(panel?.ready&&panel.environment===integrationEnvironment&&(!command.integrationId||panel.exists&&panel.integrationId===command.integrationId))};const navigationError=()=>{if(command.sessionId&&selectionError.value)return selectionError.value;if(command.databaseView&&database.value?.screen===`unavailable`)return`Database could not load in this session.`;if(command.planView&&plan.value?.error)return plan.value.error;if(!integrationSelection)return``;const panel=integration.value;if(panel?.error)return panel.error;return command.integrationId&&panel?.ready&&panel.environment===integrationEnvironment&&panel.integrationId===command.integrationId&&!panel.exists?`The requested integration is not configured in this environment.`:``};if(navigationError())throw new Error(navigationError());await waitFor(matches,`The requested session, conversation or view did not become available.`,isCurrent,navigationError);if(route.path!==path||command.projectSlug&&projectSlugFromRoute(route)!==command.projectSlug)throw new Error(`Project selection changed before navigation completed.`);if(!matches())throw new Error(`The requested view changed before navigation completed.`);if(integrationSelection&&(focus.value.integrationEnvironment!==integrationEnvironment||command.integrationId&&focus.value.integrationId!==command.integrationId))throw new Error(`The integration selection changed before navigation completed.`);if(command.databaseTable){database.value.selectTable(command.databaseTable);await nextTick$1();if(!matches()||focus.value.databaseView!==`data`||focus.value.databaseTable!==command.databaseTable)throw new Error(`The requested table did not become visible.`)}if(command.planView){const viewer=plan.value;await viewer.openPlan(command.planView,()=>isCurrent()&&plan.value===viewer&&route.path===path&¤tView.value?.sessionId===command.sessionId&&layout.value?.chatVisible);if(!matches()||!viewer.open||focus.value.planView!==viewer.view)throw new Error(`The requested plan viewer did not become visible.`)}return{...focus.value}}finally{stopLayout();stopSelection()}}if(browserNavigation)browserNavigation.value=navigate;onScopeDispose(()=>{navigationGeneration.value+=1;if(browserNavigation?.value===navigate)browserNavigation.value=null});return{focus,navigate,currentView,restoringSelection,selectionError}}var _sfc_main$43={__name:`Vibe64LocalColleagueHost`,setup(__props){const{focus,navigate}=useVibe64ColleagueNavigation();const{avatars}=useVibe64LocalAvatarPreferences();const voiceVisual=ref(null);const request=(url,options)=>getHttpWebClient().request(resolveStudioRequestUrl(url),options);return(_ctx,_cache)=>{return openBlock(),createBlock(unref(Vibe64Colleague_default),{focus:unref(focus),navigate:unref(navigate),request,onVoiceVisual:_cache[0]||(_cache[0]=$event=>voiceVisual.value=$event)},{avatar:withCtx(({state})=>[createVNode(unref(_sfc_main$51),mergeProps(voiceVisual.value||{state},{avatar:unref(avatars).colleague}),null,16,[`avatar`])]),_:1},8,[`focus`,`navigate`])}}};var _sfc_main$42={__name:`Vibe64LocalVoiceSettings`,props:{binding:{type:Object,default:null},voice:{type:Object,default:null}},setup(__props){const props=__props;const{avatars,setAvatar}=useVibe64LocalAvatarPreferences();const voiceError=ref(``);onMounted(async()=>{if(!props.voice)return;try{await props.voice.connect()}catch(error){voiceError.value=error?.message||`Speaking voices could not load.`}});return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[__props.binding?.preferenceTarget?(openBlock(),createBlock(unref(_sfc_main$50),{key:0,"model-value":unref(avatars)[__props.binding.preferenceTarget],hint:`Saved in this browser for this assistant type.`,"onUpdate:modelValue":_cache[0]||(_cache[0]=value=>unref(setAvatar)(__props.binding.preferenceTarget,value))},null,8,[`model-value`])):createCommentVNode(``,true),__props.voice?(openBlock(),createElementBlock(Fragment,{key:1},[voiceError.value?(openBlock(),createBlock(VAlert,{key:0,type:`error`,density:`compact`,class:`mt-3`},{default:withCtx(()=>[createTextVNode(toDisplayString(voiceError.value),1)]),_:1})):createCommentVNode(``,true),createVNode(unref(_sfc_main$57),{voice:__props.voice,class:`mt-3`},null,8,[`voice`])],64)):createCommentVNode(``,true)],64)}}};var _sfc_main$41={__name:`Vibe64LocalVoiceHost`,setup(__props){const{avatars}=useVibe64LocalAvatarPreferences();const preferences=computed(()=>Object.fromEntries(Object.entries(avatars.value).map(([target,avatar])=>[target,{avatar}])));return(_ctx,_cache)=>{return openBlock(),createBlock(unref(Vibe64VoiceHost_default),{preferences:preferences.value},{avatar:withCtx(({mouthLevel,mouthPose,state,binding})=>[createVNode(unref(_sfc_main$51),{avatar:unref(avatars)[binding?.preferenceTarget]||unref(avatars).coding,"mouth-level":mouthLevel,"mouth-pose":mouthPose,state},null,8,[`avatar`,`mouth-level`,`mouth-pose`,`state`])]),settings:withCtx(({binding,voice})=>[createVNode(_sfc_main$42,{binding,voice},null,8,[`binding`,`voice`])]),default:withCtx(()=>[renderSlot(_ctx.$slots,`default`)]),_:3},8,[`preferences`])}}};var SIDES=Object.freeze([`right`,`left`,`below`,`above`]);var ARROW_INSET=20;function clamp(value,min,max){return Math.max(min,Math.min(value,max))}function coveredArea(a,b){const width=Math.min(a.left+a.width,b.left+b.width)-Math.max(a.left,b.left);const height=Math.min(a.top+a.height,b.top+b.height)-Math.max(a.top,b.top);return Math.max(0,width)*Math.max(0,height)}function besideTop(ring,caption,viewport,margin){return clamp(ring.top+ring.height/2-caption.height/2,margin,viewport.height-margin-caption.height)}function stackedLeft(ring,caption,viewport,margin){return clamp(ring.left,margin,viewport.width-margin-caption.width)}function candidate(side,ring,caption,viewport,{gap,margin}){switch(side){case`right`:return{top:besideTop(ring,caption,viewport,margin),left:ring.left+ring.width+gap};case`left`:return{top:besideTop(ring,caption,viewport,margin),left:ring.left-gap-caption.width};case`below`:return{top:ring.top+ring.height+gap,left:stackedLeft(ring,caption,viewport,margin)};default:return{top:ring.top-gap-caption.height,left:stackedLeft(ring,caption,viewport,margin)}}}function fits(box,caption,viewport,margin){return box.left>=margin&&box.top>=margin&&box.left+caption.width<=viewport.width-margin&&box.top+caption.height<=viewport.height-margin}function arrowOffset(side,box,ring,caption){const beside=side===`right`||side===`left`;const centre=beside?ring.top+ring.height/2-box.top:ring.left+ring.width/2-box.left;const length=beside?caption.height:caption.width;return clamp(centre,Math.min(ARROW_INSET,length/2),Math.max(length-ARROW_INSET,length/2))}function placeGuideCaption({ring,caption,viewport,avoid=[],gap=14,margin=8}){const placements=SIDES.map(side=>({side,...candidate(side,ring,caption,viewport,{gap,margin})})).filter(box=>fits(box,caption,viewport,margin));const covered=box=>avoid.reduce((sum,rect)=>sum+coveredArea({...box,...caption},rect),0);const chosen=placements.reduce((best,box)=>best&&covered(best)<=covered(box)?best:box,null);if(chosen)return{...chosen,arrow:arrowOffset(chosen.side,chosen,ring,caption)};return{side:`inside`,top:Math.max(margin,ring.top)+gap,left:stackedLeft(ring,caption,viewport,margin),arrow:0}}var _hoisted_1$25=[`data-guide-step`];var _hoisted_2$20={class:`training-guide-overlay__caption-text`};var _hoisted_3$19={key:0,class:`training-guide-overlay__timer`,"aria-hidden":`true`};var KEEP_CLEAR_SELECTOR=`[data-vibe64-guide="lesson-bar"]`;var pad=6;var gap=14;var captionMaxWidth=352;var _sfc_main$40={__name:`TrainingGuideOverlay`,setup(__props){const unregister=registerTrainingGuideOverlay();const rect=ref(null);const caption=ref(null);const captionSize=ref(null);const keepClear=ref([]);const lifetime=ref(0);const reducedMotion=ref(Boolean(globalThis.matchMedia?.(`(prefers-reduced-motion: reduce)`)?.matches));let frame=0;let timer=null;let element=null;function stop(){if(frame)globalThis.cancelAnimationFrame?.(frame);frame=0;clearTimeout(timer);timer=null;globalThis.document?.removeEventListener(`pointerdown`,dismiss,true);globalThis.document?.removeEventListener(`keydown`,dismiss,true)}function dismiss(){clearTrainingGuide(trainingGuide.value?.id)}function box(target){const{top,left,width,height}=target.getBoundingClientRect();return{top,left,width,height}}function measure(){const guide=trainingGuide.value;if(!guide)return;element=currentTrainingGuideElement({...guide,element});if(!element){clearTrainingGuide(guide.id);return}rect.value=box(element);keepClear.value=[...globalThis.document?.querySelectorAll?.(KEEP_CLEAR_SELECTOR)||[]].map(box);captionSize.value=caption.value?.getBoundingClientRect?box(caption.value):null;if(globalThis.requestAnimationFrame)frame=globalThis.requestAnimationFrame(measure)}watch(trainingGuide,guide=>{stop();rect.value=null;element=guide?.element||null;if(!guide)return;if(Number.isFinite(guide.expiresAt)){lifetime.value=Math.max(0,guide.expiresAt-Date.now());timer=setTimeout(()=>clearTrainingGuide(guide.id),lifetime.value);globalThis.document?.addEventListener(`pointerdown`,dismiss,true);globalThis.document?.addEventListener(`keydown`,dismiss,true)}measure()},{immediate:true});onBeforeUnmount(()=>{stop();unregister()});const ring=computed(()=>rect.value&&{top:rect.value.top-pad,left:rect.value.left-pad,width:rect.value.width+12,height:rect.value.height+12});const ringStyle=computed(()=>ring.value&&{top:`${ring.value.top}px`,left:`${ring.value.left}px`,width:`${ring.value.width}px`,height:`${ring.value.height}px`});const captionWidth=computed(()=>Math.min(captionMaxWidth,(globalThis.innerWidth||368)-16));const placement=computed(()=>ring.value&&placeGuideCaption({ring:ring.value,caption:captionSize.value||{width:captionWidth.value,height:56},viewport:{width:globalThis.innerWidth||0,height:globalThis.innerHeight||0},avoid:keepClear.value,gap}));const captionStyle=computed(()=>placement.value&&{top:`${placement.value.top}px`,left:`${placement.value.left}px`,maxWidth:`${captionWidth.value}px`,"--training-guide-arrow":`${placement.value.arrow}px`,"--training-guide-lifetime":`${lifetime.value}ms`});return(_ctx,_cache)=>{return openBlock(),createBlock(Teleport,{to:`body`},[unref(trainingGuide)&&rect.value?(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`training-guide-overlay`,{"training-guide-overlay--still":reducedMotion.value}]),"data-guide-step":unref(trainingGuide).step,"aria-live":`polite`},[createBaseVNode(`div`,{class:`training-guide-overlay__spotlight`,style:normalizeStyle(ringStyle.value),"aria-hidden":`true`},null,4),createBaseVNode(`div`,{class:`training-guide-overlay__ring`,style:normalizeStyle(ringStyle.value)},null,4),unref(trainingGuide).caption?(openBlock(),createElementBlock(`div`,{key:0,ref_key:`caption`,ref:caption,class:normalizeClass([`training-guide-overlay__caption`,`training-guide-overlay__caption--${placement.value.side}`]),style:normalizeStyle(captionStyle.value)},[_cache[0]||(_cache[0]=createBaseVNode(`svg`,{class:`training-guide-overlay__caption-icon`,viewBox:`0 0 24 24`,"aria-hidden":`true`,focusable:`false`},[createBaseVNode(`path`,{d:`M10,9A1,1 0 0,1 11,8A1,1 0 0,1 12,9V13.47L13.21,13.6L18.15,15.79C18.68,16.03 19,16.56 19,17.14V21.5C18.97,22.32 18.32,22.97 17.5,23H11C10.62,23 10.26,22.85 10,22.57L5.1,18.37L5.84,17.6C6.03,17.39 6.3,17.28 6.58,17.28H6.8L10,19V9M11,5A4,4 0 0,1 15,9C15,10.5 14.2,11.77 13,12.46V11.24C13.61,10.69 14,9.89 14,9A3,3 0 0,0 11,6A3,3 0 0,0 8,9C8,9.89 8.39,10.69 9,11.24V12.46C7.8,11.77 7,10.5 7,9A4,4 0 0,1 11,5Z`})],-1)),createBaseVNode(`span`,_hoisted_2$20,toDisplayString(unref(trainingGuide).caption),1),Number.isFinite(unref(trainingGuide).expiresAt)?(openBlock(),createElementBlock(`span`,_hoisted_3$19)):createCommentVNode(``,true)],6)):createCommentVNode(``,true)],10,_hoisted_1$25)):createCommentVNode(``,true)])}}};var TrainingGuideOverlay_default=_plugin_vue_export_helper_default(_sfc_main$40,[[`__scopeId`,`data-v-5126a055`]]);function useVibe64Learning(){return inject$1(VIBE64_LEARNING_KEY,null)}function useVibe64LearningCourses({active}={}){const viewer=inject$1(VIBE64_ASSISTANT_VIEWER_KEY,{actorKey:`local`});const actorKey=computed(()=>String(toValue(viewer)?.actorKey||``));const open=computed(()=>toValue(active)===true);let generation=0;let disposed=false;watch(()=>[actorKey.value,open.value],()=>{generation+=1},{flush:`sync`});onScopeDispose(()=>{disposed=true;generation+=1});function readResource(name,path,enabled=null){const client=getHttpWebClient();const original=useEndpointResource({path,queryKey:computed(()=>[`vibe64`,`training`,name,actorKey.value||`signed-out`]),enabled:computed(()=>Boolean(actorKey.value)&&(!enabled||toValue(enabled)===true)),client:{async request(path,options){return{reader:actorKey.value,value:await client.request(path,options)}}},queryOptions:{retry:false},fallbackLoadError:`The saved lessons could not be read. Refresh to try again.`});const data=computed(()=>{const status=Number(original.query.error.value?.statusCode||original.query.error.value?.status||0);const result=original.data.value;return actorKey.value&&(!enabled||toValue(enabled)===true)&&status!==401&&status!==403&&result?.reader===actorKey.value?result.value:null});async function refetch(options){if(!actorKey.value||disposed||enabled&&toValue(enabled)!==true)return null;const reader=actorKey.value;return{...await original.query.refetch(options),data:reader===actorKey.value&&!disposed?data.value:null}}return Object.freeze({...original,data,query:{...original.query,data,refetch},reload:()=>refetch()})}const coursesResource=readResource(`courses`,VIBE64_LEARNING_ROUTES.courses);const learningResource=readResource(`learning`,VIBE64_LEARNING_ROUTES.learning);const availableResource=readResource(`available`,VIBE64_LEARNING_ROUTES.available,open);const hostReads=new Set;watch(open,(value,previous)=>{if(value&&!previous)refresh()});const learnerId=computed(()=>learningResource.data.value?.ok===true&&learningResource.data.value?.available===true&&typeof learningResource.data.value.learnerId===`string`?learningResource.data.value.learnerId:``);const busy=ref(false);const pendingStart=shallowRef(null);const starting=ref(false);const startRetry=computed(()=>!starting.value&&pendingStart.value?.actor===actorKey.value?pendingStart.value.input:null);const command=useCommand({ownershipFilter:ROUTE_VISIBILITY_PUBLIC,surfaceId:`app`,access:`never`,apiSuffix:`/vibe64/training`,placementSource:`vibe64.training.learning-mode`,suppressSuccessMessage:true,buildRawPayload:(_model,{context})=>context.body,buildCommandOptions:(_model,{context})=>({method:`POST`,path:context.path}),fallbackRunError:`The lesson request was not confirmed. Retry the same request before starting another lesson.`});function capture(){if(disposed||!actorKey.value||!open.value||!learnerId.value)throw new Error(`Open Courses and read your saved lessons before making a lesson request.`);return Object.freeze({actor:actorKey.value,learnerId:learnerId.value,generation})}const current=scope=>!disposed&&scope.actor===actorKey.value&&scope.learnerId===learnerId.value&&scope.generation===generation&&open.value&&(!scope.savedIn||scope.savedIn.current()===true);async function refresh(){if(!actorKey.value||disposed)return null;return Promise.all([coursesResource.reload(),learningResource.reload(),availableResource.reload(),...[...hostReads].map(read=>read.reload())])}function hostRead(name,path,enabled=null){const resource=readResource(name,path,enabled);hostReads.add(resource);onScopeDispose(()=>hostReads.delete(resource));return resource}async function prepare(path,body,scope,{attemptId=``,onAdmitted=null}={}){const result=await command.run({path,body});if(!result||result.ok!==true||result.available!==true)throw new Error(`The lesson request did not return a confirmed saved attempt. Retry the same request.`);const admitted=result.attempt?.ended?result.attempt:result.active;if(!admitted?.attemptId||attemptId&&admitted.attemptId!==attemptId)throw new Error(`The lesson response did not confirm the requested attempt.`);const handedOver=typeof onAdmitted===`function`&&!admitted.ended&¤t(scope);const stillCurrent=handedOver?()=>scope.actor===actorKey.value&&scope.learnerId===learnerId.value:()=>current(scope);if(handedOver)onAdmitted(admitted.attemptId);if(stillCurrent()){await learningResource.reload();if(scope.savedIn)await scope.savedIn.reload()}return{result,attemptId:admitted.attemptId,learnerId:scope.learnerId,ended:Boolean(admitted.ended),current:stillCurrent()}}async function startLesson(selection,{onAdmitted=null}={}){if(busy.value)return null;const scope=capture();const input=Object.freeze({courseId:selection.courseId,release:selection.release,lessonCode:selection.lessonCode,expectedRevision:selection.expectedRevision,...selection.archiveCurrent===true?{archiveCurrent:true}:{}});let request=pendingStart.value;if(request?.actor===scope.actor){if(!(Object.keys(input).every(key=>input[key]===request.input[key])&&Object.keys(request.input).length===Object.keys(input).length))throw new Error(`A previous start was not confirmed. Retry that same lesson request first.`)}else{request=Object.freeze({actor:scope.actor,input,requestId:globalThis.crypto.randomUUID()});pendingStart.value=request}busy.value=true;starting.value=true;try{const outcome=await prepare(VIBE64_LEARNING_ROUTES.lessonStart,{...request.input,requestId:request.requestId},scope,{onAdmitted});if(pendingStart.value===request)pendingStart.value=null;return{...outcome,requestId:request.requestId}}catch(cause){if(cause?.code===VIBE64_LESSON_IN_PROGRESS_CODE&&pendingStart.value===request)pendingStart.value=null;throw cause}finally{busy.value=false;starting.value=false}}async function resume(attemptId,scope,onAdmitted){busy.value=true;try{return await prepare(VIBE64_LEARNING_ROUTES.lessonResume(attemptId),{},scope,{attemptId,onAdmitted})}finally{busy.value=false}}async function resumeLesson(attemptId,{onAdmitted=null,savedIn=null}={}){if(busy.value)return null;const scope=Object.freeze({...capture(),...savedIn?{savedIn}:{}});if(savedIn&&(!attemptId||!current(scope)))throw new Error(`Read this exact saved lesson before reopening it.`);return resume(attemptId,scope,onAdmitted)}async function createCourse({title,topics,expectedRevision}={}){if(busy.value)return null;capture();busy.value=true;try{const result=await command.run({path:VIBE64_LEARNING_ROUTES.courses,body:{title,topics,expectedRevision}});if(result?.ok!==true||!result.course?.courseId)throw new Error(result?.error||`The new course was not confirmed. Refresh courses before trying again.`);await coursesResource.reload();return result}finally{busy.value=false}}const installRecord=shallowRef(null);const installState=computed(()=>installRecord.value?.actor===actorKey.value?installRecord.value:null);async function installCourse({courseId,release}={}){if(busy.value)return null;const scope=capture();const target=Object.freeze({actor:scope.actor,courseId,release});busy.value=true;installRecord.value=Object.freeze({...target,phase:`installing`,message:``});const poll=setInterval(()=>{availableResource.reload()},1500);try{const result=await command.run({path:VIBE64_LEARNING_ROUTES.courseInstall,body:{courseId,release}});if(result?.ok!==true||result.course?.courseId!==courseId||result.course.release!==release)throw new Error(result?.error||`The course installation was not confirmed. Refresh courses, then retry.`);if(installRecord.value?.courseId===courseId&&installRecord.value.release===release)installRecord.value=null;await Promise.all([coursesResource.reload(),availableResource.reload()]);return result}catch(cause){if(current(scope))installRecord.value=Object.freeze({...target,phase:`failed`,message:String(cause?.message||`The course installation was not confirmed. Refresh courses, then retry.`)});return null}finally{clearInterval(poll);busy.value=false}}return Object.freeze({active:open,coursesResource,learningResource,availableResource,installState,installCourse,learnerId,busy,starting,startRetry,refresh,hostRead,startLesson,resumeLesson,createCourse})}var _hoisted_1$24=[`aria-labelledby`,`data-test`];var _hoisted_2$19=[`id`];var _hoisted_3$18={class:`vibe64-learning-attempts__intro`};var _hoisted_4$13={key:1,class:`vibe64-learning-attempts__loading`,role:`status`,"data-test":`learning-attempts-loading`};var _hoisted_5$13={key:0,class:`vibe64-learning-attempts__empty`,"data-test":`learning-progress-empty`};var _hoisted_6$9=[`data-attempt-id`];var _hoisted_7$8={class:`vibe64-learning-attempts__text`};var _hoisted_8$8={class:`vibe64-learning-attempts__name`};var _hoisted_9$6={class:`vibe64-learning-attempts__status`};var _hoisted_10$6={key:0,class:`vibe64-learning-attempts__empty`,"data-test":`learning-archived-empty`};var _hoisted_11$6={key:1,class:`vibe64-learning-attempts__list`};var _hoisted_12$6=[`data-attempt-id`];var _hoisted_13$6={class:`vibe64-learning-attempts__text`};var _hoisted_14$6={class:`vibe64-learning-attempts__name`};var _hoisted_15$6={class:`vibe64-learning-attempts__status`};var _sfc_main$39={__name:`Vibe64LearningAttempts`,props:{learning:{type:Object,required:true},archived:Boolean},setup(__props){const props=__props;const practice=computed(()=>props.learning.practice);const current=computed(()=>practice.value.current);const busy=computed(()=>props.learning.state.busy);const confirming=ref(``);onMounted(()=>{props.learning.readPractice()});const dateLabel=value=>{const date=new Date(value);return Number.isNaN(date.getTime())?``:date.toLocaleDateString(void 0,{year:`numeric`,month:`short`,day:`numeric`})};async function confirmThen(key,action){if(confirming.value!==key){confirming.value=key;return}confirming.value=``;await action()}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:`vibe64-learning-attempts`,"aria-labelledby":`vibe64-learning-attempts-${__props.archived?`archived`:`progress`}`,"data-test":__props.archived?`learning-archived`:`learning-progress`},[createBaseVNode(`h2`,{id:`vibe64-learning-attempts-${__props.archived?`archived`:`progress`}`,class:`vibe64-learning-attempts__title`},toDisplayString(__props.archived?`Archived`:`In progress`),9,_hoisted_2$19),createBaseVNode(`p`,_hoisted_3$18,toDisplayString(__props.archived?`Lessons you finished or archived, each with its practice project and conversation.`:`Your lesson in progress. It stays paused, with its practice project and conversation, until you finish, restart or delete it.`),1),__props.learning.state.attemptsError?(openBlock(),createBlock(VAlert,{key:0,type:`error`,variant:`tonal`,density:`compact`,class:`vibe64-learning-attempts__error`,"data-test":`learning-attempts-error`},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.learning.state.attemptsError),1)]),_:1})):createCommentVNode(``,true),!practice.value.loaded&&!__props.learning.state.attemptsError?(openBlock(),createElementBlock(`div`,_hoisted_4$13,[createVNode(VProgressCircular,{indeterminate:``,size:`20`,width:`2`,color:`primary`}),createTextVNode(toDisplayString(__props.archived?`Loading archived lessons…`:`Loading your lesson…`),1)])):!__props.archived?(openBlock(),createElementBlock(Fragment,{key:2},[practice.value.loaded&&!current.value?(openBlock(),createElementBlock(`p`,_hoisted_5$13,` No lesson in progress. Start one from Courses. `)):current.value?(openBlock(),createElementBlock(`div`,{key:1,class:`vibe64-learning-attempts__row`,"data-attempt-id":current.value.attemptId},[createBaseVNode(`div`,_hoisted_7$8,[createBaseVNode(`span`,_hoisted_8$8,toDisplayString(current.value.name),1),createBaseVNode(`span`,_hoisted_9$6,toDisplayString(current.value.status===`deleting`?`Being deleted`:current.value.projectName||`No practice project`),1)]),current.value.status!==`deleting`?(openBlock(),createElementBlock(Fragment,{key:0},[createVNode(VBtn,{variant:`flat`,color:`primary`,rounded:`pill`,"min-height":`48`,disabled:Boolean(busy.value),"data-test":`learning-progress-open`,onClick:_cache[0]||(_cache[0]=$event=>__props.learning.openCurrent())},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(`Open`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{variant:confirming.value===`restart`?`flat`:`tonal`,color:confirming.value===`restart`?`warning`:void 0,rounded:`pill`,"min-height":`48`,disabled:Boolean(busy.value),loading:busy.value===`restart`,title:`Archive this attempt and start the lesson again`,"data-test":`learning-progress-restart`,onClick:_cache[1]||(_cache[1]=$event=>confirmThen(`restart`,()=>__props.learning.restart()))},{default:withCtx(()=>[createTextVNode(toDisplayString(confirming.value===`restart`?`Archive and restart`:`Restart`),1)]),_:1},8,[`variant`,`color`,`disabled`,`loading`])],64)):createCommentVNode(``,true),createVNode(VBtn,{variant:confirming.value===`current`?`flat`:`text`,color:confirming.value===`current`?`error`:void 0,rounded:`pill`,"min-height":`48`,disabled:Boolean(busy.value),loading:busy.value===`delete`,title:`Delete ${current.value.name}, its practice project and its conversation`,"data-test":`learning-progress-delete`,onClick:_cache[2]||(_cache[2]=$event=>confirmThen(`current`,()=>__props.learning.deleteAttempt()))},{default:withCtx(()=>[createTextVNode(toDisplayString(confirming.value===`current`?`Delete for good`:`Delete`),1)]),_:1},8,[`variant`,`color`,`disabled`,`loading`,`title`])],8,_hoisted_6$9)):createCommentVNode(``,true)],64)):(openBlock(),createElementBlock(Fragment,{key:3},[practice.value.loaded&&!practice.value.archived.length?(openBlock(),createElementBlock(`p`,_hoisted_10$6,` Nothing archived yet. `)):(openBlock(),createElementBlock(`ul`,_hoisted_11$6,[(openBlock(true),createElementBlock(Fragment,null,renderList(practice.value.archived,entry=>{return openBlock(),createElementBlock(`li`,{key:entry.attemptId,class:`vibe64-learning-attempts__row`,"data-attempt-id":entry.attemptId},[createBaseVNode(`div`,_hoisted_13$6,[createBaseVNode(`span`,_hoisted_14$6,toDisplayString(entry.name),1),createBaseVNode(`span`,_hoisted_15$6,toDisplayString(entry.reason===`finished`?`Finished`:`Archived`)+` `+toDisplayString(dateLabel(entry.archivedAt))+toDisplayString(entry.hasProject?` · with practice project`:``),1)]),confirming.value===entry.attemptId?(openBlock(),createBlock(VBtn,{key:0,variant:`flat`,color:`error`,rounded:`pill`,"min-height":`48`,disabled:Boolean(busy.value),"data-test":`learning-archived-delete-confirm`,onClick:$event=>confirmThen(entry.attemptId,()=>__props.learning.deleteArchived(entry.attemptId))},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(`Delete for good`,-1)])]),_:1},8,[`disabled`,`onClick`])):(openBlock(),createBlock(VBtn,{key:1,variant:`text`,icon:unref(mdiDeleteOutline),"min-width":`48`,"min-height":`48`,"aria-label":`Delete archived ${entry.name}`,title:`Delete archived ${entry.name}`,disabled:Boolean(busy.value),loading:busy.value===`archive-delete:${entry.attemptId}`,"data-test":`learning-archived-delete`,onClick:$event=>confirmThen(entry.attemptId,()=>__props.learning.deleteArchived(entry.attemptId))},null,8,[`icon`,`aria-label`,`title`,`disabled`,`loading`,`onClick`]))],8,_hoisted_12$6)}),128))]))],64))],8,_hoisted_1$24)}}};var Vibe64LearningAttempts_default=_plugin_vue_export_helper_default(_sfc_main$39,[[`__scopeId`,`data-v-501a7042`]]);var trainingIcons=Object.freeze({refresh:`M17.65,6.35C16.2,4.9 14.21,4 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20C15.73,20 18.84,17.45 19.73,14H17.65C16.83,16.33 14.61,18 12,18A6,6 0 0,1 6,12A6,6 0 0,1 12,6C13.66,6 15.14,6.69 16.22,7.78L13,11H20V4L17.65,6.35Z`,play:`M8,5.14V19.14L19,12.14L8,5.14Z`,plus:`M19,13H13V19H11V13H5V11H11V5H13V11H19V13Z`,arrowRight:`M4,11V13H16L10.5,18.5L11.92,19.92L19.84,12L11.92,4.08L10.5,5.5L16,11H4Z`,checkCircle:`M12 2C6.5 2 2 6.5 2 12S6.5 22 12 22 22 17.5 22 12 17.5 2 12 2M10 17L5 12L6.41 10.59L10 14.17L17.59 6.58L19 8L10 17Z`,eye:`M12,9A3,3 0 0,1 15,12A3,3 0 0,1 12,15A3,3 0 0,1 9,12A3,3 0 0,1 12,9M12,4.5C17,4.5 21.27,7.61 23,12C21.27,16.39 17,19.5 12,19.5C7,19.5 2.73,16.39 1,12C2.73,7.61 7,4.5 12,4.5M3.18,12C4.83,15.36 8.24,17.5 12,17.5C15.76,17.5 19.17,15.36 20.82,12C19.17,8.64 15.76,6.5 12,6.5C8.24,6.5 4.83,8.64 3.18,12Z`,cancel:`M12 2C17.5 2 22 6.5 22 12S17.5 22 12 22 2 17.5 2 12 6.5 2 12 2M12 4C10.1 4 8.4 4.6 7.1 5.7L18.3 16.9C19.3 15.5 20 13.8 20 12C20 7.6 16.4 4 12 4M16.9 18.3L5.7 7.1C4.6 8.4 4 10.1 4 12C4 16.4 7.6 20 12 20C13.9 20 15.6 19.4 16.9 18.3Z`,trophy:`M18 2C17.1 2 16 3 16 4H8C8 3 6.9 2 6 2H2V11C2 12 3 13 4 13H6.2C6.6 15 7.9 16.7 11 17V19.08C8 19.54 8 22 8 22H16C16 22 16 19.54 13 19.08V17C16.1 16.7 17.4 15 17.8 13H20C21 13 22 12 22 11V2H18M6 11H4V4H6V11M16 11.5C16 13.43 15.42 15 12 15C8.59 15 8 13.43 8 11.5V6H16V11.5M20 11H18V4H20V11Z`,history:`M13.5,8H12V13L16.28,15.54L17,14.33L13.5,12.25V8M13,3A9,9 0 0,0 4,12H1L4.96,16.03L9,12H6A7,7 0 0,1 13,5A7,7 0 0,1 20,12A7,7 0 0,1 13,19C11.07,19 9.32,18.21 8.06,16.94L6.64,18.36C8.27,20 10.5,21 13,21A9,9 0 0,0 22,12A9,9 0 0,0 13,3`,school:`M12 3L1 9L5 11.18V17.18L12 21L19 17.18V11.18L21 10.09V17H23V9L12 3M18.82 9L12 12.72L5.18 9L12 5.28L18.82 9M17 16L12 18.72L7 16V12.27L12 15L17 12.27V16Z`,bookmark:`M17,18L12,15.82L7,18V5H17M17,3H7A2,2 0 0,0 5,5V21L12,18L19,21V5C19,3.89 18.1,3 17,3Z`,book:`M19 1L14 6V17L19 12.5V1M21 5V18.5C19.9 18.15 18.7 18 17.5 18C15.8 18 13.35 18.65 12 19.5V6C10.55 4.9 8.45 4.5 6.5 4.5C4.55 4.5 2.45 4.9 1 6V20.65C1 20.9 1.25 21.15 1.5 21.15C1.6 21.15 1.65 21.1 1.75 21.1C3.1 20.45 5.05 20 6.5 20C8.45 20 10.55 20.4 12 21.5C13.35 20.65 15.8 20 17.5 20C19.15 20 20.85 20.3 22.25 21.05C22.35 21.1 22.4 21.1 22.5 21.1C22.75 21.1 23 20.85 23 20.6V6C22.4 5.55 21.75 5.25 21 5M10 18.41C8.75 18.09 7.5 18 6.5 18C5.44 18 4.18 18.19 3 18.5V7.13C3.91 6.73 5.14 6.5 6.5 6.5C7.86 6.5 9.09 6.73 10 7.13V18.41Z`,chevronUp:`M7.41,15.41L12,10.83L16.59,15.41L18,14L12,8L6,14L7.41,15.41Z`,chevronDown:`M7.41,8.58L12,13.17L16.59,8.58L18,10L12,16L6,10L7.41,8.58Z`,path:`M18,15A3,3 0 0,1 21,18A3,3 0 0,1 18,21C16.69,21 15.58,20.17 15.17,19H14V17H15.17C15.58,15.83 16.69,15 18,15M18,17A1,1 0 0,0 17,18A1,1 0 0,0 18,19A1,1 0 0,0 19,18A1,1 0 0,0 18,17M18,8A1.43,1.43 0 0,0 19.43,6.57C19.43,5.78 18.79,5.14 18,5.14C17.21,5.14 16.57,5.78 16.57,6.57A1.43,1.43 0 0,0 18,8M18,2.57A4,4 0 0,1 22,6.57C22,9.56 18,14 18,14C18,14 14,9.56 14,6.57A4,4 0 0,1 18,2.57M8.83,17H10V19H8.83C8.42,20.17 7.31,21 6,21A3,3 0 0,1 3,18C3,16.69 3.83,15.58 5,15.17V14H7V15.17C7.85,15.47 8.53,16.15 8.83,17M6,17A1,1 0 0,0 5,18A1,1 0 0,0 6,19A1,1 0 0,0 7,18A1,1 0 0,0 6,17M6,3A3,3 0 0,1 9,6C9,7.31 8.17,8.42 7,8.83V10H5V8.83C3.83,8.42 3,7.31 3,6A3,3 0 0,1 6,3M6,5A1,1 0 0,0 5,6A1,1 0 0,0 6,7A1,1 0 0,0 7,6A1,1 0 0,0 6,5M11,19V17H13V19H11M7,13H5V11H7V13Z`,check:`M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z`,layers:`M12,18.54L19.37,12.8L21,14.07L12,21.07L3,14.07L4.62,12.81L12,18.54M12,16L3,9L12,2L21,9L12,16M12,4.53L6.26,9L12,13.47L17.74,9L12,4.53Z`,info:`M11,9H13V7H11M12,20C7.59,20 4,16.41 4,12C4,7.59 7.59,4 12,4C16.41,4 20,7.59 20,12C20,16.41 16.41,20 12,20M12,2A10,10 0 0,0 2,12A10,10 0 0,0 12,22A10,10 0 0,0 22,12A10,10 0 0,0 12,2M11,17H13V11H11V17Z`,download:`M5,20H19V18H5M19,9H15V3H9V9H5L12,16L19,9Z`,update:`M21,10.12H14.22L16.96,7.3C14.23,4.6 9.81,4.5 7.08,7.2C4.35,9.91 4.35,14.28 7.08,17C9.81,19.7 14.23,19.7 16.96,17C18.32,15.65 19,14.08 19,12.1H21C21,14.08 20.12,16.65 18.36,18.39C14.85,21.87 9.15,21.87 5.64,18.39C2.14,14.92 2.11,9.28 5.62,5.81C9.13,2.34 14.76,2.34 18.27,5.81L21,3V10.12M12.5,8V12.25L16,14.33L15.28,15.54L11,13V8H12.5Z`,close:`M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z`});var _hoisted_1$23={class:`training-course-creator`,"aria-label":`New course`};var _hoisted_2$18={class:`tcc-header`};var _hoisted_3$17={class:`tcc-header__icon`,"aria-hidden":`true`};var _hoisted_4$12={class:`tcc-steps`};var _hoisted_5$12={class:`tcc-step__marker`,"aria-hidden":`true`};var _hoisted_6$8={class:`tcc-step__body`};var _hoisted_7$7={class:`tcc-step__marker`,"aria-hidden":`true`};var _hoisted_8$7={class:`tcc-step__body`};var _hoisted_9$5={key:0,class:`tcc-empty`,role:`status`};var _hoisted_10$5=[`disabled`];var _hoisted_11$5={class:`tcc-topics`};var _hoisted_12$5={key:0,class:`tcc-step tcc-step--done`};var _hoisted_13$5={class:`tcc-step__body`};var _hoisted_14$5={class:`training-course-creator__order`};var _hoisted_15$5={class:`tcc-order__index`,"aria-hidden":`true`};var _hoisted_16$5={class:`tcc-order__name`};var _hoisted_17$5={class:`tcc-order__moves`};var _hoisted_18$5={class:`tcc-actions`};var _sfc_main$38={__name:`TrainingCourseCreator`,props:{topics:{type:Array,required:true},busy:Boolean},emits:[`create`,`cancel`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const name=ref(``);const selected=ref([]);const key=topic=>JSON.stringify([topic.topicId,topic.release]);const chosen=computed(()=>selected.value.map(value=>props.topics.find(topic=>key(topic)===value)).filter(Boolean));const createEnabled=computed(()=>!props.busy&&name.value.trim().length>0&&name.value.trim().length<=120&&chosen.value.length>0);function toggle(topic,checked){const value=key(topic);selected.value=checked?[...selected.value.filter(item=>item!==value),value]:selected.value.filter(item=>item!==value)}function move(index,offset){const order=chosen.value.map(key);[order[index],order[index+offset]]=[order[index+offset],order[index]];selected.value=order}function requestCreate(){if(createEnabled.value)emit(`create`,{title:name.value.trim(),topics:chosen.value.map(({topicId,release})=>({topicId,release}))})}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1$23,[createBaseVNode(`header`,_hoisted_2$18,[createBaseVNode(`span`,_hoisted_3$17,[createVNode(VIcon,{icon:unref(trainingIcons).path,size:`28`},null,8,[`icon`])]),_cache[2]||(_cache[2]=createBaseVNode(`div`,null,[createBaseVNode(`h3`,{id:`tcc-title`},`New course`),createBaseVNode(`p`,null,`Name the course and choose whole installed topics in the order to learn them. Lessons and their saved progress are shared with every course that contains them.`)],-1))]),createBaseVNode(`ol`,_hoisted_4$12,[createBaseVNode(`li`,{class:normalizeClass([`tcc-step`,{"tcc-step--done":name.value.trim().length>0}])},[createBaseVNode(`span`,_hoisted_5$12,[name.value.trim().length>0?(openBlock(),createBlock(VIcon,{key:0,icon:unref(trainingIcons).check,size:`16`},null,8,[`icon`])):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(`1`)],64))]),createBaseVNode(`div`,_hoisted_6$8,[_cache[3]||(_cache[3]=createBaseVNode(`p`,{class:`tcc-step__title`},`Name it`,-1)),createVNode(VTextField,{modelValue:name.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>name.value=$event),label:`Course name`,counter:`120`,maxlength:`120`,variant:`outlined`,rounded:`lg`,disabled:__props.busy},null,8,[`modelValue`,`disabled`])])],2),createBaseVNode(`li`,{class:normalizeClass([`tcc-step`,{"tcc-step--done":chosen.value.length>0}])},[createBaseVNode(`span`,_hoisted_7$7,[chosen.value.length>0?(openBlock(),createBlock(VIcon,{key:0,icon:unref(trainingIcons).check,size:`16`},null,8,[`icon`])):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(`2`)],64))]),createBaseVNode(`div`,_hoisted_8$7,[!__props.topics.length?(openBlock(),createElementBlock(`p`,_hoisted_9$5,`No topics from enabled released courses are installed. Ask the owner to install and enable a course first.`)):(openBlock(),createElementBlock(`fieldset`,{key:1,class:`training-course-creator__topics`,disabled:__props.busy},[_cache[4]||(_cache[4]=createBaseVNode(`legend`,{class:`tcc-step__title`},`Installed topics`,-1)),createBaseVNode(`div`,_hoisted_11$5,[(openBlock(true),createElementBlock(Fragment,null,renderList(__props.topics,topic=>{return openBlock(),createElementBlock(`div`,{key:key(topic),class:normalizeClass([`tcc-topic`,{"tcc-topic--on":selected.value.includes(key(topic))}])},[createVNode(VCheckbox,{"model-value":selected.value.includes(key(topic)),color:`primary`,density:`comfortable`,label:`${topic.title} · ${topic.release}`,"hide-details":``,"onUpdate:modelValue":$event=>toggle(topic,$event)},null,8,[`model-value`,`label`,`onUpdate:modelValue`])],2)}),128))])],8,_hoisted_10$5))])],2),chosen.value.length?(openBlock(),createElementBlock(`li`,_hoisted_12$5,[_cache[8]||(_cache[8]=createBaseVNode(`span`,{class:`tcc-step__marker`,"aria-hidden":`true`},`3`,-1)),createBaseVNode(`div`,_hoisted_13$5,[_cache[7]||(_cache[7]=createBaseVNode(`p`,{class:`tcc-step__title`},`Topic order`,-1)),createBaseVNode(`ol`,_hoisted_14$5,[(openBlock(true),createElementBlock(Fragment,null,renderList(chosen.value,(topic,index)=>{return openBlock(),createElementBlock(`li`,{key:key(topic)},[createBaseVNode(`span`,_hoisted_15$5,toDisplayString(index+1),1),createBaseVNode(`span`,_hoisted_16$5,toDisplayString(topic.title)+` · `+toDisplayString(topic.release),1),createBaseVNode(`span`,_hoisted_17$5,[createVNode(VBtn,{variant:`text`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).chevronUp,disabled:__props.busy||index===0,"aria-label":`Move ${topic.title} up`,onClick:$event=>move(index,-1)},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Up`,-1)])]),_:1},8,[`prepend-icon`,`disabled`,`aria-label`,`onClick`]),createVNode(VBtn,{variant:`text`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).chevronDown,disabled:__props.busy||index===chosen.value.length-1,"aria-label":`Move ${topic.title} down`,onClick:$event=>move(index,1)},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(`Down`,-1)])]),_:1},8,[`prepend-icon`,`disabled`,`aria-label`,`onClick`])])])}),128))])])])):createCommentVNode(``,true)]),createBaseVNode(`footer`,_hoisted_18$5,[createVNode(VBtn,{variant:`text`,rounded:`pill`,"min-height":`48`,disabled:__props.busy,onClick:_cache[1]||(_cache[1]=$event=>emit(`cancel`))},{default:withCtx(()=>[..._cache[9]||(_cache[9]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`]),createVNode(VBtn,{color:`primary`,variant:`flat`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).plus,disabled:!createEnabled.value,onClick:requestCreate},{default:withCtx(()=>[..._cache[10]||(_cache[10]=[createTextVNode(`Create course`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])])])}}};var TrainingCourseCreator_default=_plugin_vue_export_helper_default(_sfc_main$38,[[`__scopeId`,`data-v-c5c653a1`]]);function offered(course,lesson,canTryPreviews=false){return course.enabled&&(course.status===`released`||canTryPreviews)&&lesson.status===`published`}function previewCourse(course){return course.enabled&&course.status!==`released`}var previewNote=`Preview — the workspace owner can try it; it becomes startable when released.`;function lessonStatus(lesson,lessonProgress){const saved=lessonProgress.find(value=>value.lessonCode===lesson.code&&value.lessonHash===lesson.hash);if(saved?.completed)return`completed`;return saved&&(saved.open||saved.passed>0)?`in-progress`:`not-started`}function earlierCompletion(lesson,lessonProgress,attempts){const done=lessonProgress.filter(value=>value.lessonCode===lesson.code&&value.lessonHash!==lesson.hash&&value.completed);if(!done.length)return null;return{release:done.flatMap(value=>attempts.filter(attempt=>attempt?.pin?.lesson?.code===value.lessonCode&&attempt.pin.lesson.hash===value.lessonHash).map(attempt=>attempt.pin.course?.release)).filter(Boolean).at(-1)||``}}function courseProgress(course,lessonProgress=[],active=null,history=[],{canTryPreviews=false}={}){const attempts=[...history,...active?[active]:[]];const lessons=course.lessons.map(lesson=>{const status=lessonStatus(lesson,lessonProgress);const earlier=status===`completed`?null:earlierCompletion(lesson,lessonProgress,attempts);return{lesson,status,current:Boolean(lessonProgress.find(value=>value.lessonCode===lesson.code&&value.lessonHash===lesson.hash)?.open),...earlier?{earlier}:{}}});const next=lessons.find(value=>value.status!==`completed`&&offered(course,value.lesson,canTryPreviews))?.lesson||null;const counted=lessons.some(value=>value.lesson.required)?lessons.filter(value=>value.lesson.required):lessons;return{lessons,topics:course.topics.map(topic=>({...topic,lessons:lessons.filter(value=>value.lesson.topicId===topic.topicId&&value.lesson.topicRelease===topic.release)})),completed:counted.filter(value=>value.status===`completed`).length,total:counted.length,activeHere:Boolean(active&&active.pin.course.courseId===course.courseId&&active.pin.course.release===course.release),next}}var statusLabels=Object.freeze({completed:`Completed`,"in-progress":`In progress`,"not-started":`Not started`});function courseStatusLabel(course){return!course.enabled?`Disabled for new lessons`:course.status===`released`?`Enabled`:`Preview course`}function earlierCompletionLabel(earlier){return earlier?`Completed in ${earlier.release||`an earlier release`} · updated since`:``}function hashText(value){let hash=2166136261;for(const char of String(value)){hash^=char.codePointAt(0);hash=Math.imul(hash,16777619)}return hash>>>0}var patterns=Object.freeze([`waves`,`orbits`,`grid`,`peaks`]);function courseArt(courseId){const hash=hashText(courseId);const hue=hash%360;const shift=35+(hash>>>9)%50;return{id:`v64-course-art-${hash.toString(36)}`,pattern:patterns[(hash>>>3)%patterns.length],from:`hsl(${hue} 62% 38%)`,to:`hsl(${(hue+shift)%360} 70% 52%)`,accent:`hsl(${(hue+shift*2)%360} 90% 78%)`,seed:hash}}function courseMonogram(title){const words=String(title||``).split(/\s+[—–-]\s+/).pop().trim().split(/\s+/).filter(word=>/^[\p{L}\p{N}]/u.test(word));return(words.length>1?words[0][0]+words[1][0]:(words[0]||`?`).slice(0,2)).toUpperCase()}var _hoisted_1$22={class:`training-course-art`,"aria-hidden":`true`};var _hoisted_2$17={viewBox:`0 0 320 120`,preserveAspectRatio:`xMidYMid slice`,focusable:`false`};var _hoisted_3$16=[`id`];var _hoisted_4$11=[`stop-color`];var _hoisted_5$11=[`stop-color`];var _hoisted_6$7=[`id`];var _hoisted_7$6=[`stop-color`];var _hoisted_8$6=[`stop-color`];var _hoisted_9$4=[`fill`];var _hoisted_10$4=[`fill`];var _hoisted_11$4={key:0,fill:`none`,stroke:`#fff`,"stroke-linecap":`round`};var _hoisted_12$4=[`d`,`stroke-opacity`,`stroke-width`];var _hoisted_13$4={key:1,fill:`none`,stroke:`#fff`};var _hoisted_14$4=[`cx`,`cy`,`r`,`stroke-opacity`];var _hoisted_15$4=[`cx`,`cy`,`fill`];var _hoisted_16$4={key:2};var _hoisted_17$4=[`cx`,`cy`,`r`,`fill`,`fill-opacity`];var _hoisted_18$4={key:3,fill:`#fff`};var _hoisted_19$4=[`d`,`fill-opacity`];var _hoisted_20$4={key:4,class:`training-course-art__path`};var _hoisted_21$4=[`d`];var _hoisted_22$4=[`cx`,`cy`,`fill`,`stroke-opacity`];var _hoisted_23$4=[`d`,`stroke`];var _hoisted_24$3=[`cx`,`cy`];var _hoisted_25$2={class:`training-course-art__monogram`};var _sfc_main$37={__name:`TrainingCourseArt`,props:{courseId:{type:String,required:true},title:{type:String,default:``},statuses:{type:Array,default:()=>[]}},setup(__props){const props=__props;const art=computed(()=>courseArt(props.courseId));const monogram=computed(()=>courseMonogram(props.title));const rand=index=>(art.value.seed>>>index%24^index*2654435761)>>>0;const waves=computed(()=>[0,1,2].map(row=>{const y=34+row*30+rand(row)%10;const amp=8+rand(row+3)%10;return`M -10 ${y} C 60 ${y-amp}, 100 ${y+amp}, 170 ${y} S 280 ${y-amp}, 340 ${y}`}));const orbits=computed(()=>({cx:230+rand(1)%60,cy:20+rand(2)%50,radii:[26,52,80,110]}));const dots=computed(()=>{const list=[];for(let y=14;y<120;y+=18)for(let x=120;x<330;x+=18)list.push({x,y,on:rand(x*7+y)%7===0});return list});const peaks=computed(()=>[0,1,2].map(layer=>{const base=120;const step=70-layer*12;let d=`M -10 ${base}`;for(let x=-10,i=0;x<340;x+=step,i++)d+=` L ${x+step/2} ${50+layer*18+rand(layer*9+i)%26} L ${x+step} ${110+layer*4}`;return`${d} L 340 ${base} Z`}));const path=computed(()=>{const statuses=props.statuses.slice(0,12);const count=statuses.length;if(!count)return null;const start=108;const nodes=statuses.map((status,index)=>{return{x:count===1?204:start+192*index/(count-1),y:84-Math.sin(index/Math.max(1,count-1)*Math.PI)*26,status}});return{nodes,d:nodes.map((node,index)=>`${index?`L`:`M`} ${node.x.toFixed(1)} ${node.y.toFixed(1)}`).join(` `)}});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,_hoisted_1$22,[(openBlock(),createElementBlock(`svg`,_hoisted_2$17,[createBaseVNode(`defs`,null,[createBaseVNode(`linearGradient`,{id:`${art.value.id}-bg`,x1:`0`,y1:`0`,x2:`1`,y2:`1`},[createBaseVNode(`stop`,{offset:`0`,"stop-color":art.value.from},null,8,_hoisted_4$11),createBaseVNode(`stop`,{offset:`1`,"stop-color":art.value.to},null,8,_hoisted_5$11)],8,_hoisted_3$16),createBaseVNode(`radialGradient`,{id:`${art.value.id}-glow`,cx:`0.85`,cy:`0.1`,r:`0.7`},[createBaseVNode(`stop`,{offset:`0`,"stop-color":art.value.accent,"stop-opacity":`0.55`},null,8,_hoisted_7$6),createBaseVNode(`stop`,{offset:`1`,"stop-color":art.value.accent,"stop-opacity":`0`},null,8,_hoisted_8$6)],8,_hoisted_6$7)]),createBaseVNode(`rect`,{width:`320`,height:`120`,fill:`url(#${art.value.id}-bg)`},null,8,_hoisted_9$4),createBaseVNode(`rect`,{width:`320`,height:`120`,fill:`url(#${art.value.id}-glow)`},null,8,_hoisted_10$4),art.value.pattern===`waves`?(openBlock(),createElementBlock(`g`,_hoisted_11$4,[(openBlock(true),createElementBlock(Fragment,null,renderList(waves.value,(d,index)=>{return openBlock(),createElementBlock(`path`,{key:index,d,"stroke-opacity":.14+index*.06,"stroke-width":10-index*3},null,8,_hoisted_12$4)}),128))])):art.value.pattern===`orbits`?(openBlock(),createElementBlock(`g`,_hoisted_13$4,[(openBlock(true),createElementBlock(Fragment,null,renderList(orbits.value.radii,(r,index)=>{return openBlock(),createElementBlock(`circle`,{key:r,cx:orbits.value.cx,cy:orbits.value.cy,r,"stroke-opacity":.26-index*.05,"stroke-width":`2`},null,8,_hoisted_14$4)}),128)),createBaseVNode(`circle`,{cx:orbits.value.cx,cy:orbits.value.cy,r:`10`,fill:art.value.accent,"fill-opacity":`0.7`,stroke:`none`},null,8,_hoisted_15$4)])):art.value.pattern===`grid`?(openBlock(),createElementBlock(`g`,_hoisted_16$4,[(openBlock(true),createElementBlock(Fragment,null,renderList(dots.value,dot=>{return openBlock(),createElementBlock(`circle`,{key:`${dot.x}-${dot.y}`,cx:dot.x,cy:dot.y,r:dot.on?3.2:1.6,fill:dot.on?art.value.accent:`#fff`,"fill-opacity":dot.on?.9:.28},null,8,_hoisted_17$4)}),128))])):(openBlock(),createElementBlock(`g`,_hoisted_18$4,[(openBlock(true),createElementBlock(Fragment,null,renderList(peaks.value,(d,index)=>{return openBlock(),createElementBlock(`path`,{key:index,d,"fill-opacity":.08+index*.06},null,8,_hoisted_19$4)}),128))])),path.value?(openBlock(),createElementBlock(`g`,_hoisted_20$4,[createBaseVNode(`path`,{d:path.value.d,fill:`none`,stroke:`#fff`,"stroke-opacity":`0.55`,"stroke-width":`2.5`,"stroke-dasharray":`2 6`,"stroke-linecap":`round`},null,8,_hoisted_21$4),(openBlock(true),createElementBlock(Fragment,null,renderList(path.value.nodes,(node,index)=>{return openBlock(),createElementBlock(`g`,{key:index},[createBaseVNode(`circle`,{cx:node.x,cy:node.y,r:`7.5`,fill:node.status===`completed`?`#fff`:`rgba(0,0,0,0.18)`,stroke:`#fff`,"stroke-opacity":node.status===`not-started`?.6:1,"stroke-width":`2`},null,8,_hoisted_22$4),node.status===`completed`?(openBlock(),createElementBlock(`path`,{key:0,d:`M ${node.x-3.2} ${node.y} l 2.2 2.3 l 4.2 -4.6`,fill:`none`,stroke:art.value.from,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`},null,8,_hoisted_23$4)):node.status===`in-progress`?(openBlock(),createElementBlock(`circle`,{key:1,cx:node.x,cy:node.y,r:`3`,fill:`#fff`},null,8,_hoisted_24$3)):createCommentVNode(``,true)])}),128))])):createCommentVNode(``,true)])),createBaseVNode(`span`,_hoisted_25$2,toDisplayString(monogram.value),1)])}}};var TrainingCourseArt_default=_plugin_vue_export_helper_default(_sfc_main$37,[[`__scopeId`,`data-v-a28d3001`]]);var _hoisted_1$21=[`aria-label`,`aria-valuemax`,`aria-valuenow`];var _hoisted_2$16=[`viewBox`];var _hoisted_3$15=[`cx`,`cy`,`r`,`stroke-width`];var _hoisted_4$10=[`cx`,`cy`,`r`,`stroke-width`,`stroke-dasharray`,`transform`];var _hoisted_5$10={class:`training-progress-ring__content`};var _sfc_main$36={__name:`TrainingProgressRing`,props:{value:{type:Number,default:0},max:{type:Number,default:0},size:{type:Number,default:72},stroke:{type:Number,default:8},label:{type:String,required:true}},setup(__props){const props=__props;const radius=computed(()=>(props.size-props.stroke)/2);const circumference=computed(()=>2*Math.PI*radius.value);const fraction=computed(()=>props.max>0?Math.min(1,Math.max(0,props.value/props.max)):0);const percent=computed(()=>Math.round(fraction.value*100));const gap=computed(()=>fraction.value>0&&fraction.value<1?props.stroke*1.5:0);const visible=computed(()=>Math.max(0,fraction.value*circumference.value-gap.value));return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,{class:`training-progress-ring`,role:`progressbar`,"aria-label":__props.label,"aria-valuemin":`0`,"aria-valuemax":__props.max,"aria-valuenow":Math.min(__props.value,__props.max),style:normalizeStyle({width:`${__props.size}px`,height:`${__props.size}px`})},[(openBlock(),createElementBlock(`svg`,{viewBox:`0 0 ${__props.size} ${__props.size}`,"aria-hidden":`true`,focusable:`false`},[createBaseVNode(`circle`,{class:`training-progress-ring__track`,cx:__props.size/2,cy:__props.size/2,r:radius.value,fill:`none`,"stroke-width":__props.stroke},null,8,_hoisted_3$15),visible.value>0?(openBlock(),createElementBlock(`circle`,{key:0,class:`training-progress-ring__indicator`,cx:__props.size/2,cy:__props.size/2,r:radius.value,fill:`none`,"stroke-width":__props.stroke,"stroke-linecap":`round`,"stroke-dasharray":`${visible.value} ${circumference.value}`,transform:`rotate(-90 ${__props.size/2} ${__props.size/2})`},null,8,_hoisted_4$10)):createCommentVNode(``,true)],8,_hoisted_2$16)),createBaseVNode(`span`,_hoisted_5$10,[renderSlot(_ctx.$slots,`default`,{},()=>[createTextVNode(toDisplayString(percent.value)+`%`,1)],true)])],12,_hoisted_1$21)}}};var TrainingProgressRing_default=_plugin_vue_export_helper_default(_sfc_main$36,[[`__scopeId`,`data-v-8c0b2060`]]);var _hoisted_1$20={key:0,class:`training-start-feedback training-start-feedback--progress`,role:`status`,"data-test":`lesson-start-feedback`};var _hoisted_2$15={key:1,class:`training-start-feedback training-start-feedback--error`,role:`alert`,"data-test":`lesson-start-feedback`};var _hoisted_3$14={key:2,class:`training-start-feedback training-start-feedback--warn`,role:`status`,"data-test":`lesson-start-feedback`};var _sfc_main$35={__name:`TrainingStartFeedback`,props:{feedback:{type:Object,required:true}},setup(__props){return(_ctx,_cache)=>{return __props.feedback.phase===`starting`?(openBlock(),createElementBlock(`div`,_hoisted_1$20,[createVNode(VProgressCircular,{indeterminate:``,size:`24`,width:`3`,color:`primary`}),_cache[0]||(_cache[0]=createBaseVNode(`div`,null,[createBaseVNode(`strong`,null,`Starting your lesson`),createBaseVNode(`p`,null,`Creating your practice project. This can take a while; the lesson opens by itself when it is ready.`)],-1))])):__props.feedback.phase===`failed`?(openBlock(),createElementBlock(`div`,_hoisted_2$15,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`24`},null,8,[`icon`]),createBaseVNode(`div`,null,[_cache[1]||(_cache[1]=createBaseVNode(`strong`,null,`The lesson did not start`,-1)),createBaseVNode(`p`,null,toDisplayString(__props.feedback.message),1)])])):__props.feedback.phase===`unconfirmed`?(openBlock(),createElementBlock(`div`,_hoisted_3$14,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`24`},null,8,[`icon`]),_cache[2]||(_cache[2]=createBaseVNode(`div`,null,[createBaseVNode(`strong`,null,`Lesson start not confirmed`),createBaseVNode(`p`,null,`Use Retry lesson start to repeat that same request.`)],-1))])):createCommentVNode(``,true)}}};var TrainingStartFeedback_default=_plugin_vue_export_helper_default(_sfc_main$35,[[`__scopeId`,`data-v-94e65a74`]]);var _hoisted_1$19=[`aria-label`];var _hoisted_2$14={class:`training-course-page__back`};var _hoisted_3$13={class:`training-course-page__hero-body`};var _hoisted_4$9={class:`training-course-page__hero-text`};var _hoisted_5$9={class:`training-course-page__title`};var _hoisted_6$6={class:`training-course-page__meta`};var _hoisted_7$5={class:`training-course-page__chip`};var _hoisted_8$5={class:`training-course-page__chip`};var _hoisted_9$3={class:`training-course-page__count`};var _hoisted_10$3={class:`training-course-page__ring-value`};var _hoisted_11$3={class:`training-course-page__next-text`};var _hoisted_12$3={class:`training-course-page__next-title`};var _hoisted_13$3={key:2,class:`training-course-page__next-text`};var _hoisted_14$3={key:3,class:`training-course-page__next-title training-course-page__preview-note`};var _hoisted_15$3={key:4,class:`training-course-page__next-title`};var _hoisted_16$3={key:1,class:`training-course-page__empty`,role:`note`};var _hoisted_17$3={class:`training-course-page__topics`};var _hoisted_18$3={class:`training-course-page__topic-head`};var _hoisted_19$3={class:`training-course-page__topic-index`,"aria-hidden":`true`};var _hoisted_20$3={class:`training-course-page__topic-text`};var _hoisted_21$3=[`aria-label`];var _hoisted_22$3={key:0,class:`training-course-page__empty`};var _hoisted_23$3={class:`training-course-page__path`};var _hoisted_24$2={class:`training-course-page__node`,"aria-hidden":`true`};var _hoisted_25$1={key:0,viewBox:`0 0 24 24`};var _hoisted_26$1={key:1,viewBox:`0 0 24 24`};var _hoisted_27$1={key:2};var _hoisted_28$1={class:`training-course-page__card`};var _hoisted_29$1={class:`training-course-page__card-main`};var _hoisted_30$1={class:`training-course-page__lesson-title`};var _hoisted_31$1={class:`training-course-page__lesson-meta`};var _hoisted_32$1={key:0};var _hoisted_33$1={key:0,class:`training-course-page__earlier`};var _hoisted_34$1={class:`training-course-page__identity`};var _sfc_main$34={__name:`TrainingCoursePage`,props:{course:{type:Object,required:true},progress:{type:Object,required:true},startAllowed:Boolean,canTryPreviews:Boolean,resumeAllowed:Boolean,startFeedback:{type:Object,default:null},startingLesson:{type:Function,default:()=>false}},emits:[`back`,`start`,`resume`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const complete=computed(()=>Boolean(props.progress.total&&props.progress.completed===props.progress.total));const availability=computed(()=>courseStatusLabel(props.course));const preview=computed(()=>previewCourse(props.course));const isNext=lesson=>Boolean(props.progress.next&&props.progress.next.code===lesson.code&&props.progress.next.hash===lesson.hash);const path=computed(()=>{let step=0;return props.progress.topics.map((topic,index)=>({topic,index:index+1,done:topic.lessons.filter(value=>value.status===`completed`).length,lessons:topic.lessons.map(value=>({...value,step:++step,next:isNext(value.lesson)}))}))});return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:`training-course-page`,"aria-label":`Course ${__props.course.title}`},[createBaseVNode(`div`,_hoisted_2$14,[createVNode(VBtn,{variant:`text`,"min-height":`48`,class:`training-course-page__back-btn`,onClick:_cache[0]||(_cache[0]=$event=>emit(`back`))},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createBaseVNode(`svg`,{class:`training-course-page__back-icon`,viewBox:`0 0 24 24`,"aria-hidden":`true`},[createBaseVNode(`path`,{d:`M15.4 7.4 14 6l-6 6 6 6 1.4-1.4L10.8 12z`})],-1),createTextVNode(` Back to courses `,-1)])]),_:1})]),createBaseVNode(`header`,{class:normalizeClass([`training-course-page__hero`,{"is-complete":complete.value}])},[createVNode(TrainingCourseArt_default,{class:`training-course-page__cover`,"course-id":__props.course.courseId,title:__props.course.title,statuses:__props.progress.lessons.map(value=>value.status)},null,8,[`course-id`,`title`,`statuses`]),createBaseVNode(`div`,_hoisted_3$13,[createBaseVNode(`div`,_hoisted_4$9,[_cache[4]||(_cache[4]=createBaseVNode(`p`,{class:`training-course-page__eyebrow`},`Course`,-1)),createBaseVNode(`h3`,_hoisted_5$9,toDisplayString(__props.course.title),1),createBaseVNode(`div`,_hoisted_6$6,[createBaseVNode(`span`,_hoisted_7$5,[createBaseVNode(`code`,null,toDisplayString(__props.course.courseId)+` · `+toDisplayString(__props.course.release),1)]),createBaseVNode(`span`,{class:normalizeClass([`training-course-page__chip`,{"is-muted":!__props.course.enabled||__props.course.status!==`released`}])},toDisplayString(availability.value),3),createBaseVNode(`span`,_hoisted_8$5,toDisplayString(__props.progress.topics.length)+` `+toDisplayString(__props.progress.topics.length===1?`topic`:`topics`),1)]),createBaseVNode(`p`,_hoisted_9$3,toDisplayString(__props.progress.completed)+` of `+toDisplayString(__props.progress.total)+` lessons complete`,1)]),createVNode(TrainingProgressRing_default,{class:`training-course-page__ring`,value:__props.progress.completed,max:__props.progress.total,size:88,stroke:9,label:`${__props.progress.completed} of ${__props.progress.total} lessons complete`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_10$3,[createBaseVNode(`strong`,null,toDisplayString(__props.progress.completed),1),createTextVNode(`/`+toDisplayString(__props.progress.total),1)])]),_:1},8,[`value`,`max`,`label`])])],2),createBaseVNode(`div`,{class:normalizeClass([`training-course-page__next`,{"is-complete":complete.value}])},[__props.progress.activeHere?(openBlock(),createElementBlock(Fragment,{key:0},[_cache[6]||(_cache[6]=createBaseVNode(`div`,{class:`training-course-page__next-text`},[createBaseVNode(`p`,{class:`training-course-page__next-label`},`Lesson in progress`),createBaseVNode(`p`,{class:`training-course-page__next-title`},`Pick up where you left off.`)],-1)),createVNode(VBtn,{color:`primary`,variant:`flat`,"min-height":`48`,rounded:`pill`,disabled:!__props.resumeAllowed,onClick:_cache[1]||(_cache[1]=$event=>emit(`resume`))},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Continue lesson`,-1)])]),_:1},8,[`disabled`])],64)):__props.progress.next?(openBlock(),createElementBlock(Fragment,{key:1},[createBaseVNode(`div`,_hoisted_11$3,[_cache[7]||(_cache[7]=createBaseVNode(`p`,{class:`training-course-page__next-label`},`Up next`,-1)),createBaseVNode(`p`,_hoisted_12$3,toDisplayString(__props.progress.next.title)+` · `+toDisplayString(__props.progress.next.code),1)]),createVNode(VBtn,{color:`primary`,variant:`flat`,"min-height":`48`,rounded:`pill`,readonly:__props.startingLesson(__props.progress.next),disabled:!__props.startAllowed&&!__props.startingLesson(__props.progress.next),onClick:_cache[2]||(_cache[2]=$event=>emit(`start`,__props.progress.next))},{default:withCtx(()=>[__props.startingLesson(__props.progress.next)?(openBlock(),createElementBlock(Fragment,{key:0},[createVNode(VProgressCircular,{indeterminate:``,size:`18`,width:`2`,class:`training-course-page__spinner`}),_cache[8]||(_cache[8]=createTextVNode(`Starting lesson…`,-1))],64)):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(`Start next lesson`)],64))]),_:1},8,[`readonly`,`disabled`])],64)):complete.value?(openBlock(),createElementBlock(`div`,_hoisted_13$3,[..._cache[9]||(_cache[9]=[createBaseVNode(`p`,{class:`training-course-page__next-label`},`All lessons done`,-1),createBaseVNode(`p`,{class:`training-course-page__next-title`},`Course complete.`,-1)])])):preview.value&&!__props.canTryPreviews?(openBlock(),createElementBlock(`p`,_hoisted_14$3,toDisplayString(unref(previewNote)),1)):(openBlock(),createElementBlock(`p`,_hoisted_15$3,`No lesson in this course can be started here.`))],2),__props.startFeedback?(openBlock(),createBlock(TrainingStartFeedback_default,{key:0,feedback:__props.startFeedback},null,8,[`feedback`])):createCommentVNode(``,true),__props.course.unusableLessons?.length?(openBlock(),createElementBlock(`p`,_hoisted_16$3,` Not shown, because this version of Vibe64 can't teach `+toDisplayString(__props.course.unusableLessons.length===1?`it`:`them`)+`: `+toDisplayString(__props.course.unusableLessons.map(lesson=>lesson.title).join(`, `))+`. Update the course when Courses offers an update. `,1)):createCommentVNode(``,true),createBaseVNode(`ol`,_hoisted_17$3,[(openBlock(true),createElementBlock(Fragment,null,renderList(path.value,({topic,index,done,lessons})=>{return openBlock(),createElementBlock(`li`,{key:JSON.stringify([topic.topicId,topic.release]),class:`training-course-page__topic`},[createBaseVNode(`div`,_hoisted_18$3,[createBaseVNode(`span`,_hoisted_19$3,toDisplayString(index),1),createBaseVNode(`div`,_hoisted_20$3,[createBaseVNode(`h4`,null,toDisplayString(topic.title),1),createBaseVNode(`p`,null,toDisplayString(topic.topicId)+` · `+toDisplayString(topic.release),1)]),lessons.length?(openBlock(),createElementBlock(`span`,{key:0,class:`training-course-page__topic-done`,"aria-label":`${done} of ${lessons.length} lessons completed in this topic`},toDisplayString(done)+`/`+toDisplayString(lessons.length),9,_hoisted_21$3)):createCommentVNode(``,true)]),!lessons.length?(openBlock(),createElementBlock(`p`,_hoisted_22$3,`This topic has no displayed lesson choices.`)):createCommentVNode(``,true),createBaseVNode(`ol`,_hoisted_23$3,[(openBlock(true),createElementBlock(Fragment,null,renderList(lessons,({lesson,status,current,step,next,earlier})=>{return openBlock(),createElementBlock(`li`,{key:JSON.stringify([lesson.code,lesson.hash]),class:normalizeClass([`training-course-page__lesson`,[`is-${status}`,{"is-next":next&&!__props.progress.activeHere}]])},[createBaseVNode(`span`,_hoisted_24$2,[status===`completed`?(openBlock(),createElementBlock(`svg`,_hoisted_25$1,[..._cache[10]||(_cache[10]=[createBaseVNode(`path`,{d:`M9.5 16.2 5.3 12l-1.4 1.4 5.6 5.6 11-11-1.4-1.4z`},null,-1)])])):status===`in-progress`?(openBlock(),createElementBlock(`svg`,_hoisted_26$1,[..._cache[11]||(_cache[11]=[createBaseVNode(`path`,{d:`M8 5.5v13l10.5-6.5z`},null,-1)])])):(openBlock(),createElementBlock(`span`,_hoisted_27$1,toDisplayString(step),1))]),createBaseVNode(`div`,_hoisted_28$1,[createBaseVNode(`div`,_hoisted_29$1,[createBaseVNode(`strong`,_hoisted_30$1,toDisplayString(lesson.title)+` · `+toDisplayString(lesson.code),1),createBaseVNode(`p`,_hoisted_31$1,[createBaseVNode(`span`,{class:normalizeClass([`training-course-page__status`,`is-${status}`])},toDisplayString(unref(statusLabels)[status]),3),_cache[12]||(_cache[12]=createBaseVNode(`span`,{"aria-hidden":`true`},` · `,-1)),createBaseVNode(`span`,null,toDisplayString(lesson.status===`published`?`Published`:`Draft — unavailable for new lessons`),1),!lesson.required?(openBlock(),createElementBlock(`span`,_hoisted_32$1,` · Optional`)):createCommentVNode(``,true)]),earlier?(openBlock(),createElementBlock(`p`,_hoisted_33$1,toDisplayString(unref(earlierCompletionLabel)(earlier)),1)):createCommentVNode(``,true),createBaseVNode(`details`,_hoisted_34$1,[_cache[13]||(_cache[13]=createBaseVNode(`summary`,null,`Lesson identity`,-1)),createBaseVNode(`code`,null,toDisplayString(lesson.hash),1)])]),unref(offered)(__props.course,lesson,__props.canTryPreviews)&&!current?(openBlock(),createBlock(VBtn,{key:0,variant:next?`tonal`:`text`,color:`primary`,"min-height":`48`,rounded:`pill`,class:`training-course-page__start`,readonly:__props.startingLesson(lesson),disabled:!__props.startAllowed&&!__props.startingLesson(lesson),onClick:$event=>emit(`start`,lesson)},{default:withCtx(()=>[__props.startingLesson(lesson)?(openBlock(),createElementBlock(Fragment,{key:0},[createVNode(VProgressCircular,{indeterminate:``,size:`18`,width:`2`,class:`training-course-page__spinner`}),_cache[14]||(_cache[14]=createTextVNode(`Starting lesson…`,-1))],64)):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(`Start lesson`)],64))]),_:2},1032,[`variant`,`readonly`,`disabled`,`onClick`])):createCommentVNode(``,true)])],2)}),128))])])}),128))])],8,_hoisted_1$19)}}};var TrainingCoursePage_default=_plugin_vue_export_helper_default(_sfc_main$34,[[`__scopeId`,`data-v-d3fbbe77`]]);var _hoisted_1$18=[`aria-busy`];var _hoisted_2$13={class:`tcc__head`};var _hoisted_3$12={class:`tcc__eyebrow`};var _hoisted_4$8={key:0,class:`tcc__loading`,role:`status`};var _hoisted_5$8={key:2,class:`tcc__note`,role:`status`};var _hoisted_6$5={key:3,class:`tcc__note`,role:`status`};var _hoisted_7$4=[`aria-label`];var _hoisted_8$4={class:`tcc__topic-title`};var _hoisted_9$2={key:0,class:`tcc__empty`};var _hoisted_10$2={class:`tcc__list`};var _hoisted_11$2=[`data-course`];var _hoisted_12$2={class:`tcc__course-main`};var _hoisted_13$2={class:`tcc__title`};var _hoisted_14$2={class:`tcc__chips`};var _hoisted_15$2={class:`tcc__chip`};var _hoisted_16$2={class:`tcc__chip`};var _hoisted_17$2={key:1,class:`tcc__chip tcc__chip--update`};var _hoisted_18$2={key:0,class:`tcc__detail`};var _hoisted_19$2={key:1,class:`tcc__detail`};var _hoisted_20$2={key:2,class:`tcc__detail`};var _hoisted_21$2={key:3,class:`tcc__progress`,role:`status`};var _hoisted_22$2={key:4,class:`tcc__failure`,role:`alert`};var _hoisted_23$2={class:`tcc__actions`};var _sfc_main$33={__name:`TrainingCourseCatalogue`,props:{availableResult:{type:Object,default:null},availableLoading:Boolean,availableError:{type:String,default:``},installState:{type:Object,default:null},busy:Boolean},emits:[`install`,`view`,`refresh`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const text=value=>typeof value===`string`&&value.length>0;const ready=computed(()=>props.availableResult?.ok===true&&props.availableResult.available===true&&Array.isArray(props.availableResult.domains)&&Array.isArray(props.availableResult.courses));const courses=computed(()=>ready.value?props.availableResult.courses.filter(course=>text(course?.courseId)&&text(course.release)&&text(course.title)):[]);const topics=computed(()=>{if(!ready.value)return[];const known=new Set(props.availableResult.domains.map(domain=>domain.domainId));const groups=props.availableResult.domains.map(domain=>({id:domain.domainId,title:domain.title,courses:courses.value.filter(course=>course.domainId===domain.domainId)}));const other=courses.value.filter(course=>!known.has(course.domainId));return other.length?[...groups,{id:``,title:`Other courses`,courses:other}]:groups});const key=course=>`${course.courseId}@${course.release}`;const plural=(count,word)=>`${count} ${word}${count===1?``:`s`}`;const stateOf=course=>props.installState&&props.installState.courseId===course.courseId&&props.installState.release===course.release?props.installState:null;function progressText(course){const progress=course.installing;if(!progress)return`Downloading and verifying the course…`;if(progress.phase===`queued`)return`Waiting for another course installation to finish…`;if(progress.phase===`catalogue`)return`Reading the official catalogue…`;if(progress.phase===`topic`)return`Downloading and verifying topic ${Math.min(progress.topicsDone+1,progress.topicsTotal)} of ${progress.topicsTotal}…`;if(progress.phase===`enable`)return`Enabling the course…`;return`Installing…`}const installedLabel={enabled:`Installed`,disabled:`Disabled on this server`,conflict:`Conflicting copy installed`,"not-installed":`Not installed`};const installedTone={enabled:`enabled`,disabled:`disabled`,conflict:`disabled`,"not-installed":`neutral`};const installable=course=>course.installed===`not-installed`;function install(course){if(props.busy||!installable(course))return;emit(`install`,{courseId:course.courseId,release:course.release})}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:`tcc training-course-catalogue`,"aria-labelledby":`tcc-heading`,"aria-busy":__props.availableLoading},[createBaseVNode(`header`,_hoisted_2$13,[createBaseVNode(`div`,null,[createBaseVNode(`p`,_hoisted_3$12,[createVNode(VIcon,{icon:unref(trainingIcons).download,size:`18`},null,8,[`icon`]),_cache[1]||(_cache[1]=createTextVNode(` Course catalogue`,-1))]),_cache[2]||(_cache[2]=createBaseVNode(`h3`,{id:`tcc-heading`},`Install a course`,-1)),_cache[3]||(_cache[3]=createBaseVNode(`p`,{class:`tcc__intro`},`Courses from the official Vibe64 catalogue, grouped by topic. Installing downloads and verifies the course on this server; it does not start a lesson.`,-1))])]),__props.availableLoading&&!ready.value?(openBlock(),createElementBlock(`div`,_hoisted_4$8,[createVNode(VProgressCircular,{indeterminate:``,size:`20`,width:`2`,color:`primary`}),_cache[4]||(_cache[4]=createBaseVNode(`span`,null,`Reading the course catalogue…`,-1))])):__props.availableError?(openBlock(),createBlock(VAlert,{key:1,type:`error`,variant:`tonal`,rounded:`lg`,role:`alert`},{append:withCtx(()=>[createVNode(VBtn,{variant:`text`,"min-height":`40`,disabled:__props.busy,onClick:_cache[0]||(_cache[0]=$event=>emit(`refresh`))},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Retry`,-1)])]),_:1},8,[`disabled`])]),default:withCtx(()=>[createTextVNode(toDisplayString(__props.availableError)+` `,1)]),_:1})):__props.availableResult&&!ready.value?(openBlock(),createElementBlock(`p`,_hoisted_5$8,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),createBaseVNode(`span`,null,toDisplayString(__props.availableResult.error||`The course catalogue is not available in this installation.`),1)])):ready.value&&!courses.value.length?(openBlock(),createElementBlock(`p`,_hoisted_6$5,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),_cache[6]||(_cache[6]=createBaseVNode(`span`,null,`The catalogue has no courses yet.`,-1))])):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(topics.value,topic=>{return openBlock(),createElementBlock(`section`,{key:topic.id||`other`,class:`tcc__topic`,"aria-label":`Topic ${topic.title}`},[createBaseVNode(`h4`,_hoisted_8$4,[createVNode(VIcon,{icon:unref(trainingIcons).layers,size:`20`},null,8,[`icon`]),createTextVNode(toDisplayString(topic.title),1)]),!topic.courses.length?(openBlock(),createElementBlock(`p`,_hoisted_9$2,`No courses in this topic yet.`)):createCommentVNode(``,true),createBaseVNode(`ul`,_hoisted_10$2,[(openBlock(true),createElementBlock(Fragment,null,renderList(topic.courses,course=>{return openBlock(),createElementBlock(`li`,{key:key(course),class:`tcc__course`,"data-course":key(course)},[createBaseVNode(`div`,_hoisted_12$2,[createBaseVNode(`strong`,_hoisted_13$2,toDisplayString(course.title),1),createBaseVNode(`p`,_hoisted_14$2,[createBaseVNode(`span`,_hoisted_15$2,[createBaseVNode(`code`,null,toDisplayString(course.release),1)]),createBaseVNode(`span`,{class:normalizeClass([`tcc__chip`,course.status===`released`?`tcc__chip--enabled`:`tcc__chip--preview`])},toDisplayString(course.status===`released`?`Released`:`Preview`),3),createBaseVNode(`span`,_hoisted_16$2,toDisplayString(plural(course.lessonCount,`lesson`)),1),!course.updateFrom?(openBlock(),createElementBlock(`span`,{key:0,class:normalizeClass([`tcc__chip`,`tcc__chip--${installedTone[course.installed]||`neutral`}`])},toDisplayString(installedLabel[course.installed]||course.installed),3)):createCommentVNode(``,true),course.updateFrom?(openBlock(),createElementBlock(`span`,_hoisted_17$2,[createVNode(VIcon,{icon:unref(trainingIcons).update,size:`14`},null,8,[`icon`]),createTextVNode(`Update available: `+toDisplayString(course.release),1)])):createCommentVNode(``,true)]),course.updateFrom?(openBlock(),createElementBlock(`p`,_hoisted_18$2,`You have `+toDisplayString(course.updateFrom)+`. Updating keeps your saved lessons and progress.`,1)):createCommentVNode(``,true),course.status!==`released`?(openBlock(),createElementBlock(`p`,_hoisted_19$2,`Preview course: it can be installed; until it is released, only the workspace owner can try its lessons from Courses.`)):createCommentVNode(``,true),course.installed===`disabled`?(openBlock(),createElementBlock(`p`,_hoisted_20$2,`This release was disabled on this server. Installing cannot enable it again; only the server's operator can.`)):createCommentVNode(``,true),stateOf(course)?.phase===`installing`?(openBlock(),createElementBlock(`p`,_hoisted_21$2,[createVNode(VProgressCircular,{indeterminate:``,size:`18`,width:`2`,color:`primary`}),createBaseVNode(`span`,null,toDisplayString(progressText(course)),1)])):stateOf(course)?.phase===`failed`?(openBlock(),createElementBlock(`p`,_hoisted_22$2,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`18`},null,8,[`icon`]),createBaseVNode(`span`,null,toDisplayString(stateOf(course).message),1)])):createCommentVNode(``,true)]),createBaseVNode(`div`,_hoisted_23$2,[course.installed===`enabled`?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,rounded:`pill`,"min-height":`48`,"append-icon":unref(trainingIcons).arrowRight,onClick:$event=>emit(`view`,{courseId:course.courseId,release:course.release})},{default:withCtx(()=>[..._cache[7]||(_cache[7]=[createTextVNode(`View course`,-1)])]),_:1},8,[`append-icon`,`onClick`])):installable(course)?(openBlock(),createBlock(VBtn,{key:1,color:`primary`,variant:course.updateFrom?`flat`:`tonal`,rounded:`pill`,"min-height":`48`,"prepend-icon":course.updateFrom?unref(trainingIcons).update:unref(trainingIcons).download,loading:stateOf(course)?.phase===`installing`,disabled:__props.busy,onClick:$event=>install(course)},{default:withCtx(()=>[createTextVNode(toDisplayString(stateOf(course)?.phase===`failed`?course.updateFrom?`Retry update`:`Retry install`:course.updateFrom?`Update`:`Install`),1)]),_:2},1032,[`variant`,`prepend-icon`,`loading`,`disabled`,`onClick`])):createCommentVNode(``,true)])],8,_hoisted_11$2)}),128))])],8,_hoisted_7$4)}),128))],8,_hoisted_1$18)}}};var TrainingCourseCatalogue_default=_plugin_vue_export_helper_default(_sfc_main$33,[[`__scopeId`,`data-v-b5eb5824`]]);var _hoisted_1$17=[`aria-busy`];var _hoisted_2$12={class:`tlp-hero`};var _hoisted_3$11={class:`tlp-hero__text`};var _hoisted_4$7={class:`tlp-eyebrow`};var _hoisted_5$7={key:0,class:`tlp-hero__meta`};var _hoisted_6$4={key:0,class:`tlp-skeleton tlp-skeleton--saved`,role:`status`,"aria-label":`Loading saved lesson`};var _hoisted_7$3={key:2,class:`tlp-note`,role:`status`};var _hoisted_8$3={key:3,class:`tlp-saved training-lesson-picker__saved`,"aria-labelledby":`tlp-saved-heading`};var _hoisted_9$1={class:`tlp-saved__ring-value`};var _hoisted_10$1={key:1,class:`tlp-saved__badge`,"aria-hidden":`true`};var _hoisted_11$1={class:`tlp-saved__body`};var _hoisted_12$1={id:`tlp-saved-heading`,class:`tlp-eyebrow tlp-eyebrow--learning`};var _hoisted_13$1={class:`tlp-saved__title`};var _hoisted_14$1={class:`tlp-saved__meta`};var _hoisted_15$1={key:0,class:`tlp-saved__status`};var _hoisted_16$1={key:1,class:`tlp-saved__status`};var _hoisted_17$1={key:2,class:`tlp-note tlp-note--warn`};var _hoisted_18$1={key:3,class:`tlp-note`};var _hoisted_19$1={class:`tlp-saved__actions`};var _hoisted_20$1={class:`tlp-identity`};var _hoisted_21$1={key:4,class:`tlp-grid`,role:`status`,"aria-label":`Loading installed courses`};var _hoisted_22$1={key:6,class:`tlp-empty`,role:`status`};var _hoisted_23$1={key:7,class:`tlp-empty`,role:`status`};var _hoisted_24$1={key:0};var _hoisted_25={key:1};var _hoisted_26={key:0,class:`tlp-grid training-lesson-picker__courses`};var _hoisted_27=[`aria-label`];var _hoisted_28={class:`tlp-card__cover`};var _hoisted_29={class:`tlp-card__chips`};var _hoisted_30={key:0,class:`tlp-chip tlp-chip--learning`};var _hoisted_31={key:1,class:`tlp-chip tlp-chip--success`};var _hoisted_32={key:2,class:`tlp-chip tlp-chip--learning`};var _hoisted_33={class:`tlp-card__body`};var _hoisted_34={class:`tlp-card__title`};var _hoisted_35={class:`tlp-card__id`};var _hoisted_36={class:`tlp-card__facts`};var _hoisted_37={key:0,class:`tlp-card__next`,role:`note`};var _hoisted_38={class:`tlp-card__progress`};var _hoisted_39={class:`tlp-card__count`};var _hoisted_40={key:0,class:`tlp-card__next`};var _hoisted_41={key:1,class:`tlp-card__next tlp-card__preview-note`};var _hoisted_42={class:`tlp-card__actions`};var _hoisted_43={class:`tlp-new__icon`,"aria-hidden":`true`};var _hoisted_44={key:2};var _hoisted_45={key:10,class:`training-lesson-picker__start`};var _hoisted_46={key:0,class:`tlp-note`};var _hoisted_47={key:1,class:`tlp-note tlp-note--warn`};var _hoisted_48={key:2,class:`tlp-note`};var _hoisted_49={key:11,class:`tlp-history training-lesson-picker__history`};var _sfc_main$32={__name:`TrainingLessonPicker`,props:{catalogueResult:{type:Object,default:null},learningResult:{type:Object,default:null},catalogueLoading:Boolean,learningLoading:Boolean,catalogueError:{type:String,default:``},learningError:{type:String,default:``},busy:Boolean,canStart:Boolean,canResume:Boolean,createCourse:{type:Function,default:null},starting:Boolean,startUnconfirmed:Boolean,startError:{type:String,default:``},availableResult:{type:Object,default:null},availableLoading:Boolean,availableError:{type:String,default:``},installState:{type:Object,default:null}},emits:[`refresh`,`start`,`resume`,`install`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const selectionId=ref(``);const text=value=>typeof value===`string`&&value.length>0;const revision=value=>Number.isSafeInteger(value)&&value>=0;const lessonTitlesMissing=computed(()=>Array.isArray(props.catalogueResult?.courses)&&props.catalogueResult.courses.some(course=>Array.isArray(course?.lessons)&&course.lessons.some(lesson=>!text(lesson?.title))));const catalogueInvalid=computed(()=>{const result=props.catalogueResult;return result?.ok===true&&result.available===true&&(!revision(result.revision)||!Array.isArray(result.courses)||result.courses.some(course=>!text(course?.courseId)||!text(course.release)||!text(course.title)||typeof course.enabled!==`boolean`||!text(course.status)||!Array.isArray(course.lessons)||!Array.isArray(course.topics)||course.topics.some(topic=>!text(topic?.topicId)||!text(topic.release)||!text(topic.title))||course.lessons.some(lesson=>!text(lesson?.code)||!text(lesson.hash)||!text(lesson.topicId)||!text(lesson.topicRelease)||!text(lesson.status)||!text(lesson.title))))});const courses=computed(()=>!catalogueInvalid.value&&props.catalogueResult?.ok===true&&props.catalogueResult.available===true?props.catalogueResult.courses:[]);function choiceId(course,lesson){return JSON.stringify([course.courseId,course.release,lesson.code,lesson.hash,lesson.topicId,lesson.topicRelease])}const choices=computed(()=>courses.value.flatMap(course=>course.lessons.map(lesson=>({course,lesson,id:choiceId(course,lesson)}))));const selected=computed(()=>choices.value.find(choice=>choice.id===selectionId.value)||null);watch(choices,values=>{if(!props.catalogueLoading&&!catalogueInvalid.value&&props.catalogueResult?.ok===true&&props.catalogueResult.available===true&&!values.some(value=>value.id===selectionId.value))selectionId.value=``},{immediate:true});function hasDisplayPin(attempt){return text(attempt?.attemptId)&&text(attempt.pin?.course?.courseId)&&text(attempt.pin.course.release)&&text(attempt.pin?.topic?.topicId)&&text(attempt.pin.topic.release)&&text(attempt.pin.topic.commit)&&text(attempt.pin?.lesson?.code)&&text(attempt.pin.lesson.hash)}const learningInvalid=computed(()=>{const result=props.learningResult;if(result?.ok!==true||result.available!==true)return false;if(!revision(result.revision)||!Object.hasOwn(result,`active`)||result.active!==null&&(!hasDisplayPin(result.active)||result.active.ended)||!Array.isArray(result.history)||result.history.some(attempt=>!hasDisplayPin(attempt)||!attempt.ended))return true;if(result.lessonProgress!==void 0&&(!Array.isArray(result.lessonProgress)||result.lessonProgress.some(value=>!text(value?.lessonCode)||!text(value.lessonHash)||!revision(value.required)||!revision(value.passed)||value.passed>value.required||typeof value.completed!==`boolean`||typeof value.open!==`boolean`)))return true;const completion=result.completion;return completion!=null&&(!result.active||!revision(completion.required)||!revision(completion.passed)||completion.passed>completion.required||typeof completion.completed!==`boolean`||completion.lessonCode!==result.active.pin.lesson.code||completion.lessonHash!==result.active.pin.lesson.hash)});const learningReady=computed(()=>!props.learningLoading&&!props.learningError&&!learningInvalid.value&&props.learningResult?.ok===true&&props.learningResult.available===true);const savedAttempt=computed(()=>!learningInvalid.value&&props.learningResult?.ok===true&&props.learningResult.available===true?props.learningResult.active:null);const history=computed(()=>!learningInvalid.value&&props.learningResult?.ok===true&&props.learningResult.available===true?props.learningResult.history:[]);const completion=computed(()=>savedAttempt.value?props.learningResult.completion:null);const startPossible=computed(()=>Boolean(props.canStart&&!props.starting&&!props.startUnconfirmed&&!props.busy&&!props.catalogueLoading&&!props.catalogueError&&learningReady.value));const canTryPreviews=computed(()=>!catalogueInvalid.value&&props.catalogueResult?.ok===true&&props.catalogueResult.canTryPreviews===true);const startEnabled=computed(()=>startPossible.value&&selected.value&&offered(selected.value.course,selected.value.lesson,canTryPreviews.value));const resumeEnabled=computed(()=>props.canResume&&!props.busy&&learningReady.value&&savedAttempt.value&&!savedAttempt.value.ended);function requestStart(){if(!startEnabled.value)return;const{course,lesson}=selected.value;emit(`start`,{courseId:course.courseId,release:course.release,lessonCode:lesson.code,expectedRevision:props.learningResult.revision})}function requestResume(){if(resumeEnabled.value)emit(`resume`,{attemptId:savedAttempt.value.attemptId})}function startLesson(course,lesson){selectionId.value=choiceId(course,lesson);if(startEnabled.value)startedFrom.value={key:courseKey(course),lesson:choiceId(course,lesson)};requestStart()}const startedFrom=ref(null);const startFeedback=computed(()=>!startedFrom.value?null:props.starting?{phase:`starting`}:props.startError?{phase:`failed`,message:props.startError}:props.startUnconfirmed?{phase:`unconfirmed`}:null);const feedbackFor=key=>startedFrom.value?.key===key?startFeedback.value:null;const startingHere=(course,lesson)=>props.starting&&startedFrom.value?.lesson===choiceId(course,lesson);const courseKey=course=>JSON.stringify([course.courseId,course.release]);const lessonProgress=computed(()=>!learningInvalid.value&&props.learningResult?.ok===true&&props.learningResult.available===true?props.learningResult.lessonProgress||[]:[]);const releaseOrder=(left,right)=>{const a=left.split(`.`).map(Number),b=right.split(`.`).map(Number);return a[0]-b[0]||a[1]-b[1]||a[2]-b[2]};const superseded=course=>!course.enabled&&courses.value.some(other=>other.courseId===course.courseId&&other.enabled&&releaseOrder(other.release,course.release)>0);const summaries=computed(()=>courses.value.map(course=>({course,key:courseKey(course),progress:courseProgress(course,lessonProgress.value,savedAttempt.value,history.value,{canTryPreviews:canTryPreviews.value})})).filter(summary=>!superseded(summary.course)||summary.progress.activeHere));const availableCourses=computed(()=>props.availableResult?.ok===true&&Array.isArray(props.availableResult.courses)?props.availableResult.courses:[]);const updateFor=course=>availableCourses.value.find(value=>value.courseId===course.courseId&&value.updateFrom===course.release&&value.installed===`not-installed`)||null;const showCatalogue=computed(()=>Boolean(props.availableResult||props.availableLoading||props.availableError));function requestInstall(selection){if(!props.busy)emit(`install`,selection)}function viewInstalled({courseId,release}){openCourseKey.value=courseKey({courseId,release})}const openCourseKey=ref(``);const openCourse=computed(()=>summaries.value.find(summary=>summary.key===openCourseKey.value)||null);watch(summaries,values=>{if(!props.catalogueLoading&&openCourseKey.value&&!values.some(value=>value.key===openCourseKey.value))openCourseKey.value=``});const creating=ref(false);const canCreateCourses=computed(()=>typeof props.createCourse===`function`&&!catalogueInvalid.value&&props.catalogueResult?.ok===true&&props.catalogueResult.canCreateCourses===true);const availableTopics=computed(()=>[...new Map(courses.value.filter(course=>course.enabled&&course.status===`released`).flatMap(course=>course.topics).map(topic=>[JSON.stringify([topic.topicId,topic.release]),topic])).values()]);async function requestCreateCourse(input){if(!canCreateCourses.value||props.busy)return;const result=await props.createCourse({...input,expectedRevision:props.catalogueResult.revision});if(result?.ok!==true||!result.course)return;creating.value=false;openCourseKey.value=courseKey(result.course)}const savedPlace=computed(()=>{const pin=savedAttempt.value?.pin;if(!pin)return null;const course=courses.value.find(value=>value.courseId===pin.course.courseId&&value.release===pin.course.release);const lesson=course?.lessons.find(value=>value.code===pin.lesson.code&&value.hash===pin.lesson.hash);const mode=props.learningResult?.learningMode;const modeTitle=mode?.currentAttemptId===savedAttempt.value.attemptId&&mode.lessonTitle!==pin.lesson.code?mode.lessonTitle:``;return{courseTitle:course?.title||``,lessonTitle:lesson?.title||modeTitle||``}});const statusTone=course=>!course.enabled?`disabled`:course.status===`released`?`enabled`:`preview`;const statusIcon={enabled:trainingIcons.checkCircle,preview:trainingIcons.eye,disabled:trainingIcons.cancel};function unusableNote(course){const titles=course.unusableLessons.map(lesson=>lesson.title).join(`, `);return`${course.unusableLessons.length===1?`One lesson is`:`${course.unusableLessons.length} lessons are`} not shown because this version of Vibe64 can't teach ${course.unusableLessons.length===1?`it`:`them`}: ${titles}. Update the course when Courses offers an update.`}const uniqueLessonCount=computed(()=>new Set(summaries.value.flatMap(({course})=>course.lessons.map(lesson=>`${lesson.code}\n${lesson.hash}`))).size);const plural=(count,word)=>`${count} ${word}${count===1?``:`s`}`;return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:normalizeClass([`training-lesson-picker`,{"training-lesson-picker--course-open":openCourse.value}]),"aria-label":`Courses`,"aria-busy":__props.catalogueLoading||__props.learningLoading},[createBaseVNode(`header`,_hoisted_2$12,[_cache[11]||(_cache[11]=createBaseVNode(`svg`,{class:`tlp-hero__art`,viewBox:`0 0 240 160`,"aria-hidden":`true`,focusable:`false`},[createBaseVNode(`circle`,{cx:`188`,cy:`34`,r:`58`,class:`tlp-hero__sun`}),createBaseVNode(`path`,{d:`M18 132 C 62 132, 64 92, 104 92 S 150 52, 196 52`,class:`tlp-hero__trail`}),createBaseVNode(`circle`,{cx:`18`,cy:`132`,r:`9`,class:`tlp-hero__stop tlp-hero__stop--done`}),createBaseVNode(`circle`,{cx:`104`,cy:`92`,r:`9`,class:`tlp-hero__stop tlp-hero__stop--done`}),createBaseVNode(`circle`,{cx:`196`,cy:`52`,r:`11`,class:`tlp-hero__stop`}),createBaseVNode(`path`,{d:`M190 52 l4.5 4.5 l8 -9`,class:`tlp-hero__tick`})],-1)),createBaseVNode(`div`,_hoisted_3$11,[createBaseVNode(`p`,_hoisted_4$7,[createVNode(VIcon,{icon:unref(trainingIcons).school,size:`18`},null,8,[`icon`]),_cache[7]||(_cache[7]=createTextVNode(` Learning`,-1))]),_cache[8]||(_cache[8]=createBaseVNode(`h2`,null,`Courses`,-1)),_cache[9]||(_cache[9]=createBaseVNode(`p`,null,`Choose a course to see its lessons and your progress, or continue your lesson.`,-1)),summaries.value.length?(openBlock(),createElementBlock(`p`,_hoisted_5$7,toDisplayString(plural(summaries.value.length,`course`))+` · `+toDisplayString(plural(uniqueLessonCount.value,`lesson`))+` installed `,1)):createCommentVNode(``,true)]),createVNode(VBtn,{class:`tlp-hero__refresh`,variant:`tonal`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).refresh,disabled:__props.busy||__props.catalogueLoading||__props.learningLoading,onClick:_cache[0]||(_cache[0]=$event=>emit(`refresh`))},{default:withCtx(()=>[..._cache[10]||(_cache[10]=[createTextVNode(`Refresh courses`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])]),__props.learningLoading&&!savedAttempt.value?(openBlock(),createElementBlock(`div`,_hoisted_6$4,[..._cache[12]||(_cache[12]=[createStaticVNode(`<span class="tlp-shimmer tlp-shimmer--ring" data-v-9361f867></span><span class="tlp-skeleton__lines" data-v-9361f867><span class="tlp-shimmer" style="width:40%;" data-v-9361f867></span><span class="tlp-shimmer" style="width:70%;" data-v-9361f867></span><span class="tlp-shimmer" style="width:55%;" data-v-9361f867></span></span>`,2)])])):createCommentVNode(``,true),__props.learningError||learningInvalid.value?(openBlock(),createBlock(VAlert,{key:1,type:`error`,variant:`tonal`,rounded:`lg`,role:`alert`},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.learningError||`Saved learning could not be displayed. Refresh before requesting a lesson; no progress was changed.`),1)]),_:1})):!__props.learningLoading&&(!__props.learningResult||__props.learningResult.ok!==true||__props.learningResult.available!==true)?(openBlock(),createElementBlock(`p`,_hoisted_7$3,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),createBaseVNode(`span`,null,toDisplayString(__props.learningResult?.error||`Saved learning is not available yet. No lesson has been started here.`),1)])):createCommentVNode(``,true),savedAttempt.value?(openBlock(),createElementBlock(`article`,_hoisted_8$3,[_cache[20]||(_cache[20]=createBaseVNode(`div`,{class:`tlp-saved__glow`,"aria-hidden":`true`},null,-1)),completion.value?(openBlock(),createBlock(TrainingProgressRing_default,{key:0,class:`tlp-saved__ring`,value:completion.value.passed,max:completion.value.required,size:96,stroke:10,label:`${completion.value.passed} of ${completion.value.required} required steps done`},{default:withCtx(()=>[createBaseVNode(`span`,_hoisted_9$1,[createBaseVNode(`strong`,null,toDisplayString(completion.value.passed),1),createTextVNode(` of `+toDisplayString(completion.value.required),1),_cache[13]||(_cache[13]=createBaseVNode(`small`,null,`required done`,-1))])]),_:1},8,[`value`,`max`,`label`])):(openBlock(),createElementBlock(`div`,_hoisted_10$1,[createVNode(VIcon,{icon:unref(trainingIcons).bookmark,size:`36`},null,8,[`icon`])])),createBaseVNode(`div`,_hoisted_11$1,[createBaseVNode(`p`,_hoisted_12$1,`Lesson in progress · `+toDisplayString(savedAttempt.value.pin.lesson.code),1),createBaseVNode(`h3`,_hoisted_13$1,toDisplayString(savedPlace.value.lessonTitle||`Continue where you left off`),1),createBaseVNode(`p`,_hoisted_14$1,[savedPlace.value.courseTitle?(openBlock(),createElementBlock(Fragment,{key:0},[createTextVNode(toDisplayString(savedPlace.value.courseTitle)+` · `,1)],64)):createCommentVNode(``,true),createTextVNode(toDisplayString(savedAttempt.value.pin.course.courseId)+` · `+toDisplayString(savedAttempt.value.pin.course.release),1)]),completion.value?(openBlock(),createElementBlock(`p`,_hoisted_15$1,[completion.value.completed?(openBlock(),createBlock(VIcon,{key:0,icon:unref(trainingIcons).checkCircle,size:`18`,color:`success`},null,8,[`icon`])):createCommentVNode(``,true),createTextVNode(` `+toDisplayString(completion.value.passed)+` of `+toDisplayString(completion.value.required)+` required steps done. `+toDisplayString(completion.value.completed?`This lesson is complete.`:`Continue the remaining steps.`),1)])):(openBlock(),createElementBlock(`p`,_hoisted_16$1,`Saved attempt retained. Completion has not been reported.`)),__props.learningResult.activeSummaryCurrent===false?(openBlock(),createElementBlock(`p`,_hoisted_17$1,`The saved summary needs reconciliation. Continue lesson rechecks this same attempt; reading it does not repair it.`)):createCommentVNode(``,true),!__props.canResume?(openBlock(),createElementBlock(`p`,_hoisted_18$1,`Continuing a lesson is unavailable in this installation. Your lesson remains visible.`)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_19$1,[createVNode(VBtn,{color:`primary`,variant:`flat`,rounded:`pill`,size:`large`,"min-height":`48`,"prepend-icon":unref(trainingIcons).play,disabled:!resumeEnabled.value,onClick:requestResume},{default:withCtx(()=>[..._cache[14]||(_cache[14]=[createTextVNode(`Continue lesson`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])]),createBaseVNode(`details`,_hoisted_20$1,[createBaseVNode(`summary`,null,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`18`},null,8,[`icon`]),_cache[15]||(_cache[15]=createBaseVNode(`span`,null,`Saved lesson identity`,-1)),createVNode(VIcon,{class:`tlp-chevron`,icon:unref(trainingIcons).chevronDown,size:`18`},null,8,[`icon`])]),createBaseVNode(`dl`,null,[_cache[16]||(_cache[16]=createBaseVNode(`dt`,null,`Topic`,-1)),createBaseVNode(`dd`,null,toDisplayString(savedAttempt.value.pin.topic.topicId)+` · `+toDisplayString(savedAttempt.value.pin.topic.release),1),_cache[17]||(_cache[17]=createBaseVNode(`dt`,null,`Commit`,-1)),createBaseVNode(`dd`,null,[createBaseVNode(`code`,null,toDisplayString(savedAttempt.value.pin.topic.commit),1)]),_cache[18]||(_cache[18]=createBaseVNode(`dt`,null,`Lesson hash`,-1)),createBaseVNode(`dd`,null,[createBaseVNode(`code`,null,toDisplayString(savedAttempt.value.pin.lesson.hash),1)]),_cache[19]||(_cache[19]=createBaseVNode(`dt`,null,`Attempt`,-1)),createBaseVNode(`dd`,null,[createBaseVNode(`code`,null,toDisplayString(savedAttempt.value.attemptId),1)])])])])])):createCommentVNode(``,true),__props.catalogueLoading&&!courses.value.length?(openBlock(),createElementBlock(`div`,_hoisted_21$1,[(openBlock(),createElementBlock(Fragment,null,renderList(3,index=>{return createBaseVNode(`div`,{key:index,class:`tlp-skeleton tlp-skeleton--card`},[..._cache[21]||(_cache[21]=[createStaticVNode(`<span class="tlp-shimmer tlp-shimmer--art" data-v-9361f867></span><span class="tlp-skeleton__lines" data-v-9361f867><span class="tlp-shimmer" style="width:65%;height:18px;" data-v-9361f867></span><span class="tlp-shimmer" style="width:45%;" data-v-9361f867></span><span class="tlp-shimmer" style="width:80%;" data-v-9361f867></span></span>`,2)])])}),64))])):createCommentVNode(``,true),__props.catalogueError||catalogueInvalid.value?(openBlock(),createBlock(VAlert,{key:5,type:`error`,variant:`tonal`,rounded:`lg`,role:`alert`},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.catalogueError||(lessonTitlesMissing.value?`Lesson titles are unavailable. Refresh courses; your saved lesson and history remain retained.`:`Installed courses could not be displayed. Refresh or ask the owner to restore the exact content; nothing was installed or enabled.`)),1)]),_:1})):!__props.catalogueLoading&&(!__props.catalogueResult||__props.catalogueResult.ok!==true||__props.catalogueResult.available!==true)?(openBlock(),createElementBlock(`div`,_hoisted_22$1,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`32`,class:`tlp-empty__icon`},null,8,[`icon`]),createBaseVNode(`p`,null,toDisplayString(__props.catalogueResult?.error||`Installed courses are not available yet.`),1)])):!__props.catalogueLoading&&courses.value.length===0?(openBlock(),createElementBlock(`div`,_hoisted_23$1,[_cache[22]||(_cache[22]=createBaseVNode(`svg`,{class:`tlp-empty__art`,viewBox:`0 0 120 80`,"aria-hidden":`true`,focusable:`false`},[createBaseVNode(`rect`,{x:`10`,y:`66`,width:`100`,height:`6`,rx:`3`,class:`tlp-empty__shelf`}),createBaseVNode(`rect`,{x:`24`,y:`30`,width:`16`,height:`36`,rx:`3`,class:`tlp-empty__book`}),createBaseVNode(`rect`,{x:`44`,y:`22`,width:`14`,height:`44`,rx:`3`,class:`tlp-empty__book tlp-empty__book--alt`}),createBaseVNode(`rect`,{x:`70`,y:`40`,width:`16`,height:`26`,rx:`3`,class:`tlp-empty__book tlp-empty__book--ghost`,transform:`rotate(-12 78 53)`})],-1)),showCatalogue.value?(openBlock(),createElementBlock(`p`,_hoisted_24$1,`No courses are installed yet. Choose a course in the catalogue below and select Install.`)):(openBlock(),createElementBlock(`p`,_hoisted_25,`No courses are installed. Ask the owner to install and enable a course; this page cannot install one.`))])):createCommentVNode(``,true),openCourse.value?(openBlock(),createBlock(TrainingCoursePage_default,{key:8,course:openCourse.value.course,progress:openCourse.value.progress,"start-allowed":startPossible.value,"can-try-previews":canTryPreviews.value,"resume-allowed":!!resumeEnabled.value,"start-feedback":feedbackFor(openCourse.value.key),"starting-lesson":lesson=>startingHere(openCourse.value.course,lesson),onBack:_cache[1]||(_cache[1]=$event=>openCourseKey.value=``),onStart:_cache[2]||(_cache[2]=$event=>startLesson(openCourse.value.course,$event)),onResume:requestResume},null,8,[`course`,`progress`,`start-allowed`,`can-try-previews`,`resume-allowed`,`start-feedback`,`starting-lesson`])):(openBlock(),createElementBlock(Fragment,{key:9},[courses.value.length?(openBlock(),createElementBlock(`div`,_hoisted_26,[(openBlock(true),createElementBlock(Fragment,null,renderList(summaries.value,({course,key,progress},index)=>{return openBlock(),createElementBlock(`article`,{key,class:normalizeClass([`tlp-card`,{"tlp-card--active":progress.activeHere,"tlp-card--off":statusTone(course)!==`enabled`}]),style:normalizeStyle({"--tlp-index":index}),"aria-label":course.title},[createBaseVNode(`div`,_hoisted_28,[createVNode(TrainingCourseArt_default,{"course-id":course.courseId,title:course.title,statuses:progress.lessons.map(value=>value.status)},null,8,[`course-id`,`title`,`statuses`]),createBaseVNode(`div`,_hoisted_29,[progress.activeHere?(openBlock(),createElementBlock(`span`,_hoisted_30,[createVNode(VIcon,{icon:unref(trainingIcons).bookmark,size:`14`},null,8,[`icon`]),_cache[23]||(_cache[23]=createTextVNode(`Lesson in progress`,-1))])):progress.total&&progress.completed===progress.total?(openBlock(),createElementBlock(`span`,_hoisted_31,[createVNode(VIcon,{icon:unref(trainingIcons).trophy,size:`14`},null,8,[`icon`]),_cache[24]||(_cache[24]=createTextVNode(`Course complete`,-1))])):createCommentVNode(``,true),createBaseVNode(`span`,{class:normalizeClass([`tlp-chip`,`tlp-chip--${statusTone(course)}`])},[createVNode(VIcon,{icon:statusIcon[statusTone(course)],size:`14`},null,8,[`icon`]),createTextVNode(toDisplayString(unref(courseStatusLabel)(course)),1)],2),updateFor(course)?(openBlock(),createElementBlock(`span`,_hoisted_32,[createVNode(VIcon,{icon:unref(trainingIcons).update,size:`14`},null,8,[`icon`]),createTextVNode(`Update available: `+toDisplayString(updateFor(course).release),1)])):createCommentVNode(``,true)])]),createBaseVNode(`div`,_hoisted_33,[createBaseVNode(`h3`,_hoisted_34,toDisplayString(course.title),1),createBaseVNode(`p`,_hoisted_35,[createBaseVNode(`code`,null,toDisplayString(course.courseId)+` · `+toDisplayString(course.release),1)]),createBaseVNode(`p`,_hoisted_36,[createBaseVNode(`span`,null,[createVNode(VIcon,{icon:unref(trainingIcons).layers,size:`16`},null,8,[`icon`]),createTextVNode(toDisplayString(plural(course.topics.length,`topic`)),1)]),createBaseVNode(`span`,null,[createVNode(VIcon,{icon:unref(trainingIcons).book,size:`16`},null,8,[`icon`]),createTextVNode(toDisplayString(plural(course.lessons.length,`lesson`)),1)])]),course.unusableLessons?.length?(openBlock(),createElementBlock(`p`,_hoisted_37,toDisplayString(unusableNote(course)),1)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_38,[createVNode(TrainingProgressRing_default,{value:progress.completed,max:progress.total,size:48,stroke:5,label:`${course.title}: ${progress.completed} of ${progress.total} lessons complete`},null,8,[`value`,`max`,`label`]),createBaseVNode(`div`,null,[createBaseVNode(`p`,_hoisted_39,toDisplayString(progress.completed)+` of `+toDisplayString(progress.total)+` lessons complete`,1),progress.next&&!progress.activeHere?(openBlock(),createElementBlock(`p`,_hoisted_40,`Next: `+toDisplayString(progress.next.title),1)):unref(previewCourse)(course)&&!canTryPreviews.value&&!progress.activeHere?(openBlock(),createElementBlock(`p`,_hoisted_41,toDisplayString(unref(previewNote)),1)):createCommentVNode(``,true)])]),feedbackFor(key)?(openBlock(),createBlock(TrainingStartFeedback_default,{key:1,feedback:feedbackFor(key)},null,8,[`feedback`])):createCommentVNode(``,true)]),createBaseVNode(`div`,_hoisted_42,[progress.activeHere?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`flat`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).play,disabled:!resumeEnabled.value,onClick:requestResume},{default:withCtx(()=>[..._cache[25]||(_cache[25]=[createTextVNode(`Continue lesson`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])):progress.next?(openBlock(),createBlock(VBtn,{key:1,color:`primary`,variant:`flat`,rounded:`pill`,"min-height":`48`,"prepend-icon":startingHere(course,progress.next)?void 0:unref(trainingIcons).play,readonly:startingHere(course,progress.next),disabled:!startPossible.value&&!startingHere(course,progress.next),onClick:$event=>startLesson(course,progress.next)},{default:withCtx(()=>[startingHere(course,progress.next)?(openBlock(),createElementBlock(Fragment,{key:0},[createVNode(VProgressCircular,{indeterminate:``,size:`18`,width:`2`,class:`tlp-card__spinner`}),_cache[26]||(_cache[26]=createTextVNode(`Starting lesson…`,-1))],64)):(openBlock(),createElementBlock(Fragment,{key:1},[createTextVNode(`Start lesson`)],64))]),_:2},1032,[`prepend-icon`,`readonly`,`disabled`,`onClick`])):createCommentVNode(``,true),updateFor(course)?(openBlock(),createBlock(VBtn,{key:2,variant:`tonal`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).update,loading:__props.installState?.phase===`installing`&&__props.installState.courseId===course.courseId,disabled:__props.busy,onClick:$event=>requestInstall({courseId:course.courseId,release:updateFor(course).release})},{default:withCtx(()=>[..._cache[27]||(_cache[27]=[createTextVNode(`Update`,-1)])]),_:1},8,[`prepend-icon`,`loading`,`disabled`,`onClick`])):createCommentVNode(``,true),createVNode(VBtn,{variant:`text`,rounded:`pill`,"min-height":`48`,"append-icon":unref(trainingIcons).arrowRight,onClick:$event=>openCourseKey.value=key},{default:withCtx(()=>[..._cache[28]||(_cache[28]=[createTextVNode(`View course`,-1)])]),_:1},8,[`append-icon`,`onClick`])])],14,_hoisted_27)}),128)),canCreateCourses.value&&!creating.value?(openBlock(),createElementBlock(`div`,{key:0,class:`tlp-new`,style:normalizeStyle({"--tlp-index":summaries.value.length})},[createBaseVNode(`span`,_hoisted_43,[createVNode(VIcon,{icon:unref(trainingIcons).path,size:`28`},null,8,[`icon`])]),_cache[30]||(_cache[30]=createBaseVNode(`p`,null,`Combine installed topics into a course of your own.`,-1)),createVNode(VBtn,{variant:`tonal`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).plus,disabled:__props.busy||__props.catalogueLoading,onClick:_cache[3]||(_cache[3]=$event=>creating.value=true)},{default:withCtx(()=>[..._cache[29]||(_cache[29]=[createTextVNode(`New course`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])],4)):createCommentVNode(``,true)])):createCommentVNode(``,true),creating.value&&canCreateCourses.value?(openBlock(),createBlock(TrainingCourseCreator_default,{key:1,topics:availableTopics.value,busy:__props.busy,onCreate:requestCreateCourse,onCancel:_cache[4]||(_cache[4]=$event=>creating.value=false)},null,8,[`topics`,`busy`])):canCreateCourses.value&&!courses.value.length?(openBlock(),createElementBlock(`div`,_hoisted_44,[createVNode(VBtn,{variant:`tonal`,rounded:`pill`,"min-height":`48`,"prepend-icon":unref(trainingIcons).plus,disabled:__props.busy||__props.catalogueLoading,onClick:_cache[5]||(_cache[5]=$event=>creating.value=true)},{default:withCtx(()=>[..._cache[31]||(_cache[31]=[createTextVNode(`New course`,-1)])]),_:1},8,[`prepend-icon`,`disabled`])])):createCommentVNode(``,true),showCatalogue.value&&!creating.value?(openBlock(),createBlock(TrainingCourseCatalogue_default,{key:3,"available-result":__props.availableResult,"available-loading":__props.availableLoading,"available-error":__props.availableError,"install-state":__props.installState,busy:__props.busy,onInstall:requestInstall,onView:viewInstalled,onRefresh:_cache[6]||(_cache[6]=$event=>emit(`refresh`))},null,8,[`available-result`,`available-loading`,`available-error`,`install-state`,`busy`])):createCommentVNode(``,true)],64)),courses.value.length&&(savedAttempt.value||__props.startUnconfirmed&&!startFeedback.value||!__props.canStart)?(openBlock(),createElementBlock(`div`,_hoisted_45,[savedAttempt.value?(openBlock(),createElementBlock(`p`,_hoisted_46,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),_cache[32]||(_cache[32]=createBaseVNode(`span`,null,`A lesson is in progress. Starting a different one first asks to archive it.`,-1))])):__props.startUnconfirmed&&!startFeedback.value?(openBlock(),createElementBlock(`p`,_hoisted_47,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),_cache[33]||(_cache[33]=createBaseVNode(`span`,null,`The last lesson start was not confirmed. Use Retry lesson start to repeat that same request.`,-1))])):!__props.canStart?(openBlock(),createElementBlock(`p`,_hoisted_48,[createVNode(VIcon,{icon:unref(trainingIcons).info,size:`20`},null,8,[`icon`]),_cache[34]||(_cache[34]=createBaseVNode(`span`,null,`Starting lessons is unavailable in this installation.`,-1))])):createCommentVNode(``,true)])):createCommentVNode(``,true),history.value.length?(openBlock(),createElementBlock(`details`,_hoisted_49,[createBaseVNode(`summary`,null,[createVNode(VIcon,{icon:unref(trainingIcons).history,size:`20`},null,8,[`icon`]),createBaseVNode(`span`,null,`Saved lesson history (`+toDisplayString(history.value.length)+`)`,1),createVNode(VIcon,{class:`tlp-chevron`,icon:unref(trainingIcons).chevronDown,size:`18`},null,8,[`icon`])]),createBaseVNode(`ol`,null,[(openBlock(true),createElementBlock(Fragment,null,renderList(history.value,attempt=>{return openBlock(),createElementBlock(`li`,{key:attempt.attemptId},[createBaseVNode(`strong`,null,toDisplayString(attempt.pin.lesson.code),1),createTextVNode(` · `+toDisplayString(attempt.pin.course.courseId)+` · `+toDisplayString(attempt.pin.course.release)+` `,1),createBaseVNode(`p`,null,[_cache[35]||(_cache[35]=createTextVNode(`Ended attempt · `,-1)),createBaseVNode(`code`,null,toDisplayString(attempt.attemptId),1)]),createBaseVNode(`p`,null,[createTextVNode(`Topic `+toDisplayString(attempt.pin.topic.topicId)+` · `+toDisplayString(attempt.pin.topic.release)+` · `,1),createBaseVNode(`code`,null,toDisplayString(attempt.pin.topic.commit),1)]),createBaseVNode(`p`,null,[_cache[36]||(_cache[36]=createTextVNode(`Lesson hash · `,-1)),createBaseVNode(`code`,null,toDisplayString(attempt.pin.lesson.hash),1)])])}),128))])])):createCommentVNode(``,true)],10,_hoisted_1$17)}}};var TrainingLessonPicker_default=_plugin_vue_export_helper_default(_sfc_main$32,[[`__scopeId`,`data-v-9361f867`]]);var _hoisted_1$16={class:`vibe64-learning-launcher`};var _sfc_main$31={__name:`Vibe64LearningCourses`,props:{courses:{type:Object,required:true}},setup(__props){const props=__props;const learning=useVibe64Learning();const opened=operation=>request(async owner=>learning.opened(await operation(owner,{onAdmitted:learning.admitted})));const start=(selection,kind=`start`)=>request(owner=>learning.startLesson(selection,owner.startLesson),kind);const route=useRoute();const error=ref(``);const errorLearner=ref(``);const errorKind=ref(``);const catalogue=computed(()=>toValue(props.courses.coursesResource.data));const progress=computed(()=>toValue(props.courses.learningResource.data));const busy=computed(()=>toValue(props.courses.busy));const retry=computed(()=>toValue(props.courses.startRetry));const starting=computed(()=>toValue(props.courses.starting)===true);const installState=computed(()=>toValue(props.courses.installState)||null);const errorVisible=computed(()=>Boolean(errorLearner.value&&errorLearner.value===toValue(props.courses.learnerId)&&toValue(props.courses.active)));const aiFailure=computed(()=>{const failure=progress.value?.ok===true?progress.value.active?.preparation?.failure:null;return failure?.code===VIBE64_LEARNING_AI_REQUIRED_CODE?failure:null});const aiNotice=computed(()=>aiFailure.value?.message||(aiOnboardingNeeded.value?`Lessons use your AI: the coding agent in each practice project and Colleague, your teacher, both need it. Set up your AI before you start.`:``));const canRequest=computed(()=>Boolean(toValue(props.courses.learnerId)&&toValue(props.courses.active)));let feedbackGeneration=0;watch(()=>[toValue(props.courses.learnerId),toValue(props.courses.active),route.fullPath],()=>{feedbackGeneration+=1;error.value=``;errorLearner.value=``},{flush:`sync`});async function request(operation,kind=``){const owner=props.courses;const learner=toValue(owner.learnerId);const target=route.fullPath;const generation=feedbackGeneration;error.value=``;errorLearner.value=learner;errorKind.value=kind;try{return await operation(owner)}catch(cause){if(cause?.code===VIBE64_LEARNING_AI_REQUIRED_CODE){await owner.learningResource.reload();return null}if(props.courses===owner&&generation===feedbackGeneration&&learner===toValue(owner.learnerId)&&target===route.fullPath)error.value=String(cause?.message||`The lesson request was not confirmed. Read saved progress before trying again.`);return null}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,_hoisted_1$16,[error.value&&errorVisible.value&&errorKind.value!==`start`?(openBlock(),createBlock(VAlert,{key:0,type:`error`,variant:`tonal`,class:`vibe64-learning-launcher__error`},{default:withCtx(()=>[createTextVNode(toDisplayString(error.value),1)]),_:1})):createCommentVNode(``,true),aiNotice.value?(openBlock(),createBlock(VAlert,{key:1,type:`warning`,variant:`tonal`,class:`vibe64-learning-launcher__error`,"data-test":`learning-ai-notice`},{default:withCtx(()=>[createBaseVNode(`p`,null,toDisplayString(aiNotice.value),1),unref(aiOnboardingAvailable)?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`flat`,rounded:`pill`,"min-height":`40`,class:`vibe64-learning-launcher__ai`,onClick:_cache[0]||(_cache[0]=$event=>unref(requestVibe64AiOnboarding)())},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(` Set up your AI `,-1)])]),_:1})):createCommentVNode(``,true)]),_:1})):createCommentVNode(``,true),retry.value?(openBlock(),createBlock(VBtn,{key:2,class:`vibe64-learning-launcher__retry`,variant:`tonal`,rounded:`pill`,"min-height":`48`,disabled:busy.value||!canRequest.value,onClick:_cache[1]||(_cache[1]=$event=>start(toValue(__props.courses.startRetry),``))},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(` Retry lesson start `,-1)])]),_:1},8,[`disabled`])):createCommentVNode(``,true),renderSlot(_ctx.$slots,`default`,{courses:__props.courses,opened,busy:busy.value,canRequest:canRequest.value},void 0,true),createVNode(unref(TrainingLessonPicker_default),{"catalogue-result":catalogue.value,"learning-result":progress.value,"catalogue-loading":toValue(__props.courses.coursesResource.isLoading),"learning-loading":toValue(__props.courses.learningResource.isLoading),"catalogue-error":toValue(__props.courses.coursesResource.loadError),"learning-error":toValue(__props.courses.learningResource.loadError),busy:busy.value,"can-start":canRequest.value,"can-resume":canRequest.value,"create-course":input=>request(owner=>owner.createCourse(input)),"available-result":toValue(__props.courses.availableResource?.data),"available-loading":toValue(__props.courses.availableResource?.isLoading)===true,"available-error":toValue(__props.courses.availableResource?.loadError)||``,"install-state":installState.value,starting:starting.value,"start-unconfirmed":Boolean(retry.value),"start-error":error.value&&errorVisible.value&&errorKind.value===`start`?error.value:``,onRefresh:_cache[2]||(_cache[2]=$event=>request(owner=>owner.refresh())),onStart:start,onResume:_cache[3]||(_cache[3]=$event=>opened((owner,options)=>owner.resumeLesson($event.attemptId,options))),onInstall:_cache[4]||(_cache[4]=$event=>request(owner=>owner.installCourse($event)))},null,8,[`catalogue-result`,`learning-result`,`catalogue-loading`,`learning-loading`,`catalogue-error`,`learning-error`,`busy`,`can-start`,`can-resume`,`create-course`,`available-result`,`available-loading`,`available-error`,`install-state`,`starting`,`start-unconfirmed`,`start-error`])])}}};var Vibe64LearningCourses_default=_plugin_vue_export_helper_default(_sfc_main$31,[[`__scopeId`,`data-v-617ef698`]]);function I(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var y=I();function W(l){y=l}var A={exec:()=>null};function C(l){let e=[];return t=>{let n=Math.max(0,Math.min(3,t-1)),s=e[n];return s||(s=l(n),e[n]=s),s}}function h(l,e=``){let t=typeof l==`string`?l:l.source,n={replace:(s,r)=>{let o=typeof r==`string`?r:r.source;return o=o.replace(x.caret,`$1`),t=t.replace(s,o),n},getRegex:()=>new RegExp(t,e)};return n}var _e=((l=``)=>{try{return!!new RegExp(`(?<=1)(?<!1)`+l)}catch{return!1}})();var x={codeRemoveIndent:/^(?: {0,3}\t| {1,4})/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,leadingSpaceTab:/^[ \t]+/,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,numericCharacterReference:/&#(?:(\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/g,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:l=>new RegExp(`^( {0,3}${l})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:C(l=>new RegExp(`^ {0,${l}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`)),hrRegex:C(l=>new RegExp(`^ {0,${l}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\*[ ]*){3,})(?:\\n+|$)`)),fencesBeginRegex:C(l=>new RegExp(`^ {0,${l}}(?:\`\`\`|~~~)`)),headingBeginRegex:C(l=>new RegExp(`^ {0,${l}}#`)),htmlBeginRegex:C(l=>new RegExp(`^ {0,${l}}(?:</?(?:${N})(?: +|$|/?>)|<(?:script|pre|style|textarea|!--))`,`i`)),blockquoteBeginRegex:C(l=>new RegExp(`^ {0,${l}}>`))};var $e=/^(?:[ \t]*(?:\n|$))+/;var Le=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/;var ze=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/;var G=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/;var Ae=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/;var J=/ {0,3}(?:[*+-]|\d{1,9}[.)])/;var ce=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |fences|blockquote|heading|hr|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/;var he=h(ce).replace(/bull/g,J).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,``).getRegex();var Ee=h(ce).replace(/bull/g,J).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex();var V=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/;var Me=/^[^\n]+/;var Y=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/;var Ie=h(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace(`label`,Y).replace(`title`,/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex();var Ce=h(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,J).getRegex();var N=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`;var ee=/<!--(?:-?>|[\s\S]*?(?:-->|$))/;var Be=h(`^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][a-z0-9-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))`,`i`).replace(`comment`,ee).replace(`tag`,N).replace(`attribute`,/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex();var de=l=>h(V).replace(`hr`,G).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,l).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,N).getRegex();var De=de(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/);var qe=de(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/);var te={blockquote:h(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace(`paragraph`,qe).getRegex(),code:Le,def:Ie,fences:ze,heading:Ae,hr:G,html:Be,lheading:he,list:Ce,newline:$e,paragraph:De,table:A,text:Me};var le=h(`^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)`).replace(`hr`,G).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\n]`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,N).getRegex();var Ze={...te,lheading:Ee,table:le,paragraph:h(V).replace(`hr`,G).replace(`heading`,` {0,3}#{1,6}(?:\\s|$)`).replace(`|lheading`,``).replace(`table`,le).replace(`blockquote`,` {0,3}>`).replace(`fences`," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]`).replace(`html`,`</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)`).replace(`tag`,N).getRegex()};var He={...te,html:h(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace(`comment`,ee).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b`).getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:A,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:h(V).replace(`hr`,G).replace(`heading`,` *#{1,6} *[^
|
|
69
|
+
]`).replace(`lheading`,he).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()};var Ge=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/;var Ne=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/;var ke=/^( {2,}|\\)\n(?!\s*$)[ \t]*/;var Qe=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/;var $=/[\p{P}\p{S}]/u;var B=/[\s\p{P}\p{S}]/u;var Q=/[^\s\p{P}\p{S}]/u;var je=h(/^((?![*_])punctSpace)/,`u`).replace(/punctSpace/g,B).getRegex();var Fe=/[\p{Pi}\p{Ps}"']/u;var ge=/(?!~)[\p{P}\p{S}]/u;var Ue=/(?!~)[\s\p{P}\p{S}]/u;var Ke=/(?:[^\s\p{P}\p{S}]|~)/u;var We=h(/link|precode-code|html/,`g`).replace(`link`,/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace(`precode-`,_e?"(?<!`)()":"(^^|[^`])").replace(`code`,/(?<b>`+)[^`]+\k<b>(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex();var fe=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/;var Xe=h(fe,`u`).replace(/punct/g,$).getRegex();var Je=h(fe,`u`).replace(/punct/g,ge).getRegex();var Ye=h(/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,`u`).replace(/openQuote/g,Fe).replace(/punct/g,$).getRegex();var me=`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)`;var et=h(me,`gu`).replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex();var tt=h(me,`gu`).replace(/notPunctSpace/g,Ke).replace(/punctSpace/g,Ue).replace(/punct/g,ge).getRegex();var rt=h(`^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex();var st=h(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex();var ot=h(`^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex();var at=h(/^~~?(?:((?!~)punct)|[^\s~])/,`u`).replace(/punct/g,$).getRegex();var ut=h(`^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,Q).replace(/punctSpace/g,B).replace(/punct/g,$).getRegex();var pt=h(/\\(punct)/,`gu`).replace(/punct/g,$).getRegex();var ct=h(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace(`scheme`,/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(`email`,/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex();var ht=h(ee).replace(`(?:-->|$)`,`-->`).getRegex();var dt=h(`^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>`).replace(`comment`,ht).replace(`attribute`,/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex();var xe=/\[(?:\\[\s\S]|[^\[\]\\])*\]/;var U=h(/(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/).replace(`brackets`,xe).getRegex();var kt=h(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace(`label`,U).replace(`href`,/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace(`title`,/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex();var gt=h(/^!?\[(label)\]\[(ref)\]/).replace(`label`,U).replace(`ref`,Y).getRegex();var ft=h(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,Y).getRegex();var ue=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\]){1,999}/;var mt=h(/(?:[^\[\]\\`]*(?:\[(?:brackets|\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\]))){0,999}?[^\[\]\\`]*?/).replace(`brackets`,xe).getRegex();var xt=h(`reflink|nolink(?!\\()`,`g`).replace(`reflink`,h(/^!?\[(label)\]\[(ref)\]/).replace(`label`,mt).replace(`ref`,ue).getRegex()).replace(`nolink`,h(/^!?\[(ref)\](?:\[\])?/).replace(`ref`,ue).getRegex()).getRegex();var pe=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/;var Rt=h(/(?:mailto:email|xmpp:email(?:\/[A-Za-z0-9@.]+)?)/).replace(/email/g,/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex();var ne={_backpedal:A,anyPunctuation:pt,autolink:ct,blockSkip:We,br:ke,code:Ne,del:A,delLDelim:A,delRDelim:A,emStrongLDelim:Xe,emStrongRDelimAst:et,emStrongRDelimUnd:st,escape:Ge,link:kt,nolink:ft,punctuation:je,reflink:gt,reflinkSearch:xt,tag:dt,text:Qe,url:A};var Tt={...ne,emStrongLDelim:Ye,emStrongRDelimAst:rt,emStrongRDelimUnd:ot,link:h(/^!?\[(label)\]\((.*?)\)/).replace(`label`,U).getRegex(),reflink:h(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace(`label`,U).getRegex()};var X={...ne,emStrongRDelimAst:tt,emStrongLDelim:Je,delLDelim:at,delRDelim:ut,url:h(/^emailProtocol|^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace(`emailProtocol`,Rt).replace(`protocol`,pe).replace(`email`,/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:h(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))))/).replace(`protocol`,pe).replace(/emailProtocol/g,/(?:mailto|xmpp):/).getRegex()};var Ot={...X,br:h(ke).replace(`{2,}`,`*`).getRegex(),text:h(X.text).replace(`\\b_`,`\\b_| {2,}\\n`).replace(/\{2,\}/g,`*`).getRegex()};var j={normal:te,gfm:Ze,pedantic:He};var D={normal:ne,gfm:X,breaks:Ot,pedantic:Tt};var wt={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`};var be=l=>wt[l];function O(l,e){if(e){if(x.escapeTest.test(l))return l.replace(x.escapeReplace,be)}else if(x.escapeTestNoEncode.test(l))return l.replace(x.escapeReplaceNoEncode,be);return l}function Re(l){return l.replace(x.numericCharacterReference,(e,t,n)=>{let s=t===void 0?Number.parseInt(n,16):Number.parseInt(t,10);return s===0||s>1114111||s>=55296&&s<=57343?`�`:String.fromCodePoint(s)})}function re$1(l){try{l=encodeURI(l).replace(x.percentDecode,`%`)}catch{return null}return l}function se(l,e){let n=l.replace(x.findPipe,(r,o,i)=>{let u=!1,a=o;for(;--a>=0&&i[a]===`\\`;)u=!u;return u?`|`:` |`}).split(x.splitPipe),s=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),e)if(n.length>e)n.splice(e);else for(;n.length<e;)n.push(``);for(;s<n.length;s++)n[s]=n[s].trim().replace(x.slashPipe,`|`);return n}function L(l,e,t){let n=l.length;if(n===0)return``;let s=0;for(;s<n;){let r=l.charAt(n-s-1);if(r===e&&!t)s++;else if(r!==e&&t)s++;else break}return l.slice(0,n-s)}function ie(l){let e=l.split(`
|
|
70
|
+
`),t=e.length-1;for(;t>=0&&x.blankLine.test(e[t]);)t--;return e.length-t<=2?l:e.slice(0,t+1).join(`
|
|
71
|
+
`)}function q(l){return l.trim().toLowerCase().toUpperCase().toLowerCase()}function Te(l,e){if(l.indexOf(e[1])===-1)return-1;let t=0;for(let n=0;n<l.length;n++)if(l[n]===`\\`)n++;else if(l[n]===e[0])t++;else if(l[n]===e[1]&&(t--,t<0))return n;return t>0?-2:-1}function oe(l,e=0){let t=e,n=``;for(let s of l)if(s===` `){let r=4-t%4;n+=` `.repeat(r),t+=r}else n+=s,t++;return n}function Oe(l,e,t,n,s){let r=e.href,o=e.title||null,i=l[1].replace(s.other.outputLinkReplace,`$1`),u=l[0].charAt(0)===`!`;n.state.inLink=!0;let a=n.state.linkEmitted,p=n.state.inRawBlock;n.state.linkEmitted=!1;let c=n.inlineTokens(i),d=n.state.linkEmitted;if(n.state.linkEmitted=a,n.state.inLink=!1,!u){if(d){n.state.inRawBlock=p;return}n.state.linkEmitted=!0}return{type:u?`image`:`link`,raw:t,href:r,title:o,text:i,tokens:c}}function yt(l,e,t){let n=l.match(t.other.indentCodeCompensation);if(n===null)return e;let s=n[1];return e.split(`
|
|
72
|
+
`).map(r=>{let o=r.match(t.other.beginningSpace);if(o===null)return r;let[i]=o;return r.slice(Math.min(i.length,s.length))}).join(`
|
|
73
|
+
`)}function we(l,e,t,n){if(!e.includes(`<`))return!1;for(let s=0;s<e.length;s++){if(e[s]===`\\`){s++;continue}if(e[s]==="`"){let i=n.inline.code.exec(e.slice(s));if(i){s+=i[0].length-1;continue}}if(e[s]!==`<`)continue;let r=l.slice(t+s),o=n.inline.tag.exec(r)||n.inline.autolink.exec(r);if(o){if(o[0].length>e.length-s)return!0;s+=o[0].length-1}}return!1}var P=class{options;rules;lexer;constructor(e){this.options=e||y}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:`space`,raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let n=this.options.pedantic?t[0]:ie(t[0]);return{type:`code`,raw:n,codeBlockStyle:`indented`,text:n.replace(this.rules.other.codeRemoveIndent,``)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=yt(n,t[3]||``,this.rules);return{type:`code`,raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,`$1`):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=L(n,`#`);(this.options.pedantic||!s||this.rules.other.endingSpaceTabChar.test(s))&&(n=s.trim())}return{type:`heading`,raw:L(t[0],`
|
|
74
|
+
`),depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:`hr`,raw:L(t[0],`
|
|
75
|
+
`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=L(t[0],`
|
|
76
|
+
`).split(`
|
|
77
|
+
`),s=``,r=``,o=[];for(;n.length>0;){let i=!1,u=[],a=0;for(;a<n.length;a++)if(this.rules.other.blockquoteStart.test(n[a]))u.push(n[a]),i=!0;else if(!i)u.push(n[a]);else break;n=n.slice(a);let p=u.join(`
|
|
78
|
+
`),c=p.replace(this.rules.other.blockquoteSetextReplace,`
|
|
79
|
+
$1`).replace(this.rules.other.blockquoteSetextReplace2,``);s=s?`${s}
|
|
80
|
+
${p}`:p,r=r?`${r}
|
|
81
|
+
${c}`:c;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,o,!0),this.lexer.state.top=d,n.length===0)break;let m=o.at(-1);if(m?.type===`code`)break;if(m?.type===`blockquote`){let b=m,g=n.join(`
|
|
82
|
+
`),w=b.raw+`
|
|
83
|
+
`+g.replace(this.rules.other.blockquoteSetextReplace2,``),f=this.blockquote(w);o[o.length-1]=f;let M=w.substring(f.raw.length).replace(/^\n/,``),v=M?M.split(`
|
|
84
|
+
`).length:0,Z=v?n.slice(0,-v):n;Z.length>0&&(s=`${s}
|
|
85
|
+
${Z.join(`
|
|
86
|
+
`)}`),r=r.substring(0,r.length-b.text.length)+f.text;break}else if(m?.type===`list`){let b=m,g=b.raw+`
|
|
87
|
+
`+n.join(`
|
|
88
|
+
`),w=this.list(g);o[o.length-1]=w,s=s.substring(0,s.length-m.raw.length)+w.raw,r=r.substring(0,r.length-b.raw.length)+w.raw,n=g.substring(o.at(-1).raw.length).split(`
|
|
89
|
+
`);continue}}return{type:`blockquote`,raw:s,tokens:o,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),s=n.length>1,r={type:`list`,raw:``,ordered:s,start:s?+n.slice(0,-1):``,loose:!1,items:[]};n=s?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=s?n:`[*+-]`);let o=this.rules.other.listItemRegex(n),i=!1;for(;e;){let a=!1,p=``,c=``;if(!(t=o.exec(e))||this.rules.block.hr.test(e))break;p=t[0],e=e.substring(p.length);let d=t[2].split(`
|
|
90
|
+
`,1)[0],m=t[1].length,b=this.options.pedantic?oe(d,m):d.replace(this.rules.other.leadingSpaceTab,M=>oe(M,m)),g=e.split(`
|
|
91
|
+
`,1)[0],w=!b.trim(),f=0;if(this.options.pedantic?(f=2,c=b.trimStart()):w?f=m+1:(f=b.search(this.rules.other.nonSpaceChar),f=f>4?1:f,c=b.slice(f),f+=m),w&&this.rules.other.blankLine.test(g)&&(p+=g+`
|
|
92
|
+
`,e=e.substring(g.length+1),a=!0),!a){let M=this.rules.other.nextBulletRegex(f),v=this.rules.other.hrRegex(f),Z=this.rules.other.fencesBeginRegex(f),ae=this.rules.other.headingBeginRegex(f),ye=this.rules.other.htmlBeginRegex(f),Pe=this.rules.other.blockquoteBeginRegex(f);for(;e;){let K=e.split(`
|
|
93
|
+
`,1)[0],H;if(g=K,this.options.pedantic?(g=g.replace(this.rules.other.listReplaceNesting,` `),H=g):H=g.replace(this.rules.other.leadingSpaceTab,Se=>Se.replace(this.rules.other.tabCharGlobal,` `)),Z.test(g)||ae.test(g)||ye.test(g)||Pe.test(g)||M.test(g)||v.test(g))break;if(H.search(this.rules.other.nonSpaceChar)>=f||!g.trim())c+=`
|
|
94
|
+
`+H.slice(f);else{if(w||b.replace(this.rules.other.tabCharGlobal,` `).search(this.rules.other.nonSpaceChar)>=4||Z.test(b)||ae.test(b)||v.test(b))break;c+=`
|
|
95
|
+
`+g}w=!g.trim(),p+=K+`
|
|
96
|
+
`,e=e.substring(K.length+1),b=H.slice(f)}}r.loose||(i?r.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(i=!0)),r.items.push({type:`list_item`,raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(c),loose:!1,text:c,tokens:[]}),r.raw+=p}let u=r.items.at(-1);if(u)u.raw=u.raw.trimEnd(),u.text=u.text.trimEnd();else return;r.raw=r.raw.trimEnd();for(let a of r.items)if(this.lexer.state.top=!1,a.tokens=this.lexer.blockTokens(a.text,[]),!r.loose){let p=a.tokens.filter(d=>d.type===`space`);r.loose=p.length>0&&p.some(d=>this.rules.other.anyLine.test(d.raw))}for(let a of r.items){let p=a.tokens[0];if(a.task&&(p?.type===`text`||p?.type===`paragraph`)){a.text=a.text.replace(this.rules.other.listReplaceTask,``),p.raw=p.raw.replace(this.rules.other.listReplaceTask,``),p.text=p.text.replace(this.rules.other.listReplaceTask,``);for(let d=this.lexer.inlineQueue.length-1;d>=0;d--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[d].src)){this.lexer.inlineQueue[d].src=this.lexer.inlineQueue[d].src.replace(this.rules.other.listReplaceTask,``);break}let c=this.rules.other.listTaskCheckbox.exec(a.raw);if(c){let d={type:`checkbox`,raw:c[0]+` `,checked:c[0]!==`[ ]`};a.checked=d.checked,r.loose?a.tokens[0]&&[`paragraph`,`text`].includes(a.tokens[0].type)&&`tokens`in a.tokens[0]&&a.tokens[0].tokens?(a.tokens[0].raw=d.raw+a.tokens[0].raw,a.tokens[0].text=d.raw+a.tokens[0].text,a.tokens[0].tokens.unshift(d)):a.tokens.unshift({type:`paragraph`,raw:d.raw,text:d.raw,tokens:[d]}):a.tokens.unshift(d)}}else a.task&&(a.task=!1)}if(r.loose)for(let a of r.items){a.loose=!0;for(let p of a.tokens)p.type===`text`&&(p.type=`paragraph`)}return r}}html(e){let t=this.rules.block.html.exec(e);if(t){let n=ie(t[0]);return{type:`html`,block:!0,raw:n,pre:t[1]===`pre`||t[1]===`script`||t[1]===`style`,text:n}}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=q(t[1]).replace(this.rules.other.multipleSpaceGlobal,` `),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,`$1`).replace(this.rules.inline.anyPunctuation,`$1`):``,r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,`$1`):t[3];return{type:`def`,tag:n,raw:L(t[0],`
|
|
97
|
+
`),href:s,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=se(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,``).split(`|`),r=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,``).split(`
|
|
98
|
+
`):[],o={type:`table`,raw:L(t[0],`
|
|
99
|
+
`),header:[],align:[],rows:[]};if(n.length===s.length){for(let i of s)this.rules.other.tableAlignRight.test(i)?o.align.push(`right`):this.rules.other.tableAlignCenter.test(i)?o.align.push(`center`):this.rules.other.tableAlignLeft.test(i)?o.align.push(`left`):o.align.push(null);for(let i=0;i<n.length;i++)o.header.push({text:n[i],tokens:this.lexer.inline(n[i]),header:!0,align:o.align[i]});for(let i of r)o.rows.push(se(i,o.header.length).map((u,a)=>({text:u,tokens:this.lexer.inline(u),header:!1,align:o.align[a]})));return o}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let n=t[1].trim();return{type:`heading`,raw:L(t[0],`
|
|
100
|
+
`),depth:t[2].charAt(0)===`=`?1:2,text:n,tokens:this.lexer.inline(n)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`
|
|
101
|
+
`?t[1].slice(0,-1):t[1];return{type:`paragraph`,raw:t[0],text:n,tokens:this.lexer.inline(n)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:`text`,raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:`escape`,raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:`html`,raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){let t=this.rules.inline.link.exec(e);if(t){let n=t[0].charAt(0)===`!`?2:1;if(!this.options.pedantic&&we(e,t[1],n,this.rules))return;let s=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(s)){if(!this.rules.other.endAngleBracket.test(s))return;let i=L(s.slice(0,-1),`\\`);if((s.length-i.length)%2===0)return}else{let i=Te(t[2],`()`);if(i===-2)return;if(i>-1){let a=(t[0].indexOf(`!`)===0?5:4)+t[1].length+i;t[2]=t[2].substring(0,i),t[0]=t[0].substring(0,a).trim(),t[3]=``}}let r=t[2],o=``;if(this.options.pedantic){let i=this.rules.other.pedanticHrefTitle.exec(r);i&&(r=i[1],o=i[3])}else o=t[3]?t[3].slice(1,-1):``;return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(s)?r=r.slice(1):r=r.slice(1,-1)),Oe(t,{href:r&&r.replace(this.rules.inline.anyPunctuation,`$1`),title:o&&o.replace(this.rules.inline.anyPunctuation,`$1`)},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let s=n[0].charAt(0)===`!`?2:1;if(!this.options.pedantic&&we(e,n[1],s,this.rules))return;let o=t[q((n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,` `))];if(!o){let i=n[0].charAt(0);return{type:`text`,raw:i,text:i}}return Oe(n,o,n[0],this.lexer,this.rules)}}emStrong(e,t,n=``){let s=this.rules.inline.emStrongLDelim.exec(e);if(!s||!s[1]&&!s[2]&&!s[3]&&!s[4]||s[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;if(!(s[1]||s[3]||``)||!n||this.rules.inline.punctuation.exec(n)){let o=[...s[0]].length-1,i,u,a=o,p=0,c=s[0][0],d=n===c,m=c===`*`?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(m.lastIndex=0,t=t.slice(-1*e.length+o);(s=m.exec(t))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i)continue;if(u=[...i].length,s[3]||s[4]){a+=u;continue}else if(s[5]||s[6]){if(o%3&&!((o+u)%3)){p+=u;continue}if(d)break}if(a-=u,a>0)continue;u=Math.min(u,u+a+p);let b=[...s[0]][0].length,g=e.slice(0,o+s.index+b+u);if(Math.min(o,u)%2){let f=g.slice(1,-1);return{type:`em`,raw:g,text:f,tokens:this.lexer.inlineTokens(f)}}let w=g.slice(2,-2);return{type:`strong`,raw:g,text:w,tokens:this.lexer.inlineTokens(w)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal,` `),s=this.rules.other.nonSpaceChar.test(n),r=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&r&&(n=n.substring(1,n.length-1)),{type:`codespan`,raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:`br`,raw:t[0]}}del(e,t,n=``){let s=this.rules.inline.delLDelim.exec(e);if(!s)return;if(!(s[1]||``)||!n||this.rules.inline.punctuation.exec(n)){let o=[...s[0]].length-1,i,u,a=o,p=this.rules.inline.delRDelim;for(p.lastIndex=0,t=t.slice(-1*e.length+o);(s=p.exec(t))!==null;){if(i=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!i||(u=[...i].length,u!==o))continue;if(s[3]||s[4]){a+=u;continue}if(a-=u,a>0)continue;u=Math.min(u,u+a);let c=[...s[0]][0].length,d=e.slice(0,o+s.index+c+u),m=d.slice(o,-o);return{type:`del`,raw:d,text:m,tokens:this.lexer.inlineTokens(m)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]===`@`?(n=t[1],s=`mailto:`+n):(n=t[1],s=n),{type:`link`,raw:t[0],text:n,href:s,autolink:!0,tokens:[{type:`text`,raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]===`@`)n=t[0],s=`mailto:`+n;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??``;while(r!==t[0]);n=t[0],t[1]===`www.`?s=`http://`+t[0]:s=t[0]}return{type:`link`,raw:t[0],text:n,href:s,autolink:!0,tokens:[{type:`text`,raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:`text`,raw:t[0],text:n?t[0]:Re(t[0]),escaped:n}}}};var R=class l{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||y,this.options.tokenizer=this.options.tokenizer||new P,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,top:!0};let t={other:x,block:j.normal,inline:D.normal};this.options.pedantic?(t.block=j.pedantic,t.inline=D.pedantic):this.options.gfm&&(t.block=j.gfm,this.options.breaks?t.inline=D.breaks:t.inline=D.gfm),this.tokenizer.rules=t}static get rules(){return{block:j,inline:D}}static lex(e,t){return new l(t).lex(e)}static lexInline(e,t){return new l(t).inlineTokens(e)}lex(e){e=e.replace(x.carriageReturn,`
|
|
102
|
+
`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let n=this.inlineQueue[t];this.inlineTokens(n.src,n.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(x.tabCharGlobal,` `).replace(x.spaceLine,``));let s=1/0;for(;e;){if(e.length<s)s=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let r;if(this.options.extensions?.block?.some(i=>(r=i.call({lexer:this},e,t))?(e=e.substring(r.raw.length),t.push(r),!0):!1))continue;if(r=this.tokenizer.space(e)){e=e.substring(r.raw.length);let i=t.at(-1);r.raw.length===1&&i!==void 0?i.raw+=`
|
|
103
|
+
`:t.push(r);continue}if(r=this.tokenizer.code(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===`paragraph`||i?.type===`text`?(i.raw+=(i.raw.endsWith(`
|
|
104
|
+
`)?``:`
|
|
105
|
+
`)+r.raw,i.text+=`
|
|
106
|
+
`+r.text,this.inlineQueue.at(-1).src=i.text):t.push(r);continue}if(r=this.tokenizer.fences(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.heading(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.hr(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.blockquote(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.list(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.html(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.def(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===`paragraph`||i?.type===`text`?(i.raw+=(i.raw.endsWith(`
|
|
107
|
+
`)?``:`
|
|
108
|
+
`)+r.raw,i.text+=`
|
|
109
|
+
`+r.raw,this.inlineQueue.at(-1).src=i.text):this.tokens.links[r.tag]||(this.tokens.links[r.tag]={href:r.href,title:r.title},t.push(r));continue}if(r=this.tokenizer.table(e)){e=e.substring(r.raw.length),t.push(r);continue}if(r=this.tokenizer.lheading(e)){e=e.substring(r.raw.length),t.push(r);continue}let o=e;if(this.options.extensions?.startBlock){let i=1/0,u=e.slice(1),a;this.options.extensions.startBlock.forEach(p=>{a=p.call({lexer:this},u),typeof a==`number`&&a>=0&&(i=Math.min(i,a))}),i<1/0&&i>=0&&(o=e.substring(0,i+1))}if(this.state.top&&(r=this.tokenizer.paragraph(o))){let i=t.at(-1);n&&i?.type===`paragraph`?(i.raw+=(i.raw.endsWith(`
|
|
110
|
+
`)?``:`
|
|
111
|
+
`)+r.raw,i.text+=`
|
|
112
|
+
`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):t.push(r),n=o.length!==e.length,e=e.substring(r.raw.length);continue}if(r=this.tokenizer.text(e)){e=e.substring(r.raw.length);let i=t.at(-1);i?.type===`text`?(i.raw+=(i.raw.endsWith(`
|
|
113
|
+
`)?``:`
|
|
114
|
+
`)+r.raw,i.text+=`
|
|
115
|
+
`+r.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=i.text):t.push(r);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}linkInText(e){if(!e.includes(`[`))return!1;let t=this.tokenizer.rules.inline.link;for(let n of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(t.test(n[0])&&e.charAt(n.index-1)!==`!`)return!0;for(let n of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let s=n[0],r=s.lastIndexOf(`[`);if(!(s.charAt(0)===`!`||!Object.hasOwn(this.tokens.links,q(s.slice(r+1,-1))))&&!(r>1&&this.linkInText(s.slice(1,r-1))))return!0}return!1}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=e;if(this.tokens.links&&e.includes(`[`)){let i=this.tokenizer.rules.inline.reflinkSearch,u=a=>{let p=a.lastIndexOf(`[`);if(!Object.hasOwn(this.tokens.links,q(a.slice(p+1,-1))))return a;if(p>1&&a.charAt(0)!==`!`){let c=a.slice(1,p-1);if(this.linkInText(c))return`[`+c.replace(i,u)+`][`+`a`.repeat(a.length-p-2)+`]`}return`[`+`a`.repeat(a.length-2)+`]`};n=n.replace(i,u)}n=n.replace(this.tokenizer.rules.inline.anyPunctuation,i=>`+`.repeat(i.length)),n=n.replace(this.tokenizer.rules.inline.blockSkip,(i,u,a)=>{let p=a?a.length:0;return i.slice(0,p)+`[`+`a`.repeat(i.length-p-2)+`]`}),n=this.options.hooks?.emStrongMask?.call({lexer:this},n)??n;let s=!1,r=``,o=1/0;for(;e;){if(e.length<o)o=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}s||(r=``),s=!1;let i;if(this.options.extensions?.inline?.some(a=>(i=a.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.escape(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.tag(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.link(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(i.raw.length);let a=t.at(-1);i.type===`text`&&a?.type===`text`?(a.raw+=i.raw,a.text+=i.text):t.push(i);continue}if(i=this.tokenizer.emStrong(e,n,r)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.codespan(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.br(e)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.del(e,n,r)){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.autolink(e)){e=e.substring(i.raw.length),t.push(i);continue}if(!this.state.inLink&&(i=this.tokenizer.url(e))){e=e.substring(i.raw.length),t.push(i);continue}let u=e;if(this.options.extensions?.startInline){let a=1/0,p=e.slice(1),c;this.options.extensions.startInline.forEach(d=>{c=d.call({lexer:this},p),typeof c==`number`&&c>=0&&(a=Math.min(a,c))}),a<1/0&&a>=0&&(u=e.substring(0,a+1))}if(i=this.tokenizer.inlineText(u)){e=e.substring(i.raw.length),i.raw.slice(-1)!==`_`&&(r=i.raw.slice(-1)),s=!0;let a=t.at(-1);a?.type===`text`?(a.raw+=i.raw,a.text+=i.text):t.push(i);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t=`Infinite loop on byte: `+e;if(this.options.silent)console.error(t);else throw new Error(t)}};var S=class{options;parser;constructor(e){this.options=e||y}space(e){return``}code({text:e,lang:t,escaped:n}){let s=(t||``).match(x.notSpaceStart)?.[0],r=e?e.replace(x.endingNewline,``)+`
|
|
116
|
+
`:``;return s?`<pre><code class="language-`+O(s)+`">`+(n?r:O(r,!0))+`</code></pre>
|
|
117
|
+
`:`<pre><code>`+(n?r:O(r,!0))+`</code></pre>
|
|
118
|
+
`}blockquote({tokens:e}){return`<blockquote>
|
|
119
|
+
${this.parser.parse(e)}</blockquote>
|
|
120
|
+
`}html({text:e}){return e}def(e){return``}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
|
|
121
|
+
`}hr(e){return`<hr>
|
|
122
|
+
`}list(e){let t=e.ordered,n=e.start,s=``;for(let i=0;i<e.items.length;i++){let u=e.items[i];s+=this.listitem(u)}let r=t?`ol`:`ul`,o=t&&n!==1?` start="`+n+`"`:``;return`<`+r+o+`>
|
|
123
|
+
`+s+`</`+r+`>
|
|
124
|
+
`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>
|
|
125
|
+
`}checkbox({checked:e}){return`<input `+(e?`checked="" `:``)+`disabled="" type="checkbox"> `}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
|
|
126
|
+
`}table(e){let t=``,n=``;for(let r=0;r<e.header.length;r++)n+=this.tablecell(e.header[r]);t+=this.tablerow({text:n});let s=``;for(let r=0;r<e.rows.length;r++){let o=e.rows[r];n=``;for(let i=0;i<o.length;i++)n+=this.tablecell(o[i]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>
|
|
127
|
+
<thead>
|
|
128
|
+
`+t+`</thead>
|
|
129
|
+
`+s+`</table>
|
|
130
|
+
`}tablerow({text:e}){return`<tr>
|
|
131
|
+
${e}</tr>
|
|
132
|
+
`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?`th`:`td`;return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
|
|
133
|
+
`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${O(e,!0)}</code>`}br(e){return`<br>`}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,text:n,tokens:s,autolink:r}){let o=r?O(n,!0):this.parser.parseInline(s),i=re$1(e);if(i===null)return o;e=O(i,r);let u=`<a href="`+e+`"`;return t&&(u+=` title="`+O(t)+`"`),u+=`>`+o+`</a>`,u}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let r=re$1(e);if(r===null)return O(n);e=r;let o=`<img src="${O(e)}" alt="${O(n)}"`;return t&&(o+=` title="${O(t)}"`),o+=`>`,o}text(e){return`tokens`in e&&e.tokens?this.parser.parseInline(e.tokens):`escaped`in e&&e.escaped?e.text:O(e.text)}};var z=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return``+e}image({text:e}){return``+e}br(){return``}checkbox({raw:e}){return e}};var T=class l{options;renderer;textRenderer;constructor(e){this.options=e||y,this.options.renderer=this.options.renderer||new S,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new z}static parse(e,t){return new l(t).parse(e)}static parseInline(e,t){return new l(t).parseInline(e)}parse(e){this.renderer.parser=this;let t=``;for(let n=0;n<e.length;n++){let s=e[n];if(this.options.extensions?.renderers?.[s.type]){let o=s,i=this.options.extensions.renderers[o.type].call({parser:this},o);if(i!==!1||![`space`,`hr`,`heading`,`code`,`table`,`blockquote`,`list`,`checkbox`,`html`,`def`,`paragraph`,`text`].includes(o.type)){t+=i||``;continue}}let r=s;switch(r.type){case`space`:t+=this.renderer.space(r);break;case`hr`:t+=this.renderer.hr(r);break;case`heading`:t+=this.renderer.heading(r);break;case`code`:t+=this.renderer.code(r);break;case`table`:t+=this.renderer.table(r);break;case`blockquote`:t+=this.renderer.blockquote(r);break;case`list`:t+=this.renderer.list(r);break;case`checkbox`:t+=this.renderer.checkbox(r);break;case`html`:t+=this.renderer.html(r);break;case`def`:t+=this.renderer.def(r);break;case`paragraph`:t+=this.renderer.paragraph(r);break;case`text`:t+=this.renderer.text(r);break;default:{let o=`Token with "`+r.type+`" type was not found.`;if(this.options.silent)return console.error(o),``;throw new Error(o)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=``;for(let s=0;s<e.length;s++){let r=e[s];if(this.options.extensions?.renderers?.[r.type]){let i=this.options.extensions.renderers[r.type].call({parser:this},r);if(i!==!1||![`escape`,`html`,`link`,`image`,`checkbox`,`strong`,`em`,`codespan`,`br`,`del`,`text`].includes(r.type)){n+=i||``;continue}}let o=r;switch(o.type){case`escape`:n+=t.text(o);break;case`html`:n+=t.html(o);break;case`link`:n+=t.link(o);break;case`image`:n+=t.image(o);break;case`checkbox`:n+=t.checkbox(o);break;case`strong`:n+=t.strong(o);break;case`em`:n+=t.em(o);break;case`codespan`:n+=t.codespan(o);break;case`br`:n+=t.br(o);break;case`del`:n+=t.del(o);break;case`text`:n+=t.text(o);break;default:{let i=`Token with "`+o.type+`" type was not found.`;if(this.options.silent)return console.error(i),``;throw new Error(i)}}}return n}};var _=class{options;block;constructor(e){this.options=e||y}static passThroughHooks=new Set([`preprocess`,`postprocess`,`processAllTokens`,`emStrongMask`]);static passThroughHooksRespectAsync=new Set([`preprocess`,`postprocess`,`processAllTokens`]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?R.lex:R.lexInline}provideParser(e=this.block){return e?T.parse:T.parseInline}};var F=class{defaults=I();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=T;Renderer=S;TextRenderer=z;Lexer=R;Tokenizer=P;Hooks=_;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(n=n.concat(t.call(this,s)),s.type){case`table`:{let r=s;for(let o of r.header)n=n.concat(this.walkTokens(o.tokens,t));for(let o of r.rows)for(let i of o)n=n.concat(this.walkTokens(i.tokens,t));break}case`list`:{let r=s;n=n.concat(this.walkTokens(r.items,t));break}default:{let r=s;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(o=>{let i=r[o].flat(1/0);n=n.concat(this.walkTokens(i,t))}):r.tokens&&(n=n.concat(this.walkTokens(r.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(r=>{if(!r.name)throw new Error(`extension name required`);if(`renderer`in r){let o=t.renderers[r.name];o?t.renderers[r.name]=function(...i){let u=r.renderer.apply(this,i);return u===!1&&(u=o.apply(this,i)),u}:t.renderers[r.name]=r.renderer}if(`tokenizer`in r){if(!r.level||r.level!==`block`&&r.level!==`inline`)throw new Error(`extension level must be 'block' or 'inline'`);let o=t[r.level];o?o.unshift(r.tokenizer):t[r.level]=[r.tokenizer],r.start&&(r.level===`block`?t.startBlock?t.startBlock.push(r.start):t.startBlock=[r.start]:r.level===`inline`&&(t.startInline?t.startInline.push(r.start):t.startInline=[r.start]))}`childTokens`in r&&r.childTokens&&(t.childTokens[r.name]=r.childTokens)}),s.extensions=t),n.renderer){let r=this.defaults.renderer||new S(this.defaults);for(let o in n.renderer){if(!(o in r))throw new Error(`renderer '${o}' does not exist`);if([`options`,`parser`].includes(o))continue;let i=o,u=n.renderer[i],a=r[i];r[i]=(...p)=>{let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c||``}}s.renderer=r}if(n.tokenizer){let r=this.defaults.tokenizer||new P(this.defaults);for(let o in n.tokenizer){if(!(o in r))throw new Error(`tokenizer '${o}' does not exist`);if([`options`,`rules`,`lexer`].includes(o))continue;let i=o,u=n.tokenizer[i],a=r[i];r[i]=(...p)=>{let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c}}s.tokenizer=r}if(n.hooks){let r=this.defaults.hooks||new _;for(let o in n.hooks){if(!(o in r))throw new Error(`hook '${o}' does not exist`);if([`options`,`block`].includes(o))continue;let i=o,u=n.hooks[i],a=r[i];_.passThroughHooks.has(o)?r[i]=p=>{if(this.defaults.async&&_.passThroughHooksRespectAsync.has(o))return(async()=>{let d=await u.call(r,p);return a.call(r,d)})();let c=u.call(r,p);return a.call(r,c)}:r[i]=(...p)=>{if(this.defaults.async)return(async()=>{let d=await u.apply(r,p);return d===!1&&(d=await a.apply(r,p)),d})();let c=u.apply(r,p);return c===!1&&(c=a.apply(r,p)),c}}s.hooks=r}if(n.walkTokens){let r=this.defaults.walkTokens,o=n.walkTokens;s.walkTokens=function(i){let u=[];return u.push(o.call(this,i)),r&&(u=u.concat(r.call(this,i))),u}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return R.lex(e,t??this.defaults)}parser(e,t){return T.parse(e,t??this.defaults)}parseMarkdown(e){return(n,s)=>{let r={...s},o={...this.defaults,...r},i=this.onError(!!o.silent,!!o.async);if(this.defaults.async===!0&&r.async===!1)return i(new Error(`marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.`));if(typeof n>`u`||n===null)return i(new Error(`marked(): input parameter is undefined or null`));if(typeof n!=`string`)return i(new Error(`marked(): input parameter is of type `+Object.prototype.toString.call(n)+`, string expected`));if(o.hooks&&(o.hooks.options=o,o.hooks.block=e),o.async)return(async()=>{let u=o.hooks?await o.hooks.preprocess(n):n,p=await(o.hooks?await o.hooks.provideLexer(e):e?R.lex:R.lexInline)(u,o),c=o.hooks?await o.hooks.processAllTokens(p):p;o.walkTokens&&await Promise.all(this.walkTokens(c,o.walkTokens));let m=await(o.hooks?await o.hooks.provideParser(e):e?T.parse:T.parseInline)(c,o);return o.hooks?await o.hooks.postprocess(m):m})().catch(i);try{o.hooks&&(n=o.hooks.preprocess(n));let a=(o.hooks?o.hooks.provideLexer(e):e?R.lex:R.lexInline)(n,o);o.hooks&&(a=o.hooks.processAllTokens(a)),o.walkTokens&&this.walkTokens(a,o.walkTokens);let c=(o.hooks?o.hooks.provideParser(e):e?T.parse:T.parseInline)(a,o);return o.hooks&&(c=o.hooks.postprocess(c)),c}catch(u){return i(u)}}}onError(e,t){return n=>{if(n.message+=`
|
|
134
|
+
Please report this to https://github.com/markedjs/marked.`,e){let s=`<p>An error occurred:</p><pre>`+O(n.message+``,!0)+`</pre>`;return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}};var E=new F;function k(l,e){return E.parse(l,e)}k.options=k.setOptions=function(l){return E.setOptions(l),k.defaults=E.defaults,W(k.defaults),k};k.getDefaults=I;k.defaults=y;function Pt(...l){return E.use(...l),k.defaults=E.defaults,W(k.defaults),k}k.use=Pt;k.walkTokens=function(l,e){return E.walkTokens(l,e)};k.parseInline=E.parseInline;k.Parser=T;k.parser=T.parse;k.Renderer=S;k.TextRenderer=z;k.Lexer=R;k.lexer=R.lex;k.Tokenizer=P;k.Hooks=_;k.parse=k;var gn=k.options;var fn=k.setOptions;var mn=k.walkTokens;var xn=k.parseInline;var Rn=T.parse;var Tn=R.lex;function _OverloadYield(e,d){this.v=e,this.k=d}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _arrayWithHoles(r){if(Array.isArray(r))return r}function _iterableToArrayLimit(r,l){var t=null==r?null:`undefined`!=typeof Symbol&&r[Symbol.iterator]||r[`@@iterator`];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t.return&&(u=t.return(),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _nonIterableRest(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
|
|
135
|
+
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _unsupportedIterableToArray(r,a){if(r){if(`string`==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return`Object`===t&&r.constructor&&(t=r.constructor.name),`Map`===t||`Set`===t?Array.from(r):`Arguments`===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function AsyncGenerator(e){var t,n;function resume(t,n){try{var r=e[t](n),o=r.value,u=o instanceof _OverloadYield;Promise.resolve(u?o.v:o).then(function(n){if(u){var i=`return`===t&&o.k?t:`next`;if(!o.k||n.done)return resume(i,n);n=e[i](n).value}settle(!!r.done,n)},function(e){resume(`throw`,e)})}catch(e){settle(2,e)}}function settle(e,r){2===e?t.reject(r):t.resolve({value:r,done:e}),(t=t.next)?resume(t.key,t.arg):n=null}this._invoke=function(e,r){return new Promise(function(o,u){var i={key:e,arg:r,resolve:o,reject:u,next:null};n?n=n.next=i:(t=n=i,resume(e,r))})},`function`!=typeof e.return&&(this.return=void 0)}AsyncGenerator.prototype[`function`==typeof Symbol&&Symbol.asyncIterator||`@@asyncIterator`]=function(){return this},AsyncGenerator.prototype.next=function(e){return this._invoke(`next`,e)},AsyncGenerator.prototype.throw=function(e){return this._invoke(`throw`,e)},AsyncGenerator.prototype.return=function(e){return this._invoke(`return`,e)};var entries=Object.entries;var setPrototypeOf=Object.setPrototypeOf;var isFrozen=Object.isFrozen;var getPrototypeOf=Object.getPrototypeOf;var getOwnPropertyDescriptor=Object.getOwnPropertyDescriptor;var freeze=Object.freeze;var seal=Object.seal;var create=Object.create;var _ref=typeof Reflect!==`undefined`&&Reflect;var apply=_ref.apply;var construct=_ref.construct;if(!freeze)freeze=function freeze(x){return x};if(!seal)seal=function seal(x){return x};if(!apply)apply=function apply(func,thisArg){for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return func.apply(thisArg,args)};if(!construct)construct=function construct(Func){for(var _len2=arguments.length,args=new Array(_len2>1?_len2-1:0),_key2=1;_key2<_len2;_key2++)args[_key2-1]=arguments[_key2];return new Func(...args)};var arrayForEach=unapply(Array.prototype.forEach);Array.prototype.indexOf;var arrayLastIndexOf=unapply(Array.prototype.lastIndexOf);var arrayPop=unapply(Array.prototype.pop);var arrayPush=unapply(Array.prototype.push);Array.prototype.slice;var arraySplice=unapply(Array.prototype.splice);var arrayIsArray=Array.isArray;var stringToLowerCase=unapply(String.prototype.toLowerCase);var stringToString=unapply(String.prototype.toString);var stringMatch=unapply(String.prototype.match);var stringReplace=unapply(String.prototype.replace);var stringIndexOf=unapply(String.prototype.indexOf);var stringTrim=unapply(String.prototype.trim);var numberToString=unapply(Number.prototype.toString);var booleanToString=unapply(Boolean.prototype.toString);var bigintToString=typeof BigInt===`undefined`?null:unapply(BigInt.prototype.toString);var symbolToString=typeof Symbol===`undefined`?null:unapply(Symbol.prototype.toString);var objectHasOwnProperty=unapply(Object.prototype.hasOwnProperty);var objectToString=unapply(Object.prototype.toString);var regExpTest=unapply(RegExp.prototype.test);var typeErrorCreate=unconstruct(TypeError);function unapply(func){return function(thisArg){if(thisArg instanceof RegExp)thisArg.lastIndex=0;for(var _len3=arguments.length,args=new Array(_len3>1?_len3-1:0),_key3=1;_key3<_len3;_key3++)args[_key3-1]=arguments[_key3];return apply(func,thisArg,args)}}function unconstruct(Func){return function(){for(var _len4=arguments.length,args=new Array(_len4),_key4=0;_key4<_len4;_key4++)args[_key4]=arguments[_key4];return construct(Func,args)}}function addToSet(set,array){let transformCaseFunc=arguments.length>2&&arguments[2]!==void 0?arguments[2]:stringToLowerCase;if(setPrototypeOf)setPrototypeOf(set,null);if(!arrayIsArray(array))return set;let l=array.length;while(l--){let element=array[l];if(typeof element===`string`){const lcElement=transformCaseFunc(element);if(lcElement!==element){if(!isFrozen(array))array[l]=lcElement;element=lcElement}}set[element]=true}return set}function cleanArray(array){for(let index=0;index<array.length;index++)if(!objectHasOwnProperty(array,index))array[index]=null;return array}function clone(object){const newObject=create(null);for(const _ref2 of entries(object)){var _ref3=_slicedToArray(_ref2,2);const property=_ref3[0];const value=_ref3[1];if(objectHasOwnProperty(object,property)){if(arrayIsArray(value))newObject[property]=cleanArray(value);else if(value&&typeof value===`object`&&value.constructor===Object)newObject[property]=clone(value);else newObject[property]=value}}return newObject}function stringifyValue(value){switch(typeof value){case`string`:return value;case`number`:return numberToString(value);case`boolean`:return booleanToString(value);case`bigint`:return bigintToString?bigintToString(value):`0`;case`symbol`:return symbolToString?symbolToString(value):`Symbol()`;case`undefined`:return objectToString(value);case`function`:case`object`:{if(value===null)return objectToString(value);const valueAsRecord=value;const valueToString=lookupGetter(valueAsRecord,`toString`);if(typeof valueToString===`function`){const stringified=valueToString(valueAsRecord);return typeof stringified===`string`?stringified:objectToString(stringified)}return objectToString(value)}default:return objectToString(value)}}function lookupGetter(object,prop){while(object!==null){const desc=getOwnPropertyDescriptor(object,prop);if(desc){if(desc.get)return unapply(desc.get);if(typeof desc.value===`function`)return unapply(desc.value)}object=getPrototypeOf(object)}function fallbackValue(){return null}return fallbackValue}function isRegex(value){try{regExpTest(value,``);return true}catch(_unused){return false}}var html$1=freeze([`a`,`abbr`,`acronym`,`address`,`area`,`article`,`aside`,`audio`,`b`,`bdi`,`bdo`,`big`,`blink`,`blockquote`,`body`,`br`,`button`,`canvas`,`caption`,`center`,`cite`,`code`,`col`,`colgroup`,`content`,`data`,`datalist`,`dd`,`decorator`,`del`,`details`,`dfn`,`dialog`,`dir`,`div`,`dl`,`dt`,`element`,`em`,`fieldset`,`figcaption`,`figure`,`font`,`footer`,`form`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,`head`,`header`,`hgroup`,`hr`,`html`,`i`,`img`,`input`,`ins`,`kbd`,`label`,`legend`,`li`,`main`,`map`,`mark`,`marquee`,`menu`,`menuitem`,`meter`,`nav`,`nobr`,`ol`,`optgroup`,`option`,`output`,`p`,`picture`,`pre`,`progress`,`q`,`rp`,`rt`,`ruby`,`s`,`samp`,`search`,`section`,`select`,`shadow`,`slot`,`small`,`source`,`spacer`,`span`,`strike`,`strong`,`style`,`sub`,`summary`,`sup`,`table`,`tbody`,`td`,`template`,`textarea`,`tfoot`,`th`,`thead`,`time`,`tr`,`track`,`tt`,`u`,`ul`,`var`,`video`,`wbr`]);var svg$1=freeze([`svg`,`a`,`altglyph`,`altglyphdef`,`altglyphitem`,`animatecolor`,`animatemotion`,`animatetransform`,`circle`,`clippath`,`defs`,`desc`,`ellipse`,`enterkeyhint`,`exportparts`,`filter`,`font`,`g`,`glyph`,`glyphref`,`hkern`,`image`,`inputmode`,`line`,`lineargradient`,`marker`,`mask`,`metadata`,`mpath`,`part`,`path`,`pattern`,`polygon`,`polyline`,`radialgradient`,`rect`,`stop`,`style`,`switch`,`symbol`,`text`,`textpath`,`title`,`tref`,`tspan`,`view`,`vkern`]);var svgFilters=freeze([`feBlend`,`feColorMatrix`,`feComponentTransfer`,`feComposite`,`feConvolveMatrix`,`feDiffuseLighting`,`feDisplacementMap`,`feDistantLight`,`feDropShadow`,`feFlood`,`feFuncA`,`feFuncB`,`feFuncG`,`feFuncR`,`feGaussianBlur`,`feImage`,`feMerge`,`feMergeNode`,`feMorphology`,`feOffset`,`fePointLight`,`feSpecularLighting`,`feSpotLight`,`feTile`,`feTurbulence`]);var svgDisallowed=freeze([`animate`,`color-profile`,`cursor`,`discard`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`foreignobject`,`hatch`,`hatchpath`,`mesh`,`meshgradient`,`meshpatch`,`meshrow`,`missing-glyph`,`script`,`set`,`solidcolor`,`unknown`,`use`]);var mathMl$1=freeze([`math`,`menclose`,`merror`,`mfenced`,`mfrac`,`mglyph`,`mi`,`mlabeledtr`,`mmultiscripts`,`mn`,`mo`,`mover`,`mpadded`,`mphantom`,`mroot`,`mrow`,`ms`,`mspace`,`msqrt`,`mstyle`,`msub`,`msup`,`msubsup`,`mtable`,`mtd`,`mtext`,`mtr`,`munder`,`munderover`,`mprescripts`]);var mathMlDisallowed=freeze([`maction`,`maligngroup`,`malignmark`,`mlongdiv`,`mscarries`,`mscarry`,`msgroup`,`mstack`,`msline`,`msrow`,`semantics`,`annotation`,`annotation-xml`,`mprescripts`,`none`]);var text$5=freeze([`#text`]);var html=freeze([`accept`,`action`,`align`,`alt`,`autocapitalize`,`autocomplete`,`autopictureinpicture`,`autoplay`,`background`,`bgcolor`,`border`,`capture`,`cellpadding`,`cellspacing`,`checked`,`cite`,`class`,`clear`,`color`,`cols`,`colspan`,`command`,`commandfor`,`controls`,`controlslist`,`coords`,`crossorigin`,`datetime`,`decoding`,`default`,`dir`,`disabled`,`disablepictureinpicture`,`disableremoteplayback`,`download`,`draggable`,`enctype`,`enterkeyhint`,`exportparts`,`face`,`for`,`headers`,`height`,`hidden`,`high`,`href`,`hreflang`,`id`,`inert`,`inputmode`,`integrity`,`ismap`,`kind`,`label`,`lang`,`list`,`loading`,`loop`,`low`,`max`,`maxlength`,`media`,`method`,`min`,`minlength`,`multiple`,`muted`,`name`,`nonce`,`noshade`,`novalidate`,`nowrap`,`open`,`optimum`,`part`,`pattern`,`placeholder`,`playsinline`,`popover`,`popovertarget`,`popovertargetaction`,`poster`,`preload`,`pubdate`,`radiogroup`,`readonly`,`rel`,`required`,`rev`,`reversed`,`role`,`rows`,`rowspan`,`spellcheck`,`scope`,`selected`,`shape`,`size`,`sizes`,`slot`,`span`,`srclang`,`start`,`src`,`srcset`,`step`,`style`,`summary`,`tabindex`,`title`,`translate`,`type`,`usemap`,`valign`,`value`,`width`,`wrap`,`xmlns`]);var svg=freeze([`accent-height`,`accumulate`,`additive`,`alignment-baseline`,`amplitude`,`ascent`,`attributename`,`attributetype`,`azimuth`,`basefrequency`,`baseline-shift`,`begin`,`bias`,`by`,`class`,`clip`,`clippathunits`,`clip-path`,`clip-rule`,`color`,`color-interpolation`,`color-interpolation-filters`,`color-profile`,`color-rendering`,`cx`,`cy`,`d`,`dx`,`dy`,`diffuseconstant`,`direction`,`display`,`divisor`,`dominant-baseline`,`dur`,`edgemode`,`elevation`,`end`,`exponent`,`fill`,`fill-opacity`,`fill-rule`,`filter`,`filterunits`,`flood-color`,`flood-opacity`,`font-family`,`font-size`,`font-size-adjust`,`font-stretch`,`font-style`,`font-variant`,`font-weight`,`fx`,`fy`,`g1`,`g2`,`glyph-name`,`glyphref`,`gradientunits`,`gradienttransform`,`height`,`href`,`id`,`image-rendering`,`in`,`in2`,`intercept`,`k`,`k1`,`k2`,`k3`,`k4`,`kerning`,`keypoints`,`keysplines`,`keytimes`,`lang`,`lengthadjust`,`letter-spacing`,`kernelmatrix`,`kernelunitlength`,`lighting-color`,`local`,`marker-end`,`marker-mid`,`marker-start`,`markerheight`,`markerunits`,`markerwidth`,`maskcontentunits`,`maskunits`,`max`,`mask`,`mask-type`,`media`,`method`,`mode`,`min`,`name`,`numoctaves`,`offset`,`operator`,`opacity`,`order`,`orient`,`orientation`,`origin`,`overflow`,`paint-order`,`path`,`pathlength`,`patterncontentunits`,`patterntransform`,`patternunits`,`pointer-events`,`points`,`preservealpha`,`preserveaspectratio`,`primitiveunits`,`r`,`rx`,`ry`,`radius`,`refx`,`refy`,`repeatcount`,`repeatdur`,`restart`,`result`,`rotate`,`scale`,`seed`,`shape-rendering`,`slope`,`specularconstant`,`specularexponent`,`spreadmethod`,`startoffset`,`stddeviation`,`stitchtiles`,`stop-color`,`stop-opacity`,`stroke-dasharray`,`stroke-dashoffset`,`stroke-linecap`,`stroke-linejoin`,`stroke-miterlimit`,`stroke-opacity`,`stroke`,`stroke-width`,`style`,`surfacescale`,`systemlanguage`,`tabindex`,`tablevalues`,`targetx`,`targety`,`transform`,`transform-origin`,`text-anchor`,`text-decoration`,`text-orientation`,`text-rendering`,`textlength`,`type`,`u1`,`u2`,`unicode`,`values`,`vector-effect`,`viewbox`,`visibility`,`version`,`vert-adv-y`,`vert-origin-x`,`vert-origin-y`,`width`,`word-spacing`,`wrap`,`writing-mode`,`xchannelselector`,`ychannelselector`,`x`,`x1`,`x2`,`xmlns`,`y`,`y1`,`y2`,`z`,`zoomandpan`]);var mathMl=freeze([`accent`,`accentunder`,`align`,`bevelled`,`close`,`columnalign`,`columnlines`,`columnspacing`,`columnspan`,`denomalign`,`depth`,`dir`,`display`,`displaystyle`,`encoding`,`fence`,`frame`,`height`,`href`,`id`,`largeop`,`length`,`linethickness`,`lquote`,`lspace`,`mathbackground`,`mathcolor`,`mathsize`,`mathvariant`,`maxsize`,`minsize`,`movablelimits`,`notation`,`numalign`,`open`,`rowalign`,`rowlines`,`rowspacing`,`rowspan`,`rspace`,`rquote`,`scriptlevel`,`scriptminsize`,`scriptsizemultiplier`,`selection`,`separator`,`separators`,`stretchy`,`subscriptshift`,`supscriptshift`,`symmetric`,`voffset`,`width`,`xmlns`]);var xml=freeze([`xlink:href`,`xml:id`,`xlink:title`,`xml:space`,`xmlns:xlink`]);var MUSTACHE_EXPR=seal(/{{[\w\W]*|^[\w\W]*}}/g);var ERB_EXPR=seal(/<%[\w\W]*|^[\w\W]*%>/g);var TMPLIT_EXPR=seal(/\${[\w\W]*/g);var DATA_ATTR=seal(/^data-[\-\w.\u00B7-\uFFFF]+$/);var ARIA_ATTR=seal(/^aria-[\-\w]+$/);var IS_ALLOWED_URI=seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i);var IS_SCRIPT_OR_DATA=seal(/^(?:\w+script|data):/i);var ATTR_WHITESPACE=seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g);var DOCTYPE_NAME=seal(/^html$/i);var CUSTOM_ELEMENT=seal(/^[a-z][.\w]*(-[.\w]+)+$/i);var ELEMENT_MARKUP_PROBE=seal(/<[/\w!]/g);var COMMENT_MARKUP_PROBE=seal(/<[/\w]/g);var FALLBACK_TAG_CLOSE=seal(/<\/no(script|embed|frames)/i);var SELF_CLOSING_TAG=seal(/\/>/i);var NODE_TYPE={element:1,attribute:2,text:3,cdataSection:4,entityReference:5,entityNode:6,processingInstruction:7,comment:8,document:9,documentType:10,documentFragment:11,notation:12};var LITERAL_TEXT_ELEMENT_NAMES=[`style`,`script`,`xmp`,`iframe`,`noembed`,`noframes`,`plaintext`,`noscript`];var LITERAL_TEXT_ELEMENTS=freeze(addToSet({},LITERAL_TEXT_ELEMENT_NAMES));var LITERAL_TEXT_CLOSE=function(){const map={};arrayForEach(LITERAL_TEXT_ELEMENT_NAMES,name=>{map[name]=seal(new RegExp(`</`+name+`(?=[\\t\\n\\f\\r />])`,`i`))});return freeze(map)}();var getGlobal=function getGlobal(){return typeof window===`undefined`?null:window};var _createTrustedTypesPolicy=function _createTrustedTypesPolicy(trustedTypes,purifyHostElement){if(typeof trustedTypes!==`object`||typeof trustedTypes.createPolicy!==`function`)return null;let suffix=null;const ATTR_NAME=`data-tt-policy-suffix`;if(purifyHostElement&&purifyHostElement.hasAttribute(ATTR_NAME))suffix=purifyHostElement.getAttribute(ATTR_NAME);const policyName=`dompurify`+(suffix?`#`+suffix:``);try{return trustedTypes.createPolicy(policyName,{createHTML(html){return html},createScriptURL(scriptUrl){return scriptUrl}})}catch(_){console.warn(`TrustedTypes policy `+policyName+` could not be created.`);return null}};var _createHooksMap=function _createHooksMap(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};var _resolveSetOption=function _resolveSetOption(cfg,key,fallback,options){return objectHasOwnProperty(cfg,key)&&arrayIsArray(cfg[key])?addToSet(options.base?clone(options.base):{},cfg[key],options.transform):fallback};var _resolveObjectOption=function _resolveObjectOption(cfg,key,makeFallback){const value=objectHasOwnProperty(cfg,key)?cfg[key]:void 0;return value&&typeof value===`object`?clone(value):makeFallback()};function createDOMPurify(){let window=arguments.length>0&&arguments[0]!==void 0?arguments[0]:getGlobal();const DOMPurify=root=>createDOMPurify(root);DOMPurify.version=`3.4.16`;DOMPurify.removed=[];if(!window||!window.document||window.document.nodeType!==NODE_TYPE.document||!window.Element){DOMPurify.isSupported=false;return DOMPurify}let document=window.document;const originalDocument=document;const currentScript=originalDocument.currentScript;window.DocumentFragment;const HTMLTemplateElement=window.HTMLTemplateElement,Node=window.Node,Element=window.Element,NodeFilter=window.NodeFilter;window.NamedNodeMap===void 0&&(window.NamedNodeMap||window.MozNamedAttrMap);window.HTMLFormElement;const DOMParser=window.DOMParser,trustedTypes=window.trustedTypes;const ElementPrototype=Element.prototype;const cloneNode=lookupGetter(ElementPrototype,`cloneNode`);const remove=lookupGetter(ElementPrototype,`remove`);const removeAttributeNode=lookupGetter(ElementPrototype,`removeAttributeNode`);const getNextSibling=lookupGetter(ElementPrototype,`nextSibling`);const getChildNodes=lookupGetter(ElementPrototype,`childNodes`);const getParentNode=lookupGetter(ElementPrototype,`parentNode`);const getShadowRoot=lookupGetter(ElementPrototype,`shadowRoot`);const getAttributes=lookupGetter(ElementPrototype,`attributes`);const getNodeType=Node&&Node.prototype?lookupGetter(Node.prototype,`nodeType`):null;const getNodeName=Node&&Node.prototype?lookupGetter(Node.prototype,`nodeName`):null;const getOwnerDocument=Node&&Node.prototype?lookupGetter(Node.prototype,`ownerDocument`):null;const _readNodeType=function _readNodeType(node){return getNodeType?getNodeType(node):node.nodeType};const _readNodeName=function _readNodeName(node){return getNodeName?getNodeName(node):node.nodeName};if(typeof HTMLTemplateElement===`function`){const template=document.createElement(`template`);if(template.content&&template.content.ownerDocument)document=template.content.ownerDocument}let trustedTypesPolicy;let emptyHTML=``;let defaultTrustedTypesPolicy;let defaultTrustedTypesPolicyResolved=false;let IN_TRUSTED_TYPES_POLICY=0;const _assertNotInTrustedTypesPolicy=function _assertNotInTrustedTypesPolicy(){if(IN_TRUSTED_TYPES_POLICY>0)throw typeErrorCreate(`A configured TRUSTED_TYPES_POLICY callback (createHTML or createScriptURL) must not call DOMPurify.sanitize, as that causes infinite recursion. Do not pass a policy whose callbacks wrap DOMPurify as TRUSTED_TYPES_POLICY; see the "DOMPurify and Trusted Types" section of the README.`)};const _createTrustedHTML=function _createTrustedHTML(html){_assertNotInTrustedTypesPolicy();IN_TRUSTED_TYPES_POLICY++;try{return trustedTypesPolicy.createHTML(html)}finally{IN_TRUSTED_TYPES_POLICY--}};const _createTrustedScriptURL=function _createTrustedScriptURL(scriptUrl){_assertNotInTrustedTypesPolicy();IN_TRUSTED_TYPES_POLICY++;try{return trustedTypesPolicy.createScriptURL(scriptUrl)}finally{IN_TRUSTED_TYPES_POLICY--}};const _getDefaultTrustedTypesPolicy=function _getDefaultTrustedTypesPolicy(){if(!defaultTrustedTypesPolicyResolved){defaultTrustedTypesPolicy=_createTrustedTypesPolicy(trustedTypes,currentScript);defaultTrustedTypesPolicyResolved=true}return defaultTrustedTypesPolicy};const _document=document,implementation=_document.implementation,createNodeIterator=_document.createNodeIterator,createDocumentFragment=_document.createDocumentFragment,getElementsByTagName=_document.getElementsByTagName;const importNode=originalDocument.importNode;let hooks=_createHooksMap();DOMPurify.isSupported=typeof entries===`function`&&typeof getParentNode===`function`&&implementation&&implementation.createHTMLDocument!==void 0;const MUSTACHE_EXPR$1=MUSTACHE_EXPR,ERB_EXPR$1=ERB_EXPR,TMPLIT_EXPR$1=TMPLIT_EXPR,DATA_ATTR$1=DATA_ATTR,ARIA_ATTR$1=ARIA_ATTR,IS_SCRIPT_OR_DATA$1=IS_SCRIPT_OR_DATA,ATTR_WHITESPACE$1=ATTR_WHITESPACE,CUSTOM_ELEMENT$1=CUSTOM_ELEMENT;let IS_ALLOWED_URI$1=IS_ALLOWED_URI;let ALLOWED_TAGS=null;const DEFAULT_ALLOWED_TAGS=addToSet({},[...html$1,...svg$1,...svgFilters,...mathMl$1,...text$5]);let ALLOWED_ATTR=null;const DEFAULT_ALLOWED_ATTR=addToSet({},[...html,...svg,...mathMl,...xml]);let CUSTOM_ELEMENT_HANDLING=Object.seal(create(null,{tagNameCheck:{writable:true,configurable:false,enumerable:true,value:null},attributeNameCheck:{writable:true,configurable:false,enumerable:true,value:null},allowCustomizedBuiltInElements:{writable:true,configurable:false,enumerable:true,value:false}}));let FORBID_TAGS=null;let FORBID_ATTR=null;const EXTRA_ELEMENT_HANDLING=Object.seal(create(null,{tagCheck:{writable:true,configurable:false,enumerable:true,value:null},attributeCheck:{writable:true,configurable:false,enumerable:true,value:null}}));let ALLOW_ARIA_ATTR=true;let ALLOW_DATA_ATTR=true;let ALLOW_UNKNOWN_PROTOCOLS=false;let ALLOW_SELF_CLOSE_IN_ATTR=true;let SAFE_FOR_TEMPLATES=false;let SAFE_FOR_XML=true;let WHOLE_DOCUMENT=false;let SET_CONFIG=false;let SET_CONFIG_ALLOWED_TAGS=null;let SET_CONFIG_ALLOWED_ATTR=null;let FORCE_BODY=false;let RETURN_DOM=false;let RETURN_DOM_FRAGMENT=false;let RETURN_TRUSTED_TYPE=false;let SANITIZE_DOM=true;let SANITIZE_NAMED_PROPS=false;const SANITIZE_NAMED_PROPS_PREFIX=`user-content-`;let KEEP_CONTENT=true;let IN_PLACE=false;let USE_PROFILES={};let FORBID_CONTENTS=null;const DEFAULT_FORBID_CONTENTS=addToSet({},[`annotation-xml`,`audio`,`colgroup`,`desc`,`foreignobject`,`head`,`iframe`,`math`,`mi`,`mn`,`mo`,`ms`,`mtext`,`noembed`,`noframes`,`noscript`,`plaintext`,`script`,`selectedcontent`,`style`,`svg`,`template`,`thead`,`title`,`video`,`xmp`]);let DATA_URI_TAGS=null;const DEFAULT_DATA_URI_TAGS=addToSet({},[`audio`,`video`,`img`,`source`,`image`,`track`]);let URI_SAFE_ATTRIBUTES=null;const DEFAULT_URI_SAFE_ATTRIBUTES=addToSet({},[`alt`,`class`,`for`,`id`,`label`,`name`,`pattern`,`placeholder`,`role`,`summary`,`title`,`value`,`style`,`xmlns`]);const MATHML_NAMESPACE=`http://www.w3.org/1998/Math/MathML`;const SVG_NAMESPACE=`http://www.w3.org/2000/svg`;const HTML_NAMESPACE=`http://www.w3.org/1999/xhtml`;let NAMESPACE=HTML_NAMESPACE;let IS_EMPTY_INPUT=false;let ALLOWED_NAMESPACES=null;const DEFAULT_ALLOWED_NAMESPACES=addToSet({},[MATHML_NAMESPACE,SVG_NAMESPACE,HTML_NAMESPACE],stringToString);const DEFAULT_MATHML_TEXT_INTEGRATION_POINTS=freeze([`mi`,`mo`,`mn`,`ms`,`mtext`]);let MATHML_TEXT_INTEGRATION_POINTS=addToSet({},DEFAULT_MATHML_TEXT_INTEGRATION_POINTS);const DEFAULT_HTML_INTEGRATION_POINTS=freeze([`annotation-xml`]);let HTML_INTEGRATION_POINTS=addToSet({},DEFAULT_HTML_INTEGRATION_POINTS);const COMMON_SVG_AND_HTML_ELEMENTS=addToSet({},[`title`,`style`,`font`,`a`,`script`]);let PARSER_MEDIA_TYPE=null;const SUPPORTED_PARSER_MEDIA_TYPES=[`application/xhtml+xml`,`text/html`];const DEFAULT_PARSER_MEDIA_TYPE=`text/html`;let transformCaseFunc=null;let CONFIG=null;const formElement=document.createElement(`form`);const isRegexOrFunction=function isRegexOrFunction(testValue){return testValue instanceof RegExp||testValue instanceof Function};const _parseConfig=function _parseConfig(){let cfg=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(CONFIG&&CONFIG===cfg)return;if(!cfg||typeof cfg!==`object`)cfg={};cfg=clone(cfg);PARSER_MEDIA_TYPE=SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE)===-1?DEFAULT_PARSER_MEDIA_TYPE:cfg.PARSER_MEDIA_TYPE;transformCaseFunc=PARSER_MEDIA_TYPE===`application/xhtml+xml`?stringToString:stringToLowerCase;ALLOWED_TAGS=_resolveSetOption(cfg,`ALLOWED_TAGS`,DEFAULT_ALLOWED_TAGS,{transform:transformCaseFunc});ALLOWED_ATTR=_resolveSetOption(cfg,`ALLOWED_ATTR`,DEFAULT_ALLOWED_ATTR,{transform:transformCaseFunc});ALLOWED_NAMESPACES=_resolveSetOption(cfg,`ALLOWED_NAMESPACES`,DEFAULT_ALLOWED_NAMESPACES,{transform:stringToString});URI_SAFE_ATTRIBUTES=_resolveSetOption(cfg,`ADD_URI_SAFE_ATTR`,DEFAULT_URI_SAFE_ATTRIBUTES,{transform:transformCaseFunc,base:DEFAULT_URI_SAFE_ATTRIBUTES});DATA_URI_TAGS=_resolveSetOption(cfg,`ADD_DATA_URI_TAGS`,DEFAULT_DATA_URI_TAGS,{transform:transformCaseFunc,base:DEFAULT_DATA_URI_TAGS});FORBID_CONTENTS=_resolveSetOption(cfg,`FORBID_CONTENTS`,DEFAULT_FORBID_CONTENTS,{transform:transformCaseFunc});FORBID_TAGS=_resolveSetOption(cfg,`FORBID_TAGS`,clone({}),{transform:transformCaseFunc});FORBID_ATTR=_resolveSetOption(cfg,`FORBID_ATTR`,clone({}),{transform:transformCaseFunc});USE_PROFILES=objectHasOwnProperty(cfg,`USE_PROFILES`)?cfg.USE_PROFILES&&typeof cfg.USE_PROFILES===`object`?clone(cfg.USE_PROFILES):cfg.USE_PROFILES:false;ALLOW_ARIA_ATTR=cfg.ALLOW_ARIA_ATTR!==false;ALLOW_DATA_ATTR=cfg.ALLOW_DATA_ATTR!==false;ALLOW_UNKNOWN_PROTOCOLS=cfg.ALLOW_UNKNOWN_PROTOCOLS||false;ALLOW_SELF_CLOSE_IN_ATTR=cfg.ALLOW_SELF_CLOSE_IN_ATTR!==false;SAFE_FOR_TEMPLATES=cfg.SAFE_FOR_TEMPLATES||false;SAFE_FOR_XML=cfg.SAFE_FOR_XML!==false;WHOLE_DOCUMENT=cfg.WHOLE_DOCUMENT||false;RETURN_DOM=cfg.RETURN_DOM||false;RETURN_DOM_FRAGMENT=cfg.RETURN_DOM_FRAGMENT||false;RETURN_TRUSTED_TYPE=cfg.RETURN_TRUSTED_TYPE||false;FORCE_BODY=cfg.FORCE_BODY||false;SANITIZE_DOM=cfg.SANITIZE_DOM!==false;SANITIZE_NAMED_PROPS=cfg.SANITIZE_NAMED_PROPS||false;KEEP_CONTENT=cfg.KEEP_CONTENT!==false;IN_PLACE=cfg.IN_PLACE||false;IS_ALLOWED_URI$1=isRegex(cfg.ALLOWED_URI_REGEXP)?cfg.ALLOWED_URI_REGEXP:IS_ALLOWED_URI;NAMESPACE=typeof cfg.NAMESPACE===`string`?cfg.NAMESPACE:HTML_NAMESPACE;MATHML_TEXT_INTEGRATION_POINTS=_resolveObjectOption(cfg,`MATHML_TEXT_INTEGRATION_POINTS`,()=>addToSet({},DEFAULT_MATHML_TEXT_INTEGRATION_POINTS));HTML_INTEGRATION_POINTS=_resolveObjectOption(cfg,`HTML_INTEGRATION_POINTS`,()=>addToSet({},DEFAULT_HTML_INTEGRATION_POINTS));const customElementHandling=_resolveObjectOption(cfg,`CUSTOM_ELEMENT_HANDLING`,()=>create(null));CUSTOM_ELEMENT_HANDLING=create(null);if(objectHasOwnProperty(customElementHandling,`tagNameCheck`)&&isRegexOrFunction(customElementHandling.tagNameCheck))CUSTOM_ELEMENT_HANDLING.tagNameCheck=customElementHandling.tagNameCheck;if(objectHasOwnProperty(customElementHandling,`attributeNameCheck`)&&isRegexOrFunction(customElementHandling.attributeNameCheck))CUSTOM_ELEMENT_HANDLING.attributeNameCheck=customElementHandling.attributeNameCheck;if(objectHasOwnProperty(customElementHandling,`allowCustomizedBuiltInElements`)&&typeof customElementHandling.allowCustomizedBuiltInElements===`boolean`)CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=customElementHandling.allowCustomizedBuiltInElements;seal(CUSTOM_ELEMENT_HANDLING);if(SAFE_FOR_TEMPLATES)ALLOW_DATA_ATTR=false;if(RETURN_DOM_FRAGMENT)RETURN_DOM=true;if(USE_PROFILES){ALLOWED_TAGS=addToSet({},text$5);ALLOWED_ATTR=create(null);if(USE_PROFILES.html===true){addToSet(ALLOWED_TAGS,html$1);addToSet(ALLOWED_ATTR,html)}if(USE_PROFILES.svg===true){addToSet(ALLOWED_TAGS,svg$1);addToSet(ALLOWED_ATTR,svg);addToSet(ALLOWED_ATTR,xml)}if(USE_PROFILES.svgFilters===true){addToSet(ALLOWED_TAGS,svgFilters);addToSet(ALLOWED_ATTR,svg);addToSet(ALLOWED_ATTR,xml)}if(USE_PROFILES.mathMl===true){addToSet(ALLOWED_TAGS,mathMl$1);addToSet(ALLOWED_ATTR,mathMl);addToSet(ALLOWED_ATTR,xml)}}EXTRA_ELEMENT_HANDLING.tagCheck=null;EXTRA_ELEMENT_HANDLING.attributeCheck=null;if(objectHasOwnProperty(cfg,`ADD_TAGS`)){if(typeof cfg.ADD_TAGS===`function`)EXTRA_ELEMENT_HANDLING.tagCheck=cfg.ADD_TAGS;else if(arrayIsArray(cfg.ADD_TAGS)){if(ALLOWED_TAGS===DEFAULT_ALLOWED_TAGS)ALLOWED_TAGS=clone(ALLOWED_TAGS);addToSet(ALLOWED_TAGS,cfg.ADD_TAGS,transformCaseFunc)}}if(objectHasOwnProperty(cfg,`ADD_ATTR`)){if(typeof cfg.ADD_ATTR===`function`)EXTRA_ELEMENT_HANDLING.attributeCheck=cfg.ADD_ATTR;else if(arrayIsArray(cfg.ADD_ATTR)){if(ALLOWED_ATTR===DEFAULT_ALLOWED_ATTR)ALLOWED_ATTR=clone(ALLOWED_ATTR);addToSet(ALLOWED_ATTR,cfg.ADD_ATTR,transformCaseFunc)}}if(objectHasOwnProperty(cfg,`ADD_FORBID_CONTENTS`)&&arrayIsArray(cfg.ADD_FORBID_CONTENTS)){if(FORBID_CONTENTS===DEFAULT_FORBID_CONTENTS)FORBID_CONTENTS=clone(FORBID_CONTENTS);addToSet(FORBID_CONTENTS,cfg.ADD_FORBID_CONTENTS,transformCaseFunc)}if(KEEP_CONTENT)ALLOWED_TAGS[`#text`]=true;if(WHOLE_DOCUMENT)addToSet(ALLOWED_TAGS,[`html`,`head`,`body`]);if(ALLOWED_TAGS.table){addToSet(ALLOWED_TAGS,[`tbody`]);delete FORBID_TAGS.tbody}if(cfg.TRUSTED_TYPES_POLICY){if(typeof cfg.TRUSTED_TYPES_POLICY.createHTML!==`function`)throw typeErrorCreate(`TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.`);if(typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL!==`function`)throw typeErrorCreate(`TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.`);const previousTrustedTypesPolicy=trustedTypesPolicy;trustedTypesPolicy=cfg.TRUSTED_TYPES_POLICY;try{emptyHTML=_createTrustedHTML(``)}catch(error){trustedTypesPolicy=previousTrustedTypesPolicy;throw error}}else if(cfg.TRUSTED_TYPES_POLICY===null){trustedTypesPolicy=void 0;emptyHTML=``}else{if(trustedTypesPolicy===void 0)trustedTypesPolicy=_getDefaultTrustedTypesPolicy();if(trustedTypesPolicy&&typeof emptyHTML===`string`)emptyHTML=_createTrustedHTML(``)}if(freeze)freeze(cfg);CONFIG=cfg};const ALL_SVG_TAGS=addToSet({},[...svg$1,...svgFilters,...svgDisallowed]);const ALL_MATHML_TAGS=addToSet({},[...mathMl$1,...mathMlDisallowed]);const _checkSvgNamespace=function _checkSvgNamespace(tagName,parent,parentTagName){if(parent.namespaceURI===HTML_NAMESPACE)return tagName===`svg`;if(parent.namespaceURI===MATHML_NAMESPACE)return tagName===`svg`&&(parentTagName===`annotation-xml`||MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);return Boolean(ALL_SVG_TAGS[tagName])};const _checkMathMlNamespace=function _checkMathMlNamespace(tagName,parent,parentTagName){if(parent.namespaceURI===HTML_NAMESPACE)return tagName===`math`;if(parent.namespaceURI===SVG_NAMESPACE)return tagName===`math`&&HTML_INTEGRATION_POINTS[parentTagName];return Boolean(ALL_MATHML_TAGS[tagName])};const _checkHtmlNamespace=function _checkHtmlNamespace(tagName,parent,parentTagName){if(parent.namespaceURI===SVG_NAMESPACE&&!HTML_INTEGRATION_POINTS[parentTagName])return false;if(parent.namespaceURI===MATHML_NAMESPACE&&!MATHML_TEXT_INTEGRATION_POINTS[parentTagName])return false;return!ALL_MATHML_TAGS[tagName]&&(COMMON_SVG_AND_HTML_ELEMENTS[tagName]||!ALL_SVG_TAGS[tagName])};const _checkValidNamespace=function _checkValidNamespace(element){let parent=getParentNode(element);if(!parent||!parent.tagName)parent={namespaceURI:NAMESPACE,tagName:`template`};const tagName=stringToLowerCase(element.tagName);const parentTagName=stringToLowerCase(parent.tagName);if(!ALLOWED_NAMESPACES[element.namespaceURI])return false;if(element.namespaceURI===SVG_NAMESPACE)return _checkSvgNamespace(tagName,parent,parentTagName);if(element.namespaceURI===MATHML_NAMESPACE)return _checkMathMlNamespace(tagName,parent,parentTagName);if(element.namespaceURI===HTML_NAMESPACE)return _checkHtmlNamespace(tagName,parent,parentTagName);if(PARSER_MEDIA_TYPE===`application/xhtml+xml`&&ALLOWED_NAMESPACES[element.namespaceURI])return true;return false};const _forceRemove=function _forceRemove(node){arrayPush(DOMPurify.removed,{element:node});try{getParentNode(node).removeChild(node)}catch(_){remove(node);if(!getParentNode(node))throw typeErrorCreate(`a node selected for removal could not be detached from its tree and cannot be safely returned; refusing to sanitize in place`)}};const _stripAttributeNode=function _stripAttributeNode(element,attribute,name){try{removeAttributeNode(element,attribute)}catch(_){try{element.removeAttribute(name)}catch(_){}}};const _neutralizeRoot=function _neutralizeRoot(root){_neutralizeSubtree(root);const childNodes=getChildNodes(root);if(childNodes){const snapshot=[];arrayForEach(childNodes,child=>{arrayPush(snapshot,child)});arrayForEach(snapshot,child=>{try{remove(child)}catch(_){}})}const attributes=getAttributes(root);if(attributes)for(let i=attributes.length-1;i>=0;--i){const attribute=attributes[i];const name=attribute&&attribute.name;if(typeof name===`string`)_stripAttributeNode(root,attribute,name)}};const _removeAttribute=function _removeAttribute(name,element,attr){if(!attr)try{attr=element.getAttributeNode(name)}catch(_){attr=null}arrayPush(DOMPurify.removed,{attribute:attr||null,from:element});try{if(attr)removeAttributeNode(element,attr);else element.removeAttribute(name)}catch(_){try{element.removeAttribute(name)}catch(_){}}if(name===`is`){if(RETURN_DOM||RETURN_DOM_FRAGMENT)try{_forceRemove(element)}catch(_){}else try{element.setAttribute(name,``)}catch(_){}}};const _stripDisallowedAttributes=function _stripDisallowedAttributes(element){const attributes=getAttributes(element);if(!attributes)return;for(let i=attributes.length-1;i>=0;--i){const attribute=attributes[i];const name=attribute&&attribute.name;if(typeof name!==`string`||ALLOWED_ATTR[transformCaseFunc(name)])continue;_stripAttributeNode(element,attribute,name)}};const _neutralizeSubtree=function _neutralizeSubtree(root){const stack=[root];while(stack.length>0){const node=stack.pop();if(_readNodeType(node)===NODE_TYPE.element)_stripDisallowedAttributes(node);const childNodes=getChildNodes(node);if(childNodes)for(let i=childNodes.length-1;i>=0;--i)stack.push(childNodes[i])}};const _isPatchLinkageAttribute=function _isPatchLinkageAttribute(lcName,lcTag){if(!SAFE_FOR_XML)return false;if(lcName===`patchsrc`)return true;return lcName===`for`&&lcTag!==`label`&&lcTag!==`output`};const _neutralizePatchLinkage=function _neutralizePatchLinkage(root){if(!SAFE_FOR_XML)return;const stack=[root];while(stack.length>0){const node=stack.pop();const nodeType=_readNodeType(node);if(nodeType===NODE_TYPE.processingInstruction||nodeType===NODE_TYPE.comment&®ExpTest(COMMENT_MARKUP_PROBE,node.data)){try{remove(node)}catch(_){}continue}if(nodeType===NODE_TYPE.element){const element=node;const lcTag=transformCaseFunc(_readNodeName(node));try{if(element.hasAttribute&&element.hasAttribute(`patchsrc`))element.removeAttribute(`patchsrc`);if(element.hasAttribute&&element.hasAttribute(`for`)&&_isPatchLinkageAttribute(`for`,lcTag))element.removeAttribute(`for`)}catch(_){}}const childNodes=getChildNodes(node);if(childNodes)for(let i=childNodes.length-1;i>=0;--i)stack.push(childNodes[i])}};const _initDocument=function _initDocument(dirty){let doc=null;let leadingWhitespace=null;if(FORCE_BODY)dirty=`<remove></remove>`+dirty;else{const matches=stringMatch(dirty,/^[\r\n\t ]+/);leadingWhitespace=matches&&matches[0]}if(PARSER_MEDIA_TYPE===`application/xhtml+xml`&&NAMESPACE===HTML_NAMESPACE)dirty=`<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>`+dirty+`</body></html>`;const dirtyPayload=trustedTypesPolicy?_createTrustedHTML(dirty):dirty;if(NAMESPACE===HTML_NAMESPACE)try{doc=new DOMParser().parseFromString(dirtyPayload,PARSER_MEDIA_TYPE)}catch(_){}if(!doc||!doc.documentElement){doc=implementation.createDocument(NAMESPACE,`template`,null);try{doc.documentElement.innerHTML=IS_EMPTY_INPUT?emptyHTML:dirtyPayload}catch(_){}}const body=doc.body||doc.documentElement;if(dirty&&leadingWhitespace)body.insertBefore(document.createTextNode(leadingWhitespace),body.childNodes[0]||null);if(NAMESPACE===HTML_NAMESPACE)return getElementsByTagName.call(doc,WHOLE_DOCUMENT?`html`:`body`)[0];return WHOLE_DOCUMENT?doc.documentElement:body};const _createNodeIterator=function _createNodeIterator(root){const doc=getOwnerDocument?getOwnerDocument(root):root.ownerDocument;return createNodeIterator.call(doc||root,root,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_COMMENT|NodeFilter.SHOW_TEXT|NodeFilter.SHOW_PROCESSING_INSTRUCTION|NodeFilter.SHOW_CDATA_SECTION,null)};const _stripTemplateExpressions=function _stripTemplateExpressions(value){value=stringReplace(value,MUSTACHE_EXPR$1,` `);value=stringReplace(value,ERB_EXPR$1,` `);value=stringReplace(value,TMPLIT_EXPR$1,` `);return value};const _scrubTemplateExpressions2=function _scrubTemplateExpressions(node){var _node$querySelectorAl;node.normalize();const doc=getOwnerDocument?getOwnerDocument(node):node.ownerDocument;const walker=createNodeIterator.call(doc||node,node,NodeFilter.SHOW_TEXT|NodeFilter.SHOW_COMMENT|NodeFilter.SHOW_CDATA_SECTION|NodeFilter.SHOW_PROCESSING_INSTRUCTION,null);let currentNode=walker.nextNode();while(currentNode){currentNode.data=_stripTemplateExpressions(currentNode.data);currentNode=walker.nextNode()}const templates=(_node$querySelectorAl=node.querySelectorAll)===null||_node$querySelectorAl===void 0?void 0:_node$querySelectorAl.call(node,`template`);if(templates)arrayForEach(templates,tmpl=>{if(_isDocumentFragment(tmpl.content))_scrubTemplateExpressions2(tmpl.content)})};const _isClobbered=function _isClobbered(element){const realTagName=getNodeName?getNodeName(element):null;if(typeof realTagName!==`string`)return false;if(transformCaseFunc(realTagName)!==`form`)return false;return typeof element.nodeName!==`string`||typeof element.textContent!==`string`||typeof element.removeChild!==`function`||element.attributes!==getAttributes(element)||typeof element.removeAttribute!==`function`||typeof element.removeAttributeNode!==`function`||typeof element.getAttributeNode!==`function`||typeof element.setAttribute!==`function`||typeof element.namespaceURI!==`string`||typeof element.insertBefore!==`function`||typeof element.hasChildNodes!==`function`||element.nodeType!==getNodeType(element)||element.childNodes!==getChildNodes(element)};const _isDocumentFragment=function _isDocumentFragment(value){if(!getNodeType||typeof value!==`object`||value===null)return false;try{return getNodeType(value)===NODE_TYPE.documentFragment}catch(_){return false}};const _isNode=function _isNode(value){if(!getNodeType||typeof value!==`object`||value===null)return false;try{return typeof getNodeType(value)===`number`}catch(_){return false}};function _executeHooks(hooks,currentNode,data){if(hooks.length===0)return;arrayForEach(hooks,hook=>{hook.call(DOMPurify,currentNode,data,CONFIG)})}const _isUnsafeNode=function _isUnsafeNode(currentNode,tagName){if(SAFE_FOR_XML&¤tNode.hasChildNodes()&&!_isNode(currentNode.firstElementChild)&®ExpTest(ELEMENT_MARKUP_PROBE,currentNode.textContent)&®ExpTest(ELEMENT_MARKUP_PROBE,currentNode.innerHTML))return true;if(SAFE_FOR_XML&¤tNode.namespaceURI===HTML_NAMESPACE&&LITERAL_TEXT_ELEMENTS[tagName]&&(_isNode(currentNode.firstElementChild)||typeof currentNode.textContent===`string`&®ExpTest(LITERAL_TEXT_CLOSE[tagName],currentNode.textContent)))return true;if(currentNode.nodeType===NODE_TYPE.processingInstruction)return true;if(SAFE_FOR_XML&¤tNode.nodeType===NODE_TYPE.comment&®ExpTest(COMMENT_MARKUP_PROBE,currentNode.data))return true;return false};const _matchesNameCheck=function _matchesNameCheck(check,name){if(check instanceof RegExp)return regExpTest(check,name);if(check instanceof Function){for(var _len=arguments.length,args=new Array(_len>2?_len-2:0),_key=2;_key<_len;_key++)args[_key-2]=arguments[_key];return Boolean(check(name,...args))}return false};const _sanitizeDisallowedNode=function _sanitizeDisallowedNode(currentNode,tagName,root){if(!FORBID_TAGS[tagName]&&_isBasicCustomElement(tagName)&&_matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck,tagName))return false;if(KEEP_CONTENT&&!FORBID_CONTENTS[tagName]){const parentNode=getParentNode(currentNode);const childNodes=getChildNodes(currentNode);if(childNodes&&parentNode){const childCount=childNodes.length;for(let i=childCount-1;i>=0;--i){const hoisted=currentNode===root?cloneNode(childNodes[i],true):childNodes[i];parentNode.insertBefore(hoisted,getNextSibling(currentNode))}}}_forceRemove(currentNode);return true};const _forkSharedAllowlist=function _forkSharedAllowlist(hookList,set,defaultSet,setConfigSet){if(hookList.length===0)return set;return set===defaultSet||set===setConfigSet?clone(set):set};const _handleHookDetachedNode=function _handleHookDetachedNode(currentNode,root){if(currentNode===root||getParentNode(currentNode)!==null)return false;if(IN_PLACE)_neutralizeSubtree(currentNode);return true};const _sanitizeElements=function _sanitizeElements(currentNode,root){_executeHooks(hooks.beforeSanitizeElements,currentNode,null);if(_handleHookDetachedNode(currentNode,root))return true;if(_isClobbered(currentNode)){_forceRemove(currentNode);return true}const tagName=transformCaseFunc(_readNodeName(currentNode));ALLOWED_TAGS=_forkSharedAllowlist(hooks.uponSanitizeElement,ALLOWED_TAGS,DEFAULT_ALLOWED_TAGS,SET_CONFIG_ALLOWED_TAGS);_executeHooks(hooks.uponSanitizeElement,currentNode,{tagName,allowedTags:ALLOWED_TAGS});if(_handleHookDetachedNode(currentNode,root))return true;if(_isUnsafeNode(currentNode,tagName)){_forceRemove(currentNode);return true}if(FORBID_TAGS[tagName]||!(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function&&EXTRA_ELEMENT_HANDLING.tagCheck(tagName))&&!ALLOWED_TAGS[tagName]){const removed=_sanitizeDisallowedNode(currentNode,tagName,root);if(removed===false){_executeHooks(hooks.afterSanitizeElements,currentNode,null);if(_handleHookDetachedNode(currentNode,root))return true}return removed}if(_readNodeType(currentNode)===NODE_TYPE.element&&!_checkValidNamespace(currentNode)){_forceRemove(currentNode);return true}if((tagName===`noscript`||tagName===`noembed`||tagName===`noframes`)&®ExpTest(FALLBACK_TAG_CLOSE,currentNode.innerHTML)){_forceRemove(currentNode);return true}if(SAFE_FOR_TEMPLATES&¤tNode.nodeType===NODE_TYPE.text){const content=_stripTemplateExpressions(currentNode.textContent);if(currentNode.textContent!==content){arrayPush(DOMPurify.removed,{element:currentNode.cloneNode()});currentNode.textContent=content}}_executeHooks(hooks.afterSanitizeElements,currentNode,null);return _handleHookDetachedNode(currentNode,root)};const _isValidAttribute=function _isValidAttribute(lcTag,lcName,value){if(FORBID_ATTR[lcName])return false;if(_isPatchLinkageAttribute(lcName,lcTag))return false;if(SANITIZE_DOM&&(lcName===`id`||lcName===`name`)&&(value in document||value in formElement))return false;const nameIsPermitted=ALLOWED_ATTR[lcName]||EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function&&EXTRA_ELEMENT_HANDLING.attributeCheck(lcName,lcTag);if(ALLOW_DATA_ATTR&®ExpTest(DATA_ATTR$1,lcName))return true;if(ALLOW_ARIA_ATTR&®ExpTest(ARIA_ATTR$1,lcName))return true;if(!nameIsPermitted)return _isBasicCustomElement(lcTag)&&_matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck,lcTag)&&_matchesNameCheck(CUSTOM_ELEMENT_HANDLING.attributeNameCheck,lcName,lcTag)||lcName===`is`&&CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&_matchesNameCheck(CUSTOM_ELEMENT_HANDLING.tagNameCheck,value);if(URI_SAFE_ATTRIBUTES[lcName])return true;if(regExpTest(IS_ALLOWED_URI$1,stringReplace(value,ATTR_WHITESPACE$1,``)))return true;if((lcName===`src`||lcName===`xlink:href`||lcName===`href`)&&lcTag!==`script`&&stringIndexOf(value,`data:`)===0&&DATA_URI_TAGS[lcTag])return true;if(ALLOW_UNKNOWN_PROTOCOLS&&!regExpTest(IS_SCRIPT_OR_DATA$1,stringReplace(value,ATTR_WHITESPACE$1,``)))return true;return!value};const RESERVED_CUSTOM_ELEMENT_NAMES=addToSet({},[`annotation-xml`,`color-profile`,`font-face`,`font-face-format`,`font-face-name`,`font-face-src`,`font-face-uri`,`missing-glyph`]);const _isBasicCustomElement=function _isBasicCustomElement(tagName){return!RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)]&®ExpTest(CUSTOM_ELEMENT$1,tagName)};const _applyTrustedTypesToAttribute=function _applyTrustedTypesToAttribute(lcTag,lcName,namespaceURI,value){if(trustedTypesPolicy&&typeof trustedTypes===`object`&&typeof trustedTypes.getAttributeType===`function`&&!namespaceURI)switch(trustedTypes.getAttributeType(lcTag,lcName)){case`TrustedHTML`:return _createTrustedHTML(value);case`TrustedScriptURL`:return _createTrustedScriptURL(value)}return value};const _setAttributeValue=function _setAttributeValue(currentNode,name,namespaceURI,value){try{if(namespaceURI)currentNode.setAttributeNS(namespaceURI,name,value);else currentNode.setAttribute(name,value);if(_isClobbered(currentNode)){_forceRemove(currentNode);return false}return true}catch(_){_removeAttribute(name,currentNode);return false}};const _sanitizeAttributes=function _sanitizeAttributes(currentNode,root){_executeHooks(hooks.beforeSanitizeAttributes,currentNode,null);if(_handleHookDetachedNode(currentNode,root))return;const attributes=currentNode.attributes;if(!attributes||_isClobbered(currentNode))return;ALLOWED_ATTR=_forkSharedAllowlist(hooks.uponSanitizeAttribute,ALLOWED_ATTR,DEFAULT_ALLOWED_ATTR,SET_CONFIG_ALLOWED_ATTR);const hookEvent={attrName:``,attrValue:``,keepAttr:true,allowedAttributes:ALLOWED_ATTR,forceKeepAttr:void 0};let l=attributes.length;const lcTag=transformCaseFunc(currentNode.nodeName);while(l--){const attr=attributes[l];const name=attr.name,namespaceURI=attr.namespaceURI,attrValue=attr.value;const lcName=transformCaseFunc(name);const initValue=attrValue;let value=name===`value`?initValue:stringTrim(initValue);let recreatedNamedProp=false;hookEvent.attrName=lcName;hookEvent.attrValue=value;hookEvent.keepAttr=true;hookEvent.forceKeepAttr=void 0;_executeHooks(hooks.uponSanitizeAttribute,currentNode,hookEvent);value=hookEvent.attrValue;if(SANITIZE_NAMED_PROPS&&(lcName===`id`||lcName===`name`)&&stringIndexOf(value,SANITIZE_NAMED_PROPS_PREFIX)!==0){_removeAttribute(name,currentNode,attr);value=SANITIZE_NAMED_PROPS_PREFIX+value;recreatedNamedProp=true}if(SAFE_FOR_XML&®ExpTest(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,value)){_removeAttribute(name,currentNode,attr);continue}if(lcName===`attributename`&&stringMatch(value,`href`)){_removeAttribute(name,currentNode,attr);continue}if(hookEvent.forceKeepAttr)continue;if(!hookEvent.keepAttr){_removeAttribute(name,currentNode,attr);continue}if(!ALLOW_SELF_CLOSE_IN_ATTR&®ExpTest(SELF_CLOSING_TAG,value)){_removeAttribute(name,currentNode,attr);continue}if(SAFE_FOR_TEMPLATES)value=_stripTemplateExpressions(value);if(!_isValidAttribute(lcTag,lcName,value)){_removeAttribute(name,currentNode,attr);continue}value=_applyTrustedTypesToAttribute(lcTag,lcName,namespaceURI,value);if(value!==initValue){if(_setAttributeValue(currentNode,name,namespaceURI,value)&&recreatedNamedProp)arrayPop(DOMPurify.removed)}}_executeHooks(hooks.afterSanitizeAttributes,currentNode,null);_handleHookDetachedNode(currentNode,root)};const _sanitizeShadowDOM2=function _sanitizeShadowDOM(fragment){let shadowNode=null;const shadowIterator=_createNodeIterator(fragment);_executeHooks(hooks.beforeSanitizeShadowDOM,fragment,null);while(shadowNode=shadowIterator.nextNode()){_executeHooks(hooks.uponSanitizeShadowNode,shadowNode,null);_sanitizeElements(shadowNode,fragment);_sanitizeAttributes(shadowNode,fragment);if(_isDocumentFragment(shadowNode.content))_sanitizeShadowDOM2(shadowNode.content);if(_readNodeType(shadowNode)===NODE_TYPE.element){const innerSr=getShadowRoot(shadowNode);if(_isDocumentFragment(innerSr)){_sanitizeAttachedShadowRoots(innerSr);_sanitizeShadowDOM2(innerSr)}}}_executeHooks(hooks.afterSanitizeShadowDOM,fragment,null)};const _sanitizeAttachedShadowRoots=function _sanitizeAttachedShadowRoots(root){const stack=[{node:root,shadow:null}];while(stack.length>0){const item=stack.pop();if(item.shadow){_sanitizeShadowDOM2(item.shadow);continue}const node=item.node;const isElement=_readNodeType(node)===NODE_TYPE.element;const childNodes=getChildNodes(node);if(childNodes)for(let i=childNodes.length-1;i>=0;--i)stack.push({node:childNodes[i],shadow:null});if(isElement){const rootName=getNodeName?getNodeName(node):null;if(typeof rootName===`string`&&transformCaseFunc(rootName)===`template`){const content=node.content;if(_isDocumentFragment(content))stack.push({node:content,shadow:null})}}if(isElement){const sr=getShadowRoot(node);if(_isDocumentFragment(sr))stack.push({node:null,shadow:sr},{node:sr,shadow:null})}}};DOMPurify.sanitize=function(dirty){let cfg=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};let body=null;let importedNode=null;let currentNode=null;let returnNode=null;IS_EMPTY_INPUT=!dirty;if(IS_EMPTY_INPUT)dirty=`<!-->`;if(typeof dirty!==`string`&&!_isNode(dirty)){dirty=stringifyValue(dirty);if(typeof dirty!==`string`)throw typeErrorCreate(`dirty is not a string, aborting`)}if(!DOMPurify.isSupported)return dirty;if(SET_CONFIG){ALLOWED_TAGS=SET_CONFIG_ALLOWED_TAGS;ALLOWED_ATTR=SET_CONFIG_ALLOWED_ATTR}else _parseConfig(cfg);if(hooks.uponSanitizeElement.length>0||hooks.uponSanitizeAttribute.length>0)ALLOWED_TAGS=clone(ALLOWED_TAGS);if(hooks.uponSanitizeAttribute.length>0)ALLOWED_ATTR=clone(ALLOWED_ATTR);DOMPurify.removed=[];const inPlace=IN_PLACE&&typeof dirty!==`string`&&_isNode(dirty);if(inPlace){_neutralizePatchLinkage(dirty);const nn=_readNodeName(dirty);if(typeof nn===`string`){const tagName=transformCaseFunc(nn);if(!ALLOWED_TAGS[tagName]||FORBID_TAGS[tagName]){_neutralizeRoot(dirty);throw typeErrorCreate(`root node is forbidden and cannot be sanitized in-place`)}}if(_isClobbered(dirty)){_neutralizeRoot(dirty);throw typeErrorCreate(`root node is clobbered and cannot be sanitized in-place`)}try{_sanitizeAttachedShadowRoots(dirty)}catch(error){_neutralizeRoot(dirty);throw error}}else if(_isNode(dirty)){body=_initDocument(`<!---->`);importedNode=body.ownerDocument.importNode(dirty,true);if(importedNode.nodeType===NODE_TYPE.element&&importedNode.nodeName===`BODY`)body=importedNode;else if(importedNode.nodeName===`HTML`)body=importedNode;else body.appendChild(importedNode);_sanitizeAttachedShadowRoots(body)}else{if(!RETURN_DOM&&!SAFE_FOR_TEMPLATES&&!WHOLE_DOCUMENT&&dirty.indexOf(`<`)===-1)return trustedTypesPolicy&&RETURN_TRUSTED_TYPE?_createTrustedHTML(dirty):dirty;body=_initDocument(dirty);if(!body)return RETURN_DOM?null:RETURN_TRUSTED_TYPE?emptyHTML:``}if(body&&FORCE_BODY)_forceRemove(body.firstChild);const walkRoot=inPlace?dirty:body;try{const nodeIterator=_createNodeIterator(walkRoot);while(currentNode=nodeIterator.nextNode()){_sanitizeElements(currentNode,walkRoot);_sanitizeAttributes(currentNode,walkRoot);if(_isDocumentFragment(currentNode.content))_sanitizeShadowDOM2(currentNode.content)}}catch(error){if(inPlace){_neutralizeRoot(dirty);arrayForEach(DOMPurify.removed,entry=>{if(entry.element)_neutralizeSubtree(entry.element)})}throw error}if(inPlace){let rootWasRemoved=false;arrayForEach(DOMPurify.removed,entry=>{if(entry.element){if(entry.element===dirty)rootWasRemoved=true;_neutralizeSubtree(entry.element)}});if(rootWasRemoved)throw typeErrorCreate(`a node selected for removal could not be safely returned; refusing to sanitize in place`);if(SAFE_FOR_TEMPLATES)_scrubTemplateExpressions2(dirty);return dirty}if(RETURN_DOM){if(SAFE_FOR_TEMPLATES)_scrubTemplateExpressions2(body);if(RETURN_DOM_FRAGMENT){returnNode=createDocumentFragment.call(body.ownerDocument);while(body.firstChild)returnNode.appendChild(body.firstChild)}else returnNode=body;if(ALLOWED_ATTR.shadowroot||ALLOWED_ATTR.shadowrootmode)returnNode=importNode.call(originalDocument,returnNode,true);return returnNode}let serializedHTML=WHOLE_DOCUMENT?body.outerHTML:body.innerHTML;if(WHOLE_DOCUMENT&&ALLOWED_TAGS[`!doctype`]&&body.ownerDocument&&body.ownerDocument.doctype&&body.ownerDocument.doctype.name&®ExpTest(DOCTYPE_NAME,body.ownerDocument.doctype.name))serializedHTML=`<!DOCTYPE `+body.ownerDocument.doctype.name+`>
|
|
136
|
+
`+serializedHTML;if(SAFE_FOR_TEMPLATES)serializedHTML=_stripTemplateExpressions(serializedHTML);return trustedTypesPolicy&&RETURN_TRUSTED_TYPE?_createTrustedHTML(serializedHTML):serializedHTML};DOMPurify.setConfig=function(){let cfg=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};_parseConfig(cfg);SET_CONFIG=true;SET_CONFIG_ALLOWED_TAGS=ALLOWED_TAGS;SET_CONFIG_ALLOWED_ATTR=ALLOWED_ATTR};DOMPurify.clearConfig=function(){CONFIG=null;SET_CONFIG=false;SET_CONFIG_ALLOWED_TAGS=null;SET_CONFIG_ALLOWED_ATTR=null;trustedTypesPolicy=defaultTrustedTypesPolicy;emptyHTML=``};DOMPurify.isValidAttribute=function(tag,attr,value){if(!CONFIG)_parseConfig({});const lcTag=transformCaseFunc(tag);const lcName=transformCaseFunc(attr);return _isValidAttribute(lcTag,lcName,value)};DOMPurify.addHook=function(entryPoint,hookFunction){if(typeof hookFunction!==`function`)return;if(!objectHasOwnProperty(hooks,entryPoint))return;arrayPush(hooks[entryPoint],hookFunction)};DOMPurify.removeHook=function(entryPoint,hookFunction){if(!objectHasOwnProperty(hooks,entryPoint))return;if(hookFunction!==void 0){const index=arrayLastIndexOf(hooks[entryPoint],hookFunction);return index===-1?void 0:arraySplice(hooks[entryPoint],index,1)[0]}return arrayPop(hooks[entryPoint])};DOMPurify.removeHooks=function(entryPoint){if(!objectHasOwnProperty(hooks,entryPoint))return;hooks[entryPoint]=[]};DOMPurify.removeAllHooks=function(){hooks=_createHooksMap()};return DOMPurify}var purify_default=createDOMPurify();var _hoisted_1$15=[`innerHTML`];var _sfc_main$30={__name:`GithubMarkdown`,props:{html:{type:String,default:``},text:{type:String,default:``}},setup(__props){const props=__props;const sanitizedHtml=computed(()=>purify_default.sanitize(props.html,{ALLOWED_TAGS:[`a`,`b`,`blockquote`,`br`,`code`,`del`,`details`,`div`,`em`,`h1`,`h2`,`h3`,`h4`,`h5`,`h6`,`hr`,`img`,`li`,`ol`,`p`,`pre`,`s`,`span`,`strong`,`sub`,`summary`,`sup`,`table`,`tbody`,`td`,`th`,`thead`,`tr`,`ul`],ALLOWED_ATTR:[`href`,`src`,`alt`,`title`,`width`,`height`,`colspan`,`rowspan`,`start`],ALLOW_DATA_ATTR:false,ALLOW_ARIA_ATTR:false}));const blocks=computed(()=>parseLongTextReviewBlocks(props.text));return(_ctx,_cache)=>{return __props.html?(openBlock(),createElementBlock(`div`,{key:0,class:`github-markdown`,innerHTML:sanitizedHtml.value},null,8,_hoisted_1$15)):(openBlock(),createBlock(unref(LongTextPreviewBlocks_default),{key:1,blocks:blocks.value},null,8,[`blocks`]))}}};var GithubMarkdown_default=_plugin_vue_export_helper_default(_sfc_main$30,[[`__scopeId`,`data-v-3636cce2`]]);var _sfc_main$29={__name:`Vibe64LearningMarkdown`,props:{text:{type:String,default:``}},setup(__props){const props=__props;const renderer=new F({async:false,gfm:true,walkTokens(token){if(token.type!==`image`)return;token.type=`text`;token.raw=token.text=token.text||``;delete token.tokens}});const html=computed(()=>props.text?renderer.parse(props.text):``);return(_ctx,_cache)=>{return openBlock(),createBlock(GithubMarkdown_default,{class:`vibe64-learning-markdown`,html:html.value,onClick:unref(openLessonLink)},null,8,[`html`,`onClick`])}}};var Vibe64LearningMarkdown_default=_plugin_vue_export_helper_default(_sfc_main$29,[[`__scopeId`,`data-v-47420e75`]]);var _hoisted_1$14=[`aria-busy`];var _hoisted_2$11={class:`vibe64-teacher-notes__actions`};var _hoisted_3$10={key:1,class:`vibe64-teacher-notes__empty`,"data-test":`teacher-notes-empty`};var _hoisted_4$6={key:2,class:`vibe64-teacher-notes__updated`};var _hoisted_5$6={class:`vibe64-teacher-notes__actions`};var _sfc_main$28={__name:`Vibe64LearningTeacherNotes`,props:{learning:{type:Object,required:true}},setup(__props){const props=__props;const notes=computed(()=>props.learning.notes.value);const status=computed(()=>props.learning.notesState);const editing=ref(false);const confirmingClear=ref(false);const draft=ref(``);const updated=computed(()=>{const value=notes.value;if(!value?.updatedAt)return``;const when=new Date(value.updatedAt);const date=Number.isNaN(when.getTime())?``:when.toLocaleString();return`${value.updatedBy===`colleague`?`Updated by Colleague`:`Updated by you`}${date?`, ${date}`:``}`});onMounted(()=>{if(!props.learning.notes.value)props.learning.readNotes()});function edit(){draft.value=notes.value?.text||``;confirmingClear.value=false;editing.value=true}async function save(){if(await props.learning.saveNotes(draft.value))editing.value=false}async function clear(){if(await props.learning.clearNotes()){confirmingClear.value=false;editing.value=false}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,{class:`vibe64-teacher-notes`,"aria-labelledby":`vibe64-teacher-notes-title`,"aria-busy":status.value.loading||status.value.saving,"data-test":`teacher-notes`},[_cache[9]||(_cache[9]=createBaseVNode(`h2`,{id:`vibe64-teacher-notes-title`,class:`vibe64-teacher-notes__title`},`What my teacher knows about me`,-1)),_cache[10]||(_cache[10]=createBaseVNode(`p`,{class:`vibe64-teacher-notes__intro`},` Colleague keeps a short private summary of how you learn, so it can teach you better. Only you can see it, and it never changes your lesson results. `,-1)),status.value.error?(openBlock(),createBlock(VAlert,{key:0,type:`error`,variant:`tonal`,density:`compact`,class:`vibe64-teacher-notes__error`,"data-test":`teacher-notes-error`},{default:withCtx(()=>[createTextVNode(toDisplayString(status.value.error),1)]),_:1})):createCommentVNode(``,true),editing.value?(openBlock(),createElementBlock(Fragment,{key:1},[createVNode(VTextarea,{modelValue:draft.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>draft.value=$event),label:`Your notes (Markdown)`,variant:`outlined`,rows:`8`,"auto-grow":``,counter:unref(VIBE64_LEARNING_NOTES_MAX),maxlength:unref(VIBE64_LEARNING_NOTES_MAX),disabled:status.value.saving,"data-test":`teacher-notes-draft`},null,8,[`modelValue`,`counter`,`maxlength`,`disabled`]),createBaseVNode(`div`,_hoisted_2$11,[createVNode(VBtn,{color:`primary`,variant:`flat`,rounded:`pill`,"min-height":`48`,loading:status.value.saving,disabled:status.value.saving||!draft.value.trim(),"data-test":`teacher-notes-save`,onClick:save},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(`Save`,-1)])]),_:1},8,[`loading`,`disabled`]),createVNode(VBtn,{variant:`text`,rounded:`pill`,"min-height":`48`,disabled:status.value.saving,"data-test":`teacher-notes-cancel`,onClick:_cache[1]||(_cache[1]=$event=>editing.value=false)},{default:withCtx(()=>[..._cache[5]||(_cache[5]=[createTextVNode(`Cancel`,-1)])]),_:1},8,[`disabled`])])],64)):(openBlock(),createElementBlock(Fragment,{key:2},[notes.value?.text?(openBlock(),createBlock(Vibe64LearningMarkdown_default,{key:0,class:`vibe64-teacher-notes__text`,text:notes.value.text},null,8,[`text`])):!status.value.loading?(openBlock(),createElementBlock(`p`,_hoisted_3$10,` Nothing yet. Colleague adds notes as it teaches you. `)):createCommentVNode(``,true),notes.value?.text&&updated.value?(openBlock(),createElementBlock(`p`,_hoisted_4$6,toDisplayString(updated.value),1)):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_5$6,[createVNode(VBtn,{variant:`tonal`,rounded:`pill`,"min-height":`48`,disabled:status.value.loading||status.value.saving,"data-test":`teacher-notes-edit`,onClick:edit},{default:withCtx(()=>[createTextVNode(toDisplayString(notes.value?.text?`Edit`:`Write notes`),1)]),_:1},8,[`disabled`]),notes.value?.text?(openBlock(),createElementBlock(Fragment,{key:0},[!confirmingClear.value?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,rounded:`pill`,"min-height":`48`,disabled:status.value.saving,"data-test":`teacher-notes-clear`,onClick:_cache[2]||(_cache[2]=$event=>confirmingClear.value=true)},{default:withCtx(()=>[..._cache[6]||(_cache[6]=[createTextVNode(`Clear`,-1)])]),_:1},8,[`disabled`])):(openBlock(),createElementBlock(Fragment,{key:1},[createVNode(VBtn,{color:`error`,variant:`flat`,rounded:`pill`,"min-height":`48`,loading:status.value.saving,disabled:status.value.saving,"data-test":`teacher-notes-clear-confirm`,onClick:clear},{default:withCtx(()=>[..._cache[7]||(_cache[7]=[createTextVNode(`Clear all notes`,-1)])]),_:1},8,[`loading`,`disabled`]),createVNode(VBtn,{variant:`text`,rounded:`pill`,"min-height":`48`,disabled:status.value.saving,"data-test":`teacher-notes-clear-cancel`,onClick:_cache[3]||(_cache[3]=$event=>confirmingClear.value=false)},{default:withCtx(()=>[..._cache[8]||(_cache[8]=[createTextVNode(`Keep them`,-1)])]),_:1},8,[`disabled`])],64))],64)):createCommentVNode(``,true)])],64))],8,_hoisted_1$14)}}};var Vibe64LearningTeacherNotes_default=_plugin_vue_export_helper_default(_sfc_main$28,[[`__scopeId`,`data-v-6857364d`]]);var _hoisted_1$13={class:`vibe64-learning__bar`};var _hoisted_2$10={class:`vibe64-learning__tabs`,"aria-label":`Courses`};var _hoisted_3$9=[`aria-current`,`data-test`,`onClick`];var _hoisted_4$5={class:`vibe64-learning__content`};var _hoisted_5$5={key:0,class:`vibe64-learning__scroll`};var _hoisted_6$3={key:1,class:`vibe64-learning__scroll`};var LEARN_MODE_CLASS=`vibe64-learn-mode`;var _sfc_main$27={__name:`Vibe64LearningOverlay`,setup(__props){const learning=useVibe64Learning();const viewer=inject$1(VIBE64_ASSISTANT_VIEWER_KEY,null);const actorKey=computed(()=>String(toValue(viewer)?.actorKey||``));watch(actorKey,value=>learning?.setViewer(value),{immediate:true});onBeforeUnmount(()=>learning?.setViewer(``));watch(()=>Boolean(learning?.learnMode),value=>globalThis.document?.body?.classList.toggle(LEARN_MODE_CLASS,value),{immediate:true});onBeforeUnmount(()=>globalThis.document?.body?.classList.remove(LEARN_MODE_CLASS));const route=useRoute();const router=useRouter$1();watch(()=>[learning?.mode,route?.fullPath,learning?.state.modeBusy],(_value,previous)=>{if(!route||!router||!learning||learning.state.modeBusy)return;const target=modeRedirect({mode:learning.mode,slug:projectSlugFromRoute(route),path:route.path});if(!target||target.path===route.path)return;const modeChanged=Boolean(previous?.[0])&&previous[0]!==learning.mode;if(target.note&&!modeChanged)learning.showNotice(target.note);router.replace(learning.state.finished&&learning.mode?.on?withLesson(target.path):target.path)},{immediate:true});watch(()=>learning?.mode?.on,(_on,wasOn)=>{if(typeof wasOn===`boolean`)learning.clearNotice()});function noticeShown(value){if(!value)learning.clearNotice()}const open=computed(()=>Boolean(learning?.state.open));const built=ref(false);watch(open,value=>{if(value)built.value=true},{immediate:true});watch(actorKey,()=>{built.value=open.value});const layer=ref(null);watch(open,async value=>{if(!value)return;await nextTick$1();const element=layer.value;if(typeof element?.focus===`function`&&!element.contains?.(globalThis.document?.activeElement))element.focus({preventScroll:true})});const orientationRequested=computed(()=>Boolean(learning?.orientationRequested));const courses=useVibe64LearningCourses({active:computed(()=>open.value||orientationRequested.value)});const surface=computed(()=>learning?.state.surface||`courses`);const tabs=Object.freeze([{id:`courses`,label:`Courses`},{id:`progress`,label:`In progress`},{id:`archived`,label:`Archived`}]);useRealtimeEvent({event:VIBE64_TRAINING_LEARNER_CHANGED_EVENT,enabled:computed(()=>Boolean(actorKey.value)),onEvent:({payload}={})=>{learning?.learnerChanged(payload||{});if(open.value&&payload?.reason!==`notes`)courses.learningResource.reload()}});let orientationRun=false;watch(orientationRequested,value=>{if(value)takeOrientation()},{immediate:true});async function takeOrientation(){if(orientationRun)return;orientationRun=true;try{await courses.refresh();const selection=orientationSelection(courses.coursesResource.data.value,courses.learningResource.data.value);if(selection)await learning.startLesson(selection,courses.startLesson);else await learning.show({surface:`courses`})}catch(cause){learning.showNotice(String(cause?.message||`The tour did not start. Try again from Courses.`))}finally{orientationRun=false;if(!learning.confirmArchive)learning.orientationAnswered()}}const confirm=computed(()=>learning?.confirmArchive||null);async function archiveAndStart(){try{await learning.confirmArchiveAndStart()}catch(cause){learning.showNotice(String(cause?.message||`The lesson did not start. Try again from Courses.`))}finally{learning.orientationAnswered()}}function keepCurrent(){learning.cancelArchive();learning.orientationAnswered()}const continueOffered=computed(()=>Boolean(learning?.mode?.on&&learning.lessonAttemptId&&!learning.state.finished));function continueLesson(){learning.openLesson().catch(cause=>learning.showNotice(String(cause?.message||`The lesson could not open. Try again.`)))}function keydown(event){if(event.key===`Escape`&&!event.defaultPrevented&&!confirm.value){event.stopPropagation();learning.closeCourses()}}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(unref(TrainingGuideOverlay_default)),unref(learning)&&actorKey.value&&built.value?withDirectives((openBlock(),createElementBlock(`div`,{key:0,class:`vibe64-learning`,role:`dialog`,"aria-modal":`true`,"aria-label":`Courses`,"data-pane-swipe-ignore":``,tabindex:`-1`,ref_key:`layer`,ref:layer,onKeydown:keydown},[createBaseVNode(`header`,_hoisted_1$13,[createBaseVNode(`nav`,_hoisted_2$10,[(openBlock(true),createElementBlock(Fragment,null,renderList(unref(tabs),tab=>{return openBlock(),createElementBlock(`button`,{key:tab.id,type:`button`,class:`vibe64-learning__tab`,"aria-current":surface.value===tab.id?`page`:void 0,"data-test":`learning-${tab.id}-tab`,onClick:$event=>unref(learning).show({surface:tab.id})},toDisplayString(tab.label),9,_hoisted_3$9)}),128))]),continueOffered.value?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`flat`,rounded:`pill`,"min-height":`40`,"append-icon":unref(mdiArrowRight),class:`vibe64-learning__exit`,"data-test":`learning-continue-lesson`,onClick:continueLesson},{default:withCtx(()=>[..._cache[2]||(_cache[2]=[createTextVNode(` Continue lesson `,-1)])]),_:1},8,[`append-icon`])):createCommentVNode(``,true),createVNode(VBtn,{variant:`tonal`,rounded:`pill`,"min-height":`40`,"prepend-icon":unref(mdiArrowLeft),class:`vibe64-learning__exit`,title:`Close Courses (your place is kept)`,"data-test":`learning-back`,onClick:_cache[0]||(_cache[0]=$event=>unref(learning).closeCourses())},{default:withCtx(()=>[..._cache[3]||(_cache[3]=[createTextVNode(` Back `,-1)])]),_:1},8,[`prepend-icon`])]),createBaseVNode(`div`,_hoisted_4$5,[surface.value===`courses`?(openBlock(),createElementBlock(`div`,_hoisted_5$5,[createVNode(Vibe64LearningCourses_default,{courses:unref(courses)},{default:withCtx(scope=>[renderSlot(_ctx.$slots,`courses`,normalizeProps(guardReactiveProps(scope)),void 0,true)]),_:3},8,[`courses`]),createVNode(Vibe64LearningTeacherNotes_default,{learning:unref(learning)},null,8,[`learning`])])):(openBlock(),createElementBlock(`div`,_hoisted_6$3,[createVNode(Vibe64LearningAttempts_default,{learning:unref(learning),archived:surface.value===`archived`},null,8,[`learning`,`archived`])]))])],544)),[[vShow,open.value]]):createCommentVNode(``,true),unref(learning)&&actorKey.value?(openBlock(),createBlock(VDialog,{key:1,"model-value":Boolean(confirm.value),"max-width":`28rem`,style:{"z-index":`2410`},"onUpdate:modelValue":_cache[1]||(_cache[1]=value=>value||keepCurrent())},{default:withCtx(()=>[confirm.value?(openBlock(),createBlock(VCard,{key:0,rounded:`xl`,"data-test":`learning-archive-confirm`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`text-wrap`},{default:withCtx(()=>[..._cache[4]||(_cache[4]=[createTextVNode(`Archive your lesson in progress?`,-1)])]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[_cache[5]||(_cache[5]=createTextVNode(` You can have one lesson in progress. Starting this one archives `,-1)),createBaseVNode(`strong`,null,toDisplayString(confirm.value.current.lessonTitle||`the lesson in progress`),1),_cache[6]||(_cache[6]=createTextVNode(` with its practice project and conversation; it stays under Archived. `,-1))]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{variant:`text`,"min-height":`48`,"data-test":`learning-archive-cancel`,onClick:keepCurrent},{default:withCtx(()=>[..._cache[7]||(_cache[7]=[createTextVNode(`Keep it`,-1)])]),_:1}),createVNode(VBtn,{color:`primary`,variant:`flat`,"min-height":`48`,"data-test":`learning-archive-start`,onClick:archiveAndStart},{default:withCtx(()=>[..._cache[8]||(_cache[8]=[createTextVNode(`Archive and start`,-1)])]),_:1})]),_:1})]),_:1})):createCommentVNode(``,true)]),_:1},8,[`model-value`])):createCommentVNode(``,true),unref(learning)&&actorKey.value?(openBlock(),createBlock(VSnackbar,{key:2,"model-value":Boolean(unref(learning).notice),timeout:8e3,location:`bottom`,"data-test":`learning-mode-notice`,"onUpdate:modelValue":noticeShown},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(learning).notice),1)]),_:1},8,[`model-value`])):createCommentVNode(``,true)],64)}}};var Vibe64LearningOverlay_default=_plugin_vue_export_helper_default(_sfc_main$27,[[`__scopeId`,`data-v-0c76339c`]]);var _sfc_main$26={__name:`Vibe64LearningRouteHold`,setup(__props){const learning=useVibe64Learning();const viewer=inject$1(VIBE64_ASSISTANT_VIEWER_KEY,null);const route=useRoute();const queryClient=useQueryClient();const held=computed(()=>{const slug=projectSlugFromRoute(route);const actorKey=String(toValue(viewer)?.actorKey||``);if(!learning||!actorKey||!slug)return false;return learning.state.actorKey!==actorKey||!learning.state.modeRead||learning.state.modeBusy===`set`||Boolean(modeRedirect({mode:learning.mode,slug,path:route.path}))});function leaveProject(slug){const queryKey=[`vibe64`,...vibe64ProjectQueryScope(slug)];queryClient.cancelQueries({queryKey}).then(()=>queryClient.removeQueries({queryKey,predicate:query=>query.state.error?.code===VIBE64_LEARNING_MODE_PROJECT_CODE}))}watch(()=>[held.value,projectSlugFromRoute(route)],([isHeld],[wasHeld,shownSlug]=[])=>{if(isHeld&&wasHeld===false&&shownSlug)leaveProject(shownSlug)});return(_ctx,_cache)=>{return!held.value?renderSlot(_ctx.$slots,`default`,{},void 0,void 0,0):createCommentVNode(``,true)}}};var jskit$8={"shell":{"actions":{"close":`Close`,"dismiss":`Dismiss`,"reload":`Reload`,"retry":`Retry`},"error":{"actionFailed":`Error action failed.`,"attentionRequired":`Attention required`,"navigationFailed":`Navigation failed.`,"requestFailed":`Request failed.`,"unexpectedUi":`Unexpected UI error.`},"layout":{"closeNavigationMenu":`Close navigation menu`,"collapseNavigationDrawer":`Collapse navigation drawer`,"details":`Details`,"expandNavigationDrawer":`Expand navigation drawer`,"openNavigationMenu":`Open navigation menu`,"surface":`Surface`,"tab":`Tab`,"tools":`Tools`},"pullToRefresh":{"pull":`Pull to refresh`,"refreshing":`Refreshing`,"release":`Release to refresh`},"recovery":{"appDataLabel":`App data`,"appLabel":`App`,"appModuleLabel":`App module`,"appUnreachable":`The app could not reach the server or network. Check the connection and try again.`,"errorConfigLabel":`Error config`,"moduleFailed":`A required app module could not load.`,"placementConfigLabel":`Placement config`,"placementTopologyLabel":`Placement topology`,"refreshFailed":`Unable to refresh. Check the connection and try again.`,"reloadFailed":`The app cannot reload because the app server is not reachable. Restart the server, then click Reload.`,"unreachable":`{label} could not reach the server or network. Check the connection and try again.`}}};var en_default$8={jskit:jskit$8};registerJskitMessages(en_default$8);var _hoisted_1$12={class:`shell-error-host__banner-stack`};var _hoisted_2$9={class:`d-flex align-center ga-3 flex-wrap`};var _hoisted_3$8={key:0};var BANNER_INLINE_HEIGHT_PROPERTY=`--shell-error-banners-inline-height`;var _sfc_main$25={__name:`ShellErrorHost`,setup(__props){const runtime=useShellWebErrorRuntime();const{t,text,serverMessage}=useJskitText();const store=useShellErrorPresentationStore();const snackbarEntries=computed(()=>store.channels.snackbar||[]);const bannerEntries=computed(()=>store.channels.banner||[]);const dialogEntry=computed(()=>store.channels.dialog[0]||null);const displayedSnackbarEntry=ref(null);const layoutRect=readLayoutRect();function readLayoutRect(){try{return useLayout().mainRect}catch{return null}}const bannersElement=ref(null);const bannerPlacement=computed(()=>{const rect=layoutRect?.value||{};const top=Number(rect.top)||0;if(top<=0)return{inline:true,style:void 0};return{inline:false,style:{top:`calc(env(safe-area-inset-top, 0px) + ${top}px)`,left:`${Number(rect.left)||0}px`,right:`${Number(rect.right)||0}px`}}});let bannerResizeObserver=null;function publishInlineBannerHeight(height=0){const rootStyle=globalThis.document?.documentElement?.style;if(!rootStyle)return;if(height>0)rootStyle.setProperty(BANNER_INLINE_HEIGHT_PROPERTY,`${Math.ceil(height)}px`);else rootStyle.removeProperty(BANNER_INLINE_HEIGHT_PROPERTY)}function stopObservingBanners(){bannerResizeObserver?.disconnect();bannerResizeObserver=null;publishInlineBannerHeight(0)}watch([bannersElement,()=>bannerPlacement.value.inline],([element,inline])=>{stopObservingBanners();if(!element||!inline||typeof globalThis.ResizeObserver!==`function`)return;bannerResizeObserver=new globalThis.ResizeObserver(()=>{publishInlineBannerHeight(element.getBoundingClientRect().height)});bannerResizeObserver.observe(element);publishInlineBannerHeight(element.getBoundingClientRect().height)},{flush:`post`});onBeforeUnmount(stopObservingBanners);const snackbarOpen=ref(false);function isSameSnackbarEntry(left=null,right=null){return Boolean(left?.id&&right?.id&&left.id===right.id)}function hasSnackbarEntry(entry=null){if(!entry?.id)return false;return snackbarEntries.value.some(candidate=>isSameSnackbarEntry(candidate,entry))}function openNextSnackbarEntry(){const nextEntry=snackbarEntries.value[0]||null;if(!nextEntry){displayedSnackbarEntry.value=null;snackbarOpen.value=false;return}displayedSnackbarEntry.value=nextEntry;snackbarOpen.value=true}watch(snackbarEntries,entries=>{const currentEntry=displayedSnackbarEntry.value;if(!currentEntry){openNextSnackbarEntry();return}const matchingEntry=entries.find(entry=>isSameSnackbarEntry(entry,currentEntry))||null;if(matchingEntry){displayedSnackbarEntry.value=matchingEntry;return}snackbarOpen.value=false},{immediate:true});function resolveSeverityColor(severity=`error`){const normalized=String(severity||`error`).trim().toLowerCase();if(normalized===`info`)return`info`;if(normalized===`success`)return`success`;if(normalized===`warning`)return`warning`;return`error`}function resolveSeverityIcon(severity=`error`){const normalized=String(severity||`error`).trim().toLowerCase();if(normalized===`info`)return mdiInformationOutline;if(normalized===`success`)return mdiCheckCircleOutline;return mdiAlertOutline}function resolveTimeout(entry){if(!entry)return-1;if(entry.persist)return-1;return 5e3}function dismiss(entry){if(!entry||!entry.channel||!entry.id)return;store.dismiss(entry.channel,entry.id)}function actionsFor(entry){return entry?[entry.action,...entry.additionalActions].filter(Boolean):[]}async function runAction(entry,action){if(!entry||typeof action?.handler!==`function`)return;try{await action.handler(entry)}catch(error){runtime.report({source:`shell-web.error-host.action`,message:t(`jskit.shell.error.actionFailed`),cause:error,intent:`blocking`,severity:`error`})}if(action.dismissOnRun!==false)dismiss(entry)}function onSnackbarModelValue(nextValue){if(nextValue===false&&displayedSnackbarEntry.value){snackbarOpen.value=false;dismiss(displayedSnackbarEntry.value)}}function onDialogModelValue(nextValue){if(nextValue===false&&dialogEntry.value&&dialogEntry.value.persist!==true)dismiss(dialogEntry.value)}function onSnackbarAfterLeave(){if(hasSnackbarEntry(displayedSnackbarEntry.value))return;openNextSnackbarEntry()}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,{class:normalizeClass([`shell-error-host`,{"shell-error-host--inline-banners":bannerPlacement.value.inline}]),"aria-live":`polite`},[bannerEntries.value.length>0?(openBlock(),createElementBlock(`div`,{key:0,ref_key:`bannersElement`,ref:bannersElement,class:normalizeClass([`shell-error-host__banners`,{"shell-error-host__banners--inline":bannerPlacement.value.inline}]),style:normalizeStyle(bannerPlacement.value.style),"data-testid":`shell-error-host-banners`},[createBaseVNode(`div`,_hoisted_1$12,[(openBlock(true),createElementBlock(Fragment,null,renderList(bannerEntries.value,entry=>{return openBlock(),createBlock(VAlert,{key:entry.id,type:resolveSeverityColor(entry.severity),icon:resolveSeverityIcon(entry.severity),variant:`elevated`,density:`comfortable`,rounded:`lg`,border:`start`,class:`shell-error-host__banner`,closable:``,"close-label":unref(t)(`jskit.shell.actions.close`),"onClick:close":$event=>dismiss(entry)},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_2$9,[createBaseVNode(`span`,null,toDisplayString(unref(serverMessage)(entry)),1),createVNode(VSpacer),(openBlock(true),createElementBlock(Fragment,null,renderList(actionsFor(entry),(action,index)=>{return openBlock(),createBlock(VBtn,{key:index,variant:`text`,size:`small`,class:`text-none`,onClick:$event=>runAction(entry,action)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(text)(action.label)),1)]),_:2},1032,[`onClick`])}),128))])]),_:2},1032,[`type`,`icon`,`close-label`,`onClick:close`])}),128))])],6)):createCommentVNode(``,true),createVNode(VSnackbar,{"model-value":snackbarOpen.value,location:`bottom end`,timeout:resolveTimeout(displayedSnackbarEntry.value),vertical:actionsFor(displayedSnackbarEntry.value).length>1,color:displayedSnackbarEntry.value?resolveSeverityColor(displayedSnackbarEntry.value.severity):void 0,"onUpdate:modelValue":onSnackbarModelValue,onAfterLeave:onSnackbarAfterLeave},{actions:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(actionsFor(displayedSnackbarEntry.value),(action,index)=>{return openBlock(),createBlock(VBtn,{key:index,variant:`text`,"min-height":`48`,onClick:$event=>runAction(displayedSnackbarEntry.value,action)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(text)(action.label)),1)]),_:2},1032,[`onClick`])}),128)),displayedSnackbarEntry.value?(openBlock(),createBlock(VBtn,{key:0,variant:`text`,size:`small`,onClick:_cache[0]||(_cache[0]=$event=>dismiss(displayedSnackbarEntry.value))},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.shell.actions.dismiss`)),1)]),_:1})):createCommentVNode(``,true)]),default:withCtx(()=>[displayedSnackbarEntry.value?(openBlock(),createElementBlock(`span`,_hoisted_3$8,toDisplayString(unref(serverMessage)(displayedSnackbarEntry.value)),1)):createCommentVNode(``,true)]),_:1},8,[`model-value`,`timeout`,`vertical`,`color`]),createVNode(VDialog,{"model-value":Boolean(dialogEntry.value),"max-width":`560`,persistent:Boolean(dialogEntry.value?.persist),"onUpdate:modelValue":onDialogModelValue},{default:withCtx(()=>[dialogEntry.value?(openBlock(),createBlock(VCard,{key:0},{default:withCtx(()=>[createVNode(VCardTitle,{class:`text-subtitle-1`},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.shell.error.attentionRequired`)),1)]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[createTextVNode(toDisplayString(unref(serverMessage)(dialogEntry.value)),1)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),(openBlock(true),createElementBlock(Fragment,null,renderList(actionsFor(dialogEntry.value),(action,index)=>{return openBlock(),createBlock(VBtn,{key:index,variant:`text`,onClick:$event=>runAction(dialogEntry.value,action)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(text)(action.label)),1)]),_:2},1032,[`onClick`])}),128)),createVNode(VBtn,{color:`primary`,variant:`tonal`,onClick:_cache[1]||(_cache[1]=$event=>dismiss(dialogEntry.value))},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.shell.actions.close`)),1)]),_:1})]),_:1})]),_:1})):createCommentVNode(``,true)]),_:1},8,[`model-value`,`persistent`])],2)}}};var ShellErrorHost_default=_plugin_vue_export_helper_default(_sfc_main$25,[[`__scopeId`,`data-v-4d847da2`]]);function useVibe64InAppLinks(){const router=useRouter$1();function navigateAppLink(event){if(event.defaultPrevented||event.button!==0||event.ctrlKey||event.metaKey||event.shiftKey||event.altKey)return;const anchor=event.target?.closest?.(`a[href]`);if(!anchor||anchor.hasAttribute(`download`)||anchor.relList.contains(`external`))return;const target=anchor.getAttribute(`target`);if(target&&target.toLowerCase()!==`_self`)return;const href=anchor.getAttribute(`href`);if(!href||href.startsWith(`#`))return;let url;try{url=new URL(anchor.href)}catch{return}if(url.origin!==window.location.origin||![`http:`,`https:`].includes(url.protocol)||url.username||url.password)return;const path=`${url.pathname}${url.search}${url.hash}`;const route=router.resolve(path);if(!route.matched.length||route.name===`not-found`)return;event.preventDefault();router.push(path)}onMounted(()=>document.addEventListener(`click`,navigateAppLink));onUnmounted(()=>document.removeEventListener(`click`,navigateAppLink))}var _sfc_main$24={__name:`App`,setup(__props){useVibe64InAppLinks();return(_ctx,_cache)=>{return openBlock(),createBlock(VApp,null,{default:withCtx(()=>[createVNode(_sfc_main$62,{local:``},{default:withCtx(()=>[createVNode(_sfc_main$41,null,{default:withCtx(()=>[createVNode(_sfc_main$26,null,{default:withCtx(()=>[createVNode(unref(RouterView))]),_:1}),createVNode(_sfc_main$43),createVNode(Vibe64LearningOverlay_default)]),_:1}),createVNode(_sfc_main$26,null,{default:withCtx(()=>[createVNode(unref(_sfc_main$63),{"can-configure":``,"actor-key":`local`})]),_:1})]),_:1}),createVNode(unref(ShellErrorHost_default))]),_:1})}}};var title=`Not Found`;var message=`The page you requested does not exist.`;var _sfc_main$23={__name:`NotFound`,setup(__props){return(_ctx,_cache)=>{return openBlock(),createBlock(VContainer,{class:`fill-height d-flex align-center justify-center`},{default:withCtx(()=>[createVNode(VCard,{class:`pa-6 text-center`,"max-width":`560`,rounded:`lg`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`text-h4`},{default:withCtx(()=>[createTextVNode(toDisplayString(title))]),_:1}),createVNode(VCardText,{class:`text-medium-emphasis`},{default:withCtx(()=>[createTextVNode(toDisplayString(message))]),_:1})]),_:1})]),_:1})}}};var name={type:`string`,required:true,minLength:1,maxLength:200};var secretReference={...name,pattern:`^(?!https?:)[a-z][a-z0-9-]*:[^\\s]+$`};var authenticationSchema=createSchema({method:{...name,enum:[`oauth2`,`api-key`,`service-account`,`none`]},registrationRef:{...name,required:false},secretRef:{...secretReference,required:false},refreshTokenRef:{...secretReference,required:false}});var assistantPermission={type:`string`,enum:[`ask`,`always`,`never`]};var assistantPolicySchema=createSchema({enabled:{type:`boolean`,strictBoolean:true,defaultTo:true},defaultPermission:{...assistantPermission,defaultTo:`ask`},actions:{type:`object`,values:assistantPermission,defaultTo:{}}});var integrationSchema=createSchema({provider:name,displayName:{...name,required:false},accountMode:{...name,enum:[`shared`,`per-user`,`assistant`]},scopes:{type:`array`,items:{...name,maxLength:2048},required:true},authentication:{type:`object`,schema:authenticationSchema,required:true},settings:{type:`object`,additionalProperties:true,required:false},assistantPolicy:{type:`object`,schema:assistantPolicySchema,required:false},extensions:{type:`object`,additionalProperties:true,required:false}});var registrationSchema=createSchema({source:{...name,enum:[`own`]},grantType:{...name,enum:[`authorization_code`,`client_credentials`],required:false},clientId:{...name,maxLength:2048,required:false},clientSecretRef:{...secretReference,required:false},tokenEndpointAuthMethod:{...name,enum:[`client_secret_post`,`client_secret_basic`,`none`],required:false},callbackUrlRef:{...secretReference,required:false}});var integrationsSchema=createSchema({schemaVersion:{type:`integer`,enum:[1],required:true},integrations:{type:`object`,values:integrationSchema,required:true},registrations:{type:`object`,values:registrationSchema,required:true},extensions:{type:`object`,additionalProperties:true,required:false}});var IntegrationConfigurationError=class extends Error{constructor(fieldErrors,fieldErrorCodes={}){super(`Integration configuration is invalid.`);this.name=`IntegrationConfigurationError`;this.code=`integration_configuration_invalid`;this.statusCode=422;this.fieldErrors={};this.fieldErrorCodes={...fieldErrorCodes};for(const[field,entry]of Object.entries(fieldErrors)){this.fieldErrors[field]=typeof entry===`string`?entry:entry.message;if(entry?.code)this.fieldErrorCodes[field]={code:entry.code,params:{...entry.params}}}}};var FIELD_ERRORS=Object.freeze({schemaVersion:{code:`connectors.configuration.schemaVersionUnsupported`,message:`Use numeric schemaVersion 1; other versions require an explicit migration.`},invalid:{code:`connectors.configuration.invalid`,message:`Invalid configuration.`},invalidJson:{code:`connectors.configuration.invalidJson`,message:`Enter valid JSON.`},required:{code:`connectors.configuration.valueRequired`,message:`This value is required.`},stableName:{code:`connectors.configuration.stableName`,message:`Use a stable lowercase name containing letters, digits and hyphens.`},otherCredentialMode:{code:`connectors.configuration.otherCredentialModeField`,message:`This field belongs to another credential mode.`},confidentialClient:{code:`connectors.configuration.confidentialClientRequired`,message:`Client credentials require a confidential client.`},refreshTokenOAuthOnly:{code:`connectors.configuration.refreshTokenOAuthOnly`,message:`Only an OAuth connection can start from a refresh token.`},registrationUndefined:{code:`connectors.configuration.registrationUndefined`,message:`Select a registration defined in this file.`},registrationSecret:{code:`connectors.configuration.registrationSecret`,message:`Use the registration's secret reference.`},refreshTokenSharedOnly:{code:`connectors.configuration.refreshTokenSharedOnly`,message:`Only a shared connection can start from a refresh token in Env.`},refreshTokenClientCredentials:{code:`connectors.configuration.refreshTokenClientCredentials`,message:`Client credentials do not use a refresh token.`},serviceAccountPerUser:{code:`connectors.configuration.serviceAccountPerUser`,message:`A service account cannot connect as each app user.`},apiKeyRegistration:{code:`connectors.configuration.apiKeyRegistration`,message:`API keys do not use an OAuth registration.`},serviceAccountRegistration:{code:`connectors.configuration.serviceAccountRegistration`,message:`Service-account credentials do not use a browser OAuth registration.`},noCredentials:{code:`connectors.configuration.noCredentials`,message:`This mode does not use credentials.`},duplicateScope:{code:`connectors.configuration.duplicateScope`,message:`Select each permission only once.`},providerUnregistered:{code:`connectors.configuration.providerUnregistered`,message:`Install and register this provider before using it.`},assistantActionUndeclared:{code:`connectors.configuration.assistantActionUndeclared`,message:`This provider does not declare this assistant action.`},providerSettings:{code:`connectors.configuration.providerSettings`,message:`Check this provider's settings.`},otherCredentialModeSetting:{code:`connectors.configuration.otherCredentialModeSetting`,message:`This setting belongs to another credential mode.`},accountModeUnsupported:{code:`connectors.configuration.accountModeUnsupported`,message:`This provider does not support this account mode.`},credentialModeUnsupported:{code:`connectors.configuration.credentialModeUnsupported`,message:`This provider configuration does not support this credential mode.`},oauthFlowUnsupported:{code:`connectors.configuration.oauthFlowUnsupported`,message:`This provider does not support this OAuth flow.`},clientAuthenticationUnsupported:{code:`connectors.configuration.clientAuthenticationUnsupported`,message:`This provider does not support this client authentication method.`},clientId:{code:`connectors.configuration.clientId`,message:`Check this provider's client identifier.`},requiredScopes:{code:`connectors.configuration.requiredScopes`,message:`Include this provider's required permissions.`},scopeUnsupported:{code:`connectors.configuration.scopeUnsupported`,message:`A selected permission is not supported by this provider configuration.`},scopeRequired:{code:`connectors.configuration.scopeRequired`,message:`Select at least one permission.`}});function schemaFieldErrors(error,fallback,prefix=``){const messages={};const codes={};for(const[field,message]of Object.entries(error.fieldErrors||fallback)){messages[`${prefix}${field}`]=message;const coded=error.fieldErrorCodes?.[field];if(coded)codes[`${prefix}${field}`]=coded}return{messages,codes}}var DEFAULT_GRANT_TYPE=`authorization_code`;var DEFAULT_TOKEN_ENDPOINT_AUTH_METHOD=`client_secret_post`;var MESSAGE_KEY_SOURCE=Symbol.for(`@jskit-ai/connectors-core.messageKeySource`);function createEnglishProviderTexts(catalog){const rendered=new WeakMap;const englishMessage=(key,params)=>{const message=typeof key===`string`?catalogMessage(catalog,key):void 0;return message===void 0?void 0:formatMessage(message,params)};return function englishTexts(value){if(typeof value===`string`)return englishMessage(value)??value;if(!value||typeof value!==`object`&&typeof value!==`function`)return value;if(rendered.has(value))return rendered.get(value);let english=value;if(typeof value===`function`)english=function(...args){return englishTexts(value.apply(this,args))};else if(Array.isArray(value))english=value.map(item=>englishTexts(item));else if(Object.getPrototypeOf(value)===Object.prototype){const message=englishMessage(value.key,value.params);if(message!==void 0)return message;english=Object.fromEntries(Object.entries(value).map(([name,inner])=>[name,englishTexts(inner)]));Object.defineProperty(english,MESSAGE_KEY_SOURCE,{value})}if(english!==value&&Object.isFrozen(value))Object.freeze(english);rendered.set(value,english);return english}}function registrationGrantType(record){return record?.grantType||`authorization_code`}function registrationClientAuthentication(record){return record?.tokenEndpointAuthMethod||`client_secret_post`}function providerGrantTypes(provider){return provider.oauthGrantTypes||[`authorization_code`]}function getProviderSettingsSchema(provider,settings={}){return typeof provider.settingsSchema===`function`?provider.settingsSchema(settings):provider.settingsSchema}function getProviderAuthenticationMethods(provider,settings={}){return provider.authenticationMethodsForSettings?provider.authenticationMethodsForSettings(settings):provider.authenticationMethods}function getProviderAccountModes(provider,settings={}){return provider.accountModesForSettings?provider.accountModesForSettings(settings):provider.accountModes}function getProviderScopes(provider,settings={},grantType=DEFAULT_GRANT_TYPE,authenticationMethod){const scopes=provider.scopesForGrantType?provider.scopesForGrantType(grantType,settings):provider.scopesForSettings?provider.scopesForSettings(settings):provider.scopes;return authenticationMethod?scopes.filter(scope=>!scope.authenticationMethods||scope.authenticationMethods.includes(authenticationMethod)):scopes}function getProviderClientAuthenticationMethods(provider,grantType=DEFAULT_GRANT_TYPE,settings={}){const methods=provider.oauthClientAuthenticationMethods;return typeof methods===`function`?methods(grantType,settings):methods||[`client_secret_post`]}function validateIntegrationConfiguration(input,{providers=[],allowUnknownProviders=false}={}){if(input?.schemaVersion!==1)throw new IntegrationConfigurationError({schemaVersion:FIELD_ERRORS.schemaVersion});let config;try{config=validateSchemaPayload({schema:integrationsSchema,mode:`replace`},input)}catch(error){const{messages,codes}=schemaFieldErrors(error,{configuration:FIELD_ERRORS.invalid});throw new IntegrationConfigurationError(messages,codes)}const fieldErrors={};const fieldErrorCodes={};const definitions=new Map(providers.map(provider=>[provider.id,provider]));const requireValue=(record,key,path)=>{if(!record[key])fieldErrors[`${path}.${key}`]=FIELD_ERRORS.required};for(const field of[`integrations`,`registrations`])for(const id of Object.keys(config[field]))if(!/^[a-z][a-z0-9-]*$/u.test(id)||[`constructor`,`prototype`].includes(id))fieldErrors[`${field}.${id}`]=FIELD_ERRORS.stableName;for(const[id,registration]of Object.entries(config.registrations)){const path=`registrations.${id}`;const clientCredentials=registration.grantType===`client_credentials`;const required=[`clientId`,...clientCredentials?[]:[`callbackUrlRef`],...registration.tokenEndpointAuthMethod===`none`?[]:[`clientSecretRef`]];for(const key of required)requireValue(registration,key,path);const forbidden=[...clientCredentials?[`callbackUrlRef`]:[],...registration.tokenEndpointAuthMethod===`none`?[`clientSecretRef`]:[]];for(const key of forbidden)if(Object.hasOwn(registration,key))fieldErrors[`${path}.${key}`]=FIELD_ERRORS.otherCredentialMode;if(clientCredentials&®istration.tokenEndpointAuthMethod===`none`)fieldErrors[`${path}.tokenEndpointAuthMethod`]=FIELD_ERRORS.confidentialClient}for(const[id,integration]of Object.entries(config.integrations)){const path=`integrations.${id}`;const auth=integration.authentication;const provider=definitions.get(integration.provider);const registration=config.registrations[auth.registrationRef];const grantType=registrationGrantType(registration);if(auth.refreshTokenRef&&auth.method!==`oauth2`)fieldErrors[`${path}.authentication.refreshTokenRef`]=FIELD_ERRORS.refreshTokenOAuthOnly;if(auth.method===`oauth2`){if(!auth.registrationRef||!Object.hasOwn(config.registrations,auth.registrationRef))fieldErrors[`${path}.authentication.registrationRef`]=FIELD_ERRORS.registrationUndefined;if(auth.secretRef)fieldErrors[`${path}.authentication.secretRef`]=FIELD_ERRORS.registrationSecret;if(auth.refreshTokenRef&&integration.accountMode!==`shared`)fieldErrors[`${path}.authentication.refreshTokenRef`]=FIELD_ERRORS.refreshTokenSharedOnly;else if(auth.refreshTokenRef&&grantType!==`authorization_code`)fieldErrors[`${path}.authentication.refreshTokenRef`]=FIELD_ERRORS.refreshTokenClientCredentials;if(grantType===`client_credentials`&&integration.accountMode===`per-user`)fieldErrors[`${path}.accountMode`]=FIELD_ERRORS.serviceAccountPerUser}else if(auth.method===`api-key`){if(!provider?.apiKeySecretOptional)requireValue(auth,`secretRef`,`${path}.authentication`);if(auth.registrationRef)fieldErrors[`${path}.authentication.registrationRef`]=FIELD_ERRORS.apiKeyRegistration}else if(auth.method===`service-account`){requireValue(auth,`secretRef`,`${path}.authentication`);if(auth.registrationRef)fieldErrors[`${path}.authentication.registrationRef`]=FIELD_ERRORS.serviceAccountRegistration;if(integration.accountMode===`per-user`)fieldErrors[`${path}.accountMode`]=FIELD_ERRORS.serviceAccountPerUser}else for(const field of[`secretRef`,`registrationRef`])if(Object.hasOwn(auth,field))fieldErrors[`${path}.authentication.${field}`]=FIELD_ERRORS.noCredentials;if(new Set(integration.scopes).size!==integration.scopes.length)fieldErrors[`${path}.scopes`]=FIELD_ERRORS.duplicateScope;if(providers.length){if(!provider){if(!allowUnknownProviders)fieldErrors[`${path}.provider`]=FIELD_ERRORS.providerUnregistered;continue}for(const action of Object.keys(integration.assistantPolicy?.actions||{}))if(!provider.assistantActions?.some(item=>item.value===action))fieldErrors[`${path}.assistantPolicy.actions.${action}`]=FIELD_ERRORS.assistantActionUndeclared;if(provider.settingsSchema)try{integration.settings=validateSchemaPayload({schema:getProviderSettingsSchema(provider,integration.settings),mode:`replace`},integration.settings||{})}catch(error){const{messages,codes}=schemaFieldErrors(error,{settings:FIELD_ERRORS.providerSettings},`${path}.settings.`);Object.assign(fieldErrors,messages);Object.assign(fieldErrorCodes,codes)}for(const field of provider.settingsFields||[])if(field.authenticationMethods&&!field.authenticationMethods.includes(auth.method)&&Object.hasOwn(integration.settings||{},field.name))fieldErrors[`${path}.settings.${field.name}`]=FIELD_ERRORS.otherCredentialModeSetting;if(!getProviderAccountModes(provider,integration.settings||{}).includes(integration.accountMode))fieldErrors[`${path}.accountMode`]=FIELD_ERRORS.accountModeUnsupported;if(!getProviderAuthenticationMethods(provider,integration.settings).includes(auth.method))fieldErrors[`${path}.authentication.method`]=FIELD_ERRORS.credentialModeUnsupported;if(auth.method===`oauth2`&®istration?.source===`own`){const registrationPath=`registrations.${auth.registrationRef}`;if(!providerGrantTypes(provider).includes(grantType))fieldErrors[`${registrationPath}.grantType`]=FIELD_ERRORS.oauthFlowUnsupported;if(!getProviderClientAuthenticationMethods(provider,grantType,integration.settings||{}).includes(registrationClientAuthentication(registration)))fieldErrors[`${registrationPath}.tokenEndpointAuthMethod`]=FIELD_ERRORS.clientAuthenticationUnsupported;if(registration.clientId&&provider.validateClientId){const result=provider.validateClientId(registration.clientId);if(result!==true)fieldErrors[`${registrationPath}.clientId`]=result||FIELD_ERRORS.clientId}}const scopes=getProviderScopes(provider,integration.settings||{},grantType,auth.method);const allowedScopes=new Set(scopes.map(scope=>scope.value));if(scopes.some(scope=>scope.required&&!integration.scopes.includes(scope.value)))fieldErrors[`${path}.scopes`]=FIELD_ERRORS.requiredScopes;if(integration.scopes.some(scope=>!allowedScopes.has(scope)))fieldErrors[`${path}.scopes`]=FIELD_ERRORS.scopeUnsupported;if([`oauth2`,`service-account`].includes(auth.method)&&scopes.length&&!integration.scopes.length)fieldErrors[`${path}.scopes`]=FIELD_ERRORS.scopeRequired}}if(Object.keys(fieldErrors).length)throw new IntegrationConfigurationError(fieldErrors,fieldErrorCodes);return config}var jskit$7={"connectors":{"configurationFields":{"accountMode":{"label":`Account used by the application`},"accountModes":{"assistant":`Assistant access`,"perUser":`Each app user's own account`,"shared":`One shared account`},"apiKeyReference":{"hint":`Store the API key in your environment or secret store. Enter its reference here, such as env:SERVICE_API_KEY.`,"label":`API key reference`},"ariaLabel":`{provider} configuration`,"assistant":{"defaultPermission":{"hint":`Changing this sets every assistant action below to the same choice.`,"label":`Manage all permissions`},"enabled":{"label":`Allow assistant access`},"hint":`These choices control assistant actions for this integration. They do not grant access to the provider or replace your application's permissions.`},"assistantPermissions":{"always":`Always allow`,"ask":`Ask each time`,"never":`Never allow`},"authentication":{"label":`Authentication`},"authenticationMethods":{"apiKey":`API key`,"none":`No credentials`,"oauth2":`OAuth`,"serviceAccount":`Service account`},"callbackUrl":{"label":`Callback URL`},"callbackUrlReference":{"hint":`Reference the callback route implemented by your application and registered with the provider.`,"label":`Callback URL reference`},"clientId":{"label":`Client ID`},"clientSecretReference":{"hint":`Use an environment reference such as env:{prefix}_CLIENT_SECRET. Keep the value outside this file.`,"label":`Client secret reference`},"displayName":{"label":`Display name`},"grantType":{"label":`OAuth flow`},"grantTypes":{"authorizationCode":`User consent`,"clientCredentials":`Service account`},"panels":{"assistant":`Assistant permissions`,"credentials":`Credentials`,"details":`Details`,"permissions":`Permissions`},"permissions":{"hint":`Choose what the application needs. The account owner approves these permissions when connecting.`},"registration":{"label":`App registration`},"serviceAccountReference":{"hint":`Store the service credential in your environment or secret store and enter its reference here.`,"label":`Service-account credential reference`}}}};var en_default$7={jskit:jskit$7};registerJskitMessages(en_default$7);var _hoisted_1$11={class:`text-body-medium mb-3`};var _hoisted_2$8={key:0,role:`alert`,class:`text-error text-body-small mt-2`};var _hoisted_3$7={class:`text-body-medium mb-3`};var _sfc_main$22={__name:`IntegrationConfigurationFields`,props:{modelValue:{type:Object,required:true},integrationId:{type:String,required:true},provider:{type:Object,required:true},fieldErrors:{type:Object,default:()=>({})},fieldErrorCodes:{type:Object,default:()=>({})},disabled:Boolean,callbackUrl:{type:String,default:``}},emits:[`update:modelValue`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const jskitText=useJskitText();const{t,text,formatDate,fieldErrorMessages}=jskitText;const definition=computed(()=>props.provider[MESSAGE_KEY_SOURCE]||props.provider);const errors=computed(()=>fieldErrorMessages({fieldErrors:props.fieldErrors,fieldErrorCodes:props.fieldErrorCodes}));const panels=ref([`details`,`credentials`]);const integration=computed(()=>props.modelValue.integrations[props.integrationId]);const registrationId=computed(()=>integration.value?.authentication.registrationRef);const registration=computed(()=>props.modelValue.registrations[registrationId.value]);const grantType=computed(()=>registrationGrantType(registration.value));const grantTitles={authorization_code:`jskit.connectors.configurationFields.grantTypes.authorizationCode`,client_credentials:`jskit.connectors.configurationFields.grantTypes.clientCredentials`};const grantOptions=computed(()=>providerGrantTypes(definition.value).map(value=>({value,title:grantTitles[value]?t(grantTitles[value]):value})));const modeTitles={shared:`jskit.connectors.configurationFields.accountModes.shared`,"per-user":`jskit.connectors.configurationFields.accountModes.perUser`,assistant:`jskit.connectors.configurationFields.accountModes.assistant`};const modes=computed(()=>getProviderAccountModes(definition.value,integration.value.settings||{}).filter(mode=>integration.value?.authentication.method!==`oauth2`||grantType.value!==`client_credentials`||mode!==`per-user`).map(value=>({value,title:modeTitles[value]?t(modeTitles[value]):value})));const registrationOptions=computed(()=>Object.keys(props.modelValue.registrations));const integrationPath=computed(()=>`integrations.${props.integrationId}`);const registrationPath=computed(()=>`registrations.${registrationId.value}`);const settingProperties=computed(()=>getProviderSettingsSchema(definition.value,integration.value?.settings)?.getFieldDefinitions()||{});const methodTitles={"api-key":`jskit.connectors.configurationFields.authenticationMethods.apiKey`,"service-account":`jskit.connectors.configurationFields.authenticationMethods.serviceAccount`,oauth2:`jskit.connectors.configurationFields.authenticationMethods.oauth2`,none:`jskit.connectors.configurationFields.authenticationMethods.none`};const authenticationOptions=computed(()=>getProviderAuthenticationMethods(definition.value,integration.value.settings).map(value=>({value,title:text(definition.value.authenticationLabels?.[value])||(methodTitles[value]?t(methodTitles[value]):value)})));const visibleSettings=computed(()=>(definition.value.settingsFields||[]).filter(field=>Object.hasOwn(settingProperties.value,field.name)&&(!field.authenticationMethods||field.authenticationMethods.includes(integration.value.authentication.method))));const visibleScopes=computed(()=>getProviderScopes(definition.value,integration.value.settings||{},grantType.value,integration.value.authentication.method));const clientSecretHint=computed(()=>t(`jskit.connectors.configurationFields.clientSecretReference.hint`,{prefix:environmentPrefix(registrationId.value||props.integrationId)}));const assistantPermissions=computed(()=>[{value:`ask`,title:t(`jskit.connectors.configurationFields.assistantPermissions.ask`)},{value:`always`,title:t(`jskit.connectors.configurationFields.assistantPermissions.always`)},{value:`never`,title:t(`jskit.connectors.configurationFields.assistantPermissions.never`)}]);const credentialReference=computed(()=>integration.value?.authentication.method===`service-account`?{label:text(definition.value.serviceAccountReferenceLabel)||t(`jskit.connectors.configurationFields.serviceAccountReference.label`),hint:text(definition.value.serviceAccountReferenceHint)||t(`jskit.connectors.configurationFields.serviceAccountReference.hint`)}:{label:text(definition.value.apiKeyReferenceLabel)||t(`jskit.connectors.configurationFields.apiKeyReference.label`),hint:text(definition.value.apiKeyReferenceHint)||t(`jskit.connectors.configurationFields.apiKeyReference.hint`)});function environmentPrefix(id){return id.toUpperCase().replaceAll(`-`,`_`)}function accountModeForGrant(grant,settings,accountMode){return grant===`client_credentials`&&accountMode===`per-user`?getProviderAccountModes(definition.value,settings||{}).find(mode=>mode!==`per-user`):accountMode}function settingValue(field){return integration.value.settings?.[field.name]??settingProperties.value[field.name]?.defaultTo}function settingHint(field){return text(typeof field.hint===`function`?field.hint(integration.value.settings,jskitText.locale?{formatDate}:{}):field.hint)}function settingItems(field){return field.items?.map(item=>item&&typeof item===`object`?{...item,...item.title!==void 0?{title:text(item.title)}:{},...item.props?.subtitle!==void 0?{props:{...item.props,subtitle:text(item.props.subtitle)}}:{}}:item)}function settingErrors(field){return errors.value[`${integrationPath.value}.settings.${field.name}`]}function editAssistantPolicy(changes){editIntegration({assistantPolicy:{enabled:true,defaultPermission:`ask`,actions:{},...integration.value.assistantPolicy,...changes}})}function editIntegration(changes){const next={...integration.value,...changes};for(const key of Object.keys(changes))if(changes[key]===void 0)delete next[key];const registrations={...props.modelValue.registrations};const previousRegistration=registrationId.value;if(changes.authentication&&next.authentication.method!==`oauth2`&&previousRegistration&®istrations[previousRegistration]?.source===`own`&®istrations[previousRegistration]?.clientId===``&&!Object.entries(props.modelValue.integrations).some(([id,value])=>id!==props.integrationId&&value.authentication.registrationRef===previousRegistration))delete registrations[previousRegistration];emit(`update:modelValue`,{...props.modelValue,registrations,integrations:{...props.modelValue.integrations,[props.integrationId]:next}})}function editSetting(field,value){const settings={...integration.value.settings};if(value===void 0||value===``)delete settings[field];else settings[field]=value;if(typeof definition.value.settingsSchema===`function`){const fields=getProviderSettingsSchema(definition.value,settings).getFieldDefinitions();for(const key of Object.keys(settings))if(!Object.hasOwn(fields,key))delete settings[key]}const available=getProviderScopes(definition.value,settings,grantType.value,integration.value.authentication.method);const scopes=integration.value.scopes.filter(value=>available.some(scope=>scope.value===value));for(const scope of available)if(scope.required&&!scopes.includes(scope.value))scopes.push(scope.value);const methods=getProviderAuthenticationMethods(definition.value,settings);const credentialScope=definition.value.settingsFields?.find(item=>item.name===field)?.credentialScope;const authentication=credentialScope&&credentialScope(value)!==credentialScope(integration.value.settings?.[field]??settingProperties.value[field]?.defaultTo)||!methods.includes(integration.value.authentication.method)?{method:methods[0]}:integration.value.authentication;const accountModes=getProviderAccountModes(definition.value,settings);const accountMode=accountModes.includes(integration.value.accountMode)?integration.value.accountMode:accountModes[0];if(authentication.method===`oauth2`&&!authentication.registrationRef)editAuthentication(`oauth2`,{...integration.value,settings,scopes,authentication,accountMode});else editIntegration({settings,scopes,authentication,accountMode})}function editAuthentication(method,current=integration.value){const settings={...current.settings};for(const field of definition.value.settingsFields||[])if(field.authenticationMethods&&!field.authenticationMethods.includes(method))delete settings[field.name];const grant=method===`oauth2`?definition.value.oauthGrantTypes?.[0]||`authorization_code`:DEFAULT_GRANT_TYPE;const scopes=getProviderScopes(definition.value,settings,grant,method).filter(scope=>current.scopes.includes(scope.value)||scope.required||scope.authenticationMethods&&scope.recommended).map(scope=>scope.value);if(method===`oauth2`){let id=props.integrationId;let suffix=2;while(Object.hasOwn(props.modelValue.registrations,id))id=`${props.integrationId}-${suffix++}`;const prefix=environmentPrefix(id);const clientAuthentication=getProviderClientAuthenticationMethods(definition.value,grant,settings)[0];emit(`update:modelValue`,{...props.modelValue,integrations:{...props.modelValue.integrations,[props.integrationId]:{...current,scopes,authentication:{method,registrationRef:id},accountMode:accountModeForGrant(grant,settings,current.accountMode),...current.settings?{settings}:{}}},registrations:{...props.modelValue.registrations,[id]:{source:`own`,clientId:``,...grant===`authorization_code`?{callbackUrlRef:`env:${prefix}_CALLBACK_URL`}:{grantType:grant},...clientAuthentication!==`client_secret_post`?{tokenEndpointAuthMethod:clientAuthentication}:{},...clientAuthentication!==`none`?{clientSecretRef:`env:${prefix}_CLIENT_SECRET`}:{}}}});return}editIntegration({scopes,authentication:{method},...current.settings?{settings}:{}})}function editSecretReference(value){const authentication={...integration.value.authentication,secretRef:value};if(!value&&definition.value.apiKeySecretOptional)delete authentication.secretRef;editIntegration({authentication})}function editRegistration(field,value){emit(`update:modelValue`,{...props.modelValue,registrations:{...props.modelValue.registrations,[registrationId.value]:{...registration.value,[field]:value}}})}function editGrantType(value){const nextRegistration={...registration.value,grantType:value};const methods=getProviderClientAuthenticationMethods(definition.value,value,integration.value.settings||{});if(!methods.includes(registrationClientAuthentication(nextRegistration)))nextRegistration.tokenEndpointAuthMethod=methods[0];if(nextRegistration.tokenEndpointAuthMethod===`none`)delete nextRegistration.clientSecretRef;if(value===`client_credentials`)delete nextRegistration.callbackUrlRef;const allowed=getProviderScopes(definition.value,integration.value.settings||{},value,integration.value.authentication.method).map(scope=>scope.value);emit(`update:modelValue`,{...props.modelValue,registrations:{...props.modelValue.registrations,[registrationId.value]:nextRegistration},integrations:{...props.modelValue.integrations,[props.integrationId]:{...integration.value,accountMode:accountModeForGrant(value,integration.value.settings,integration.value.accountMode),scopes:integration.value.scopes.filter(scope=>allowed.includes(scope))}}})}return(_ctx,_cache)=>{return integration.value?(openBlock(),createBlock(VSheet,{key:0,class:`integration-fields`,"aria-label":unref(t)(`jskit.connectors.configurationFields.ariaLabel`,{provider:definition.value.name})},{default:withCtx(()=>[createVNode(VExpansionPanels,{modelValue:panels.value,"onUpdate:modelValue":_cache[9]||(_cache[9]=$event=>panels.value=$event),multiple:``,variant:`accordion`,disabled:__props.disabled},{default:withCtx(()=>[createVNode(VExpansionPanel,{value:`details`,title:unref(t)(`jskit.connectors.configurationFields.panels.details`)},{default:withCtx(()=>[createVNode(VExpansionPanelText,null,{default:withCtx(()=>[createVNode(VTextField,{label:unref(t)(`jskit.connectors.configurationFields.displayName.label`),"model-value":integration.value.displayName||``,disabled:__props.disabled,placeholder:definition.value.name,"error-messages":errors.value[`${integrationPath.value}.displayName`],"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>editIntegration({displayName:$event||void 0}))},null,8,[`label`,`model-value`,`disabled`,`placeholder`,`error-messages`]),createVNode(VSelect,{label:unref(t)(`jskit.connectors.configurationFields.accountMode.label`),items:modes.value,"model-value":integration.value.accountMode,disabled:__props.disabled,"error-messages":errors.value[`${integrationPath.value}.accountMode`],"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>editIntegration({accountMode:$event}))},null,8,[`label`,`items`,`model-value`,`disabled`,`error-messages`])]),_:1})]),_:1},8,[`title`]),createVNode(VExpansionPanel,{value:`credentials`,title:unref(t)(`jskit.connectors.configurationFields.panels.credentials`)},{default:withCtx(()=>[createVNode(VExpansionPanelText,null,{default:withCtx(()=>[authenticationOptions.value.length>1?(openBlock(),createBlock(VSelect,{key:0,label:unref(t)(`jskit.connectors.configurationFields.authentication.label`),items:authenticationOptions.value,"model-value":integration.value.authentication.method,disabled:__props.disabled,hint:unref(text)(definition.value.authenticationHint),"persistent-hint":Boolean(definition.value.authenticationHint),"error-messages":errors.value[`${integrationPath.value}.authentication.method`],"onUpdate:modelValue":editAuthentication},null,8,[`label`,`items`,`model-value`,`disabled`,`hint`,`persistent-hint`,`error-messages`])):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(visibleSettings.value,field=>{return openBlock(),createElementBlock(Fragment,{key:field.name},[field.searchable?(openBlock(),createBlock(VAutocomplete,{key:0,label:unref(text)(field.label),items:settingItems(field),disabled:__props.disabled,"auto-select-first":``,"model-value":settingValue(field),hint:settingHint(field),"persistent-hint":``,"error-messages":settingErrors(field),"onUpdate:modelValue":$event=>editSetting(field.name,$event)},null,8,[`label`,`items`,`disabled`,`model-value`,`hint`,`error-messages`,`onUpdate:modelValue`])):field.items?(openBlock(),createBlock(VSelect,{key:1,label:unref(text)(field.label),items:settingItems(field),disabled:__props.disabled,"model-value":settingValue(field),hint:settingHint(field),"persistent-hint":``,"error-messages":settingErrors(field),"onUpdate:modelValue":$event=>editSetting(field.name,$event)},null,8,[`label`,`items`,`disabled`,`model-value`,`hint`,`error-messages`,`onUpdate:modelValue`])):(openBlock(),createBlock(VTextField,{key:2,label:unref(text)(field.label),disabled:__props.disabled,placeholder:unref(text)(field.placeholder),"model-value":settingValue(field)??``,hint:settingHint(field),"persistent-hint":``,"error-messages":settingErrors(field),"onUpdate:modelValue":$event=>editSetting(field.name,$event)},null,8,[`label`,`disabled`,`placeholder`,`model-value`,`hint`,`error-messages`,`onUpdate:modelValue`]))],64)}),128)),[`api-key`,`service-account`].includes(integration.value.authentication.method)?renderSlot(_ctx.$slots,`credential`,{reference:integration.value.authentication.secretRef,disabled:__props.disabled},()=>[createVNode(VTextField,{label:credentialReference.value.label,"model-value":integration.value.authentication.secretRef,disabled:__props.disabled,hint:credentialReference.value.hint,"persistent-hint":``,"error-messages":errors.value[`${integrationPath.value}.authentication.secretRef`],"onUpdate:modelValue":editSecretReference},null,8,[`label`,`model-value`,`disabled`,`hint`,`error-messages`])],true,1):integration.value.authentication.method===`oauth2`?(openBlock(),createElementBlock(Fragment,{key:2},[createVNode(VSelect,{label:unref(t)(`jskit.connectors.configurationFields.registration.label`),items:registrationOptions.value,"model-value":registrationId.value,disabled:__props.disabled,"error-messages":errors.value[`${integrationPath.value}.authentication.registrationRef`],"onUpdate:modelValue":_cache[2]||(_cache[2]=$event=>editIntegration({authentication:{...integration.value.authentication,registrationRef:$event}}))},null,8,[`label`,`items`,`model-value`,`disabled`,`error-messages`]),registration.value?.source===`own`?(openBlock(),createElementBlock(Fragment,{key:0},[grantOptions.value.length>1?(openBlock(),createBlock(VSelect,{key:0,label:unref(t)(`jskit.connectors.configurationFields.grantType.label`),items:grantOptions.value,"model-value":grantType.value,disabled:__props.disabled,hint:unref(text)(definition.value.oauthGrantHint),"persistent-hint":Boolean(definition.value.oauthGrantHint),"error-messages":errors.value[`${registrationPath.value}.grantType`],"onUpdate:modelValue":editGrantType},null,8,[`label`,`items`,`model-value`,`disabled`,`hint`,`persistent-hint`,`error-messages`])):createCommentVNode(``,true),createVNode(VTextField,{label:unref(text)(definition.value.clientIdLabel)||unref(t)(`jskit.connectors.configurationFields.clientId.label`),hint:unref(text)(definition.value.clientIdHint),"persistent-hint":Boolean(definition.value.clientIdHint),"model-value":registration.value.clientId,autocomplete:`off`,disabled:__props.disabled,"error-messages":errors.value[`${registrationPath.value}.clientId`],"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>editRegistration(`clientId`,$event))},null,8,[`label`,`hint`,`persistent-hint`,`model-value`,`disabled`,`error-messages`]),registration.value.tokenEndpointAuthMethod!==`none`?renderSlot(_ctx.$slots,`credential`,{reference:registration.value.clientSecretRef,disabled:__props.disabled},()=>[createVNode(VTextField,{label:unref(t)(`jskit.connectors.configurationFields.clientSecretReference.label`),"model-value":registration.value.clientSecretRef,disabled:__props.disabled,hint:clientSecretHint.value,"persistent-hint":``,"error-messages":errors.value[`${registrationPath.value}.clientSecretRef`],"onUpdate:modelValue":_cache[4]||(_cache[4]=$event=>editRegistration(`clientSecretRef`,$event))},null,8,[`label`,`model-value`,`disabled`,`hint`,`error-messages`])],true,1):createCommentVNode(``,true),grantType.value===`authorization_code`?(openBlock(),createBlock(VTextField,{key:2,hint:unref(t)(`jskit.connectors.configurationFields.callbackUrlReference.hint`),"persistent-hint":``,class:`mt-4`,label:unref(t)(`jskit.connectors.configurationFields.callbackUrlReference.label`),"model-value":registration.value.callbackUrlRef,disabled:__props.disabled,"error-messages":errors.value[`${registrationPath.value}.callbackUrlRef`],"onUpdate:modelValue":_cache[5]||(_cache[5]=$event=>editRegistration(`callbackUrlRef`,$event))},null,8,[`hint`,`label`,`model-value`,`disabled`,`error-messages`])):createCommentVNode(``,true),__props.callbackUrl&&grantType.value===`authorization_code`?(openBlock(),createBlock(VTextField,{key:3,label:unref(t)(`jskit.connectors.configurationFields.callbackUrl.label`),"model-value":__props.callbackUrl,readonly:``},null,8,[`label`,`model-value`])):createCommentVNode(``,true)],64)):createCommentVNode(``,true)],64)):createCommentVNode(``,true)]),_:3})]),_:3},8,[`title`]),visibleScopes.value.length&&(definition.value.scopes.length||definition.value.permissionsHint||[`oauth2`,`service-account`].includes(integration.value.authentication.method))?(openBlock(),createBlock(VExpansionPanel,{key:0,value:`permissions`,title:unref(t)(`jskit.connectors.configurationFields.panels.permissions`)},{default:withCtx(()=>[createVNode(VExpansionPanelText,null,{default:withCtx(()=>[createBaseVNode(`p`,_hoisted_1$11,toDisplayString(unref(text)(definition.value.permissionsHint)||unref(t)(`jskit.connectors.configurationFields.permissions.hint`)),1),(openBlock(true),createElementBlock(Fragment,null,renderList(visibleScopes.value,permission=>{return openBlock(),createBlock(VCheckbox,{key:permission.value,label:unref(text)(permission.label),value:permission.value,"model-value":integration.value.scopes,disabled:__props.disabled||permission.required,"hide-details":``,"onUpdate:modelValue":_cache[6]||(_cache[6]=$event=>editIntegration({scopes:$event}))},null,8,[`label`,`value`,`model-value`,`disabled`])}),128)),errors.value[`${integrationPath.value}.scopes`]?(openBlock(),createElementBlock(`p`,_hoisted_2$8,toDisplayString(errors.value[`${integrationPath.value}.scopes`]),1)):createCommentVNode(``,true)]),_:1})]),_:1},8,[`title`])):createCommentVNode(``,true),definition.value.assistantActions?.length?(openBlock(),createBlock(VExpansionPanel,{key:1,value:`assistant`,title:unref(t)(`jskit.connectors.configurationFields.panels.assistant`)},{default:withCtx(()=>[createVNode(VExpansionPanelText,null,{default:withCtx(()=>[createBaseVNode(`p`,_hoisted_3$7,toDisplayString(unref(t)(`jskit.connectors.configurationFields.assistant.hint`)),1),createVNode(VSwitch,{label:unref(t)(`jskit.connectors.configurationFields.assistant.enabled.label`),"model-value":integration.value.assistantPolicy?.enabled??true,disabled:__props.disabled,"error-messages":errors.value[`${integrationPath.value}.assistantPolicy.enabled`],"onUpdate:modelValue":_cache[7]||(_cache[7]=$event=>editAssistantPolicy({enabled:$event}))},null,8,[`label`,`model-value`,`disabled`,`error-messages`]),createVNode(VSelect,{label:unref(t)(`jskit.connectors.configurationFields.assistant.defaultPermission.label`),items:assistantPermissions.value,"model-value":integration.value.assistantPolicy?.defaultPermission||`ask`,disabled:__props.disabled||integration.value.assistantPolicy?.enabled===false,hint:unref(t)(`jskit.connectors.configurationFields.assistant.defaultPermission.hint`),"persistent-hint":``,"error-messages":errors.value[`${integrationPath.value}.assistantPolicy.defaultPermission`],"onUpdate:modelValue":_cache[8]||(_cache[8]=$event=>editAssistantPolicy({defaultPermission:$event,actions:{}}))},null,8,[`label`,`items`,`model-value`,`disabled`,`hint`,`error-messages`]),(openBlock(true),createElementBlock(Fragment,null,renderList(definition.value.assistantActions,action=>{return openBlock(),createBlock(VSelect,{key:action.value,label:unref(text)(action.label),items:assistantPermissions.value,"model-value":integration.value.assistantPolicy?.actions?.[action.value]||integration.value.assistantPolicy?.defaultPermission||`ask`,disabled:__props.disabled||integration.value.assistantPolicy?.enabled===false,"error-messages":errors.value[`${integrationPath.value}.assistantPolicy.actions.${action.value}`],"onUpdate:modelValue":$event=>editAssistantPolicy({actions:{...integration.value.assistantPolicy?.actions,[action.value]:$event}})},null,8,[`label`,`items`,`model-value`,`disabled`,`error-messages`,`onUpdate:modelValue`])}),128))]),_:1})]),_:1},8,[`title`])):createCommentVNode(``,true)]),_:3},8,[`modelValue`,`disabled`]),renderSlot(_ctx.$slots,`access`,{integration:integration.value},void 0,true)]),_:3},8,[`aria-label`])):createCommentVNode(``,true)}}};var IntegrationConfigurationFields_default=_plugin_vue_export_helper_default(_sfc_main$22,[[`__scopeId`,`data-v-9f5cbb3b`]]);var client_exports$6=__exportAll({IntegrationConfigurationFields:()=>IntegrationConfigurationFields_default});var _hoisted_1$10={class:`crud-screen crud-screen--operator crud-add-edit-form d-flex flex-column ga-4`};var _hoisted_2$7={class:`crud-add-edit-form__actions`};var _hoisted_3$6={key:0,class:`crud-add-edit-form__state`};var _hoisted_4$4={class:`text-body-2 text-medium-emphasis mb-4`};var _hoisted_5$4={key:1,class:`pa-4`};var _sfc_main$21={__name:`CrudAddEditScreen`,props:{screen:{type:Object,required:true},resolveLookupItems:{type:Function,default:null},resolveLookupLoading:{type:Function,default:null},resolveLookupSearch:{type:Function,default:null},setLookupSearch:{type:Function,default:null}},setup(__props){const props=__props;const{t,text}=useJskitText();const formRuntime=computed(()=>props.screen?.formRuntime||{});const addEdit=computed(()=>props.screen?.addEdit||formRuntime.value?.addEdit||{});const formState=computed(()=>props.screen?.formState||formRuntime.value?.form||{});const mode=computed(()=>String(unref(props.screen?.mode)||`new`).trim()||`new`);const saveLabel=computed(()=>String(text(unref(props.screen?.saveLabel))||``).trim()||t(`jskit.http.actions.save`));const cancelTo=computed(()=>unref(props.screen?.cancelTo)||``);function resolveFieldErrors(fieldKey){if(typeof props.screen?.resolveFieldErrors===`function`)return props.screen.resolveFieldErrors(fieldKey);if(typeof formRuntime.value?.resolveFieldErrors===`function`)return formRuntime.value.resolveFieldErrors(fieldKey);return[]}function resolveCancelTo(target=cancelTo.value){if(typeof props.screen?.resolveCancelTo===`function`)return props.screen.resolveCancelTo(target);return target||``}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1$10,[createBaseVNode(`div`,_hoisted_2$7,[renderSlot(_ctx.$slots,`actions`,{screen:__props.screen,mode:mode.value,formRuntime:formRuntime.value,formState:formState.value,addEdit:addEdit.value,saveLabel:saveLabel.value,cancelTo:resolveCancelTo(),submit:addEdit.value.submit},()=>[cancelTo.value?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`outlined`,to:resolveCancelTo(cancelTo.value)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.cancel`)),1)]),_:1},8,[`to`])):createCommentVNode(``,true),createVNode(VBtn,{color:`primary`,variant:`flat`,disabled:addEdit.value.isSubmitDisabled,onClick:addEdit.value.submit},{default:withCtx(()=>[createTextVNode(toDisplayString(addEdit.value.isSaving?unref(t)(`jskit.http.actions.saving`):saveLabel.value),1)]),_:1},8,[`disabled`,`onClick`])],true)]),createVNode(VSheet,{rounded:`lg`,border:``,class:`crud-add-edit-form__panel`},{default:withCtx(()=>[addEdit.value.loadError?(openBlock(),createElementBlock(`div`,_hoisted_3$6,[createBaseVNode(`p`,_hoisted_4$4,toDisplayString(addEdit.value.loadError),1),addEdit.value.canRetryLoad?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`tonal`,disabled:addEdit.value.isFetching,onClick:addEdit.value.refresh},{default:withCtx(()=>[createTextVNode(toDisplayString(addEdit.value.isFetching?unref(t)(`jskit.http.actions.retrying`):unref(t)(`jskit.http.actions.retry`)),1)]),_:1},8,[`disabled`,`onClick`])):createCommentVNode(``,true)])):formRuntime.value.showFormSkeleton?(openBlock(),createElementBlock(`div`,_hoisted_5$4,[createVNode(VSkeletonLoader,{type:`text@2, article`})])):(openBlock(),createBlock(VForm,{key:2,class:`pa-4`,onSubmit:withModifiers(addEdit.value.submit,[`prevent`]),novalidate:``},{default:withCtx(()=>[createVNode(VRow,{class:`crud-add-edit-form__fields`},{default:withCtx(()=>[renderSlot(_ctx.$slots,`fields`,{mode:mode.value,formRuntime:formRuntime.value,formState:formState.value,addEdit:addEdit.value,resolveFieldErrors,resolveLookupItems:__props.resolveLookupItems,resolveLookupLoading:__props.resolveLookupLoading,resolveLookupSearch:__props.resolveLookupSearch,setLookupSearch:__props.setLookupSearch},void 0,true)]),_:3})]),_:3},8,[`onSubmit`]))]),_:3})])}}};var CrudAddEditScreen_default=_plugin_vue_export_helper_default(_sfc_main$21,[[`__scopeId`,`data-v-18c61c79`]]);var _sfc_main$20={__name:`CrudDeleteAction`,props:{action:{type:Object,required:true},resourceSingularTitle:{type:String,default:``}},setup(__props){const props=__props;const{t,text}=useJskitText();const resourceLabel=computed(()=>String(text(props.resourceSingularTitle)||``).trim()||t(`jskit.http.crud.record`));const componentId=useId();const titleId=`${componentId}-delete-title`;const descriptionId=`${componentId}-delete-description`;function closeDialog(){props.action.cancel()}function handleDialogModelUpdate(isOpen){if(!isOpen)closeDialog()}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(VBtn,{color:`error`,variant:`tonal`,"prepend-icon":unref(mdiDeleteOutline),"min-height":`48`,disabled:!__props.action.canDelete,onClick:__props.action.request},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.crud.delete.button`,{resource:resourceLabel.value})),1)]),_:1},8,[`prepend-icon`,`disabled`,`onClick`]),createVNode(VDialog,{"model-value":__props.action.isOpen,"max-width":`32rem`,role:`alertdialog`,"aria-modal":`true`,"aria-labelledby":titleId,"aria-describedby":descriptionId,persistent:__props.action.isDeleting,"onUpdate:modelValue":handleDialogModelUpdate},{default:withCtx(()=>[createVNode(VCard,null,{default:withCtx(()=>[createVNode(VCardTitle,{id:titleId},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.crud.delete.title`,{resource:resourceLabel.value})),1)]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[createBaseVNode(`p`,{id:descriptionId,class:`mb-0`},toDisplayString(unref(t)(`jskit.http.crud.delete.description`,{resource:resourceLabel.value.toLowerCase()})),1),__props.action.error?(openBlock(),createBlock(VAlert,{key:0,class:`mt-4`,type:`error`,variant:`tonal`},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.action.error),1)]),_:1})):createCommentVNode(``,true)]),_:1}),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VSpacer),createVNode(VBtn,{autofocus:``,variant:`text`,disabled:__props.action.isDeleting,onClick:closeDialog},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.cancel`)),1)]),_:1},8,[`disabled`]),createVNode(VBtn,{color:`error`,variant:`flat`,disabled:!__props.action.canDelete,onClick:__props.action.confirm},{default:withCtx(()=>[createTextVNode(toDisplayString(__props.action.isDeleting?unref(t)(`jskit.http.actions.deleting`):unref(t)(`jskit.http.actions.delete`)),1)]),_:1},8,[`disabled`,`onClick`])]),_:1})]),_:1})]),_:1},8,[`model-value`,`persistent`])],64)}}};var _hoisted_1$9={key:0,class:`crud-list-bulk-action-surface`};var _hoisted_2$6={class:`crud-list-bulk-action-surface__summary`};var _hoisted_3$5={class:`crud-list-bulk-action-surface__copy`};var _hoisted_4$3={class:`text-overline text-medium-emphasis`};var _hoisted_5$3={key:0,class:`crud-list-bulk-action-surface__actions`};var _sfc_main$19={__name:`CrudListBulkActionSurface`,props:{runtime:{type:Object,default:null},title:{type:String,default:void 0}},setup(__props){const props=__props;const{t,text}=useJskitText();const resolvedTitle=computed(()=>props.title===void 0?t(`jskit.http.crud.bulk.selection`):text(props.title));const{smAndDown:isCompactLayout}=useDisplay();const actions=computed(()=>Array.isArray(props.runtime?.actions)?props.runtime.actions:[]);const selectedCount=computed(()=>Number(props.runtime?.selectedCount?.value||0));const shouldRender=computed(()=>Boolean(props.runtime?.hasActions?.value)&&Boolean(props.runtime?.hasSelection?.value)&&selectedCount.value>0);function clearSelection(){props.runtime?.clearSelection?.()}function execute(action={}){props.runtime?.execute?.(action)}function isActionDisabled(action={}){return Boolean(props.runtime?.isActionDisabled?.(action))}function isActionExecuting(action={}){return Boolean(props.runtime?.isActionExecuting?.(action))}function actionLabel(action={}){const label=text(action.label);return isActionExecuting(action)?t(`jskit.http.actions.running`,{label}):label}return(_ctx,_cache)=>{return shouldRender.value?(openBlock(),createElementBlock(`section`,_hoisted_1$9,[createBaseVNode(`div`,_hoisted_2$6,[createBaseVNode(`div`,_hoisted_3$5,[createBaseVNode(`span`,_hoisted_4$3,toDisplayString(resolvedTitle.value),1),createBaseVNode(`strong`,null,toDisplayString(unref(t)(`jskit.http.crud.bulk.selected`,{count:selectedCount.value})),1)]),createVNode(VBtn,{size:`small`,variant:`text`,onClick:clearSelection},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.clear`)),1)]),_:1})]),!unref(isCompactLayout)?(openBlock(),createElementBlock(`div`,_hoisted_5$3,[(openBlock(true),createElementBlock(Fragment,null,renderList(actions.value,action=>{return openBlock(),createBlock(VBtn,{key:action.key,color:action.color,variant:action.variant,"prepend-icon":action.icon||void 0,disabled:isActionDisabled(action),onClick:$event=>execute(action)},{default:withCtx(()=>[createTextVNode(toDisplayString(actionLabel(action)),1)]),_:2},1032,[`color`,`variant`,`prepend-icon`,`disabled`,`onClick`])}),128))])):(openBlock(),createBlock(VMenu,{key:1,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{color:`primary`,variant:`tonal`}),{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.crud.bulk.actions`)),1)]),_:1},16)]),default:withCtx(()=>[createVNode(VList,{density:`compact`,"min-width":`180`},{default:withCtx(()=>[(openBlock(true),createElementBlock(Fragment,null,renderList(actions.value,action=>{return openBlock(),createBlock(VListItem,{key:action.key,title:actionLabel(action),"prepend-icon":action.icon||void 0,disabled:isActionDisabled(action),onClick:$event=>execute(action)},null,8,[`title`,`prepend-icon`,`disabled`,`onClick`])}),128))]),_:1})]),_:1}))])):createCommentVNode(``,true)}}};var CrudListBulkActionSurface_default=_plugin_vue_export_helper_default(_sfc_main$19,[[`__scopeId`,`data-v-3e18c22f`]]);var{t:t$18,text:text$4,formatDate}=useJskitText();var DATE_ONLY_PATTERN=/^(\d{4})-(\d{2})-(\d{2})$/u;var DATE_DISPLAY_OPTIONS=Object.freeze({year:`numeric`,month:`short`,day:`numeric`});function parseDateOnlyValue(value=``){const match=DATE_ONLY_PATTERN.exec(String(value||``).trim());if(!match)return null;const year=Number(match[1]);const month=Number(match[2]);const day=Number(match[3]);const date=new Date(0);date.setHours(12,0,0,0);date.setFullYear(year,month-1,day);if(date.getFullYear()!==year||date.getMonth()!==month-1||date.getDate()!==day)return null;return date}function formatDateOnlyValue(value=null){const source=Array.isArray(value)?value[0]:value;const date=source instanceof Date?source:parseDateOnlyValue(source);if(!(date instanceof Date)||Number.isNaN(date.getTime()))return``;const year=date.getFullYear();if(year<0||year>9999)return``;return[String(year).padStart(4,`0`),String(date.getMonth()+1).padStart(2,`0`),String(date.getDate()).padStart(2,`0`)].join(`-`)}function formatDateOnlyDisplay(value=``,{locale=void 0}={}){const date=parseDateOnlyValue(value);if(!date)return``;try{return locale?new Intl.DateTimeFormat(locale,DATE_DISPLAY_OPTIONS).format(date):formatDate(date,DATE_DISPLAY_OPTIONS)}catch{return formatDateOnlyValue(date)}}var _sfc_main$18=Object.assign({inheritAttrs:false},{__name:`CrudListDateFilterControl`,props:{modelValue:{type:String,default:``},label:{type:String,required:true},controlId:{type:String,default:``},placeholder:{type:String,default:void 0},disabled:{type:Boolean,default:false},readonly:{type:Boolean,default:false}},emits:[`update:modelValue`],setup(__props,{emit:__emit}){const props=__props;const emit=__emit;const{t}=useJskitText();const resolvedPlaceholder=computed(()=>props.placeholder===void 0?t(`jskit.http.crud.filters.selectDate`):props.placeholder);const attrs=useAttrs();const{current:currentLocale}=useLocale();const generatedId=useId();const menuOpen=ref(false);const textFieldRef=ref(null);const resolvedControlId=computed(()=>props.controlId||`crud-list-date-${generatedId}`);const pickerId=computed(()=>`${resolvedControlId.value}-picker`);const pickerValue=computed(()=>parseDateOnlyValue(props.modelValue));const displayValue=computed(()=>formatDateOnlyDisplay(props.modelValue,{locale:currentLocale?.value}));const pickerTitle=computed(()=>t(`jskit.http.crud.filters.calendar`,{label:props.label}));function restoreFocus(){nextTick$1(()=>{textFieldRef.value?.focus?.()})}function openMenu(){if(props.disabled||props.readonly)return;menuOpen.value=true}function closeMenu(){menuOpen.value=false;restoreFocus()}function clearDate(){if(props.disabled||props.readonly)return;emit(`update:modelValue`,``);closeMenu()}function selectDate(value){const nextValue=formatDateOnlyValue(value);if(!nextValue)return;emit(`update:modelValue`,nextValue);closeMenu()}function handleActivatorKeydown(event){if(![`Enter`,` `,`ArrowDown`].includes(event.key))return;event.preventDefault();openMenu()}return(_ctx,_cache)=>{return openBlock(),createBlock(VMenu,{modelValue:menuOpen.value,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>menuOpen.value=$event),"close-on-content-click":false,"open-on-click":false,location:`bottom start`,offset:6,"min-width":`0`},{activator:withCtx(({props:activatorProps})=>[createVNode(VTextField,mergeProps({...unref(attrs),...activatorProps},{id:resolvedControlId.value,ref_key:`textFieldRef`,ref:textFieldRef,"model-value":displayValue.value,label:__props.label,placeholder:resolvedPlaceholder.value,"aria-label":__props.label,"aria-controls":pickerId.value,"aria-expanded":String(menuOpen.value),"aria-haspopup":`dialog`,"data-date-filter-control":resolvedControlId.value,"append-inner-icon":`$calendar`,disabled:__props.disabled,clearable:Boolean(__props.modelValue)&&!__props.disabled&&!__props.readonly,"persistent-clear":``,"persistent-placeholder":``,readonly:``,inputmode:`none`,variant:`outlined`,density:`comfortable`,"hide-details":`auto`,class:`crud-list-date-filter-control`,"onClick:control":openMenu,"onClick:appendInner":openMenu,"onClick:clear":withModifiers(clearDate,[`stop`]),onKeydown:handleActivatorKeydown}),null,16,[`id`,`model-value`,`label`,`placeholder`,`aria-label`,`aria-controls`,`aria-expanded`,`data-date-filter-control`,`disabled`,`clearable`])]),default:withCtx(()=>[createVNode(VCard,{id:pickerId.value,"aria-label":pickerTitle.value,role:`dialog`,class:`crud-list-date-filter-control__picker`,onKeydown:withKeys(withModifiers(closeMenu,[`stop`,`prevent`]),[`esc`])},{default:withCtx(()=>[createVNode(VDatePicker,{"model-value":pickerValue.value,title:pickerTitle.value,header:__props.label,disabled:__props.disabled||__props.readonly,color:`primary`,"show-adjacent-months":``,width:`100%`,"onUpdate:modelValue":selectDate},null,8,[`model-value`,`title`,`header`,`disabled`]),createVNode(VDivider),createVNode(VCardActions,null,{default:withCtx(()=>[createVNode(VBtn,{variant:`text`,disabled:__props.disabled||__props.readonly||!__props.modelValue,onClick:clearDate},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.clear`)),1)]),_:1},8,[`disabled`]),createVNode(VSpacer),createVNode(VBtn,{color:`primary`,variant:`text`,onClick:closeMenu},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.close`)),1)]),_:1})]),_:1})]),_:1},8,[`id`,`aria-label`,`onKeydown`])]),_:1},8,[`modelValue`])}}});var CrudListDateFilterControl_default=_plugin_vue_export_helper_default(_sfc_main$18,[[`__scopeId`,`data-v-20870fa1`]]);var _hoisted_1$8=[`aria-label`,`data-filter-key`];var _hoisted_2$5={key:5,class:`crud-list-filter-surface__range`};var _sfc_main$17={__name:`CrudListFilterControls`,props:{filters:{type:Array,default:()=>[]},runtime:{type:Object,default:null},stacked:{type:Boolean,default:false}},setup(__props){const props=__props;const{t,text}=useJskitText();const runtimeValues=computed(()=>props.runtime?.values||{});function optionItems(filter={}){return Array.isArray(filter.options)?filter.options:[]}function filterLabel(filter={},key=``,params={}){const label=text(filter.label);return key?t(key,{...params,label}):label}function placeholder(filter={},fallbackKey=``){return String(text(filter?.ui?.placeholder)||(fallbackKey?t(fallbackKey):``)).trim()}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,{class:normalizeClass([`crud-list-filter-surface__controls`,{"crud-list-filter-surface__controls--stacked":__props.stacked}])},[(openBlock(true),createElementBlock(Fragment,null,renderList(__props.filters,filter=>{return openBlock(),createElementBlock(Fragment,{key:filter.key},[filter.type===`flag`?(openBlock(),createBlock(VSwitch,{key:0,modelValue:runtimeValues.value[filter.key],"onUpdate:modelValue":$event=>runtimeValues.value[filter.key]=$event,label:filterLabel(filter),color:`primary`,density:`comfortable`,"hide-details":``,class:`crud-list-filter-surface__control`},null,8,[`modelValue`,`onUpdate:modelValue`,`label`])):filter.type===`enum`||filter.type===`enumMany`||filter.type===`presence`?(openBlock(),createBlock(VSelect,{key:1,modelValue:runtimeValues.value[filter.key],"onUpdate:modelValue":$event=>runtimeValues.value[filter.key]=$event,items:optionItems(filter),label:filterLabel(filter),placeholder:placeholder(filter),multiple:filter.type===`enumMany`,chips:filter.type===`enumMany`,"closable-chips":filter.type===`enumMany`,clearable:``,"item-title":`label`,"item-value":`value`,variant:`outlined`,density:`comfortable`,"hide-details":`auto`,class:`crud-list-filter-surface__control`},null,8,[`modelValue`,`onUpdate:modelValue`,`items`,`label`,`placeholder`,`multiple`,`chips`,`closable-chips`])):filter.type===`recordIdMany`?(openBlock(),createBlock(VCombobox,{key:2,modelValue:runtimeValues.value[filter.key],"onUpdate:modelValue":$event=>runtimeValues.value[filter.key]=$event,label:filterLabel(filter),placeholder:placeholder(filter,`jskit.http.crud.filters.enterIds`),multiple:``,chips:``,"closable-chips":``,clearable:``,variant:`outlined`,density:`comfortable`,"hide-details":`auto`,class:`crud-list-filter-surface__control`},null,8,[`modelValue`,`onUpdate:modelValue`,`label`,`placeholder`])):filter.type===`recordId`?(openBlock(),createBlock(VTextField,{key:3,modelValue:runtimeValues.value[filter.key],"onUpdate:modelValue":$event=>runtimeValues.value[filter.key]=$event,label:filterLabel(filter),placeholder:placeholder(filter,`jskit.http.crud.filters.enterId`),clearable:``,variant:`outlined`,density:`comfortable`,"hide-details":`auto`,class:`crud-list-filter-surface__control`},null,8,[`modelValue`,`onUpdate:modelValue`,`label`,`placeholder`])):filter.type===`dateRange`?(openBlock(),createElementBlock(`div`,{key:4,class:`crud-list-filter-surface__range crud-list-filter-surface__range--date`,role:`group`,"aria-label":filterLabel(filter,`jskit.http.crud.filters.dateRange`),"data-filter-key":filter.key,"data-filter-type":`date-range`},[createVNode(CrudListDateFilterControl_default,{modelValue:runtimeValues.value[filter.key].from,"onUpdate:modelValue":$event=>runtimeValues.value[filter.key].from=$event,label:filterLabel(filter,`jskit.http.crud.filters.rangeFrom`),"control-id":`${filter.key}-from`,placeholder:placeholder(filter,`jskit.http.crud.filters.selectStartDate`)},null,8,[`modelValue`,`onUpdate:modelValue`,`label`,`control-id`,`placeholder`]),createVNode(CrudListDateFilterControl_default,{modelValue:runtimeValues.value[filter.key].to,"onUpdate:modelValue":$event=>runtimeValues.value[filter.key].to=$event,label:filterLabel(filter,`jskit.http.crud.filters.rangeTo`),"control-id":`${filter.key}-to`,placeholder:placeholder(filter,`jskit.http.crud.filters.selectEndDate`)},null,8,[`modelValue`,`onUpdate:modelValue`,`label`,`control-id`,`placeholder`])],8,_hoisted_1$8)):filter.type===`numberRange`?(openBlock(),createElementBlock(`div`,_hoisted_2$5,[createVNode(VTextField,{modelValue:runtimeValues.value[filter.key].min,"onUpdate:modelValue":$event=>runtimeValues.value[filter.key].min=$event,label:filterLabel(filter,`jskit.http.crud.filters.rangeMin`),type:`number`,variant:`outlined`,density:`comfortable`,"hide-details":`auto`},null,8,[`modelValue`,`onUpdate:modelValue`,`label`]),createVNode(VTextField,{modelValue:runtimeValues.value[filter.key].max,"onUpdate:modelValue":$event=>runtimeValues.value[filter.key].max=$event,label:filterLabel(filter,`jskit.http.crud.filters.rangeMax`),type:`number`,variant:`outlined`,density:`comfortable`,"hide-details":`auto`},null,8,[`modelValue`,`onUpdate:modelValue`,`label`])])):filter.type===`date`?(openBlock(),createBlock(CrudListDateFilterControl_default,{key:6,modelValue:runtimeValues.value[filter.key],"onUpdate:modelValue":$event=>runtimeValues.value[filter.key]=$event,label:filterLabel(filter),"control-id":filter.key,placeholder:placeholder(filter,`jskit.http.crud.filters.selectDate`),class:`crud-list-filter-surface__control`},null,8,[`modelValue`,`onUpdate:modelValue`,`label`,`control-id`,`placeholder`])):createCommentVNode(``,true)],64)}),128))],2)}}};var CrudListFilterControls_default=_plugin_vue_export_helper_default(_sfc_main$17,[[`__scopeId`,`data-v-a473af0a`]]);var _hoisted_1$7={key:0,class:`crud-list-filter-surface`};var _hoisted_2$4={class:`crud-list-filter-surface__summary`};var _hoisted_3$4={key:1,class:`crud-list-filter-surface__chips`};var _sfc_main$16={__name:`CrudListFilterSurface`,props:{filters:{type:Object,default:()=>({})},runtime:{type:Object,default:null},title:{type:String,default:void 0}},setup(__props){const props=__props;const{t,text}=useJskitText();const resolvedTitle=computed(()=>props.title===void 0?t(`jskit.http.crud.filters.title`):text(props.title));const{smAndDown:isCompactLayout}=useDisplay();const sheetOpen=ref(false);const filterEntries=computed(()=>Object.values(props.filters&&typeof props.filters===`object`&&!Array.isArray(props.filters)?props.filters:{}).filter(filter=>filter?.key&&filter?.type));const activeChips=computed(()=>Array.isArray(props.runtime?.activeChips?.value)?props.runtime.activeChips.value:[]);const hasActiveFilters=computed(()=>Boolean(props.runtime?.hasActiveFilters?.value));const shouldRender=computed(()=>filterEntries.value.length>0&&Boolean(props.runtime?.values));function clearChip(chip={}){props.runtime?.clearChip?.(chip)}function clearFilters(){props.runtime?.clearFilters?.()}return(_ctx,_cache)=>{return shouldRender.value?(openBlock(),createElementBlock(`section`,_hoisted_1$7,[createBaseVNode(`div`,_hoisted_2$4,[unref(isCompactLayout)?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`tonal`,class:`crud-list-filter-surface__open`,onClick:_cache[0]||(_cache[0]=$event=>sheetOpen.value=true)},{default:withCtx(()=>[createTextVNode(toDisplayString(resolvedTitle.value)+` `,1),activeChips.value.length>0?(openBlock(),createBlock(VChip,{key:0,class:`ml-2`,size:`x-small`,color:`primary`,variant:`flat`},{default:withCtx(()=>[createTextVNode(toDisplayString(activeChips.value.length),1)]),_:1})):createCommentVNode(``,true)]),_:1})):createCommentVNode(``,true),hasActiveFilters.value?(openBlock(),createElementBlock(`div`,_hoisted_3$4,[(openBlock(true),createElementBlock(Fragment,null,renderList(activeChips.value,chip=>{return openBlock(),createBlock(VChip,{key:chip.id,closable:``,"close-label":unref(t)(`jskit.http.actions.close`),size:`small`,variant:`tonal`,"onClick:close":$event=>clearChip(chip)},{default:withCtx(()=>[createTextVNode(toDisplayString(chip.label),1)]),_:2},1032,[`close-label`,`onClick:close`])}),128)),createVNode(VBtn,{size:`small`,variant:`text`,onClick:clearFilters},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.clearAll`)),1)]),_:1})])):createCommentVNode(``,true)]),!unref(isCompactLayout)?(openBlock(),createBlock(VSheet,{key:0,rounded:`lg`,border:``,class:`crud-list-filter-surface__panel`},{default:withCtx(()=>[createVNode(CrudListFilterControls_default,{filters:filterEntries.value,runtime:__props.runtime},null,8,[`filters`,`runtime`])]),_:1})):createCommentVNode(``,true),createVNode(VDialog,{modelValue:sheetOpen.value,"onUpdate:modelValue":_cache[3]||(_cache[3]=$event=>sheetOpen.value=$event),"max-width":`640`,location:`bottom`},{default:withCtx(()=>[createVNode(VCard,{rounded:`lg`,class:`crud-list-filter-surface__sheet`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`d-flex align-center justify-space-between`},{default:withCtx(()=>[createBaseVNode(`span`,null,toDisplayString(resolvedTitle.value),1),createVNode(VBtn,{variant:`text`,onClick:_cache[1]||(_cache[1]=$event=>sheetOpen.value=false)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.close`)),1)]),_:1})]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[createVNode(CrudListFilterControls_default,{filters:filterEntries.value,runtime:__props.runtime,stacked:``},null,8,[`filters`,`runtime`])]),_:1}),createVNode(VCardActions,{class:`justify-space-between`},{default:withCtx(()=>[createVNode(VBtn,{variant:`text`,onClick:clearFilters},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.clearAll`)),1)]),_:1}),createVNode(VBtn,{color:`primary`,variant:`flat`,onClick:_cache[2]||(_cache[2]=$event=>sheetOpen.value=false)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.apply`)),1)]),_:1})]),_:1})]),_:1})]),_:1},8,[`modelValue`])])):createCommentVNode(``,true)}}};var CrudListFilterSurface_default=_plugin_vue_export_helper_default(_sfc_main$16,[[`__scopeId`,`data-v-701eaa84`]]);var _sfc_main$15={__name:`CrudListRecordActionMenu`,props:{record:{type:Object,default:()=>({})},index:{type:Number,default:0},rowActions:{type:Object,default:null},viewLocation:{type:Object,default:null},editLocation:{type:Object,default:null},showView:{type:Boolean,default:false},showEdit:{type:Boolean,default:false},buttonLabel:{type:String,default:void 0},buttonVariant:{type:String,default:`text`},buttonSize:{type:String,default:`small`}},setup(__props){const props=__props;const{t,text}=useJskitText();const resolvedButtonLabel=computed(()=>props.buttonLabel===void 0?t(`jskit.http.actions.actions`):text(props.buttonLabel));const visibleRowActions=computed(()=>{if(typeof props.rowActions?.visibleActionsFor!==`function`)return[];return props.rowActions.visibleActionsFor(props.record,props.index)});const hasViewAction=computed(()=>Boolean(props.showView&&props.viewLocation));const hasEditAction=computed(()=>Boolean(props.showEdit&&props.editLocation));const hasActions=computed(()=>hasViewAction.value||hasEditAction.value||visibleRowActions.value.length>0);function isRowActionLoading(action={}){return typeof props.rowActions?.isActionLoading===`function`&&props.rowActions.isActionLoading(action,props.record,props.index)}function rowActionLabel(action={}){const label=text(action.label);return isRowActionLoading(action)?t(`jskit.http.actions.running`,{label}):label}function isRowActionDisabled(action={}){return typeof props.rowActions?.isActionDisabled!==`function`||props.rowActions.isActionDisabled(action,props.record,props.index)}function runRowAction(action={}){if(typeof props.rowActions?.execute!==`function`)return;props.rowActions.execute(action,props.record,props.index)}return(_ctx,_cache)=>{return hasActions.value?(openBlock(),createBlock(VMenu,{key:0,location:`bottom end`},{activator:withCtx(({props:menuProps})=>[createVNode(VBtn,mergeProps(menuProps,{variant:__props.buttonVariant,size:__props.buttonSize}),{default:withCtx(()=>[createTextVNode(toDisplayString(resolvedButtonLabel.value),1)]),_:1},16,[`variant`,`size`])]),default:withCtx(()=>[createVNode(VList,{density:`compact`,"min-width":`150`},{default:withCtx(()=>[hasViewAction.value?(openBlock(),createBlock(VListItem,{key:0,title:unref(t)(`jskit.http.actions.open`),to:__props.viewLocation},null,8,[`title`,`to`])):createCommentVNode(``,true),hasEditAction.value?(openBlock(),createBlock(VListItem,{key:1,title:unref(t)(`jskit.http.actions.edit`),to:__props.editLocation},null,8,[`title`,`to`])):createCommentVNode(``,true),(hasViewAction.value||hasEditAction.value)&&visibleRowActions.value.length>0?(openBlock(),createBlock(VDivider,{key:2})):createCommentVNode(``,true),(openBlock(true),createElementBlock(Fragment,null,renderList(visibleRowActions.value,action=>{return openBlock(),createBlock(VListItem,{key:action.key,title:rowActionLabel(action),"base-color":action.color,disabled:isRowActionDisabled(action),onClick:$event=>runRowAction(action)},createSlots({_:2},[action.icon?{name:`prepend`,fn:withCtx(()=>[createVNode(VIcon,{icon:action.icon},null,8,[`icon`])]),key:`0`}:void 0]),1032,[`title`,`base-color`,`disabled`,`onClick`])}),128))]),_:1})]),_:1})):createCommentVNode(``,true)}}};var _hoisted_1$6={class:`crud-screen crud-screen--operator crud-list-element d-flex flex-column ga-4`};var _hoisted_2$3={class:`crud-list-actions`};var _hoisted_3$3={class:`crud-list-toolbar`};var _hoisted_4$2={key:0,class:`pa-4`};var _hoisted_5$2={key:0,class:`crud-list-state`};var _hoisted_6$2={class:`text-body-2 text-medium-emphasis mb-4`};var _hoisted_7$2={key:1,class:`crud-list-state`};var _hoisted_8$2={class:`text-body-2 text-medium-emphasis mb-4`};var _hoisted_9={class:`crud-list-cards`};var _hoisted_10={class:`crud-list-card__header`};var _hoisted_11={class:`min-w-0`};var _hoisted_12={class:`crud-list-card__title`};var _hoisted_13={class:`text-caption text-medium-emphasis`};var _hoisted_14={class:`crud-list-card__fields`};var _hoisted_15={class:`crud-list-table`};var _hoisted_16={key:0,class:`crud-list-table__select`};var _hoisted_17={key:1,class:`text-right`};var _hoisted_18={key:2,class:`text-right`};var _hoisted_19={key:3,class:`text-right`};var _hoisted_20={key:0,class:`crud-list-table__select`};var _hoisted_21={key:1,class:`text-right`};var _hoisted_22={key:2,class:`text-right`};var _hoisted_23={key:3,class:`text-right`};var _hoisted_24={key:3,class:`d-flex justify-center pa-4`};var _sfc_main$14={__name:`CrudListScreen`,props:{screen:{type:Object,required:true},createLabel:{type:String,default:void 0},loadErrorBody:{type:String,default:void 0},emptyBody:{type:String,default:void 0}},setup(__props){const props=__props;const{t,text}=useJskitText();const resolvedCreateLabel=computed(()=>props.createLabel===void 0?t(`jskit.http.crud.list.newRecord`):text(props.createLabel));const resolvedLoadErrorBody=computed(()=>props.loadErrorBody===void 0?t(`jskit.http.crud.list.loadErrorBody`):text(props.loadErrorBody));const resolvedEmptyBody=computed(()=>props.emptyBody===void 0?t(`jskit.http.crud.list.emptyBody`):text(props.emptyBody));const route=useRoute();const records=computed(()=>props.screen?.records||{});const bulkActions=computed(()=>props.screen?.bulkActions||{});const rowActions=computed(()=>props.screen?.rowActions||{});const listFilters=computed(()=>props.screen?.listFilters||{});const filterRuntime=computed(()=>props.screen?.filterRuntime||null);const displayRows=computed(()=>unref(props.screen?.displayRows)||[]);const selectableRows=computed(()=>unref(props.screen?.selectableRows)||[]);const listPrimaryAction=computed(()=>unref(props.screen?.listPrimaryAction)||``);const hasBulkActions=computed(()=>Boolean(unref(bulkActions.value?.hasActions)));const hasRowActions=computed(()=>Boolean(unref(rowActions.value?.hasActions)));const hasViewUrl=computed(()=>Boolean(props.screen?.hasViewUrl));const hasEditUrl=computed(()=>Boolean(props.screen?.hasEditUrl));function resolveListRecordTitle(record){if(typeof props.screen?.resolveRecordTitle===`function`)return props.screen.resolveRecordTitle(record);return t(`jskit.http.crud.record`)}function formatListCardValue(value){if(typeof props.screen?.formatListCardValue===`function`)return props.screen.formatListCardValue(value);return value}function resolveViewLocation(record){const path=typeof records.value?.resolveViewUrl===`function`?records.value.resolveViewUrl(record):``;return path?{path,query:route.query}:null}function resolveEditLocation(record){const path=typeof records.value?.resolveEditUrl===`function`?records.value.resolveEditUrl(record):``;return path?{path,query:route.query}:null}function hasRowActionsFor(record,index){return typeof rowActions.value?.hasVisibleActionsFor===`function`&&rowActions.value.hasVisibleActionsFor(record,index)}function isBulkRowSelected(row={}){return typeof bulkActions.value?.isRecordSelected===`function`&&bulkActions.value.isRecordSelected(row.record,row.index)}function setBulkRowSelected(row={},selected=true){if(typeof bulkActions.value?.setRecordSelected!==`function`)return;bulkActions.value.setRecordSelected(row.record,row.index,selected)}function allSelectableRowsSelected(){return selectableRows.value.length>0&&selectableRows.value.every(row=>isBulkRowSelected(row))}function someSelectableRowsSelected(){return selectableRows.value.some(row=>isBulkRowSelected(row))}function setSelectableRowsSelected(selected=true){if(typeof bulkActions.value?.setRecordSelected!==`function`)return;for(const row of selectableRows.value)bulkActions.value.setRecordSelected(row.record,row.index,selected)}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1$6,[createBaseVNode(`div`,_hoisted_2$3,[createVNode(VBtn,{color:`primary`,variant:`tonal`,disabled:records.value.isFetching,onClick:records.value.reload},{default:withCtx(()=>[createTextVNode(toDisplayString(records.value.isFetching?unref(t)(`jskit.http.actions.refreshing`):unref(t)(`jskit.http.actions.refresh`)),1)]),_:1},8,[`disabled`,`onClick`]),listPrimaryAction.value?(openBlock(),createBlock(VBtn,{key:0,class:`crud-list-primary-action`,color:`primary`,variant:`flat`,to:listPrimaryAction.value},{default:withCtx(()=>[createTextVNode(toDisplayString(resolvedCreateLabel.value),1)]),_:1},8,[`to`])):createCommentVNode(``,true)]),createVNode(VSheet,{rounded:`lg`,border:``,class:`crud-list-panel`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_3$3,[records.value.searchEnabled?(openBlock(),createBlock(VTextField,{key:0,modelValue:records.value.searchQuery,"onUpdate:modelValue":_cache[0]||(_cache[0]=$event=>records.value.searchQuery=$event),label:records.value.searchLabel,placeholder:records.value.searchPlaceholder,variant:`outlined`,density:`comfortable`,"hide-details":`auto`,clearable:``,class:`crud-list-search`,"aria-busy":records.value.isSearchDebouncing?`true`:void 0},null,8,[`modelValue`,`label`,`placeholder`,`aria-busy`])):createCommentVNode(``,true),createVNode(CrudListFilterSurface_default,{filters:listFilters.value,runtime:filterRuntime.value},null,8,[`filters`,`runtime`])]),createVNode(CrudListBulkActionSurface_default,{runtime:bulkActions.value},null,8,[`runtime`]),records.value.showListSkeleton?(openBlock(),createElementBlock(`div`,_hoisted_4$2,[createVNode(VSkeletonLoader,{type:`text@2, list-item-two-line@5`})])):(openBlock(),createElementBlock(Fragment,{key:1},[records.value.loadError?(openBlock(),createElementBlock(`div`,_hoisted_5$2,[createBaseVNode(`p`,_hoisted_6$2,toDisplayString(resolvedLoadErrorBody.value),1),createVNode(VBtn,{color:`primary`,variant:`tonal`,disabled:records.value.isFetching,onClick:records.value.reload},{default:withCtx(()=>[createTextVNode(toDisplayString(records.value.isFetching?unref(t)(`jskit.http.actions.retrying`):unref(t)(`jskit.http.actions.retry`)),1)]),_:1},8,[`disabled`,`onClick`])])):displayRows.value.length<1?(openBlock(),createElementBlock(`div`,_hoisted_7$2,[createBaseVNode(`p`,_hoisted_8$2,toDisplayString(resolvedEmptyBody.value),1),listPrimaryAction.value?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`flat`,to:listPrimaryAction.value},{default:withCtx(()=>[createTextVNode(toDisplayString(resolvedCreateLabel.value),1)]),_:1},8,[`to`])):createCommentVNode(``,true)])):(openBlock(),createElementBlock(Fragment,{key:2},[createBaseVNode(`div`,_hoisted_9,[(openBlock(true),createElementBlock(Fragment,null,renderList(displayRows.value,row=>{return openBlock(),createBlock(VSheet,{key:row.key,rounded:`lg`,border:``,class:`crud-list-card`},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_10,[hasBulkActions.value&&row.selectable!==false?(openBlock(),createBlock(VCheckboxBtn,{key:0,"model-value":isBulkRowSelected(row),"aria-label":unref(t)(`jskit.http.crud.list.selectRecord`,{title:resolveListRecordTitle(row.record)}),class:`crud-list-card__select`,"onUpdate:modelValue":$event=>setBulkRowSelected(row,$event)},null,8,[`model-value`,`aria-label`,`onUpdate:modelValue`])):createCommentVNode(``,true),createBaseVNode(`div`,_hoisted_11,[createBaseVNode(`div`,_hoisted_12,toDisplayString(resolveListRecordTitle(row.record)),1),createBaseVNode(`div`,_hoisted_13,toDisplayString(row.recordKey),1)]),hasViewUrl.value||hasEditUrl.value||hasRowActionsFor(row.record,row.index)?(openBlock(),createBlock(_sfc_main$15,{key:1,record:row.record,index:row.index,"row-actions":rowActions.value,"show-view":hasViewUrl.value&&!row.synthetic,"show-edit":hasEditUrl.value&&!row.synthetic,"view-location":resolveViewLocation(row.record),"edit-location":resolveEditLocation(row.record)},null,8,[`record`,`index`,`row-actions`,`show-view`,`show-edit`,`view-location`,`edit-location`])):createCommentVNode(``,true)]),createBaseVNode(`div`,_hoisted_14,[renderSlot(_ctx.$slots,`card-fields`,{record:row.record,records:records.value,index:row.index,row,formatListCardValue},void 0,true)])]),_:2},1024)}),128))]),createBaseVNode(`div`,_hoisted_15,[createVNode(VTable,{density:`comfortable`},{default:withCtx(()=>[createBaseVNode(`thead`,null,[createBaseVNode(`tr`,null,[hasBulkActions.value?(openBlock(),createElementBlock(`th`,_hoisted_16,[createVNode(VCheckboxBtn,{"model-value":allSelectableRowsSelected(),indeterminate:someSelectableRowsSelected()&&!allSelectableRowsSelected(),"aria-label":unref(t)(`jskit.http.crud.list.selectVisibleRows`),"onUpdate:modelValue":_cache[1]||(_cache[1]=$event=>setSelectableRowsSelected($event))},null,8,[`model-value`,`indeterminate`,`aria-label`])])):createCommentVNode(``,true),renderSlot(_ctx.$slots,`table-header`,{},void 0,true),hasViewUrl.value?(openBlock(),createElementBlock(`th`,_hoisted_17)):createCommentVNode(``,true),hasEditUrl.value?(openBlock(),createElementBlock(`th`,_hoisted_18)):createCommentVNode(``,true),hasRowActions.value?(openBlock(),createElementBlock(`th`,_hoisted_19)):createCommentVNode(``,true)])]),createBaseVNode(`tbody`,null,[(openBlock(true),createElementBlock(Fragment,null,renderList(displayRows.value,row=>{return openBlock(),createElementBlock(`tr`,{key:row.key},[hasBulkActions.value?(openBlock(),createElementBlock(`td`,_hoisted_20,[row.selectable!==false?(openBlock(),createBlock(VCheckboxBtn,{key:0,"model-value":isBulkRowSelected(row),"aria-label":unref(t)(`jskit.http.crud.list.selectRecord`,{title:resolveListRecordTitle(row.record)}),"onUpdate:modelValue":$event=>setBulkRowSelected(row,$event)},null,8,[`model-value`,`aria-label`,`onUpdate:modelValue`])):createCommentVNode(``,true)])):createCommentVNode(``,true),renderSlot(_ctx.$slots,`table-row`,{record:row.record,records:records.value,index:row.index,row},void 0,true),hasViewUrl.value?(openBlock(),createElementBlock(`td`,_hoisted_21,[!row.synthetic?(openBlock(),createBlock(VBtn,{key:0,size:`small`,color:`primary`,variant:`outlined`,to:resolveViewLocation(row.record),disabled:!resolveViewLocation(row.record)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.open`)),1)]),_:1},8,[`to`,`disabled`])):createCommentVNode(``,true)])):createCommentVNode(``,true),hasEditUrl.value?(openBlock(),createElementBlock(`td`,_hoisted_22,[!row.synthetic?(openBlock(),createBlock(VBtn,{key:0,size:`small`,color:`primary`,variant:`tonal`,to:resolveEditLocation(row.record),disabled:!resolveEditLocation(row.record)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.edit`)),1)]),_:1},8,[`to`,`disabled`])):createCommentVNode(``,true)])):createCommentVNode(``,true),hasRowActions.value?(openBlock(),createElementBlock(`td`,_hoisted_23,[hasRowActionsFor(row.record,row.index)?(openBlock(),createBlock(_sfc_main$15,{key:0,record:row.record,index:row.index,"row-actions":rowActions.value,"button-label":unref(t)(`jskit.http.actions.more`),"button-variant":`outlined`},null,8,[`record`,`index`,`row-actions`,`button-label`])):createCommentVNode(``,true)])):createCommentVNode(``,true)])}),128))])]),_:3})])],64)),records.value.hasMore?(openBlock(),createElementBlock(`div`,_hoisted_24,[createVNode(VBtn,{color:`primary`,variant:`outlined`,disabled:records.value.isLoadingMore,onClick:records.value.loadMore},{default:withCtx(()=>[createTextVNode(toDisplayString(records.value.isLoadingMore?unref(t)(`jskit.http.actions.loadingMore`):unref(t)(`jskit.http.actions.loadMore`)),1)]),_:1},8,[`disabled`,`onClick`])])):createCommentVNode(``,true)],64))]),_:3}),listPrimaryAction.value?(openBlock(),createBlock(VBtn,{key:0,class:`crud-list-fab`,color:`primary`,variant:`flat`,to:listPrimaryAction.value},{default:withCtx(()=>[createTextVNode(toDisplayString(resolvedCreateLabel.value),1)]),_:1},8,[`to`])):createCommentVNode(``,true)])}}};var CrudListScreen_default=_plugin_vue_export_helper_default(_sfc_main$14,[[`__scopeId`,`data-v-93cf3fe4`]]);var _hoisted_1$5={class:`crud-screen crud-screen--operator crud-view-element d-flex flex-column ga-4`};var _hoisted_2$2={class:`crud-view-actions`};var _hoisted_3$2={key:0,class:`crud-view-state`};var _hoisted_4$1={class:`text-body-2 text-medium-emphasis mb-4`};var _hoisted_5$1={class:`crud-view-state__actions`};var _hoisted_6$1={key:1,class:`pa-4`};var _hoisted_7$1={key:2,class:`pa-4`};var _hoisted_8$1={key:0,class:`crud-view-supporting-content`};var _sfc_main$13={__name:`CrudViewScreen`,props:{screen:{type:Object,required:true},resourceSingularTitle:{type:String,default:void 0},resourcePluralTitle:{type:String,default:void 0}},setup(__props){const props=__props;const{t,text}=useJskitText();const singularTitle=computed(()=>props.resourceSingularTitle===void 0?t(`jskit.http.crud.record`):text(props.resourceSingularTitle));const pluralTitle=computed(()=>props.resourcePluralTitle===void 0?t(`jskit.http.crud.records`):text(props.resourcePluralTitle));const view=computed(()=>props.screen?.view||{});const listLocation=computed(()=>unref(props.screen?.listLocation)||null);const editLocation=computed(()=>unref(props.screen?.editLocation)||null);return(_ctx,_cache)=>{return openBlock(),createElementBlock(`section`,_hoisted_1$5,[createBaseVNode(`div`,_hoisted_2$2,[listLocation.value?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`outlined`,to:listLocation.value},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.crud.view.backTo`,{resources:pluralTitle.value})),1)]),_:1},8,[`to`])):createCommentVNode(``,true),renderSlot(_ctx.$slots,`actions`,{screen:__props.screen,view:view.value},void 0,true),editLocation.value?(openBlock(),createBlock(VBtn,{key:1,color:`primary`,variant:`flat`,to:editLocation.value},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.actions.edit`)),1)]),_:1},8,[`to`])):createCommentVNode(``,true)]),createVNode(VSheet,{rounded:`lg`,border:``,class:`crud-view-panel`},{default:withCtx(()=>[view.value.loadError||view.value.isNotFound?(openBlock(),createElementBlock(`div`,_hoisted_3$2,[createBaseVNode(`p`,_hoisted_4$1,toDisplayString(view.value.loadError||unref(t)(`jskit.http.crud.view.notFound`,{resource:singularTitle.value})),1),createBaseVNode(`div`,_hoisted_5$1,[view.value.loadError?(openBlock(),createBlock(VBtn,{key:0,color:`primary`,variant:`tonal`,disabled:view.value.isFetching,onClick:view.value.refresh},{default:withCtx(()=>[createTextVNode(toDisplayString(view.value.isFetching?unref(t)(`jskit.http.actions.retrying`):unref(t)(`jskit.http.actions.retry`)),1)]),_:1},8,[`disabled`,`onClick`])):listLocation.value?(openBlock(),createBlock(VBtn,{key:1,color:`primary`,variant:`tonal`,to:listLocation.value},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.http.crud.view.backTo`,{resources:pluralTitle.value})),1)]),_:1},8,[`to`])):createCommentVNode(``,true)])])):view.value.isLoading?(openBlock(),createElementBlock(`div`,_hoisted_6$1,[createVNode(VSkeletonLoader,{type:`text@2, list-item-two-line@5`})])):(openBlock(),createElementBlock(`div`,_hoisted_7$1,[renderSlot(_ctx.$slots,`before-fields`,{view:view.value},void 0,true),createVNode(VRow,{class:`crud-view-fields`},{default:withCtx(()=>[renderSlot(_ctx.$slots,`fields`,{view:view.value},void 0,true)]),_:3}),renderSlot(_ctx.$slots,`after-fields`,{view:view.value},void 0,true)]))]),_:3}),_ctx.$slots[`supporting-content`]?(openBlock(),createElementBlock(`div`,_hoisted_8$1,[renderSlot(_ctx.$slots,`supporting-content`,{view:view.value},void 0,true)])):createCommentVNode(``,true)])}}};var CrudViewScreen_default=_plugin_vue_export_helper_default(_sfc_main$13,[[`__scopeId`,`data-v-f6adb2d7`]]);function defineCrudListActions(actions,{name,createAction}){if(!Array.isArray(actions))throw new TypeError(`${name} requires an array.`);const normalizedActions=[];const seenKeys=new Set;actions.forEach((rawAction,index)=>{if(!rawAction||typeof rawAction!==`object`||Array.isArray(rawAction))return;const key=normalizeText$1(rawAction.key||rawAction.id||`action-${index+1}`);const label=normalizeText$1(rawAction.label||rawAction.title);if(!key||!label||seenKeys.has(key))return;seenKeys.add(key);normalizedActions.push(Object.freeze(createAction(rawAction,{key,label})))});return Object.freeze(normalizedActions)}function defineCrudListBulkActions(actions=[]){return defineCrudListActions(actions,{name:`defineCrudListBulkActions`,createAction:(rawAction,{key,label})=>({key,label,icon:normalizeText$1(rawAction.icon),color:normalizeText$1(rawAction.color,{fallback:`primary`}),variant:normalizeText$1(rawAction.variant,{fallback:`tonal`}),confirmLabel:normalizeText$1(rawAction.confirmLabel),run:typeof rawAction.run===`function`?rawAction.run:null,disabled:rawAction.disabled})})}function normalizeCrudLookupApiPath(value=``){const normalized=normalizePathname$1(normalizeText$1(value));if(!normalized||normalized===`/`)return``;return normalized}function normalizeCrudLookupNamespace(value=``){const normalizedApiPath=normalizeCrudLookupApiPath(value);if(!normalizedApiPath)return``;return normalizedApiPath.slice(1)}function resolveCrudLookupApiPathFromNamespace(value=``){const normalizedNamespace=normalizeCrudLookupNamespace(value);if(!normalizedNamespace)return``;return`/${normalizedNamespace}`}var CRUD_LIST_FILTER_TYPE_FLAG=`flag`;var CRUD_LIST_FILTER_TYPE_ENUM=`enum`;var CRUD_LIST_FILTER_TYPE_ENUM_MANY=`enumMany`;var CRUD_LIST_FILTER_TYPE_RECORD_ID=`recordId`;var CRUD_LIST_FILTER_TYPE_RECORD_ID_MANY=`recordIdMany`;var CRUD_LIST_FILTER_TYPE_DATE=`date`;var CRUD_LIST_FILTER_TYPE_DATE_RANGE=`dateRange`;var CRUD_LIST_FILTER_TYPE_NUMBER_RANGE=`numberRange`;var CRUD_LIST_FILTER_TYPE_PRESENCE=`presence`;var CRUD_LIST_FILTER_TYPES=Object.freeze([CRUD_LIST_FILTER_TYPE_FLAG,CRUD_LIST_FILTER_TYPE_ENUM,CRUD_LIST_FILTER_TYPE_ENUM_MANY,CRUD_LIST_FILTER_TYPE_RECORD_ID,CRUD_LIST_FILTER_TYPE_RECORD_ID_MANY,CRUD_LIST_FILTER_TYPE_DATE,CRUD_LIST_FILTER_TYPE_DATE_RANGE,CRUD_LIST_FILTER_TYPE_NUMBER_RANGE,CRUD_LIST_FILTER_TYPE_PRESENCE]);var CRUD_LIST_FILTER_PRESENCE_PRESENT=`present`;var CRUD_LIST_FILTER_PRESENCE_MISSING=`missing`;var CRUD_LIST_FILTER_PRESENCE_OPTIONS=Object.freeze([Object.freeze({value:CRUD_LIST_FILTER_PRESENCE_PRESENT,label:`Present`}),Object.freeze({value:CRUD_LIST_FILTER_PRESENCE_MISSING,label:`Missing`})]);var CRUD_LIST_FILTER_INVALID_VALUES_REJECT=`reject`;var CRUD_LIST_FILTER_INVALID_VALUES_DISCARD=`discard`;var CRUD_LIST_FILTER_INVALID_VALUES_MODES=Object.freeze([CRUD_LIST_FILTER_INVALID_VALUES_REJECT,CRUD_LIST_FILTER_INVALID_VALUES_DISCARD]);var DATE_FILTER_PATTERN=/^\d{4}-\d{2}-\d{2}$/u;function parseCrudListRangeQueryExpression(value=null){const sourceValue=Array.isArray(value)?value[0]:value;if(sourceValue==null)return null;const normalized=typeof sourceValue===`number`?String(sourceValue):normalizeText$1(sourceValue);if(!normalized)return null;const separatorIndex=normalized.indexOf(`..`);if(separatorIndex<0)return deepFreeze({exact:true,start:normalized,end:normalized});const start=normalizeText$1(normalized.slice(0,separatorIndex));const end=normalizeText$1(normalized.slice(separatorIndex+2));if(!start&&!end)return null;return deepFreeze({exact:false,start,end})}function firstCrudListFilterValue(value){return Array.isArray(value)?value[0]:value}function normalizeDateFilterText(value){const normalized=normalizeText$1(firstCrudListFilterValue(value));if(!normalized||!DATE_FILTER_PATTERN.test(normalized))return``;return normalized}function normalizeCanonicalRecordIdList(value){return normalizeUniqueTextList(value,{acceptSingle:true}).map(entry=>normalizeCanonicalRecordIdText(entry,{fallback:``})).filter(Boolean)}function normalizeAllowedFilterTextValue(value,allowedValues=new Set){const normalized=normalizeText$1(firstCrudListFilterValue(value));if(!normalized||!allowedValues.has(normalized))return``;return normalized}function normalizeAllowedFilterTextValues(value,allowedValues=new Set){return normalizeUniqueTextList(value,{acceptSingle:true}).filter(entry=>allowedValues.has(entry))}function resolveCrudListFilterAllowedValues(filter={}){return new Set((Array.isArray(filter.options)?filter.options:[]).map(entry=>normalizeText$1(entry?.value)).filter(Boolean))}function normalizeCrudListDateRangeUiValue(rawValue){const source=rawValue&&typeof rawValue===`object`&&!Array.isArray(rawValue)?rawValue:null;if(source)return{from:normalizeDateFilterText(source.from),to:normalizeDateFilterText(source.to)};const parsed=parseCrudListRangeQueryExpression(rawValue);return{from:normalizeDateFilterText(parsed?.start),to:normalizeDateFilterText(parsed?.end)}}function normalizeCrudListNumberRangeUiValue(rawValue){const source=rawValue&&typeof rawValue===`object`&&!Array.isArray(rawValue)?rawValue:null;if(source)return{min:normalizeText$1(source.min),max:normalizeText$1(source.max)};const parsed=parseCrudListRangeQueryExpression(rawValue);return{min:normalizeText$1(parsed?.start),max:normalizeText$1(parsed?.end)}}function normalizeCrudListFilterUiValue(filter={},rawValue){const type=normalizeCrudListFilterType(filter.type);if(type===`flag`)return rawValue===true;if(type===`enum`)return normalizeAllowedFilterTextValue(rawValue,resolveCrudListFilterAllowedValues(filter));if(type===`presence`)return normalizeAllowedFilterTextValue(rawValue,new Set([CRUD_LIST_FILTER_PRESENCE_PRESENT,CRUD_LIST_FILTER_PRESENCE_MISSING]));if(type===`enumMany`)return normalizeAllowedFilterTextValues(rawValue,resolveCrudListFilterAllowedValues(filter));if(type===`recordId`)return normalizeCanonicalRecordIdText(rawValue,{fallback:``})||``;if(type===`recordIdMany`)return normalizeCanonicalRecordIdList(rawValue);if(type===`date`)return normalizeDateFilterText(rawValue);if(type===`dateRange`)return normalizeCrudListDateRangeUiValue(rawValue);if(type===`numberRange`)return normalizeCrudListNumberRangeUiValue(rawValue);return normalizeText$1(rawValue)}function normalizeCrudListFilterType(value=``){const normalized=normalizeText$1(value);if(CRUD_LIST_FILTER_TYPES.includes(normalized))return normalized;throw new TypeError(`Unsupported CRUD list filter type "${value}".`)}function normalizeCrudListFilterOption(rawOption=null,{context=`filter option`}={}){const source=typeof rawOption===`string`?{value:rawOption}:normalizeObject$1(rawOption);const value=normalizeText$1(source.value);if(!value)throw new TypeError(`${context} requires value.`);return Object.freeze({value,label:normalizeText$1(source.label)||value})}function normalizeCrudListFilterOptions(rawOptions=[],{context=`filter options`}={}){const source=Array.isArray(rawOptions)?rawOptions:[];const options=[];const seenValues=new Set;for(const rawOption of source){const option=normalizeCrudListFilterOption(rawOption,{context});if(seenValues.has(option.value))continue;seenValues.add(option.value);options.push(option)}return Object.freeze(options)}function normalizeCrudListFilterPresenceOptions(rawOptions=[]){const sourceOptions=normalizeCrudListFilterOptions(rawOptions,{context:`presence filter options`});if(sourceOptions.length<1)return CRUD_LIST_FILTER_PRESENCE_OPTIONS;const optionMap=new Map(sourceOptions.map(entry=>[entry.value,entry]));const presentOption=optionMap.get(CRUD_LIST_FILTER_PRESENCE_PRESENT);const missingOption=optionMap.get(CRUD_LIST_FILTER_PRESENCE_MISSING);if(!presentOption||!missingOption)throw new TypeError(`Presence filter options must contain both "present" and "missing" values.`);return Object.freeze([presentOption,missingOption])}function normalizeCrudListFilterLookup(rawLookup=null){if(rawLookup==null)return null;if(!rawLookup||typeof rawLookup!==`object`||Array.isArray(rawLookup))throw new TypeError(`CRUD list filter lookup must be an object.`);const source=normalizeObject$1(rawLookup);const namespace=normalizeCrudLookupNamespace(source.namespace);const apiSuffix=normalizeCrudLookupApiPath(source.apiSuffix||source.apiPath)||resolveCrudLookupApiPathFromNamespace(namespace);const labelKey=normalizeText$1(source.labelKey);const valueKey=normalizeText$1(source.valueKey)||`id`;return Object.freeze({...namespace?{namespace}:{},...apiSuffix?{apiSuffix}:{},...labelKey?{labelKey}:{},valueKey})}function resolveCrudListFilterOptionSet(rawDefinition={},type=``){if(type===`enum`||type===`enumMany`){const options=normalizeCrudListFilterOptions(rawDefinition.options,{context:`${type} filter options`});if(options.length<1)throw new TypeError(`${type} filters require at least one option.`);return options}if(type===`presence`)return normalizeCrudListFilterPresenceOptions(rawDefinition.options);return Object.freeze([])}function resolveCrudListFilterQueryKeys(definition={}){return Object.freeze([normalizeText$1(definition.queryKey)].filter(Boolean))}function normalizeCrudListFilterDefinition(rawKey=``,rawDefinition=null){const key=normalizeText$1(rawKey);if(!key)throw new TypeError(`CRUD list filter definitions require non-empty keys.`);if(!rawDefinition||typeof rawDefinition!==`object`||Array.isArray(rawDefinition))throw new TypeError(`CRUD list filter "${key}" must be an object.`);const source=normalizeObject$1(rawDefinition);const type=normalizeCrudListFilterType(source.type);const label=normalizeText$1(source.label)||key;const options=resolveCrudListFilterOptionSet(source,type);const lookup=normalizeCrudListFilterLookup(source.lookup);const chipLabel=typeof source.chipLabel===`function`?source.chipLabel:null;const ui=source.ui&&typeof source.ui===`object`&&!Array.isArray(source.ui)?deepFreeze({...source.ui}):null;const meta=source.meta&&typeof source.meta===`object`&&!Array.isArray(source.meta)?deepFreeze({...source.meta}):null;const hasDefaultValue=Object.hasOwn(source,`defaultValue`);const defaultValue=hasDefaultValue?deepFreeze(normalizeCrudListFilterUiValue({type,options},source.defaultValue)):void 0;if(type===`dateRange`){if(normalizeText$1(source.fromKey)||normalizeText$1(source.toKey))throw new TypeError(`CRUD list filter "${key}" uses unsupported split range keys. Use queryKey.`)}if(type===`numberRange`){if(normalizeText$1(source.minKey)||normalizeText$1(source.maxKey))throw new TypeError(`CRUD list filter "${key}" uses unsupported split range keys. Use queryKey.`)}return Object.freeze({key,type,label,queryKey:normalizeText$1(source.queryKey)||key,options,lookup,chipLabel,ui,meta,...hasDefaultValue?{defaultValue}:{}})}function defineCrudListFilters(definitions={}){if(!definitions||typeof definitions!==`object`||Array.isArray(definitions))throw new TypeError(`defineCrudListFilters requires an object.`);const source=normalizeObject$1(definitions);const normalized={};const seenFilterKeys=new Set;const seenQueryKeys=new Map;for(const[rawKey,rawDefinition]of Object.entries(source)){const filter=normalizeCrudListFilterDefinition(rawKey,rawDefinition);if(seenFilterKeys.has(filter.key))throw new TypeError(`Duplicate CRUD list filter key "${filter.key}".`);seenFilterKeys.add(filter.key);for(const queryKey of resolveCrudListFilterQueryKeys(filter)){const seenBy=seenQueryKeys.get(queryKey);if(seenBy)throw new TypeError(`CRUD list filters "${seenBy}" and "${filter.key}" both use query key "${queryKey}".`);seenQueryKeys.set(queryKey,filter.key)}normalized[filter.key]=filter}return deepFreeze(normalized)}function defineCrudListRowActions(actions=[]){return defineCrudListActions(actions,{name:`defineCrudListRowActions`,createAction:(rawAction,{key,label})=>({key,label,icon:normalizeText$1(rawAction.icon),color:normalizeText$1(rawAction.color,{fallback:`primary`}),run:typeof rawAction.run===`function`?rawAction.run:null,visible:rawAction.visible,disabled:rawAction.disabled,loading:rawAction.loading})})}function isObjectLike(value){return value!==null&&typeof value===`object`}function deepClone(value){try{return JSON.parse(JSON.stringify(value))}catch{return null}}function captureModelSnapshot(model){if(!isObjectLike(model))return null;return deepClone(model)}function restoreModelSnapshot(model,snapshot){if(!isObjectLike(model)||!isObjectLike(snapshot))return;if(Array.isArray(model)&&Array.isArray(snapshot)){model.splice(0,model.length,...snapshot);return}if(Array.isArray(model)||Array.isArray(snapshot))return;for(const key of Object.keys(model))if(!Object.prototype.hasOwnProperty.call(snapshot,key))delete model[key];for(const[key,value]of Object.entries(snapshot))model[key]=value}function watchResourceModelState({resource,model,mapLoadedToModel,resolveMapContext=null}={}){const modelSnapshot=captureModelSnapshot(model);watch(()=>resource?.query?.isPending?.value,isPending=>{if(!isPending||!modelSnapshot)return;restoreModelSnapshot(model,modelSnapshot)},{immediate:true});watch(()=>resource?.data?.value,payload=>{if(!payload||typeof mapLoadedToModel!==`function`)return;mapLoadedToModel(model,payload,typeof resolveMapContext===`function`?resolveMapContext():{})},{immediate:true})}var{t:t$17,text:text$3}=useJskitText();function useAddEditCore({model,resource,queryKey,canSave,fieldBag,feedback,input,mapLoadedToModel,buildRawPayload,buildSavePayload,onSaveSuccess,validationFeedback=true,messages={}}={}){const queryClient=useQueryClient();watchResourceModelState({resource,model,mapLoadedToModel,resolveMapContext(){return{queryClient,resource}}});const submitting=ref(false);const saving=computed(()=>Boolean(submitting.value||resource?.isSaving?.value));const fieldErrors=fieldBag?.errors;const message=feedback?.message;const messageType=feedback?.messageType;const validationAttempted=ref(false);const validationErrors=computed(()=>{if(!validationAttempted.value||!input)return{};const result=validateOperationInput({input,rawPayload:resolveRawPayload()});return result.ok?{}:toUiFieldErrors(result.failure)});function resolveRawPayload(){return typeof buildRawPayload===`function`?buildRawPayload(model,{queryClient,resource}):{}}function resetValidation(){validationAttempted.value=false;fieldBag?.clear?.()}async function submit(){if(!canSave?.value||saving.value)return;feedback?.clear?.();fieldBag?.clear?.();validationAttempted.value=true;const rawPayload=resolveRawPayload();const validationResult=validateOperationInput({input,rawPayload,fieldBag,feedback:validationFeedback===false?null:feedback,validationMessage:text$3(messages.validation)||t$17(`jskit.http.feedback.validationFailed`)});if(!validationResult.ok)return;const{parsedInput}=validationResult;const savePayload=typeof buildSavePayload===`function`?buildSavePayload(parsedInput,{rawPayload,queryClient,resource}):parsedInput;try{submitting.value=true;const queryKeySnapshot=queryKey?.value;const payload=await resource.save(savePayload);if(typeof mapLoadedToModel===`function`)mapLoadedToModel(model,payload,{queryClient,resource});if(queryKeySnapshot!==void 0)queryClient.setQueryData(queryKeySnapshot,payload);if(typeof onSaveSuccess===`function`)await onSaveSuccess(payload,{queryClient,parsed:parsedInput,rawPayload,savePayload,resource});feedback?.success?.(text$3(messages.saveSuccess)||t$17(`jskit.http.feedback.saved`))}catch(error){fieldBag?.apply?.(toUiFieldErrors(error));feedback?.error?.(error,text$3(messages.saveError)||t$17(`jskit.http.feedback.saveFailed`))}finally{submitting.value=false}}return Object.freeze({saving,fieldErrors,message,messageType,validationAttempted,validationErrors,resetValidation,submit})}function resolveSavedRecordId(payload,saveRecordIdSelector){const sourcePayload=asPlainObject(payload);if(typeof saveRecordIdSelector===`function`)return toRouteParamValue(saveRecordIdSelector(sourcePayload));return toRouteParamValue(sourcePayload.id)}function createAddEditUiRuntime({recordIdParam=`recordId`,routeParams=null,routeParamNames=null,routePath=``,routeRecordId=null,apiUrlTemplate=``,viewUrlTemplate=``,listUrlTemplate=``,saveRecordIdSelector=null}={}){const normalizedRecordIdParam=normalizeRouteParamName(recordIdParam,{context:`useAddEdit recordIdParam`});const normalizedApiUrlTemplate=String(apiUrlTemplate||``).trim();const normalizedViewUrlTemplate=String(viewUrlTemplate||``).trim();const normalizedListUrlTemplate=String(listUrlTemplate||``).trim();const{resolveRecordId,resolveTemplatePath}=createRouteTemplateResolver({recordIdParam:normalizedRecordIdParam,routeParams,routeParamNames,routePath,routeRecordId,anchorMode:`after`});const recordId=computed(()=>resolveRecordId());const apiSuffix=computed(()=>resolveTemplatePath(normalizedApiUrlTemplate));const listUrl=computed(()=>resolveTemplatePath(normalizedListUrlTemplate));const cancelUrl=computed(()=>resolveTemplatePath(normalizedViewUrlTemplate)||listUrl.value);function resolveViewUrl(recordIdLike=``){const targetRecordId=toRouteParamValue(recordIdLike);if(!targetRecordId)return``;return resolveTemplatePath(normalizedViewUrlTemplate,{[normalizedRecordIdParam]:targetRecordId})}function resolveSavedViewUrl(payload={}){const targetRecordId=resolveSavedRecordId(payload,saveRecordIdSelector);if(!targetRecordId)return``;return resolveViewUrl(targetRecordId)}return Object.freeze({recordId,apiSuffix,listUrl,cancelUrl,resolveParams:resolveTemplatePath,resolveViewUrl,resolveSavedViewUrl})}var QUERY_PARAM_BINDING_TYPE_TEXT=`text`;var QUERY_PARAM_BINDING_TYPE_BOOLEAN=`boolean`;var QUERY_PARAM_BINDING_TYPE_NUMBER=`number`;var QUERY_PARAM_BINDING_TYPE_ARRAY=`array`;var QUERY_PARAM_BINDING_TYPE_DATE=`date`;function normalizeListSyncToRouteConfig(syncToRoute=false,{defaultSearchParam=`q`}={}){const source=syncToRoute===true?{}:asPlainObject(syncToRoute);const requested=syncToRoute===true||Object.keys(source).length>0;const queryParamBlacklist=Object.freeze(normalizeUniqueTextList(source.queryParamBlacklist));if(!requested||source.enabled===false)return Object.freeze({enabled:false,mode:`replace`,syncSearch:false,syncQueryParams:false,hydrateFromRoute:false,searchParam:normalizeText$1(defaultSearchParam)||`q`,queryParamBlacklist});const mode=normalizeText$1(source.mode).toLowerCase()===`push`?`push`:`replace`;const searchParam=normalizeText$1(source.searchParam)||normalizeText$1(defaultSearchParam)||`q`;return Object.freeze({enabled:true,mode,syncSearch:source.search!==false,syncQueryParams:source.queryParams!==false,hydrateFromRoute:source.hydrateFromRoute!==false,searchParam,queryParamBlacklist})}function normalizeQueryParamKey(value){return normalizeText$1(value)}function normalizeQueryParamValues(value){const list=Array.isArray(value)?value:[value];const normalizedValues=[];for(const entry of list){const resolvedEntry=unref(entry);if(resolvedEntry==null)continue;if(typeof resolvedEntry===`boolean`){if(resolvedEntry)normalizedValues.push(`1`);continue}if(typeof resolvedEntry===`number`){if(Number.isFinite(resolvedEntry))normalizedValues.push(String(resolvedEntry));continue}if(resolvedEntry instanceof Date){if(!Number.isNaN(resolvedEntry.getTime()))normalizedValues.push(resolvedEntry.toISOString());continue}const normalizedText=normalizeText$1(resolvedEntry);if(normalizedText)normalizedValues.push(normalizedText)}return normalizedValues}function resolveQueryParamsInput(queryParams,context={}){if(typeof queryParams===`function`)return asPlainObject(queryParams(context));return asPlainObject(unref(queryParams))}function resolveQueryParamBindingType(value){if(Array.isArray(value))return QUERY_PARAM_BINDING_TYPE_ARRAY;if(typeof value===`boolean`)return QUERY_PARAM_BINDING_TYPE_BOOLEAN;if(typeof value===`number`)return QUERY_PARAM_BINDING_TYPE_NUMBER;if(value instanceof Date)return QUERY_PARAM_BINDING_TYPE_DATE;return QUERY_PARAM_BINDING_TYPE_TEXT}function resolveArrayQueryParamItemType(values=[]){const list=Array.isArray(values)?values:[];for(const entry of list){if(entry==null)continue;if(typeof entry===`boolean`)return QUERY_PARAM_BINDING_TYPE_BOOLEAN;if(typeof entry===`number`)return QUERY_PARAM_BINDING_TYPE_NUMBER;if(entry instanceof Date)return QUERY_PARAM_BINDING_TYPE_DATE;return QUERY_PARAM_BINDING_TYPE_TEXT}return QUERY_PARAM_BINDING_TYPE_TEXT}function createWritableQueryParamBinding({source={},rawKey=``,rawValue=null,key=``,resolveRouteValue=null}={}){const valueSourceIsRef=isRef(rawValue);const read=valueSourceIsRef?()=>rawValue.value:()=>source[rawKey];const write=valueSourceIsRef?nextValue=>{rawValue.value=nextValue}:nextValue=>{source[rawKey]=nextValue};const currentValue=read();const valueType=resolveQueryParamBindingType(currentValue);return{key,valueType,arrayItemType:valueType===QUERY_PARAM_BINDING_TYPE_ARRAY?resolveArrayQueryParamItemType(currentValue):QUERY_PARAM_BINDING_TYPE_TEXT,get:read,set:write,resolveRouteValue}}function resolveQueryParamDescriptors(queryParams,context={},{routeValueResolvers=null}={}){const source=resolveQueryParamsInput(queryParams,context);const resolvers=asPlainObject(unref(routeValueResolvers));const descriptorsByKey=new Map;const canWriteToSource=typeof queryParams!==`function`;for(const[rawKey,rawValue]of Object.entries(source)){const key=normalizeQueryParamKey(rawKey);if(!key)continue;const values=normalizeQueryParamValues(rawValue);const current=descriptorsByKey.get(key)||{key,values:[],binding:null};if(values.length>0)current.values.push(...values);if(!current.binding&&canWriteToSource)current.binding=createWritableQueryParamBinding({source,rawKey,rawValue,key,resolveRouteValue:typeof resolvers[key]===`function`?resolvers[key]:null});descriptorsByKey.set(key,current)}return[...descriptorsByKey.values()].sort((left,right)=>left.key.localeCompare(right.key))}function resolveActiveQueryParamEntries(descriptors=[]){return(Array.isArray(descriptors)?descriptors:[]).filter(descriptor=>Array.isArray(descriptor?.values)&&descriptor.values.length>0).map(descriptor=>({key:descriptor.key,values:[...descriptor.values]}))}function resolveWritableQueryParamBindings(descriptors=[]){return(Array.isArray(descriptors)?descriptors:[]).map(descriptor=>descriptor?.binding||null).filter(Boolean)}function buildQueryParamEntriesToken(entries=[]){const normalizedEntries=Array.isArray(entries)?entries:[];if(normalizedEntries.length<1)return``;return normalizedEntries.map(entry=>{const key=normalizeQueryParamKey(entry?.key);const values=Array.isArray(entry?.values)?entry.values.map(value=>normalizeText$1(value)).filter(Boolean):[];if(!key||values.length<1)return``;return`${key}=${values.join(`,`)}`}).filter(Boolean).join(`&`)}function firstRouteQueryValue(value){if(Array.isArray(value))return value[0];return value}function normalizeRouteQueryValues(value){return(Array.isArray(value)?value:[value]).map(entry=>normalizeText$1(entry)).filter(Boolean)}function parseRouteBooleanValue(value,fallback=false){if(value===void 0)return fallback;if(value===null||value===``)return true;try{return normalizeBoolean(firstRouteQueryValue(value))}catch{return fallback}}function parseRouteNumberValue(value,fallback=null){if(value===void 0)return null;const normalized=normalizeText$1(firstRouteQueryValue(value));if(!normalized)return null;const parsed=Number(normalized);if(!Number.isFinite(parsed))return fallback;return parsed}function parseRouteDateValue(value,fallback=null){if(value===void 0)return null;const normalized=normalizeText$1(firstRouteQueryValue(value));if(!normalized)return null;const parsed=new Date(normalized);if(Number.isNaN(parsed.getTime()))return fallback;return parsed}function parseRouteQueryItemValue(value,itemType=QUERY_PARAM_BINDING_TYPE_TEXT,fallback=null){if(itemType===QUERY_PARAM_BINDING_TYPE_BOOLEAN)try{return normalizeBoolean(value)}catch{return fallback}if(itemType===QUERY_PARAM_BINDING_TYPE_NUMBER){const numeric=Number(value);return Number.isFinite(numeric)?numeric:fallback}if(itemType===QUERY_PARAM_BINDING_TYPE_DATE){const date=new Date(value);return Number.isNaN(date.getTime())?fallback:date}return normalizeText$1(value)||fallback}function parseRouteBindingValue(binding,routeQueryValue,context={}){if(typeof binding?.resolveRouteValue===`function`)return binding.resolveRouteValue(routeQueryValue,context);const valueType=normalizeText$1(binding?.valueType).toLowerCase();if(valueType===QUERY_PARAM_BINDING_TYPE_BOOLEAN)return parseRouteBooleanValue(routeQueryValue,false);if(valueType===QUERY_PARAM_BINDING_TYPE_NUMBER)return parseRouteNumberValue(routeQueryValue,typeof binding?.get===`function`?binding.get():null);if(valueType===QUERY_PARAM_BINDING_TYPE_DATE)return parseRouteDateValue(routeQueryValue,typeof binding?.get===`function`?binding.get():null);if(valueType===QUERY_PARAM_BINDING_TYPE_ARRAY){const itemType=normalizeText$1(binding?.arrayItemType).toLowerCase()||QUERY_PARAM_BINDING_TYPE_TEXT;return normalizeRouteQueryValues(routeQueryValue).map(value=>parseRouteQueryItemValue(value,itemType,null)).filter(value=>value!=null&&!(typeof value===`string`&&!value))}return normalizeText$1(firstRouteQueryValue(routeQueryValue))}function areQueryParamBindingItemsEqual(left,right){if(left===right)return true;if(left instanceof Date&&right instanceof Date)return left.getTime()===right.getTime();return Object.is(left,right)}function areQueryParamBindingValuesEqual(left,right){if(left===right)return true;if(left instanceof Date&&right instanceof Date)return left.getTime()===right.getTime();if(!Array.isArray(left)||!Array.isArray(right))return Object.is(left,right);if(left.length!==right.length)return false;for(let index=0;index<left.length;index+=1)if(!areQueryParamBindingItemsEqual(left[index],right[index]))return false;return true}function buildRouteQueryCompareToken(query={}){const source=asPlainObject(query);const keys=Object.keys(source).sort();const parts=[];for(const key of keys){const normalizedKey=normalizeQueryParamKey(key);if(!normalizedKey)continue;const normalizedValues=normalizeRouteQueryValues(source[key]);if(normalizedValues.length<1)continue;parts.push(`${normalizedKey}=${normalizedValues.join(`,`)}`)}return parts.join(`&`)}function mergeManagedQueryParamKeyHistory(history=[],keys=[]){const merged=new Set;for(const key of Array.isArray(history)?history:[]){const normalized=normalizeQueryParamKey(key);if(normalized)merged.add(normalized)}for(const key of Array.isArray(keys)?keys:[]){const normalized=normalizeQueryParamKey(key);if(normalized)merged.add(normalized)}return[...merged].sort((left,right)=>left.localeCompare(right))}function resolveRouteSyncManagedKeys({searchEnabled=false,searchParam=`q`,syncSearch=false,syncQueryParams=false,declaredKeys=[],keyHistory=[]}={}){const managed=new Set;if(syncSearch===true&&searchEnabled===true){const normalizedSearchParam=normalizeQueryParamKey(searchParam);if(normalizedSearchParam)managed.add(normalizedSearchParam)}if(syncQueryParams===true)for(const key of mergeManagedQueryParamKeyHistory(keyHistory,declaredKeys))managed.add(key);return[...managed].sort((left,right)=>left.localeCompare(right))}function resolveRequestQueryContext(context=null){const source=unref(context);return source&&typeof source===`object`&&!Array.isArray(source)?source:{}}function resolveRequestQueryBaseKey(sourceQueryKey=null){const source=unref(sourceQueryKey);if(Array.isArray(source))return[...source];if(source==null)return[];return[source]}function resolveRequestFieldsets(requestFieldsets=null,context={}){const source=typeof requestFieldsets===`function`?requestFieldsets(context):unref(requestFieldsets);return normalizeJsonApiFieldsets(source)}function appendRequestQueryValue(target={},key=``,values=[]){const normalizedKey=String(key||``).trim();const normalizedValues=(Array.isArray(values)?values:[]).map(value=>String(value??``).trim()).filter(Boolean);if(!normalizedKey||normalizedValues.length<1)return;const currentValue=target[normalizedKey];if(currentValue===void 0){target[normalizedKey]=normalizedValues.length===1?normalizedValues[0]:[...normalizedValues];return}target[normalizedKey]=[...Array.isArray(currentValue)?[...currentValue]:[currentValue],...normalizedValues]}function buildRequestQueryObject(entries=[],{fieldsets=null}={}){const sourceEntries=Array.isArray(entries)?entries:[];const query={};for(const entry of sourceEntries)appendRequestQueryValue(query,entry?.key,entry?.values);const normalizedFieldsets=normalizeJsonApiFieldsets(fieldsets);return Object.freeze({...query,...Object.keys(normalizedFieldsets).length>0?{fields:normalizedFieldsets}:{}})}function createRequestQueryRuntime({requestQueryParams=null,requestFieldsets=null,context=null,sourceQueryKey=null}={}){const requestQueryParamDescriptors=computed(()=>{return resolveQueryParamDescriptors(requestQueryParams,resolveRequestQueryContext(context))});const activeRequestQueryParamEntries=computed(()=>{return resolveActiveQueryParamEntries(requestQueryParamDescriptors.value)});const activeRequestQueryParamsToken=computed(()=>{return buildQueryParamEntriesToken(activeRequestQueryParamEntries.value)});const activeRequestFieldsets=computed(()=>{return resolveRequestFieldsets(requestFieldsets,resolveRequestQueryContext(context))});const activeRequestFieldsetsToken=computed(()=>{return buildJsonApiFieldsetsToken(activeRequestFieldsets.value)});const queryKeyParts=computed(()=>{const parts=[];if(activeRequestQueryParamsToken.value)parts.push(`__request_query__`,activeRequestQueryParamsToken.value);if(activeRequestFieldsetsToken.value)parts.push(`__request_fieldsets__`,activeRequestFieldsetsToken.value);return Object.freeze(parts)});const queryKey=computed(()=>{if(queryKeyParts.value.length<1)return unref(sourceQueryKey);return[...resolveRequestQueryBaseKey(sourceQueryKey),...queryKeyParts.value]});const requestQuery=computed(()=>{const query=buildRequestQueryObject(activeRequestQueryParamEntries.value,{fieldsets:activeRequestFieldsets.value});if(Object.keys(query).length<1)return null;return query});return Object.freeze({requestQueryParamDescriptors,activeRequestQueryParamEntries,activeRequestQueryParamsToken,activeRequestFieldsets,activeRequestFieldsetsToken,queryKeyParts,queryKey,requestQuery})}var{t:t$16}=useJskitText();function useAddEdit({ownershipFilter=ROUTE_VISIBILITY_WORKSPACE,surfaceId=``,access=`auto`,resource=null,apiSuffix=``,queryKeyFactory=null,viewPermissions=[],savePermissions=[],readMethod=`GET`,readEnabled=true,writeMethod=`PATCH`,client=null,transport=null,requestRecovery=null,requestRecoveryLabel=t$16(`jskit.http.resource.label`),placementSource=`http-web.add-edit`,fallbackLoadError=t$16(`jskit.http.resource.loadFailed`),fallbackSaveError=``,fieldErrorKeys=[],clearOnRouteChange=true,model,input,mapLoadedToModel,buildRawPayload,buildSavePayload,onSaveSuccess,validationFeedback=true,requestQueryParams=null,recordIdParam=`recordId`,routeParams=null,routeRecordId=null,apiUrlTemplate=``,viewUrlTemplate=``,listUrlTemplate=``,saveRecordIdSelector=null,messages={},realtime=null}={}){const route=useRoute();const addEditUiRuntime=createAddEditUiRuntime({recordIdParam,routeParams:routeParams??computed(()=>route?.params||{}),routeParamNames:computed(()=>resolveRouteParamNamesInOrder(route)),routePath:computed(()=>route?.path||``),routeRecordId,apiUrlTemplate,viewUrlTemplate,listUrlTemplate,saveRecordIdSelector});const effectiveApiSuffix=String(apiUrlTemplate||``).trim()?addEditUiRuntime.apiSuffix:apiSuffix;const operationScope=useOperationScope({ownershipFilter,surfaceId,access,apiSuffix:effectiveApiSuffix,model,readEnabled,queryKeyFactory,permissionSets:{view:viewPermissions,save:savePermissions},realtime});const routeContext=operationScope.routeContext;const resolvedMessages={...resolveResourceMessages(resource,{validation:`jskit.http.feedback.fixInvalidValues`,saveSuccess:`jskit.http.feedback.saved`,saveError:`jskit.http.feedback.saveFailed`}),...messages&&typeof messages===`object`?messages:{}};const effectiveMessages={...resolvedMessages,saveError:String(fallbackSaveError||``).trim()||String(resolvedMessages.saveError||``).trim()||`jskit.http.feedback.saveFailed`};const canView=operationScope.permissionGate(`view`);const canSave=operationScope.permissionGate(`save`);const queryCanRun=operationScope.queryCanRun(canView);const queryParamsContext=computed(()=>{return Object.freeze({surfaceId:operationScope.routeContext.currentSurfaceId.value,scopeParamValue:operationScope.scopeParamValue.value,ownershipFilter:operationScope.normalizedOwnershipFilter,recordId:addEditUiRuntime.recordId.value,model})});const requestQueryRuntime=createRequestQueryRuntime({requestQueryParams,context:queryParamsContext,sourceQueryKey:operationScope.queryKey});const endpointResource=useEndpointResource({queryKey:requestQueryRuntime.queryKey,path:operationScope.apiPath,enabled:queryCanRun,client,readMethod,writeMethod,readQuery:requestQueryRuntime.requestQuery,transport,requestRecovery,requestRecoveryLabel,fallbackLoadError,fallbackSaveError:effectiveMessages.saveError});const feedback=useUiFeedback({source:`${placementSource}.feedback`});const fieldBag=useFieldErrorBag(fieldErrorKeys);const addEdit=useAddEditCore({model,resource:endpointResource,queryKey:requestQueryRuntime.queryKey,canSave,fieldBag,feedback,input,mapLoadedToModel,buildRawPayload,buildSavePayload,onSaveSuccess,validationFeedback,messages:effectiveMessages});setupRouteChangeCleanup({enabled:clearOnRouteChange,route:routeContext.route,feedback,onClear:addEdit.resetValidation});const isInitialLoading=operationScope.isLoading(endpointResource.isInitialLoading);const isFetching=operationScope.isLoading(endpointResource.isFetching);const isRefetching=computed(()=>Boolean(isFetching.value&&!isInitialLoading.value));const isFieldLocked=computed(()=>Boolean(!canSave.value||addEdit.saving.value||isRefetching.value));const isSubmitDisabled=computed(()=>Boolean(isInitialLoading.value||isRefetching.value||!canSave.value||addEdit.saving.value));const loadError=operationScope.loadError(endpointResource.loadError);const isLoading=operationScope.isLoading(endpointResource.isLoading);const canRetryLoad=computed(()=>Boolean(readEnabled!==false&&endpointResource?.reload));async function refresh(){if(!canRetryLoad.value)return null;return endpointResource.reload()}setupOperationErrorReporting({source:`${placementSource}.load`,loadError,dedupeWindowMs:0,loadActionFactory:()=>canRetryLoad.value?{label:t$16(`jskit.http.actions.retry`),dismissOnRun:true,handler(){refresh()}}:null});return proxyRefs({canView,canSave,loadError,isInitialLoading,isFetching,isRefetching,isFieldLocked,isSubmitDisabled,canRetryLoad,isLoading,isSaving:addEdit.saving,fieldErrors:addEdit.fieldErrors,validationAttempted:addEdit.validationAttempted,validationErrors:addEdit.validationErrors,resetValidation:addEdit.resetValidation,message:addEdit.message,messageType:addEdit.messageType,submit:addEdit.submit,refresh,resource:endpointResource,recordId:addEditUiRuntime.recordId,listUrl:addEditUiRuntime.listUrl,cancelUrl:addEditUiRuntime.cancelUrl,resolveParams:addEditUiRuntime.resolveParams,resolveViewUrl:addEditUiRuntime.resolveViewUrl,resolveSavedViewUrl:addEditUiRuntime.resolveSavedViewUrl})}var{t:t$15}=useJskitText();var DEFAULT_LIST_LIMIT=20;function buildListRequestOptions({requestOptions=null,transport=null,pageParam=null}={}){const resolvedOptions={method:`GET`,...resolveRequestOptionsObject(requestOptions)};const sourceQuery=resolvedOptions.query&&typeof resolvedOptions.query===`object`&&!Array.isArray(resolvedOptions.query)?{...resolvedOptions.query}:{};if(!Object.hasOwn(sourceQuery,`limit`)&&!Object.hasOwn(sourceQuery,`page[limit]`))sourceQuery.limit=DEFAULT_LIST_LIMIT;if(pageParam!==null&&pageParam!==void 0&&pageParam!==``)sourceQuery.cursor=String(pageParam);if(Object.keys(sourceQuery).length>0)resolvedOptions.query=sourceQuery;else delete resolvedOptions.query;if(transport&&typeof transport===`object`)resolvedOptions.transport=transport;return resolvedOptions}function resolveRequestOptionsObject(value=null){const source=unref(value);return asPlainObject(source)}function resolveListRequestMethod(requestOptions=null){return String(resolveRequestOptionsObject(requestOptions).method||`GET`).toUpperCase()}function useListCore({queryKey,path=``,enabled=true,client=null,transport=null,initialPageParam=null,getNextPageParam,selectItems,requestOptions=null,queryOptions=null,requestRecovery=null,requestRecoveryLabel=t$15(`jskit.http.list.label`),fallbackLoadError=t$15(`jskit.http.list.loadFailed`)}={}){const activeClient=client||getHttpWebClient();if(!activeClient||typeof activeClient.request!==`function`)throw new TypeError(`useListCore requires a client with request().`);const normalizedPath=computed(()=>resolveTextRef(path));const queryEnabled=computed(()=>resolveEnabledRef(enabled)&&Boolean(normalizedPath.value));return usePagedCollection({queryKey,initialPageParam,enabled:queryEnabled,queryFn:async({pageParam,signal})=>{const requestPath=normalizedPath.value;if(!requestPath)throw new Error(`List path is required.`);const options=buildListRequestOptions({requestOptions,transport,pageParam});options.signal=options.signal?AbortSignal.any([signal,options.signal]):signal;return activeClient.request(requestPath,options)},getNextPageParam,selectItems,queryOptions:mergeRequestRecoveryQueryMeta(queryOptions,requestRecovery,{label:requestRecoveryLabel,method:resolveListRequestMethod(requestOptions)}),fallbackLoadError})}function resolveRecordId(record,recordIdSelector){const item=asPlainObject(record);if(typeof recordIdSelector===`function`)return toRouteParamValue(recordIdSelector(item));return toRouteParamValue(item.id)}function createListUiRuntime({items,isInitialLoading,recordIdParam=`recordId`,recordIdSelector=null,routeParams=null,routeParamNames=null,routePath=``,viewUrlTemplate=``,editUrlTemplate=``}={}){const normalizedRecordIdParam=normalizeRouteParamName(recordIdParam,{context:`useList recordIdParam`});const normalizedViewUrlTemplate=String(viewUrlTemplate||``).trim();const normalizedEditUrlTemplate=String(editUrlTemplate||``).trim();const hasViewUrl=Boolean(normalizedViewUrlTemplate);const hasEditUrl=Boolean(normalizedEditUrlTemplate);const normalizedItems=computed(()=>Array.isArray(items?.value)?items.value:[]);const showListSkeleton=computed(()=>Boolean(isInitialLoading?.value&&normalizedItems.value.length<1));const{resolveTemplatePath}=createRouteTemplateResolver({recordIdParam:normalizedRecordIdParam,routeParams,routeParamNames,routePath,anchorMode:`before`,fillRecordId:false});function resolveRowKey(record,index){const recordId=resolveRecordId(record,recordIdSelector);if(recordId)return recordId;return`row-${index}`}function resolveViewUrl(record){if(!hasViewUrl)return``;const recordId=resolveRecordId(record,recordIdSelector);if(!recordId)return``;return resolveTemplatePath(normalizedViewUrlTemplate,{[normalizedRecordIdParam]:recordId})}function resolveEditUrl(record){if(!hasEditUrl)return``;const recordId=resolveRecordId(record,recordIdSelector);if(!recordId)return``;return resolveTemplatePath(normalizedEditUrlTemplate,{[normalizedRecordIdParam]:recordId})}return Object.freeze({hasViewUrl,hasEditUrl,showListSkeleton,resolveParams:resolveTemplatePath,resolveRowKey,resolveViewUrl,resolveEditUrl})}var{t:t$14,text:text$2}=useJskitText();var DEFAULT_LIST_SEARCH_DEBOUNCE_MS=250;var DEFAULT_LIST_SEARCH_MIN_LENGTH=1;var LIST_SEARCH_MODE_LOCAL=`local`;var LIST_SEARCH_MODE_QUERY=`query`;function normalizeListSearchConfig(value={}){const source=asPlainObject(value);const mode=normalizeText$1(source.mode).toLowerCase()===LIST_SEARCH_MODE_LOCAL?LIST_SEARCH_MODE_LOCAL:LIST_SEARCH_MODE_QUERY;return Object.freeze({enabled:source.enabled===true,mode,queryParam:normalizeText$1(source.queryParam)||`q`,label:normalizeText$1(text$2(source.label))||t$14(`jskit.http.list.search`),placeholder:normalizeText$1(source.placeholder),initialQuery:normalizeText$1(source.initialQuery),debounceMs:normalizeInteger(source.debounceMs,{fallback:DEFAULT_LIST_SEARCH_DEBOUNCE_MS,min:0}),minLength:normalizeInteger(source.minLength,{fallback:DEFAULT_LIST_SEARCH_MIN_LENGTH,min:DEFAULT_LIST_SEARCH_MIN_LENGTH}),fields:Object.freeze(normalizeUniqueTextList(source.fields))})}function normalizeSearchableValue(value){if(value==null)return``;if(typeof value===`string`)return normalizeText$1(value).toLowerCase();if(typeof value===`number`||typeof value===`boolean`)return String(value).toLowerCase();return``}function matchesLocalSearch(item={},query=``,searchFields=[]){const source=asPlainObject(item);const normalizedQuery=normalizeText$1(query).toLowerCase();if(!normalizedQuery)return true;const fields=Array.isArray(searchFields)?searchFields:[];if(fields.length>0)return fields.some(field=>normalizeSearchableValue(source[field]).includes(normalizedQuery));return Object.values(source).some(value=>normalizeSearchableValue(value).includes(normalizedQuery))}var{t:t$13}=useJskitText();var EMPTY_ROUTE_SYNC_QUERY_PARAM_BLACKLIST=Object.freeze([]);function useList({ownershipFilter=ROUTE_VISIBILITY_WORKSPACE,surfaceId=``,access=`auto`,apiSuffix=``,queryKeyFactory=null,viewPermissions=[],readEnabled=true,placementSource=`http-web.list`,fallbackLoadError=t$13(`jskit.http.list.loadFailed`),initialPageParam=null,getNextPageParam,selectItems,client=null,transport=null,requestOptions,queryOptions,requestRecovery,requestRecoveryLabel=t$13(`jskit.http.list.label`),realtime=null,recordIdParam=`recordId`,recordIdSelector=null,viewUrlTemplate=``,editUrlTemplate=``,search=null,queryParams=null,routeQueryValueResolvers=null,requestQueryParams=null,requestFieldsets=null,syncToRoute=false}={}){const searchConfig=normalizeListSearchConfig(search);const routeSyncConfig=normalizeListSyncToRouteConfig(syncToRoute,{defaultSearchParam:searchConfig.queryParam});const routeSyncHydrated=ref(routeSyncConfig.enabled!==true||routeSyncConfig.hydrateFromRoute!==true);const router=routeSyncConfig.enabled===true?useRouter$1():null;const searchQuery=ref(searchConfig.initialQuery);const debouncedSearchQuery=ref(searchConfig.initialQuery);let searchDebounceTimer=null;const isSearchDebouncing=ref(false);watch(searchQuery,value=>{const normalizedValue=normalizeText$1(value);if(searchDebounceTimer)clearTimeout(searchDebounceTimer);if(searchConfig.enabled!==true){debouncedSearchQuery.value=normalizedValue;isSearchDebouncing.value=false;return}isSearchDebouncing.value=true;searchDebounceTimer=setTimeout(()=>{debouncedSearchQuery.value=normalizedValue;isSearchDebouncing.value=false;searchDebounceTimer=null},searchConfig.debounceMs)},{immediate:true});onScopeDispose(()=>{if(!searchDebounceTimer)return;clearTimeout(searchDebounceTimer);searchDebounceTimer=null});const operationScope=useOperationScope({ownershipFilter,surfaceId,access,apiSuffix,readEnabled,queryKeyFactory,permissionSets:{view:viewPermissions},realtime});if(routeSyncConfig.enabled===true&&routeSyncConfig.hydrateFromRoute===true&&routeSyncConfig.syncSearch===true&&searchConfig.enabled===true){const routeSearchValue=asPlainObject(operationScope.routeContext.route?.query||{})[routeSyncConfig.searchParam];const hydratedSearch=normalizeText$1(Array.isArray(routeSearchValue)?routeSearchValue[0]:routeSearchValue);if(searchDebounceTimer){clearTimeout(searchDebounceTimer);searchDebounceTimer=null}searchQuery.value=hydratedSearch;debouncedSearchQuery.value=hydratedSearch;isSearchDebouncing.value=false}const canView=operationScope.permissionGate(`view`);const queryParamsContext=computed(()=>{return Object.freeze({surfaceId:operationScope.routeContext.currentSurfaceId.value,scopeParamValue:operationScope.scopeParamValue.value,ownershipFilter:operationScope.normalizedOwnershipFilter})});const queryParamDescriptors=computed(()=>{return resolveQueryParamDescriptors(queryParams,queryParamsContext.value,{routeValueResolvers:routeQueryValueResolvers})});const{activeRequestQueryParamEntries,activeRequestQueryParamsToken,activeRequestFieldsets,activeRequestFieldsetsToken,queryKeyParts:requestQueryKeyParts}=createRequestQueryRuntime({requestQueryParams,requestFieldsets,context:queryParamsContext});const declaredQueryParamKeys=computed(()=>{return queryParamDescriptors.value.map(descriptor=>descriptor.key)});const activeQueryParamEntries=computed(()=>{return resolveActiveQueryParamEntries(queryParamDescriptors.value)});const activeQueryParamsToken=computed(()=>buildQueryParamEntriesToken(activeQueryParamEntries.value));const writableQueryParamBindings=computed(()=>{return resolveWritableQueryParamBindings(queryParamDescriptors.value)});const activeSearchQuery=computed(()=>{if(searchConfig.enabled!==true)return``;const normalized=normalizeText$1(debouncedSearchQuery.value);if(!normalized||normalized.length<searchConfig.minLength)return``;return normalized});const querySearchEnabled=computed(()=>searchConfig.enabled===true&&searchConfig.mode===`query`);const listPath=computed(()=>{return normalizeText$1(operationScope.apiPath.value)});const listRequestOptions=computed(()=>{const entries=[];if(querySearchEnabled.value){const queryValue=activeSearchQuery.value;if(queryValue)entries.push({key:searchConfig.queryParam,values:[queryValue]})}entries.push(...activeRequestQueryParamEntries.value);entries.push(...activeQueryParamEntries.value);const query=buildRequestQueryObject(entries,{fieldsets:activeRequestFieldsets.value});const baseOptions=asPlainObject(requestOptions);if(Object.keys(query).length<1)return baseOptions;return{...baseOptions,query}});const listQueryKey=computed(()=>{const sourceQueryKey=operationScope.queryKey.value;const baseQueryKey=Array.isArray(sourceQueryKey)?[...sourceQueryKey]:sourceQueryKey==null?[]:[sourceQueryKey];baseQueryKey.push(...requestQueryKeyParts.value);if(querySearchEnabled.value)baseQueryKey.push(`__search__`,searchConfig.queryParam,activeSearchQuery.value);if(activeQueryParamsToken.value)baseQueryKey.push(`__query__`,activeQueryParamsToken.value);return baseQueryKey});const listReadEnabled=computed(()=>canView.value&&routeSyncHydrated.value);const list=useListCore({queryKey:listQueryKey,path:listPath,enabled:operationScope.queryCanRun(listReadEnabled),client,transport,initialPageParam,getNextPageParam,selectItems,requestOptions:listRequestOptions,queryOptions,requestRecovery,requestRecoveryLabel,fallbackLoadError});const routeSyncApplying=ref(false);const routeSyncManagedKeyHistory=ref([]);const routeSyncQueryParamBlacklist=computed(()=>{if(routeSyncConfig.enabled!==true||routeSyncConfig.syncQueryParams!==true)return EMPTY_ROUTE_SYNC_QUERY_PARAM_BLACKLIST;return routeSyncConfig.queryParamBlacklist});const routeSyncQueryParamBlacklistSet=computed(()=>{return new Set(routeSyncQueryParamBlacklist.value)});if(routeSyncConfig.enabled===true&&routeSyncConfig.syncQueryParams===true)watch(declaredQueryParamKeys,nextKeys=>{routeSyncManagedKeyHistory.value=mergeManagedQueryParamKeyHistory(routeSyncManagedKeyHistory.value,nextKeys)},{immediate:true});const routeSyncManagedKeys=computed(()=>{const managedKeys=resolveRouteSyncManagedKeys({searchEnabled:searchConfig.enabled,searchParam:routeSyncConfig.searchParam,syncSearch:routeSyncConfig.enabled===true&&routeSyncConfig.syncSearch===true,syncQueryParams:routeSyncConfig.enabled===true&&routeSyncConfig.syncQueryParams===true,declaredKeys:declaredQueryParamKeys.value,keyHistory:routeSyncManagedKeyHistory.value});if(routeSyncConfig.enabled!==true||routeSyncConfig.syncQueryParams!==true)return managedKeys;const output=new Set(managedKeys);for(const key of routeSyncQueryParamBlacklist.value)output.add(key);return[...output].sort((left,right)=>left.localeCompare(right))});const routeSyncDesiredQuery=computed(()=>{if(routeSyncConfig.enabled!==true)return{};const desiredQuery={};if(routeSyncConfig.syncSearch===true&&searchConfig.enabled===true){const normalizedSearch=normalizeText$1(searchQuery.value);if(normalizedSearch)desiredQuery[routeSyncConfig.searchParam]=normalizedSearch}if(routeSyncConfig.syncQueryParams===true)for(const entry of activeQueryParamEntries.value){if(routeSyncQueryParamBlacklistSet.value.has(entry.key))continue;if(entry.values.length===1){desiredQuery[entry.key]=entry.values[0];continue}desiredQuery[entry.key]=[...entry.values]}return desiredQuery});if(routeSyncConfig.enabled===true){watch(()=>operationScope.routeContext.route?.query||{},routeQuery=>{const initialHydration=routeSyncHydrated.value!==true;if(routeSyncConfig.hydrateFromRoute!==true||routeSyncApplying.value===true){routeSyncHydrated.value=true;return}const routeQuerySource=asPlainObject(routeQuery);if(routeSyncConfig.syncSearch===true&&searchConfig.enabled===true){const routeSearchValue=routeQuerySource[routeSyncConfig.searchParam];const nextSearch=normalizeText$1(Array.isArray(routeSearchValue)?routeSearchValue[0]:routeSearchValue);if(nextSearch!==searchQuery.value)searchQuery.value=nextSearch}if(routeSyncConfig.syncQueryParams===true)for(const binding of writableQueryParamBindings.value){if(routeSyncQueryParamBlacklistSet.value.has(binding.key))continue;const nextValue=parseRouteBindingValue(binding,routeQuerySource[binding.key],{initial:initialHydration});const currentValue=typeof binding.get===`function`?binding.get():void 0;if(areQueryParamBindingValuesEqual(currentValue,nextValue))continue;try{binding.set(nextValue)}catch{}}routeSyncHydrated.value=true},{immediate:true});watch([routeSyncDesiredQuery,routeSyncManagedKeys],async([desiredQuery,managedKeys])=>{if(routeSyncHydrated.value!==true||routeSyncApplying.value===true)return;const managedKeySet=new Set(Array.isArray(managedKeys)?managedKeys:[]);const currentQuery=asPlainObject(operationScope.routeContext.route?.query||{});const nextQuery={};for(const[key,value]of Object.entries(currentQuery)){if(managedKeySet.has(key))continue;nextQuery[key]=value}for(const[key,value]of Object.entries(asPlainObject(desiredQuery)))nextQuery[key]=value;if(buildRouteQueryCompareToken(currentQuery)===buildRouteQueryCompareToken(nextQuery))return;routeSyncApplying.value=true;try{if(routeSyncConfig.mode===`push`)await router.push({query:nextQuery});else await router.replace({query:nextQuery})}finally{routeSyncApplying.value=false}})}watch(activeSearchQuery,(nextValue,previousValue)=>{if(!querySearchEnabled.value)return;if(nextValue===previousValue)return;list.trimToFirstPage()});watch([activeQueryParamsToken,activeRequestQueryParamsToken,activeRequestFieldsetsToken],()=>{list.trimToFirstPage()});const filteredItems=computed(()=>{const sourceItems=Array.isArray(list.items.value)?list.items.value:[];if(searchConfig.enabled!==true||searchConfig.mode!==`local`)return sourceItems;const queryValue=activeSearchQuery.value;if(!queryValue)return sourceItems;return sourceItems.filter(item=>matchesLocalSearch(item,queryValue,searchConfig.fields))});const isInitialLoading=operationScope.isLoading(list.isInitialLoading);const isFetching=operationScope.isLoading(list.isFetching);const isRefetching=computed(()=>Boolean(isFetching.value&&!isInitialLoading.value));const loadError=operationScope.loadError(list.loadError);const isLoading=operationScope.isLoading(list.isLoading);const listUiRuntime=createListUiRuntime({items:filteredItems,isInitialLoading,recordIdParam,recordIdSelector,routeParams:computed(()=>operationScope.routeContext.route?.params||{}),routeParamNames:computed(()=>resolveRouteParamNamesInOrder(operationScope.routeContext.route)),routePath:computed(()=>operationScope.routeContext.route?.path||``),viewUrlTemplate,editUrlTemplate});setupOperationErrorReporting({source:`${placementSource}.load`,loadError,dedupeWindowMs:0,loadActionFactory:()=>({label:t$13(`jskit.http.actions.retry`),dismissOnRun:true,handler(){list.reload()}})});return proxyRefs({canView,isInitialLoading,isFetching,isRefetching,isLoading,isLoadingMore:list.isLoadingMore,hasMore:list.hasMore,loadError,pages:list.pages,items:filteredItems,reload:list.reload,loadMore:list.loadMore,hasViewUrl:listUiRuntime.hasViewUrl,hasEditUrl:listUiRuntime.hasEditUrl,showListSkeleton:listUiRuntime.showListSkeleton,resolveRowKey:listUiRuntime.resolveRowKey,resolveParams:listUiRuntime.resolveParams,resolveViewUrl:listUiRuntime.resolveViewUrl,resolveEditUrl:listUiRuntime.resolveEditUrl,searchEnabled:searchConfig.enabled,searchMode:searchConfig.mode,searchQuery,searchLabel:searchConfig.label,searchPlaceholder:searchConfig.placeholder,isSearchDebouncing,activeQueryParamsToken})}var{t:t$12}=useJskitText();function normalizeStatusList(value){if(Array.isArray(value))return value.map(entry=>Number(entry)).filter(entry=>Number.isInteger(entry)&&entry>0);return[404]}function useViewCore({resource,model,canView,mapLoadedToModel,notFoundStatuses=[404],notFoundMessage=``}={}){const statusList=normalizeStatusList(notFoundStatuses);watchResourceModelState({resource,model,mapLoadedToModel,resolveMapContext(){return{resource}}});const data=resource?.data;const record=computed(()=>model!==void 0?model:data?.value);const isLoading=computed(()=>{if(resource?.isInitialLoading?.value!==void 0)return Boolean(resource.isInitialLoading.value);return Boolean(resource?.query?.isPending?.value)});const isFetching=computed(()=>{if(resource?.isFetching?.value!==void 0)return Boolean(resource.isFetching.value);return Boolean(resource?.query?.isFetching?.value)});const error=computed(()=>resource?.query?.error?.value||null);const isNotFound=computed(()=>{const status=Number(error.value?.status||0);return statusList.includes(status)});const notFoundError=computed(()=>{if(!isNotFound.value)return``;return String(notFoundMessage||t$12(`jskit.http.crud.recordNotFound`))});const loadError=computed(()=>{if(isNotFound.value)return``;return String(resource?.loadError?.value||``).trim()});const resolvedCanView=computed(()=>{if(canView===void 0)return true;return Boolean(canView?.value)});async function refresh(){return resource?.reload?.()}return Object.freeze({record,isLoading,isFetching,isNotFound,notFoundError,loadError,canView:resolvedCanView,refresh})}function createViewUiRuntime({recordIdParam=`recordId`,routeParams=null,routeParamNames=null,routePath=``,routeRecordId=null,apiUrlTemplate=``,listUrlTemplate=``,editUrlTemplate=``}={}){const normalizedRecordIdParam=normalizeRouteParamName(recordIdParam,{context:`useView recordIdParam`});const normalizedApiUrlTemplate=String(apiUrlTemplate||``).trim();const normalizedListUrlTemplate=String(listUrlTemplate||``).trim();const normalizedEditUrlTemplate=String(editUrlTemplate||``).trim();const{resolveRecordId,resolveTemplatePath}=createRouteTemplateResolver({recordIdParam:normalizedRecordIdParam,routeParams,routeParamNames,routePath,routeRecordId,anchorMode:`at`,anchorOnTargetRecord:true});const recordId=computed(()=>resolveRecordId());const apiSuffix=computed(()=>resolveTemplatePath(normalizedApiUrlTemplate));const listUrl=computed(()=>resolveTemplatePath(normalizedListUrlTemplate));const editUrl=computed(()=>resolveTemplatePath(normalizedEditUrlTemplate));return Object.freeze({recordId,apiSuffix,listUrl,editUrl,resolveParams:resolveTemplatePath})}var{t:t$11}=useJskitText();function useView({resource=null,ownershipFilter=ROUTE_VISIBILITY_WORKSPACE,surfaceId=``,access=`auto`,apiSuffix=``,queryKeyFactory=null,viewPermissions=[],readMethod=`GET`,readEnabled=true,client=null,transport=null,requestRecovery=null,requestRecoveryLabel=t$11(`jskit.http.resource.label`),placementSource=`http-web.view`,fallbackLoadError=t$11(`jskit.http.resource.loadFailed`),notFoundStatuses=[404],notFoundMessage=t$11(`jskit.http.crud.recordNotFound`),model,mapLoadedToModel,requestQueryParams=null,requestFieldsets=null,recordIdParam=`recordId`,routeParams=null,routeRecordId=null,apiUrlTemplate=``,listUrlTemplate=``,editUrlTemplate=``,includeRecordIdInQueryKey=false,realtime=void 0}={}){const route=useRoute();const viewUiRuntime=createViewUiRuntime({recordIdParam,routeParams:routeParams??computed(()=>route?.params||{}),routeParamNames:computed(()=>resolveRouteParamNamesInOrder(route)),routePath:computed(()=>route?.path||``),routeRecordId,apiUrlTemplate,listUrlTemplate,editUrlTemplate});const effectiveApiSuffix=String(apiUrlTemplate||``).trim()?viewUiRuntime.apiSuffix:apiSuffix;const operationScope=useOperationScope({ownershipFilter,surfaceId,access,apiSuffix:effectiveApiSuffix,readEnabled,queryKeyFactory,permissionSets:{view:viewPermissions},realtime:resolveOperationRealtimeOptions({realtime,fallbackRealtime:resource?.operations?.view?.realtime||resource?.operations?.list?.realtime||null})});const queryParamsContext=computed(()=>{return Object.freeze({surfaceId:operationScope.routeContext.currentSurfaceId.value,scopeParamValue:operationScope.scopeParamValue.value,ownershipFilter:operationScope.normalizedOwnershipFilter,recordId:viewUiRuntime.recordId.value})});const baseQueryKey=computed(()=>{const next=[...Array.isArray(operationScope.queryKey.value)?operationScope.queryKey.value:[]];if(!includeRecordIdInQueryKey)return next;const recordIdToken=String(viewUiRuntime.recordId.value||``).trim();return[...next,recordIdToken]});const requestQueryRuntime=createRequestQueryRuntime({requestQueryParams,requestFieldsets,context:queryParamsContext,sourceQueryKey:baseQueryKey});const canView=operationScope.permissionGate(`view`);const endpointResource=useEndpointResource({queryKey:requestQueryRuntime.queryKey,path:operationScope.apiPath,enabled:operationScope.queryCanRun(canView),client,readMethod,readQuery:requestQueryRuntime.requestQuery,transport,requestRecovery,requestRecoveryLabel,refreshOnPull:true,fallbackLoadError});const view=useViewCore({resource:endpointResource,model,canView,mapLoadedToModel,notFoundStatuses,notFoundMessage});const loadError=operationScope.loadError(view.loadError);const isLoading=operationScope.isLoading(view.isLoading);const isFetching=operationScope.isLoading(view.isFetching);const isRefetching=computed(()=>Boolean(isFetching.value&&!isLoading.value));setupOperationErrorReporting({source:`${placementSource}.load`,loadError,notFoundError:view.notFoundError,dedupeWindowMs:0,loadActionFactory:()=>({label:t$11(`jskit.http.actions.retry`),dismissOnRun:true,handler(){view.refresh()}})});return proxyRefs({record:view.record,recordId:viewUiRuntime.recordId,listUrl:viewUiRuntime.listUrl,editUrl:viewUiRuntime.editUrl,resolveParams:viewUiRuntime.resolveParams,canView,isLoading,isFetching,isRefetching,isNotFound:view.isNotFound,notFoundError:view.notFoundError,loadError,refresh:view.refresh,resource:endpointResource})}var client_exports$5=__exportAll({CrudAddEditScreen:()=>CrudAddEditScreen_default,CrudDeleteAction:()=>_sfc_main$20,CrudListBulkActionSurface:()=>CrudListBulkActionSurface_default,CrudListFilterSurface:()=>CrudListFilterSurface_default,CrudListScreen:()=>CrudListScreen_default,CrudViewScreen:()=>CrudViewScreen_default,configureHttpWebClient:()=>configureHttpWebClient,createHttpWebClient:()=>createHttpWebClient,defineCrudListBulkActions:()=>defineCrudListBulkActions,defineCrudListFilters:()=>defineCrudListFilters,defineCrudListRowActions:()=>defineCrudListRowActions,getHttpWebClient:()=>getHttpWebClient,httpWebClient:()=>httpWebClient,useAccess:()=>useAccess,useAddEdit:()=>useAddEdit,useCommand:()=>useCommand,useEndpointResource:()=>useEndpointResource,useList:()=>useList,usePagedCollection:()=>usePagedCollection,useRealtimeQueryInvalidation:()=>useRealtimeQueryInvalidation,useUiFeedback:()=>useUiFeedback,useView:()=>useView});function asLogger(value){if(!value||typeof value!==`object`||Array.isArray(value))return null;return value}function callLoggerMethod(logger,methodName,fallbackMethodName,args){if(logger&&typeof logger[methodName]===`function`){logger[methodName](...args);return}if(typeof console[fallbackMethodName]===`function`)console[fallbackMethodName](...args)}function createProviderLogger(loggerLike=null,{debugEnabled=false,debugMethod=`info`}={}){const logger=asLogger(loggerLike);const resolvedDebugMethod=String(debugMethod||`info`).trim()||`info`;return Object.freeze({debug:(...args)=>{if(debugEnabled!==true)return;callLoggerMethod(logger,resolvedDebugMethod,`info`,args)},info:(...args)=>{callLoggerMethod(logger,`info`,`info`,args)},warn:(...args)=>{callLoggerMethod(logger,`warn`,`warn`,args)},error:(...args)=>{callLoggerMethod(logger,`error`,`error`,args)}})}var PACKET_TYPES=Object.create(null);PACKET_TYPES[`open`]=`0`;PACKET_TYPES[`close`]=`1`;PACKET_TYPES[`ping`]=`2`;PACKET_TYPES[`pong`]=`3`;PACKET_TYPES[`message`]=`4`;PACKET_TYPES[`upgrade`]=`5`;PACKET_TYPES[`noop`]=`6`;var PACKET_TYPES_REVERSE=Object.create(null);Object.keys(PACKET_TYPES).forEach(key=>{PACKET_TYPES_REVERSE[PACKET_TYPES[key]]=key});var ERROR_PACKET={type:`error`,data:`parser error`};var withNativeBlob$1=typeof Blob===`function`||typeof Blob!==`undefined`&&Object.prototype.toString.call(Blob)===`[object BlobConstructor]`;var withNativeArrayBuffer$2=typeof ArrayBuffer===`function`;var isView$1=obj=>{return typeof ArrayBuffer.isView===`function`?ArrayBuffer.isView(obj):obj&&obj.buffer instanceof ArrayBuffer};var encodePacket=({type,data},supportsBinary,callback)=>{if(withNativeBlob$1&&data instanceof Blob){if(supportsBinary)return callback(data);else return encodeBlobAsBase64(data,callback)}else if(withNativeArrayBuffer$2&&(data instanceof ArrayBuffer||isView$1(data))){if(supportsBinary)return callback(data);else return encodeBlobAsBase64(new Blob([data]),callback)}return callback(PACKET_TYPES[type]+(data||``))};var encodeBlobAsBase64=(data,callback)=>{const fileReader=new FileReader;fileReader.onload=function(){const content=fileReader.result.split(`,`)[1];callback(`b`+(content||``))};return fileReader.readAsDataURL(data)};function toArray(data){if(data instanceof Uint8Array)return data;else if(data instanceof ArrayBuffer)return new Uint8Array(data);else return new Uint8Array(data.buffer,data.byteOffset,data.byteLength)}var TEXT_ENCODER;function encodePacketToBinary(packet,callback){if(withNativeBlob$1&&packet.data instanceof Blob)return packet.data.arrayBuffer().then(toArray).then(callback);else if(withNativeArrayBuffer$2&&(packet.data instanceof ArrayBuffer||isView$1(packet.data)))return callback(toArray(packet.data));encodePacket(packet,false,encoded=>{if(!TEXT_ENCODER)TEXT_ENCODER=new TextEncoder;callback(TEXT_ENCODER.encode(encoded))})}var chars=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/`;var lookup$1=typeof Uint8Array===`undefined`?[]:new Uint8Array(256);for(let i=0;i<64;i++)lookup$1[chars.charCodeAt(i)]=i;var decode$1=base64=>{let bufferLength=base64.length*.75,len=base64.length,i,p=0,encoded1,encoded2,encoded3,encoded4;if(base64[base64.length-1]===`=`){bufferLength--;if(base64[base64.length-2]===`=`)bufferLength--}const arraybuffer=new ArrayBuffer(bufferLength),bytes=new Uint8Array(arraybuffer);for(i=0;i<len;i+=4){encoded1=lookup$1[base64.charCodeAt(i)];encoded2=lookup$1[base64.charCodeAt(i+1)];encoded3=lookup$1[base64.charCodeAt(i+2)];encoded4=lookup$1[base64.charCodeAt(i+3)];bytes[p++]=encoded1<<2|encoded2>>4;bytes[p++]=(encoded2&15)<<4|encoded3>>2;bytes[p++]=(encoded3&3)<<6|encoded4&63}return arraybuffer};var withNativeArrayBuffer$1=typeof ArrayBuffer===`function`;var decodePacket=(encodedPacket,binaryType)=>{if(typeof encodedPacket!==`string`)return{type:`message`,data:mapBinary(encodedPacket,binaryType)};const type=encodedPacket.charAt(0);if(type===`b`)return{type:`message`,data:decodeBase64Packet(encodedPacket.substring(1),binaryType)};if(!PACKET_TYPES_REVERSE[type])return ERROR_PACKET;return encodedPacket.length>1?{type:PACKET_TYPES_REVERSE[type],data:encodedPacket.substring(1)}:{type:PACKET_TYPES_REVERSE[type]}};var decodeBase64Packet=(data,binaryType)=>{if(withNativeArrayBuffer$1){const decoded=decode$1(data);return mapBinary(decoded,binaryType)}else return{base64:true,data}};var mapBinary=(data,binaryType)=>{switch(binaryType){case`blob`:if(data instanceof Blob)return data;else return new Blob([data]);default:if(data instanceof ArrayBuffer)return data;else return data.buffer}};var SEPARATOR=String.fromCharCode(30);var encodePayload=(packets,callback)=>{const length=packets.length;const encodedPackets=new Array(length);let count=0;packets.forEach((packet,i)=>{encodePacket(packet,false,encodedPacket=>{encodedPackets[i]=encodedPacket;if(++count===length)callback(encodedPackets.join(SEPARATOR))})})};var decodePayload=(encodedPayload,binaryType)=>{const encodedPackets=encodedPayload.split(SEPARATOR);const packets=[];for(let i=0;i<encodedPackets.length;i++){const decodedPacket=decodePacket(encodedPackets[i],binaryType);packets.push(decodedPacket);if(decodedPacket.type===`error`)break}return packets};function createPacketEncoderStream(){return new TransformStream({transform(packet,controller){encodePacketToBinary(packet,encodedPacket=>{const payloadLength=encodedPacket.length;let header;if(payloadLength<126){header=new Uint8Array(1);new DataView(header.buffer).setUint8(0,payloadLength)}else if(payloadLength<65536){header=new Uint8Array(3);const view=new DataView(header.buffer);view.setUint8(0,126);view.setUint16(1,payloadLength)}else{header=new Uint8Array(9);const view=new DataView(header.buffer);view.setUint8(0,127);view.setBigUint64(1,BigInt(payloadLength))}if(packet.data&&typeof packet.data!==`string`)header[0]|=128;controller.enqueue(header);controller.enqueue(encodedPacket)})}})}var TEXT_DECODER;function totalLength(chunks){return chunks.reduce((acc,chunk)=>acc+chunk.length,0)}function concatChunks(chunks,size){if(chunks[0].length===size)return chunks.shift();const buffer=new Uint8Array(size);let j=0;for(let i=0;i<size;i++){buffer[i]=chunks[0][j++];if(j===chunks[0].length){chunks.shift();j=0}}if(chunks.length&&j<chunks[0].length)chunks[0]=chunks[0].slice(j);return buffer}function createPacketDecoderStream(maxPayload,binaryType){if(!TEXT_DECODER)TEXT_DECODER=new TextDecoder;const chunks=[];let state=0;let expectedLength=-1;let isBinary=false;return new TransformStream({transform(chunk,controller){chunks.push(chunk);while(true){if(state===0){if(totalLength(chunks)<1)break;const header=concatChunks(chunks,1);isBinary=(header[0]&128)===128;expectedLength=header[0]&127;if(expectedLength<126)state=3;else if(expectedLength===126)state=1;else state=2}else if(state===1){if(totalLength(chunks)<2)break;const headerArray=concatChunks(chunks,2);expectedLength=new DataView(headerArray.buffer,headerArray.byteOffset,headerArray.length).getUint16(0);state=3}else if(state===2){if(totalLength(chunks)<8)break;const headerArray=concatChunks(chunks,8);const view=new DataView(headerArray.buffer,headerArray.byteOffset,headerArray.length);const n=view.getUint32(0);if(n>Math.pow(2,21)-1){controller.enqueue(ERROR_PACKET);break}expectedLength=n*Math.pow(2,32)+view.getUint32(4);state=3}else{if(totalLength(chunks)<expectedLength)break;const data=concatChunks(chunks,expectedLength);controller.enqueue(decodePacket(isBinary?data:TEXT_DECODER.decode(data),binaryType));state=0}if(expectedLength===0||expectedLength>maxPayload){controller.enqueue(ERROR_PACKET);break}}}})}function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype)obj[key]=Emitter.prototype[key];return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks[`$`+event]=this._callbacks[`$`+event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){function on(){this.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks[`$`+event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks[`$`+event];return this}var cb;for(var i=0;i<callbacks.length;i++){cb=callbacks[i];if(cb===fn||cb.fn===fn){callbacks.splice(i,1);break}}if(callbacks.length===0)delete this._callbacks[`$`+event];return this};Emitter.prototype.emit=function(event){this._callbacks=this._callbacks||{};var args=new Array(arguments.length-1),callbacks=this._callbacks[`$`+event];for(var i=1;i<arguments.length;i++)args[i-1]=arguments[i];if(callbacks){callbacks=callbacks.slice(0);for(var i=0,len=callbacks.length;i<len;++i)callbacks[i].apply(this,args)}return this};Emitter.prototype.emitReserved=Emitter.prototype.emit;Emitter.prototype.listeners=function(event){this._callbacks=this._callbacks||{};return this._callbacks[`$`+event]||[]};Emitter.prototype.hasListeners=function(event){return!!this.listeners(event).length};var nextTick=(()=>{if(typeof Promise===`function`&&typeof Promise.resolve===`function`)return cb=>Promise.resolve().then(cb);else return(cb,setTimeoutFn)=>setTimeoutFn(cb,0)})();var globalThisShim=(()=>{if(typeof self!==`undefined`)return self;else if(typeof window!==`undefined`)return window;else return Function(`return this`)()})();var defaultBinaryType=`arraybuffer`;function createCookieJar(){}function pick(obj,...attr){return attr.reduce((acc,k)=>{if(obj.hasOwnProperty(k))acc[k]=obj[k];return acc},{})}var NATIVE_SET_TIMEOUT=globalThisShim.setTimeout;var NATIVE_CLEAR_TIMEOUT=globalThisShim.clearTimeout;function installTimerFunctions(obj,opts){if(opts.useNativeTimers){obj.setTimeoutFn=NATIVE_SET_TIMEOUT.bind(globalThisShim);obj.clearTimeoutFn=NATIVE_CLEAR_TIMEOUT.bind(globalThisShim)}else{obj.setTimeoutFn=globalThisShim.setTimeout.bind(globalThisShim);obj.clearTimeoutFn=globalThisShim.clearTimeout.bind(globalThisShim)}}var BASE64_OVERHEAD=1.33;function byteLength(obj){if(typeof obj===`string`)return utf8Length(obj);return Math.ceil((obj.byteLength||obj.size)*BASE64_OVERHEAD)}function utf8Length(str){let c=0,length=0;for(let i=0,l=str.length;i<l;i++){c=str.charCodeAt(i);if(c<128)length+=1;else if(c<2048)length+=2;else if(c<55296||c>=57344)length+=3;else{i++;length+=4}}return length}function randomString(){return Date.now().toString(36).substring(3)+Math.random().toString(36).substring(2,5)}function encode(obj){let str=``;for(let i in obj)if(obj.hasOwnProperty(i)){if(str.length)str+=`&`;str+=encodeURIComponent(i)+`=`+encodeURIComponent(obj[i])}return str}function decode(qs){let qry={};let pairs=qs.split(`&`);for(let i=0,l=pairs.length;i<l;i++){let pair=pairs[i].split(`=`);qry[decodeURIComponent(pair[0])]=decodeURIComponent(pair[1])}return qry}var TransportError=class extends Error{constructor(reason,description,context){super(reason);this.description=description;this.context=context;this.type=`TransportError`}};var Transport=class extends Emitter{constructor(opts){super();this.writable=false;installTimerFunctions(this,opts);this.opts=opts;this.query=opts.query;this.socket=opts.socket;this.supportsBinary=!opts.forceBase64}onError(reason,description,context){super.emitReserved(`error`,new TransportError(reason,description,context));return this}open(){this.readyState=`opening`;this.doOpen();return this}close(){if(this.readyState===`opening`||this.readyState===`open`){this.doClose();this.onClose()}return this}send(packets){if(this.readyState===`open`)this.write(packets)}onOpen(){this.readyState=`open`;this.writable=true;super.emitReserved(`open`)}onData(data){const packet=decodePacket(data,this.socket.binaryType);this.onPacket(packet)}onPacket(packet){super.emitReserved(`packet`,packet)}onClose(details){this.readyState=`closed`;super.emitReserved(`close`,details)}pause(onPause){}createUri(schema,query={}){return schema+`://`+this._hostname()+this._port()+this.opts.path+this._query(query)}_hostname(){const hostname=this.opts.hostname;return hostname.indexOf(`:`)===-1?hostname:`[`+hostname+`]`}_port(){if(this.opts.port&&(this.opts.secure&&Number(this.opts.port)!==443||!this.opts.secure&&Number(this.opts.port)!==80))return`:`+this.opts.port;else return``}_query(query){const encodedQuery=encode(query);return encodedQuery.length?`?`+encodedQuery:``}};var Polling=class extends Transport{constructor(){super(...arguments);this._polling=false}get name(){return`polling`}doOpen(){this._poll()}pause(onPause){this.readyState=`pausing`;const pause=()=>{this.readyState=`paused`;onPause()};if(this._polling||!this.writable){let total=0;if(this._polling){total++;this.once(`pollComplete`,function(){--total||pause()})}if(!this.writable){total++;this.once(`drain`,function(){--total||pause()})}}else pause()}_poll(){this._polling=true;this.doPoll();this.emitReserved(`poll`)}onData(data){const callback=packet=>{if(`opening`===this.readyState&&packet.type===`open`)this.onOpen();if(`close`===packet.type){this.onClose({description:`transport closed by the server`});return false}this.onPacket(packet)};decodePayload(data,this.socket.binaryType).forEach(callback);if(`closed`!==this.readyState){this._polling=false;this.emitReserved(`pollComplete`);if(`open`===this.readyState)this._poll()}}doClose(){const close=()=>{this.write([{type:`close`}])};if(`open`===this.readyState)close();else this.once(`open`,close)}write(packets){this.writable=false;encodePayload(packets,data=>{this.doWrite(data,()=>{this.writable=true;this.emitReserved(`drain`)})})}uri(){const schema=this.opts.secure?`https`:`http`;const query=this.query||{};if(false!==this.opts.timestampRequests)query[this.opts.timestampParam]=randomString();if(!this.supportsBinary&&!query.sid)query.b64=1;return this.createUri(schema,query)}};var value=false;try{value=typeof XMLHttpRequest!==`undefined`&&`withCredentials`in new XMLHttpRequest}catch(err){}var hasCORS=value;function empty(){}var BaseXHR=class extends Polling{constructor(opts){super(opts);if(typeof location!==`undefined`){const isSSL=`https:`===location.protocol;let port=location.port;if(!port)port=isSSL?`443`:`80`;this.xd=typeof location!==`undefined`&&opts.hostname!==location.hostname||port!==opts.port}}doWrite(data,fn){const req=this.request({method:`POST`,data});req.on(`success`,fn);req.on(`error`,(xhrStatus,context)=>{this.onError(`xhr post error`,xhrStatus,context)})}doPoll(){const req=this.request();req.on(`data`,this.onData.bind(this));req.on(`error`,(xhrStatus,context)=>{this.onError(`xhr poll error`,xhrStatus,context)});this.pollXhr=req}};var Request=class Request extends Emitter{constructor(createRequest,uri,opts){super();this.createRequest=createRequest;installTimerFunctions(this,opts);this._opts=opts;this._method=opts.method||`GET`;this._uri=uri;this._data=void 0!==opts.data?opts.data:null;this._create()}_create(){var _a;const opts=pick(this._opts,`agent`,`pfx`,`key`,`passphrase`,`cert`,`ca`,`ciphers`,`rejectUnauthorized`,`autoUnref`);opts.xdomain=!!this._opts.xd;const xhr=this._xhr=this.createRequest(opts);try{xhr.open(this._method,this._uri,true);try{if(this._opts.extraHeaders){xhr.setDisableHeaderCheck&&xhr.setDisableHeaderCheck(true);for(let i in this._opts.extraHeaders)if(this._opts.extraHeaders.hasOwnProperty(i))xhr.setRequestHeader(i,this._opts.extraHeaders[i])}}catch(e){}if(`POST`===this._method)try{xhr.setRequestHeader(`Content-type`,`text/plain;charset=UTF-8`)}catch(e){}try{xhr.setRequestHeader(`Accept`,`*/*`)}catch(e){}(_a=this._opts.cookieJar)===null||_a===void 0||_a.addCookies(xhr);if(`withCredentials`in xhr)xhr.withCredentials=this._opts.withCredentials;if(this._opts.requestTimeout)xhr.timeout=this._opts.requestTimeout;xhr.onreadystatechange=()=>{var _a;if(xhr.readyState===3)(_a=this._opts.cookieJar)===null||_a===void 0||_a.parseCookies(xhr.getResponseHeader(`set-cookie`));if(4!==xhr.readyState)return;if(200===xhr.status||1223===xhr.status)this._onLoad();else this.setTimeoutFn(()=>{this._onError(typeof xhr.status===`number`?xhr.status:0)},0)};xhr.send(this._data)}catch(e){this.setTimeoutFn(()=>{this._onError(e)},0);return}if(typeof document!==`undefined`){this._index=Request.requestsCount++;Request.requests[this._index]=this}}_onError(err){this.emitReserved(`error`,err,this._xhr);this._cleanup(true)}_cleanup(fromError){if(`undefined`===typeof this._xhr||null===this._xhr)return;this._xhr.onreadystatechange=empty;if(fromError)try{this._xhr.abort()}catch(e){}if(typeof document!==`undefined`)delete Request.requests[this._index];this._xhr=null}_onLoad(){const data=this._xhr.responseText;if(data!==null){this.emitReserved(`data`,data);this.emitReserved(`success`);this._cleanup()}}abort(){this._cleanup()}};Request.requestsCount=0;Request.requests={};if(typeof document!==`undefined`){if(typeof attachEvent===`function`)attachEvent(`onunload`,unloadHandler);else if(typeof addEventListener===`function`){const terminationEvent=`onpagehide`in globalThisShim?`pagehide`:`unload`;addEventListener(terminationEvent,unloadHandler,false)}}function unloadHandler(){for(let i in Request.requests)if(Request.requests.hasOwnProperty(i))Request.requests[i].abort()}var hasXHR2=(function(){const xhr=newRequest({xdomain:false});return xhr&&xhr.responseType!==null})();var XHR=class extends BaseXHR{constructor(opts){super(opts);const forceBase64=opts&&opts.forceBase64;this.supportsBinary=hasXHR2&&!forceBase64}request(opts={}){Object.assign(opts,{xd:this.xd},this.opts);return new Request(newRequest,this.uri(),opts)}};function newRequest(opts){const xdomain=opts.xdomain;try{if(`undefined`!==typeof XMLHttpRequest&&(!xdomain||hasCORS))return new XMLHttpRequest}catch(e){}if(!xdomain)try{return new globalThisShim[[`Active`].concat(`Object`).join(`X`)](`Microsoft.XMLHTTP`)}catch(e){}}var isReactNative=typeof navigator!==`undefined`&&typeof navigator.product===`string`&&navigator.product.toLowerCase()===`reactnative`;var BaseWS=class extends Transport{get name(){return`websocket`}doOpen(){const uri=this.uri();const protocols=this.opts.protocols;const opts=isReactNative?{}:pick(this.opts,`agent`,`perMessageDeflate`,`pfx`,`key`,`passphrase`,`cert`,`ca`,`ciphers`,`rejectUnauthorized`,`localAddress`,`protocolVersion`,`origin`,`maxPayload`,`family`,`checkServerIdentity`);if(this.opts.extraHeaders)opts.headers=this.opts.extraHeaders;try{this.ws=this.createSocket(uri,protocols,opts)}catch(err){return this.emitReserved(`error`,err)}this.ws.binaryType=this.socket.binaryType;this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{if(this.opts.autoUnref)this.ws._socket.unref();this.onOpen()};this.ws.onclose=closeEvent=>this.onClose({description:`websocket connection closed`,context:closeEvent});this.ws.onmessage=ev=>this.onData(ev.data);this.ws.onerror=e=>this.onError(`websocket error`,e)}write(packets){this.writable=false;for(let i=0;i<packets.length;i++){const packet=packets[i];const lastPacket=i===packets.length-1;encodePacket(packet,this.supportsBinary,data=>{try{this.doWrite(packet,data)}catch(e){}if(lastPacket)nextTick(()=>{this.writable=true;this.emitReserved(`drain`)},this.setTimeoutFn)})}}doClose(){if(typeof this.ws!==`undefined`){this.ws.onerror=()=>{};this.ws.close();this.ws=null}}uri(){const schema=this.opts.secure?`wss`:`ws`;const query=this.query||{};if(this.opts.timestampRequests)query[this.opts.timestampParam]=randomString();if(!this.supportsBinary)query.b64=1;return this.createUri(schema,query)}};var WebSocketCtor=globalThisShim.WebSocket||globalThisShim.MozWebSocket;var WS=class extends BaseWS{createSocket(uri,protocols,opts){return!isReactNative?protocols?new WebSocketCtor(uri,protocols):new WebSocketCtor(uri):new WebSocketCtor(uri,protocols,opts)}doWrite(_packet,data){this.ws.send(data)}};var WT=class extends Transport{get name(){return`webtransport`}doOpen(){try{this._transport=new WebTransport(this.createUri(`https`),this.opts.transportOptions[this.name])}catch(err){return this.emitReserved(`error`,err)}this._transport.closed.then(()=>{this.onClose()}).catch(err=>{this.onError(`webtransport error`,err)});this._transport.ready.then(()=>{this._transport.createBidirectionalStream().then(stream=>{const decoderStream=createPacketDecoderStream(Number.MAX_SAFE_INTEGER,this.socket.binaryType);const reader=stream.readable.pipeThrough(decoderStream).getReader();const encoderStream=createPacketEncoderStream();encoderStream.readable.pipeTo(stream.writable);this._writer=encoderStream.writable.getWriter();const read=()=>{reader.read().then(({done,value})=>{if(done)return;this.onPacket(value);read()}).catch(err=>{})};read();const packet={type:`open`};if(this.query.sid)packet.data=`{"sid":"${this.query.sid}"}`;this._writer.write(packet).then(()=>this.onOpen())})})}write(packets){this.writable=false;for(let i=0;i<packets.length;i++){const packet=packets[i];const lastPacket=i===packets.length-1;this._writer.write(packet).then(()=>{if(lastPacket)nextTick(()=>{this.writable=true;this.emitReserved(`drain`)},this.setTimeoutFn)})}}doClose(){var _a;(_a=this._transport)===null||_a===void 0||_a.close()}};var transports={websocket:WS,webtransport:WT,polling:XHR};var re=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/;var parts=[`source`,`protocol`,`authority`,`userInfo`,`user`,`password`,`host`,`port`,`relative`,`path`,`directory`,`file`,`query`,`anchor`];function parse(str){if(str.length>8e3)throw`URI too long`;const src=str,b=str.indexOf(`[`),e=str.indexOf(`]`);if(b!=-1&&e!=-1)str=str.substring(0,b)+str.substring(b,e).replace(/:/g,`;`)+str.substring(e,str.length);let m=re.exec(str||``),uri={},i=14;while(i--)uri[parts[i]]=m[i]||``;if(b!=-1&&e!=-1){uri.source=src;uri.host=uri.host.substring(1,uri.host.length-1).replace(/;/g,`:`);uri.authority=uri.authority.replace(`[`,``).replace(`]`,``).replace(/;/g,`:`);uri.ipv6uri=true}uri.pathNames=pathNames(uri,uri[`path`]);uri.queryKey=queryKey(uri,uri[`query`]);return uri}function pathNames(obj,path){const names=path.replace(/\/{2,9}/g,`/`).split(`/`);if(path.slice(0,1)==`/`||path.length===0)names.splice(0,1);if(path.slice(-1)==`/`)names.splice(names.length-1,1);return names}function queryKey(uri,query){const data={};query.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function($0,$1,$2){if($1)data[$1]=$2});return data}var withEventListeners=typeof addEventListener===`function`&&typeof removeEventListener===`function`;var OFFLINE_EVENT_LISTENERS=[];if(withEventListeners)addEventListener(`offline`,()=>{OFFLINE_EVENT_LISTENERS.forEach(listener=>listener())},false);var SocketWithoutUpgrade=class SocketWithoutUpgrade extends Emitter{constructor(uri,opts){super();this.binaryType=defaultBinaryType;this.writeBuffer=[];this._prevBufferLen=0;this._pingInterval=-1;this._pingTimeout=-1;this._maxPayload=-1;this._pingTimeoutTime=Infinity;if(uri&&`object`===typeof uri){opts=uri;uri=null}if(uri){const parsedUri=parse(uri);opts.hostname=parsedUri.host;opts.secure=parsedUri.protocol===`https`||parsedUri.protocol===`wss`;opts.port=parsedUri.port;if(parsedUri.query)opts.query=parsedUri.query}else if(opts.host)opts.hostname=parse(opts.host).host;installTimerFunctions(this,opts);this.secure=null!=opts.secure?opts.secure:typeof location!==`undefined`&&`https:`===location.protocol;if(opts.hostname&&!opts.port)opts.port=this.secure?`443`:`80`;this.hostname=opts.hostname||(typeof location!==`undefined`?location.hostname:`localhost`);this.port=opts.port||(typeof location!==`undefined`&&location.port?location.port:this.secure?`443`:`80`);this.transports=[];this._transportsByName={};opts.transports.forEach(t=>{const transportName=t.prototype.name;this.transports.push(transportName);this._transportsByName[transportName]=t});this.opts=Object.assign({path:`/engine.io`,agent:false,withCredentials:false,upgrade:true,timestampParam:`t`,rememberUpgrade:false,addTrailingSlash:true,rejectUnauthorized:true,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:false},opts);this.opts.path=this.opts.path.replace(/\/$/,``)+(this.opts.addTrailingSlash?`/`:``);if(typeof this.opts.query===`string`)this.opts.query=decode(this.opts.query);if(withEventListeners){if(this.opts.closeOnBeforeunload){this._beforeunloadEventListener=()=>{if(this.transport){this.transport.removeAllListeners();this.transport.close()}};addEventListener(`beforeunload`,this._beforeunloadEventListener,false)}if(this.hostname!==`localhost`){this._offlineEventListener=()=>{this._onClose(`transport close`,{description:`network connection lost`})};OFFLINE_EVENT_LISTENERS.push(this._offlineEventListener)}}if(this.opts.withCredentials)this._cookieJar=createCookieJar();this._open()}createTransport(name){const query=Object.assign({},this.opts.query);query.EIO=4;query.transport=name;if(this.id)query.sid=this.id;const opts=Object.assign({},this.opts,{query,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[name]);return new this._transportsByName[name](opts)}_open(){if(this.transports.length===0){this.setTimeoutFn(()=>{this.emitReserved(`error`,`No transports available`)},0);return}const transportName=this.opts.rememberUpgrade&&SocketWithoutUpgrade.priorWebsocketSuccess&&this.transports.indexOf(`websocket`)!==-1?`websocket`:this.transports[0];this.readyState=`opening`;const transport=this.createTransport(transportName);transport.open();this.setTransport(transport)}setTransport(transport){if(this.transport)this.transport.removeAllListeners();this.transport=transport;transport.on(`drain`,this._onDrain.bind(this)).on(`packet`,this._onPacket.bind(this)).on(`error`,this._onError.bind(this)).on(`close`,reason=>this._onClose(`transport close`,reason))}onOpen(){this.readyState=`open`;SocketWithoutUpgrade.priorWebsocketSuccess=`websocket`===this.transport.name;this.emitReserved(`open`);this.flush()}_onPacket(packet){if(`opening`===this.readyState||`open`===this.readyState||`closing`===this.readyState){this.emitReserved(`packet`,packet);this.emitReserved(`heartbeat`);switch(packet.type){case`open`:this.onHandshake(JSON.parse(packet.data));break;case`ping`:this._sendPacket(`pong`);this.emitReserved(`ping`);this.emitReserved(`pong`);this._resetPingTimeout();break;case`error`:const err=new Error(`server error`);err.code=packet.data;this._onError(err);break;case`message`:this.emitReserved(`data`,packet.data);this.emitReserved(`message`,packet.data)}}}onHandshake(data){this.emitReserved(`handshake`,data);this.id=data.sid;this.transport.query.sid=data.sid;this._pingInterval=data.pingInterval;this._pingTimeout=data.pingTimeout;this._maxPayload=data.maxPayload;this.onOpen();if(`closed`===this.readyState)return;this._resetPingTimeout()}_resetPingTimeout(){this.clearTimeoutFn(this._pingTimeoutTimer);const delay=this._pingInterval+this._pingTimeout;this._pingTimeoutTime=Date.now()+delay;this._pingTimeoutTimer=this.setTimeoutFn(()=>{this._onClose(`ping timeout`)},delay);if(this.opts.autoUnref)this._pingTimeoutTimer.unref()}_onDrain(){this.writeBuffer.splice(0,this._prevBufferLen);this._prevBufferLen=0;if(0===this.writeBuffer.length)this.emitReserved(`drain`);else this.flush()}flush(){if(`closed`!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){const packets=this._getWritablePackets();this.transport.send(packets);this._prevBufferLen=packets.length;this.emitReserved(`flush`)}}_getWritablePackets(){if(!(this._maxPayload&&this.transport.name===`polling`&&this.writeBuffer.length>1))return this.writeBuffer;let payloadSize=1;for(let i=0;i<this.writeBuffer.length;i++){const data=this.writeBuffer[i].data;if(data)payloadSize+=byteLength(data);if(i>0&&payloadSize>this._maxPayload)return this.writeBuffer.slice(0,i);payloadSize+=2}return this.writeBuffer}_hasPingExpired(){if(!this._pingTimeoutTime)return true;const hasExpired=Date.now()>this._pingTimeoutTime;if(hasExpired){this._pingTimeoutTime=0;nextTick(()=>{this._onClose(`ping timeout`)},this.setTimeoutFn)}return hasExpired}write(msg,options,fn){this._sendPacket(`message`,msg,options,fn);return this}send(msg,options,fn){this._sendPacket(`message`,msg,options,fn);return this}_sendPacket(type,data,options,fn){if(`function`===typeof data){fn=data;data=void 0}if(`function`===typeof options){fn=options;options=null}if(`closing`===this.readyState||`closed`===this.readyState)return;options=options||{};options.compress=false!==options.compress;const packet={type,data,options};this.emitReserved(`packetCreate`,packet);this.writeBuffer.push(packet);if(fn)this.once(`flush`,fn);this.flush()}close(){const close=()=>{this._onClose(`forced close`);this.transport.close()};const cleanupAndClose=()=>{this.off(`upgrade`,cleanupAndClose);this.off(`upgradeError`,cleanupAndClose);close()};const waitForUpgrade=()=>{this.once(`upgrade`,cleanupAndClose);this.once(`upgradeError`,cleanupAndClose)};if(`opening`===this.readyState||`open`===this.readyState){this.readyState=`closing`;if(this.writeBuffer.length)this.once(`drain`,()=>{if(this.upgrading)waitForUpgrade();else close()});else if(this.upgrading)waitForUpgrade();else close()}return this}_onError(err){SocketWithoutUpgrade.priorWebsocketSuccess=false;if(this.opts.tryAllTransports&&this.transports.length>1&&this.readyState===`opening`){this.transports.shift();return this._open()}this.emitReserved(`error`,err);this._onClose(`transport error`,err)}_onClose(reason,description){if(`opening`===this.readyState||`open`===this.readyState||`closing`===this.readyState){this.clearTimeoutFn(this._pingTimeoutTimer);this.transport.removeAllListeners(`close`);this.transport.close();this.transport.removeAllListeners();if(withEventListeners){if(this._beforeunloadEventListener)removeEventListener(`beforeunload`,this._beforeunloadEventListener,false);if(this._offlineEventListener){const i=OFFLINE_EVENT_LISTENERS.indexOf(this._offlineEventListener);if(i!==-1)OFFLINE_EVENT_LISTENERS.splice(i,1)}}this.readyState=`closed`;this.id=null;this.emitReserved(`close`,reason,description);this.writeBuffer=[];this._prevBufferLen=0}}};SocketWithoutUpgrade.protocol=4;var SocketWithUpgrade=class extends SocketWithoutUpgrade{constructor(){super(...arguments);this._upgrades=[]}onOpen(){super.onOpen();if(`open`===this.readyState&&this.opts.upgrade)for(let i=0;i<this._upgrades.length;i++)this._probe(this._upgrades[i])}_probe(name){let transport=this.createTransport(name);let failed=false;SocketWithoutUpgrade.priorWebsocketSuccess=false;const onTransportOpen=()=>{if(failed)return;transport.send([{type:`ping`,data:`probe`}]);transport.once(`packet`,msg=>{if(failed)return;if(`pong`===msg.type&&`probe`===msg.data){this.upgrading=true;this.emitReserved(`upgrading`,transport);if(!transport)return;SocketWithoutUpgrade.priorWebsocketSuccess=`websocket`===transport.name;this.transport.pause(()=>{if(failed)return;if(`closed`===this.readyState)return;cleanup();this.setTransport(transport);transport.send([{type:`upgrade`}]);this.emitReserved(`upgrade`,transport);transport=null;this.upgrading=false;this.flush()})}else{const err=new Error(`probe error`);err.transport=transport.name;this.emitReserved(`upgradeError`,err)}})};function freezeTransport(){if(failed)return;failed=true;cleanup();transport.close();transport=null}const onerror=err=>{const error=new Error(`probe error: `+err);error.transport=transport.name;freezeTransport();this.emitReserved(`upgradeError`,error)};function onTransportClose(){onerror(`transport closed`)}function onclose(){onerror(`socket closed`)}function onupgrade(to){if(transport&&to.name!==transport.name)freezeTransport()}const cleanup=()=>{transport.removeListener(`open`,onTransportOpen);transport.removeListener(`error`,onerror);transport.removeListener(`close`,onTransportClose);this.off(`close`,onclose);this.off(`upgrading`,onupgrade)};transport.once(`open`,onTransportOpen);transport.once(`error`,onerror);transport.once(`close`,onTransportClose);this.once(`close`,onclose);this.once(`upgrading`,onupgrade);if(this._upgrades.indexOf(`webtransport`)!==-1&&name!==`webtransport`)this.setTimeoutFn(()=>{if(!failed)transport.open()},200);else transport.open()}onHandshake(data){this._upgrades=this._filterUpgrades(data.upgrades);super.onHandshake(data)}_filterUpgrades(upgrades){const filteredUpgrades=[];for(let i=0;i<upgrades.length;i++)if(~this.transports.indexOf(upgrades[i]))filteredUpgrades.push(upgrades[i]);return filteredUpgrades}};var Socket$1=class extends SocketWithUpgrade{constructor(uri,opts={}){const isOptionsOnly=typeof uri===`object`;const o=isOptionsOnly?{...uri}:{...opts};if(!o.transports||o.transports&&typeof o.transports[0]===`string`)o.transports=(o.transports||[`polling`,`websocket`,`webtransport`]).map(transportName=>transports[transportName]).filter(t=>!!t);super(isOptionsOnly?o:uri,o)}};var protocol$1=Socket$1.protocol;function url(uri,path=``,loc){let obj=uri;loc=loc||typeof location!==`undefined`&&location;if(null==uri)uri=loc.protocol+`//`+loc.host;if(typeof uri===`string`){if(`/`===uri.charAt(0)){if(`/`===uri.charAt(1))uri=loc.protocol+uri;else uri=loc.host+uri}if(!/^(https?|wss?):\/\//.test(uri)){if(`undefined`!==typeof loc)uri=loc.protocol+`//`+uri;else uri=`https://`+uri}obj=parse(uri)}if(!obj.port){if(/^(http|ws)$/.test(obj.protocol))obj.port=`80`;else if(/^(http|ws)s$/.test(obj.protocol))obj.port=`443`}obj.path=obj.path||`/`;const host=obj.host.indexOf(`:`)!==-1?`[`+obj.host+`]`:obj.host;obj.id=obj.protocol+`://`+host+`:`+obj.port+path;obj.href=obj.protocol+`://`+host+(loc&&loc.port===obj.port?``:`:`+obj.port);return obj}var withNativeArrayBuffer=typeof ArrayBuffer===`function`;var isView=obj=>{return typeof ArrayBuffer.isView===`function`?ArrayBuffer.isView(obj):obj.buffer instanceof ArrayBuffer};var toString=Object.prototype.toString;var withNativeBlob=typeof Blob===`function`||typeof Blob!==`undefined`&&toString.call(Blob)===`[object BlobConstructor]`;var withNativeFile=typeof File===`function`||typeof File!==`undefined`&&toString.call(File)===`[object FileConstructor]`;function isBinary(obj){return withNativeArrayBuffer&&(obj instanceof ArrayBuffer||isView(obj))||withNativeBlob&&obj instanceof Blob||withNativeFile&&obj instanceof File}function hasBinary(obj,toJSON){if(!obj||typeof obj!==`object`)return false;if(Array.isArray(obj)){for(let i=0,l=obj.length;i<l;i++)if(hasBinary(obj[i]))return true;return false}if(isBinary(obj))return true;if(obj.toJSON&&typeof obj.toJSON===`function`&&arguments.length===1)return hasBinary(obj.toJSON(),true);for(const key in obj)if(Object.prototype.hasOwnProperty.call(obj,key)&&hasBinary(obj[key]))return true;return false}function deconstructPacket(packet){const buffers=[];const packetData=packet.data;const pack=packet;pack.data=_deconstructPacket(packetData,buffers);pack.attachments=buffers.length;return{packet:pack,buffers}}function _deconstructPacket(data,buffers,toJSON){if(!data)return data;if(isBinary(data)){const placeholder={_placeholder:true,num:buffers.length};buffers.push(data);return placeholder}else if(Array.isArray(data)){const newData=new Array(data.length);for(let i=0;i<data.length;i++)newData[i]=_deconstructPacket(data[i],buffers);return newData}else if(typeof data===`object`&&!(data instanceof Date)){if(data.toJSON&&typeof data.toJSON===`function`&&!toJSON)return _deconstructPacket(data.toJSON(),buffers,true);const newData={};for(const key in data)if(Object.prototype.hasOwnProperty.call(data,key))newData[key]=_deconstructPacket(data[key],buffers);return newData}return data}function reconstructPacket(packet,buffers){packet.data=_reconstructPacket(packet.data,buffers);delete packet.attachments;return packet}function _reconstructPacket(data,buffers){if(!data)return data;if(data&&data._placeholder===true){if(typeof data.num===`number`&&data.num>=0&&data.num<buffers.length)return buffers[data.num];else throw new Error(`illegal attachments`)}else if(Array.isArray(data))for(let i=0;i<data.length;i++)data[i]=_reconstructPacket(data[i],buffers);else if(typeof data===`object`){for(const key in data)if(Object.prototype.hasOwnProperty.call(data,key))data[key]=_reconstructPacket(data[key],buffers)}return data}var esm_exports=__exportAll({Decoder:()=>Decoder,Encoder:()=>Encoder,PacketType:()=>PacketType,isPacketValid:()=>isPacketValid,protocol:()=>5});var RESERVED_EVENTS$1=[`connect`,`connect_error`,`disconnect`,`disconnecting`,`newListener`,`removeListener`];var protocol=5;var PacketType;(function(PacketType){PacketType[PacketType[`CONNECT`]=0]=`CONNECT`;PacketType[PacketType[`DISCONNECT`]=1]=`DISCONNECT`;PacketType[PacketType[`EVENT`]=2]=`EVENT`;PacketType[PacketType[`ACK`]=3]=`ACK`;PacketType[PacketType[`CONNECT_ERROR`]=4]=`CONNECT_ERROR`;PacketType[PacketType[`BINARY_EVENT`]=5]=`BINARY_EVENT`;PacketType[PacketType[`BINARY_ACK`]=6]=`BINARY_ACK`})(PacketType||(PacketType={}));var Encoder=class{constructor(replacer){this.replacer=replacer}encode(obj){if(obj.type===PacketType.EVENT||obj.type===PacketType.ACK){if(hasBinary(obj))return this.encodeAsBinary({type:obj.type===PacketType.EVENT?PacketType.BINARY_EVENT:PacketType.BINARY_ACK,nsp:obj.nsp,data:obj.data,id:obj.id})}return[this.encodeAsString(obj)]}encodeAsString(obj){let str=``+obj.type;if(obj.type===PacketType.BINARY_EVENT||obj.type===PacketType.BINARY_ACK)str+=obj.attachments+`-`;if(obj.nsp&&`/`!==obj.nsp)str+=obj.nsp+`,`;if(null!=obj.id)str+=obj.id;if(null!=obj.data)str+=JSON.stringify(obj.data,this.replacer);return str}encodeAsBinary(obj){const deconstruction=deconstructPacket(obj);const pack=this.encodeAsString(deconstruction.packet);const buffers=deconstruction.buffers;buffers.unshift(pack);return buffers}};var Decoder=class Decoder extends Emitter{constructor(opts){super();this.opts=Object.assign({reviver:void 0,maxAttachments:10},typeof opts===`function`?{reviver:opts}:opts)}add(obj){let packet;if(typeof obj===`string`){if(this.reconstructor)throw new Error(`got plaintext data when reconstructing a packet`);packet=this.decodeString(obj);const isBinaryEvent=packet.type===PacketType.BINARY_EVENT;if(isBinaryEvent||packet.type===PacketType.BINARY_ACK){packet.type=isBinaryEvent?PacketType.EVENT:PacketType.ACK;this.reconstructor=new BinaryReconstructor(packet)}else super.emitReserved(`decoded`,packet)}else if(isBinary(obj)||obj.base64){if(!this.reconstructor)throw new Error(`got binary data when not reconstructing a packet`);else{packet=this.reconstructor.takeBinaryData(obj);if(packet){this.reconstructor=null;super.emitReserved(`decoded`,packet)}}}else throw new Error(`Unknown type: `+obj)}decodeString(str){let i=0;const p={type:Number(str.charAt(0))};if(PacketType[p.type]===void 0)throw new Error(`unknown packet type `+p.type);if(p.type===PacketType.BINARY_EVENT||p.type===PacketType.BINARY_ACK){const start=i+1;while(str.charAt(++i)!==`-`&&i!=str.length);const buf=str.substring(start,i);if(buf!=Number(buf)||str.charAt(i)!==`-`)throw new Error(`Illegal attachments`);const n=Number(buf);if(!isInteger(n)||n<1)throw new Error(`Illegal attachments`);else if(n>this.opts.maxAttachments)throw new Error(`too many attachments`);p.attachments=n}if(`/`===str.charAt(i+1)){const start=i+1;while(++i){if(`,`===str.charAt(i))break;if(i===str.length)break}p.nsp=str.substring(start,i)}else p.nsp=`/`;const next=str.charAt(i+1);if(``!==next&&Number(next)==next){const start=i+1;while(++i){const c=str.charAt(i);if(null==c||Number(c)!=c){--i;break}if(i===str.length)break}p.id=Number(str.substring(start,i+1))}if(str.charAt(++i)){const payload=this.tryParse(str.substr(i));if(Decoder.isPayloadValid(p.type,payload))p.data=payload;else throw new Error(`invalid payload`)}return p}tryParse(str){try{return JSON.parse(str,this.opts.reviver)}catch(e){return false}}static isPayloadValid(type,payload){switch(type){case PacketType.CONNECT:return isObject(payload);case PacketType.DISCONNECT:return payload===void 0;case PacketType.CONNECT_ERROR:return typeof payload===`string`||isObject(payload);case PacketType.EVENT:case PacketType.BINARY_EVENT:return Array.isArray(payload)&&(typeof payload[0]===`number`||typeof payload[0]===`string`&&RESERVED_EVENTS$1.indexOf(payload[0])===-1);case PacketType.ACK:case PacketType.BINARY_ACK:return Array.isArray(payload)}}destroy(){if(this.reconstructor){this.reconstructor.finishedReconstruction();this.reconstructor=null}}};var BinaryReconstructor=class{constructor(packet){this.packet=packet;this.buffers=[];this.reconPack=packet}takeBinaryData(binData){this.buffers.push(binData);if(this.buffers.length===this.reconPack.attachments){const packet=reconstructPacket(this.reconPack,this.buffers);this.finishedReconstruction();return packet}return null}finishedReconstruction(){this.reconPack=null;this.buffers=[]}};function isNamespaceValid(nsp){return typeof nsp===`string`}var isInteger=Number.isInteger||function(value){return typeof value===`number`&&isFinite(value)&&Math.floor(value)===value};function isAckIdValid(id){return id===void 0||isInteger(id)}function isObject(value){return Object.prototype.toString.call(value)===`[object Object]`}function isDataValid(type,payload){switch(type){case PacketType.CONNECT:return payload===void 0||isObject(payload);case PacketType.DISCONNECT:return payload===void 0;case PacketType.EVENT:return Array.isArray(payload)&&(typeof payload[0]===`number`||typeof payload[0]===`string`&&RESERVED_EVENTS$1.indexOf(payload[0])===-1);case PacketType.ACK:return Array.isArray(payload);case PacketType.CONNECT_ERROR:return typeof payload===`string`||isObject(payload);default:return false}}function isPacketValid(packet){return isNamespaceValid(packet.nsp)&&isAckIdValid(packet.id)&&isDataValid(packet.type,packet.data)}function on(obj,ev,fn){obj.on(ev,fn);return function subDestroy(){obj.off(ev,fn)}}var RESERVED_EVENTS=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1});var Socket=class extends Emitter{constructor(io,nsp,opts){super();this.connected=false;this.recovered=false;this.receiveBuffer=[];this.sendBuffer=[];this._queue=[];this._queueSeq=0;this.ids=0;this.acks={};this.flags={};this.io=io;this.nsp=nsp;if(opts&&opts.auth)this.auth=opts.auth;this._opts=Object.assign({},opts);if(this.io._autoConnect)this.open()}get disconnected(){return!this.connected}subEvents(){if(this.subs)return;const io=this.io;this.subs=[on(io,`open`,this.onopen.bind(this)),on(io,`packet`,this.onpacket.bind(this)),on(io,`error`,this.onerror.bind(this)),on(io,`close`,this.onclose.bind(this))]}get active(){return!!this.subs}connect(){if(this.connected)return this;this.subEvents();if(!this.io[`_reconnecting`])this.io.open();if(`open`===this.io._readyState)this.onopen();return this}open(){return this.connect()}send(...args){args.unshift(`message`);this.emit.apply(this,args);return this}emit(ev,...args){var _a,_b,_c;if(RESERVED_EVENTS.hasOwnProperty(ev))throw new Error(`"`+ev.toString()+`" is a reserved event name`);args.unshift(ev);if(this._opts.retries&&!this.flags.fromQueue&&!this.flags.volatile){this._addToQueue(args);return this}const packet={type:PacketType.EVENT,data:args};packet.options={};packet.options.compress=this.flags.compress!==false;if(`function`===typeof args[args.length-1]){const id=this.ids++;const ack=args.pop();this._registerAckCallback(id,ack);packet.id=id}const isTransportWritable=(_b=(_a=this.io.engine)===null||_a===void 0?void 0:_a.transport)===null||_b===void 0?void 0:_b.writable;const isConnected=this.connected&&!((_c=this.io.engine)===null||_c===void 0?void 0:_c._hasPingExpired());if(this.flags.volatile&&!isTransportWritable){}else if(isConnected){this.notifyOutgoingListeners(packet);this.packet(packet)}else this.sendBuffer.push(packet);this.flags={};return this}_registerAckCallback(id,ack){var _a;const timeout=(_a=this.flags.timeout)!==null&&_a!==void 0?_a:this._opts.ackTimeout;if(timeout===void 0){this.acks[id]=ack;return}const timer=this.io.setTimeoutFn(()=>{delete this.acks[id];for(let i=0;i<this.sendBuffer.length;i++)if(this.sendBuffer[i].id===id)this.sendBuffer.splice(i,1);ack.call(this,new Error(`operation has timed out`))},timeout);const fn=(...args)=>{this.io.clearTimeoutFn(timer);ack.apply(this,args)};fn.withError=true;this.acks[id]=fn}emitWithAck(ev,...args){return new Promise((resolve,reject)=>{const fn=(arg1,arg2)=>{return arg1?reject(arg1):resolve(arg2)};fn.withError=true;args.push(fn);this.emit(ev,...args)})}_addToQueue(args){let ack;if(typeof args[args.length-1]===`function`)ack=args.pop();const packet={id:this._queueSeq++,tryCount:0,pending:false,args,flags:Object.assign({fromQueue:true},this.flags)};args.push((err,...responseArgs)=>{if(packet!==this._queue[0]){}if(err!==null){if(packet.tryCount>this._opts.retries){this._queue.shift();if(ack)ack(err)}}else{this._queue.shift();if(ack)ack(null,...responseArgs)}packet.pending=false;return this._drainQueue()});this._queue.push(packet);this._drainQueue()}_drainQueue(force=false){if(!this.connected||this._queue.length===0)return;const packet=this._queue[0];if(packet.pending&&!force)return;packet.pending=true;packet.tryCount++;this.flags=packet.flags;this.emit.apply(this,packet.args)}packet(packet){packet.nsp=this.nsp;this.io._packet(packet)}onopen(){if(typeof this.auth==`function`)this.auth(data=>{this._sendConnectPacket(data)});else this._sendConnectPacket(this.auth)}_sendConnectPacket(data){this.packet({type:PacketType.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},data):data})}onerror(err){if(!this.connected)this.emitReserved(`connect_error`,err)}onclose(reason,description){this.connected=false;delete this.id;this.emitReserved(`disconnect`,reason,description);this._clearAcks()}_clearAcks(){Object.keys(this.acks).forEach(id=>{if(!this.sendBuffer.some(packet=>String(packet.id)===id)){const ack=this.acks[id];delete this.acks[id];if(ack.withError)ack.call(this,new Error(`socket has been disconnected`))}})}onpacket(packet){if(!(packet.nsp===this.nsp))return;switch(packet.type){case PacketType.CONNECT:if(packet.data&&packet.data.sid)this.onconnect(packet.data.sid,packet.data.pid);else this.emitReserved(`connect_error`,new Error(`It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)`));break;case PacketType.EVENT:case PacketType.BINARY_EVENT:this.onevent(packet);break;case PacketType.ACK:case PacketType.BINARY_ACK:this.onack(packet);break;case PacketType.DISCONNECT:this.ondisconnect();break;case PacketType.CONNECT_ERROR:this.destroy();const err=new Error(packet.data.message);err.data=packet.data.data;this.emitReserved(`connect_error`,err)}}onevent(packet){const args=packet.data||[];if(null!=packet.id)args.push(this.ack(packet.id));if(this.connected)this.emitEvent(args);else this.receiveBuffer.push(Object.freeze(args))}emitEvent(args){if(this._anyListeners&&this._anyListeners.length){const listeners=this._anyListeners.slice();for(const listener of listeners)listener.apply(this,args)}super.emit.apply(this,args);if(this._pid&&args.length&&typeof args[args.length-1]===`string`)this._lastOffset=args[args.length-1]}ack(id){const self=this;let sent=false;return function(...args){if(sent)return;sent=true;self.packet({type:PacketType.ACK,id,data:args})}}onack(packet){const ack=this.acks[packet.id];if(typeof ack!==`function`)return;delete this.acks[packet.id];if(ack.withError)packet.data.unshift(null);ack.apply(this,packet.data)}onconnect(id,pid){this.id=id;this.recovered=pid&&this._pid===pid;this._pid=pid;this.connected=true;this.emitBuffered();this._drainQueue(true);this.emitReserved(`connect`)}emitBuffered(){this.receiveBuffer.forEach(args=>this.emitEvent(args));this.receiveBuffer=[];this.sendBuffer.forEach(packet=>{this.notifyOutgoingListeners(packet);this.packet(packet)});this.sendBuffer=[]}ondisconnect(){this.destroy();this.onclose(`io server disconnect`)}destroy(){if(this.subs){this.subs.forEach(subDestroy=>subDestroy());this.subs=void 0}this.io[`_destroy`](this)}disconnect(){if(this.connected)this.packet({type:PacketType.DISCONNECT});this.destroy();if(this.connected)this.onclose(`io client disconnect`);return this}close(){return this.disconnect()}compress(compress){this.flags.compress=compress;return this}get volatile(){this.flags.volatile=true;return this}timeout(timeout){this.flags.timeout=timeout;return this}onAny(listener){this._anyListeners=this._anyListeners||[];this._anyListeners.push(listener);return this}prependAny(listener){this._anyListeners=this._anyListeners||[];this._anyListeners.unshift(listener);return this}offAny(listener){if(!this._anyListeners)return this;if(listener){const listeners=this._anyListeners;for(let i=0;i<listeners.length;i++)if(listener===listeners[i]){listeners.splice(i,1);return this}}else this._anyListeners=[];return this}listenersAny(){return this._anyListeners||[]}onAnyOutgoing(listener){this._anyOutgoingListeners=this._anyOutgoingListeners||[];this._anyOutgoingListeners.push(listener);return this}prependAnyOutgoing(listener){this._anyOutgoingListeners=this._anyOutgoingListeners||[];this._anyOutgoingListeners.unshift(listener);return this}offAnyOutgoing(listener){if(!this._anyOutgoingListeners)return this;if(listener){const listeners=this._anyOutgoingListeners;for(let i=0;i<listeners.length;i++)if(listener===listeners[i]){listeners.splice(i,1);return this}}else this._anyOutgoingListeners=[];return this}listenersAnyOutgoing(){return this._anyOutgoingListeners||[]}notifyOutgoingListeners(packet){if(this._anyOutgoingListeners&&this._anyOutgoingListeners.length){const listeners=this._anyOutgoingListeners.slice();for(const listener of listeners)listener.apply(this,packet.data)}}};function Backoff(opts){opts=opts||{};this.ms=opts.min||100;this.max=opts.max||1e4;this.factor=opts.factor||2;this.jitter=opts.jitter>0&&opts.jitter<=1?opts.jitter:0;this.attempts=0}Backoff.prototype.duration=function(){var ms=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var rand=Math.random();var deviation=Math.floor(rand*this.jitter*ms);ms=(Math.floor(rand*10)&1)==0?ms-deviation:ms+deviation}return Math.min(ms,this.max)|0};Backoff.prototype.reset=function(){this.attempts=0};Backoff.prototype.setMin=function(min){this.ms=min};Backoff.prototype.setMax=function(max){this.max=max};Backoff.prototype.setJitter=function(jitter){this.jitter=jitter};var Manager=class extends Emitter{constructor(uri,opts){var _a;super();this.nsps={};this.subs=[];if(uri&&`object`===typeof uri){opts=uri;uri=void 0}opts=opts||{};opts.path=opts.path||`/socket.io`;this.opts=opts;installTimerFunctions(this,opts);this.reconnection(opts.reconnection!==false);this.reconnectionAttempts(opts.reconnectionAttempts||Infinity);this.reconnectionDelay(opts.reconnectionDelay||1e3);this.reconnectionDelayMax(opts.reconnectionDelayMax||5e3);this.randomizationFactor((_a=opts.randomizationFactor)!==null&&_a!==void 0?_a:.5);this.backoff=new Backoff({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()});this.timeout(null==opts.timeout?2e4:opts.timeout);this._readyState=`closed`;this.uri=uri;const _parser=opts.parser||esm_exports;this.encoder=new _parser.Encoder;this.decoder=new _parser.Decoder;this._autoConnect=opts.autoConnect!==false;if(this._autoConnect)this.open()}reconnection(v){if(!arguments.length)return this._reconnection;this._reconnection=!!v;if(!v)this.skipReconnect=true;return this}reconnectionAttempts(v){if(v===void 0)return this._reconnectionAttempts;this._reconnectionAttempts=v;return this}reconnectionDelay(v){var _a;if(v===void 0)return this._reconnectionDelay;this._reconnectionDelay=v;(_a=this.backoff)===null||_a===void 0||_a.setMin(v);return this}randomizationFactor(v){var _a;if(v===void 0)return this._randomizationFactor;this._randomizationFactor=v;(_a=this.backoff)===null||_a===void 0||_a.setJitter(v);return this}reconnectionDelayMax(v){var _a;if(v===void 0)return this._reconnectionDelayMax;this._reconnectionDelayMax=v;(_a=this.backoff)===null||_a===void 0||_a.setMax(v);return this}timeout(v){if(!arguments.length)return this._timeout;this._timeout=v;return this}maybeReconnectOnOpen(){if(!this._reconnecting&&this._reconnection&&this.backoff.attempts===0)this.reconnect()}open(fn){if(~this._readyState.indexOf(`open`))return this;this.engine=new Socket$1(this.uri,this.opts);const socket=this.engine;const self=this;this._readyState=`opening`;this.skipReconnect=false;const openSubDestroy=on(socket,`open`,function(){self.onopen();fn&&fn()});const onError=err=>{this.cleanup();this._readyState=`closed`;this.emitReserved(`error`,err);if(fn)fn(err);else this.maybeReconnectOnOpen()};const errorSub=on(socket,`error`,onError);if(false!==this._timeout){const timeout=this._timeout;const timer=this.setTimeoutFn(()=>{openSubDestroy();onError(new Error(`timeout`));socket.close()},timeout);if(this.opts.autoUnref)timer.unref();this.subs.push(()=>{this.clearTimeoutFn(timer)})}this.subs.push(openSubDestroy);this.subs.push(errorSub);return this}connect(fn){return this.open(fn)}onopen(){this.cleanup();this._readyState=`open`;this.emitReserved(`open`);const socket=this.engine;this.subs.push(on(socket,`ping`,this.onping.bind(this)),on(socket,`data`,this.ondata.bind(this)),on(socket,`error`,this.onerror.bind(this)),on(socket,`close`,this.onclose.bind(this)),on(this.decoder,`decoded`,this.ondecoded.bind(this)))}onping(){this.emitReserved(`ping`)}ondata(data){try{this.decoder.add(data)}catch(e){this.onclose(`parse error`,e)}}ondecoded(packet){nextTick(()=>{this.emitReserved(`packet`,packet)},this.setTimeoutFn)}onerror(err){this.emitReserved(`error`,err)}socket(nsp,opts){let socket=this.nsps[nsp];if(!socket){socket=new Socket(this,nsp,opts);this.nsps[nsp]=socket}else if(this._autoConnect&&!socket.active)socket.connect();return socket}_destroy(socket){const nsps=Object.keys(this.nsps);for(const nsp of nsps)if(this.nsps[nsp].active)return;this._close()}_packet(packet){const encodedPackets=this.encoder.encode(packet);for(let i=0;i<encodedPackets.length;i++)this.engine.write(encodedPackets[i],packet.options)}cleanup(){this.subs.forEach(subDestroy=>subDestroy());this.subs.length=0;this.decoder.destroy()}_close(){this.skipReconnect=true;this._reconnecting=false;this.onclose(`forced close`)}disconnect(){return this._close()}onclose(reason,description){var _a;this.cleanup();(_a=this.engine)===null||_a===void 0||_a.close();this.backoff.reset();this._readyState=`closed`;this.emitReserved(`close`,reason,description);if(this._reconnection&&!this.skipReconnect)this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;const self=this;if(this.backoff.attempts>=this._reconnectionAttempts){this.backoff.reset();this.emitReserved(`reconnect_failed`);this._reconnecting=false}else{const delay=this.backoff.duration();this._reconnecting=true;const timer=this.setTimeoutFn(()=>{if(self.skipReconnect)return;this.emitReserved(`reconnect_attempt`,self.backoff.attempts);if(self.skipReconnect)return;self.open(err=>{if(err){self._reconnecting=false;self.reconnect();this.emitReserved(`reconnect_error`,err)}else self.onreconnect()})},delay);if(this.opts.autoUnref)timer.unref();this.subs.push(()=>{this.clearTimeoutFn(timer)})}}onreconnect(){const attempt=this.backoff.attempts;this._reconnecting=false;this.backoff.reset();this.emitReserved(`reconnect`,attempt)}};var cache={};function lookup(uri,opts){if(typeof uri===`object`){opts=uri;uri=void 0}opts=opts||{};const parsed=url(uri,opts.path||`/socket.io`);const source=parsed.source;const id=parsed.id;const path=parsed.path;const sameNamespace=cache[id]&&path in cache[id][`nsps`];const newConnection=opts.forceNew||opts[`force new connection`]||false===opts.multiplex||sameNamespace;let io;if(newConnection)io=new Manager(source,opts);else{if(!cache[id])cache[id]=new Manager(source,opts);io=cache[id]}if(parsed.query&&!opts.query)opts.query=parsed.queryKey;return io.socket(parsed.path,opts)}Object.assign(lookup,{Manager,Socket,io:lookup,connect:lookup});var SOCKET_IO_PATH=`/socket.io`;function createSocketIoClient({url=``,options={},connect=lookup}={}){if(typeof connect!==`function`)throw new Error(`createSocketIoClient requires a valid socket.io client connect function.`);const normalizedUrl=normalizeText$1(url);const normalizedOptions={...options&&typeof options===`object`&&!Array.isArray(options)?options:{},path:SOCKET_IO_PATH};if(normalizedUrl)return connect(normalizedUrl,normalizedOptions);return connect(normalizedOptions)}function disconnectSocketIoClient(socket){if(!socket||typeof socket.disconnect!==`function`)return;socket.disconnect()}function reconnectSocketIoClient(socket){if(!socket||socket.connected||typeof socket.connect!==`function`)return;if(socket.active)socket.disconnect();socket.connect()}var jskit$6={"realtime":{"indicator":{"connected":`Realtime connected`,"connectedTooltip":`Realtime is connected. Live updates are active.`,"disconnected":`Realtime disconnected`,"disconnectedTooltip":`Live updates are disconnected. Click to reconnect. If your session expired, sign in again.`,"reconnect":`Reconnect live updates`,"unavailableTooltip":`Realtime is unavailable. Live updates are disabled for this page.`}}};var en_default$6={jskit:jskit$6};registerJskitMessages(en_default$6);var{t:t$10}=useJskitText();var ROOT_STYLE=Object.freeze({alignItems:`center`,background:`transparent`,border:`0`,borderRadius:`50%`,display:`inline-flex`,height:`48px`,justifyContent:`center`,padding:`0`,width:`48px`});var DOT_STYLE=Object.freeze({borderRadius:`9999px`,boxShadow:`0 0 0 2px rgba(255, 255, 255, 0.82)`,display:`block`,height:`10px`,width:`10px`});var SR_ONLY_STYLE=Object.freeze({border:`0`,clip:`rect(0, 0, 0, 0)`,clipPath:`inset(50%)`,height:`1px`,margin:`-1px`,overflow:`hidden`,padding:`0`,position:`absolute`,whiteSpace:`nowrap`,width:`1px`});function resolveTooltipText({realtimeAvailable,connected}){if(!realtimeAvailable)return t$10(`jskit.realtime.indicator.unavailableTooltip`);if(connected)return t$10(`jskit.realtime.indicator.connectedTooltip`);return t$10(`jskit.realtime.indicator.disconnectedTooltip`)}var RealtimeConnectionIndicator=defineComponent({name:`RealtimeConnectionIndicator`,setup(){const socket=useRealtimeSocket({required:false});const connected=ref(Boolean(socket?.connected));const realtimeAvailable=socket!==EMPTY_REALTIME_SOCKET;let detach=null;const tooltipText=computed(()=>{return resolveTooltipText({realtimeAvailable,connected:connected.value})});const statusLabel=computed(()=>connected.value?t$10(`jskit.realtime.indicator.connected`):t$10(`jskit.realtime.indicator.disconnected`));const dotStyle=computed(()=>({...DOT_STYLE,backgroundColor:connected.value?`#22c55e`:`#ef4444`}));function syncConnected(nextState){connected.value=Boolean(nextState)}function bindSocketStatusListeners(){if(!realtimeAvailable||typeof socket.on!==`function`){syncConnected(false);return}syncConnected(socket.connected);const onConnect=()=>syncConnected(true);const onDisconnect=()=>syncConnected(false);const onConnectError=()=>syncConnected(false);socket.on(`connect`,onConnect);socket.on(`disconnect`,onDisconnect);socket.on(`connect_error`,onConnectError);detach=()=>{if(typeof socket.off===`function`){socket.off(`connect`,onConnect);socket.off(`disconnect`,onDisconnect);socket.off(`connect_error`,onConnectError)}}}onMounted(()=>{bindSocketStatusListeners()});onBeforeUnmount(()=>{if(typeof detach===`function`)detach();detach=null});return()=>h$1(`button`,{disabled:!realtimeAvailable||connected.value,onClick:()=>reconnectSocketIoClient(socket),style:{...ROOT_STYLE,cursor:realtimeAvailable&&!connected.value?`pointer`:`default`},title:tooltipText.value,type:`button`,"aria-label":realtimeAvailable&&!connected.value?t$10(`jskit.realtime.indicator.reconnect`):statusLabel.value},[h$1(`span`,{style:dotStyle.value,"aria-hidden":`true`}),h$1(`span`,{style:SR_ONLY_STYLE},statusLabel.value)])}});function attachSocketConnectionRecovery(socket){let timer=null;let delay=1e3;let recovering=false;const document=globalThis.document;const window=globalThis.window;function clearRetry(){clearTimeout(timer);timer=null}function canRetry(){return recovering&&!socket.connected&&!socket.active&&socket.io.reconnection()&&!document?.hidden&&window?.navigator?.onLine!==false}function scheduleRetry(){if(timer!==null||!canRetry())return;timer=setTimeout(()=>{timer=null;if(canRetry())socket.connect()},delay);delay=Math.min(delay*2,3e4)}function onConnect(){clearRetry();recovering=false;delay=1e3}function onDisconnect(reason){clearRetry();recovering=reason===`io server disconnect`;scheduleRetry()}function onConnectError(){recovering=true;scheduleRetry()}function onAvailable(){if(socket.connected||document?.hidden||window?.navigator?.onLine===false||!socket.io.reconnection()||!socket.active&&!recovering)return;clearRetry();reconnectSocketIoClient(socket)}socket.on(`connect`,onConnect);socket.on(`disconnect`,onDisconnect);socket.on(`connect_error`,onConnectError);document?.addEventListener(`visibilitychange`,onAvailable);window?.addEventListener(`online`,onAvailable);return()=>{recovering=false;clearRetry();socket.off(`connect`,onConnect);socket.off(`disconnect`,onDisconnect);socket.off(`connect_error`,onConnectError);document?.removeEventListener(`visibilitychange`,onAvailable);window?.removeEventListener(`online`,onAvailable)}}var RealtimeClientProvider_exports=__exportAll({RealtimeClientProvider:()=>RealtimeClientProvider,resolveRealtimeClientConfig:()=>resolveRealtimeClientConfig});function resolveRealtimeClientConfig({env={},mobile=null}={}){const appConfig=normalizeObject$1(getClientAppConfig());const realtime=normalizeObject$1(appConfig.realtime);const realtimeClient=normalizeObject$1(appConfig.realtimeClient);const mobileConfig=resolveMobileConfig({mobile:normalizeObject$1(appConfig.mobile)});const url=normalizeText$1(realtimeClient.url||(mobileConfig.enabled===true&&mobile?.adapter?.available===true?mobileConfig.apiBaseUrl:``));const options=normalizeObject$1(realtimeClient.options);const explicitDebugEnabled=typeof realtimeClient.debug===`boolean`?realtimeClient.debug:typeof realtime.debug===`boolean`?realtime.debug:void 0;const debugEnabled=Object.hasOwn(normalizeObject$1(env),`VITE_REALTIME_DEBUG`)?resolveClientBootstrapDebugEnabled({env,debugEnabled:void 0,debugEnvKey:`VITE_REALTIME_DEBUG`}):resolveClientBootstrapDebugEnabled({env,debugEnabled:explicitDebugEnabled,debugEnvKey:`VITE_REALTIME_DEBUG`});return Object.freeze({url,options,debugEnabled})}function createRealtimeClient({config,loggerInput}={}){const logger=createProviderLogger(loggerInput,{debugEnabled:config.debugEnabled});const socket=createSocketIoClient({url:config.url,options:config.options});const detach=[];let initialized=false;function initialize(vueApp=null){if(initialized)return;initialized=true;if(typeof socket.on===`function`){detach.push(attachSocketConnectionRecovery(socket));const onConnect=()=>logger.debug({socketConnected:true},`Realtime client socket connected.`);const onDisconnect=reason=>logger.debug({socketConnected:false,reason:String(reason||``)},`Realtime client socket disconnected.`);const onConnectError=error=>logger.warn({error:String(error?.message||error||`unknown error`)},`Realtime client socket connect error.`);socket.on(`connect`,onConnect);socket.on(`disconnect`,onDisconnect);socket.on(`connect_error`,onConnectError);detach.push(()=>{socket.off?.(`connect`,onConnect);socket.off?.(`disconnect`,onDisconnect);socket.off?.(`connect_error`,onConnectError)});if(config.debugEnabled===true&&typeof socket.onAny===`function`){const onAny=(eventName,payload)=>logger.debug({event:String(eventName||``),payloadScope:payload?.scope||null,payloadEntityId:payload?.entityId||null},`Realtime client received socket event.`);socket.onAny(onAny);detach.push(()=>socket.offAny?.(onAny))}}vueApp?.provide?.(`jskit.realtime.runtime.client.socket`,socket)}function dispose(){for(const release of detach.splice(0,detach.length))try{release()}catch{}disconnectSocketIoClient(socket);initialized=false}return Object.freeze({config,dispose,initialize,socket})}var RealtimeClientProvider=defineProvider({id:`runtime.realtime.client`,requires:{components:`client.components`,env:`client.env`,logger:`client.logger`,vueApp:`client.vue`},optional:{mobile:`client.mobile`},provides:{realtime:`client.realtime`},setup({components,env,logger,mobile}){components.register(`realtime.web.connection.indicator`,RealtimeConnectionIndicator);return{realtime:createRealtimeClient({config:resolveRealtimeClientConfig({env,mobile}),loggerInput:logger})}},boot({vueApp},{outputs}){outputs.realtime.initialize(vueApp)},shutdown(_dependencies,{outputs}){outputs.realtime.dispose()}});var{t:t$9}=useJskitText();function isMissingDynamicModule(error,moduleSpecifier){const message=String(error?.message||error||``);return message.includes(moduleSpecifier)&&(message.includes(`Cannot find module`)||message.includes(`ERR_MODULE_NOT_FOUND`))}function notifyDynamicImportFailure(asyncModuleRecoveryRuntime,error,{label=t$9(`jskit.shell.recovery.appModuleLabel`)}={}){if(!isDynamicImportError(error)||typeof asyncModuleRecoveryRuntime?.notify!==`function`)return;asyncModuleRecoveryRuntime.notify(error,{label})}var{t:t$8,text:text$1}=useJskitText();var GENERIC_REQUEST_LABEL=`Request`;function appReloadFailureMessage(){return t$8(`jskit.shell.recovery.reloadFailed`)}var RECOVERABLE_REQUEST_ERROR_MESSAGES=Object.freeze([/Failed to fetch/iu,/Load failed/iu,/Network request failed/iu,/NetworkError when attempting to fetch resource/iu,/The Internet connection appears to be offline/iu]);var RECOVERABLE_REQUEST_ERROR_CODES=Object.freeze(new Set([`EAI_AGAIN`,`ECONNABORTED`,`ECONNREFUSED`,`ECONNRESET`,`ENETDOWN`,`ENETUNREACH`,`ENOTFOUND`,`ERR_NETWORK`,`ETIMEDOUT`]));var CANCELED_REQUEST_ERROR_CODES=Object.freeze(new Set([`ABORT_ERR`,`ERR_ABORTED`,`ERR_CANCELED`]));var SAFE_REQUEST_RECOVERY_METHODS=Object.freeze(new Set([`GET`,`HEAD`]));function errorMessage(error=null){return normalizeText$1(error?.message||error?.cause?.message||error)}function errorCode(error=null){return normalizeText$1(error?.code||error?.cause?.code).toUpperCase()}function errorName(error=null){return normalizeText$1(error?.name||error?.cause?.name)}function normalizeRequestErrorStatus(error=null){if(!isRecord$1(error))return null;const hasStatus=Object.prototype.hasOwnProperty.call(error,`status`);const hasStatusCode=Object.prototype.hasOwnProperty.call(error,`statusCode`);if(!hasStatus&&!hasStatusCode)return null;const status=Number(hasStatus?error.status:error.statusCode);return Number.isInteger(status)?status:null}function isCanceledRequestError(error=null){const name=errorName(error).toLowerCase();if(name===`aborterror`||name===`cancelederror`)return true;return CANCELED_REQUEST_ERROR_CODES.has(errorCode(error))}function isRecoverableRequestError(error=null){if(!error||isCanceledRequestError(error))return false;if(normalizeRequestErrorStatus(error)===0)return true;if(RECOVERABLE_REQUEST_ERROR_CODES.has(errorCode(error)))return true;const message=errorMessage(error);return Boolean(message&&RECOVERABLE_REQUEST_ERROR_MESSAGES.some(pattern=>pattern.test(message)))}function requestRecoveryMessage(error=null,{label=``,message=``}={}){const explicitMessage=normalizeText$1(message);if(explicitMessage)return explicitMessage;const requestLabel=normalizeText$1(text$1(label));if(!requestLabel||requestLabel===GENERIC_REQUEST_LABEL)return t$8(`jskit.shell.recovery.appUnreachable`);return t$8(`jskit.shell.recovery.unreachable`,{label:requestLabel})}function resolveQueryMeta(query=null){if(isRecord$1(query?.meta))return query.meta;if(isRecord$1(query?.options?.meta))return query.options.meta;return{}}function readQueryRecoveryMeta(query=null){const meta=resolveQueryMeta(query);const jskitMeta=isRecord$1(meta.jskit)?meta.jskit:{};const dedupeWindowMs=jskitMeta.requestRecoveryDedupeWindowMs;return Object.freeze({disabled:jskitMeta.requestRecovery===false,label:normalizeText$1(jskitMeta.requestRecoveryLabel),source:normalizeText$1(jskitMeta.requestRecoverySource,{fallback:`shell-web.request-recovery.query`}),dedupeKey:normalizeText$1(jskitMeta.requestRecoveryDedupeKey),dedupeWindowMs:Number.isFinite(Number(dedupeWindowMs))?Math.max(0,Number(dedupeWindowMs)):null,method:normalizeText$1(jskitMeta.requestRecoveryMethod).toUpperCase()})}function isActiveQuery(query=null){if(typeof query?.isActive===`function`)return Boolean(query.isActive());if(typeof query?.getObserversCount===`function`)return Number(query.getObserversCount())>0;return true}function recoverableQueryError(query=null){const state=isRecord$1(query?.state)?query.state:{};if(state.status!==`error`||state.fetchStatus!==`idle`)return null;const error=state.error||state.fetchFailureReason||null;return isRecoverableRequestError(error)?error:null}function createQueryRetry(queryClient,query=null){if(!queryClient||typeof queryClient.refetchQueries!==`function`)return null;const queryKey=query?.queryKey;if(!Array.isArray(queryKey))return null;return()=>queryClient.refetchQueries({queryKey,exact:true,type:`active`},{throwOnError:false})}function resolveQueryHash(query=null){const explicitHash=normalizeText$1(query?.queryHash);if(explicitHash)return explicitHash;try{return normalizeText$1(JSON.stringify(query?.queryKey||[]))}catch{return normalizeText$1(String(query?.queryKey||``))}}function installRecoverableQueryObserver({queryClient,runtime,logger}={}){const queryCache=queryClient&&typeof queryClient.getQueryCache===`function`?queryClient.getQueryCache():null;if(!queryCache||typeof queryCache.subscribe!==`function`)return Object.freeze({dispose(){}});const reportedErrorUpdateByQueryHash=new Map;function dismissReportedQueryRecovery(queryHash=``){const reported=reportedErrorUpdateByQueryHash.get(queryHash);if(!reported)return;reportedErrorUpdateByQueryHash.delete(queryHash);if(reported.presentationId&&typeof runtime.dismiss===`function`)runtime.dismiss(reported.presentationId,{presenterId:reported.presenterId})}function dismissReportedQueryRecoveries(){for(const queryHash of[...reportedErrorUpdateByQueryHash.keys()])dismissReportedQueryRecovery(queryHash)}function inspectQuery(query=null){const queryHash=resolveQueryHash(query);const recoveryMeta=readQueryRecoveryMeta(query);if(!query||recoveryMeta.disabled||!SAFE_REQUEST_RECOVERY_METHODS.has(recoveryMeta.method)||!isActiveQuery(query)){if(queryHash)dismissReportedQueryRecovery(queryHash);return}const error=recoverableQueryError(query);if(!error||!queryHash){if(queryHash)dismissReportedQueryRecovery(queryHash);return}const errorUpdateCount=Number(query?.state?.errorUpdateCount||0);const reportKey=`${errorUpdateCount}:${errorMessage(error)}`;const reported=reportedErrorUpdateByQueryHash.get(queryHash);if(reported?.reportKey===reportKey)return;const{dedupeWindowMs}=recoveryMeta;const result=runtime.report(error,{label:recoveryMeta.label,retry:createQueryRetry(queryClient,query),source:recoveryMeta.source,stale:query?.state?.data!==void 0,dedupeKey:recoveryMeta.dedupeKey||`shell-web.request-recovery.query.${queryHash}.${errorUpdateCount}`,...dedupeWindowMs!==null?{dedupeWindowMs}:{}});const presentationId=normalizeText$1(result?.presentationId||reported?.presentationId);const presenterId=normalizeText$1(result?.decision?.presenterId||reported?.presenterId);if(reported?.presentationId&&reported.presentationId!==presentationId)dismissReportedQueryRecovery(queryHash);reportedErrorUpdateByQueryHash.set(queryHash,{reportKey,presentationId,presenterId})}try{if(typeof queryCache.getAll===`function`)for(const query of queryCache.getAll())inspectQuery(query)}catch(error){logger.warn({error:errorMessage(error)||`unknown error`},`Shell request recovery could not inspect existing queries.`)}const unsubscribe=queryCache.subscribe((event={})=>{try{inspectQuery(event?.query)}catch(error){logger.warn({error:errorMessage(error)||`unknown error`},`Shell request recovery query observer failed.`)}});return Object.freeze({dispose(){dismissReportedQueryRecoveries();if(typeof unsubscribe===`function`)unsubscribe()}})}function createShellRequestRecoveryRuntime({queryClient=null,errorRuntime=null,logger=null}={}){const runtimeLogger=createProviderLogger(logger);let installedQueryObserver=null;let reloadAttempt=0;async function reload({label=t$8(`jskit.shell.recovery.appLabel`),message=appReloadFailureMessage()}={}){const reloaded=await guardedReloadApp({label,message});if(!reloaded){reloadAttempt+=1;report(new Error(`Network request failed.`),{label,message,reload:true,force:true,source:`shell-web.request-recovery.reload`,dedupeKey:`shell-web.request-recovery.reload.${reloadAttempt}`})}return reloaded}function retryAction(options,retry){return{label:normalizeText$1(text$1(options.actionLabel),{fallback:t$8(`jskit.shell.actions.retry`)}),dismissOnRun:true,async handler(){try{return await retry()}catch(retryError){if(isRecoverableRequestError(retryError))return report(retryError,options);throw retryError}}}}function reloadAction(options){return{label:normalizeText$1(text$1(options.actionLabel),{fallback:t$8(`jskit.shell.actions.reload`)}),dismissOnRun:true,handler(){return reload({label:options.label,message:options.reloadFailureMessage||appReloadFailureMessage()})}}}function dismiss(presentationId=``,options={}){if(!errorRuntime||typeof errorRuntime.dismiss!==`function`)return 0;return errorRuntime.dismiss(presentationId,options)}function report(error=null,options={}){if(!isRecoverableRequestError(error)&&options.force!==true)return null;const source=normalizeText$1(options.source,{fallback:`shell-web.request-recovery`});if(!errorRuntime||typeof errorRuntime.report!==`function`){runtimeLogger.warn({source,error:errorMessage(error)||`unknown error`},`Shell request recovery could not report because the shell error runtime is unavailable.`);return null}const retry=typeof options.retry===`function`?options.retry:null;const action=retry?retryAction(options,retry):options.reload===true?reloadAction(options):null;try{return errorRuntime.report({source,message:requestRecoveryMessage(error,options),cause:error||null,intent:`app-recoverable`,severity:normalizeText$1(options.severity,{fallback:options.stale?`warning`:`error`}),dedupeKey:normalizeText$1(options.dedupeKey),dedupeWindowMs:Number.isFinite(Number(options.dedupeWindowMs))?Math.max(0,Number(options.dedupeWindowMs)):2e3,action})}catch(reportError){runtimeLogger.error({source,error:errorMessage(reportError)||`unknown error`},`Shell request recovery could not report through the shell error runtime.`);return null}}function install(){if(installedQueryObserver)return installedQueryObserver;installedQueryObserver=installRecoverableQueryObserver({queryClient,runtime:api,logger:runtimeLogger});return installedQueryObserver}function dispose(){installedQueryObserver?.dispose?.();installedQueryObserver=null}const api=Object.freeze({dismiss,dispose,install,isRecoverableRequestError,reload,report});return api}var{t:t$7}=useJskitText();function createShellAsyncModuleRecoveryRuntime({router=null,errorRuntime=null,logger=null}={}){const runtimeLogger=createProviderLogger(logger);const state=createAsyncModuleRecoveryState();let installedRecovery=null;function report(nextState=state){if(!errorRuntime||typeof errorRuntime.report!==`function`){runtimeLogger.warn({label:String(nextState?.label||``)},`Async module recovery could not report because the shell error runtime is unavailable.`);return null}try{return errorRuntime.report({source:`shell-web.async-module-recovery`,message:String(nextState?.message||t$7(`jskit.shell.recovery.moduleFailed`)),...nextState?.message&&nextState?.messageCode?{messageCode:nextState.messageCode,messageParams:nextState.messageParams}:{},cause:nextState?.error||null,intent:`app-recoverable`,severity:`warning`,dedupeKey:`shell-web.async-module-recovery.${Number(nextState?.attempt||0)}`,action:{label:t$7(`jskit.shell.actions.reload`),dismissOnRun:true,handler(){return reload()}}})}catch(error){runtimeLogger.error({label:String(nextState?.label||``),error:String(error?.message||error||`unknown error`)},`Async module recovery could not report through the shell error runtime.`);return null}}async function reload(){const reloaded=await guardedReloadApp({state,label:t$7(`jskit.shell.recovery.appLabel`),message:appReloadFailureMessage()});if(!reloaded)report(state);return reloaded}function notify(error=null,{label=t$7(`jskit.shell.recovery.appModuleLabel`),message=``,stale=isDynamicImportError(error)}={}){notifyAsyncModuleLoadError(state,error,{label,message,retry:state.retry,stale});return report(state)}function install(){if(installedRecovery)return installedRecovery;installedRecovery=installAsyncModuleRecoveryHandlers({state,label:t$7(`jskit.shell.recovery.appModuleLabel`),router,onNotify:report});return installedRecovery}function dispose(){installedRecovery?.dispose?.();installedRecovery=null}return Object.freeze({dispose,install,notify,reload,report,state})}var SHELL_REQUEST_RECOVERY_RUNTIME_KEY=`jskit.shell-web.runtime.web-request-recovery.client`;function isShellRequestRecoveryRuntime(value){return Boolean(value&&typeof value.report===`function`&&typeof value.reload===`function`)}function useShellRequestRecoveryRuntime(){if(!hasInjectionContext())return null;const runtime=inject$1(SHELL_REQUEST_RECOVERY_RUNTIME_KEY,null);return isShellRequestRecoveryRuntime(runtime)?runtime:null}function createStoreBackedPresenter({id,channel,store}={}){const normalizedId=normalizeText(id);const normalizedChannel=normalizeText(channel).toLowerCase();if(!normalizedId)throw new Error(`createStoreBackedPresenter requires id.`);if(!normalizedChannel)throw new Error(`createStoreBackedPresenter("${normalizedId}") requires channel.`);if(!store||typeof store.present!==`function`||typeof store.dismiss!==`function`)throw new Error(`createStoreBackedPresenter("${normalizedId}") requires a presentation store.`);return Object.freeze({id:normalizedId,supports(requestedChannel=``){return String(requestedChannel||``).trim().toLowerCase()===normalizedChannel},present(payload={}){return store.present(normalizedChannel,{...payload,presenterId:normalizedId})},dismiss(presentationId=``){return store.dismiss(normalizedChannel,String(presentationId||``))}})}function createMaterialSnackbarPresenter({store}={}){return createStoreBackedPresenter({id:`material.snackbar`,channel:`snackbar`,store})}function createMaterialBannerPresenter({store}={}){return createStoreBackedPresenter({id:`material.banner`,channel:`banner`,store})}function createMaterialDialogPresenter({store}={}){return createStoreBackedPresenter({id:`material.dialog`,channel:`dialog`,store})}function createDefaultMaterialErrorPresenters({store}={}){return Object.freeze([createMaterialSnackbarPresenter({store}),createMaterialBannerPresenter({store}),createMaterialDialogPresenter({store})])}function subscribeListener(listeners,listener){if(!(listeners instanceof Set))throw new TypeError(`subscribeListener requires a Set.`);if(typeof listener!==`function`)return()=>{};listeners.add(listener);return()=>{listeners.delete(listener)}}function createListenerSubscription(listeners){if(!(listeners instanceof Set))throw new TypeError(`createListenerSubscription requires a Set.`);return function subscribe(listener){return subscribeListener(listeners,listener)}}var{t:t$6}=useJskitText();function createRuntimeLogger$1(logger=null){const source=isRecord$1(logger)?logger:null;return Object.freeze({warn:typeof source?.warn===`function`?source.warn.bind(source):()=>{},error:typeof source?.error===`function`?source.error.bind(source):()=>{}})}function freezeParams$1(params){return Object.freeze(isRecord$1(params)?{...params}:{})}function messageCodeFields(source={},fallback={}){const codeSource=source.code?source:fallback;const messageCodeSource=source.messageCode?source:fallback;return{code:normalizeText(codeSource?.code),params:freezeParams$1(codeSource?.params),messageCode:normalizeText(messageCodeSource?.messageCode),messageParams:freezeParams$1(messageCodeSource?.messageParams)}}function normalizeErrorEvent(rawEvent={}){const source=isRecord$1(rawEvent)?rawEvent:{message:rawEvent};const cause=source.cause!==void 0?source.cause:source.error;const statusCandidate=Number(source.status||source.statusCode||cause?.status||cause?.statusCode||0);const status=Number.isFinite(statusCandidate)?Math.trunc(statusCandidate):0;const fieldErrors=isRecord$1(source.fieldErrors)?Object.freeze({...source.fieldErrors}):isRecord$1(source.details?.fieldErrors)?Object.freeze({...source.details.fieldErrors}):null;const details=isRecord$1(source.details)?Object.freeze({...source.details}):null;const userMessage=normalizeText(source.userMessage);const runtimeMessage=normalizeText(source.message||cause?.message);return Object.freeze({...messageCodeFields(source,isRecord$1(cause)?cause:{}),status,source:normalizeText(source.source,`app`),message:normalizeText(userMessage||runtimeMessage,t$6(`jskit.shell.error.requestFailed`)),userMessage,intent:normalizeErrorIntent(source.intent||source.kind),severity:normalizeSeverity(source.severity,`error`),channel:normalizeChannel(source.channel),presenterId:normalizeText(source.presenterId),action:normalizeAction(source.action),additionalActions:normalizeAdditionalActions(source.additionalActions),persist:typeof source.persist===`boolean`?source.persist:null,blocking:source.blocking===true,dedupeKey:normalizeText(source.dedupeKey),dedupeWindowMs:normalizeNonNegativeInteger(source.dedupeWindowMs,0),traceId:normalizeText(source.traceId),fieldErrors,details,cause:cause||null,timestamp:Number(Date.now())})}function normalizePolicyDecision(policyDecision={},event={}){const source=isRecord$1(policyDecision)?policyDecision:{};const channel=normalizeChannel(source.channel||event.channel,`snackbar`)||`snackbar`;return Object.freeze({channel,presenterId:normalizeText(source.presenterId||event.presenterId),message:normalizeText(source.message||event.userMessage||event.message,t$6(`jskit.shell.error.requestFailed`)),...messageCodeFields(source,event),severity:normalizeSeverity(source.severity||event.severity,`error`),action:normalizeAction(source.action||event.action),additionalActions:normalizeAdditionalActions(source.additionalActions??event.additionalActions),persist:typeof source.persist===`boolean`?source.persist:typeof event.persist===`boolean`?event.persist:channel!==`snackbar`,dedupeKey:normalizeText(source.dedupeKey||event.dedupeKey),dedupeWindowMs:normalizeNonNegativeInteger(source.dedupeWindowMs,event.dedupeWindowMs||0)})}function normalizePresenter(candidate={}){const source=isRecord$1(candidate)?candidate:{};const id=normalizeText(source.id);if(!id)throw new Error(`Error presenter requires id.`);if(typeof source.present!==`function`)throw new Error(`Error presenter "${id}" requires present(payload).`);return Object.freeze({id,supports:typeof source.supports===`function`?source.supports.bind(source):()=>true,present:source.present.bind(source),dismiss:typeof source.dismiss===`function`?source.dismiss.bind(source):null})}function createErrorRuntime({presenters=[],policy=null,defaultPresenterId=``,moduleDefaultPresenterId=``,logger=null}={}){const runtimeLogger=createRuntimeLogger$1(logger);const byPresenterId=new Map;const listeners=new Set;const subscribe=createListenerSubscription(listeners);const dedupeWindowByKey=new Map;let activePolicy=typeof policy===`function`?policy:createDefaultErrorPolicy();let activeAppDefaultPresenterId=normalizeText(defaultPresenterId);const activeModuleDefaultPresenterId=normalizeText(moduleDefaultPresenterId);function getPresenterIds(){return Object.freeze([...byPresenterId.keys()].sort((left,right)=>left.localeCompare(right)))}function assertPresenterExists(presenterId,label){if(!byPresenterId.has(presenterId))throw new Error(`${label} presenter "${presenterId}" is not registered.`)}function resolveDefaultPresenterId(){if(activeAppDefaultPresenterId){assertPresenterExists(activeAppDefaultPresenterId,`App default error`);return activeAppDefaultPresenterId}if(activeModuleDefaultPresenterId){assertPresenterExists(activeModuleDefaultPresenterId,`Module default error`);return activeModuleDefaultPresenterId}throw new Error(`Error runtime requires app default presenter or module default presenter.`)}function assertBootReady(){resolveDefaultPresenterId()}function registerPresenter(presenter){const normalized=normalizePresenter(presenter);if(byPresenterId.has(normalized.id))throw new Error(`Error presenter "${normalized.id}" is already registered.`);byPresenterId.set(normalized.id,normalized);return normalized.id}function registerPresenters(nextPresenters=[]){const source=Array.isArray(nextPresenters)?nextPresenters:[];const ids=[];for(const presenter of source)ids.push(registerPresenter(presenter));return Object.freeze(ids)}function setPolicy(nextPolicy){if(typeof nextPolicy!==`function`)throw new TypeError(`Error policy must be a function.`);activePolicy=nextPolicy}function setAppDefaultPresenterId(nextDefaultPresenterId=``){const normalized=normalizeText(nextDefaultPresenterId);if(normalized)assertPresenterExists(normalized,`App default error`);activeAppDefaultPresenterId=normalized;return activeAppDefaultPresenterId}function notify(event={}){const payload=Object.freeze({...event});for(const listener of listeners)try{listener(payload)}catch(error){runtimeLogger.warn({error:String(error?.message||error||`unknown error`)},`Error runtime subscriber failed.`)}}function resolveChannelCompatiblePresenter(channel=``){for(const presenter of byPresenterId.values())if(presenter.supports(channel))return presenter;return null}function resolvePresenterForDecision(decision){const explicitPresenterId=normalizeText(decision.presenterId);if(explicitPresenterId){assertPresenterExists(explicitPresenterId,`Policy-selected error`);return byPresenterId.get(explicitPresenterId)}const defaultPresenterId=resolveDefaultPresenterId();const defaultPresenter=byPresenterId.get(defaultPresenterId);if(defaultPresenter?.supports(decision.channel))return defaultPresenter;const compatiblePresenter=resolveChannelCompatiblePresenter(decision.channel);if(!compatiblePresenter)throw new Error(`No error presenter supports channel "${decision.channel}".`);return compatiblePresenter}function shouldSkipByDedupe(decision){if(!decision.dedupeKey||decision.dedupeWindowMs<1)return false;const now=Number(Date.now());if(now-Number(dedupeWindowByKey.get(decision.dedupeKey)||0)<decision.dedupeWindowMs)return true;dedupeWindowByKey.set(decision.dedupeKey,now);return false}function report(rawEvent={},rawContext={}){const event=normalizeErrorEvent(rawEvent);const context=isRecord$1(rawContext)?Object.freeze({...rawContext}):Object.freeze({});let policyDecision;try{policyDecision=activePolicy(event,Object.freeze({context,runtime:Object.freeze({presenterIds:getPresenterIds(),appDefaultPresenterId:activeAppDefaultPresenterId,moduleDefaultPresenterId:activeModuleDefaultPresenterId})}))}catch(error){runtimeLogger.error({source:event.source,error:String(error?.message||error||`unknown error`)},`Error policy threw while evaluating error event.`);throw error}const decision=normalizePolicyDecision(policyDecision,event);if(decision.channel===`silent`){const silentResult=Object.freeze({event,decision,skipped:true,reason:`silent`});notify({type:`reported.silent`,result:silentResult});return silentResult}if(shouldSkipByDedupe(decision)){const dedupedResult=Object.freeze({event,decision,skipped:true,reason:`dedupe`});notify({type:`reported.deduped`,result:dedupedResult});return dedupedResult}const presenter=resolvePresenterForDecision(decision);if(!presenter.supports(decision.channel))throw new Error(`Error presenter "${presenter.id}" does not support channel "${decision.channel}".`);const payload=Object.freeze({...decision,presenterId:presenter.id,event,context});const presentationId=normalizeText(presenter.present(payload));const result=Object.freeze({event,decision:Object.freeze({...decision,presenterId:presenter.id}),presentationId,skipped:false});notify({type:`reported`,result});return result}function dismiss(presentationId=``,options={}){const normalizedPresentationId=normalizeText(presentationId);const source=isRecord$1(options)?options:{};const presenterId=normalizeText(source.presenterId);if(presenterId){const presenter=byPresenterId.get(presenterId);if(!presenter||typeof presenter.dismiss!==`function`)return 0;return Number(presenter.dismiss(normalizedPresentationId)||0)}let total=0;for(const presenter of byPresenterId.values()){if(typeof presenter.dismiss!==`function`)continue;total+=Number(presenter.dismiss(normalizedPresentationId)||0)}return total}function configure(options={}){const source=isRecord$1(options)?options:{};if(Array.isArray(source.presenters)&&source.presenters.length>0)registerPresenters(source.presenters);if(Object.prototype.hasOwnProperty.call(source,`policy`))setPolicy(source.policy);if(Object.prototype.hasOwnProperty.call(source,`defaultPresenterId`))setAppDefaultPresenterId(source.defaultPresenterId);assertBootReady();return getSnapshot()}function getSnapshot(){return Object.freeze({presenterIds:getPresenterIds(),appDefaultPresenterId:activeAppDefaultPresenterId,moduleDefaultPresenterId:activeModuleDefaultPresenterId,resolvedDefaultPresenterId:resolveDefaultPresenterId()})}registerPresenters(presenters);assertBootReady();return Object.freeze({report,dismiss,configure,registerPresenter,registerPresenters,setPolicy,setAppDefaultPresenterId,assertBootReady,getSnapshot,subscribe,normalizeErrorEvent})}var{t:t$5}=useJskitText();var PRESENTATION_CHANNELS=Object.freeze([`snackbar`,`banner`,`dialog`]);var SINGLETON_CHANNELS=new Set([`banner`]);function createEmptyChannelState(){return{snackbar:[],banner:[],dialog:[]}}function freezeParams(params){return Object.freeze(params&&typeof params===`object`&&!Array.isArray(params)?{...params}:{})}function cloneEntry(entry={}){return Object.freeze({id:String(entry.id||``).trim(),channel:String(entry.channel||``).trim(),message:String(entry.message||``).trim(),code:String(entry.code||``).trim(),params:freezeParams(entry.params),messageCode:String(entry.messageCode||``).trim(),messageParams:freezeParams(entry.messageParams),severity:String(entry.severity||`error`).trim(),persist:Boolean(entry.persist),action:entry.action||null,additionalActions:entry.additionalActions,presenterId:String(entry.presenterId||``).trim(),dedupeKey:String(entry.dedupeKey||``).trim(),timestamp:Number(entry.timestamp||0)})}function createErrorPresentationStore({now=()=>Date.now()}={}){const listeners=new Set;const subscribe=createListenerSubscription(listeners);const channelState=createEmptyChannelState();let sequence=0;let revision=0;function getChannelEntries(channel){if(!PRESENTATION_CHANNELS.includes(channel))throw new Error(`Unknown presentation channel "${channel}".`);return channelState[channel]}function getState(){return Object.freeze({revision,channels:Object.freeze({snackbar:Object.freeze(channelState.snackbar.map(cloneEntry)),banner:Object.freeze(channelState.banner.map(cloneEntry)),dialog:Object.freeze(channelState.dialog.map(cloneEntry))})})}function notify(event={}){const snapshot=getState();for(const listener of listeners)try{listener(snapshot,Object.freeze({...event}))}catch{}}function present(channel,payload={}){const normalizedChannel=String(channel||``).trim();const entries=getChannelEntries(normalizedChannel);sequence+=1;const entry=Object.freeze({id:normalizeText(payload.id,`${normalizedChannel}-${sequence}`),channel:normalizedChannel,message:normalizeText(payload.message,t$5(`jskit.shell.error.requestFailed`)),code:normalizeText(payload.code),params:freezeParams(payload.params),messageCode:normalizeText(payload.messageCode),messageParams:freezeParams(payload.messageParams),severity:normalizeSeverity(payload.severity,`error`),persist:payload.persist===true,action:normalizeAction(payload.action),additionalActions:normalizeAdditionalActions(payload.additionalActions),presenterId:normalizeText(payload.presenterId),dedupeKey:normalizeText(payload.dedupeKey),timestamp:Number(now())});if(SINGLETON_CHANNELS.has(normalizedChannel)&&entries.length>0)entries.splice(0,entries.length);entries.push(entry);revision+=1;notify({type:`presented`,channel:normalizedChannel,id:entry.id});return entry.id}function dismiss(channel,presentationId=``){const normalizedChannel=String(channel||``).trim();const entries=getChannelEntries(normalizedChannel);const normalizedPresentationId=normalizeText(presentationId);if(!normalizedPresentationId){if(entries.length<1)return 0;const removed=entries.length;entries.splice(0,entries.length);revision+=1;notify({type:`dismissed`,channel:normalizedChannel,id:``,count:removed});return removed}const index=entries.findIndex(entry=>entry.id===normalizedPresentationId);if(index<0)return 0;entries.splice(index,1);revision+=1;notify({type:`dismissed`,channel:normalizedChannel,id:normalizedPresentationId,count:1});return 1}function clear(channel=``){const normalizedChannel=normalizeText(channel).toLowerCase();if(!normalizedChannel){let removedCount=0;for(const candidateChannel of PRESENTATION_CHANNELS)removedCount+=dismiss(candidateChannel,``);return removedCount}return dismiss(normalizedChannel,``)}return Object.freeze({getState,subscribe,present,dismiss,clear})}var DEFAULT_DEBUG_DEPTH=4;function describeFunction(fn){return`[Function ${fn?.name||`anonymous`}]`}function describeSymbol(value){return value?.toString?value.toString():`[Symbol]`}function explodePayload(value,depth=4){const visited=new WeakSet;function walk(node,remaining){if(node===null||typeof node!==`object`){if(typeof node===`function`)return describeFunction(node);if(typeof node===`symbol`)return describeSymbol(node);return node}if(visited.has(node))return`[Circular]`;visited.add(node);if(remaining<=0)return Array.isArray(node)?`[Array]`:`[Object]`;if(Array.isArray(node))return node.map(entry=>walk(entry,remaining-1));if(node instanceof Date)return node.toISOString();const next={};for(const[key,child]of Object.entries(node))next[key]=walk(child,remaining-1);return next}return walk(value,depth)}function ensureArray(value){if(Array.isArray(value))return value;if(value===void 0||value===null)return[];return[value]}var PLACEMENT_DEBUG_PREFIX=`[placement-debug]`;var PLACEMENT_DEBUG_FLAG=`__JSKIT_PLACEMENT_DEBUG__`;var NOOP=()=>{};function isPlacementDebugEnabled(){if(typeof globalThis!==`object`||!globalThis)return false;return globalThis[PLACEMENT_DEBUG_FLAG]===true}function debugLog(message,payload=null){if(!isPlacementDebugEnabled())return;if(payload===null||payload===void 0){console.log(`${PLACEMENT_DEBUG_PREFIX} ${message}`);return}const terminalPayload=explodePayload(payload,4);const rendered=JSON.stringify(terminalPayload,null,2);console.log(`${PLACEMENT_DEBUG_PREFIX} ${message}\n${rendered}`)}function createRuntimeLogger(logger){const runtimeLogger=isRecord$1(logger)?logger:{};let warn=NOOP;let error=NOOP;if(typeof runtimeLogger.warn===`function`)warn=runtimeLogger.warn.bind(runtimeLogger);if(typeof runtimeLogger.error===`function`)error=runtimeLogger.error.bind(runtimeLogger);return Object.freeze({warn,error})}function normalizePlacementList(placements,context={}){const normalized=[];for(const candidate of ensureArray(placements)){const placement=normalizePlacementDefinition(candidate,{strict:false,source:`app placement`});if(!placement||placement.enabled===false)continue;normalized.push(placement)}const byId=new Map;for(const placement of normalized){if(byId.has(placement.id))throw new Error(`Duplicate placement id "${placement.id}" in ${context.source||`placement list`}.`);byId.set(placement.id,placement)}return[...byId.values()].map((placement,index)=>({placement,index})).sort((left,right)=>{const orderCompare=left.placement.order-right.placement.order;if(orderCompare!==0)return orderCompare;return left.index-right.index}).map(entry=>entry.placement)}function normalizeTopologyList(topology,context={}){if(Array.isArray(topology))return normalizeTopologyList(normalizePlacementTopologyDefinition({placements:topology},{context:context.source||`placement topology`}),context);const candidates=ensureArray(topology);const entries=[];for(const candidate of candidates){const normalized=normalizePlacementTopologyDefinition(candidate,{context:context.source||`placement topology`});entries.push(...normalized.placements)}const byKey=new Map;for(const entry of entries){const key=`${entry.id}::${entry.owner||``}`;if(byKey.has(key))throw new Error(`Duplicate semantic placement "${entry.id}"${entry.owner?` for owner "${entry.owner}"`:``} in ${context.source||`placement topology`}.`);byKey.set(key,entry)}return Object.freeze([...byKey.values()])}function matchesSurface(placementSurfaces,requestedSurface){if(requestedSurface===`*`)return true;const surfaces=Array.isArray(placementSurfaces)?placementSurfaces:[`*`];return surfaces.includes(`*`)||surfaces.includes(requestedSurface)}function resolveTopologyPlacement(topologyEntries=[],placement={},requestedSurface=`*`){const semanticTarget=String(placement.target||``).trim();const owner=String(placement.owner||``).trim();const matches=topologyEntries.filter(entry=>{if(entry.id!==semanticTarget)return false;if(owner&&entry.owner!==owner)return false;if(!owner&&entry.owner)return false;return matchesSurface(entry.surfaces,requestedSurface)});if(matches.length===1)return matches[0];return null}function resolveRenderablePlacement({placement={},topologyEntries=[],requestedSurface=`*`,requestedTarget=``,requestedLayoutClass=`compact`}={}){if(placement.targetType===`concrete`){if(placement.target!==requestedTarget)return null;return placement}const topologyPlacement=resolveTopologyPlacement(topologyEntries,placement,requestedSurface);if(!topologyPlacement)return null;const variant=topologyPlacement.variants?.[requestedLayoutClass]||null;if(!variant||variant.outlet!==requestedTarget)return null;const componentToken=String(placement.componentToken||variant.renderers?.[placement.kind]||``).trim();if(!componentToken)return null;return Object.freeze({...placement,target:requestedTarget,semanticTarget:placement.target,topologyOwner:topologyPlacement.owner||``,layoutClass:requestedLayoutClass,componentToken})}function resolveContextContributors(contributors,baseContext={},logger){let merged={};for(const contributor of ensureArray(contributors))try{const resolved=typeof contributor===`function`?contributor(Object.freeze({...baseContext})):contributor;if(isRecord$1(resolved))merged={...merged,...resolved}}catch(error){logger.warn({contributor,error:String(error?.message||error||`unknown error`)},`Failed to evaluate web placement context contributor.`)}return merged}function resolvePlacementComponent(components,placement,logger,missingTokens,invalidComponentTokens,failedTokens){const componentToken=String(placement.componentToken||``).trim();if(!componentToken)return null;if(invalidComponentTokens.has(componentToken)||failedTokens.has(componentToken))return null;if(!components.has(componentToken)){if(!missingTokens.has(componentToken)){missingTokens.add(componentToken);logger.warn({placementId:placement.id,componentToken},`Skipping placement because component token is not bound.`)}return null}let component=null;try{component=components.get(componentToken)}catch(error){if(!failedTokens.has(componentToken)){failedTokens.add(componentToken);logger.error({placementId:placement.id,componentToken,error:String(error?.message||error||`unknown error`)},`Skipping placement because component token resolution threw.`)}return null}if(!isRenderableComponent(component)){if(!invalidComponentTokens.has(componentToken)){invalidComponentTokens.add(componentToken);logger.warn({placementId:placement.id,componentToken},`Skipping placement because component token did not resolve to a Vue component.`)}return null}return component}function shouldIncludePlacement(placement,placementContext,logger){if(typeof placement.when!==`function`)return true;try{return placement.when(Object.freeze({...placementContext}))===true}catch(error){logger.warn({placementId:placement.id,error:String(error?.message||error||`unknown error`)},`Placement when() predicate failed; placement was skipped.`);return false}}function createWebPlacementRuntime({components,contextContributors=[],logger=null}={}){if(!components||typeof components.has!==`function`||typeof components.get!==`function`)throw new Error(`createWebPlacementRuntime requires a client component registry.`);const runtimeLogger=createRuntimeLogger(logger);const missingTokens=new Set;const invalidComponentTokens=new Set;const failedTokens=new Set;const listeners=new Set;const subscribe=createListenerSubscription(listeners);let placementDefinitions=Object.freeze([]);let placementTopology=Object.freeze([]);let sharedContext=Object.freeze({});let revision=0;function notify(event={}){revision+=1;debugLog(`notify`,{revision,event});for(const listener of listeners)try{listener(Object.freeze({revision,...event}))}catch(error){runtimeLogger.warn({error:String(error?.message||error||`unknown error`)},`Web placement runtime listener threw during notification.`)}}function replacePlacements(entries=[],{source=`app placement registry`}={}){missingTokens.clear();invalidComponentTokens.clear();failedTokens.clear();placementDefinitions=Object.freeze(normalizePlacementList(entries,{source}));debugLog(`replacePlacements`,{source,count:placementDefinitions.length,ids:placementDefinitions.map(entry=>entry.id)});notify({type:`placements.replaced`,source})}function replacePlacementTopology(topology=[],{source=`app placement topology`}={}){missingTokens.clear();invalidComponentTokens.clear();failedTokens.clear();placementTopology=normalizeTopologyList(topology,{source});debugLog(`replacePlacementTopology`,{source,count:placementTopology.length,ids:placementTopology.map(entry=>entry.owner?`${entry.id}#${entry.owner}`:entry.id)});notify({type:`placement-topology.replaced`,source})}function getContext(){return sharedContext}function setContext(value={},{replace=false,source=`placement-context`}={}){const next=isRecord$1(value)?{...value}:{};let nextContext=next;if(!replace)nextContext={...sharedContext,...next};sharedContext=Object.freeze(nextContext);debugLog(`setContext`,{replace,source,keys:Object.keys(sharedContext)});notify({type:`context.updated`,source});return sharedContext}function getRevision(){return revision}function getPlacements({surface=`*`,target=``,layoutClass=``,context={}}={}){const normalizedTarget=normalizePlacementTarget(target,{strict:false});if(!normalizedTarget)return Object.freeze([]);const normalizedSurface=normalizeSurface(surface);const normalizedLayoutClass=normalizePlacementLayoutClass(layoutClass)||normalizePlacementLayoutClass(sharedContext?.layoutClass)||`compact`;const baseContext=isRecord$1(context)?{...context}:{};const contextFromRuntime=isRecord$1(sharedContext)?sharedContext:{};const placementContext={...resolveContextContributors(contextContributors,{surface:normalizedSurface,target:normalizedTarget,layoutClass:normalizedLayoutClass,context:{...contextFromRuntime,...baseContext}},runtimeLogger),...contextFromRuntime,...baseContext,surface:normalizedSurface,target:normalizedTarget,layoutClass:normalizedLayoutClass};debugLog(`getPlacements:start`,{surface:normalizedSurface,target:normalizedTarget,layoutClass:normalizedLayoutClass,contextKeys:Object.keys(baseContext),sharedContextKeys:Object.keys(contextFromRuntime),placementCount:placementDefinitions.length,topologyCount:placementTopology.length});const matches=[];for(const placement of placementDefinitions){const renderablePlacement=resolveRenderablePlacement({placement,topologyEntries:placementTopology,requestedSurface:normalizedSurface,requestedTarget:normalizedTarget,requestedLayoutClass:normalizedLayoutClass});if(!renderablePlacement)continue;const placementSurfaces=renderablePlacement.surfaces;if(!matchesSurface(placementSurfaces,normalizedSurface)){debugLog(`getPlacements:skip-surfaces`,{placementId:renderablePlacement.id,placementSurfaces,requestedSurface:normalizedSurface});continue}if(!shouldIncludePlacement(renderablePlacement,placementContext,runtimeLogger)){debugLog(`getPlacements:skip-when`,{placementId:renderablePlacement.id});continue}const component=resolvePlacementComponent(components,renderablePlacement,runtimeLogger,missingTokens,invalidComponentTokens,failedTokens);if(!component){debugLog(`getPlacements:skip-component`,{placementId:renderablePlacement.id,componentToken:renderablePlacement.componentToken});continue}debugLog(`getPlacements:include`,{placementId:renderablePlacement.id,componentToken:renderablePlacement.componentToken,placementSurfaces,order:renderablePlacement.order});matches.push(Object.freeze({...renderablePlacement,component}))}debugLog(`getPlacements:done`,{surface:normalizedSurface,target:normalizedTarget,layoutClass:normalizedLayoutClass,resultIds:matches.map(entry=>entry.id)});return Object.freeze(matches)}return Object.freeze({replacePlacements,replacePlacementTopology,getPlacements,getContext,setContext,subscribe,getRevision})}var{t:t$4}=useJskitText();var DEFAULT_BOOTSTRAP_PATH=`/api/bootstrap`;function normalizeObject(value){return value&&typeof value===`object`&&!Array.isArray(value)?value:{}}function buildBootstrapUrl({path=DEFAULT_BOOTSTRAP_PATH,query={}}={}){const normalizedPath=String(path||DEFAULT_BOOTSTRAP_PATH).trim()||DEFAULT_BOOTSTRAP_PATH;const params=new URLSearchParams;for(const[key,value]of Object.entries(normalizeObject(query))){const normalizedKey=String(key||``).trim();const normalizedValue=String(value||``).trim();if(!normalizedKey||!normalizedValue)continue;params.set(normalizedKey,normalizedValue)}const queryString=params.toString();return queryString?`${normalizedPath}?${queryString}`:normalizedPath}function normalizeBootstrapResponseError(response,url){const error=new Error(`Bootstrap payload request failed with status ${response.status}.`);error.statusCode=Number(response.status||0);error.url=url;return error}function createShellBootstrapRuntime({handlers,placementRuntime,requestRecoveryRuntime=null,router=null,logger,fetchImplementation=globalThis.fetch,bootstrapPath=DEFAULT_BOOTSTRAP_PATH}={}){if(!handlers||typeof handlers.list!==`function`)throw new Error(`createShellBootstrapRuntime requires a bootstrap handler registry.`);if(!placementRuntime||typeof placementRuntime.setContext!==`function`)throw new Error(`createShellBootstrapRuntime requires a placement runtime.`);const runtimeLogger=createProviderLogger(logger);let initialized=false;let refreshQueue=Promise.resolve();async function resolveBootstrapRequest(reason=`manual`){const payloadHandlers=handlers.list();let request={path:bootstrapPath,query:{},meta:{}};for(const handler of payloadHandlers){if(typeof handler.resolveBootstrapRequest!==`function`)continue;const contribution=normalizeObject(await handler.resolveBootstrapRequest({router,placementRuntime,reason,request:Object.freeze({path:request.path,query:Object.freeze({...request.query}),meta:Object.freeze({...request.meta})})}));request={path:String(contribution.path||request.path||bootstrapPath).trim()||bootstrapPath,query:{...request.query,...normalizeObject(contribution.query)},meta:{...request.meta,...normalizeObject(contribution.meta)}}}return Object.freeze({path:request.path,query:Object.freeze({...request.query}),meta:Object.freeze({...request.meta})})}async function applyBootstrapPayload(payload,reason=`manual`,request=Object.freeze({})){const payloadHandlers=handlers.list();const source=`shell-web.bootstrap.${String(reason||`manual`).trim()||`manual`}`;for(const handler of payloadHandlers)await handler.applyBootstrapPayload({router,placementRuntime,payload,request,reason,source});return payload}async function applyBootstrapError(error,reason=`manual`,request=Object.freeze({})){const payloadHandlers=handlers.list();const source=`shell-web.bootstrap.${String(reason||`manual`).trim()||`manual`}`;for(const handler of payloadHandlers){if(typeof handler.handleBootstrapError!==`function`)continue;await handler.handleBootstrapError({router,placementRuntime,error,request,reason,source})}}async function performRefresh(reason=`manual`){if(typeof fetchImplementation!==`function`)throw new Error(`Bootstrap payload fetch requires a fetch implementation.`);let request=Object.freeze({path:bootstrapPath,query:Object.freeze({}),meta:Object.freeze({})});try{request=await resolveBootstrapRequest(reason);const url=buildBootstrapUrl(request);const response=await fetchImplementation(url,{method:`GET`,credentials:`include`,headers:{accept:`application/json`}});if(!response.ok)throw normalizeBootstrapResponseError(response,url);return await applyBootstrapPayload(await response.json(),reason,request)}catch(error){await applyBootstrapError(error,reason,request);requestRecoveryRuntime?.report?.(error,{label:t$4(`jskit.shell.recovery.appDataLabel`),retry:()=>refresh(reason),source:`shell-web.bootstrap`,dedupeKey:`shell-web.bootstrap.${String(reason||`manual`).trim()||`manual`}.request-failed`});runtimeLogger.warn({reason,error:String(error?.message||error||`unknown error`)},`shell-web bootstrap refresh failed.`);return null}}function refresh(reason=`manual`){refreshQueue=refreshQueue.catch(()=>null).then(()=>performRefresh(reason));return refreshQueue}async function initialize(){if(initialized)return null;initialized=true;return refresh(`init`)}return Object.freeze({initialize,refresh})}var{t:t$3}=useJskitText();var SHELL_WEB_REFRESH_RUNTIME_KEY=`jskit.shell-web.runtime.web-refresh.client`;function isPullRefreshQuery(query=null){const meta=isRecord$1(query?.meta)?query.meta:{};if(meta.jskitRefresh===`pull`)return true;if(meta.jskitRefresh===false)return false;return(isRecord$1(meta.jskit)?meta.jskit:{}).refreshOnPull!==false}function createShellRefreshRuntime({bootstrapRuntime=null,queryClient=null,errorRuntime=null,logger=null}={}){const runtimeLogger=createProviderLogger(logger);let refreshQueue=Promise.resolve(null);async function refreshBootstrap(reason){if(!bootstrapRuntime||typeof bootstrapRuntime.refresh!==`function`)return false;await bootstrapRuntime.refresh(reason);return true}async function refetchPullQueries(){if(!queryClient||typeof queryClient.refetchQueries!==`function`)return false;await queryClient.refetchQueries({type:`active`,predicate:isPullRefreshQuery},{throwOnError:false});return true}function reportRefreshFailure(error){runtimeLogger.warn({error:String(error?.message||error||`unknown error`)},`Shell refresh failed.`);if(!errorRuntime||typeof errorRuntime.report!==`function`)return;errorRuntime.report({source:`shell-web.refresh`,message:t$3(`jskit.shell.recovery.refreshFailed`),intent:`app-recoverable`,severity:`error`,dedupeKey:`shell-web.refresh.failed`,dedupeWindowMs:2e3,action:{label:t$3(`jskit.shell.actions.retry`),dismissOnRun:true,handler(){refresh(`retry`)}}})}async function performRefresh(reason=`manual`){const normalizedReason=String(reason||`manual`).trim()||`manual`;try{const[bootstrapRefreshed,queriesRefetched]=await Promise.all([refreshBootstrap(normalizedReason),refetchPullQueries()]);return Object.freeze({reason:normalizedReason,bootstrapRefreshed,queriesRefetched})}catch(error){reportRefreshFailure(error);return Object.freeze({reason:normalizedReason,bootstrapRefreshed:false,queriesRefetched:false,error})}}function refresh(reason=`manual`){refreshQueue=refreshQueue.catch(()=>null).then(()=>performRefresh(reason));return refreshQueue}return Object.freeze({refresh})}function normalizeBootstrapPayloadHandler(entry){if(typeof entry===`function`)return Object.freeze({handlerId:String(entry.name||`anonymous`),order:0,applyBootstrapPayload:entry});if(!entry||typeof entry!==`object`||typeof entry.applyBootstrapPayload!==`function`)throw new TypeError(`Bootstrap payload handlers require applyBootstrapPayload().`);const handlerId=String(entry.handlerId||``).trim();if(!handlerId)throw new TypeError(`Bootstrap payload handlers require handlerId.`);return Object.freeze({...entry,handlerId,order:Number.isFinite(entry.order)?Number(entry.order):0})}function createBootstrapPayloadHandlerRegistry(){const handlers=new Map;function register(entry){const handler=normalizeBootstrapPayloadHandler(entry);if(handlers.has(handler.handlerId))throw new Error(`Bootstrap payload handler "${handler.handlerId}" is duplicated.`);handlers.set(handler.handlerId,handler);return api}function list(){return Object.freeze([...handlers.values()].sort((left,right)=>{if(left.order!==right.order)return left.order-right.order;return left.handlerId.localeCompare(right.handlerId)}))}const api=Object.freeze({register,list});return api}function resolveBootstrapErrorStatusCode(error){const statusCode=Number(error?.statusCode||error?.status||0);return Number.isInteger(statusCode)&&statusCode>0?statusCode:0}var{t:t$2}=useJskitText();var APP_PLACEMENT_MODULE_SPECIFIER=`/src/placement.js`;var APP_PLACEMENT_TOPOLOGY_MODULE_SPECIFIER=`/src/placementTopology.js`;var APP_ERROR_MODULE_SPECIFIER=`/src/error.js`;async function loadAppModule({importModule,specifier,label,resolve,invalidExportMessage=``,loadFailureMessage,fallback,logger,asyncModuleRecoveryRuntime=null}){try{const exported=(await importModule())?.default;const resolved=await resolve(exported);if(resolved!==void 0)return resolved;logger.warn({module:specifier,exportedType:typeof exported},invalidExportMessage)}catch(error){if(isMissingDynamicModule(error,specifier))return fallback;notifyDynamicImportFailure(asyncModuleRecoveryRuntime,error,{label});logger.warn({module:specifier,error:String(error?.message||error||`unknown error`)},loadFailureMessage)}return fallback}function loadAppPlacementDefinitions(logger,asyncModuleRecoveryRuntime=null){return loadAppModule({importModule:()=>__vitePreload(()=>import(`./placement-BNmlke_j.js`).then(n=>n.n),__vite__mapDeps([113,7,16,67,1,42,40,68,48,106,114,43])),specifier:APP_PLACEMENT_MODULE_SPECIFIER,label:t$2(`jskit.shell.recovery.placementConfigLabel`),resolve(exported){const resolved=typeof exported===`function`?exported():exported;return Array.isArray(resolved)?resolved:void 0},invalidExportMessage:`App placement module default export did not resolve to an array; using empty list.`,loadFailureMessage:`Failed to load app placement module; using empty list.`,fallback:[],logger,asyncModuleRecoveryRuntime})}function loadAppPlacementTopology(logger,asyncModuleRecoveryRuntime=null){return loadAppModule({importModule:()=>__vitePreload(()=>import(`./placementTopology-CDhUIK6L.js`),[]),specifier:APP_PLACEMENT_TOPOLOGY_MODULE_SPECIFIER,label:t$2(`jskit.shell.recovery.placementTopologyLabel`),resolve:exported=>resolveAppPlacementTopologyExport(exported,logger),loadFailureMessage:`Failed to load app placement topology module; using empty topology.`,fallback:[],logger,asyncModuleRecoveryRuntime})}function resolveAppPlacementTopologyExport(exported,logger){const resolved=typeof exported===`function`?exported():exported;if(Array.isArray(resolved))return resolved;if(resolved&&typeof resolved===`object`)return resolved;logger.warn({module:APP_PLACEMENT_TOPOLOGY_MODULE_SPECIFIER,exportedType:typeof exported},`App placement topology module default export did not resolve to an object or array; using empty topology.`);return[]}function createErrorConfigToolkit(errorRuntime){return Object.freeze({createDefaultErrorPolicy,moduleDefaultPresenterId:`material.snackbar`,presenterFactories:Object.freeze({createMaterialSnackbarPresenter,createMaterialBannerPresenter,createMaterialDialogPresenter}),runtime:errorRuntime})}function loadAppErrorConfig(logger,errorRuntime,asyncModuleRecoveryRuntime=null){return loadAppModule({importModule:()=>__vitePreload(()=>import(`./error-N8LVB16H.js`),__vite__mapDeps([162,66,1,40])),specifier:APP_ERROR_MODULE_SPECIFIER,label:t$2(`jskit.shell.recovery.errorConfigLabel`),async resolve(exported){const toolkit=createErrorConfigToolkit(errorRuntime);const resolved=typeof exported===`function`?await exported(toolkit):exported;return isRecord$1(resolved)?resolved:void 0},invalidExportMessage:`App error module default export did not resolve to an object; using shell-web defaults.`,loadFailureMessage:`Failed to load app error module; using shell-web defaults.`,fallback:{},logger,asyncModuleRecoveryRuntime})}function installVueErrorBridge(vueApp,errorRuntime,logger){if(!vueApp||!isRecord$1(vueApp.config))return;const previousHandler=typeof vueApp.config.errorHandler===`function`?vueApp.config.errorHandler:null;vueApp.config.errorHandler=(error,instance,info)=>{try{errorRuntime.report({source:`shell-web.vue.error-handler`,message:String(error?.message||t$2(`jskit.shell.error.unexpectedUi`)),cause:error,intent:`blocking`,severity:`error`,details:{info:String(info||``)}})}catch(reportError){logger.error({source:`shell-web.vue.error-handler`,error:String(reportError?.message||reportError||`unknown error`)},`Shell web error runtime failed to report a Vue error.`)}if(previousHandler)previousHandler(error,instance,info)}}function installRouterErrorBridge(router,errorRuntime,logger){if(!router||typeof router.onError!==`function`)return;router.onError(error=>{if(isDynamicImportError(error))return;try{errorRuntime.report({source:`shell-web.router.on-error`,message:String(error?.message||t$2(`jskit.shell.error.navigationFailed`)),cause:error,intent:`app-recoverable`,severity:`error`,dedupeKey:String(error?.message||`navigation-failed`),dedupeWindowMs:2e3})}catch(reportError){logger.error({source:`shell-web.router.on-error`,error:String(reportError?.message||reportError||`unknown error`)},`Shell web error runtime failed to report a router error.`)}})}var ShellWebClientProvider=defineProvider({id:`shell.web.client`,requires:{components:`client.components`,loggerInput:`client.logger`,pinia:`client.pinia`,queryClient:`client.query`,router:`client.router`,surfaceRuntime:`client.surface`,vueApp:`client.vue`},provides:{shell:`client.shell`},setup({components,loggerInput,queryClient,router}){const logger=createProviderLogger(loggerInput);const bootstrapHandlers=createBootstrapPayloadHandlerRegistry();bootstrapHandlers.register(Object.freeze({handlerId:`shell.web.bootstrap.surface-access`,order:0,applyBootstrapPayload({payload={},placementRuntime,source}={}){placementRuntime.setContext({surfaceAccess:payload?.surfaceAccess&&typeof payload.surfaceAccess===`object`?payload.surfaceAccess:{}},{source})},handleBootstrapError({error,placementRuntime,source}={}){if(resolveBootstrapErrorStatusCode(error)!==401)return;placementRuntime.setContext({surfaceAccess:{}},{source})}}));const errorPresentationStore=createErrorPresentationStore();const errorRuntime=createErrorRuntime({presenters:createDefaultMaterialErrorPresenters({store:errorPresentationStore}),policy:createDefaultErrorPolicy(),moduleDefaultPresenterId:`material.snackbar`,logger});const placementRuntime=createWebPlacementRuntime({components,logger});const asyncModuleRecoveryRuntime=createShellAsyncModuleRecoveryRuntime({router,errorRuntime,logger});const requestRecoveryRuntime=createShellRequestRecoveryRuntime({queryClient,errorRuntime,logger});const bootstrapRuntime=createShellBootstrapRuntime({handlers:bootstrapHandlers,placementRuntime,requestRecoveryRuntime,router,logger});const refreshRuntime=createShellRefreshRuntime({bootstrapRuntime,queryClient,errorRuntime,logger});return{shell:Object.freeze({asyncModuleRecovery:asyncModuleRecoveryRuntime,bootstrap:bootstrapRuntime,bootstrapHandlers,error:errorRuntime,errorPresentationStore,placement:placementRuntime,refresh:refreshRuntime,requestRecovery:requestRecoveryRuntime})}},async boot({loggerInput,pinia,router,surfaceRuntime,vueApp},{outputs}){const logger=createProviderLogger(loggerInput);const{asyncModuleRecovery:asyncModuleRecoveryRuntime,bootstrap:bootstrapRuntime,error:errorRuntime,errorPresentationStore,placement:placementRuntime,refresh:refreshRuntime,requestRecovery:requestRecoveryRuntime}=outputs.shell;asyncModuleRecoveryRuntime.install();const placementTopology=await loadAppPlacementTopology(logger,asyncModuleRecoveryRuntime);placementRuntime.replacePlacementTopology(placementTopology,{source:APP_PLACEMENT_TOPOLOGY_MODULE_SPECIFIER});const placements=await loadAppPlacementDefinitions(logger,asyncModuleRecoveryRuntime);placementRuntime.replacePlacements(placements,{source:APP_PLACEMENT_MODULE_SPECIFIER});const appConfig=getClientAppConfig();const surfaceConfig=buildSurfaceConfigContext(surfaceRuntime,{tenancyMode:appConfig?.tenancyMode});const surfaceAccessPolicies=appConfig?.surfaceAccessPolicies&&typeof appConfig.surfaceAccessPolicies===`object`?appConfig.surfaceAccessPolicies:{};placementRuntime.setContext({surfaceConfig,surfaceAccessPolicies},{source:`shell-web.surface-config`});const errorConfig=await loadAppErrorConfig(logger,errorRuntime,asyncModuleRecoveryRuntime);errorRuntime.configure(errorConfig);requestRecoveryRuntime.install();await bootstrapRuntime.initialize();if(!vueApp||typeof vueApp.provide!==`function`||typeof vueApp.use!==`function`)return;if(!pinia)throw new Error(`ShellWebClientProvider requires Pinia installed in the client app.`);useShellErrorPresentationStore(pinia).attachRuntimeStore(errorPresentationStore);vueApp.provide(SHELL_WEB_PLACEMENT_RUNTIME_KEY,placementRuntime);vueApp.provide(SHELL_WEB_REFRESH_RUNTIME_KEY,refreshRuntime);vueApp.provide(SHELL_WEB_ERROR_RUNTIME_KEY,errorRuntime);vueApp.provide(SHELL_ASYNC_MODULE_RECOVERY_RUNTIME_KEY,asyncModuleRecoveryRuntime);vueApp.provide(SHELL_REQUEST_RECOVERY_RUNTIME_KEY,requestRecoveryRuntime);installVueErrorBridge(vueApp,errorRuntime,logger);installRouterErrorBridge(router,errorRuntime,logger)},shutdown(_dependencies,{outputs}){outputs.shell.requestRecovery.dispose();outputs.shell.asyncModuleRecovery.dispose()}});var SHELL_LAYOUT_DRAWER_DEFAULT_OPEN_STORAGE_KEY=`jskit.shell-web.drawer-default-open`;function readDrawerDefaultOpenPreference({storage=typeof window===`object`?window?.localStorage:null}={}){if(!storage||typeof storage.getItem!==`function`)return true;try{const storedValue=String(storage.getItem(`jskit.shell-web.drawer-default-open`)||``).trim().toLowerCase();if(storedValue===`false`)return false;if(storedValue===`true`)return true}catch{return true}return true}function writeDrawerDefaultOpenPreference(open,{storage=typeof window===`object`?window?.localStorage:null}={}){if(!storage||typeof storage.setItem!==`function`)return;try{storage.setItem(SHELL_LAYOUT_DRAWER_DEFAULT_OPEN_STORAGE_KEY,open?`true`:`false`)}catch{}}var useShellLayoutStore=defineStore(`jskit.shell-web.layout`,()=>{const drawerDefaultOpen=ref(readDrawerDefaultOpenPreference());const drawerOpen=ref(drawerDefaultOpen.value);const supportingContentOpen=ref(false);const supportingContentTitle=ref(``);function setDrawerDefaultOpen(open){const normalized=Boolean(open);drawerDefaultOpen.value=normalized;drawerOpen.value=normalized;writeDrawerDefaultOpenPreference(normalized)}function setDrawerOpen(open){drawerOpen.value=Boolean(open)}function toggleDrawer(){drawerOpen.value=!drawerOpen.value}function openSupportingContent({title=``}={}){supportingContentTitle.value=String(title||``).trim();supportingContentOpen.value=true}function closeSupportingContent(){supportingContentOpen.value=false}function setSupportingContentOpen(open){supportingContentOpen.value=Boolean(open)}return{drawerDefaultOpen,drawerOpen,supportingContentOpen,supportingContentTitle,setDrawerDefaultOpen,setDrawerOpen,toggleDrawer,openSupportingContent,closeSupportingContent,setSupportingContentOpen}});var{t:t$1,text}=useJskitText();function toSurfaceLabel(surfaceId=``){const normalizedSurfaceId=String(surfaceId||``).trim().toLowerCase();if(!normalizedSurfaceId)return t$1(`jskit.shell.layout.surface`);return normalizedSurfaceId.split(/[^a-z0-9]+/g).filter(Boolean).map(segment=>`${segment.slice(0,1).toUpperCase()}${segment.slice(1)}`).join(` `)}function useShellLayoutState(props={}){const shellLayoutStore=useShellLayoutStore();const{drawerDefaultOpen,drawerOpen,supportingContentOpen,supportingContentTitle}=storeToRefs(shellLayoutStore);let route=null;try{route=useRoute()}catch{route=null}const{context:placementContext}=useWebPlacementContext();function toggleDrawer(){shellLayoutStore.toggleDrawer()}const resolvedSurface=computed(()=>{const explicitSurface=normalizeSurfaceId$1(props?.surface);if(explicitSurface)return explicitSurface;const pathname=String(route?.path||``).trim()||(typeof window===`object`&&window?.location?.pathname?String(window.location.pathname).trim():`/`);const contextValue=placementContext?.value||null;const resolvedSurfaceFromPath=resolveSurfaceIdFromPlacementPathname(contextValue,pathname);if(resolvedSurfaceFromPath)return resolvedSurfaceFromPath;const surfaceConfig=readPlacementSurfaceConfig(contextValue);if(surfaceConfig.defaultSurfaceId)return surfaceConfig.defaultSurfaceId;return`surface`});const resolvedSurfaceLabel=computed(()=>{const explicitLabel=String(text(props?.surfaceLabel)||``).trim();if(explicitLabel)return explicitLabel;const surfaceDefinition=resolveSurfaceDefinitionFromPlacementContext(placementContext?.value||null,resolvedSurface.value);const configuredLabel=String(text(surfaceDefinition?.label)||``).trim();if(configuredLabel)return configuredLabel;return toSurfaceLabel(resolvedSurface.value)});return Object.freeze({drawerDefaultOpen,drawerOpen,supportingContentOpen,supportingContentTitle,setDrawerDefaultOpen:shellLayoutStore.setDrawerDefaultOpen,setDrawerOpen:shellLayoutStore.setDrawerOpen,setSupportingContentOpen:shellLayoutStore.setSupportingContentOpen,openSupportingContent:shellLayoutStore.openSupportingContent,closeSupportingContent:shellLayoutStore.closeSupportingContent,toggleDrawer,resolvedSurface,resolvedSurfaceLabel})}var SHELL_GESTURE_IGNORED_SELECTORS=Object.freeze([`a`,`button`,`input`,`select`,`textarea`,`summary`,`[role='button']`,`[role='link']`,`[role='slider']`,`[contenteditable='true']`,`[data-shell-swipe-ignore]`]);function isPrimaryTouchPointer(event){return event?.isPrimary!==false&&event?.button===0&&event?.pointerType!==`mouse`}function isShellGestureIgnoredTarget(target,{extraSelectors=[]}={}){const selectors=[...SHELL_GESTURE_IGNORED_SELECTORS,...extraSelectors].join(`,`);return Boolean(target?.closest?.(selectors))}var PULL_REFRESH_TRIGGER_DISTANCE=72;var PULL_REFRESH_MAX_DISTANCE=112;var PULL_REFRESH_IGNORED_SELECTORS=Object.freeze([`[data-shell-pull-refresh-ignore]`]);function isAtPageTop(){if(typeof window!==`object`||typeof document!==`object`)return false;const documentScrollTop=Number(document.documentElement?.scrollTop||0);const bodyScrollTop=Number(document.body?.scrollTop||0);return Math.max(Number(window.scrollY||0),documentScrollTop,bodyScrollTop)<=0}function useShellPullToRefresh({enabled,refreshRuntime=null}={}){const{t}=useJskitText();const pullDistance=ref(0);const pullRefreshing=ref(false);let activePull=null;const pullProgress=computed(()=>Math.min(100,Math.round(pullDistance.value/PULL_REFRESH_TRIGGER_DISTANCE*100)));const pullIndicatorVisible=computed(()=>Boolean(unref(enabled)&&(pullDistance.value>0||pullRefreshing.value)));const pullRefreshLabel=computed(()=>{if(pullRefreshing.value)return t(`jskit.shell.pullToRefresh.refreshing`);return pullProgress.value>=100?t(`jskit.shell.pullToRefresh.release`):t(`jskit.shell.pullToRefresh.pull`)});const pullRefreshStyle=computed(()=>({"--shell-pull-refresh-distance":`${Math.round(Math.min(pullDistance.value,PULL_REFRESH_MAX_DISTANCE))}px`}));onMounted(()=>{if(typeof window!==`object`)return;window.addEventListener(`pointerdown`,handlePullPointerDown,{capture:true,passive:true});window.addEventListener(`pointermove`,handlePullPointerMove,{capture:true,passive:false});window.addEventListener(`pointerup`,handlePullPointerEnd,{capture:true,passive:true});window.addEventListener(`pointercancel`,handlePullPointerCancel,{capture:true,passive:true});window.addEventListener(`touchstart`,handlePullTouchStart,{capture:true,passive:true});window.addEventListener(`touchmove`,handlePullTouchMove,{capture:true,passive:false});window.addEventListener(`touchend`,handlePullTouchEnd,{capture:true,passive:true});window.addEventListener(`touchcancel`,handlePullTouchCancel,{capture:true,passive:true})});onBeforeUnmount(()=>{if(typeof window!==`object`)return;window.removeEventListener(`pointerdown`,handlePullPointerDown,{capture:true});window.removeEventListener(`pointermove`,handlePullPointerMove,{capture:true});window.removeEventListener(`pointerup`,handlePullPointerEnd,{capture:true});window.removeEventListener(`pointercancel`,handlePullPointerCancel,{capture:true});window.removeEventListener(`touchstart`,handlePullTouchStart,{capture:true});window.removeEventListener(`touchmove`,handlePullTouchMove,{capture:true});window.removeEventListener(`touchend`,handlePullTouchEnd,{capture:true});window.removeEventListener(`touchcancel`,handlePullTouchCancel,{capture:true})});function canRefresh(){return Boolean(refreshRuntime&&typeof refreshRuntime.refresh===`function`)}function canStartFromTarget(target){return Boolean(unref(enabled)&&canRefresh()&&!pullRefreshing.value&&isAtPageTop()&&!isShellGestureIgnoredTarget(target,{extraSelectors:PULL_REFRESH_IGNORED_SELECTORS}))}function handlePullPointerDown(event){if(!isPrimaryTouchPointer(event)||!canStartFromTarget(event.target)){activePull=null;return}activePull={pointerId:event.pointerId,touchIdentifier:null,startX:event.clientX,startY:event.clientY}}function handlePullPointerMove(event){if(!activePull||event.pointerId!==activePull.pointerId)return;updatePullGesture(event.clientX,event.clientY,event)}function handlePullPointerEnd(event){if(!activePull||event.pointerId!==activePull.pointerId)return;finishPullGesture()}function handlePullPointerCancel(event){if(!activePull||event.pointerId!==activePull.pointerId)return;activePull.pointerId=null}function handlePullTouchStart(event){if(activePull||event?.touches?.length!==1||!canStartFromTarget(event.target))return;const touch=event.touches[0];activePull={pointerId:null,touchIdentifier:touch.identifier,startX:touch.clientX,startY:touch.clientY}}function handlePullTouchMove(event){const touch=findActiveTouch(event.touches);if(!activePull||!touch)return;updatePullGesture(touch.clientX,touch.clientY,event)}function handlePullTouchEnd(event){if(!activePull||!touchListIncludesActiveTouch(event.changedTouches))return;finishPullGesture()}function handlePullTouchCancel(event){if(activePull&&touchListIncludesActiveTouch(event.changedTouches))cancelPullRefresh()}function updatePullGesture(clientX,clientY,event){if(!activePull)return;const deltaX=clientX-activePull.startX;const deltaY=clientY-activePull.startY;const absX=Math.abs(deltaX);if(deltaY<-4||absX>24&&absX>deltaY*1.15){cancelPullRefresh();return}if(deltaY<=6||!isAtPageTop())return;if(event?.cancelable)event.preventDefault();pullDistance.value=Math.min(PULL_REFRESH_MAX_DISTANCE,Math.round(deltaY*.55))}function finishPullGesture(){const shouldRefresh=pullDistance.value>=PULL_REFRESH_TRIGGER_DISTANCE;activePull=null;if(!shouldRefresh){pullDistance.value=0;return}refreshFromPullGesture()}function cancelPullRefresh(){activePull=null;if(!pullRefreshing.value)pullDistance.value=0}async function refreshFromPullGesture(){if(!canRefresh()||pullRefreshing.value){pullDistance.value=0;return}pullRefreshing.value=true;pullDistance.value=PULL_REFRESH_TRIGGER_DISTANCE;try{await refreshRuntime.refresh(`pull-to-refresh`)}finally{pullRefreshing.value=false;pullDistance.value=0}}function findActiveTouch(touchList){if(!activePull||!touchList||touchList.length<1)return null;if(activePull.touchIdentifier===null&&touchList.length===1)return touchList[0];for(const touch of touchList)if(touch.identifier===activePull.touchIdentifier)return touch;return null}function touchListIncludesActiveTouch(touchList){if(!activePull)return false;if(activePull.touchIdentifier===null)return!touchList||touchList.length<=1;return Boolean(findActiveTouch(touchList))}return{pullDistance,pullRefreshing,pullProgress,pullIndicatorVisible,pullRefreshLabel,pullRefreshStyle}}var{t}=useJskitText();var DESKTOP_DRAWER_CLOSED_MODES=Object.freeze([`rail`,`hidden`]);function normalizeDesktopDrawerClosedMode(value=`rail`){const normalized=String(value||`rail`).trim().toLowerCase();return DESKTOP_DRAWER_CLOSED_MODES.includes(normalized)?normalized:`rail`}function resolveShellDrawerPresentation({compact=false,open=false,desktopClosedMode=`rail`}={}){const closedMode=normalizeDesktopDrawerClosedMode(desktopClosedMode);if(compact)return Object.freeze({visible:Boolean(open),rail:false,kind:`modal`,closedMode});if(open)return Object.freeze({visible:true,rail:false,kind:`drawer`,closedMode});if(closedMode===`hidden`)return Object.freeze({visible:false,rail:false,kind:`hidden`,closedMode});return Object.freeze({visible:true,rail:true,kind:`rail`,closedMode})}function resolveShellDrawerToggleLabel({compact=false,open=false}={}){if(compact)return open?t(`jskit.shell.layout.closeNavigationMenu`):t(`jskit.shell.layout.openNavigationMenu`);return open?t(`jskit.shell.layout.collapseNavigationDrawer`):t(`jskit.shell.layout.expandNavigationDrawer`)}var DEFAULT_SHELL_DRAWER_WIDTH=248;var DEFAULT_SHELL_RAIL_WIDTH=80;var MINIMUM_SHELL_DRAWER_WIDTH=120;var MAXIMUM_SHELL_DRAWER_WIDTH=360;var MINIMUM_SHELL_RAIL_WIDTH=48;var MAXIMUM_SHELL_RAIL_WIDTH=160;var DEFAULT_SHELL_NAVIGATION_ITEM_SPACING=12;var MINIMUM_SHELL_NAVIGATION_ITEM_SPACING=8;var MAXIMUM_SHELL_NAVIGATION_ITEM_SPACING=24;function clampNumber(value,minimum,maximum){return Math.min(maximum,Math.max(minimum,value))}function normalizeShellDrawerWidth(value,fallback=248){const parsed=Number(value);if(!Number.isFinite(parsed)||parsed<=0)return fallback;return clampNumber(parsed,120,360)}function normalizeShellRailWidth(value,fallback=80){const parsed=Number(value);if(!Number.isFinite(parsed)||parsed<=0)return fallback;return clampNumber(Math.round(parsed),MINIMUM_SHELL_RAIL_WIDTH,MAXIMUM_SHELL_RAIL_WIDTH)}function normalizeShellNavigationItemSpacing(value,fallback=12){const parsed=Number(value);if(!Number.isFinite(parsed)||parsed<=0)return fallback;return clampNumber(Math.round(parsed),MINIMUM_SHELL_NAVIGATION_ITEM_SPACING,MAXIMUM_SHELL_NAVIGATION_ITEM_SPACING)}function resolveContentAwareDrawerWidth(measurements=[],{endGap=12,minimum=120,maximum=360,fallback=248}={}){let requiredWidth=0;for(const measurement of measurements){const logicalStart=Number(measurement?.logicalStart);const textWidth=Number(measurement?.textWidth);if(!Number.isFinite(logicalStart)||logicalStart<0||!Number.isFinite(textWidth)||textWidth<=0)continue;requiredWidth=Math.max(requiredWidth,logicalStart+textWidth+Number(endGap||0))}if(requiredWidth<=0)return normalizeShellDrawerWidth(fallback);return clampNumber(Math.ceil(requiredWidth*4)/4,minimum,maximum)}var COMPACT_MAX_WIDTH=600;var MEDIUM_MAX_WIDTH=1280;function resolveShellLayoutClass(displayName=``,viewportWidth=0){const name=String(displayName||``).trim().toLowerCase();if(name===`xs`||name===`sm`)return`compact`;if(name===`md`)return`medium`;if(name===`lg`||name===`xl`||name===`xxl`)return`expanded`;const width=Number(viewportWidth)||0;if(width>0&&width<COMPACT_MAX_WIDTH)return`compact`;if(width>0&&width<MEDIUM_MAX_WIDTH)return`medium`;return`expanded`}function readViewportWidth(){return typeof window===`object`?Number(window.innerWidth||0):0}var _sfc_main$12={__name:`ShellOutlet`,props:{target:{type:String,default:``},default:{type:Boolean,default:false},context:{type:Object,default:()=>({})}},setup(__props){const props=__props;let route=null;try{route=useRoute()}catch{route=null}let display=null;try{display=useDisplay()}catch{display=null}const{text}=useJskitText();const TRANSLATED_PLACEMENT_PROPS=Object.freeze([`label`,`title`]);function isPlacementText(value){return typeof value===`string`||Boolean(value)&&typeof value===`object`&&typeof value.key===`string`}function placementProps(entry){const source=entry?.props;if(!source||typeof source!==`object`)return source;const translated={...source};for(const name of TRANSLATED_PLACEMENT_PROPS)if(isPlacementText(source[name]))translated[name]=text(source[name]);return translated}const placementRuntime=useWebPlacementRuntime();const{context:placementContext}=useWebPlacementContext();const revision=ref(typeof placementRuntime.getRevision===`function`?placementRuntime.getRevision():0);let unsubscribe=null;onMounted(()=>{if(typeof placementRuntime.subscribe!==`function`)return;unsubscribe=placementRuntime.subscribe(event=>{const next=Number(event?.revision);revision.value=Number.isInteger(next)?next:revision.value+1})});onBeforeUnmount(()=>{if(typeof unsubscribe===`function`){unsubscribe();unsubscribe=null}});const resolvedSurface=computed(()=>{const contextValue=placementContext?.value||null;const pathname=resolveRuntimePathname(route?.path);const surfaceFromPathname=resolveSurfaceIdFromPlacementPathname(contextValue,pathname);if(surfaceFromPathname)return surfaceFromPathname;const surfaceConfig=readPlacementSurfaceConfig(contextValue);if(surfaceConfig.defaultSurfaceId)return surfaceConfig.defaultSurfaceId;return`*`});const resolvedTargetId=computed(()=>{return String(props.target||``).trim()});const resolvedLayoutClass=computed(()=>resolveShellLayoutClass(display?.name?.value,readViewportWidth()));const placements=computed(()=>{revision.value;return placementRuntime.getPlacements({surface:resolvedSurface.value,target:resolvedTargetId.value,layoutClass:resolvedLayoutClass.value,context:props.context})});return(_ctx,_cache)=>{return openBlock(true),createElementBlock(Fragment,null,renderList(placements.value,entry=>{return openBlock(),createBlock(resolveDynamicComponent(entry.component),mergeProps({key:entry.id},{ref_for:true},placementProps(entry)),null,16)}),128)}}};function normalizeMenuLinkPathname(pathname=``){const source=String(pathname||``).trim();if(!source)return``;const queryIndex=source.indexOf(`?`);const hashIndex=source.indexOf(`#`);const cutoff=queryIndex<0?hashIndex:hashIndex<0?queryIndex:Math.min(queryIndex,hashIndex);return cutoff<0?source:source.slice(0,cutoff)}function resolveMenuLinkSurfaceId(surface=``,fallbackSurfaceId=``){const explicitSurface=normalizeText$1(surface).toLowerCase();if(explicitSurface&&explicitSurface!==`*`)return explicitSurface;return normalizeText$1(fallbackSurfaceId).toLowerCase()}function interpolateBracketParams(pathTemplate=``,params={}){const source=String(pathTemplate||``).trim();if(!source)return``;return source.replace(/\[([^\]]+)\]/g,(_match,rawKey)=>{const key=String(rawKey||``).trim();if(!key)return``;const value=params?.[key];return value==null?`[${key}]`:encodeURIComponent(String(value))})}function isRelativeMenuLinkTarget(target=``){const normalizedTarget=normalizeText$1(target);return normalizedTarget.startsWith(`./`)||normalizedTarget.startsWith(`../`)}function surfaceRequiresWorkspaceFromPlacementContext(contextValue=null,surfaceId=``){return Boolean(resolveSurfaceDefinitionFromPlacementContext(contextValue,surfaceId)?.requiresWorkspace)}function resolveMenuLinkTarget({to=``,surface=``,currentSurfaceId=``,placementContext=null,scopedSuffix=`/`,unscopedSuffix=`/`,routeParams={}}={}){const explicitTarget=normalizeText$1(to);if(explicitTarget&&!isRelativeMenuLinkTarget(explicitTarget))return explicitTarget;const targetSurfaceId=resolveMenuLinkSurfaceId(surface,currentSurfaceId);const scopedRouteRequired=surfaceRequiresWorkspaceFromPlacementContext(placementContext,targetSurfaceId);const interpolatedSuffix=interpolateBracketParams(normalizeText$1(scopedRouteRequired?scopedSuffix:unscopedSuffix)||`/`,routeParams);if(!targetSurfaceId||!interpolatedSuffix||interpolatedSuffix.includes(`[`))return``;return normalizeText$1(resolveShellLinkPath({context:placementContext,surface:targetSurfaceId,relativePath:interpolatedSuffix,params:routeParams,strictParams:true}))}function resolveMenuLinkHref(placementContext=null,target=``){const path=String(target||``).trim();if(!path)return{href:``,sameOrigin:true};const navigationTarget=resolveSurfaceNavigationTargetFromPlacementContext(placementContext,{path});return{href:navigationTarget.href,sameOrigin:navigationTarget.sameOrigin}}function resolveShellRouteTransitionKey({routePathKey=``,routeTransitionName=``,surfaceId=``}={}){if(normalizeText$1(routeTransitionName))return normalizeText$1(routePathKey)||`/`;const surfaceKey=normalizeText$1(surfaceId);if(surfaceKey&&surfaceKey!==`*`)return`surface:${surfaceKey}`;return`stable`}var SWIPE_MIN_DISTANCE=36;var SWIPE_MAX_VERTICAL_DRIFT=120;var SWIPE_MIN_VELOCITY=.08;var SWIPE_CLAIM_DISTANCE=10;var NO_SWIPE=Object.freeze({claim:false,offset:0});function isAcceptedSwipe({deltaX=0,deltaY=0,elapsed=1}={}){const absX=Math.abs(deltaX);const absY=Math.abs(deltaY);const velocity=absX/Math.max(elapsed,1);return absX>=SWIPE_MIN_DISTANCE&&absY<=SWIPE_MAX_VERTICAL_DRIFT&&absX>absY&&velocity>=SWIPE_MIN_VELOCITY}function isVerticalDrift(absX,absY){return absY>SWIPE_MAX_VERTICAL_DRIFT||absY>28&&absY>absX*1.3}function createRouteSwipeGesture({now=()=>performance.now()}={}){let active=null;function tracks(pointerId){return Boolean(active)&&pointerId===active.pointerId}function start({pointerId,clientX,clientY}){active={pointerId,startX:clientX,startY:clientY,startTime:now()}}function reset(){active=null}function measure({clientX,clientY}){return{deltaX:clientX-active.startX,deltaY:clientY-active.startY,elapsed:Math.max(now()-active.startTime,1)}}function offsetFor(deltaX){return deltaX<0?1:-1}function move(event){if(!tracks(event.pointerId))return NO_SWIPE;const swipe=measure(event);const absX=Math.abs(swipe.deltaX);const absY=Math.abs(swipe.deltaY);if(isVerticalDrift(absX,absY)){active=null;return NO_SWIPE}const claim=absX>SWIPE_CLAIM_DISTANCE&&absX>absY;if(!isAcceptedSwipe(swipe))return{claim,offset:0};active=null;return{claim,offset:offsetFor(swipe.deltaX)}}function end(event){if(!tracks(event.pointerId))return 0;const swipe=measure(event);active=null;return isAcceptedSwipe(swipe)?offsetFor(swipe.deltaX):0}function cancel(event){if(tracks(event.pointerId))active=null}return Object.freeze({start,reset,move,end,cancel})}var _hoisted_1$4={class:`shell-route-transition`};var _sfc_main$11={__name:`ShellRouteTransition`,props:{enabled:{type:Boolean,default:true},target:{type:String,default:`shell-layout:primary-bottom-nav`},semanticTarget:{type:String,default:`shell.primary-nav`},swipeEnabled:{type:Boolean,default:true}},setup(__props){const props=__props;const route=useRoute();const router=useRouter$1();const display=useDisplay();const placementRuntime=useWebPlacementRuntime();const{context:placementContext}=useWebPlacementContext();const revision=ref(typeof placementRuntime.getRevision===`function`?placementRuntime.getRevision():0);const transitionDirection=ref(`none`);let unsubscribe=null;const swipeGesture=createRouteSwipeGesture();let stopSwipeClassWatch=null;onMounted(()=>{if(typeof placementRuntime.subscribe!==`function`)unsubscribe=null;else unsubscribe=placementRuntime.subscribe(event=>{const next=Number(event?.revision);revision.value=Number.isInteger(next)?next:revision.value+1});if(typeof window===`object`){window.addEventListener(`pointerdown`,handlePointerDown,{capture:true,passive:true});window.addEventListener(`pointermove`,handlePointerMove,{capture:true,passive:false});window.addEventListener(`pointerup`,handlePointerEnd,{capture:true,passive:true});window.addEventListener(`pointercancel`,handlePointerCancel,{capture:true,passive:true})}stopSwipeClassWatch=watch(swipeNavigationEnabled,enabled=>{if(typeof document!==`object`)return;document.documentElement.classList.toggle(`shell-route-swipe-enabled`,enabled)},{immediate:true})});onBeforeUnmount(()=>{if(typeof unsubscribe===`function`){unsubscribe();unsubscribe=null}if(typeof stopSwipeClassWatch===`function`){stopSwipeClassWatch();stopSwipeClassWatch=null}if(typeof document===`object`)document.documentElement.classList.remove(`shell-route-swipe-enabled`);if(typeof window===`object`){window.removeEventListener(`pointerdown`,handlePointerDown,{capture:true});window.removeEventListener(`pointermove`,handlePointerMove,{capture:true});window.removeEventListener(`pointerup`,handlePointerEnd,{capture:true});window.removeEventListener(`pointercancel`,handlePointerCancel,{capture:true})}});const resolvedLayoutClass=computed(()=>resolveShellLayoutClass(display?.name?.value,readViewportWidth()));const currentPathname=computed(()=>normalizeComparablePathname(resolveRuntimePathname(route?.path||route?.fullPath||`/`)));const currentSurfaceId=computed(()=>{const contextValue=placementContext?.value||null;const surfaceFromPathname=resolveSurfaceIdFromPlacementPathname(contextValue,currentPathname.value);if(surfaceFromPathname)return surfaceFromPathname;return readPlacementSurfaceConfig(contextValue).defaultSurfaceId||`*`});const primaryNavEntries=computed(()=>{revision.value;const contextValue=placementContext?.value||null;const routeParams=route?.params||{};return placementRuntime.getPlacements({surface:currentSurfaceId.value,target:props.target,layoutClass:`compact`}).filter(entry=>String(entry.semanticTarget||entry.target||``).trim()===props.semanticTarget).map((entry,index)=>{const entryProps=entry?.props&&typeof entry.props===`object`?entry.props:{};const target=resolveMenuLinkTarget({to:entryProps.to,surface:entryProps.surface,currentSurfaceId:currentSurfaceId.value,placementContext:contextValue,scopedSuffix:entryProps.scopedSuffix,unscopedSuffix:entryProps.unscopedSuffix,routeParams});const navigationTarget=resolveSurfaceNavigationTargetFromPlacementContext(contextValue,{path:target,surfaceId:entryProps.surface||currentSurfaceId.value});return Object.freeze({id:entry.id,index,exact:entryProps.exact===true,href:navigationTarget.href,pathname:normalizeComparablePathname(navigationTarget.href),sameOrigin:navigationTarget.sameOrigin})}).filter(entry=>entry.pathname&&entry.sameOrigin)});const activePrimaryNavIndex=computed(()=>{const pathname=currentPathname.value;let bestMatch=null;for(const entry of primaryNavEntries.value){if(!pathMatchesNavigationEntry(pathname,entry))continue;if(!bestMatch||entry.pathname.length>bestMatch.pathname.length)bestMatch=entry}return bestMatch?bestMatch.index:-1});watch(activePrimaryNavIndex,(nextIndex,previousIndex)=>{if(!Number.isInteger(previousIndex)||previousIndex<0||nextIndex<0||nextIndex===previousIndex){transitionDirection.value=`none`;return}transitionDirection.value=nextIndex>previousIndex?`forward`:`reverse`},{flush:`sync`});const routeTransitionName=computed(()=>{if(!props.enabled||resolvedLayoutClass.value!==`compact`)return``;if(transitionDirection.value===`forward`)return`shell-route-slide-forward`;if(transitionDirection.value===`reverse`)return`shell-route-slide-reverse`;return``});const routeTransitionKey=ref(``);watch([()=>normalizeComparablePathname(route?.path||route?.fullPath||`/`),currentSurfaceId],([routePathKey,surfaceId])=>{routeTransitionKey.value=resolveShellRouteTransitionKey({routePathKey,routeTransitionName:routeTransitionName.value,surfaceId})},{immediate:true,flush:`sync`});const swipeNavigationEnabled=computed(()=>Boolean(props.enabled&&props.swipeEnabled&&resolvedLayoutClass.value===`compact`&&primaryNavEntries.value.length>1&&activePrimaryNavIndex.value>=0));function handlePointerDown(event){if(!swipeNavigationEnabled.value||!isPrimaryTouchPointer(event)||isShellGestureIgnoredTarget(event.target)){swipeGesture.reset();return}swipeGesture.start(event);try{event.target?.setPointerCapture?.(event.pointerId)}catch{}}function handlePointerMove(event){const{claim,offset}=swipeGesture.move(event);if(claim)event.preventDefault();if(offset)navigateBySwipe(offset)}function handlePointerEnd(event){const offset=swipeGesture.end(event);if(offset&&swipeNavigationEnabled.value)navigateBySwipe(offset)}function handlePointerCancel(event){swipeGesture.cancel(event)}function navigateBySwipe(offset=0){const currentIndex=activePrimaryNavIndex.value;const nextEntry=primaryNavEntries.value[currentIndex+offset];if(!nextEntry?.href||normalizeComparablePathname(nextEntry.href)===currentPathname.value)return;router.push(nextEntry.href).catch(()=>{})}function normalizeComparablePathname(value=``){const raw=String(value||``).trim();if(!raw)return``;try{const parsed=new URL(raw,window.location.href);if(parsed.origin!==window.location.origin)return``;return normalizePathname$1(parsed.pathname)}catch{return normalizePathname$1(normalizeMenuLinkPathname(raw))}}function pathMatchesNavigationEntry(pathname=``,entry={}){const target=String(entry.pathname||``).trim();if(!target)return false;if(entry.exact||target===`/`)return pathname===target;return pathname===target||pathname.startsWith(`${target}/`)}return(_ctx,_cache)=>{return openBlock(),createElementBlock(`div`,_hoisted_1$4,[createVNode(Transition,{name:routeTransitionName.value,css:Boolean(routeTransitionName.value)},{default:withCtx(()=>[(openBlock(),createElementBlock(`div`,{key:routeTransitionKey.value,class:`shell-route-transition__pane`},[renderSlot(_ctx.$slots,`default`,{},void 0,true)]))]),_:3},8,[`name`,`css`])])}}};var ShellRouteTransition_default=_plugin_vue_export_helper_default(_sfc_main$11,[[`__scopeId`,`data-v-678c4fa4`]]);var _hoisted_1$3={class:`shell-layout__top-left d-flex align-center ga-2`};var _hoisted_2$1={class:`shell-layout__surface-label`};var _hoisted_3$1={class:`shell-layout__top-right d-flex align-center ga-2`};var _hoisted_4={class:`shell-layout__pull-refresh-label`};var _hoisted_5={key:0,class:`shell-layout__title text-h5`};var _hoisted_6={key:1,class:`shell-layout__subtitle text-body-2 text-medium-emphasis`};var _hoisted_7={class:`shell-layout__supporting-side-panel`};var _hoisted_8={class:`shell-layout__supporting-title`};var _sfc_main$10={__name:`ShellLayout`,props:{surface:{type:String,default:``},surfaceLabel:{type:String,default:``},title:{type:String,default:``},subtitle:{type:String,default:``},desktopDrawerClosedMode:{type:String,default:`rail`},drawerWidth:{type:Number,default:null},railWidth:{type:Number,default:80},navigationItemSpacing:{type:Number,default:12}},setup(__props){const{t,text}=useJskitText();const props=__props;const{drawerDefaultOpen,drawerOpen,setDrawerOpen,supportingContentOpen,supportingContentTitle,setSupportingContentOpen,closeSupportingContent,toggleDrawer,resolvedSurface,resolvedSurfaceLabel}=useShellLayoutState(props);const display=useDisplay();const refreshRuntime=inject$1(SHELL_WEB_REFRESH_RUNTIME_KEY,null);const wideDrawerOpen=ref(Boolean(drawerDefaultOpen.value));const navigationToggle=ref(null);const navigationDrawer=ref(null);const measuredDrawerWidth=ref(248);let drawerContentObserver=null;let drawerMeasurementFrame=null;let shellMounted=false;const layoutClass=computed(()=>resolveShellLayoutClass(display?.name?.value,readViewportWidth()));const isCompactLayout=computed(()=>layoutClass.value===`compact`);const{pullRefreshing,pullProgress,pullIndicatorVisible,pullRefreshLabel,pullRefreshStyle}=useShellPullToRefresh({enabled:isCompactLayout,refreshRuntime});const drawerPresentation=computed(()=>resolveShellDrawerPresentation({compact:isCompactLayout.value,open:drawerOpen.value,desktopClosedMode:props.desktopDrawerClosedMode}));const drawerToggleLabel=computed(()=>resolveShellDrawerToggleLabel({compact:isCompactLayout.value,open:drawerOpen.value}));const fixedDrawerWidth=computed(()=>props.drawerWidth!==null&&props.drawerWidth!==void 0);const resolvedDrawerWidth=computed(()=>normalizeShellDrawerWidth(fixedDrawerWidth.value?props.drawerWidth:measuredDrawerWidth.value));const resolvedRailWidth=computed(()=>normalizeShellRailWidth(props.railWidth));const resolvedNavigationItemSpacing=computed(()=>normalizeShellNavigationItemSpacing(props.navigationItemSpacing));watch(drawerOpen,handleDrawerOpenChange);watch(isCompactLayout,handleLayoutClassChange,{immediate:true});watch(drawerPresentation,scheduleDrawerWidthMeasurement,{flush:`post`});watch(resolvedSurface,scheduleDrawerWidthMeasurement,{flush:`post`});watch(resolvedNavigationItemSpacing,scheduleDrawerWidthMeasurement,{flush:`post`});onMounted(attachShellListeners);onBeforeUnmount(detachShellListeners);function attachShellListeners(){shellMounted=true;if(typeof window!==`object`)return;window.addEventListener(`keydown`,handleShellKeydown);window.addEventListener(`resize`,scheduleDrawerWidthMeasurement,{passive:true});if(document?.fonts){document.fonts.ready.then(scheduleDrawerWidthMeasurement);document.fonts.addEventListener?.(`loadingdone`,scheduleDrawerWidthMeasurement)}nextTick$1().then(initializeDrawerMeasurement)}function detachShellListeners(){shellMounted=false;if(typeof window!==`object`)return;window.removeEventListener(`keydown`,handleShellKeydown);window.removeEventListener(`resize`,scheduleDrawerWidthMeasurement);document?.fonts?.removeEventListener?.(`loadingdone`,scheduleDrawerWidthMeasurement);drawerContentObserver?.disconnect();drawerContentObserver=null;if(drawerMeasurementFrame!==null){window.cancelAnimationFrame(drawerMeasurementFrame);drawerMeasurementFrame=null}}function handleDrawerOpenChange(open){if(!isCompactLayout.value)wideDrawerOpen.value=Boolean(open)}function handleLayoutClassChange(compact){setDrawerOpen(compact?false:wideDrawerOpen.value)}function handleShellKeydown(event){if(event?.defaultPrevented||event?.key!==`Escape`||!isCompactLayout.value||!drawerOpen.value)return;event.preventDefault();setDrawerOpen(false);nextTick$1().then(focusNavigationToggle)}function focusNavigationToggle(){(navigationToggle.value?.$el||navigationToggle.value)?.focus?.({preventScroll:true})}function initializeDrawerMeasurement(){const drawerElement=resolveNavigationDrawerElement();const drawerContent=drawerElement?.querySelector?.(`.v-navigation-drawer__content`)||drawerElement;if(typeof MutationObserver===`function`&&drawerContent){drawerContentObserver?.disconnect();drawerContentObserver=new MutationObserver(scheduleDrawerWidthMeasurement);drawerContentObserver.observe(drawerContent,{childList:true,characterData:true,subtree:true})}scheduleDrawerWidthMeasurement()}function resolveNavigationDrawerElement(){const exposedElement=navigationDrawer.value?.$el||navigationDrawer.value||null;if(typeof exposedElement?.getBoundingClientRect===`function`)return exposedElement;if(typeof document===`object`)return document.getElementById(`jskit-shell-drawer`);return null}function scheduleDrawerWidthMeasurement(){if(!shellMounted||fixedDrawerWidth.value||!drawerPresentation.value.visible||drawerPresentation.value.rail||typeof window!==`object`)return;if(drawerMeasurementFrame!==null)window.cancelAnimationFrame(drawerMeasurementFrame);drawerMeasurementFrame=window.requestAnimationFrame(measureDrawerContentWidth)}function measureDrawerContentWidth(){drawerMeasurementFrame=null;const drawerElement=resolveNavigationDrawerElement();if(!drawerElement||typeof document!==`object`)return;const drawerRect=drawerElement.getBoundingClientRect();const drawerStyle=window.getComputedStyle(drawerElement);const rightToLeft=drawerStyle.direction===`rtl`;const endBorderWidth=Number.parseFloat(rightToLeft?drawerStyle.borderLeftWidth:drawerStyle.borderRightWidth)||0;const measurements=[];for(const label of drawerElement.querySelectorAll(`.v-list-item-title`)){const labelStyle=window.getComputedStyle(label);if(labelStyle.display===`none`||labelStyle.visibility===`hidden`)continue;const textRect=measureRenderedText(label);if(!textRect||textRect.width<=0)continue;measurements.push({logicalStart:rightToLeft?drawerRect.right-textRect.right:textRect.left-drawerRect.left,textWidth:textRect.width})}const nextWidth=resolveContentAwareDrawerWidth(measurements,{endGap:resolvedNavigationItemSpacing.value+endBorderWidth});if(Math.abs(nextWidth-measuredDrawerWidth.value)>=.25)measuredDrawerWidth.value=nextWidth}function measureRenderedText(element){const range=document.createRange();range.selectNodeContents(element);const rect=range.getBoundingClientRect();range.detach?.();return rect}function handleDrawerVisibilityChange(open){if(isCompactLayout.value||drawerPresentation.value.closedMode===`hidden`||open===false)setDrawerOpen(open)}return(_ctx,_cache)=>{return openBlock(),createElementBlock(Fragment,null,[createVNode(VAppBar,{density:isCompactLayout.value?`compact`:`comfortable`,elevation:`0`,class:`shell-layout__app-bar`,"data-testid":`jskit-shell-app-bar`},{default:withCtx(()=>[createVNode(VAppBarNavIcon,{ref_key:`navigationToggle`,ref:navigationToggle,class:`shell-layout__nav-toggle`,"data-testid":`jskit-shell-nav-toggle`,"aria-label":drawerToggleLabel.value,"aria-expanded":unref(drawerOpen),"aria-controls":`jskit-shell-drawer`,onClick:unref(toggleDrawer)},null,8,[`aria-label`,`aria-expanded`,`onClick`]),renderSlot(_ctx.$slots,`top-left`,{surface:unref(resolvedSurface)},()=>[createBaseVNode(`div`,_hoisted_1$3,[createBaseVNode(`span`,_hoisted_2$1,toDisplayString(unref(resolvedSurfaceLabel)),1),createVNode(_sfc_main$12,{target:`shell-layout:top-left`})])],true),createVNode(VSpacer),renderSlot(_ctx.$slots,`top-right`,{surface:unref(resolvedSurface)},()=>[createBaseVNode(`div`,_hoisted_3$1,[createVNode(_sfc_main$12,{target:`shell-layout:top-right`})])],true)]),_:3},8,[`density`]),unref(pullIndicatorVisible)?(openBlock(),createElementBlock(`div`,{key:0,class:normalizeClass([`shell-layout__pull-refresh`,{"shell-layout__pull-refresh--refreshing":unref(pullRefreshing)}]),style:normalizeStyle(unref(pullRefreshStyle)),"data-testid":`jskit-shell-pull-refresh`,"aria-live":`polite`},[createVNode(VProgressCircular,{"model-value":unref(pullProgress),indeterminate:unref(pullRefreshing),color:`primary`,size:`22`,width:`3`},null,8,[`model-value`,`indeterminate`]),createBaseVNode(`span`,_hoisted_4,toDisplayString(unref(pullRefreshLabel)),1)],6)):createCommentVNode(``,true),createVNode(VNavigationDrawer,{ref_key:`navigationDrawer`,ref:navigationDrawer,id:`jskit-shell-drawer`,"model-value":drawerPresentation.value.visible,class:`shell-layout__drawer`,"data-testid":`jskit-shell-drawer`,"data-layout":layoutClass.value,"data-presentation":drawerPresentation.value.kind,"data-drawer-width-mode":fixedDrawerWidth.value?`fixed`:`content`,"data-drawer-width":resolvedDrawerWidth.value,"data-navigation-item-spacing":resolvedNavigationItemSpacing.value,"data-rail-width":resolvedRailWidth.value,style:normalizeStyle({"--shell-navigation-item-spacing":`${resolvedNavigationItemSpacing.value}px`,"--shell-navigation-rail-width":`${resolvedRailWidth.value}px`}),temporary:isCompactLayout.value,permanent:!isCompactLayout.value,width:resolvedDrawerWidth.value,rail:drawerPresentation.value.rail,"rail-width":resolvedRailWidth.value,"onUpdate:modelValue":handleDrawerVisibilityChange},{default:withCtx(()=>[renderSlot(_ctx.$slots,`menu`,{surface:unref(resolvedSurface),rail:drawerPresentation.value.rail},()=>[createVNode(VList,{nav:``,density:`comfortable`,class:`pt-2`,"prepend-gap":resolvedNavigationItemSpacing.value},{default:withCtx(()=>[createVNode(_sfc_main$12,{target:`shell-layout:primary-menu`,default:``}),createVNode(VDivider,{class:`my-2`}),createVNode(_sfc_main$12,{target:`shell-layout:secondary-menu`})]),_:1},8,[`prepend-gap`])],true)]),_:3},8,[`model-value`,`data-layout`,`data-presentation`,`data-drawer-width-mode`,`data-drawer-width`,`data-navigation-item-spacing`,`data-rail-width`,`style`,`temporary`,`permanent`,`width`,`rail`,`rail-width`]),createVNode(VMain,{class:`bg-background`},{default:withCtx(()=>[createVNode(VContainer,{fluid:``,class:`shell-layout__content`},{default:withCtx(()=>[__props.title?(openBlock(),createElementBlock(`h1`,_hoisted_5,toDisplayString(unref(text)(__props.title)),1)):createCommentVNode(``,true),__props.subtitle?(openBlock(),createElementBlock(`p`,_hoisted_6,toDisplayString(unref(text)(__props.subtitle)),1)):createCommentVNode(``,true),createVNode(ShellRouteTransition_default,null,{default:withCtx(()=>[renderSlot(_ctx.$slots,`default`,{},void 0,true)]),_:3})]),_:3})]),_:3}),isCompactLayout.value?(openBlock(),createBlock(VBottomNavigation,{key:1,class:`shell-layout__bottom-nav`,"data-testid":`jskit-shell-bottom-nav`,color:`primary`,density:`comfortable`,grow:``,mandatory:``},{default:withCtx(()=>[createVNode(_sfc_main$12,{target:`shell-layout:primary-bottom-nav`})]),_:1})):createCommentVNode(``,true),isCompactLayout.value?(openBlock(),createBlock(VBottomSheet,{key:2,"model-value":unref(supportingContentOpen),"onUpdate:modelValue":unref(setSupportingContentOpen)},{default:withCtx(()=>[createVNode(VCard,{rounded:`t-xl`,class:`shell-layout__supporting-sheet`,"data-testid":`jskit-shell-supporting-bottom-sheet`},{default:withCtx(()=>[createVNode(VCardTitle,{class:`shell-layout__supporting-title`},{default:withCtx(()=>[createBaseVNode(`span`,null,toDisplayString(unref(text)(unref(supportingContentTitle))||unref(t)(`jskit.shell.layout.details`)),1),createVNode(VBtn,{variant:`text`,onClick:unref(closeSupportingContent)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.shell.actions.close`)),1)]),_:1},8,[`onClick`])]),_:1}),createVNode(VCardText,null,{default:withCtx(()=>[createVNode(_sfc_main$12,{target:`shell-layout:supporting-bottom-sheet`})]),_:1})]),_:1})]),_:1},8,[`model-value`,`onUpdate:modelValue`])):createCommentVNode(``,true),!isCompactLayout.value?(openBlock(),createBlock(VNavigationDrawer,{key:3,"model-value":unref(supportingContentOpen),border:``,temporary:``,location:`right`,width:384,"data-testid":`jskit-shell-supporting-side-panel`,"onUpdate:modelValue":unref(setSupportingContentOpen)},{default:withCtx(()=>[createBaseVNode(`div`,_hoisted_7,[createBaseVNode(`div`,_hoisted_8,[createBaseVNode(`strong`,null,toDisplayString(unref(text)(unref(supportingContentTitle))||unref(t)(`jskit.shell.layout.details`)),1),createVNode(VBtn,{variant:`text`,onClick:unref(closeSupportingContent)},{default:withCtx(()=>[createTextVNode(toDisplayString(unref(t)(`jskit.shell.actions.close`)),1)]),_:1},8,[`onClick`])]),createVNode(_sfc_main$12,{target:`shell-layout:supporting-side-panel`})])]),_:1},8,[`model-value`,`onUpdate:modelValue`])):createCommentVNode(``,true)],64)}}};var ShellLayout_default=_plugin_vue_export_helper_default(_sfc_main$10,[[`__scopeId`,`data-v-b2ba0e63`]]);var _sfc_main$9={__name:`ShellOutletMenuWidget`,props:{target:{type:String,required:true},icon:{type:String,default:mdiCogOutline},ariaLabel:{type:String,default:void 0},location:{type:String,default:`bottom end`},offset:{type:[Number,String],default:10},minWidth:{type:[Number,String],default:220}},setup(__props){const{t,text}=useJskitText();const props=__props;return(_ctx,_cache)=>{return openBlock(),createBlock(VMenu,{location:props.location,offset:props.offset,eager:``},{activator:withCtx(({props:activatorProps})=>[createVNode(VBtn,mergeProps(activatorProps,{icon:``,variant:`text`,"aria-label":props.ariaLabel===void 0?unref(t)(`jskit.shell.layout.tools`):unref(text)(props.ariaLabel)}),{default:withCtx(()=>[createVNode(VIcon,{icon:props.icon},null,8,[`icon`])]),_:1},16,[`aria-label`])]),default:withCtx(()=>[createVNode(VList,{"min-width":props.minWidth,density:`comfortable`,class:`py-1`},{default:withCtx(()=>[createVNode(_sfc_main$12,{target:props.target},null,8,[`target`])]),_:1},8,[`min-width`])]),_:1},8,[`location`,`offset`])}}};var SURFACE_SWITCH_ICON_BY_ID=Object.freeze({home:mdiHomeVariantOutline,app:mdiViewDashboardOutline,admin:mdiShieldCrownOutline,console:mdiConsoleNetworkOutline});var SUPPORTED_EXPLICIT_MDI_ICON_BY_NAME=Object.freeze({"mdi-account-circle-outline":mdiAccountCircleOutline,"mdi-account-cog-outline":mdiAccountCogOutline,"mdi-account-group-outline":mdiAccountGroupOutline,"mdi-arrow-right-circle-outline":mdiArrowRightCircleOutline,"mdi-clipboard-list-outline":mdiClipboardListOutline,"mdi-cog-outline":mdiCogOutline,"mdi-console-network-outline":mdiConsoleNetworkOutline,"mdi-folder-outline":mdiFolderOutline,"mdi-home-variant-outline":mdiHomeVariantOutline,"mdi-login":mdiLogin,"mdi-logout":mdiLogout,"mdi-robot-outline":mdiRobotOutline,"mdi-shield-crown-outline":mdiShieldCrownOutline,"mdi-view-dashboard-outline":mdiViewDashboardOutline,"mdi-view-list-outline":mdiViewListOutline});function resolveExplicitIconValue(explicitIcon=``){const normalizedExplicitIcon=normalizeText$1(explicitIcon);if(!normalizedExplicitIcon)return``;if(!normalizedExplicitIcon.startsWith(`mdi-`))return normalizedExplicitIcon;const resolvedIcon=SUPPORTED_EXPLICIT_MDI_ICON_BY_NAME[normalizedExplicitIcon];return typeof resolvedIcon===`string`&&resolvedIcon?resolvedIcon:normalizedExplicitIcon}function normalizePathname(value=``){const normalizedValue=normalizeText$1(value);if(!normalizedValue)return``;if(isExternalLinkTarget(normalizedValue)){if(!(normalizedValue.startsWith(`http://`)||normalizedValue.startsWith(`https://`)))return``;let parsedPathname=``;try{parsedPathname=String(new URL(normalizedValue).pathname||``)}catch{return``}const normalizedPathname=normalizeText$1(parsedPathname);if(!normalizedPathname)return``;return normalizePathname$1(normalizedPathname).toLowerCase()}const{pathname}=splitPathQueryHash(normalizedValue);const normalizedPathname=normalizeText$1(pathname);if(!normalizedPathname)return``;return normalizePathname$1(normalizedPathname).toLowerCase()}function resolveSurfaceSwitchIdFromLabel(label=``){const normalizedLabel=normalizeText$1(label).toLowerCase();if(!normalizedLabel.startsWith(`go to `))return``;return normalizeText$1(normalizedLabel.slice(6))}function resolveSurfaceSwitchIcon(surfaceId=``,explicitIcon=``){const resolvedExplicitIcon=resolveExplicitIconValue(explicitIcon);if(resolvedExplicitIcon)return resolvedExplicitIcon;const normalizedSurfaceId=normalizeText$1(surfaceId).toLowerCase();return SURFACE_SWITCH_ICON_BY_ID[normalizedSurfaceId]||`M6,13V11H14L10.5,7.5L11.92,6.08L17.84,12L11.92,17.92L10.5,16.5L14,13H6M22,12A10,10 0 0,1 12,22A10,10 0 0,1 2,12A10,10 0 0,1 12,2A10,10 0 0,1 22,12M20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20A8,8 0 0,0 20,12Z`}function resolveMenuLinkIcon({icon=``,label=``,to=``}={}){const resolvedExplicitIcon=resolveExplicitIconValue(icon);if(resolvedExplicitIcon)return resolvedExplicitIcon;const normalizedLabel=normalizeText$1(label).toLowerCase();const normalizedPathname=normalizePathname(to);if(!normalizedLabel&&!normalizedPathname)return``;const surfaceSwitchSurfaceId=resolveSurfaceSwitchIdFromLabel(normalizedLabel);if(surfaceSwitchSurfaceId)return resolveSurfaceSwitchIcon(surfaceSwitchSurfaceId);if(normalizedLabel.includes(`sign in`)||normalizedPathname.includes(`/auth/login`))return mdiLogin;if(normalizedLabel.includes(`sign out`)||normalizedPathname.includes(`/auth/signout`))return mdiLogout;if(normalizedLabel.includes(`account`)||normalizedPathname.includes(`/account`)){if(normalizedLabel.includes(`settings`)||normalizedPathname.includes(`/settings`)||normalizedPathname===`/account`)return mdiAccountCogOutline;return mdiAccountCircleOutline}if(normalizedLabel.includes(`members`)||normalizedLabel.includes(`team`)||normalizedPathname.includes(`/members`))return mdiAccountGroupOutline;if(normalizedLabel.includes(`assistant`)||normalizedPathname.includes(`/assistant`))return mdiRobotOutline;if(normalizedLabel.includes(`console`)||normalizedPathname.startsWith(`/console`))return mdiConsoleNetworkOutline;if(normalizedLabel.includes(`admin`)||normalizedPathname.includes(`/admin`))return mdiShieldCrownOutline;if(normalizedLabel.includes(`settings`)||normalizedPathname.includes(`/settings`))return mdiCogOutline;if(normalizedLabel.includes(`home`)||normalizedPathname===`/`)return mdiHomeVariantOutline;if(normalizedLabel.includes(`workspace`)||normalizedLabel.includes(`dashboard`)||normalizedPathname.includes(`/w/`))return mdiViewDashboardOutline;if(normalizedPathname){if(normalizedPathname.split(`/`).filter(Boolean).length===1)return mdiFolderOutline}if(normalizedLabel.includes(`list`))return mdiClipboardListOutline;return mdiViewListOutline}function activateShellNavigationLinkOnSpace(event){if(event?.key!==` `||typeof event.currentTarget?.click!==`function`)return;event.preventDefault();event.stopPropagation();event.currentTarget.click()}var _sfc_main$8={__name:`ShellNavigationTooltip`,props:{label:{type:[String,Object],default:``}},setup(__props){const props=__props;const theme=useTheme();const{text}=useJskitText();return(_ctx,_cache)=>{return openBlock(),createBlock(VTooltip,{text:unref(text)(props.label),theme:unref(theme).name.value,location:`end`,"content-class":`shell-navigation-tooltip`,"open-delay":400,"open-on-focus":true,"open-on-hover":true},{activator:withCtx(({props:activatorProps})=>[renderSlot(_ctx.$slots,`default`,{activatorProps})]),_:3},8,[`text`,`theme`])}}};var _sfc_main$7={__name:`ShellMenuLinkItem`,props:{label:{type:[String,Object],default:``},to:{type:String,default:``},icon:{type:String,default:``},disabled:{type:Boolean,default:false},exact:{type:Boolean,default:false}},setup(__props){const props=__props;const{context:placementContext}=useWebPlacementContext();const{text}=useJskitText();const resolvedLabel=computed(()=>text(props.label));const resolvedTarget=computed(()=>resolveMenuLinkHref(placementContext.value,props.to));const resolvedIcon=computed(()=>resolveMenuLinkIcon({icon:props.icon,label:text(props.label,{locale:`en`}),to:resolvedTarget.value.href||props.to}));return(_ctx,_cache)=>{return resolvedTarget.value.href?(openBlock(),createBlock(_sfc_main$8,{key:0,label:resolvedLabel.value},{default:withCtx(({activatorProps})=>[createVNode(VListItem,mergeProps(activatorProps,{class:`shell-menu-link-item`,title:resolvedLabel.value,to:resolvedTarget.value.sameOrigin?resolvedTarget.value.href:void 0,href:resolvedTarget.value.sameOrigin?void 0:resolvedTarget.value.href,"prepend-icon":resolvedIcon.value||void 0,disabled:props.disabled,exact:props.exact,"aria-label":resolvedLabel.value,onKeydown:withKeys(unref(activateShellNavigationLinkOnSpace),[`space`])}),null,16,[`title`,`to`,`href`,`prepend-icon`,`disabled`,`exact`,`aria-label`,`onKeydown`])]),_:1},8,[`label`])):createCommentVNode(``,true)}}};var ShellMenuLinkItem_default=_plugin_vue_export_helper_default(_sfc_main$7,[[`__scopeId`,`data-v-7915a861`]]);var shellNavigationLinkProps=Object.freeze({label:{type:[String,Object],default:``},to:{type:String,default:``},icon:{type:String,default:``},surface:{type:String,default:``},scopedSuffix:{type:String,default:`/`},unscopedSuffix:{type:String,default:`/`},disabled:{type:Boolean,default:false},exact:{type:Boolean,default:false}});function useShellNavigationLink(props){const route=useRoute();const{context:placementContext}=useWebPlacementContext();const{text}=useJskitText();const resolvedLabel=computed(()=>text(props.label));const resolvedTo=computed(()=>{const currentSurfaceId=resolveSurfaceIdFromPlacementPathname(placementContext.value,String(route?.path||route?.fullPath||``).trim());return resolveMenuLinkTarget({to:props.to,surface:props.surface,currentSurfaceId,placementContext:placementContext.value,scopedSuffix:props.scopedSuffix,unscopedSuffix:props.unscopedSuffix,routeParams:route.params||{}})});const resolvedTarget=computed(()=>resolveMenuLinkHref(placementContext.value,resolvedTo.value));return{resolvedLabel,resolvedTarget,resolvedIcon:computed(()=>resolveMenuLinkIcon({icon:props.icon,label:text(props.label,{locale:`en`}),to:resolvedTarget.value.href||resolvedTo.value}))}}var _sfc_main$6={__name:`ShellSurfaceAwareMenuLinkItem`,props:shellNavigationLinkProps,setup(__props){const props=__props;const{resolvedLabel,resolvedTarget,resolvedIcon}=useShellNavigationLink(props);return(_ctx,_cache)=>{return unref(resolvedTarget).href?(openBlock(),createBlock(_sfc_main$8,{key:0,label:unref(resolvedLabel)},{default:withCtx(({activatorProps})=>[createVNode(VListItem,mergeProps(activatorProps,{class:`shell-menu-link-item`,title:unref(resolvedLabel),to:unref(resolvedTarget).sameOrigin?unref(resolvedTarget).href:void 0,href:unref(resolvedTarget).sameOrigin?void 0:unref(resolvedTarget).href,"prepend-icon":unref(resolvedIcon)||void 0,disabled:props.disabled,exact:props.exact,"aria-label":unref(resolvedLabel),onKeydown:withKeys(unref(activateShellNavigationLinkOnSpace),[`space`])}),null,16,[`title`,`to`,`href`,`prepend-icon`,`disabled`,`exact`,`aria-label`,`onKeydown`])]),_:1},8,[`label`])):createCommentVNode(``,true)}}};var ShellSurfaceAwareMenuLinkItem_default=_plugin_vue_export_helper_default(_sfc_main$6,[[`__scopeId`,`data-v-8c5c1ddc`]]);var _hoisted_1$2={class:`tab-link-item__label`};var _sfc_main$5={__name:`ShellTabLinkItem`,props:shellNavigationLinkProps,setup(__props){const props=__props;const{t}=useJskitText();const{resolvedLabel,resolvedTarget,resolvedIcon}=useShellNavigationLink(props);return(_ctx,_cache)=>{return unref(resolvedTarget).href?(openBlock(),createBlock(VBtn,{key:0,class:`tab-link-item text-none`,to:unref(resolvedTarget).sameOrigin?unref(resolvedTarget).href:void 0,href:unref(resolvedTarget).sameOrigin?void 0:unref(resolvedTarget).href,disabled:props.disabled,exact:props.exact,"min-width":`72`,stacked:``},{default:withCtx(()=>[unref(resolvedIcon)?(openBlock(),createBlock(VIcon,{key:0,icon:unref(resolvedIcon)},null,8,[`icon`])):createCommentVNode(``,true),createBaseVNode(`span`,_hoisted_1$2,toDisplayString(unref(resolvedLabel)||unref(t)(`jskit.shell.layout.tab`)),1)]),_:1},8,[`to`,`href`,`disabled`,`exact`])):createCommentVNode(``,true)}}};var ShellTabLinkItem_default=_plugin_vue_export_helper_default(_sfc_main$5,[[`__scopeId`,`data-v-e79018d6`]]);var client_exports$4=__exportAll({SHELL_ASYNC_MODULE_RECOVERY_RUNTIME_KEY:()=>SHELL_ASYNC_MODULE_RECOVERY_RUNTIME_KEY,SHELL_REQUEST_RECOVERY_RUNTIME_KEY:()=>SHELL_REQUEST_RECOVERY_RUNTIME_KEY,ShellErrorHost:()=>ShellErrorHost_default,ShellLayout:()=>ShellLayout_default,ShellMenuLinkItem:()=>ShellMenuLinkItem_default,ShellOutlet:()=>_sfc_main$12,ShellOutletMenuWidget:()=>_sfc_main$9,ShellRouteTransition:()=>ShellRouteTransition_default,ShellSurfaceAwareMenuLinkItem:()=>ShellSurfaceAwareMenuLinkItem_default,ShellTabLinkItem:()=>ShellTabLinkItem_default,ShellWebClientProvider:()=>ShellWebClientProvider,createBootstrapPayloadHandlerRegistry:()=>createBootstrapPayloadHandlerRegistry,isRecoverableRequestError:()=>isRecoverableRequestError,normalizeBootstrapPayloadHandler:()=>normalizeBootstrapPayloadHandler,requestRecoveryMessage:()=>requestRecoveryMessage,useShellAsyncModuleRecoveryRuntime:()=>useShellAsyncModuleRecoveryRuntime,useShellErrorPresentationStore:()=>useShellErrorPresentationStore,useShellLayoutState:()=>useShellLayoutState,useShellLayoutStore:()=>useShellLayoutStore,useShellRequestRecoveryRuntime:()=>useShellRequestRecoveryRuntime});var client_exports$3=__exportAll({});var _sfc_main$4={__name:`MenuLinkItem`,props:{label:{type:String,default:``},to:{type:String,default:``},icon:{type:String,default:``},disabled:{type:Boolean,default:false},exact:{type:Boolean,default:false}},setup(__props){const props=__props;return(_ctx,_cache)=>{return openBlock(),createBlock(unref(ShellMenuLinkItem_default),normalizeProps(guardReactiveProps(props)),null,16)}}};var MenuLinkItem_default=_plugin_vue_export_helper_default(_sfc_main$4,[[`__scopeId`,`data-v-8cffb0ff`]]);var _hoisted_1$1=[`data-vibe64-guide`];var _sfc_main$3={__name:`SurfaceAwareMenuLinkItem`,props:{label:{type:String,default:``},to:{type:String,default:``},icon:{type:String,default:``},surface:{type:String,default:``},scopedSuffix:{type:String,default:`/`},unscopedSuffix:{type:String,default:`/`},disabled:{type:Boolean,default:false},exact:{type:Boolean,default:false},guideId:{type:String,default:``}},setup(__props){const props=__props;const linkProps=computed(()=>{const{guideId,...value}=props;return value});const incomingCount=inject$1(`vibe64.incoming.pendingCount`,null);const incomingLink=computed(()=>props.scopedSuffix.endsWith(`/dashboard/incoming`));return(_ctx,_cache)=>{return incomingLink.value?(openBlock(),createBlock(VBadge,{key:0,class:`incoming-menu-link`,"model-value":unref(incomingCount)>0,content:unref(incomingCount),max:`99`,inline:``},{default:withCtx(()=>[createVNode(unref(ShellSurfaceAwareMenuLinkItem_default),normalizeProps(guardReactiveProps(linkProps.value)),null,16)]),_:1},8,[`model-value`,`content`])):__props.guideId?(openBlock(),createElementBlock(`div`,{key:1,class:`surface-aware-menu-link-guide`,"data-vibe64-guide":__props.guideId},[createVNode(unref(ShellSurfaceAwareMenuLinkItem_default),normalizeProps(guardReactiveProps(linkProps.value)),null,16)],8,_hoisted_1$1)):(openBlock(),createBlock(unref(ShellSurfaceAwareMenuLinkItem_default),normalizeProps(mergeProps({key:2},linkProps.value)),null,16))}}};var SurfaceAwareMenuLinkItem_default=_plugin_vue_export_helper_default(_sfc_main$3,[[`__scopeId`,`data-v-3bac1736`]]);var _sfc_main$2={__name:`TabLinkItem`,props:{label:{type:String,default:``},to:{type:String,default:``},icon:{type:String,default:``},surface:{type:String,default:``},scopedSuffix:{type:String,default:`/`},unscopedSuffix:{type:String,default:`/`},disabled:{type:Boolean,default:false},exact:{type:Boolean,default:false}},setup(__props){const props=__props;return(_ctx,_cache)=>{return openBlock(),createBlock(unref(ShellTabLinkItem_default),normalizeProps(guardReactiveProps(props)),null,16)}}};var TabLinkItem_default=_plugin_vue_export_helper_default(_sfc_main$2,[[`__scopeId`,`data-v-49a92b2f`]]);var _sfc_main$1={__name:`TopActionLinkItem`,props:{disabled:{default:false,type:Boolean},exact:{default:false,type:Boolean},icon:{default:``,type:String},label:{default:``,type:String},returnToCurrent:{default:false,type:Boolean},to:{default:``,type:String}},setup(__props){const props=__props;const route=useRoute();const resolvedIcon=computed(()=>mdiLinkVariant);const active=computed(()=>{const target=String(props.to||``).trim();const path=String(route.path||``).trim();if(!target||!path)return false;return props.exact?path===target:path===target||path.startsWith(`${target}/`)});const resolvedTo=computed(()=>{const target=String(props.to||``).trim();if(!target||!props.returnToCurrent||active.value)return target;return{path:target,query:{returnTo:route.fullPath||route.path||`/app`}}});return(_ctx,_cache)=>{return props.to?(openBlock(),createBlock(VBtn,{key:0,class:normalizeClass([`top-action-link-item text-none`,{"top-action-link-item--active":active.value}]),disabled:props.disabled,"prepend-icon":resolvedIcon.value||void 0,to:resolvedTo.value,variant:`tonal`,color:`primary`,density:`comfortable`},{default:withCtx(()=>[createTextVNode(toDisplayString(props.label||`Open`),1)]),_:1},8,[`class`,`disabled`,`prepend-icon`,`to`])):createCommentVNode(``,true)}}};var TopActionLinkItem_default=_plugin_vue_export_helper_default(_sfc_main$1,[[`__scopeId`,`data-v-3900100a`]]);var VIBE64_ACTIVE_SESSION_NAV_KEY=Symbol(`vibe64.activeSessionNav`);var _hoisted_1={key:0,class:`vibe64-active-session-nav-item vibe64-active-session-nav-item--heading`,"aria-label":`Active session navigation`};var _hoisted_2=[`title`];var _hoisted_3={class:`vibe64-active-session-nav-item__label`};var _sfc_main={__name:`Vibe64ActiveSessionNavItem`,props:{disabled:{default:false,type:Boolean},icon:{default:``,type:String},guideId:{default:``,type:String},label:{default:``,type:String},role:{default:``,type:String},title:{default:``,type:String},to:{default:``,type:String},toolId:{default:``,type:String}},setup(__props){const props=__props;const injectedSessionNav=inject$1(VIBE64_ACTIVE_SESSION_NAV_KEY,null);const sessionNav=computed(()=>{const value=unref(injectedSessionNav);return value&&typeof value===`object`?value:{}});const tools=computed(()=>Array.isArray(sessionNav.value.tools)?sessionNav.value.tools:[]);const tool=computed(()=>{const toolId=String(props.toolId||``).trim();return tools.value.find(candidate=>String(candidate?.id||``)===toolId)||{}});const navVisible=computed(()=>Boolean(sessionNav.value.visible!==false&&sessionNav.value.label));const headerVisible=computed(()=>Boolean(navVisible.value&&props.role===`heading`));const itemVisible=computed(()=>Boolean(navVisible.value&&props.role!==`heading`&&props.toolId));const itemLabel=computed(()=>String(tool.value.label||props.label||``));const itemIcon=computed(()=>String(tool.value.icon||props.icon||``));const itemTitle=computed(()=>String(tool.value.title||props.title||``));const itemTo=computed(()=>String(tool.value.to||props.to||``).trim());const itemDisabled=computed(()=>Boolean(props.disabled||tool.value.disabled));const itemDisabledReason=computed(()=>String(tool.value.disabledReason||itemTitle.value||``));const statusClass=computed(()=>`vibe64-active-session-nav-item__status--${String(sessionNav.value.status||`unknown`).trim()||`unknown`}`);function selectTool(){if(itemDisabled.value||typeof sessionNav.value.selectTool!==`function`)return;if(itemTo.value)return;sessionNav.value.selectTool(String(props.toolId||``))}return(_ctx,_cache)=>{return headerVisible.value?(openBlock(),createElementBlock(`div`,_hoisted_1,[createVNode(VDivider,{class:`vibe64-active-session-nav-item__divider`}),_cache[0]||(_cache[0]=createBaseVNode(`span`,{class:`vibe64-dashboard-nav-group-label`},`Session`,-1)),createBaseVNode(`div`,{class:`vibe64-active-session-nav-item__heading`,title:sessionNav.value.label},[createBaseVNode(`span`,{class:normalizeClass([`vibe64-active-session-nav-item__status`,statusClass.value])},null,2),createBaseVNode(`span`,_hoisted_3,toDisplayString(sessionNav.value.label),1)],8,_hoisted_2)])):itemVisible.value?(openBlock(),createBlock(VListItem,{key:1,class:`vibe64-active-session-nav-item`,active:tool.value.active,disabled:itemDisabled.value,"prepend-icon":itemIcon.value,title:itemLabel.value,"data-vibe64-guide":props.guideId||void 0,subtitle:itemDisabled.value?itemDisabledReason.value:``,to:itemTo.value||void 0,onClick:selectTool},null,8,[`active`,`disabled`,`prepend-icon`,`title`,`data-vibe64-guide`,`subtitle`,`to`])):createCommentVNode(``,true)}}};var Vibe64ActiveSessionNavItem_default=_plugin_vue_export_helper_default(_sfc_main,[[`__scopeId`,`data-v-e4e39c7a`]]);function isVibe64LiveQuery(query={}){return(Array.isArray(query?.queryKey)?query.queryKey:[])[0]===`vibe64`}function invalidateVibe64LiveQueries(queryClient){if(!queryClient||typeof queryClient.invalidateQueries!==`function`)return null;return queryClient.invalidateQueries({predicate:isVibe64LiveQuery,refetchType:`active`})}function attachVibe64RealtimeQueryRecovery({queryClient,realtime}={}){const socket=realtime?.socket;if(!socket||typeof socket.on!==`function`)throw new TypeError(`Vibe64 realtime query recovery requires a realtime socket.`);const recoverQueries=()=>invalidateVibe64LiveQueries(queryClient);socket.on(`connect`,recoverQueries);return()=>socket.off?.(`connect`,recoverQueries)}var detachQueryRecoveryByRealtime=new WeakMap;var MainClientProvider=defineProvider({id:`local.main.client`,requires:{components:`client.components`,queryClient:`client.query`,realtime:`client.realtime`},setup({components,queryClient,realtime}){components.register(`local.main.ui.menu-link-item`,MenuLinkItem_default);components.register(`local.main.ui.surface-aware-menu-link-item`,SurfaceAwareMenuLinkItem_default);components.register(`local.main.ui.tab-link-item`,TabLinkItem_default);components.register(`local.main.ui.top-action-link-item`,TopActionLinkItem_default);components.register(`local.main.vibe64.active-session-nav-item`,Vibe64ActiveSessionNavItem_default);detachQueryRecoveryByRealtime.set(realtime,attachVibe64RealtimeQueryRecovery({queryClient,realtime}))},shutdown({realtime}){detachQueryRecoveryByRealtime.get(realtime)?.();detachQueryRecoveryByRealtime.delete(realtime)}});var client_exports$2=__exportAll({MainClientProvider:()=>MainClientProvider});var client_exports$1=__exportAll({loadLocalDatabaseServer:()=>loadLocalDatabaseServer,loadVibe64DatabaseWorkspace:()=>loadVibe64DatabaseWorkspace,useVibe64DatabaseTools:()=>useVibe64DatabaseTools});async function loadVibe64DatabaseWorkspace(){return(await __vitePreload(()=>import(`./Vibe64DatabaseWorkspace-Dhs8_H0P.js`),__vite__mapDeps([163,1,6,7,8,2,45,22,23,24,21,25,26,27,28,14,15,29,30,17,18,46,31,16,5,9,49,50,51,52,53,54,32,33,34,35,36,37,59,60,10,11,61,62,87,88,12,89,39,40,41,42,43,44,90,68,74,91,92,63,71,66,164,38,47,48,55,56,57,58,64,65,67,69,70,72,73,13,19,75,76,77,78,79,80,81,165,97,166,167]))).default}async function loadLocalDatabaseServer(){return(await __vitePreload(()=>import(`./LocalDatabaseServer-u_Ky7bNS.js`),__vite__mapDeps([168,1,6,7,8,39,40,41,42,43,44,29,22,23,24,30,16,5,9,57,58,38,2,45,21,25,26,27,28,14,15,17,18,46,31,47,48,49,50,51,52,53,54,32,33,34,35,55,56,36,37,59,60,10,11,61,62,12,63,64,65,66,67,68,69,70,71,72,73,74,13,19,75,76,77,78,79,80,81,164,165,169]))).default}var client_exports=__exportAll({loadVibe64ArchitectureView:()=>loadVibe64ArchitectureView,useVibe64SystemGraph:()=>useVibe64SystemGraph});async function loadVibe64ArchitectureView(){return(await __vitePreload(async()=>{const{default:__vite_default__}=await import(`./Vibe64UiStoryboardView-DHyhJiWS.js`);return{default:__vite_default__}},__vite__mapDeps([170,1,6,7,8,21,22,23,24,25,26,27,28,16,5,9,49,50,32,33,34,35,12,95,39,40,41,42,43,44,69,2,68,48,67,70,96,166,171]))).default}var jskit$5={"connectors":{"googleCalendar":{"attendeesRequiresUp200Email":`attendees requires up to 200 email entries with optional displayName/optional.`,"cancellationNoEventBody":`Cancellation has no event body.`,"chooseAllDayDateTimed":`Choose an all-day date or a timed dateTime.`,"chooseSendUpdates":`Choose sendUpdates explicitly: all, externalOnly or none.`,"datetimeRequiresExplicitTimezoneOffset":`dateTime requires an explicit timezone offset.`,"description":`Read calendars and create, edit or cancel events.`,"eventMustObject":`event must be an object.`,"invalidAllDayDate":`Invalid all-day date.`,"invalidEventEtag":`Invalid event ETag.`,"invalidTransparency":`Invalid transparency.`,"invalidVisibility":`Invalid visibility.`,"recurrenceMustArrayRfc5545Recurrence":`recurrence must be an array of RFC5545 recurrence lines.`,"scopes":{"calendar":{"label":`Manage calendars and events`},"calendarAcls":{"label":`Manage calendar sharing permissions`},"calendarAclsReadonly":{"label":`Read calendar sharing permissions`},"calendarAddonsCurrentEventRead":{"label":`Read the event open in a Calendar add-on`},"calendarAddonsCurrentEventWrite":{"label":`Edit the event open in a Calendar add-on`},"calendarAddonsExecute":{"label":`Run a Calendar add-on`},"calendarAppCreated":{"label":`Create and manage app-created calendars`},"calendarCalendarlist":{"label":`Manage calendar subscriptions`},"calendarCalendarlistReadonly":{"label":`List calendars`},"calendarCalendars":{"label":`Manage calendar properties`},"calendarCalendarsReadonly":{"label":`Read calendar properties`},"calendarEvents":{"label":`Manage events`},"calendarEventsFreebusy":{"label":`Read availability in accessible calendars`},"calendarEventsOwned":{"label":`Manage events in calendars you own`},"calendarEventsOwnedReadonly":{"label":`Read events in calendars you own`},"calendarEventsPublicReadonly":{"label":`Read public calendar events`},"calendarEventsReadonly":{"label":`Read events`},"calendarFreebusy":{"label":`Read your availability`},"calendarReadonly":{"label":`Read all calendar data`},"calendarSettingsReadonly":{"label":`Read calendar settings`}},"startEndRequired":`start and end are required.`,"supplyStartEndSettingRecurrence":`Supply start and end when setting recurrence.`,"supplyStartEndTogetherChanging":`Supply start and end together when changing event times.`,"textTooLong":`{field} must be text of at most 16384 characters.`,"timedRecurrenceRequiresStartEnd":`Timed recurrence requires start/end timeZone.`,"useDateDatetimeOptionalTimezone":`Use date or dateTime and optional timeZone.`,"useIanaTimezone":`Use an IANA timeZone.`,"useMatchingDateTypesEnd":`Use matching date types with end after start; all-day end is exclusive.`,"useSupportedEventFields":`Use supported event fields only.`}}};var en_default$5={jskit:jskit$5};var jskit$4=JSON.parse(`{"connectors":{"ai":{"access":{"freeNoSetup":"Free · no account or key","freeWithConnection":"Free · connection required","paid":"Paid · connection required","unknown":"Pricing unknown · check provider"},"accessConnectionDenied":"Access to this AI connection was denied.","apiKeyReferenceHint":"Use an environment reference for an administrator key. For individual accounts, use a private reference your app resolves for the authenticated user. Never put a key in this file.","authenticationHint":"Your app calls the provider directly. A shared account belongs to the app administrator; individual accounts belong to each signed-in app user.","authenticationLabels":{"apiKey":"Use a provider API key","none":"Free access · no account or key"},"authorizedAccountApiKeyUnavailable":"The authorized AI account's API key is unavailable.","connectionNotConfigured":"This AI connection is not configured.","description":"Choose an app AI provider, model and whose account pays. No model is preselected.","fields":{"model":{"hint":"Choose a provider and model. Search by provider or model. Catalogue dated {date}; availability can change. No automatic paid fallback.","label":"AI model","selectedHint":{"freeNoSetup":"{model}: Free · no account or key. Search by provider or model. Catalogue dated {date}; availability can change. No automatic paid fallback.","freeWithConnection":"{model}: Free · connection required. Search by provider or model. Catalogue dated {date}; availability can change. No automatic paid fallback.","paid":"{model}: Paid · connection required. Search by provider or model. Catalogue dated {date}; availability can change. No automatic paid fallback.","unknown":"{model}: Pricing unknown · check provider. Search by provider or model. Catalogue dated {date}; availability can change. No automatic paid fallback."}}},"individualAccountsRequireUserOwned":"Individual AI accounts require a user-owned reference, not a shared environment variable."},"airtable":{"description":"Discover bases, read and edit records, and manage tables and fields."},"algolia":{"description":"Search and maintain index records, and check indexing completion.","fields":{"applicationId":{"hint":"Copy the ID from your Algolia application's API Keys page. This ID can be public.","label":"Application ID"},"publicApiKeyRef":{"environmentCredential":{"label":"Public frontend API key"},"hint":"Optional search-only key for your frontend. Enter its reference; your app decides whether to expose its value.","label":"Public API key reference (optional)"}}},"amazonRedshift":{"description":"Inspect tables and run queries in a serverless workgroup or provisioned cluster.","didNotReturnStatementIdentifier":"Redshift did not return a statement identifier.","fields":{"clusterIdentifier":{"label":"Cluster identifier"},"database":{"label":"Database"},"databaseUser":{"hint":"Leave blank to use the database identity derived from IAM.","label":"Database user (optional)"},"deploymentType":{"items":{"provisioned":{"title":"Provisioned cluster"},"serverless":{"title":"Serverless"}},"label":"Deployment type"},"region":{"hint":"Use the warehouse's region. Availability depends on your AWS account and deployment type.","label":"AWS Region"},"workgroup":{"hint":"The serverless workgroup name, without an ARN or URL.","label":"Workgroup name"}},"returnedUnexpectedStatement":"Redshift returned an unexpected statement.","statementBelongsDifferentTarget":"This statement belongs to a different Redshift target.","statementNoFinishedResultSet":"This statement has no finished result set.","useSqlParameterNameOnce":"Use each SQL parameter name only once."},"amplitude":{"description":"Query and manage Amplitude content through an authorized assistant MCP connection.","fields":{"region":{"hint":"Choose the region containing your Amplitude account and register the client there.","items":{"eu":{"title":"European Union"},"us":{"title":"United States"}},"label":"Region"}},"scopes":{"mcpRead":{"label":"Read Amplitude content (required for verification)"},"mcpWrite":{"label":"Create and edit Amplitude content"},"offlineAccess":{"label":"Refresh access without repeating sign-in"}}},"apify":{"description":"Run Actors with explicit limits and retrieve their results.","useFrameworkNativeClientStream":"Use the framework's native Apify client to stream records larger than 8 MiB."},"apolloIo":{"description":"Find prospects, enrich selected records and manage your sales contacts, accounts and deals.","enterRecordRequiredIdentifyingFields":"Enter the record's required identifying fields or changes."},"asana":{"description":"Discover projects and create, assign and track tasks in your Asana workspace.","includeDueSettingClearingStart":"Include due_on when setting or clearing start_on.","startDateMustPrecedeProject":"The start date must precede the project due date, or be no later than the task due date."},"ashby":{"couldNotCompleteOperation":"Ashby could not complete the operation.","description":"Read hiring data, maintain candidate profiles and advance sourced applications.","supplyLeastCandidateProfileChange":"Supply at least one candidate profile change."},"atlassian":{"description":"Use Jira, Confluence and other Atlassian tools through the assistant owner's Rovo MCP connection.","scopes":{"deleteJiraAgentInterface":{"label":"Delete Jira content"},"email":{"label":"Read your email address"},"manageJiraAgentInterface":{"label":"Manage Jira"},"offlineAccess":{"label":"Refresh access without repeating sign-in"},"readAccount":{"label":"Read your account"},"readAllTwg":{"label":"Read Teamwork Graph content"},"readConfluenceAgentInterface":{"label":"Read Confluence content"},"readJiraAgentInterface":{"label":"Read Jira content"},"readMe":{"label":"Read your profile"},"readProduct":{"label":"Read {product} content"},"searchCodeAgentInterface":{"label":"Search code"},"searchConfluenceAgentInterface":{"label":"Search Confluence"},"searchJiraAgentInterface":{"label":"Search Jira"},"searchRovoAgentInterface":{"label":"Search with Rovo"},"writeAllTwg":{"label":"Write Teamwork Graph content"},"writeConfluenceAgentInterface":{"label":"Create and edit Confluence content"},"writeJiraAgentInterface":{"label":"Create and edit Jira content"},"writeProduct":{"label":"Create and edit {product} content"}}},"attention":{"description":"Read conversations and coaching results; manage call metadata, snippets, users and teams.","endTimeMustFollowStart":"End time must follow start time."},"aws":{"checkRegionResourceOperationSettings":"Check the AWS region, resource and operation settings.","credentials":{"apiKeyReferenceHint":"Use a reference such as env:AWS_SECRET_ACCESS_KEY. Credentials belong to the configured AWS account; host defaults are never used.","apiKeyReferenceLabel":"Secret access key reference"},"deniedOperationCheckIamResource":"AWS denied this operation. Check IAM, resource and database permissions.","fields":{"accessKeyIdRef":{"environmentCredential":{"label":"AWS access key ID"},"hint":"Store the access key ID in Env and enter its reference.","label":"Access key ID reference"},"region":{"label":"AWS Region"},"sessionTokenRef":{"environmentCredential":{"label":"AWS session token"},"hint":"Required with temporary STS credentials. The host must renew all three credential bindings before they expire.","label":"Session token reference (optional)"}},"provideAccessKeyIdSecret":"Provide the AWS access key ID, secret access key and any required session token bindings.","regionDoesNotMatchOperation":"The AWS region does not match the operation destination.","regions":{"afSouth1":"Cape Town ({region})","apEast1":"Hong Kong ({region})","apEast2":"Taipei ({region})","apNortheast1":"Tokyo ({region})","apNortheast2":"Seoul ({region})","apNortheast3":"Osaka ({region})","apSouth1":"Mumbai ({region})","apSouth2":"Hyderabad ({region})","apSoutheast1":"Singapore ({region})","apSoutheast2":"Sydney ({region})","apSoutheast3":"Jakarta ({region})","apSoutheast4":"Melbourne ({region})","apSoutheast5":"Malaysia ({region})","apSoutheast6":"New Zealand ({region})","apSoutheast7":"Thailand ({region})","caCentral1":"Canada Central ({region})","caWest1":"Calgary ({region})","euCentral1":"Frankfurt ({region})","euCentral2":"Zurich ({region})","euNorth1":"Stockholm ({region})","euSouth1":"Milan ({region})","euSouth2":"Spain ({region})","euWest1":"Ireland ({region})","euWest2":"London ({region})","euWest3":"Paris ({region})","ilCentral1":"Tel Aviv ({region})","meCentral1":"UAE ({region})","meSouth1":"Bahrain ({region})","mxCentral1":"Mexico Central ({region})","saEast1":"São Paulo ({region})","usEast1":"N. Virginia ({region})","usEast2":"Ohio ({region})","usWest1":"N. California ({region})","usWest2":"Oregon ({region})"},"renewCredentialBindingsConnectAgain":"Renew the AWS credential bindings and connect again.","requestFailedReturnedUnreadableResponse":"The AWS request failed or returned an unreadable response.","requestLimitReached":"The AWS request limit was reached.","resourceNotFound":"The AWS resource was not found.","sdkSelectedUnexpectedDestination":"The AWS SDK selected an unexpected destination."},"awsAthena":{"description":"Browse data catalogs and schemas; start, inspect, page through and cancel queries in a configured workgroup.","fields":{"resultLocation":{"hint":"Leave blank when the workgroup supplies its own result storage. Enforced workgroup settings take precedence.","label":"Query result location (optional)"},"workgroup":{"hint":"Defaults to primary. Query access is restricted to this workgroup.","label":"Workgroup (optional)"}},"queryBelongsDifferentWorkgroup":"This query belongs to a different workgroup.","returnedDifferentWorkgroup":"Athena returned a different workgroup.","returnedUnexpectedQuery":"Athena returned an unexpected query."},"awsS3":{"description":"List bucket objects and create short-lived download or upload URLs.","fields":{"bucket":{"label":"Bucket name"}},"permissionsHint":"These choices limit the application's operations. AWS IAM and bucket policies decide actual access; selecting a permission does not grant it in AWS.","returnedUnexpectedBucketPageSize":"S3 returned an unexpected bucket or page size.","scopes":{"read":{"label":"List and download objects from bucket"},"write":{"label":"Also upload objects via pre-signed URLs"}}},"bigquery":{"description":"Configure the query project, run queries and retrieve results.","fields":{"projectId":{"hint":"The project that runs and is billed for queries. It can differ from the project containing your datasets. The initial connection check only lists accessible projects.","label":"Google Cloud project ID"}},"scopes":{"bigquery":{"label":"Manage BigQuery data"},"bigqueryReadonly":{"label":"Read BigQuery data and metadata"},"cloudPlatform":{"label":"Manage Google Cloud resources"},"cloudPlatformReadOnly":{"label":"Read Google Cloud resources"}}},"brevo":{"chooseTemplateProvideSubjectEmail":"Choose a template or provide a subject and email content.","description":"Send email and SMS, manage contacts and campaigns, and track delivery and automation events.","smsContentOrTemplate":"Choose SMS content or a template, not both."},"calendly":{"chooseEventOwner":"Choose the user, organization or group whose events to read.","choosePositiveRangeMost31":"Choose a positive range of at most 31 days.","description":"Read meetings and invitees, check availability, create booking links and manage appointments.","scopes":{"activityLogRead":{"label":"activity log — read"},"availabilityRead":{"label":"availability — read"},"availabilityWrite":{"label":"availability — write"},"contactsRead":{"label":"contacts — read"},"contactsWrite":{"label":"contacts — write"},"dataComplianceWrite":{"label":"data compliance — write"},"eventTypesRead":{"label":"event types — read"},"eventTypesWrite":{"label":"event types — write"},"groupsRead":{"label":"groups — read"},"locationsRead":{"label":"locations — read"},"organizationsRead":{"label":"organizations — read"},"organizationsWrite":{"label":"organizations — write"},"outgoingCommunicationsRead":{"label":"outgoing communications — read"},"routingFormsRead":{"label":"routing forms — read"},"scheduledEventsRead":{"label":"scheduled events — read"},"scheduledEventsWrite":{"label":"scheduled events — write"},"schedulingLinksWrite":{"label":"scheduling links — write"},"sharesWrite":{"label":"shares — write"},"usersRead":{"label":"users — read"},"webhooksRead":{"label":"webhooks — read"},"webhooksWrite":{"label":"webhooks — write"}}},"canva":{"clientIdHint":"Serve your client metadata JSON at this HTTPS URL. Canva must approve the callback; this setup uses no client secret.","clientIdLabel":"Client metadata URL","description":"Discover and use Canva design tools through each assistant owner's account.","scopes":{"assetRead":{"label":"Read assets"},"assetWrite":{"label":"Upload and edit assets"},"brandkitRead":{"label":"Read brand kits"},"brandtemplateContentRead":{"label":"Read brand template content"},"brandtemplateContentWrite":{"label":"Create and edit brand templates"},"brandtemplateMetaRead":{"label":"Read brand template information"},"commentRead":{"label":"Read comments"},"commentWrite":{"label":"Write comments"},"designContentRead":{"label":"Read design content"},"designContentWrite":{"label":"Create and edit designs"},"designMetaRead":{"label":"Read design information"},"folderRead":{"label":"Read folders"},"folderWrite":{"label":"Create and edit folders"},"helpAnswersRead":{"label":"Read help answers"},"helpAnswersWrite":{"label":"Write help answers"},"profileRead":{"label":"Read your profile"}}},"chargebee":{"description":"Manage customers and subscriptions, read invoices and launch hosted checkout for a Chargebee site.","fields":{"siteName":{"hint":"Your Chargebee site name, without .chargebee.com. Test and live sites use different keys.","label":"Site name"}}},"clay":{"apiKeyReferenceLabel":"Public API key reference","description":"Search people and companies, run enrichment routines and query Enterprise tables with your Clay Public API key."},"clickhouse":{"apiKeyReferenceHint":"Use a reference such as env:CLICKHOUSE_PASSWORD. Leave blank only if this database user has an empty password.","apiKeyReferenceLabel":"Password reference (optional)","authenticationHint":"No credentials uses the server's default user. Choose it only for a server configured to allow that access.","authenticationLabels":{"apiKey":"Username and password","none":"No credentials"},"description":"Explore tables and run bounded, parameterized analytical reads on your ClickHouse database.","fields":{"httpUrl":{"hint":"Use the HTTPS query endpoint, including its port and any proxy path. Native TCP addresses do not work here.","label":"HTTP Interface URL"},"username":{"hint":"The database user, not your Cloud console login. Leave blank to use default.","label":"Username (optional)"}}},"confidence":{"scopes":{"email":{"label":"Read account email"},"offlineAccess":{"label":"Refresh access without repeating sign-in"},"openid":{"label":"Identify the connected Confidence account"},"profile":{"label":"Read account profile"}}},"confidenceExp":{"description":"Read Confidence experiments and results through the assistant owner's MCP connection."},"confidenceFlags":{"description":"Manage Confidence flags through the assistant owner's MCP connection."},"contentful":{"apiKeyReferenceLabel":"Content Delivery API token reference","description":"Read published entries, linked assets, content models and locales from a Contentful space.","fields":{"environmentId":{"hint":"The key must have access to this environment. Defaults to master.","label":"Environment ID"},"region":{"items":{"eu":{"title":"Europe"},"us":{"title":"United States"}},"label":"Region"},"spaceId":{"hint":"Copy the Space ID from the selected space's API keys page.","label":"Space ID"}}},"databricks":{"description":"Read workspace jobs through user consent or a service principal.","fields":{"workspaceUrl":{"hint":"Use the workspace's own address. Omit browser paths, query strings and account-console URLs.","label":"Workspace URL"}},"oauthGrantHint":"User consent needs a custom OAuth application. Service account needs a service principal's client ID and OAuth secret, without a callback.","permissionsHint":"Permissions also depend on workspace membership and resource access. The jobs fragment only reads metadata; these OAuth scopes can permit more in other clients.","returnedUnexpectedJobResponse":"Databricks returned an unexpected job response.","scopes":{"allApis":{"label":"APIs allowed by the connected account"},"jobs":{"label":"Jobs API access for the service account"},"offlineAccess":{"label":"Keep user access between visits"}}},"dbtSemanticLayer":{"apiKeyReferenceHint":"Store the dbt service token in Env. It needs Semantic Layer Only and Metadata Only permissions and a linked warehouse credential.","apiKeyReferenceLabel":"Service token reference","completedWithoutJsonResultTable":"dbt completed without a JSON result table.","couldNotCompleteRequestedOperation":"dbt could not complete the requested operation. Check the environment and service token permissions.","description":"Discover metrics and query their values in a dbt Semantic Layer environment.","fields":{"environmentId":{"hint":"The deployment environment containing your metrics. Keep the full ID as text to avoid rounding.","label":"Environment ID"},"host":{"hint":"Copy the GraphQL hostname from dbt's Semantic Layer settings. Regional, single-tenant and multi-cell dbt hosts are supported.","label":"Semantic Layer host"}},"queryFailedInspectStatusDo":"dbt query failed. Inspect its status in dbt; do not automatically submit it again.","returnedInvalidJsonResultPage":"dbt returned an invalid JSON result page.","returnedInvalidJsonTable":"dbt returned an invalid JSON table.","returnedInvalidOversizedJsonResult":"dbt returned an invalid or oversized JSON result page.","returnedUnexpectedMetadataPage":"dbt returned an unexpected metadata page.","useServiceTokenWithoutSpaces":"Use a dbt service token without spaces or control characters."},"elevenlabs":{"audioSamplesMustTotalMost":"Audio samples must total at most 16 MiB.","description":"Generate speech, discover voices/models and create instant voice clones.","didNotReturnAudio":"ElevenLabs did not return audio.","returnedEmptyAudio":"ElevenLabs returned empty audio.","useNativeStreamingAudioAbove":"Use native streaming for audio above 16 MiB."},"figma":{"description":"Discover and call Figma's remote design tools through the assistant owner's account.","scopes":{"mcpConnect":{"label":"Use Figma MCP tools"}}},"firebaseCloudMessaging":{"couldNotAuthorizeServiceAccount":"Google could not authorize the service account. Check the credential and project permissions.","description":"Send notifications to mobile and browser installations, tokens or topics.","fields":{"apiKey":{"hint":"Public API key from the Firebase web app configuration. This value is visible in your deployed app.","label":"Firebase API key"},"appId":{"hint":"Public appId from the same Firebase project and web app.","label":"Firebase App ID"},"clientMode":{"hint":"Existing mobile/browser targets need server credentials. Include web push to configure browser registration too.","items":{"server":{"title":"Server or native only"},"web":{"title":"Include web push"}},"label":"Client setup"},"projectId":{"hint":"The project receiving messages. Usually project_id in your JSON; cross-project access requires an IAM grant on this target project.","label":"Firebase project ID"},"vapidKey":{"hint":"Public key from Project settings > Cloud Messaging > Web Push certificates. Never paste the private VAPID key.","label":"Web Push VAPID key"}},"permissionsHint":"Firebase IAM controls which projects this service account can send to. Sending to an audience also requires your application's authorization.","recipientNoLongerRegisteredRemove":"This Firebase recipient is no longer registered. Remove its association and wait for client registration again.","rejectedMessageTargetDoNot":"Firebase rejected the message or target. Do not delete a registration unless the payload is known to be valid.","returnedInvalidMessageJson":"Firebase returned invalid message JSON.","returnedUnexpectedMessageReceipt":"Firebase returned an unexpected message receipt.","returnedUnexpectedTokenRedirect":"Google returned an unexpected token redirect.","scopes":{"firebaseMessagingScope":{"label":"Validate and send Firebase messages"}},"serviceAccountReferenceHint":"Store the complete service-account JSON in Env, then enter its reference. It stays on the server and is never included in the browser configuration.","serviceAccountReferenceLabel":"Service-account JSON reference","useValidServiceAccountJson":"Use a valid Firebase service-account JSON credential for the default Google API domain."},"firecrawl":{"description":"Search, map, scrape and extract web content; run bounded site crawls.","useReturnedNextPageUrl":"Use the returned next-page URL for this crawl."},"fireflies":{"description":"Read and search Fireflies meetings, speaker-attributed transcripts and summaries."},"fireworksAi":{"description":"List accounts accessible to your Fireworks API key."},"gatewayApi":{"description":"Send SMS/RCS messages and read account credit on the Global or EU platform.","fields":{"region":{"hint":"Select the platform that issued this token.","items":{"eu":{"title":"EU (gatewayapi.eu)"},"global":{"title":"Global (gatewayapi.com)"}},"label":"API domain"}}},"gatewayapi":{"invalidWebhookEvent":"Invalid GatewayAPI webhook event."},"geminiEnterprise":{"description":"Search documents in a configured Gemini Enterprise engine.","fields":{"engineId":{"hint":"The existing search app identifier in default_collection, not its display name or full resource path.","label":"Engine ID"},"location":{"hint":"Match the engine's location. The runtime uses the corresponding Google API endpoint.","items":{"eu":{"title":"European Union"},"global":{"title":"Global"},"us":{"title":"United States"}},"label":"Location"},"projectId":{"hint":"The Google Cloud project where the Gemini Enterprise app lives.","label":"GCP project ID"}},"permissionsHint":"Google IAM and source permissions apply to the connected Google account. Shared access uses that same account for every authorized caller; it does not provide each app user's own search identity.","scopes":{"geminiEnterpriseScope":{"label":"Cloud Platform (full access)"}}},"githubApi":{"description":"Read repository content and activity; create and update issues and pull requests.","scopes":{"gist":{"label":"Gists"},"notifications":{"label":"Notifications"},"offlineAccess":{"label":"Expiring tokens with refresh access"},"project":{"label":"Projects"},"publicRepo":{"label":"Public repositories"},"readOrg":{"label":"Read organizations"},"readUser":{"label":"Read user profile"},"repo":{"label":"Repositories"},"userEmail":{"label":"Email"},"workflow":{"label":"Workflows"}}},"gitlabApi":{"description":"Read project content and activity; create and update issues and merge requests.","fields":{"instanceUrl":{"hint":"The trusted GitLab instance that receives this connection's credentials. Defaults to GitLab.com.","label":"Instance URL"}},"scopes":{"api":{"label":"Full API access"},"readApi":{"label":"Read API"},"readUser":{"label":"Read user profile"}}},"gmail":{"description":"Read and search mail, manage drafts and labels, and explicitly send messages.","scopes":{"gmailAddonsCurrentActionCompose":{"label":"Compose from an add-on"},"gmailAddonsCurrentMessageAction":{"label":"Act on the current add-on message"},"gmailAddonsCurrentMessageMetadata":{"label":"Read the current add-on message headers"},"gmailAddonsCurrentMessageReadonly":{"label":"Read the current add-on message"},"gmailCompose":{"label":"Manage drafts and send messages"},"gmailInsert":{"label":"Insert messages"},"gmailLabels":{"label":"Manage labels"},"gmailMetadata":{"label":"Read message headers and labels"},"gmailModify":{"label":"Read and modify messages"},"gmailReadonly":{"label":"Read messages"},"gmailSend":{"label":"Send messages"},"gmailSettingsBasic":{"label":"Manage basic mail settings"},"gmailSettingsSharing":{"label":"Manage sharing settings"},"httpsMailGoogleCom":{"label":"Full mailbox access including permanent deletion"}},"supplyLabelsAddRemove":"Supply labels to add or remove."},"gong":{"apiKeyReferenceLabel":"Access key secret reference","description":"Read company calls, transcripts, conversation statistics and linked CRM context.","endDateMustFollowStart":"The end date must follow the start date.","fields":{"accessKey":{"hint":"Copy the access key identifier from Gong's API settings. Store its secret separately.","label":"Access key"},"apiBaseUrl":{"hint":"Copy the API base URL from Gong's API settings. Leave empty to use https://api.gong.io.","label":"API base URL (optional)"}},"supplyCallIdsOrderedTimestamp":"Supply call IDs or an ordered timestamp range.","supplyIdsStringsPreserveAll":"Supply Gong IDs as strings to preserve all digits."},"google":{"batchRequestsInvalid":"Supply 1–100 native {product} request objects, one operation per object, within 1 MiB.","scopes":{"drive":{"label":"Manage Drive files"},"driveFile":{"label":"Access files selected for this application"},"driveReadonly":{"label":"Read Drive files"}}},"googleAds":{"apiCapacityExhaustedCheckCloud":"Google Ads API capacity is exhausted. Check the Cloud project and account quotas.","checkApiAccessApprovalCloud":"Check Google Ads API access approval for the Cloud project that owns this OAuth client.","connectAgainRequiredPermission":"Connect Google Ads again with its required permission.","description":"Discover advertising accounts, prepare reviewed Search campaigns and read Google Ads reports.","fields":{"loginCustomerId":{"hint":"Use the manager through which this app accesses client accounts, without hyphens. Direct account access can leave this blank.","label":"Manager customer ID (optional)"}},"permissionsHint":"This Google permission can authorize campaign changes. Search management uses separate reviewed operations; your application must authorize each account and spending decision. This is not application login.","rejectedOperationCheckCampaignFields":"Google Ads rejected the operation. Check campaign fields, policy requirements and account permissions.","resourceUnavailable":"This Google Ads resource is unavailable.","scopes":{"httpsWwwGoogleapisComAuthAdwords":{"label":"Access Google Ads accounts"}}},"googleAdsSearch":{"campaignChangedInspectApproveAgain":"The campaign changed. Inspect and approve it again.","campaignExceedsBoundedSearchReview":"This campaign exceeds the bounded Search review. Manage it in Google Ads.","chooseActiveClientAccount":"Choose an active client account.","chooseActiveClientAccountMatch":"Choose an active client account and match its currency.","chooseEnabledWebsiteConversionAction":"Choose an enabled website conversion action.","chooseIntegration":"Choose a Google Ads integration.","confirmInstalledConversionTrackingBilling":"Confirm installed conversion tracking and billing/advertiser readiness before launch.","didNotReturnSelectedAccount":"Google did not return the selected account.","enterLocationNameUsingLetters":"Enter a location name using letters, numbers, spaces, dots or hyphens.","pausedCampaignCanLaunchedHere":"Only a paused campaign can be launched here.","returnedInvalidCampaignGoal":"Google returned an invalid campaign goal.","reviewNonPoliticalSearchCampaign":"Review a non-political Search campaign with an enabled custom conversion goal.","screenLaunchesSearchCampaignsManual":"This screen launches only Search campaigns with manual CPC, ads and keywords. Manage other campaigns in Google Ads.","searchPlanChangedReviewAgain":"The Search plan changed. Review it again before creation.","selectAccessibleSearchCampaign":"Select an accessible Search campaign."},"googleAnalytics":{"authenticationHint":"Your application loads the Google tag. This does not grant access to Analytics reports.","authenticationLabels":{"none":"Public configuration · no credentials"},"description":"Configure website tracking with your public GA4 Measurement ID.","fields":{"measurementId":{"hint":"Public: this value will be visible in your deployed application. Copy it from your GA4 web stream.","label":"Measurement ID"}}},"googleDocs":{"description":"Create documents, read tabs and edit content with native batch requests.","scopes":{"documents":{"label":"Manage documents"},"documentsReadonly":{"label":"Read documents"}},"verificationFields":{"documentId":{"hint":"Leave blank for create-first access with drive.file and Drive API enabled. To verify an existing document, copy its ID between /document/d/ and /edit; the account and this app must have access.","label":"Document ID (optional)"}}},"googleDrive":{"base64Invalid":"Use standard padded base64 file data.","description":"Find files, upload and download content, and manage basic file metadata.","metadataChangeRequired":"Supply a name, description or trashed value.","mimeTypeInvalid":"Use a MIME type without header parameters.","parentIdNewFilesOnly":"parentId applies to new files; moving files requires native addParents/removeParents wiring.","scopes":{"drive":{"label":"Manage all Drive files"},"driveActivity":{"label":"Read and add file activity"},"driveActivityReadonly":{"label":"Read file activity"},"driveAppdata":{"label":"Manage application data"},"driveAppfolder":{"label":"Manage this application’s Drive folder data"},"driveAppsReadonly":{"label":"Read installed Drive apps"},"driveFile":{"label":"Manage files selected for this application"},"driveMeetReadonly":{"label":"Read Meet-created files"},"driveMetadata":{"label":"Manage file metadata"},"driveMetadataReadonly":{"label":"Read file metadata"},"drivePhotosReadonly":{"label":"Read photos"},"driveReadonly":{"label":"Read and download files"},"driveScripts":{"label":"Manage Apps Script files"}},"uploadTooLarge":"Uploads above 5 MB require the framework's native resumable client.","useFrameworkNativeDriveClient":"Use the framework's native Drive client for downloads or exports above 8 MiB."},"googleMapsPlatform":{"apiKeyReferenceHint":"Reference a server key authorized for Geocoding API. Verification performs one geocoding request using an address you supply and can incur provider usage charges.","apiKeyReferenceLabel":"Server API key reference","checkServerKeyBillingUsage":"Check the Google Maps server key, billing and usage cap.","couldNotAcceptGeocodingRequest":"Google Maps could not accept this geocoding request.","couldNotProcessRequestTry":"Google Maps could not process the request. Try again.","deniedAccessCheckEnabledApi":"Google Maps denied access. Check the enabled API and key restrictions.","description":"Geocode addresses, find places, compute routes and configure browser maps.","fields":{"browserKeyRef":{"hint":"A separate key for browser maps. Restrict it to the actual application websites and APIs. Backend verification does not verify this key.","label":"Browser API key reference (optional)"},"mapId":{"hint":"Public JavaScript map ID for advanced markers. Create it in Google Maps Platform > Map management. DEMO_MAP_ID is only for development.","label":"Map ID (optional)"}},"requestQuotaReached":"The Google Maps request quota was reached.","verificationFields":{"address":{"hint":"Enter an address or plus code. Connecting performs one geocoding request and can incur provider usage charges.","label":"Verification address"}}},"googleSearchConsole":{"datesOrder":"startDate must not follow endDate.","description":"Query search performance, inspect indexed URLs and manage sitemaps.","scopes":{"siteverification":{"label":"Manage website ownership through Site Verification"},"siteverificationVerifyOnly":{"label":"Verify new website ownership through Site Verification"},"webmasters":{"label":"Manage Search Console properties"},"webmastersReadonly":{"label":"Read Search Console properties"}}},"googleSheets":{"description":"Create spreadsheets, read and write ranges, and apply native batch updates.","rangesInvalid":"Supply 1–100 ranges within 1 MiB.","scopes":{"driveMetadataReadonly":{"label":"Read Drive file metadata (does not grant spreadsheet content access)"},"spreadsheets":{"label":"Manage spreadsheets"},"spreadsheetsReadonly":{"label":"Read spreadsheets"}},"valuesMatrixInvalid":"Supply a matrix of at most 10,000 cells and 1 MiB, containing strings, finite numbers, booleans or null.","verificationFields":{"spreadsheetId":{"hint":"Leave blank for create-first access with drive.file and Drive API enabled. Otherwise copy the ID between /spreadsheets/d/ and /edit, not the gid tab number; the account and app must have access.","label":"Spreadsheet ID (optional)"}}},"googleSlides":{"description":"Create and edit presentations, read pages and obtain preview thumbnails.","scopes":{"presentations":{"label":"Manage presentations"},"presentationsReadonly":{"label":"Read presentations"},"spreadsheets":{"label":"Manage linked spreadsheets"},"spreadsheetsReadonly":{"label":"Read linked spreadsheets"}},"verificationFields":{"presentationId":{"hint":"Leave blank for create-first access with drive.file and Drive API enabled. Otherwise copy the ID between /presentation/d/ and /edit; this is not a slide object ID. The account and app must have access.","label":"Presentation ID (optional)"}}},"granola":{"description":"Read meeting notes with an API key or connect the assistant owner through Granola MCP OAuth.","noteUnavailable":"The Granola note is unavailable, inaccessible or still being processed.","readTranscriptPagesTranscriptsList":"Read the transcript in pages with transcripts.list.","returnedDataDoesNotMatch":"Granola returned data that does not match this request.","scopes":{"email":{"label":"Read account email"},"offlineAccess":{"label":"Refresh access without repeating sign-in"},"openid":{"label":"Identify the connected Granola account"},"profile":{"label":"Read account profile"}},"useGrnApiKeyWithout":"Use the Granola grn_ API key without whitespace or control characters."},"hex":{"description":"Search projects and use Hex Threads through the assistant owner's MCP connection.","fields":{"endpoint":{"hint":"Use the endpoint where your Hex workspace lives; register the OAuth client at that endpoint.","items":{"eu":{"title":"Europe (eu.hex.tech)"},"hipaa":{"title":"HIPAA (hc.hex.tech)"},"standard":{"title":"Standard (app.hex.tech)"}},"label":"Hex workspace endpoint"}},"scopes":{"email":{"label":"Read account email"},"offlineAccess":{"label":"Refresh access without repeating sign-in"},"openid":{"label":"Identify the connected Hex account"},"profile":{"label":"Read account profile"}}},"heygen":{"description":"Read API profile and voices with a key, or connect HeyGen MCP tools through browser OAuth.","scopes":{"email":{"label":"Read account email"},"openid":{"label":"Identify the connected HeyGen account"},"profile":{"label":"Read account profile"}}},"heygenKey":{"description":"Read your API account profile and browse voice metadata."},"hubspot":{"contactIdentityRequired":"Supply email, firstname or lastname.","dealNameStageRequired":"Supply dealname and the internal dealstage ID.","scopes":{"crmObjectsContactsRead":{"label":"Read CRM contacts"},"crmObjectsContactsWrite":{"label":"Create and update CRM contacts"},"crmObjectsDealsRead":{"label":"Read deals and pipelines"},"crmObjectsDealsWrite":{"label":"Create and update CRM deals"},"oauth":{"label":"Authorize the HubSpot app"}}},"hubspotKey":{"description":"Manage contacts, deals and their relationships in the connected HubSpot account."},"incidentIo":{"description":"Manage incidents and follow-ups, resolve alerts, read on-call schedules and maintain catalogue entries."},"inngest":{"apiKeyReferenceHint":"Reference the Signing Key for the intended Inngest environment. Verification reads app metadata; it does not verify the Event Key or run a workflow.","apiKeyReferenceLabel":"Signing Key reference","configureValidEventKeyReconnect":"Configure a valid Inngest Event Key and reconnect.","deniedEvent":"Inngest denied this event.","description":"Send events to background workflows and inspect registered apps.","eventKeyBindingMissingInvalid":"The Inngest Event Key binding is missing or invalid.","eventLimitReached":"Inngest's event limit was reached.","fields":{"branchEnvironment":{"hint":"Routes event delivery to this branch. App metadata reads follow the Signing Key's environment.","label":"Branch environment (optional)"},"eventKeyRef":{"environmentCredential":{"label":"Inngest Event Key"},"hint":"The Event Key sends events. Keep it separate from the Signing Key, and use keys from the same intended environment.","label":"Event Key reference"}}},"klipy":{"description":"Browse clips, GIFs, stickers and existing AI emojis using your own KLIPY app key.","rejectedOperation":"KLIPY rejected the operation."},"lexware":{"description":"Read accounting contacts, articles and vouchers, and create net-EUR draft invoices."},"lightspeed":{"description":"Read products, inventory, sales, customers and outlets from a Lightspeed Retail X-Series store.","fields":{"domainPrefix":{"hint":"The store prefix from https://your-store.retail.lightspeed.app. Use the store you intend to authorize.","label":"Domain prefix"}},"lowerVersionMustBelowUpper":"The lower version must be below the upper version.","returnedInvalidTokenGrantDifferent":"Lightspeed returned an invalid token grant or a different store.","scopes":{"auditRead":{"label":"Read audit events"},"businessRulesRead":{"label":"Read business rules"},"businessRulesWrite":{"label":"Edit business rules"},"channelsRead":{"label":"Read channels"},"consignmentsRead":{"label":"Read consignments"},"consignmentsWriteInventoryCount":{"label":"Perform inventory counts"},"consignmentsWriteStockOrder":{"label":"Process stock orders"},"consignmentsWriteStockTransfer":{"label":"Transfer stock"},"customFieldsRead":{"label":"Read custom fields"},"customFieldsWrite":{"label":"Edit custom fields"},"customersRead":{"label":"Read customers"},"customersWrite":{"label":"Edit customers"},"fulfillmentsRead":{"label":"Read fulfillments"},"fulfillmentsWrite":{"label":"Edit fulfillments"},"giftCardsRead":{"label":"Read gift cards"},"giftCardsWriteIssue":{"label":"Issue gift cards"},"giftCardsWriteRedeem":{"label":"Redeem gift cards"},"inventoryRead":{"label":"Read inventory"},"inventoryWrite":{"label":"Edit inventory"},"outletsRead":{"label":"Read outlets"},"paymentTypesRead":{"label":"Read payment types"},"paymentsRead":{"label":"Read payments"},"productsRead":{"label":"Read products"},"productsReadPriceBooks":{"label":"Read price books"},"productsWrite":{"label":"Edit products"},"productsWritePriceBooks":{"label":"Edit price books"},"promotionsRead":{"label":"Read promotions"},"promotionsWrite":{"label":"Edit promotions"},"registerClose":{"label":"Close registers"},"registerOpen":{"label":"Open registers"},"registersRead":{"label":"Read registers"},"remoteRulesRead":{"label":"Read remote rules"},"remoteRulesWrite":{"label":"Edit remote rules"},"retailerRead":{"label":"Read retailer settings"},"salesRead":{"label":"Read sales"},"salesWrite":{"label":"Edit sales"},"serialNumbersRead":{"label":"Read serial numbers"},"serialNumbersWrite":{"label":"Edit serial numbers"},"servicesRead":{"label":"Read services"},"servicesWrite":{"label":"Edit services"},"storeCreditsRead":{"label":"Read store credits"},"storeCreditsWriteIssue":{"label":"Issue store credits"},"suppliersRead":{"label":"Read suppliers"},"suppliersWrite":{"label":"Edit suppliers"},"taxesRead":{"label":"Read taxes"},"taxesWrite":{"label":"Edit taxes"},"usersRead":{"label":"Read users"},"usersWrite":{"label":"Edit users"},"webhooks":{"label":"Manage application webhooks"}},"useOrderedInventoryVersionBounds":"Use ordered inventory version bounds and a product ID when requesting variants."},"linear":{"scopes":{"commentsCreate":{"label":"Create comments"},"issuesCreate":{"label":"Create issues and attachments"},"read":{"label":"Read your account"},"timeScheduleWrite":{"label":"Manage time schedules"},"write":{"label":"Write on your behalf"}}},"linearKey":{"description":"Read profiles and issues, or use Linear MCP tools with the connected account."},"linkedin":{"connectOpenidProfilePermissions":"Connect LinkedIn with OpenID and profile permissions.","description":"Connect a member's LinkedIn account to read their permitted profile information and publish approved text posts.","didNotConfirmPostCreation":"LinkedIn did not confirm post creation.","permissionsHint":"OpenID and profile are required for profile verification. Email is optional. Publish posts needs LinkedIn's Share on LinkedIn product; select it and reconnect before publishing text posts.","returnedInvalidMemberIdentity":"LinkedIn returned an invalid member identity.","scopes":{"email":{"label":"Read primary email address"},"openid":{"label":"OpenID (required)"},"profile":{"label":"Read basic profile (required)"},"wMemberSocial":{"label":"Publish posts"}}},"logoDev":{"apiKeyReferenceHint":"Reference a pk_ key. Your application exposes its value in image URLs. A private sk_ key cannot be used for this image flow.","apiKeyReferenceLabel":"Publishable key reference","description":"Display company logos using a publishable image-service key."},"mailgun":{"description":"Send transactional email, manage sending domains and inspect delivery logs.","fields":{"region":{"hint":"Select the region containing your sending domains.","items":{"eu":{"title":"European Union (api.eu.mailgun.net)"},"us":{"title":"United States (api.mailgun.net)"}},"label":"API region"}}},"mapbox":{"apiKeyReferenceHint":"Use a reference to a token for backend requests. It may be a public (pk.) or secret (sk.) token; browser URL restrictions can block backend geocoding.","apiKeyReferenceLabel":"Backend access token reference","configureValidTokenConnectAgain":"Configure a valid Mapbox token and connect again.","description":"Validate a backend access token and look up places or coordinates.","fields":{"publicTokenRef":{"environmentCredential":{"label":"Public browser token"},"hint":"Required for browser-only mode; optional with backend geocoding. Separate pk. token for Mapbox in your browser. The application may expose this value; backend verification does not verify its restrictions.","label":"Public browser token reference"},"usage":{"items":{"backend":{"title":"Backend geocoding and optional browser maps"},"browser":{"title":"Browser maps only"}},"label":"Mapbox usage"}}},"mcp":{"registrationFailed":"{provider} client registration failed. Check the provider before creating another client.","registrationInterrupted":"Registration was interrupted. Check the provider before creating another client.","transportRequestedUnexpectedDestination":"The MCP transport requested an unexpected destination."},"microsoft":{"chooseDocumentFile":"Choose a {product} file.","fields":{"tenantId":{"hint":"Use {authority} for the default audience, or the directory GUID for a single-tenant app. This is not the Application (client) ID.","label":"Directory (tenant) ID"}},"returnedInvalidFileList":"Microsoft returned an invalid file list.","returnedInvalidFileMetadata":"Microsoft returned invalid file metadata.","scopes":{"offlineAccess":{"label":"Keep access when you are away"}}},"microsoftExcel":{"description":"Browse workbooks and read or update bounded cell ranges with explicit sessions.","scopes":{"filesRead":{"label":"Read your files"},"filesReadAll":{"label":"Read all files you can access"},"filesReadWrite":{"label":"Read and write your files (required by Excel worksheets)"},"filesReadWriteAll":{"label":"Read and write all files you can access"},"offlineAccess":{"label":"Keep access when you are away"}}},"microsoftFabric":{"couldNotCompleteGraphqlDocument":"Fabric could not complete the GraphQL document. Check its schema and permissions before retrying.","description":"Access one Fabric GraphQL API using user consent or a service principal.","fields":{"graphqlEndpoint":{"hint":"Open your API for GraphQL in Fabric and select Copy endpoint. Custom proxies and sovereign-cloud addresses are not supported by this fragment.","label":"Fabric GraphQL Endpoint"},"tenantId":{"hint":"The directory containing the Fabric resource and permitted users or service principal.","label":"Microsoft Entra Tenant ID"}},"oauthGrantHint":"User consent needs a Web callback and delegated GraphQL permission. Service account needs a service principal with Fabric access, without a callback.","permissionsHint":"Fabric Execute access permits queries and mutations. Your application must authorize the documents it executes. Data-source access is separate; this does not sign users into your application.","requiresNewSignConsent":"Microsoft requires a new sign-in or consent.","scopes":{"delegatedScope":{"label":"Execute GraphQL queries and mutations as the user"},"offlineAccess":{"label":"Keep user access between visits"},"serviceScope":{"label":"Use the service account's Fabric permissions"}}},"microsoftOneDrive":{"description":"Browse folders, obtain file downloads and upload small files.","scopes":{"filesRead":{"label":"Read your files"},"filesReadAll":{"label":"Read all files you can access"},"filesReadWrite":{"label":"Read and write your files"},"filesReadWriteAll":{"label":"Read and write all files you can access"},"filesReadWriteAppFolder":{"label":"Read and write files in the application's folder"},"offlineAccess":{"label":"Keep access when you are away"}}},"microsoftOneNote":{"description":"Browse notebooks and pages, read content, and create or append text notes.","scopes":{"notesCreate":{"label":"Create pages in OneNote notebooks"},"notesRead":{"label":"Read your notebooks"},"notesReadAll":{"label":"Read notebooks you can access in your organization"},"notesReadWrite":{"label":"Read and modify your notebooks"},"notesReadWriteAll":{"label":"Read and modify notebooks you can access in your organization"},"offlineAccess":{"label":"Keep access when you are away"}}},"microsoftOnedrive":{"useStandardPaddedBase64Up":"Use standard padded base64 up to 5 MB; larger files need a native upload session."},"microsoftOnenote":{"useNativeOnenoteClientPages":"Use the native OneNote client for pages above 1 MiB."},"microsoftOutlook":{"description":"Read messages and files, send text mail, manage read/folder state and calendar appointments.","endMustFollowStart":"End must follow start.","scopes":{"calendarsRead":{"label":"Read your calendars"},"calendarsReadWrite":{"label":"Read and write your calendars"},"mailRead":{"label":"Read your mail"},"mailReadBasic":{"label":"Read basic mail properties"},"mailReadWrite":{"label":"Read and write your mail"},"mailSend":{"label":"Send mail as you"},"offlineAccess":{"label":"Keep access when you are away"}}},"microsoftPowerPoint":{"description":"Browse PowerPoint files and folders in your drive and read presentation metadata.","scopes":{"filesRead":{"label":"Read your files"}}},"microsoftSharePoint":{"description":"Browse sites/libraries, transfer small files and edit list items.","scopes":{"filesReadAll":{"label":"Read all files that user can access"},"filesReadWriteAll":{"label":"Read and write all files that user can access"},"offlineAccess":{"label":"Keep access when you are away"},"sitesFullControlAll":{"label":"Have full control of all site collections"},"sitesManageAll":{"label":"Create, edit, and delete items and lists in all site collections"},"sitesReadAll":{"label":"Read items in all site collections"},"sitesReadWriteAll":{"label":"Edit or delete items in all site collections"},"userRead":{"label":"Read user profile"}},"verificationFields":{"search":{"hint":"Enter a search term for accessible SharePoint sites. Verification performs this search without changing a site.","label":"Site search"}}},"microsoftTeams":{"description":"Browse teams/channels and read or send channel and existing-chat messages.","scopes":{"channelMessageReadAll":{"label":"Read channel messages"},"channelMessageSend":{"label":"Send messages to channels"},"channelReadBasicAll":{"label":"List channels in teams"},"chatReadWrite":{"label":"Read and send chat messages"},"offlineAccess":{"label":"Keep access when you are away"},"teamReadBasicAll":{"label":"List joined teams"},"userRead":{"label":"Read user profile"},"userReadAll":{"label":"Read all users' full profiles"}}},"microsoftWord":{"description":"Browse Word files and folders in your drive and read document metadata.","scopes":{"filesRead":{"label":"Read your files"}}},"miro":{"description":"Use Miro board tools through the assistant owner's selected team.","scopes":{"boardsRead":{"label":"Read boards"},"boardsWrite":{"label":"Create and edit boards"},"email":{"label":"Read your email address"},"openid":{"label":"Include account identity"}}},"n8n":{"apiKeyReferenceHint":"Use the personal token from Instance-level MCP, not an n8n REST API key. The assistant host must authorize individual tool calls.","apiKeyReferenceLabel":"MCP access token reference","description":"Discover and use your n8n instance's MCP tools from an assistant.","discoverOauthSettingsExactMcp":"Discover OAuth settings for this exact n8n MCP URL before connecting.","fields":{"serverUrl":{"hint":"Copy the full Server URL from n8n's MCP connection details. Keep any reverse-proxy subdirectory.","label":"Server URL"}},"oauthDiscoveryFailedCheckMcp":"n8n OAuth discovery failed. Check the MCP URL, advertised authority and supported server version.","oauthDiscoveryInterrupted":"n8n OAuth discovery was interrupted.","selectPermissionsAdvertisedMcpServer":"Select only permissions advertised by this n8n MCP server."},"notion":{"fields":{"connectionType":{"hint":"Hosted MCP needs its own client registration and consent; REST credentials cannot be reused.","items":{"mcp":{"title":"Hosted assistant tools (MCP)"},"rest":{"title":"Application data (REST)"}},"label":"Connection type"}},"scopes":{"default":{"label":"Notion MCP access"}}},"notionInternal":{"description":"Read, query and update pages and data sources shared with a Notion connection."},"oura":{"description":"Connect an individual's Oura account to read sleep, readiness, activity, heart-rate and permitted profile data.","scopes":{"daily":{"label":"Read daily sleep, activity and readiness summaries"},"email":{"label":"Read the account email address"},"heartrate":{"label":"Read heart-rate samples"},"personal":{"label":"Read personal profile information"}},"startNotAfterEnd":"Start must be before or equal to end."},"paddle":{"assistantActions":{"apiRead":{"label":"Read Paddle API"},"apiWrite":{"label":"Write Paddle API"},"enable":{"label":"Enable Paddle"},"goLiveCheck":{"label":"Check go-live status"},"pricesCreate":{"label":"Create price"},"productsBatchCreate":{"label":"Batch create products with prices"},"productsCreate":{"label":"Create product with price"},"providerRecommend":{"label":"Recommend payment provider"},"webhooksUpdate":{"label":"Edit webhook"}},"chooseLeastNotificationSettingChange":"Choose at least one notification setting to change.","description":"Read and create Paddle Billing products and prices in sandbox or live mode.","fields":{"environment":{"hint":"Use the environment that issued this API key.","items":{"live":{"title":"Live"},"sandbox":{"title":"Sandbox"}},"label":"Environment"}}},"perplexity":{"description":"Connect your Perplexity key for app-owned cited answers and streaming."},"pipedrive":{"companyAddressChangedConnectAccount":"The Pipedrive company address changed. Connect this account again.","fields":{"companyDomain":{"hint":"For acme.pipedrive.com enter acme. Required for API-token CRM operations; OAuth uses the company address returned with consent.","label":"Company domain (API token)"}},"returnedInvalidCompanyApiAddress":"Pipedrive returned an invalid company API address.","setCompanyDomainApiToken":"Set the Pipedrive Company domain for API-token CRM operations.","supplyChangedFieldsNewLead":"Supply changed fields; a new lead also needs a person or organization."},"pipedriveToken":{"description":"Read the authenticated user and identify their Pipedrive company."},"polar":{"description":"Read your organization's Polar product catalogue.","fields":{"environment":{"hint":"Use the environment containing this organization and token.","items":{"production":{"title":"Production"},"sandbox":{"title":"Sandbox"}},"label":"Environment"}}},"posthog":{"apiKeyReferenceHint":"Use an environment reference for the project's public token (phc_). Your app may expose that token in its frontend. It cannot read private analytics.","apiKeyReferenceLabel":"Project token reference","couldNotEvaluateAllRequested":"PostHog could not evaluate all requested flags.","description":"Capture events and evaluate flags with a public project token.","featureFlagQuotaReached":"PostHog's feature flag quota has been reached.","fields":{"projectId":{"hint":"Public numeric ID from project settings. Public API requests use the token to select the project; verification does not match this ID to the token.","label":"Project ID"},"region":{"hint":"Choose the PostHog Cloud region containing this project.","items":{"eu":{"title":"Europe (eu.i.posthog.com)"},"us":{"title":"United States (us.i.posthog.com)"}},"label":"Region"}},"usePublicProjectTokenStarting":"Use the public PostHog project token starting with phc_.","verificationFields":{"distinctId":{"hint":"Enter the identity whose feature flags should be evaluated. This check does not submit an analytics event.","label":"Verification user ID"}}},"prestashop":{"apiKeyReferenceHint":"Store the Webservice key outside source. Grant GET for products, and for orders if the application needs order reads.","apiKeyReferenceLabel":"Webservice API key reference","description":"Read products and orders from your PrestaShop store.","fields":{"siteUrl":{"hint":"Use the HTTPS store address before /api, keeping any installation subdirectory.","label":"Store URL"}}},"replicate":{"description":"Run asynchronous model predictions with an application-owned Replicate token."},"resend":{"description":"Send transactional email and manage contact segments and draft broadcasts."},"salesforce":{"describedDifferentObject":"Salesforce described a different object.","description":"Explore Salesforce objects and read records with your organisation's API permissions.","fields":{"accountUrl":{"hint":"Copy My Domain from Salesforce Setup. The same org receives authorization and API requests.","label":"Account URL"},"environment":{"hint":"Production includes Developer Edition. Sandbox uses the org's .sandbox.my.salesforce.com domain.","items":{"production":{"title":"Production"},"sandbox":{"title":"Sandbox"}},"label":"Environment"}},"organisationApiRequestLimitReached":"The Salesforce organisation's API request limit was reached.","permissionsHint":"Salesforce's api permission can allow writes. This runtime exposes reads; your app still authorizes each query. Connecting an account does not sign the person into your application.","rejectedQueryObjectCheckApi":"Salesforce rejected the query or object. Check its API names and the user's permissions.","returnedInvalidGrantDifferentOrganisation":"Salesforce returned an invalid grant or a different organisation.","scopes":{"api":{"label":"Access Salesforce APIs with this user's permissions"},"refreshToken":{"label":"Keep access when the user is away"}},"startQueryAgainResultCursor":"Start the Salesforce query again; its result cursor is no longer valid."},"sanity":{"apiKeyReferenceHint":"Store a Sanity token in Env. Its role controls tool access at https://mcp.sanity.io; the assistant host must authorize individual calls.","apiKeyReferenceLabel":"MCP API token reference","description":"Discover and use Sanity's hosted MCP tools from an assistant.","scopes":{"global":{"label":"Sanity MCP account access"}}},"semrush":{"apiAccessDisabledAccount":"Semrush API access is disabled for this account.","apiCapacityExhaustedCheckAccount":"Semrush API capacity is exhausted. Check the account's subscription and available units.","apiKeyReferenceHint":"Use a new Semrush V4 key: Read-only for reports and project reads, Read and write for creating, renaming or deleting projects. V3 keys and OAuth tokens are different credentials.","apiKeyReferenceLabel":"V4 API key reference","checkV3ApiDatabaseReport":"Check Semrush V3 API, database and report entitlement.","checkV3ApiUnitsReport":"Check Semrush V3 API units and report limits.","chooseMonth201201Through":"Choose a month from 2012-01 through the current month.","configureSeparateV3ApiKey":"Configure the separate Semrush V3 API key reference for keyword reports.","configureSeparateV3ApiKeyReferenceDomainReports":"Configure the separate Semrush V3 API key reference for domain reports.","configureV3KeyCampaignDiscovery":"Configure the Semrush V3 key for campaign discovery.","configureV3KeyPositionTracking":"Configure the Semrush V3 key for position tracking.","couldNotCompleteRequest":"Semrush could not complete this request.","couldNotReturnV3Report":"Semrush could not return the V3 report.","description":"Read keyword and backlink reports and manage Semrush projects using a V4 API key.","fields":{"v3ApiKeyRef":{"environmentCredential":{"label":"Semrush V3 API key"},"hint":"For domain overview and domain/URL/subfolder keyword reports and position tracking: My profile > API Keys > copy your Version 3 key into this project's Env. Leave empty if only using V4 reports/projects.","label":"V3 API key reference (optional)"}},"projectNotFoundNotAccessible":"The Semrush project was not found or is not accessible.","provideV3ApiKeyThrough":"Provide the Semrush V3 API key through its private Env reference.","provideValidV3ApiKey":"Provide a valid Semrush V3 API key.","rejectedV3ReportCheckInputs":"Semrush rejected the V3 report. Check its inputs and account access.","replaceSeparateV3KeyEnv":"Replace the separate Semrush V3 key in Env.","replaceV4KeyConnectAgain":"Replace the Semrush V4 key and connect again.","requestedPageExceedsProviderResult":"The requested Semrush page exceeds the provider's result window.","returnedIncompleteCsv":"Semrush returned incomplete CSV.","returnedInvalidTrackingJson":"Semrush returned invalid tracking JSON.","returnedMalformedCsv":"Semrush returned malformed CSV.","returnedOversizedV3Report":"Semrush returned an oversized V3 report.","returnedUnexpectedV3ReportColumns":"Semrush returned unexpected V3 report columns or rows.","trackingStartDateMustNot":"The tracking start date must not follow its end date.","useV4ApiKeyWithout":"Use the Semrush V4 API key without spaces or control characters."},"sentry":{"description":"Inspect and triage Sentry issues through scoped MCP tools.","fields":{"organizationSlug":{"hint":"Copy the organization slug from Sentry's URL. This connection is restricted to that organization.","label":"Sentry organization slug"},"projectSlug":{"hint":"Copy the slug from Project Settings to restrict access to one project. Leave empty for the selected organization.","label":"Sentry project slug (optional)"}},"scopes":{"eventWrite":{"label":"Write event data"},"orgRead":{"label":"Read organization data"},"projectWrite":{"label":"Write project data"},"teamWrite":{"label":"Write team data"}}},"sevdesk":{"apiKeyReferenceLabel":"API token reference","description":"Read sevdesk contact organizations and people with offset pagination."},"shared":{"apiKeyFormat":"Use the {provider} API key without spaces, control characters or colons.","differentRecord":"{provider} returned a different record.","invalidCallback":"Invalid {provider} callback.","invalidPermissionGrant":"{provider} returned an invalid permission grant.","invalidResponse":"{provider} returned an invalid response.","invalidTokenGrant":"{provider} returned an invalid token grant.","invalidTokenResponse":"{provider} returned an invalid token response.","invalidWebhookSignature":"Invalid {provider} webhook signature.","operationDenied":"{provider} denied this operation.","reconnectAccount":"Connect this {provider} account again.","requestLimitReached":"{provider}'s request limit was reached.","resourceUnavailable":"This {provider} resource is not available.","supplyCanonicalBase64NonemptyFile":"Supply canonical base64 for a nonempty file of at most 5 MiB.","supplyLeastChange":"Supply at least one change.","tooManyRecords":"{provider} returned more records than requested.","unexpectedPage":"{provider} returned an unexpected page.","unexpectedResponse":"{provider} returned an unexpected response."},"shopify":{"apiKeyReferenceHint":"Use env:SHOPIFY_ADMIN_TOKEN. A Storefront token, client secret or App Automation Token cannot be used here.","apiKeyReferenceLabel":"Admin API access token reference","assistantActions":{"claim":{"label":"Claim your store"},"connect":{"label":"Connect your Shopify store"},"discountCodesCreate":{"label":"Create discount code"},"discountCodesDelete":{"label":"Delete discount code"},"discountCodesUpdate":{"label":"Update discount code"},"enable":{"label":"Enable Shopify"},"priceRulesCreate":{"label":"Create price rule"},"priceRulesDelete":{"label":"Delete price rule"},"priceRulesUpdate":{"label":"Update price rule"},"productsCreate":{"label":"Create product"},"productsDelete":{"label":"Delete product"},"productsList":{"label":"Read products"},"productsUpdate":{"label":"Update product"},"variantsCreate":{"label":"Add product variant"},"variantsDelete":{"label":"Delete product variant"},"variantsUpdate":{"label":"Update product variant"}},"authenticationHint":"Client credentials require the app and store in the same Shopify organization. Connecting another merchant requires a separate Shopify installation flow.","authenticationLabels":{"apiKey":"Existing Admin API access token","oauth2":"App in your Shopify organization"},"description":"Connect a Shopify store and control what the assistant may change.","fields":{"shopDomain":{"hint":"Use the permanent myshopify.com address, including when your storefront uses a custom domain.","label":"Shopify store domain"}},"permissionsHint":"Match the scopes approved for the installed Shopify app. Write access includes reads. Assistant permission choices do not grant Shopify scopes or staff permissions.","rejectedProductChangeCheckProduct":"Shopify rejected the product change. Check the product values and permissions before retrying.","returnedMoreProductsRequested":"Shopify returned more products than requested.","scopes":{"readProducts":{"label":"Read products"},"writeProducts":{"label":"Create, update and delete products"}},"selectLeastProductDetailUpdate":"Select at least one product detail to update."},"slack":{"checkClientRegistrationCallback":"Check the Slack client registration and callback.","couldNotAuthorizeRequest":"Slack could not authorize this request.","description":"Connect as a Slack user or install a bot to read conversations and send messages.","fields":{"actor":{"hint":"User access acts as the person who connects. Bot access acts as the app in its installed workspace. Changing this choice removes permissions unavailable to that identity and requires reconnecting.","items":{"bot":{"title":"Installed bot"},"user":{"title":"Connected user"}},"label":"Act in Slack as"},"signingSecretRef":{"hint":"For incoming events and interactions: Basic Information → App Credentials → Signing Secret. Keep the value in application Env, separate from Client Secret.","label":"Signing secret reference (optional)"}},"requestFailedTryAgain":"The Slack request failed. Try again.","returnedTokenWrongIdentityInvalid":"Slack returned a token for the wrong identity or an invalid permission grant.","scopes":{"bookmarksRead":{"label":"List bookmarks"},"bookmarksWrite":{"label":"Create, edit, and remove bookmarks"},"callsRead":{"label":"View information about ongoing and past calls"},"callsWrite":{"label":"Start and manage calls in a workspace"},"canvasesRead":{"label":"Access contents of canvases created inside Slack."},"canvasesWrite":{"label":"Create, edit and remove canvases"},"channelsHistory":{"label":"View messages and other content in public channels you are in"},"channelsJoin":{"label":"Join public channels in a workspace"},"channelsManage":{"label":"Manage public channels that your Slack app has been added to and create new ones"},"channelsRead":{"label":"View basic information about public channels in a workspace"},"channelsWrite":{"label":"Manage a user's public channels and create new ones on a user's behalf"},"channelsWriteInvites":{"label":"Invite members to public channels"},"channelsWriteTopic":{"label":"Set the description of public channels"},"chatWrite":{"label":"Send messages"},"chatWriteCustomize":{"label":"Customize the content of messages sent by your Slack app"},"chatWritePublic":{"label":"Send messages to channels your Slack app isn't a member of"},"dndRead":{"label":"View Do Not Disturb settings for people in a workspace"},"dndWrite":{"label":"Edit a user's Do Not Disturb settings"},"emojiRead":{"label":"View custom emoji in a workspace"},"filesRead":{"label":"View files shared in channels and conversations that your Slack app has been added to"},"filesWrite":{"label":"Upload, edit, and delete files as your Slack app"},"groupsHistory":{"label":"View messages and other content in private channels that your Slack app has been added to"},"groupsRead":{"label":"View basic information about private channels that your Slack app has been added to"},"groupsWrite":{"label":"Manage private channels that your Slack app has been added to and create new ones"},"groupsWriteInvites":{"label":"Invite members to private channels"},"groupsWriteTopic":{"label":"Set the description of private channels"},"imHistory":{"label":"View messages and other content in direct messages you are in"},"imRead":{"label":"View basic information about direct messages you are in"},"imWrite":{"label":"Start direct messages with people"},"imWriteTopic":{"label":"Set the description in direct messages"},"listsRead":{"label":"View Slack Lists"},"listsWrite":{"label":"Create, edit, and delete Slack Lists"},"metadataMessageRead":{"label":"Allows your Slack app to read message metadata in channels that your Slack app has been added to"},"mpimHistory":{"label":"View messages and other content in group direct messages that your Slack app has been added to"},"mpimRead":{"label":"View basic information about group direct messages that your Slack app has been added to"},"mpimWrite":{"label":"Start group direct messages with people"},"mpimWriteTopic":{"label":"Set the description in group direct messages"},"pinsRead":{"label":"View pinned content in channels and conversations that your Slack app has been added to"},"pinsWrite":{"label":"Add and remove pinned messages and files"},"reactionsRead":{"label":"View emoji reactions"},"reactionsWrite":{"label":"Add and edit emoji reactions"},"remindersRead":{"label":"View reminders created by your Slack app"},"remindersWrite":{"label":"Add, remove, or mark reminders as complete"},"searchReadFiles":{"label":"Search a workspace's content in files"},"searchReadIm":{"label":"Search a workspace's content in direct messages"},"searchReadMpim":{"label":"Search a workspace's content in group direct messages"},"searchReadPrivate":{"label":"Search a workspace's content in private channels"},"searchReadPublic":{"label":"Search a workspace's content in public channels"},"searchReadUsers":{"label":"Search a workspace's users"},"teamRead":{"label":"View the name, email domain, and icon for workspaces your Slack app is connected to"},"usergroupsRead":{"label":"View user groups in a workspace"},"usergroupsWrite":{"label":"Create and manage user groups"},"usersProfileRead":{"label":"View profile details about people in a workspace"},"usersProfileWrite":{"label":"Edit a user's profile information and status"},"usersRead":{"label":"View people in a workspace"},"usersReadEmail":{"label":"View email addresses of people in a workspace"},"usersWrite":{"label":"Set presence for your Slack app"}}},"snowflake":{"description":"Query data and manage warehouses with a connected Snowflake role.","fields":{"accountUrl":{"hint":"Copy the account URL from Snowflake. Snowsight browser paths and organization-console URLs are not API addresses.","label":"Account URL"},"database":{"hint":"Exact case-sensitive database name for SQL execution; blank uses the user's default namespace. This is a default, not an access boundary: Snowflake role grants control access.","label":"Database (optional)"},"role":{"hint":"Use the exact name from SHOW ROLES, normally uppercase. Leave blank to use each connected user's default role. Shared accounts should use a dedicated role.","label":"Role"},"schema":{"hint":"Exact case-sensitive schema name for SQL execution; blank uses the user's default namespace.","label":"Schema (optional)"},"warehouse":{"hint":"Exact case-sensitive warehouse name for SQL execution. Blank uses the connected user's default. Queries may resume compute and incur Snowflake charges.","label":"Warehouse (optional)"}},"permissionsHint":"The role's Snowflake grants control access. SQL and warehouse actions use those grants and may incur compute charges. Connecting Snowflake does not sign users into your application.","rejectedStatementInspectQueryHistory":"Snowflake rejected the statement. Inspect query history with the authorized role.","responseExceeds16MibReduce":"Snowflake response exceeds 16 MiB. Reduce the query result or use a native streaming client.","returnedInvalidStatementResponse":"Snowflake returned an invalid statement response.","returnedUnexpectedDatabasePage":"Snowflake returned an unexpected database page.","scopes":{"refreshToken":{"label":"Keep access between visits (required)"},"refreshTokenOptional":{"label":"Keep access between visits"},"role":{"label":"Use role {role} (required)"}}},"storyblok":{"description":"Read space metadata and published or draft content in the space's region.","fields":{"region":{"hint":"Match the region selected when the Storyblok space was created.","items":{"ap":{"title":"Australia / APAC (AP)"},"ca":{"title":"Canada (CA)"},"cn":{"title":"China (CN)"},"eu":{"title":"European Union (EU)"},"us":{"title":"United States (US)"}},"label":"Space region"}}},"stripe":{"description":"Read the Stripe account's available and pending balances."},"supabase":{"description":"List projects through the Supabase Management API."},"tally":{"chooseNameStatusBlockChange":"Choose a name, status or block change.","description":"Create forms and retrieve submissions using your Tally account."},"telegram":{"apiKeyReferenceLabel":"Bot token reference","configureBotTokenReferencedEnvironment":"Configure a Telegram bot token in the referenced environment variable.","description":"Send bot messages and receive updates through application-owned polling."},"tiktok":{"clientIdHint":"Use the Client key from TikTok's app credentials, not its App ID.","clientIdLabel":"Client key","connectBasicProfilePermission":"Connect TikTok with basic profile permission.","connectPermissionRequiredOperation":"Connect TikTok with the permission required for this operation.","couldNotAuthorizeConnection":"TikTok could not authorize this connection.","couldNotCompleteRequest":"TikTok could not complete the request.","description":"Read a connected creator's profile and public video metadata.","permissionsHint":"Basic profile access is required for verification. Users can decline the other permissions during consent; the corresponding operations then stay unavailable.","returnedDuplicatePermissions":"TikTok returned duplicate permissions.","returnedTooManyVideos":"TikTok returned too many videos.","scopes":{"userInfoBasic":{"label":"Read basic profile information (required)"},"userInfoProfile":{"label":"Read extended profile information"},"userInfoStats":{"label":"Read user statistics"},"videoList":{"label":"Read published video metadata"}}},"twilio":{"apiKeyReferenceLabel":"API key secret reference","chooseSenderNumberMessagingService":"Choose one sender number or Messaging Service SID.","description":"Send SMS, initiate calls and read delivery/call status for the selected account and region.","fields":{"accountSid":{"hint":"Copy the SID of the account or subaccount whose calls this app may read.","label":"Account SID","placeholder":"AC followed by 32 hexadecimal characters"},"apiKeySid":{"hint":"Copy the API Key SID for this account and region. Store its secret separately.","label":"Standard API Key SID","placeholder":"SK followed by 32 hexadecimal characters"},"authTokenRef":{"hint":"For inbound messages, voice and delivery callbacks. Copy the account Auth Token from Twilio Console into private Env; this is NOT the API key secret.","label":"Callback Auth Token reference (optional)"},"region":{"hint":"Choose the region where this API key was created.","items":{"au1":{"title":"Australia (AU1)"},"ie1":{"title":"Ireland (IE1)"},"us1":{"title":"United States (US1)"}},"label":"Region"}},"supplyEitherCallControlUrl":"Supply either a call-control URL or inline TwiML."},"twitch":{"connectAgainPermissionEvent":"Connect Twitch again with permission for this event.","connectAgainPermissionNeededOperation":"Connect Twitch again with the permission needed for this operation.","description":"Connect Twitch accounts for stream discovery, chat, channel management, rewards, schedules and analytics.","enablingVacationRequiresTimezoneEnd":"Enabling vacation requires a timezone and an end after the start.","operationInvalidDestination":"This Twitch operation has an invalid destination.","returnedInvalidUnexpectedEventsubMessage":"Twitch returned an invalid or unexpected EventSub message.","returnedInvalidUserTokenValidation":"Twitch returned an invalid user-token validation.","returnedProfileDifferentUser":"Twitch returned a profile for a different user.","rewardLimitAmountRequired":"Supply {field} when enabling this reward limit.","scopes":{"analyticsReadExtensions":{"label":"Read extension analytics"},"analyticsReadGames":{"label":"Read game analytics"},"bitsRead":{"label":"Read Bits information"},"channelManageBroadcast":{"label":"Manage channel broadcast settings"},"channelManagePolls":{"label":"Create and manage channel polls"},"channelManagePredictions":{"label":"Create and manage channel predictions"},"channelManageRedemptions":{"label":"Manage channel point rewards and redemptions"},"channelManageSchedule":{"label":"Manage channel schedule"},"channelReadEditors":{"label":"Read channel editors"},"channelReadHypeTrain":{"label":"Read current hype train status"},"channelReadPolls":{"label":"Read channel polls"},"channelReadPredictions":{"label":"Read channel predictions"},"channelReadRedemptions":{"label":"Read channel point rewards and redemptions"},"channelReadSubscriptions":{"label":"Read your channel subscriptions"},"channelReadVips":{"label":"Read VIPs for your channels"},"clipsEdit":{"label":"Create clips"},"moderationRead":{"label":"Read moderation data"},"moderatorReadChatters":{"label":"Read chatters in a channel"},"moderatorReadFollowers":{"label":"Read followers for your channels"},"userReadEmail":{"label":"Read your email address"},"userReadFollows":{"label":"Read the channels you follow"},"userReadSubscriptions":{"label":"Check your subscription status"},"userWriteChat":{"label":"Send chat messages"}},"supplyBothReportDatesEnd":"Supply both report dates, with the end on or after the start.","supplyLeastBroadcastChange":"Supply at least one broadcast change.","supplyLeastRewardChange":"Supply at least one reward change.","supplyLeastScheduleChange":"Supply at least one schedule change.","supplyWinningOutcomeResolvingPrediction":"Supply a winning outcome only when resolving the prediction.","tokenBelongsDifferentApplication":"The Twitch token belongs to a different application.","tokenRequestDenied":"Twitch denied the token request."},"wave":{"accountChangedReloadApplyingEdit":"The account changed. Reload it before applying your edit.","accountingRecordNotAvailableSelected":"This accounting record is not available in the selected business. Check read access.","approveDocumentCheckEmailEligibility":"Approve the document and check Wave email eligibility before sending.","chooseAccountingFieldsUpdate":"Choose accounting fields to update.","chooseLeastCustomerFieldUpdate":"Choose at least one customer field to update.","chooseLeastDocumentFieldUpdate":"Choose at least one document field to update.","chooseLeastProductFieldUpdate":"Choose at least one product field to update.","couldNotCompleteQuery":"Wave could not complete this query.","customerNotAvailable":"This customer is not available in the selected business.","customerNotAvailableCheckAccess":"This customer is not available in the selected business. Check read access.","deniedTokenAccessCheckBusiness":"Wave denied token access. Check the business subscription and permissions.","description":"Connect project-owned Wave accounts for customers, products, invoices, estimates and accounting workflows.","documentNotAvailableSelectedBusiness":"This document is not available in the selected business. Check read access.","productAccountTaxNotAvailable":"This product, account or tax is not available in the selected business. Check read access.","rejectedAccountingChangeCheckValues":"Wave rejected the accounting change. Check the values and current record.","rejectedCustomerDetailsCheckSelected":"Wave rejected the customer details. Check the selected business and customer fields.","rejectedDocumentOperationCheckDetails":"Wave rejected the document operation. Check its details and current state.","rejectedProductDetailsCheckAccounts":"Wave rejected the product details. Check accounts, taxes and price.","rejectedTransactionReviewBalanceAccounts":"Wave rejected the transaction. Review its balance, accounts and details before submitting again.","returnedCustomerUnexpectedBusinessCheck":"Wave returned a customer from an unexpected business. Check the outcome before retrying.","returnedEstimateAnotherBusiness":"Wave returned an estimate from another business.","returnedUnexpectedAccountingRecord":"Wave returned an unexpected accounting record.","returnedUnexpectedAccountingRecordCheck":"Wave returned an unexpected accounting record. Check the outcome before retrying.","returnedUnexpectedBusiness":"Wave returned an unexpected business.","returnedUnexpectedCustomerCheckOutcome":"Wave returned an unexpected customer. Check the outcome before retrying.","returnedUnexpectedDocumentCheckOutcome":"Wave returned an unexpected document. Check the outcome before retrying.","returnedUnexpectedEstimate":"Wave returned an unexpected estimate.","returnedUnexpectedInvoice":"Wave returned an unexpected invoice.","returnedUnexpectedProductCheckOutcome":"Wave returned an unexpected product. Check the outcome before retrying.","scopes":{"account":{"label":"Full accounting account access"},"accountRead":{"label":"Read accounting accounts"},"accountWrite":{"label":"Edit accounting accounts"},"business":{"label":"Full business access"},"businessRead":{"label":"Read businesses"},"businessWrite":{"label":"Edit businesses"},"checkout":{"label":"Full checkout access"},"checkoutRead":{"label":"Read checkouts"},"customer":{"label":"Full customer access"},"customerRead":{"label":"Read customers"},"customerWrite":{"label":"Edit customers"},"estimate":{"label":"Full estimate access"},"estimateRead":{"label":"Read estimates"},"estimateSend":{"label":"Send estimates"},"estimateWrite":{"label":"Edit estimates"},"invoice":{"label":"Full invoice access"},"invoiceRead":{"label":"Read invoices"},"invoiceSend":{"label":"Send invoices"},"invoiceWrite":{"label":"Edit invoices"},"product":{"label":"Full product and service access"},"productRead":{"label":"Read products and services"},"productWrite":{"label":"Edit products and services"},"salesTax":{"label":"Full sales tax access"},"salesTaxRead":{"label":"Read sales taxes"},"salesTaxWrite":{"label":"Edit sales taxes"},"transaction":{"label":"Full transaction access"},"transactionWrite":{"label":"Create money transactions"},"user":{"label":"Full user access"},"userRead":{"label":"Read the connected user's profile"},"vendor":{"label":"Full vendor access"},"vendorRead":{"label":"Read vendors"},"vendorWrite":{"label":"Edit vendors"}},"transactionAccountCustomerTaxNot":"A transaction account, customer or tax is not available in the selected business. Check read access.","useMost100DistinctRelated":"Use at most 100 distinct related records per transaction."},"wix":{"appointmentSupplyServiceScheduleIds":"For an appointment, supply its service/schedule IDs, increasing local slot dates and IANA timezone. Courses cannot be rescheduled.","businessScheduleLimits":"Use native businessSchedule periods and specialHourPeriod arrays with at most 100 entries each.","chooseBusinessLocationId":"Choose the business location ID.","chooseServiceFieldUpdate":"Choose a service field to update.","chooseServiceTimeZoneIncreasing":"Choose the service, time zone and an increasing local date range.","chooseValidSiteId":"Choose a valid Wix Site ID.","classCourseSessionDurationsBelong":"Class/course session durations belong to their sessions, not service availability constraints.","classSupplySelectedEventidSlot":"For a class, supply only the selected eventId in slot.","configureSiteIdFirst":"Configure the Wix Site ID first.","depositRequiresAmountOnlinePayment":"A deposit requires its amount, online payment and no in-person payment.","describeCustomPaymentUp50":"Describe the custom payment in up to 50 characters.","description":"Use project-owned Wix account and site API access.","didNotReturnUpdatedFulfillment":"Wix did not return the updated fulfillment. Inspect the order before retrying.","doNotSendGeneratedService":"Do not send generated service identity fields or existing add-on groups when creating a service.","enableParticipantNotificationSendCancellation":"Enable participant notification to send a cancellation message.","enableParticipantNotificationSupplyingMessage":"Enable participant notification before supplying a message.","fields":{"accountId":{"hint":"Copy your account's ID from the API Keys Manager. A site ID is a different setting.","label":"Account ID"},"selectableSiteIds":{"hint":"Optional. Comma-separated sites the app may explicitly select. The app must still authorize each user's site access. Leave empty for a fixed-site connection.","label":"Selectable Site IDs","placeholder":"Site ID, Site ID"},"siteId":{"hint":"Required for site operations. Copy the ID after /dashboard/ in the intended Wix site dashboard URL.","label":"Site ID"}},"manualApprovalCannotUsePricing":"Manual approval cannot use pricing plans; online payment requires online booking.","onlineDepositPaymentsRequireFixed":"Online and deposit payments require fixed or varied pricing.","provideAppointmentSessionDurationsMinutes":"Provide appointment session durations in minutes.","provideContactDetailsCreationRequires":"Provide contact details; creation requires a name, email or phone.","provideDestinationMovingFutureSessions":"Provide a destination only when moving future sessions.","provideExplicitOnlineBookingSettings":"Provide explicit online-booking settings.","provideLocationAddress":"Provide the location address.","providePositiveDecimalPriceString":"Provide a positive decimal price string and three-letter currency code.","provideProductNameVisibilityBase":"Provide a product name, visibility or base-price change.","provideProductNameVisibilityChange":"Provide a product name or visibility change.","provideSelectedServiceSettingsInstead":"Provide the selected service settings instead of an empty object.","provideServiceTypeNameUp":"Provide a service type and name of up to 400 characters.","returnedAvailabilityDifferentServiceTime":"Wix returned availability for a different service, time or time zone.","returnedClassSlotDifferentService":"Wix returned a class slot for a different service.","returnedDifferentBookingCheckOperation":"Wix returned a different booking. Check the operation outcome before retrying.","returnedDifferentBookingServiceCheck":"Wix returned a different booking service. Check the outcome before retrying.","returnedDifferentBusinessLocation":"Wix returned a different business location.","returnedDifferentCmsCollection":"Wix returned a different CMS collection.","returnedDifferentCmsItemCollection":"Wix returned a different CMS item or collection. Check write outcomes before retrying.","returnedDifferentContactCheckOperation":"Wix returned a different contact. Check the operation outcome before retrying.","returnedDifferentEventSlotTime":"Wix returned a different event slot or time zone.","returnedDifferentFormSummary":"Wix returned a different form summary.","returnedDifferentOrder":"Wix returned a different order.","returnedDifferentProduct":"Wix returned a different product.","returnedFulfillmentsDifferentOrder":"Wix returned fulfillments for a different order.","returnedItemsDifferentCmsCollection":"Wix returned items from a different CMS collection.","returnedUnexpectedBookingRequestedId":"Wix returned an unexpected booking for the requested ID.","returnedVariantsDifferentService":"Wix returned variants for a different service.","selectDurationAddOnsSupplying":"Select a duration or add-ons before supplying customer choices.","selectLeastStaffResourceId":"Select at least one staff resource ID for the appointment service.","selectPersonOnlinePaymentIncluding":"Select in-person or online payment, including for a free service.","setAppointmentCapacity1Class":"Set appointment capacity to 1, or class/course capacity from 1 to 1000.","siteNotEnabledProjectSelectable":"This site is not enabled in the project's Selectable Site IDs.","supplyDetailsMatchingServiceLocation":"Supply the details matching each service location type.","supplyFulfillmentPropertiesWrite":"Supply the fulfillment properties to write.","supplyTrackingNumberProviderCustom":"Supply tracking number and provider; custom carriers also require a tracking URL.","useAppointmentDatesResourceLocation":"Use appointment dates/resource/location, a class event ID, or a course schedule ID, matching the selected service type.","useCursorLimitNextAvailability":"Use only cursor and limit for the next availability page.","useCursorLimitNextOrder":"Use only cursor and limit for the next order page.","useFixedVariedCustomNo":"Use FIXED, VARIED, CUSTOM or NO_FEE service payment settings.","useMost1000ParticipantsDistinct":"Use at most 1000 participants, distinct options per group and exactly one custom or duration value per choice.","useParticipantChoicesFixedParticipant":"Use participant choices or a fixed participant total, not both."},"wiz":{"accessSourceScanDenied":"Access to this source scan was denied.","auth0ScanningRequiresVerifiedCompatible":"Auth0 scanning requires a verified compatible Wiz runner.","authenticationHint":"A source scanner uses your workspace's service account. It does not sign app users in. The installed Wiz CLI performs authentication when a scan runs.","authenticationLabels":{"oauth2":"Wiz service account"},"authorisedSourceDirectoryUnavailable":"The authorised source directory is unavailable.","cliCouldNotStarted":"The Wiz CLI could not be started.","clientSecretReferenceInvalid":"The Wiz client-secret reference is invalid.","clientSecretReferenceUnavailable":"The Wiz client-secret reference is unavailable.","couldNotCompleteScanCheck":"Wiz could not complete the scan. Check the runner, policies and tenant access.","description":"Scan project source with your Wiz security policies.","didNotProduceReadableReport":"Wiz did not produce a readable report within the configured size limit.","fields":{"byPolicyHits":{"hint":"Filtering reported findings does not disable Wiz's policy verdict.","items":{"aUDIT":{"title":"Blocking or audit policy hits (AUDIT)"},"bLOCK":{"title":"Blocking policy hits (BLOCK)"},"dISABLED":{"title":"All findings (DISABLED)"}},"label":"Filter findings by policy hits"},"policies":{"hint":"Optional comma-separated policy names. Leave blank to use your Wiz tenant's defaults.","label":"CI/CD scan policies","placeholder":"Default vulnerabilities policy, Default IaC policy"},"tokenUrl":{"hint":"The current Wiz v1 runner supports Cognito. Auth0 configuration can be saved, but requires a verified compatible runner before scanning.","items":{"httpsAuthAppWizIoOauthToken":{"title":"Cognito (auth.app.wiz.io)"},"httpsAuthWizIoOauthToken":{"title":"Auth0 (auth.wiz.io)"}},"label":"Token URL"}},"hostMustSupplyAbsoluteSource":"The host must supply an absolute source directory and revision.","integrationNotConfigured":"This Wiz integration is not configured.","rejectedServiceAccountCredentials":"Wiz rejected the service-account credentials.","returnedUnsupportedInconsistentScanReport":"Wiz returned an unsupported or inconsistent scan report.","scanCancelled":"The Wiz scan was cancelled.","scanExceededTimeLimit":"The Wiz scan exceeded its time limit."},"woocommerce":{"apiKeyReferenceHint":"Store the consumer secret in Env. Use Read for lookups or Read/Write for changes; the key's WordPress user must also have permission for the requested operation.","apiKeyReferenceLabel":"Consumer secret reference","categoryCannotOwnParent":"A category cannot be its own parent.","categoryDeletionPermanentRequiresForce":"Category deletion is permanent and requires force=true.","chooseDifferentReassignmentUser":"Choose a different reassignment user.","chooseExplicitRefundRestockFlags":"Choose explicit refund/restock flags and decimal-string amounts.","chooseExplicitlyWhetherPermanentlyDelete":"Choose explicitly whether to permanently delete.","choosePeriodCompleteAscendingDate":"Choose a period or a complete ascending date range.","description":"Manage your WooCommerce catalogue, orders, customers, discounts and refunds, and read store reports.","fields":{"consumerKey":{"hint":"The key identifier from WooCommerce. Store its matching consumer secret separately.","label":"Consumer key"},"siteUrl":{"label":"Store URL"}},"invalidWebhookSignatureInputs":"Invalid WooCommerce webhook signature inputs.","percentageDiscountsCannotExceed100":"Percentage discounts cannot exceed 100.","productPricesMustDecimalStrings":"Product prices must be decimal strings.","resourceDoesNotSupportTrash":"This resource does not support trash; permanent deletion requires force=true.","restockingRequiresSelectedOrderLines":"Restocking requires selected order lines and positive quantities.","returnedDifferentCategory":"WooCommerce returned a different category.","returnedDifferentRefund":"WooCommerce returned a different refund.","returnedDifferentVariation":"WooCommerce returned a different variation.","supplyCategoryChanges":"Supply category changes.","supplyCouponChanges":"Supply coupon changes.","supplyCustomerChangesNonEmpty":"Supply customer changes and non-empty address objects.","supplyOrderChanges":"Supply order changes.","supplyProductChanges":"Supply product changes.","supplyVariationChanges":"Supply variation changes.","variationPricesMustDecimalStrings":"Variation prices must be decimal strings."},"wordpress":{"fields":{"siteUrl":{"hint":"Use the site address before /wp-json, keeping any installation subdirectory. The runtime sends credentials only to this configured origin."}}},"wordpressCom":{"description":"Connect a WordPress.com account to read its profile/sites and manage posts, pages and media.","scopes":{"batch":{"label":"Batch API requests"},"comments":{"label":"View and manage comments"},"media":{"label":"Manage media assets"},"posts":{"label":"View and manage posts"},"sites":{"label":"View site information and options"},"stats":{"label":"View site statistics"},"taxonomy":{"label":"Manage taxonomy terms"},"users":{"label":"View user information (required for verification)"}},"verifiedTokenBelongsDifferentApplication":"The verified token belongs to a different application."},"wordpressSelfHosted":{"apiKeyReferenceHint":"Use a WordPress Application Password for this user, stored in Env. The user's role controls access; this is separate from the user's login password.","apiKeyReferenceLabel":"Application password reference","description":"Manage WordPress posts, pages, media and users with a site-owned account.","fields":{"siteUrl":{"label":"Site URL"},"username":{"hint":"The WordPress login name that owns the Application Password.","label":"Username"}}},"workday":{"datesOrder":"The start date must not follow the end date.","description":"Read workers, organizations, time off and custom reports with each connected Workday user's permissions.","fields":{"authorizationEndpoint":{"hint":"Copy from View API Clients. The sign-in host usually differs from the API host.","label":"Authorization Endpoint"},"restApiEndpoint":{"hint":"Copy from View API Clients. Worker reads use Staffing v7 on this host and tenant.","label":"Workday REST API Endpoint"},"tokenEndpoint":{"hint":"Copy the Token Endpoint from the same Workday tenant.","label":"Token Endpoint"}},"permissionsHint":"Select the required functional areas in Workday: Staffing, Organizations and Roles, or Time Off and Leave. Each user's domain and report permissions still apply. Connecting Workday does not create your app's login.","supplyReportPromptOnceJoin":"Supply each report prompt once; join multi-instance WIDs with !.","useSmallerReportPromptRequest":"Use a smaller report prompt request."},"xTwitter":{"apiKeyReferenceHint":"Reference the app-only Bearer Token from X Developer Console. This token does not sign in an app user.","apiKeyReferenceLabel":"App-only bearer token reference","checkApplicationApiCreditsBilling":"Check this X application's API credits and billing access.","couldNotReturnCompleteRequested":"X could not return the complete requested data.","description":"Read public X profiles, posts and recent search with an application's bearer token.","passUserIdString":"Pass the X user ID as a string.","resourceNotFoundNotAvailable":"The X resource was not found or is not available.","useAppTokenWithoutSpaces":"Use the X app-only token without spaces, control characters or a Bearer prefix.","verificationFields":{"username":{"hint":"Enter a public X username without {'@'}. Connecting looks up this profile and can consume provider credits.","label":"Verification username"}}},"xero":{"attachmentResponsesLimited3Mib":"Xero attachment responses are limited to 3 MiB.","budgetDatesOrder":"The budget start date must not follow its end date.","description":"Manage contacts and invoices, record payments and read financial reports in connected organisations.","discountRatesApplySalesInvoices":"Discount rates apply only to sales invoices.","organisationNotConnectedAccount":"This Xero organisation is not connected to this account.","reportDatesOrder":"The report start date must not follow its end date.","returnedDifferentOrganisation":"Xero returned a different organisation.","returnedInvalidAttachmentResponse":"Xero returned an invalid attachment response.","returnedInvalidConnections":"Xero returned invalid connections.","scopes":{"accountingAttachments":{"label":"Read and manage attachments"},"accountingAttachmentsRead":{"label":"Read attachments"},"accountingBanktransactions":{"label":"Read and manage bank transactions"},"accountingBanktransactionsRead":{"label":"Read bank transactions"},"accountingBudgetsRead":{"label":"Read budgets"},"accountingContacts":{"label":"Read and manage contacts"},"accountingContactsRead":{"label":"Read contacts"},"accountingInvoices":{"label":"Read and manage invoices and bills"},"accountingInvoicesRead":{"label":"Read invoices and bills"},"accountingManualjournals":{"label":"Read and manage manual journals"},"accountingManualjournalsRead":{"label":"Read manual journals"},"accountingPayments":{"label":"Read and manage payments"},"accountingPaymentsRead":{"label":"Read payments"},"accountingReportsAgedRead":{"label":"Read aged receivables and payables reports"},"accountingReportsBalancesheetRead":{"label":"Read balance sheet reports"},"accountingReportsBanksummaryRead":{"label":"Read bank summary reports"},"accountingReportsBudgetsummaryRead":{"label":"Read budget summary reports"},"accountingReportsExecutivesummaryRead":{"label":"Read executive summary reports"},"accountingReportsProfitandlossRead":{"label":"Read profit and loss reports"},"accountingReportsTaxreportsRead":{"label":"Read GST and BAS reports"},"accountingReportsTrialbalanceRead":{"label":"Read trial balance reports"},"accountingSettings":{"label":"Read and manage organisation settings"},"accountingSettingsRead":{"label":"Read organisation settings"},"offlineAccess":{"label":"Keep access when the user is away"}},"supplyBankTransactionFieldChange":"Supply a bank transaction field to change.","supplyCanonicalBase64NonemptyAttachment":"Supply canonical base64 for a nonempty attachment of at most 3 MiB.","supplyContactFieldChange":"Supply a contact field to change.","supplyInvoiceFieldChange":"Supply an invoice field to change.","supplyJournalFieldChange":"Supply a journal field to change."},"zoho":{"regions":{"au":{"title":"Australia (.com.au)"},"ca":{"title":"Canada (.ca)"},"cn":{"title":"China (.com.cn)"},"eu":{"title":"Europe (.eu)"},"in":{"title":"India (.in)"},"jp":{"title":"Japan (.jp)"},"sa":{"title":"Saudi Arabia (.sa)"},"us":{"title":"United States (.com)"}},"returnedTokenDifferentDataCenter":"Zoho returned a token for a different data center or environment."},"zohoBooks":{"chooseOrganisationIdOrganizationsList":"Choose an organisation ID from organizations.list or configure one for this integration.","configuredOrganisationNotActiveAccessible":"The configured Books organisation is not active and accessible to this account.","description":"Discover accessible organisations and read pages of contacts and invoices.","fields":{"organizationId":{"hint":"Set one organisation for this integration, or leave empty and let the app choose from the connected account's organisations.","label":"Organization ID (optional)"},"region":{"hint":"Choose the data center containing the Books account. Canada uses accounts.zohocloud.ca for OAuth.","label":"Data center"}},"integrationConfiguredDifferentOrganisation":"This integration is configured for a different organisation.","resourceNotAvailable":"This Books resource is not available.","returnedAmbiguousPagination":"Zoho Books returned ambiguous pagination.","returnedInvalidOrganisations":"Zoho Books returned invalid organisations.","scopes":{"billsAll":{"label":"Full access to bills"},"contactsAll":{"label":"Full access to contacts"},"creditnotesAll":{"label":"Full access to credit notes"},"customerpaymentsAll":{"label":"Full access to customer payments"},"estimatesAll":{"label":"Full access to estimates"},"expensesAll":{"label":"Full access to expenses"},"invoicesAll":{"label":"Full access to invoices"},"projectsAll":{"label":"Full access to projects"},"purchaseordersAll":{"label":"Full access to purchase orders"},"salesordersAll":{"label":"Full access to sales orders"},"zohoBooksContactsREAD":{"label":"Read contacts"},"zohoBooksInvoicesREAD":{"label":"Read invoices"},"zohoBooksSettingsREAD":{"label":"Read organisations and settings"}}},"zohoCrm":{"connectAgainPermissionsNeededOperation":"Connect again with the CRM permissions needed for this operation.","description":"Read the connected CRM user and pages of leads, contacts, accounts and deals.","fields":{"environment":{"hint":"Choose the same environment and organisation during Zoho consent. Tokens cannot be moved between environments.","items":{"developer":{"title":"Developer"},"production":{"title":"Production"},"sandbox":{"title":"Sandbox"}},"label":"CRM environment"},"region":{"hint":"Choose the data center containing your CRM account. Canada uses accounts.zohocloud.ca for OAuth.","label":"Data center"}},"resourceNotAvailable":"This CRM resource is not available.","scopes":{"zohoCRMModulesALL":{"label":"Full access to all CRM modules"},"zohoCRMModulesAccountsALL":{"label":"Full account access"},"zohoCRMModulesAccountsREAD":{"label":"Read accounts"},"zohoCRMModulesContactsALL":{"label":"Full contact access"},"zohoCRMModulesContactsREAD":{"label":"Read contacts"},"zohoCRMModulesDealsALL":{"label":"Full deal access"},"zohoCRMModulesDealsREAD":{"label":"Read deals"},"zohoCRMModulesLeadsALL":{"label":"Full lead access"},"zohoCRMModulesLeadsREAD":{"label":"Read leads"},"zohoCRMModulesREAD":{"label":"Read all CRM modules"},"zohoCRMUsersALL":{"label":"Full CRM user access"},"zohoCRMUsersREAD":{"label":"Read the connected CRM user"}},"useEitherPageNumberPage":"Use either a page number or a page token."}}}`);var en_default$4={jskit:jskit$4};var jskit$3={"connectors":{"configuration":{"accountModeUnsupported":`This provider does not support this account mode.`,"apiKeyRegistration":`API keys do not use an OAuth registration.`,"assistantActionUndeclared":`This provider does not declare this assistant action.`,"clientAuthenticationUnsupported":`This provider does not support this client authentication method.`,"clientId":`Check this provider's client identifier.`,"confidentialClientRequired":`Client credentials require a confidential client.`,"credentialModeUnsupported":`This provider configuration does not support this credential mode.`,"duplicateScope":`Select each permission only once.`,"invalid":`Invalid configuration.`,"invalidJson":`Enter valid JSON.`,"noCredentials":`This mode does not use credentials.`,"oauthFlowUnsupported":`This provider does not support this OAuth flow.`,"otherCredentialModeField":`This field belongs to another credential mode.`,"otherCredentialModeSetting":`This setting belongs to another credential mode.`,"providerSettings":`Check this provider's settings.`,"providerUnregistered":`Install and register this provider before using it.`,"refreshTokenClientCredentials":`Client credentials do not use a refresh token.`,"refreshTokenOAuthOnly":`Only an OAuth connection can start from a refresh token.`,"refreshTokenSharedOnly":`Only a shared connection can start from a refresh token in Env.`,"registrationSecret":`Use the registration's secret reference.`,"registrationUndefined":`Select a registration defined in this file.`,"requiredScopes":`Include this provider's required permissions.`,"schemaVersionUnsupported":`Use numeric schemaVersion 1; other versions require an explicit migration.`,"scopeRequired":`Select at least one permission.`,"scopeUnsupported":`A selected permission is not supported by this provider configuration.`,"serviceAccountPerUser":`A service account cannot connect as each app user.`,"serviceAccountRegistration":`Service-account credentials do not use a browser OAuth registration.`,"stableName":`Use a stable lowercase name containing letters, digits and hyphens.`,"valueRequired":`This value is required.`},"connection":{"ambiguousPermissionGrant":`The provider did not return an unambiguous permission grant.`,"apiKeyBindingMissingInvalid":`The API key binding is missing or invalid.`,"assistantActionDisabled":`This assistant action is disabled.`,"authorizationAttemptInvalidExpired":`The authorization attempt is invalid or has expired.`,"authorizationCallbackInvalid":`The authorization callback is invalid.`,"callbackDoesNotMatchRegistration":`The callback does not match this registration.`,"callbackUrlDoesNotMeet":`The callback URL does not meet this provider's requirements.`,"checkOperationInputValues":`Check the operation's input values.`,"configureHttpsCallbackUrlLocal":`Configure an HTTPS callback URL, or a local development callback.`,"connectAccountAgain":`Connect this account again.`,"connectAgainPermissionRequiredOperation":`Connect again with the permission required for this operation.`,"connectAgainPermissionRequiredVerification":`Connect again with the permission required for verification.`,"connectionNotAllowed":`You cannot use this connection.`,"envRefreshTokenRejected":`The refresh token in Env no longer works; replace that Env value.`,"envSeeded":`This connection comes from an Env value; unlink or replace that value instead.`,"integrationNotConfigured":`This integration is not configured.`,"operationCancelled":`The operation was cancelled.`,"operationRequiresDifferentMethod":`This operation requires a different connection method.`,"operationRequiresPermissionAbsentApplication":`This operation requires a permission absent from the application's configuration.`,"providerClientIdNotConfigured":`The provider client ID is not configured.`,"providerDeniedOperation":`The provider denied this operation.`,"providerDoesNotDeclareAssistant":`This provider does not declare this assistant action.`,"providerDoesNotImplementService":`This provider does not implement service-account authorization.`,"providerInvalidCredentialPath":`This provider has an invalid credential path.`,"providerNonPkceFlowRequires":`This provider's non-PKCE flow requires a confidential client.`,"providerOperationInvalidDestination":`The provider operation has an invalid destination.`,"providerOperationNotAvailable":`This provider operation is not available.`,"providerRequestFailedTryAgain":`The provider request failed. Try again.`,"providerRequestLimitReached":`The provider's request limit was reached.`,"providerRequiresJsonRequestBody":`This provider requires a JSON request body.`,"providerReturnedInvalidAccountLabel":`The provider returned an invalid account label.`,"providerReturnedInvalidPermissionGrant":`The provider returned an invalid permission grant.`,"providerReturnedInvalidServiceAccount":`The provider returned an invalid service-account token.`,"providerReturnedUnexpectedResponse":`The provider returned an unexpected response.`,"refreshTokenBindingMissingInvalid":`The refresh token binding is missing or invalid.`,"requiredEnvironmentBindingMissing":`A required environment binding is missing.`,"requiredRegistrationBindingMissing":`A required registration binding is missing.`,"runtimeDoesNotYetSupport":`This runtime does not yet support the selected credential mode.`,"selectClientCredentialsConnectService":`Select client credentials to connect a service account.`,"selectMatchingCredentialModeVerify":`Select the matching credential mode to verify this connection.`,"selectServiceAccountCredentialsVerify":`Select service-account credentials to verify this connection.`,"serviceAccountCredentialBindingMissing":`The service-account credential binding is missing or invalid.`,"serviceAccountsConnectWithoutBrowser":`Service accounts connect without browser consent.`,"serviceAccountsDoNotUse":`Service accounts do not use an authorization callback.`,"verificationScopeAbsent":`Connection verification requires a permission absent from the application's configuration.`}},"errors":{"connector_approval_required":`Approve this assistant action before continuing.`,"connector_consent_denied":`Account access was declined.`,"connector_credentials_unavailable":`Stored credentials could not be opened.`,"connector_provider_timeout":`The provider request timed out. Try again.`,"connector_storage_invalid":`Connection state could not be read safely.`,"integration_configuration_invalid":`Integration configuration is invalid.`}};var en_default$3={jskit:jskit$3};var jskit$2={"http":{"request":{"failedWithStatus":`Request failed with status {status}.`,"networkFailed":`Network request failed.`}},"errors":{"jsonapi_request_body_invalid":`JSON:API request body must contain a resource document.`,"jsonapi_request_type_mismatch":`JSON:API resource type must be {type}.`}};var en_default$2={jskit:jskit$2};var jskit$1={"errors":{"payment_plan_unknown":`Select a published payment plan.`,"payment_readiness_invalid":`App readiness checks must return bounded status and safe explanatory text.`,"payment_forbidden":`You cannot manage this billable account.`,"payment_operation_conflict":`The pending payment operation changed.`,"payment_request_invalid":`Supply a stable checkout request identifier.`,"payment_subscription_exists":`Manage the existing subscription through billing instead of starting another checkout.`,"payment_history_unavailable":`Billing history could not be loaded. Check provider access and retry.`,"payment_customer_missing":`Create a billing account first.`,"payment_reconciliation_required":`Provider inspection did not resolve this request.`,"payment_customer_conflict":`This provider customer is already bound to a different billable subject.`,"payment_catalogue_pending":`Another catalogue request needs resolution.`,"payment_catalogue_uncertain":`Catalogue publication stopped. Inspect the pending provider request before retrying; completed items are preserved.`,"payment_balance_limit":`Credit balance exceeds the supported integer range.`,"payment_feature_required":`Your subscription does not include this feature.`,"payment_insufficient_credits":`Not enough credits for this action.`,"payment_debit_missing":`No debit exists for this reference.`,"payment_customer_unbound":`Bind this provider customer before processing its events.`},"payments":{"scope":{"readinessMismatch":`Readiness returned a different payment account or environment.`,"catalogueMismatch":`Catalogue scope does not match its configured environment.`,"merchantMismatch":`The payment scope does not match this environment's merchant configuration.`},"operation":{"unfinished":`Inspect the unfinished provider request before retrying.`,"mayHaveSucceeded":`Inspect this account's provider activity before retrying; the request may have succeeded.`},"input":{"billingEmail":`Supply the authenticated billing contact's email.`,"historyPage":`Select billing subscriptions or transactions and a valid page cursor.`,"historyCollection":`Select a billing history collection.`,"recoveryObjectId":`Supply the exact provider object ID to recover.`,"reference":`Use a nonempty business reference of at most 150 characters.`,"creditQuantity":`Use a positive integer credit quantity, at most one billion.`,"timestamp":`Use an integer UTC timestamp in milliseconds.`},"reference":{"otherPlan":`The checkout request already selected another plan.`,"differentInputs":`This business reference was already used with different inputs.`},"provider":{"checkAccount":`Check the {provider} account, price mapping and subscription shape.`,"unsupportedEvent":`The event is not a supported subscription payment for this customer.`,"objectIdMissing":`The provider did not return an object ID.`,"subscriptionBinding":`Check the provider subscription and logical price binding.`,"renewalBinding":`Check the renewal's logical price binding.`},"webhook":{"rawBodyRequired":`Supply the unmodified webhook request bytes.`,"verificationFailed":`{provider} webhook verification failed.`},"configuration":{"invalid":`Check the application's payment configuration.`,"taxCategoryUnpublishable":`Set the application's Paddle product tax category before publishing.`,"sharedConnectionRequired":`Select a shared Stripe or Paddle connection with a backend API-key Env reference for {environment}.`,"paddleEnvironment":`Select a Paddle connection configured for {environment}.`,"paddleTaxCategory":`Choose the Paddle tax category for the products this app sells.`,"paddleClientToken":`Set the Env reference for this environment's Paddle public client token.`},"catalogue":{"reviewFirst":`Review the current catalogue and resolve provider drift or unfinished requests first.`,"publicationChanged":`Another publication changed the catalogue; review again.`,"planChanged":`This plan changed; review again.`,"productChanged":`This product changed; review again.`,"priceChanged":`This price changed; review again.`,"pendingCatalogueRequestChanged":`The pending catalogue request changed.`,"recoveryReviewChanged":`The recovery review changed. Inspect the current pending operation first.`,"pendingRequestChanged":`The pending request changed.`,"objectMismatch":`The provider object does not match the pending operation.`}}};var en_default$1={jskit:jskit$1};var jskit={"uploads":{"file":{"invalid":`Upload is invalid.`,"tooLarge":`{label} file is too large. Maximum allowed size is {maxMb}MB.`,"empty":`{label} file is empty.`,"typeNotAllowed":`{label} must be one of: {types}.`,"tooMany":`{label} upload allows only one file.`,"required":`{label} file is required.`,"fieldNotAllowed":`{label} field "{field}" is not allowed.`}}};var en_default={jskit};function normalizeComponentId(value){const id=String(value||``).trim();if(!id)throw new TypeError(`Client component id is required.`);return id}function createClientComponentRegistry(){const components=new Map;function register(id,component){const componentId=normalizeComponentId(id);if(component==null)throw new TypeError(`Client component "${componentId}" is required.`);if(components.has(componentId))throw new Error(`Client component "${componentId}" is duplicated.`);components.set(componentId,component);return api}function has(id){return components.has(normalizeComponentId(id))}function get(id){const componentId=normalizeComponentId(id);if(!components.has(componentId))throw new Error(`Client component "${componentId}" is not registered.`);return components.get(componentId)}function ids(){return Object.freeze([...components.keys()].sort())}const api=Object.freeze({register,has,get,ids});return api}function normalizePackageMetadataUiRoutes(value){const routeEntries=Array.isArray(value)?value:[];const normalizedRoutes=[];for(const routeEntry of routeEntries){if(!isRecord$1(routeEntry))continue;try{normalizedRoutes.push(Object.freeze(JSON.parse(JSON.stringify(routeEntry))))}catch{}}return Object.freeze(normalizedRoutes)}function normalizePackageMetadataClientProviders(value){const entries=Array.isArray(value)?value:[];const providers=[];for(const entry of entries){if(!isRecord$1(entry))continue;const exportName=String(entry.export||``).trim();if(!exportName)continue;providers.push(Object.freeze({export:exportName,entrypoint:String(entry.entrypoint||``).trim()}))}return Object.freeze(providers)}function normalizePackageId(value){return String(value||``).trim()}function toRouteSnapshot(route){const metaJskit=isRecord$1(route?.meta?.jskit)?route.meta.jskit:{};return Object.freeze({id:String(route?.id||``).trim(),name:String(route?.name||``).trim(),path:String(route?.path||``).trim(),scope:String(route?.scope||``).trim(),surface:String(route?.surface||``).trim(),metaScope:String(metaJskit.scope||``).trim(),metaSurface:String(metaJskit.surface||``).trim()})}function isRouteComponent(value){if(typeof value===`function`)return true;return Boolean(value&&typeof value===`object`&&!Array.isArray(value))}function normalizeRoute(route,{packageId,index}){if(!isRecord$1(route))throw new TypeError(`Client route #${index} from ${packageId} must be an object.`);const id=String(route.id||``).trim();const path=String(route.path||``).trim();if(!id)throw new Error(`Client route #${index} from ${packageId} requires id.`);if(!path||!path.startsWith(`/`)||path.startsWith(`//`))throw new Error(`Client route "${id}" from ${packageId} must use an absolute path.`);if(!isRouteComponent(route.component))throw new Error(`Client route "${id}" from ${packageId} requires component.`);const scope=String(route.scope||`surface`).trim().toLowerCase();if(scope!==`global`&&scope!==`surface`)throw new Error(`Client route "${id}" from ${packageId} has invalid scope "${scope}".`);const surface=String(route.surface||``).trim().toLowerCase();const baseMeta=isRecord$1(route.meta)?route.meta:{};const baseMetaJskit=isRecord$1(baseMeta.jskit)?baseMeta.jskit:{};return Object.freeze({...route,id,path,scope,...surface?{surface}:{},meta:{...baseMeta,jskit:{...baseMetaJskit,packageId,routeId:id,scope,...surface?{surface}:{}}}})}function normalizeRouteList(routes,{packageId}){return Object.freeze((Array.isArray(routes)?routes:[]).map((route,index)=>normalizeRoute(route,{packageId,index:index+1})))}function toVueRouteRecord(route){const nextMeta=isRecord$1(route.meta)?{...route.meta}:void 0;const routeRecord={path:route.path,component:route.component,...route.name?{name:route.name}:{},...route.props!==void 0?{props:route.props}:{},...route.redirect!==void 0?{redirect:route.redirect}:{},...route.children!==void 0?{children:route.children}:{},...nextMeta?{meta:nextMeta}:{}};return Object.freeze(routeRecord)}function registerClientModuleRoutes({packageId,routes=[],router,surfaceRuntime,surfaceMode,seenRoutePaths,seenRouteNames,logger=null,source=`module`,packageMetadataRouteDeclarations=null}={}){const normalizedPackageId=normalizePackageId(packageId);if(!normalizedPackageId)throw new TypeError(`registerClientModuleRoutes requires packageId.`);if(!router||typeof router.addRoute!==`function`)throw new TypeError(`registerClientModuleRoutes requires router.addRoute().`);if(!surfaceRuntime||typeof surfaceRuntime!==`object`)throw new TypeError(`registerClientModuleRoutes requires surfaceRuntime.`);const normalizedRoutes=normalizeRouteList(routes,{packageId:normalizedPackageId});assertRoutesDeclaredInPackageMetadata({packageId:normalizedPackageId,source,normalizedRoutes,packageMetadataRouteDeclarations});const activeRoutes=filterRoutesBySurface(normalizedRoutes,{surfaceRuntime,surfaceMode});const log=createStructuredLogger(logger);if(log.isDebugEnabled)log.debug({packageId:normalizedPackageId,source,surfaceMode:String(surfaceMode||``).trim(),declaredRoutes:normalizedRoutes.map(toRouteSnapshot),activeRoutes:activeRoutes.map(toRouteSnapshot)},`Client route registration analysis.`);const declaredPaths=normalizedRoutes.map(route=>route.path);const activePaths=activeRoutes.map(route=>route.path);let registeredCount=0;for(const route of activeRoutes){const normalizedPath=String(route.path||``).trim();if(seenRoutePaths.has(normalizedPath))throw new Error(`Client route path "${normalizedPath}" is duplicated (package ${normalizedPackageId}).`);const normalizedName=String(route.name||``).trim();if(normalizedName){if(seenRouteNames.has(normalizedName))throw new Error(`Client route name "${normalizedName}" is duplicated (package ${normalizedPackageId}).`);seenRouteNames.add(normalizedName)}seenRoutePaths.add(normalizedPath);router.addRoute(toVueRouteRecord(route));if(log.isDebugEnabled)log.debug({packageId:normalizedPackageId,source,route:toRouteSnapshot(route)},`Added client route to router.`);registeredCount+=1}return Object.freeze({packageId:normalizedPackageId,source,declaredCount:normalizedRoutes.length,registeredCount,declaredPaths:Object.freeze(declaredPaths),activePaths:Object.freeze(activePaths)})}function resolvePackageMetadataProviders(moduleNamespace,packageId,packageMetadataClientProviders=[]){const providers=[];const seenProviderIds=new Set;for(const providerDeclaration of packageMetadataClientProviders){const exportName=String(providerDeclaration?.export||``).trim();if(!exportName)continue;const providerValue=moduleNamespace?.[exportName];let provider=null;try{provider=defineProvider(providerValue)}catch(error){throw new TypeError(`Client module ${packageId} packageMetadata provider export "${exportName}" must be a capability provider: ${error.message}`,{cause:error})}const providerId=provider.id;if(seenProviderIds.has(providerId))continue;seenProviderIds.add(providerId);providers.push(provider)}return providers}function resolveModuleProviders(moduleNamespace,packageId,packageMetadataClientProviders=[]){if(!isRecord$1(moduleNamespace))return[];return resolvePackageMetadataProviders(moduleNamespace,packageId,packageMetadataClientProviders)}function buildPackageMetadataRouteDeclarationIndex({packageId,packageMetadataUiRoutes=[]}={}){const normalizedPackageId=normalizePackageId(packageId);const packageMetadataRoutes=normalizePackageMetadataUiRoutes(packageMetadataUiRoutes);const byId=new Map;for(const packageMetadataRoute of packageMetadataRoutes){const routeId=String(packageMetadataRoute.id||``).trim();const routePath=String(packageMetadataRoute.path||``).trim();const routeScope=String(packageMetadataRoute.scope||`surface`).trim().toLowerCase();if(!routeId||!routePath)continue;if(byId.has(routeId)){const existingRoute=byId.get(routeId);if(existingRoute.path!==routePath||existingRoute.scope!==routeScope)throw new Error(`PackageMetadata ui routes for ${normalizedPackageId} define duplicate id "${routeId}" with conflicting declarations.`);continue}byId.set(routeId,Object.freeze({id:routeId,path:routePath,scope:routeScope}))}return Object.freeze({byId})}function assertRoutesDeclaredInPackageMetadata({packageId,source,normalizedRoutes=[],packageMetadataRouteDeclarations=null}={}){if(String(source||``).trim()!==`clientRoutes`)return;const byId=packageMetadataRouteDeclarations?.byId instanceof Map?packageMetadataRouteDeclarations.byId:new Map;const normalizedPackageId=normalizePackageId(packageId);for(const route of normalizedRoutes){const routeId=String(route?.id||``).trim();const routePath=String(route?.path||``).trim();if(String(route?.scope||`surface`).trim().toLowerCase()!==`global`)continue;const declaredRoute=byId.get(routeId);if(!declaredRoute)throw new Error(`Global client route "${routeId}" from ${normalizedPackageId} (${source}) must be declared in metadata.ui.routes (id "${routeId}", path "${routePath}") with scope:"global" and autoRegister:false.`);if(String(declaredRoute.path||``).trim()!==routePath)throw new Error(`Global client route "${routeId}" from ${normalizedPackageId} (${source}) path "${routePath}" does not match packageMetadata metadata.ui.routes path "${declaredRoute.path}".`);if(String(declaredRoute.scope||``).trim().toLowerCase()!==`global`)throw new Error(`Global client route "${routeId}" from ${normalizedPackageId} (${source}) must be declared with scope:"global" in metadata.ui.routes.`)}}function resolvePackageMetadataClientRoutes({packageId,packageMetadataUiRoutes=[],routeComponents={},logger=null}={}){const normalizedPackageId=normalizePackageId(packageId);const packageMetadataRoutes=normalizePackageMetadataUiRoutes(packageMetadataUiRoutes);if(packageMetadataRoutes.length<1)return Object.freeze([]);if(!isRecord$1(routeComponents))throw new TypeError(`Client module ${normalizedPackageId} declares packageMetadata ui routes but does not export a routeComponents map.`);const log=createStructuredLogger(logger);const routes=[];const skippedRoutes=[];for(const packageMetadataRoute of packageMetadataRoutes){const routeId=String(packageMetadataRoute.id||``).trim();const routePath=String(packageMetadataRoute.path||``).trim();if(!(packageMetadataRoute.autoRegister!==false)){skippedRoutes.push(Object.freeze({id:routeId,path:routePath,reason:`autoRegister=false`}));continue}if(!routeId||!routePath)throw new Error(`PackageMetadata ui route from ${normalizedPackageId} requires id and path when autoRegister is enabled.`);const componentKey=String(packageMetadataRoute.componentKey||``).trim();if(!componentKey)throw new Error(`PackageMetadata ui route "${routeId}" from ${normalizedPackageId} requires componentKey when autoRegister is enabled.`);const routeComponent=routeComponents[componentKey];if(!isRouteComponent(routeComponent))throw new Error(`PackageMetadata ui route "${routeId}" from ${normalizedPackageId} references unknown routeComponents key "${componentKey}".`);const scope=String(packageMetadataRoute.scope||`surface`).trim().toLowerCase();const surface=String(packageMetadataRoute.surface||``).trim().toLowerCase();const guard=isRecord$1(packageMetadataRoute.guard)?{...packageMetadataRoute.guard}:{};const baseMeta=isRecord$1(packageMetadataRoute.meta)?{...packageMetadataRoute.meta}:{};const baseMetaJskit=isRecord$1(baseMeta.jskit)?{...baseMeta.jskit}:{};routes.push(Object.freeze({id:routeId,path:routePath,scope,...surface?{surface}:{},...String(packageMetadataRoute.name||``).trim()?{name:String(packageMetadataRoute.name||``).trim()}:{},component:routeComponent,meta:{...baseMeta,...Object.keys(guard).length>0?{guard}:{},jskit:{...baseMetaJskit,packageId:normalizedPackageId,routeId,scope,componentKey,source:`packageMetadata.ui.routes`,...surface?{surface}:{}}}}))}log.debug({packageId:normalizedPackageId,packageMetadataRouteCount:packageMetadataRoutes.length,autoRegisterRouteCount:routes.length,skippedRoutes},`Processed packageMetadata ui routes.`);return Object.freeze(routes)}function normalizeClientModuleEntries(clientModules){if(!Array.isArray(clientModules))return[];return clientModules.map(entry=>{const packageId=normalizePackageId(entry?.packageId);const moduleNamespace=isRecord$1(entry?.module)?entry.module:null;if(!packageId||!moduleNamespace)return null;return Object.freeze({packageId,module:moduleNamespace,packageMetadataUiRoutes:normalizePackageMetadataUiRoutes(entry?.packageMetadataUiRoutes),packageMetadataClientProviders:normalizePackageMetadataClientProviders(entry?.packageMetadataClientProviders)})}).filter(Boolean).sort((left,right)=>left.packageId.localeCompare(right.packageId))}function createClientRuntime({profile=`client`,providers=[],app,pinia=null,queryClient=null,router,env,logger,surfaceRuntime,surfaceMode}={}){const components=createClientComponentRegistry();const runtime=createCapabilityRuntime({profile,providers,inputs:{"client.vue":app||null,"client.router":router||null,"client.pinia":pinia,"client.query":queryClient,"client.env":Object.freeze({...isRecord$1(env)?env:{}}),"client.surface":surfaceRuntime||null,"client.surface-mode":String(surfaceMode||``).trim(),"client.logger":logger,"client.components":components}});return Object.freeze({runtime,components})}async function bootClientModules({clientModules=[],app,pinia=null,queryClient=null,router,surfaceRuntime,surfaceMode,env,logger=console}={}){if(!router||typeof router.addRoute!==`function`)throw new TypeError(`bootClientModules requires router.addRoute().`);if(!surfaceRuntime||typeof surfaceRuntime.normalizeSurfaceMode!==`function`)throw new TypeError(`bootClientModules requires surfaceRuntime.normalizeSurfaceMode().`);const log=createStructuredLogger(logger);const moduleEntries=normalizeClientModuleEntries(clientModules);const providers=[];const seenProviderIds=new Set;log.debug({surfaceMode:String(surfaceMode||``).trim(),normalizedSurfaceMode:String(surfaceRuntime.normalizeSurfaceMode(surfaceMode)||``).trim(),moduleCount:moduleEntries.length,modules:moduleEntries.map(entry=>entry.packageId)},`Starting JSKIT client module bootstrap.`);for(const entry of moduleEntries){const moduleProviders=resolveModuleProviders(entry.module,entry.packageId,entry.packageMetadataClientProviders);log.debug({packageId:entry.packageId,providerExports:moduleProviders.map(provider=>provider.id),hasClientRoutes:Array.isArray(entry.module.clientRoutes)&&entry.module.clientRoutes.length>0},`Discovered client module capabilities.`);for(const provider of moduleProviders){const providerId=provider.id;if(seenProviderIds.has(providerId))throw new Error(`Client provider id "${providerId}" is duplicated.`);seenProviderIds.add(providerId);providers.push(provider)}}const clientRuntime=createClientRuntime({profile:String(surfaceRuntime.normalizeSurfaceMode(surfaceMode)||`client`),providers,app,pinia,queryClient,router,env,logger:log,surfaceRuntime,surfaceMode});await clientRuntime.runtime.start();const seenRoutePaths=new Set;const seenRouteNames=new Set;const routeResults=[];const registerRoutesForEntry=(routeList,packageId,source=`module`,packageMetadataRouteDeclarations=null)=>{if(!routeList||routeList.length===0)return null;const result=registerClientModuleRoutes({packageId,routes:routeList,router,surfaceRuntime,surfaceMode,seenRoutePaths,seenRouteNames,logger:log,source,packageMetadataRouteDeclarations});log.debug({packageId,source,declaredPaths:result.declaredPaths,activePaths:result.activePaths,registeredCount:result.registeredCount},`Registered client module routes.`);if(log.isDebugEnabled)log.debug({packageId,source,routerRoutes:summarizeRouterRoutes(router)},`Router route table after client route registration.`);routeResults.push(result);return result};for(const entry of moduleEntries){const packageMetadataRouteDeclarations=buildPackageMetadataRouteDeclarationIndex({packageId:entry.packageId,packageMetadataUiRoutes:entry.packageMetadataUiRoutes});registerRoutesForEntry(resolvePackageMetadataClientRoutes({packageId:entry.packageId,packageMetadataUiRoutes:entry.packageMetadataUiRoutes,routeComponents:entry.module.routeComponents,logger:log}),entry.packageId,`packageMetadata.ui.routes`,packageMetadataRouteDeclarations);registerRoutesForEntry(Array.isArray(entry.module.clientRoutes)?entry.module.clientRoutes:[],entry.packageId,`clientRoutes`,packageMetadataRouteDeclarations)}const registeredRouteCount=routeResults.reduce((sum,result)=>sum+result.registeredCount,0);if(moduleEntries.length>0){log.debug({modules:moduleEntries.map(entry=>entry.packageId),providerCount:providers.length,routeCount:registeredRouteCount},`Booted JSKIT client modules.`);if(log.isDebugEnabled)log.debug({routerRoutes:summarizeRouterRoutes(router),currentPath:typeof window!==`undefined`?String(window.location?.pathname||``):``},`JSKIT client bootstrap final route table.`)}return Object.freeze({runtime:clientRuntime.runtime,components:clientRuntime.components,modules:Object.freeze(moduleEntries.map(entry=>entry.packageId)),providerCount:providers.length,routeResults:Object.freeze(routeResults),routeCount:registeredRouteCount})}[en_default$12,en_default$9,en_default$10,en_default$5,en_default$4,en_default$3,en_default$7,en_default$2,en_default$11,en_default$1,en_default$6,en_default$8,en_default].forEach(registerJskitMessages);var installedClientModules=Object.freeze([{packageId:`@jskit-ai/assistant-core`,module:client_exports$9,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]},{packageId:`@jskit-ai/assistant-runtime`,module:client_exports$8,packageMetadataUiRoutes:[],packageMetadataClientProviders:[{"export":`AssistantClientProvider`,"entrypoint":`src/client/providers/AssistantClientProvider.js`}]},{packageId:`@jskit-ai/assistant-voice`,module:client_exports$11,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]},{packageId:`@jskit-ai/connectors-web`,module:client_exports$6,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]},{packageId:`@jskit-ai/http-runtime`,module:client_exports$12,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]},{packageId:`@jskit-ai/http-web`,module:client_exports$5,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]},{packageId:`@jskit-ai/realtime`,module:RealtimeClientProvider_exports,packageMetadataUiRoutes:[],packageMetadataClientProviders:[{"export":`RealtimeClientProvider`,"entrypoint":`src/client/RealtimeClientProvider.js`}]},{packageId:`@jskit-ai/shell-web`,module:client_exports$4,packageMetadataUiRoutes:[],packageMetadataClientProviders:[{"export":`ShellWebClientProvider`,"entrypoint":`src/client/providers/ShellWebClientProvider.js`}]},{packageId:`@jskit-ai/uploads-runtime`,module:client_exports$3,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]},{packageId:`@local/main`,module:client_exports$2,packageMetadataUiRoutes:[],packageMetadataClientProviders:[{"export":`MainClientProvider`,"entrypoint":`src/client/providers/MainClientProvider.js`}]},{packageId:`@local/vibe64-accounts`,module:client_exports$13,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]},{packageId:`@local/vibe64-colleague`,module:client_exports$7,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]},{packageId:`@local/vibe64-database-tools`,module:client_exports$1,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]},{packageId:`@local/vibe64-system-graph`,module:client_exports,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]},{packageId:`@local/vibe64-voice`,module:client_exports$10,packageMetadataUiRoutes:[],packageMetadataClientProviders:[]}]);async function bootInstalledClientModules(context={}){return bootClientModules({...context,clientModules:installedClientModules})}var surfaceAccessPolicies={};surfaceAccessPolicies.public={};var config={};config.tenancyMode=`none`;config.realtimeClient={options:{transports:[`websocket`]}};config.surfaceModeAll=`all`;config.surfaceDefaultId=`app`;config.webRootAllowed=`yes`;config.surfaceAccessPolicies=surfaceAccessPolicies;config.mobile={enabled:false,strategy:``,appId:``,appName:``,assetMode:`bundled`,devServerUrl:``,apiBaseUrl:``,auth:{callbackPath:`/auth/login`,customScheme:``,appLinkDomains:[]},android:{packageName:``,minSdk:26,targetSdk:35,versionCode:1,versionName:`1.0.0`}};config.surfaceDefinitions={};config.surfaceDefinitions.app={id:`app`,label:`Sessions`,pagesRoot:`app`,enabled:true,requiresAuth:false,requiresWorkspace:false,accessPolicyId:`public`,origin:``};config.assistantSurfaces={app:{settingsSurfaceId:`app`,configScope:`global`}};var BROWSER_LIFECYCLE_WEBSOCKET_PATH=`/api/studio/browser-lifecycle/ws`;var BROWSER_LIFECYCLE_DISCONNECTED_EVENT=`vibe64:browser-lifecycle-disconnected`;function noopLifecycleConnection(){return{close(){}}}function createBrowserLifecycleDisconnectedEvent(browserWindow,detail={}){const CustomEventCtor=browserWindow?.CustomEvent||globalThis.CustomEvent;if(typeof CustomEventCtor===`function`)return new CustomEventCtor(BROWSER_LIFECYCLE_DISCONNECTED_EVENT,{detail});const EventCtor=browserWindow?.Event||globalThis.Event;if(typeof EventCtor===`function`){const event=new EventCtor(BROWSER_LIFECYCLE_DISCONNECTED_EVENT);event.detail=detail;return event}return{detail,type:BROWSER_LIFECYCLE_DISCONNECTED_EVENT}}function connectBrowserLifecycleSocket({browserWindow=typeof window!==`undefined`?window:null,WebSocketCtor=typeof WebSocket!==`undefined`?WebSocket:null}={}){if(!browserWindow||typeof WebSocketCtor!==`function`)return noopLifecycleConnection();let socket=null;let connected=false;let closeBrowserOnDisconnect=false;let pageUnloading=false;let stopped=false;const markPageUnloading=()=>{pageUnloading=true};const removeUnloadListeners=()=>{browserWindow.removeEventListener?.(`beforeunload`,markPageUnloading);browserWindow.removeEventListener?.(`pagehide`,markPageUnloading)};const closeWindowIfServerDisconnected=()=>{removeUnloadListeners();if(connected&&!stopped&&!pageUnloading)browserWindow.dispatchEvent?.(createBrowserLifecycleDisconnectedEvent(browserWindow,{closeBrowserOnDisconnect}));if(connected&&closeBrowserOnDisconnect&&!stopped&&!pageUnloading)browserWindow.close?.()};const receiveLifecycleState=event=>{try{const message=JSON.parse(String(event?.data||``));if(message?.type===`browser-lifecycle-state`)closeBrowserOnDisconnect=message.closeBrowserOnDisconnect===true}catch{}};browserWindow.addEventListener?.(`beforeunload`,markPageUnloading);browserWindow.addEventListener?.(`pagehide`,markPageUnloading);try{socket=new WebSocketCtor(resolveWebSocketUrl$1(BROWSER_LIFECYCLE_WEBSOCKET_PATH,browserWindow))}catch{removeUnloadListeners();return noopLifecycleConnection()}socket.addEventListener?.(`open`,()=>{connected=true});socket.addEventListener?.(`message`,receiveLifecycleState);socket.addEventListener?.(`close`,closeWindowIfServerDisconnected);return{close(){stopped=true;removeUnloadListeners();socket?.close?.()}}}function bootBrowserLifecycle(options={}){return connectBrowserLifecycleSocket(options)}var APPEARANCE_STORAGE_KEY=`vibe64.appearance`;var APPEARANCE_CHOICES=Object.freeze([`light`,`dark`,`system`]);function readAppearance(){const value=readLocalStorageJson(APPEARANCE_STORAGE_KEY,`light`);return APPEARANCE_CHOICES.includes(value)?value:`light`}function writeAppearance(value){if(APPEARANCE_CHOICES.includes(value))writeLocalStorageJson(APPEARANCE_STORAGE_KEY,value)}configureHttpWebClient({csrf:{enabled:false},resolveRequestUrl(url){return resolveStudioRequestUrl(url)}});bootBrowserLifecycle();var surfaceRuntime=createSurfaceRuntime({allMode:config.surfaceModeAll,surfaces:config.surfaceDefinitions,defaultSurfaceId:config.surfaceDefaultId});var surfaceMode=surfaceRuntime.normalizeSurfaceMode(void 0);var{router,fallbackRoute}=createSurfaceShellRouter({createRouter,history:createWebHistory(),routes,surfaceRuntime,surfaceMode,notFoundComponent:_sfc_main$23,guard:{surfaceDefinitions:config.surfaceDefinitions,defaultSurfaceId:config.surfaceDefaultId,webRootAllowed:config.webRootAllowed}});var vuetify=createVuetify({theme:{defaultTheme:readAppearance(),themes:{light:{colors:{"surface-variant":`#EEF3FA`,"on-surface-variant":`#1F2937`,warning:`#725C0C`,"on-warning":`#FFFFFF`,"warning-container":`#F5F0E3`,"on-warning-container":`#252117`}},dark:{colors:{background:`#111318`,surface:`#1A1C21`,"surface-bright":`#37393F`,"surface-light":`#2A2D33`,"surface-variant":`#243342`,"on-surface-variant":`#EDF4FC`,warning:`#DFC477`,"on-warning":`#3D2F00`,"warning-container":`#353126`,"on-warning-container":`#EAE1CF`}}}},defaults:{VCard:{rounded:`lg`},VAlert:{rounded:`lg`}},icons:{defaultSet:`mdi`,aliases,sets:{mdi}}});var pinia=createPinia();var queryClient=new QueryClient({defaultOptions:{queries:{refetchOnWindowFocus:false,refetchOnReconnect:true,retry:shouldRetryTransientQueryFailure,retryDelay:transientQueryRetryDelay}}});bootstrapClientShellApp({createApp,rootComponent:_sfc_main$24,appConfig:config,appPlugins:[pinia,[VueQueryPlugin,{queryClient}],vuetify],pinia,queryClient,router,bootClientModules:bootInstalledClientModules,surfaceRuntime,surfaceMode,env:{"BASE_URL":`/`,"DEV":false,"MODE":`production`,"PROD":true,"SSR":false},fallbackRoute}).catch(error=>{console.error(`Failed to bootstrap client app.`,error);const status=document.getElementById(`startup-status`);if(status)status.textContent=`Vibe64 could not open. Reload the page to try again.`});export{VIBE64_LEARNING_MODE_NOTE as $,latestAssistantMessageAwaitingUserReply as A,useVoiceLauncher as B,readRefOrGetterValue as C,useAssistantConversation as D,useVibe64AssistantCatalog as E,temporaryConversationId as F,VMain as G,VTabs as H,useVibe64Voice as I,VCombobox as J,VContainer as K,VoiceConversationHost_default as L,createProjectVoiceBinding as M,mainConversationId as N,useAssistantConversationFactory as O,mainConversationTarget as P,STEP_STATUS_LABELS as Q,VoiceConversationSettings_default as R,Vibe64SessionAssistantMenu_default as S,requestVibe64AccountConnectionsDialog as T,VTab as U,VoiceAvatar_default as V,VSnackbar as W,VAppBar as X,VBottomSheet as Y,usePageActivity as Z,GithubMarkdown_default as _,client_exports as a,reviewRunNote as at,useVibe64LearningCourses as b,_sfc_main$12 as c,projectDisplayName as ct,createEnglishProviderTexts as d,VIBE64_LEARNING_MODE_PROJECT_CODE as et,getProviderClientAuthenticationMethods as f,Vibe64LearningMarkdown_default as g,validateIntegrationConfiguration as h,en_default$5 as i,revealCurrentStep as it,VIBE64_TRAINING_LEARNER_CHANGED_EVENT as j,createAssistantApi as k,useShellLayoutState as l,projectSubtitle as lt,secretReference as m,writeAppearance as n,checkNote as nt,client_exports$1 as o,withoutLesson as ot,getProviderScopes as p,VTable as q,en_default$4 as r,lessonShownIn as rt,VIBE64_ACTIVE_SESSION_NAV_KEY as s,isPracticeProjectSlug as st,readAppearance as t,VIBE64_LEARNING_ROUTES as tt,IntegrationConfigurationFields_default as u,RouterView as ut,F as v,onVibe64AccountConnectionsDialogRequested as w,useVibe64Learning as x,courseProgress as y,VoiceConversationControls_default as z};
|