@vc-shell/framework 2.5.0-pr321.e2a103c → 2.5.0-pr322.fbf6d33
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/dist/ai-agent/index.js +2 -2
- package/dist/chunks/{VcAiAgentPanel.vue_vue_type_script_setup_true_lang-BYfxqcoO.js → VcAiAgentPanel.vue_vue_type_script_setup_true_lang-Cfv6Pk05.js} +11 -9
- package/dist/chunks/VcAiAgentPanel.vue_vue_type_script_setup_true_lang-Cfv6Pk05.js.map +1 -0
- package/dist/chunks/{VcScheduler.vue_vue_type_script_setup_true_lang-BoLdzHCP.js → VcScheduler.vue_vue_type_script_setup_true_lang-DbDPPJ_9.js} +1 -1
- package/dist/chunks/{VcScheduler.vue_vue_type_script_setup_true_lang-BoLdzHCP.js.map → VcScheduler.vue_vue_type_script_setup_true_lang-DbDPPJ_9.js.map} +1 -1
- package/dist/chunks/{index-CbnJj8ZU.js → index-rImb-nAa.js} +1 -1
- package/dist/chunks/{index-CbnJj8ZU.js.map → index-rImb-nAa.js.map} +1 -1
- package/dist/core/composables/useBladeNavigationAdapter/index.d.ts.map +1 -1
- package/dist/framework.js +1236 -1240
- package/dist/framework.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/ui/index.js +1 -1
- package/package.json +4 -4
- package/dist/chunks/VcAiAgentPanel.vue_vue_type_script_setup_true_lang-BYfxqcoO.js.map +0 -1
package/dist/ai-agent/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a, u as e } from "../chunks/index-
|
|
2
|
-
import { A as s, D as T, E as n, H as o, _ as D, c as S, u as i } from "../chunks/VcAiAgentPanel.vue_vue_type_script_setup_true_lang-
|
|
1
|
+
import { a, u as e } from "../chunks/index-rImb-nAa.js";
|
|
2
|
+
import { A as s, D as T, E as n, H as o, _ as D, c as S, u as i } from "../chunks/VcAiAgentPanel.vue_vue_type_script_setup_true_lang-Cfv6Pk05.js";
|
|
3
3
|
import "../chunks/VcAiAgentPanel.vue_vue_type_style_index_0_lang-0llGMIi1.js";
|
|
4
4
|
export {
|
|
5
5
|
s as AI_AGENT_URL_ENV_KEY,
|
|
@@ -683,15 +683,17 @@ function kn(e, i, a = tt) {
|
|
|
683
683
|
C.get(r.id)?.(), p(r.id);
|
|
684
684
|
}
|
|
685
685
|
async function T(n) {
|
|
686
|
-
if (s.value?.name === n.name) return
|
|
686
|
+
if (s.value?.name === n.name) return;
|
|
687
687
|
const c = e.getBlade(n.name);
|
|
688
688
|
if (!c)
|
|
689
689
|
throw new Error(`[BladeStack] Blade '${n.name}' not found in registry`);
|
|
690
|
-
if (i && c.permissions && !i(c.permissions))
|
|
691
|
-
|
|
690
|
+
if (i && c.permissions && !i(c.permissions)) {
|
|
691
|
+
console.warn(`[BladeStack] Access denied to workspace '${n.name}'`);
|
|
692
|
+
return;
|
|
693
|
+
}
|
|
692
694
|
_([...t.value]);
|
|
693
695
|
const h = Pt(n, b);
|
|
694
|
-
|
|
696
|
+
t.value = [h], n.onOpen && l.set(h.id, n.onOpen), n.onClose && C.set(h.id, n.onClose), n.onOpen?.();
|
|
695
697
|
}
|
|
696
698
|
async function M(n) {
|
|
697
699
|
if (!e.getBlade(n.name))
|
|
@@ -711,16 +713,16 @@ function kn(e, i, a = tt) {
|
|
|
711
713
|
}
|
|
712
714
|
async function D(n) {
|
|
713
715
|
const r = t.value.findIndex((S) => S.id === n);
|
|
714
|
-
if (r === -1 || r === 0) return
|
|
716
|
+
if (r === -1 || r === 0) return !1;
|
|
715
717
|
const c = t.value.slice(r);
|
|
716
|
-
if (await v(c)) return
|
|
718
|
+
if (await v(c)) return !0;
|
|
717
719
|
_(c), t.value = t.value.slice(0, r);
|
|
718
720
|
const w = t.value.length - 1;
|
|
719
721
|
if (w > 0 && !t.value[w].visible) {
|
|
720
722
|
const S = [...t.value];
|
|
721
723
|
S[w] = { ...S[w], visible: !0 }, t.value = S;
|
|
722
724
|
}
|
|
723
|
-
return
|
|
725
|
+
return !1;
|
|
724
726
|
}
|
|
725
727
|
async function x(n) {
|
|
726
728
|
const r = g.value;
|
|
@@ -768,7 +770,7 @@ function kn(e, i, a = tt) {
|
|
|
768
770
|
g.value?.url && a[n]();
|
|
769
771
|
}
|
|
770
772
|
async function Q(n) {
|
|
771
|
-
await T(n)
|
|
773
|
+
await T(n), $("push");
|
|
772
774
|
}
|
|
773
775
|
async function pe(n) {
|
|
774
776
|
await M(n), $("push");
|
|
@@ -781,7 +783,7 @@ function kn(e, i, a = tt) {
|
|
|
781
783
|
}
|
|
782
784
|
async function ve(n) {
|
|
783
785
|
const r = await D(n);
|
|
784
|
-
return r
|
|
786
|
+
return r || a.replace(), r;
|
|
785
787
|
}
|
|
786
788
|
async function Ce(n) {
|
|
787
789
|
await j(n), a.replace();
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"VcAiAgentPanel.vue_vue_type_script_setup_true_lang-Cfv6Pk05.js","sources":["../../core/plugins/ai-agent/constants.ts","../../core/plugins/ai-agent/services/panel-controller.ts","../../core/plugins/ai-agent/services/context-manager.ts","../../core/plugins/ai-agent/services/message-transport.ts","../../core/plugins/ai-agent/services/ai-agent-service.ts","../../core/composables/useKeyboardShortcuts/hotkey.ts","../../core/composables/useKeyboardShortcuts/format.ts","../../core/composables/useKeyboardShortcuts/match.ts","../../core/composables/useKeyboardShortcuts/index.ts","../../core/blade-navigation/singletons.ts","../../core/composables/useBlade/index.ts","../../core/blade-navigation/descriptorFactory.ts","../../core/blade-navigation/useBladeStack.ts","../../core/plugins/ai-agent/composables/useAiAgent.ts","../../core/plugins/ai-agent/components/_internal/VcVirtoOzLogo.vue","../../ui/components/organisms/vc-blade/_internal/toolbar/ShortcutKbd.vue","../../core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue","../../core/plugins/ai-agent/components/_internal/VcAiAgentLoader.vue","../../core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue","../../core/plugins/ai-agent/components/VcAiAgentPanel.vue"],"sourcesContent":["import type { IAiAgentConfig, ISuggestion } from \"@core/plugins/ai-agent/types\";\n\n/**\n * Default configuration for AI agent panel\n */\nexport const DEFAULT_AI_AGENT_CONFIG: IAiAgentConfig = {\n url: \"\",\n title: \"Virto OZ\",\n width: 362,\n expandedWidth: 500,\n // Secure by default: no origins trusted until the embedder configures them.\n allowedOrigins: [],\n};\n\n/**\n * Environment variable name for AI agent URL\n */\nexport const AI_AGENT_URL_ENV_KEY = \"APP_AI_AGENT_URL\";\n\n/**\n * Message types for Shell -> Chat communication\n */\nexport const SHELL_TO_CHAT_MESSAGE_TYPES = {\n INIT_CONTEXT: \"INIT_CONTEXT\",\n UPDATE_CONTEXT: \"UPDATE_CONTEXT\",\n} as const;\n\n/**\n * Message types for Chat -> Shell communication\n */\nexport const CHAT_TO_SHELL_MESSAGE_TYPES = {\n CHAT_READY: \"CHAT_READY\",\n NAVIGATE_TO_APP: \"NAVIGATE_TO_APP\",\n EXPAND_IN_CHAT: \"EXPAND_IN_CHAT\",\n SHOW_MORE: \"SHOW_MORE\",\n} as const;\n\n/**\n * Message types for Embedded App -> Host Shell communication\n */\nexport const EMBEDDED_TO_HOST_MESSAGE_TYPES = {\n EMBEDDED_APP_READY: \"EMBEDDED_APP_READY\",\n AI_TOGGLE_PANEL: \"AI_TOGGLE_PANEL\",\n AI_CONTEXT_UPDATE: \"AI_CONTEXT_UPDATE\",\n AI_CONTEXT_CLEAR: \"AI_CONTEXT_CLEAR\",\n} as const;\n\n/**\n * Message types for Host Shell -> Embedded App communication\n */\nexport const HOST_TO_EMBEDDED_MESSAGE_TYPES = {\n EMBEDDED_HOST_READY: \"EMBEDDED_HOST_READY\",\n AI_CHAT_MESSAGE: \"AI_CHAT_MESSAGE\",\n} as const;\n\n/**\n * Default suggestions when no custom suggestions provided\n */\nexport const DEFAULT_SUGGESTIONS: ISuggestion[] = [\n {\n id: \"generate-report\",\n title: \"Generate a report\",\n icon: \"analytics-01\",\n iconColor: \"#57AB79\",\n prompt: \"Generate a report\",\n },\n {\n id: \"find-sales\",\n title: \"Find sales statistics\",\n icon: \"progress-02\",\n iconColor: \"#FFBA35\",\n prompt: \"Find sales statistics\",\n },\n {\n id: \"translate\",\n title: \"Translate description\",\n icon: \"translation\",\n iconColor: \"#FF4A4A\",\n prompt: \"Translate description\",\n },\n {\n id: \"top-sales\",\n title: \"Find top sales report\",\n icon: \"analytics-up\",\n iconColor: \"#319ED4\",\n prompt: \"Find top sales report\",\n },\n];\n\n/**\n * Default toolbar button ID for AI agent\n */\nexport const AI_AGENT_TOOLBAR_BUTTON_ID = \"ai-agent-toggle\";\n\n/**\n * Default toolbar button icon\n */\nexport const AI_AGENT_TOOLBAR_BUTTON_ICON = \"lucide-sparkles\";\n\n/**\n * Default toolbar button title\n */\nexport const AI_AGENT_TOOLBAR_BUTTON_TITLE = \"AI Assistant\";\n","import { ref, computed, type Ref, type ComputedRef } from \"vue\";\nimport { createLogger } from \"@core/utilities\";\nimport type { AiAgentPanelState } from \"@core/plugins/ai-agent/types\";\n\nconst logger = createLogger(\"ai-agent-panel\");\n\nexport interface PanelController {\n panelState: Ref<AiAgentPanelState>;\n isOpen: ComputedRef<boolean>;\n isExpanded: ComputedRef<boolean>;\n isInitialized: Ref<boolean>;\n open: () => void;\n close: () => void;\n toggle: () => void;\n expand: () => void;\n collapse: () => void;\n resetInitialized: () => void;\n}\n\nexport function createPanelController(): PanelController {\n const panelState = ref<AiAgentPanelState>(\"closed\");\n const isInitialized = ref(false);\n\n const isOpen = computed(() => panelState.value !== \"closed\");\n const isExpanded = computed(() => panelState.value === \"expanded\");\n\n const open = () => {\n if (panelState.value === \"closed\") {\n panelState.value = \"open\";\n logger.debug(\"Panel opened\");\n }\n };\n\n const close = () => {\n panelState.value = \"closed\";\n isInitialized.value = false;\n logger.debug(\"Panel closed, reset initialized state\");\n };\n\n const toggle = () => {\n if (panelState.value === \"closed\") {\n open();\n } else {\n close();\n }\n };\n\n const expand = () => {\n if (panelState.value === \"open\") {\n panelState.value = \"expanded\";\n logger.debug(\"Panel expanded\");\n }\n };\n\n const collapse = () => {\n if (panelState.value === \"expanded\") {\n panelState.value = \"open\";\n logger.debug(\"Panel collapsed\");\n }\n };\n\n return {\n panelState,\n isOpen,\n isExpanded,\n isInitialized,\n open,\n close,\n toggle,\n expand,\n collapse,\n resetInitialized: () => {\n isInitialized.value = false;\n },\n };\n}\n","import { ref, computed, type ComputedRef } from \"vue\";\nimport { cloneDeep } from \"lodash-es\";\nimport { createLogger } from \"@core/utilities\";\nimport type {\n AiAgentContextType,\n IAiAgentBladeContext,\n IAiAgentUserContext,\n IChatBladeContext,\n IInitContextPayload,\n IUpdateContextPayload,\n ISuggestion,\n} from \"@core/plugins/ai-agent/types\";\n\nconst logger = createLogger(\"ai-agent-context\");\n\nexport interface ContextManagerOptions {\n userGetter: () => IAiAgentUserContext | undefined;\n bladeGetter: () => IAiAgentBladeContext | null;\n localeGetter: () => string;\n tokenGetter?: () => Promise<string | null>;\n}\n\nexport interface ContextManager {\n contextItems: ComputedRef<Record<string, unknown>[]>;\n contextType: ComputedRef<AiAgentContextType>;\n contextSuggestions: ComputedRef<ISuggestion[] | undefined>;\n totalItemsCount: ComputedRef<number>;\n setContextData: (\n items: Record<string, unknown>[],\n type: AiAgentContextType,\n suggestions?: ISuggestion[],\n bladeId?: string,\n ) => { cleared: boolean };\n buildInitPayload: () => Promise<IInitContextPayload>;\n buildUpdatePayload: () => Promise<IUpdateContextPayload>;\n}\n\nfunction toBladeContext(blade: IAiAgentBladeContext | null): IChatBladeContext {\n if (!blade) {\n return { id: \"unknown\", name: \"unknown\", title: \"Unknown\" };\n }\n return {\n id: blade.id,\n name: blade.name,\n title: blade.title || blade.name,\n param: blade.param,\n };\n}\n\nexport function createContextManager(options: ContextManagerOptions): ContextManager {\n const { userGetter, bladeGetter, localeGetter, tokenGetter } = options;\n\n const bladeContexts = ref<\n Map<string, { items: Record<string, unknown>[]; type: AiAgentContextType; suggestions?: ISuggestion[] }>\n >(new Map());\n\n const getActiveBladeContext = () => {\n const activeBlade = bladeGetter();\n if (!activeBlade)\n return {\n items: [] as Record<string, unknown>[],\n type: \"list\" as AiAgentContextType,\n suggestions: undefined,\n };\n return (\n bladeContexts.value.get(activeBlade.id) ?? {\n items: [] as Record<string, unknown>[],\n type: \"list\" as AiAgentContextType,\n suggestions: undefined,\n }\n );\n };\n\n const contextItems = computed(() => getActiveBladeContext().items);\n const contextType = computed(() => getActiveBladeContext().type);\n const contextSuggestions = computed(() => getActiveBladeContext().suggestions);\n const totalItemsCount = computed(() => contextItems.value.length);\n\n const setContextData = (\n items: Record<string, unknown>[],\n type: AiAgentContextType,\n suggestions?: ISuggestion[],\n bladeId?: string,\n ): { cleared: boolean } => {\n // Always use bladeGetter().id as the Map key — it returns blade.type.name (e.g. \"offerslist\"),\n // which matches getActiveBladeContext() lookup. bladeId from BladeDescriptorKey is a runtime\n // unique ID (e.g. \"blade_1_abc\") that would cause a key mismatch.\n const targetBladeId = bladeGetter()?.id || bladeId;\n if (!targetBladeId) {\n logger.warn(\"Cannot set context data: no blade id available\");\n return { cleared: false };\n }\n\n if (items.length === 0 && !suggestions) {\n bladeContexts.value.delete(targetBladeId);\n logger.debug(`Context cleared for blade: ${targetBladeId}`);\n return { cleared: true };\n } else {\n bladeContexts.value.set(targetBladeId, { items, type, suggestions });\n logger.debug(`Context set for blade: ${targetBladeId}, items: ${items.length}, type: ${type}`);\n return { cleared: false };\n }\n };\n\n const buildInitPayload = async (): Promise<IInitContextPayload> => {\n const accessToken = tokenGetter ? ((await tokenGetter()) ?? undefined) : undefined;\n return {\n userId: userGetter()?.id || \"\",\n locale: localeGetter(),\n blade: toBladeContext(bladeGetter()),\n contextType: contextType.value,\n items: cloneDeep(contextItems.value),\n suggestions: contextSuggestions.value ? cloneDeep(contextSuggestions.value) : undefined,\n accessToken,\n };\n };\n\n const buildUpdatePayload = async (): Promise<IUpdateContextPayload> => {\n const accessToken = tokenGetter ? ((await tokenGetter()) ?? undefined) : undefined;\n return {\n blade: toBladeContext(bladeGetter()),\n contextType: contextType.value,\n items: cloneDeep(contextItems.value),\n suggestions: contextSuggestions.value ? cloneDeep(contextSuggestions.value) : undefined,\n locale: localeGetter(),\n accessToken,\n };\n };\n\n return {\n contextItems,\n contextType,\n contextSuggestions,\n totalItemsCount,\n setContextData,\n buildInitPayload,\n buildUpdatePayload,\n };\n}\n","import { ref, shallowRef, type ShallowRef } from \"vue\";\nimport { createLogger } from \"@core/utilities\";\nimport type {\n IAiAgentConfig,\n IAiAgentMessage,\n AiAgentMessageType,\n INavigateToAppPayload,\n IAiChatMessagePayload,\n} from \"@core/plugins/ai-agent/types\";\n\nconst logger = createLogger(\"ai-agent-transport\");\n\nexport interface MessageTransportOptions {\n getConfig: () => IAiAgentConfig;\n isEmbedded: boolean;\n navigateToBlade?: (bladeName: string, param?: string, options?: Record<string, unknown>) => void;\n /** Invoked on a CLOSE_PANEL message — the chatbot's only way to close the panel it has focus in. */\n closePanel?: () => void;\n}\n\nexport interface MessageTransport {\n iframeRef: ShallowRef<HTMLIFrameElement | null>;\n pendingInitContext: ReturnType<typeof ref<boolean>>;\n isListenerRegistered: ReturnType<typeof ref<boolean>>;\n setIframeRef: (iframe: HTMLIFrameElement | null) => void;\n sendToIframe: (message: { type: string; payload?: unknown }) => void;\n sendToParent: (message: { type: string; payload?: unknown }) => void;\n startListening: () => void;\n stopListening: () => void;\n onChatReady: (handler: () => void) => () => void;\n onMessage: (handler: (event: IAiAgentMessage) => void) => () => void;\n}\n\nexport function createMessageTransport(options: MessageTransportOptions): MessageTransport {\n const { getConfig, isEmbedded, navigateToBlade, closePanel } = options;\n\n const iframeRef: ShallowRef<HTMLIFrameElement | null> = shallowRef(null);\n const pendingInitContext = ref(false);\n const isListenerRegistered = ref(false);\n\n const messageHandlers = new Set<(event: IAiAgentMessage) => void>();\n const chatReadyHandlers = new Set<() => void>();\n\n /** Shared handler for all chat protocol messages (used by both normal and embedded) */\n function handleChatMessage(type: string, payload: unknown): void {\n switch (type) {\n case \"NAVIGATE_TO_APP\": {\n const navPayload = payload as INavigateToAppPayload;\n if (navigateToBlade && navPayload?.bladeName) {\n navigateToBlade(navPayload.bladeName, navPayload.param, navPayload.options);\n logger.debug(`Navigation requested to: ${navPayload.bladeName}`);\n }\n break;\n }\n // The panel's own Escape handler listens on the host document, which never sees a\n // keystroke delivered to a cross-origin iframe. So while the chatbot holds focus the\n // only route back is the chatbot relaying it here (VCST-5673). Closing a panel exposes\n // nothing, and the sender's origin and window are checked before this runs.\n case \"CLOSE_PANEL\": {\n if (closePanel) {\n closePanel();\n logger.debug(\"Panel close requested by the chatbot\");\n }\n break;\n }\n default:\n break;\n }\n\n // Notify general message handlers\n const normalized: IAiAgentMessage = {\n type: type as AiAgentMessageType,\n payload,\n timestamp: Date.now(),\n };\n messageHandlers.forEach((handler) => {\n try {\n handler(normalized);\n } catch (e) {\n logger.error(\"Handler error:\", e);\n }\n });\n }\n\n function handleIncomingMessage(event: MessageEvent): void {\n const config = getConfig();\n const allowedOrigins = config.allowedOrigins ?? [];\n if (allowedOrigins.length === 0) {\n logger.warn(\n \"Ignoring postMessage: aiAgentConfig.allowedOrigins is empty. \" +\n \"Configure explicit origins to enable the AI agent bridge.\",\n { origin: event.origin, type: event.data?.type },\n );\n return;\n }\n if (allowedOrigins.includes(\"*\")) {\n logger.error(\n \"Refusing postMessage with wildcard allowedOrigins. \" +\n 'Replace \"*\" with explicit origins (e.g. [\"https://chat.example.com\"]).',\n );\n return;\n }\n if (!allowedOrigins.includes(event.origin)) {\n return;\n }\n\n const expectedSource = isEmbedded ? window.parent : iframeRef.value?.contentWindow;\n if (!expectedSource || event.source !== expectedSource) {\n return;\n }\n\n const message = event.data;\n if (!message?.type || typeof message.type !== \"string\") return;\n\n logger.debug(`Message received: ${message.type}`);\n\n switch (message.type) {\n // Embedded: parent forwards chat messages wrapped in AI_CHAT_MESSAGE\n case \"AI_CHAT_MESSAGE\": {\n if (isEmbedded) {\n const chatMessage = message.payload as IAiChatMessagePayload;\n if (chatMessage?.type) {\n handleChatMessage(chatMessage.type, chatMessage.payload);\n }\n }\n return;\n }\n // Normal: chatbot signals it's ready\n case \"CHAT_READY\":\n chatReadyHandlers.forEach((h) => {\n try {\n h();\n } catch (e) {\n logger.error(\"ChatReady handler error:\", e);\n }\n });\n break;\n // Normal: direct chat protocol messages\n default:\n handleChatMessage(message.type, message.payload);\n break;\n }\n }\n\n return {\n iframeRef,\n pendingInitContext,\n isListenerRegistered,\n\n setIframeRef(iframe: HTMLIFrameElement | null) {\n iframeRef.value = iframe;\n logger.debug(\"Iframe ref set:\", iframe ? \"available\" : \"null\");\n },\n\n sendToIframe(message: { type: string; payload?: unknown }) {\n if (!iframeRef.value?.contentWindow) {\n logger.warn(\"Cannot send message: iframe not available\");\n return;\n }\n const targetOrigin = getConfig().allowedOrigins?.[0];\n if (!targetOrigin || targetOrigin === \"*\") {\n logger.error(\n \"Refusing to send to iframe: aiAgentConfig.allowedOrigins must contain an explicit origin. \" +\n \"Message dropped to avoid leaking data (including access tokens) to arbitrary origins.\",\n { type: message.type },\n );\n return;\n }\n iframeRef.value.contentWindow.postMessage(message, targetOrigin);\n logger.debug(`Sent to iframe: ${message.type}`);\n },\n\n sendToParent(message: { type: string; payload?: unknown }) {\n if (!window.parent || window.parent === window) {\n logger.warn(\"Cannot send to parent: not in iframe\");\n return;\n }\n const parentOrigin = getConfig().parentOrigin;\n if (!parentOrigin || parentOrigin === \"*\") {\n logger.error(\n \"Refusing to send to parent: aiAgentConfig.parentOrigin must be an explicit origin. \" +\n \"Message dropped to avoid leaking data (including access tokens) to arbitrary origins.\",\n { type: message.type },\n );\n return;\n }\n window.parent.postMessage(message, parentOrigin);\n logger.debug(`Sent to parent: ${message.type}`);\n },\n\n startListening() {\n if (!isListenerRegistered.value) {\n window.addEventListener(\"message\", handleIncomingMessage);\n isListenerRegistered.value = true;\n }\n },\n\n stopListening() {\n if (isListenerRegistered.value) {\n window.removeEventListener(\"message\", handleIncomingMessage);\n isListenerRegistered.value = false;\n }\n },\n\n onChatReady(handler: () => void) {\n chatReadyHandlers.add(handler);\n return () => {\n chatReadyHandlers.delete(handler);\n };\n },\n\n onMessage(handler: (event: IAiAgentMessage) => void) {\n messageHandlers.add(handler);\n return () => {\n messageHandlers.delete(handler);\n };\n },\n };\n}\n","import { ref, computed, watch, type ShallowRef } from \"vue\";\nimport { createLogger } from \"@core/utilities\";\nimport type {\n IAiAgentService,\n IAiAgentConfig,\n IAiAgentContext,\n AiAgentMessageType,\n ISuggestion,\n AiAgentContextType,\n IAiAgentBladeContext,\n IAiAgentUserContext,\n} from \"@core/plugins/ai-agent/types\";\nimport { DEFAULT_AI_AGENT_CONFIG } from \"@core/plugins/ai-agent/constants\";\nimport { createPanelController } from \"./panel-controller\";\nimport { createContextManager } from \"./context-manager\";\nimport { createMessageTransport } from \"./message-transport\";\n\nconst logger = createLogger(\"ai-agent-service\");\n\n/**\n * Options for creating the AI agent service\n */\nexport interface CreateAiAgentServiceOptions {\n /** Function to get current user information */\n userGetter: () => IAiAgentUserContext | undefined;\n /** Function to get current blade context */\n bladeGetter: () => IAiAgentBladeContext | null;\n /** Function to get user locale */\n localeGetter: () => string;\n /** Function to get access token (handles automatic refresh) */\n tokenGetter?: () => Promise<string | null>;\n /** Function to navigate to blade */\n navigateToBlade?: (bladeName: string, param?: string, options?: Record<string, unknown>) => void;\n /** Initial configuration */\n initialConfig?: Partial<IAiAgentConfig>;\n /** Whether the app is running in embedded mode (inside OneShell iframe) */\n isEmbedded?: boolean;\n}\n\n/**\n * Extended AI Agent Service with internal methods for component use\n */\nexport interface IAiAgentServiceInternal extends IAiAgentService {\n /** Reference to the iframe element (set by component) */\n iframeRef: ShallowRef<HTMLIFrameElement | null>;\n /** Set the iframe reference (called by component) */\n _setIframeRef: (iframe: HTMLIFrameElement | null) => void;\n /** Start listening for postMessage events */\n _startListening: () => void;\n /** Stop listening for postMessage events */\n _stopListening: () => void;\n /** Update context data for a blade (called by useAiAgentContext) */\n _setContextData: (\n items: Record<string, unknown>[],\n type: AiAgentContextType,\n suggestions?: ISuggestion[],\n bladeId?: string,\n ) => void;\n}\n\n/**\n * Creates an AI agent service by composing panel-controller, context-manager, and message-transport.\n */\nexport function createAiAgentService(options: CreateAiAgentServiceOptions): IAiAgentServiceInternal {\n const {\n userGetter,\n bladeGetter,\n localeGetter,\n tokenGetter,\n navigateToBlade,\n initialConfig,\n isEmbedded = false,\n } = options;\n\n const config = ref<IAiAgentConfig>({ ...DEFAULT_AI_AGENT_CONFIG, ...initialConfig });\n\n // Compose sub-modules\n const panel = createPanelController();\n\n const contextManager = createContextManager({\n userGetter,\n bladeGetter,\n localeGetter,\n tokenGetter,\n });\n\n const transport = createMessageTransport({\n getConfig: () => config.value,\n isEmbedded,\n navigateToBlade,\n closePanel: () => panel.close(),\n });\n\n // Context computed (no timestamp — clean dependency tracking)\n const context = computed<IAiAgentContext>(() => ({\n user: userGetter(),\n currentBlade: bladeGetter(),\n items: contextManager.contextItems.value,\n }));\n\n // --- Wiring: connect modules together ---\n\n // Shared helper: flush pending INIT_CONTEXT when iframe becomes available\n const flushPendingInit = async () => {\n if (transport.pendingInitContext.value && transport.iframeRef.value?.contentWindow) {\n transport.pendingInitContext.value = false;\n panel.isInitialized.value = true;\n const payload = await contextManager.buildInitPayload();\n transport.sendToIframe({ type: \"INIT_CONTEXT\", payload });\n logger.debug(\"Flushed pending INIT_CONTEXT\");\n }\n };\n\n // CHAT_READY → send INIT_CONTEXT (or mark pending if iframe ref not yet available)\n transport.onChatReady(() => {\n if (transport.iframeRef.value?.contentWindow) {\n panel.isInitialized.value = true;\n contextManager.buildInitPayload().then((payload) => {\n transport.sendToIframe({ type: \"INIT_CONTEXT\", payload });\n logger.info(\"Chatbot ready, sent INIT_CONTEXT\");\n });\n } else {\n transport.pendingInitContext.value = true;\n logger.info(\"Chatbot ready, iframe ref not available yet — pending INIT_CONTEXT\");\n }\n });\n\n // Watch iframe ref — flush pending INIT_CONTEXT when iframe becomes available\n watch(transport.iframeRef, () => flushPendingInit());\n\n // Watch context changes → UPDATE_CONTEXT (normal) or AI_CONTEXT_UPDATE (embedded)\n watch(\n () => ({ currentBlade: context.value.currentBlade, items: context.value.items }),\n async () => {\n if (isEmbedded) {\n const payload = await contextManager.buildInitPayload();\n transport.sendToParent({ type: \"AI_CONTEXT_UPDATE\", payload });\n return;\n }\n if (panel.isOpen.value && panel.isInitialized.value && transport.iframeRef.value?.contentWindow) {\n const payload = await contextManager.buildUpdatePayload();\n transport.sendToIframe({ type: \"UPDATE_CONTEXT\", payload });\n }\n },\n { deep: true },\n );\n\n // Panel control — delegate to parent in embedded mode\n const openPanel = () => (isEmbedded ? transport.sendToParent({ type: \"AI_TOGGLE_PANEL\" }) : panel.open());\n const closePanel = () => (isEmbedded ? transport.sendToParent({ type: \"AI_TOGGLE_PANEL\" }) : panel.close());\n const togglePanel = () => (isEmbedded ? transport.sendToParent({ type: \"AI_TOGGLE_PANEL\" }) : panel.toggle());\n\n // _setIframeRef with pending context check\n const _setIframeRef = (iframe: HTMLIFrameElement | null) => {\n transport.setIframeRef(iframe);\n flushPendingInit();\n };\n\n // _setContextData with embedded clear notification\n const _setContextData = (\n items: Record<string, unknown>[],\n type: AiAgentContextType,\n suggestions?: ISuggestion[],\n bladeId?: string,\n ) => {\n const { cleared } = contextManager.setContextData(items, type, suggestions, bladeId);\n if (isEmbedded && cleared) {\n transport.sendToParent({ type: \"AI_CONTEXT_CLEAR\" });\n }\n };\n\n // Auto-start listener\n transport.startListening();\n\n // Embedded: notify parent\n if (isEmbedded) {\n transport.sendToParent({\n type: \"EMBEDDED_APP_READY\",\n payload: { supportedFeatures: [\"ai-agent\"] },\n });\n logger.info(\"Embedded mode: sent EMBEDDED_APP_READY to parent\");\n }\n\n return {\n // State\n panelState: panel.panelState,\n config,\n context,\n isOpen: computed(() => !isEmbedded && panel.isOpen.value),\n isExpanded: panel.isExpanded,\n totalItemsCount: contextManager.totalItemsCount,\n\n // Panel control\n openPanel,\n closePanel,\n togglePanel,\n expandPanel: () => panel.expand(),\n collapsePanel: () => panel.collapse(),\n\n // Configuration\n setConfig: (newConfig: Partial<IAiAgentConfig>) => {\n config.value = { ...config.value, ...newConfig };\n },\n\n // Communication\n sendMessage: (type: AiAgentMessageType, payload: unknown) => {\n transport.sendToIframe({ type, payload });\n },\n onMessage: transport.onMessage,\n\n // Internal API\n iframeRef: transport.iframeRef,\n _setIframeRef,\n _startListening: transport.startListening,\n _stopListening: transport.stopListening,\n _setContextData,\n };\n}\n","import type { ShortcutDefinition } from \"@core/types\";\n\nexport type Modifier = \"mod\" | \"ctrl\" | \"meta\" | \"alt\" | \"shift\";\n\nexport type Key =\n | \"a\"\n | \"b\"\n | \"c\"\n | \"d\"\n | \"e\"\n | \"f\"\n | \"g\"\n | \"h\"\n | \"i\"\n | \"j\"\n | \"k\"\n | \"l\"\n | \"m\"\n | \"n\"\n | \"o\"\n | \"p\"\n | \"q\"\n | \"r\"\n | \"s\"\n | \"t\"\n | \"u\"\n | \"v\"\n | \"w\"\n | \"x\"\n | \"y\"\n | \"z\"\n | \"0\"\n | \"1\"\n | \"2\"\n | \"3\"\n | \"4\"\n | \"5\"\n | \"6\"\n | \"7\"\n | \"8\"\n | \"9\"\n | \"enter\"\n | \"escape\"\n | \"tab\"\n | \"space\"\n | \"delete\"\n | \"backspace\"\n | \"arrowup\"\n | \"arrowdown\"\n | \"arrowleft\"\n | \"arrowright\"\n | \"f1\"\n | \"f2\"\n | \"f3\"\n | \"f4\"\n | \"f5\"\n | \"f6\"\n | \"f7\"\n | \"f8\"\n | \"f9\"\n | \"f10\"\n | \"f11\"\n | \"f12\"\n | \"backslash\"\n | \"period\"\n | \"comma\"\n | \"slash\";\n\nconst MODIFIERS: ReadonlySet<string> = new Set([\"mod\", \"ctrl\", \"meta\", \"alt\", \"shift\"]);\n\nexport type HotkeyBuilder = { [M in Modifier]: HotkeyBuilder } & { [K in Key]: ShortcutDefinition };\n\nfunction makeBuilder(mods: Partial<Record<Modifier, boolean>>): HotkeyBuilder {\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (typeof prop !== \"string\" || prop === \"then\") return undefined;\n if (MODIFIERS.has(prop)) {\n return makeBuilder({ ...mods, [prop as Modifier]: true });\n }\n // Terminal: a key. Assemble the definition.\n return { key: prop, ...mods } as ShortcutDefinition;\n },\n },\n ) as HotkeyBuilder;\n}\n\n/**\n * Fluent shortcut builder: `hotkey.mod.s` → `{ key: \"s\", mod: true }`.\n * Modifier and key names are finite unions, so typos are compile errors.\n */\nexport const hotkey: HotkeyBuilder = makeBuilder({});\n","import type { ShortcutDefinition } from \"@core/types\";\n\n// Apple modifier order: Control, Option, Shift, Command.\nconst MAC_GLYPH = { ctrl: \"⌃\", alt: \"⌥\", shift: \"⇧\", meta: \"⌘\" } as const;\nconst WIN_WORD = { ctrl: \"Ctrl\", alt: \"Alt\", shift: \"Shift\", meta: \"Meta\" } as const;\n\n// Display label for the key part (visual).\nconst KEY_LABEL: Record<string, string> = {\n escape: \"Esc\",\n enter: \"Enter\",\n tab: \"Tab\",\n space: \"Space\",\n delete: \"Del\",\n backspace: \"Backspace\",\n arrowup: \"↑\",\n arrowdown: \"↓\",\n arrowleft: \"←\",\n arrowright: \"→\",\n backslash: \"\\\\\",\n period: \".\",\n comma: \",\",\n slash: \"/\",\n};\n\n// Canonical aria key name (W3C aria-keyshortcuts).\nconst KEY_ARIA: Record<string, string> = {\n escape: \"Escape\",\n enter: \"Enter\",\n tab: \"Tab\",\n space: \"Space\",\n delete: \"Delete\",\n backspace: \"Backspace\",\n arrowup: \"ArrowUp\",\n arrowdown: \"ArrowDown\",\n arrowleft: \"ArrowLeft\",\n arrowright: \"ArrowRight\",\n backslash: \"\\\\\",\n period: \".\",\n comma: \",\",\n slash: \"/\",\n};\n\nfunction keyLabel(key: string): string {\n if (key in KEY_LABEL) return KEY_LABEL[key];\n if (key.length === 1) return key.toUpperCase(); // letters, digits\n return key.toUpperCase(); // f2 -> F2\n}\n\nfunction keyAria(key: string): string {\n if (key in KEY_ARIA) return KEY_ARIA[key];\n if (key.length === 1) return key.toUpperCase();\n return key.charAt(0).toUpperCase() + key.slice(1); // f2 -> F2 already single-cased above; enter handled by map\n}\n\n/**\n * Two representations of a shortcut from one definition:\n * - `parts`: OS-aware keycap labels, one per chip (macOS uses glyphs, others words).\n * - `aria`: canonical W3C `aria-keyshortcuts` string, OS-independent.\n */\nexport function formatShortcut(def: ShortcutDefinition, isMac: boolean): { parts: string[]; aria: string } {\n const useCtrl = !!def.ctrl || (!!def.mod && !isMac);\n const useMeta = !!def.meta || (!!def.mod && isMac);\n\n const parts: string[] = [];\n const ariaMods: string[] = [];\n\n if (isMac) {\n // Apple order: ⌃ ⌥ ⇧ ⌘\n if (useCtrl) parts.push(MAC_GLYPH.ctrl);\n if (def.alt) parts.push(MAC_GLYPH.alt);\n if (def.shift) parts.push(MAC_GLYPH.shift);\n if (useMeta) parts.push(MAC_GLYPH.meta);\n } else {\n if (useCtrl) parts.push(WIN_WORD.ctrl);\n if (useMeta) parts.push(WIN_WORD.meta);\n if (def.alt) parts.push(WIN_WORD.alt);\n if (def.shift) parts.push(WIN_WORD.shift);\n }\n\n // Canonical aria mod order: Control, Meta, Alt, Shift (primary before Shift, so\n // both Control+Shift+X and Meta+Shift+X hold across platforms).\n if (useCtrl) ariaMods.push(\"Control\");\n if (useMeta) ariaMods.push(\"Meta\");\n if (def.alt) ariaMods.push(\"Alt\");\n if (def.shift) ariaMods.push(\"Shift\");\n\n parts.push(keyLabel(def.key));\n const aria = [...ariaMods, keyAria(def.key)].join(\"+\");\n\n return { parts, aria };\n}\n","import type { ShortcutDefinition } from \"@core/types\";\n\n/** Keys matched by physical position (event.code), layout-independent. */\nconst CODE_KEYS: Record<string, string> = {\n backslash: \"Backslash\",\n period: \"Period\",\n comma: \"Comma\",\n slash: \"Slash\",\n};\n\n/** Named keys matched by event.key (already layout-independent). */\nconst NAMED_KEYS: Record<string, string> = {\n enter: \"Enter\",\n escape: \"Escape\",\n tab: \"Tab\",\n space: \" \",\n delete: \"Delete\",\n backspace: \"Backspace\",\n arrowup: \"ArrowUp\",\n arrowdown: \"ArrowDown\",\n arrowleft: \"ArrowLeft\",\n arrowright: \"ArrowRight\",\n};\n\nfunction isLetter(key: string): boolean {\n return key.length === 1 && key >= \"a\" && key <= \"z\";\n}\nfunction isDigit(key: string): boolean {\n return key.length === 1 && key >= \"0\" && key <= \"9\";\n}\nfunction isFunctionKey(key: string): boolean {\n return /^f([1-9]|1[0-2])$/.test(key);\n}\n\n/** Expected `event.code` for a code-matched key, or undefined if this key is name-matched. */\nexport function expectedCode(key: string): string | undefined {\n if (isLetter(key)) return `Key${key.toUpperCase()}`;\n if (isDigit(key)) return `Digit${key}`;\n if (key in CODE_KEYS) return CODE_KEYS[key];\n return undefined;\n}\n\n/** Expected `event.key` for a name-matched key, or undefined if code-matched. */\nexport function expectedEventKey(key: string): string | undefined {\n if (key in NAMED_KEYS) return NAMED_KEYS[key];\n if (isFunctionKey(key)) return key.toUpperCase(); // f2 -> \"F2\"\n return undefined;\n}\n\nfunction keyMatches(def: ShortcutDefinition, event: KeyboardEvent): boolean {\n const code = expectedCode(def.key);\n if (code !== undefined) return event.code === code;\n const evKey = expectedEventKey(def.key);\n if (evKey !== undefined) return event.key === evKey;\n return false;\n}\n\n/**\n * True when the event exactly matches the definition. Modifiers must match\n * exactly (so `mod+s` never fires on `mod+shift+s`). `mod` resolves to Cmd on\n * macOS, Ctrl elsewhere.\n */\nexport function matchesEvent(def: ShortcutDefinition, event: KeyboardEvent, isMac: boolean): boolean {\n const expectedCtrl = !!def.ctrl || (!!def.mod && !isMac);\n const expectedMeta = !!def.meta || (!!def.mod && isMac);\n const expectedAlt = !!def.alt;\n const expectedShift = !!def.shift;\n\n if (event.ctrlKey !== expectedCtrl) return false;\n if (event.metaKey !== expectedMeta) return false;\n if (event.altKey !== expectedAlt) return false;\n if (event.shiftKey !== expectedShift) return false;\n\n return keyMatches(def, event);\n}\n\n/** `<input>` types that do not accept typed text; focus on these must not suppress bare-key shortcuts. */\nconst NON_TEXT_INPUT_TYPES: ReadonlySet<string> = new Set([\n \"button\",\n \"submit\",\n \"reset\",\n \"checkbox\",\n \"radio\",\n \"file\",\n \"image\",\n \"range\",\n \"color\",\n]);\n\n/** True when focus is in a text-entry element, where bare-key shortcuts must not fire. */\nexport function isTextInputFocused(): boolean {\n const el = document.activeElement as HTMLElement | null;\n if (!el) return false;\n const tag = el.tagName;\n if (tag === \"INPUT\") return !NON_TEXT_INPUT_TYPES.has((el as HTMLInputElement).type);\n if (tag === \"TEXTAREA\" || tag === \"SELECT\") return true;\n if (el.isContentEditable === true) return true;\n // jsdom does not implement `isContentEditable` (always undefined), so fall back\n // to the raw attribute for test environments; harmless in real browsers.\n const attr = el.getAttribute(\"contenteditable\");\n return attr === \"true\" || attr === \"\";\n}\n","import type { ShortcutDefinition } from \"@core/types\";\nimport { hotkey, type HotkeyBuilder } from \"./hotkey\";\nimport { formatShortcut } from \"./format\";\n\nexport { hotkey } from \"./hotkey\";\nexport type { HotkeyBuilder, Modifier, Key } from \"./hotkey\";\nexport { matchesEvent, isTextInputFocused, expectedCode, expectedEventKey } from \"./match\";\nexport { formatShortcut } from \"./format\";\n\n/** Detects macOS from the user agent (Mac primary modifier is Cmd). */\nexport function useIsMac(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Mac|iPhone|iPad|iPod/i.test(navigator.userAgent);\n}\n\nexport interface UseKeyboardShortcutsReturn {\n hotkey: HotkeyBuilder;\n formatShortcut(def: ShortcutDefinition): { parts: string[]; aria: string };\n isMac: boolean;\n}\n\n/**\n * Public entry point. `hotkey` is the same singleton as the named import; the\n * composable also binds `isMac` into `formatShortcut` for convenience. It is\n * context-free (no inject/lifecycle), usable in or out of setup.\n */\nexport function useKeyboardShortcuts(): UseKeyboardShortcutsReturn {\n const isMac = useIsMac();\n return {\n hotkey,\n isMac,\n formatShortcut: (def: ShortcutDefinition) => formatShortcut(def, isMac),\n };\n}\n","import type { IBladeStack, IBladeMessaging, BladeNavigationPlugin } from \"@core/blade-navigation/types\";\nimport type { IBladeRegistry } from \"@core/composables/useBladeRegistry\";\n\n/**\n * Module-level singletons — accessible without inject().\n * Shell's blade-navigation plugin calls the setters during install().\n * Core composables (useBlade, useBladeNavigationAdapter) read via exported variables.\n *\n * Limitation: only one Vue app per JS context is supported.\n * Call _resetBladeNavigationSingletons() in test teardown.\n */\n\nexport let bladeNavigationInstance: BladeNavigationPlugin | undefined;\nexport let bladeStackInstance: IBladeStack | undefined;\nexport let bladeMessagingInstance: IBladeMessaging | undefined;\nexport let bladeRegistryInstance: IBladeRegistry | undefined;\n\nexport function setBladeNavigationInstance(instance: BladeNavigationPlugin): void {\n bladeNavigationInstance = instance;\n}\n\nexport function setBladeStackInstance(instance: IBladeStack): void {\n bladeStackInstance = instance;\n}\n\nexport function setBladeMessagingInstance(instance: IBladeMessaging): void {\n bladeMessagingInstance = instance;\n}\n\nexport function setBladeRegistryInstance(instance: IBladeRegistry): void {\n bladeRegistryInstance = instance;\n}\n\n/** @internal Test teardown only */\nexport function _resetBladeNavigationSingletons(): void {\n bladeNavigationInstance = undefined;\n bladeStackInstance = undefined;\n bladeMessagingInstance = undefined;\n bladeRegistryInstance = undefined;\n}\n","import { inject, computed, getCurrentInstance, provide, ref, isRef, watch, type ComputedRef, type MaybeRef } from \"vue\";\nimport {\n BladeDescriptorKey,\n BladeStackKey,\n BladeMessagingKey,\n BladeDataKey,\n BladeBannersKey,\n} from \"@core/blade-navigation/types\";\nimport type { BladeOpenEvent, IBladeStack, IBladeBanner } from \"@core/blade-navigation/types\";\nexport type { IBladeBanner } from \"@core/blade-navigation/types\";\nimport { bladeStackInstance, bladeMessagingInstance } from \"@core/blade-navigation/singletons\";\n\nexport interface UseBladeReturn<TOptions = Record<string, unknown>> {\n // Identity (read-only) — runtime error outside blade context\n readonly id: ComputedRef<string>;\n readonly param: ComputedRef<string | undefined>;\n /** param of the direct child blade opened from this blade, or undefined. */\n readonly activeChildParam: ComputedRef<string | undefined>;\n readonly options: ComputedRef<TOptions | undefined>;\n readonly query: ComputedRef<Record<string, string> | undefined>;\n readonly closable: ComputedRef<boolean>;\n readonly expanded: ComputedRef<boolean>;\n readonly name: ComputedRef<string>;\n /** @deprecated Use `defineBladeContext()` instead */\n provideBladeData(data: MaybeRef<Record<string, unknown>>): void;\n // Navigation — works everywhere\n openBlade(event: BladeOpenEvent & { isWorkspace?: boolean }): Promise<void>;\n // Actions — runtime error outside blade context\n closeSelf(): Promise<boolean>;\n closeChildren(): Promise<void>;\n replaceWith(event: BladeOpenEvent): Promise<void>;\n coverWith(event: BladeOpenEvent): Promise<void>;\n // Communication — runtime error outside blade context\n callParent<T = unknown>(method: string, args?: unknown): Promise<T>;\n\n exposeToChildren(methods: Record<string, (...args: any[]) => any>): void;\n // Guards — runtime error outside blade context\n onBeforeClose(guard: () => Promise<boolean>): void;\n // Lifecycle — runtime error outside blade context\n onActivated(callback: () => void): void;\n onDeactivated(callback: () => void): void;\n // Error management — runtime error outside blade context\n setError(error: unknown): void;\n clearError(): void;\n // Banner management — runtime error outside blade context\n addBanner(options: Omit<IBladeBanner, \"id\" | \"_system\">): string;\n removeBanner(id: string): void;\n clearBanners(): void;\n}\n\nconst CONTEXT_ERROR_SUFFIX =\n \"useBlade() was called outside a blade. Navigation methods (openBlade) work everywhere, \" +\n \"but blade-specific methods require the component to be rendered inside VcBladeSlot.\";\n\nfunction requireContext(method: string): never {\n throw new Error(`[vc-shell] ${method} requires blade context.\\n${CONTEXT_ERROR_SUFFIX}`);\n}\n\n/**\n * Unified blade composable — works **everywhere**.\n *\n * Inside a blade (rendered by VcBladeSlot): full API — identity, navigation,\n * communication, guards, error management.\n *\n * Outside a blade (dashboard cards, notification templates, composables):\n * navigation methods (openBlade) work via singletons; blade-specific methods\n * throw a descriptive runtime error on invocation.\n *\n * @example Inside blade\n * ```ts\n * const { id, param, openBlade, closeSelf, callParent } = useBlade();\n * openBlade({ name: \"OrderDetails\", param: orderId });\n * const result = await callParent(\"reload\");\n * closeSelf();\n * ```\n *\n * @example Outside blade (dashboard card)\n * ```ts\n * const { openBlade } = useBlade();\n * openBlade({ name: \"OrderDetails\", param: orderId });\n * ```\n */\nexport function useBlade<TOptions = Record<string, unknown>>(): UseBladeReturn<TOptions> {\n // Navigation — always available via inject (preferred) or singletons (fallback)\n const _stack: IBladeStack | undefined =\n (getCurrentInstance() ? inject(BladeStackKey, undefined) : undefined) ?? bladeStackInstance;\n const _messaging =\n (getCurrentInstance() ? inject(BladeMessagingKey, undefined) : undefined) ?? bladeMessagingInstance;\n\n if (!_stack || !_messaging) {\n throw new Error(\n \"[vc-shell] useBlade() failed: BladeStack or BladeMessaging not available. \" +\n \"Ensure BladeNavigationPlugin (plugin-v2) is installed.\",\n );\n }\n\n // After the guard above, these are guaranteed non-null\n const bladeStack = _stack;\n const messaging = _messaging;\n\n // Blade context — optional (via inject, no error if missing)\n const descriptor = getCurrentInstance() ? inject(BladeDescriptorKey, undefined) : undefined;\n\n // Blade banners — optional (via inject, no error if missing)\n const bannersRef = getCurrentInstance() ? inject(BladeBannersKey, undefined) : undefined;\n\n // ── Identity (read-only) ────────────────────────────────────────────────\n const id = computed(() => {\n if (!descriptor) requireContext(\"id\");\n return descriptor!.value.id;\n });\n const param = computed(() => {\n if (!descriptor) requireContext(\"param\");\n return descriptor!.value.param;\n });\n const options = computed(() => {\n if (!descriptor) requireContext(\"options\");\n return descriptor!.value.options as TOptions | undefined;\n });\n const query = computed(() => {\n if (!descriptor) requireContext(\"query\");\n return descriptor!.value.query;\n });\n const closable = computed(() => {\n if (!descriptor) requireContext(\"closable\");\n return descriptor!.value.parentId !== undefined;\n });\n const expanded = computed(() => {\n if (!descriptor) requireContext(\"expanded\");\n const active = bladeStack.activeBlade.value;\n return active?.id === descriptor!.value.id;\n });\n const name = computed(() => {\n if (!descriptor) requireContext(\"name\");\n return descriptor!.value.name;\n });\n\n // param of the direct child blade (the entity currently open from this blade).\n // Reactive over the stack and reload-safe: on reload the child blade is\n // restored with its param. Returns undefined outside blade context.\n const activeChildParam = computed<string | undefined>(() => {\n if (!descriptor) return undefined;\n const selfId = descriptor.value.id;\n return bladeStack.blades.value.find((b) => b.parentId === selfId)?.param;\n });\n\n // ── Blade Data ──────────────────────────────────────────────────────────\n\n let _bladeDataProvided = false;\n\n function provideBladeData(data: MaybeRef<Record<string, unknown>>): void {\n if (_bladeDataProvided) {\n console.warn(\n \"[vc-shell] provideBladeData() called more than once in the same blade. \" + \"Only the first call takes effect.\",\n );\n return;\n }\n _bladeDataProvided = true;\n\n const reactiveData = isRef(data) ? data : ref(data);\n provide(BladeDataKey, reactiveData);\n }\n\n // ── Navigation (works everywhere) ─────────────────────────────────────\n\n async function openBlade(event: BladeOpenEvent & { isWorkspace?: boolean }): Promise<void> {\n const { isWorkspace, ...bladeEvent } = event;\n\n if (isWorkspace) {\n // Workspace: close all blades, open as root\n await bladeStack.openWorkspace(bladeEvent);\n } else {\n const parentId = descriptor?.value.id;\n if (parentId) {\n // Inside blade: open as child\n await bladeStack.openBlade({ ...bladeEvent, parentId });\n } else {\n // Outside blade: open with active blade as parent (or workspace)\n await bladeStack.openBlade(bladeEvent);\n }\n }\n }\n\n // ── Actions ──────────────────────────────────────────────────────────────\n\n async function closeSelf(): Promise<boolean> {\n if (!descriptor) requireContext(\"closeSelf()\");\n return bladeStack.closeBlade(descriptor!.value.id);\n }\n\n async function closeChildren(): Promise<void> {\n if (!descriptor) requireContext(\"closeChildren()\");\n await bladeStack.closeChildren(descriptor!.value.id);\n }\n\n async function replaceWith(event: BladeOpenEvent): Promise<void> {\n if (!descriptor) requireContext(\"replaceWith()\");\n await bladeStack.replaceCurrentBlade({\n ...event,\n parentId: descriptor!.value.parentId,\n });\n }\n\n async function coverWith(event: BladeOpenEvent): Promise<void> {\n if (!descriptor) requireContext(\"coverWith()\");\n await bladeStack.coverCurrentBlade({\n ...event,\n parentId: descriptor!.value.parentId,\n });\n }\n\n // ── Communication ───────────────────────────────────────────────────────\n\n async function callParent<T = unknown>(method: string, args?: unknown): Promise<T> {\n if (!descriptor) requireContext(\"callParent()\");\n return messaging.callParent<T>(descriptor!.value.id, method, args);\n }\n\n function exposeToChildren(methods: Record<string, (...args: any[]) => any>): void {\n if (!descriptor) requireContext(\"exposeToChildren()\");\n messaging.exposeToChildren(descriptor!.value.id, methods);\n }\n\n // ── Guards ───────────────────────────────────────────────────────────────\n\n function onBeforeClose(guard: () => Promise<boolean>): void {\n if (!descriptor) requireContext(\"onBeforeClose()\");\n bladeStack.registerBeforeClose(descriptor!.value.id, guard);\n }\n\n // ── Error management ────────────────────────────────────────────────────\n\n function setError(error: unknown): void {\n if (!descriptor) requireContext(\"setError()\");\n bladeStack.setBladeError(descriptor!.value.id, error);\n }\n\n function clearError(): void {\n if (!descriptor) requireContext(\"clearError()\");\n bladeStack.clearBladeError(descriptor!.value.id);\n }\n\n // ── Banner management ─────────────────────────────────────────────────\n\n let _bannerCounter = 0;\n\n function addBanner(options: Omit<IBladeBanner, \"id\" | \"_system\">): string {\n if (!bannersRef) requireContext(\"addBanner()\");\n const id = `banner-${descriptor!.value.id}-${++_bannerCounter}`;\n bannersRef!.value.push({\n ...options,\n id,\n dismissible: options.dismissible ?? false,\n });\n return id;\n }\n\n function removeBanner(id: string): void {\n if (!bannersRef) requireContext(\"removeBanner()\");\n bannersRef!.value = bannersRef!.value.filter((b) => b.id !== id);\n }\n\n function clearBanners(): void {\n if (!bannersRef) requireContext(\"clearBanners()\");\n bannersRef!.value = bannersRef!.value.filter((b) => b._system);\n }\n\n // ── Lifecycle hooks ─────────────────────────────────────────────────────\n\n let _activatedRegistered = false;\n let _deactivatedRegistered = false;\n\n function onActivated(callback: () => void): void {\n if (!descriptor) requireContext(\"onActivated()\");\n if (_activatedRegistered) {\n console.warn(\"[useBlade] onActivated() already registered in this blade.\");\n return;\n }\n _activatedRegistered = true;\n watch(expanded, (val) => {\n if (val) callback();\n });\n }\n\n function onDeactivated(callback: () => void): void {\n if (!descriptor) requireContext(\"onDeactivated()\");\n if (_deactivatedRegistered) {\n console.warn(\"[useBlade] onDeactivated() already registered in this blade.\");\n return;\n }\n _deactivatedRegistered = true;\n watch(expanded, (val) => {\n if (!val) callback();\n });\n }\n\n return {\n id,\n param,\n activeChildParam,\n options,\n query,\n closable,\n expanded,\n name,\n provideBladeData,\n openBlade,\n closeSelf,\n closeChildren,\n replaceWith,\n coverWith,\n callParent,\n exposeToChildren,\n onBeforeClose,\n onActivated,\n onDeactivated,\n setError,\n clearError,\n addBanner,\n removeBanner,\n clearBanners,\n };\n}\n","import type { BladeDescriptor, BladeOpenEvent } from \"@core/blade-navigation/types\";\n\n/**\n * Context passed to descriptor factories — the runtime dependencies each\n * factory needs to produce a fully-formed BladeDescriptor.\n * @internal\n */\nexport interface DescriptorFactoryContext {\n /** Generate a unique blade instance ID */\n generateId: () => string;\n /** Resolve a blade name to its URL segment (undefined if none) */\n resolveUrl: (name: string) => string | undefined;\n}\n\n/**\n * Build a workspace (root) descriptor.\n *\n * Workspace blades have no `parentId` and never carry a `param` when opened —\n * they are the root of a stack. Always visible.\n * @internal\n */\nexport function createWorkspaceDescriptor(event: BladeOpenEvent, ctx: DescriptorFactoryContext): BladeDescriptor {\n return {\n id: ctx.generateId(),\n name: event.name,\n url: ctx.resolveUrl(event.name),\n // workspace blades don't have param when opened first\n query: event.query,\n options: event.options,\n visible: true,\n };\n}\n\n/**\n * Build a child descriptor opened from a parent blade.\n *\n * The child's `parentId` is the blade it was opened from. Always visible.\n * @internal\n */\nexport function createChildDescriptor(\n event: BladeOpenEvent,\n parentId: string,\n ctx: DescriptorFactoryContext,\n): BladeDescriptor {\n return {\n id: ctx.generateId(),\n name: event.name,\n url: ctx.resolveUrl(event.name),\n param: event.param,\n query: event.query,\n options: event.options,\n parentId,\n visible: true,\n };\n}\n\n/**\n * Build a replacement descriptor for `replaceCurrentBlade`.\n *\n * Keeps the SAME parent as the replaced blade so the new blade occupies the\n * exact same position in the hierarchy. Always visible.\n * @internal\n */\nexport function createReplacementDescriptor(\n event: BladeOpenEvent,\n replacedParentId: string | undefined,\n ctx: DescriptorFactoryContext,\n): BladeDescriptor {\n return {\n id: ctx.generateId(),\n name: event.name,\n url: ctx.resolveUrl(event.name),\n param: event.param,\n query: event.query,\n options: event.options,\n parentId: replacedParentId,\n visible: true,\n };\n}\n\n/**\n * Build a covering descriptor for `coverCurrentBlade`.\n *\n * The covering blade's parent is the HIDDEN blade (not its parent), so\n * `callParent` from the covering blade reaches the hidden blade's methods.\n * Always visible.\n * @internal\n */\nexport function createCoveringDescriptor(\n event: BladeOpenEvent,\n hiddenBladeId: string,\n ctx: DescriptorFactoryContext,\n): BladeDescriptor {\n return {\n id: ctx.generateId(),\n name: event.name,\n url: ctx.resolveUrl(event.name),\n param: event.param,\n query: event.query,\n options: event.options,\n parentId: hiddenBladeId,\n visible: true,\n };\n}\n","import { ref, computed, inject, type Ref } from \"vue\";\nimport type { IBladeRegistry } from \"@core/composables/useBladeRegistry\";\nimport type { BladeDescriptor, BladeOpenEvent, IBladeStack, UrlSink } from \"@core/blade-navigation/types\";\nimport { BladeStackKey, NOOP_URL_SINK } from \"@core/blade-navigation/types\";\nimport {\n createWorkspaceDescriptor,\n createChildDescriptor,\n createReplacementDescriptor,\n createCoveringDescriptor,\n type DescriptorFactoryContext,\n} from \"@core/blade-navigation/descriptorFactory\";\n\nlet _idCounter = 0;\n\n/** Generate a unique blade instance ID */\nfunction generateBladeId(): string {\n return `blade_${++_idCounter}_${Math.random().toString(36).slice(2, 8)}`;\n}\n\n/**\n * Creates the BladeStack state machine.\n *\n * The stack manages an ordered list of BladeDescriptor objects (plain data).\n * All mutations go through explicit actions — no direct VNode manipulation.\n *\n * The stack also owns URL sync: every navigation action writes the URL through\n * `urlSink` with the verb it implies (push for opens, replace for closes), so a\n * caller cannot mutate the stack and forget the URL.\n *\n * @param bladeRegistry - Registry for resolving blade names → components\n * @param hasAccess - Permission check for workspace access\n * @param urlSink - Where the URL is written. Defaults to a no-op (no router).\n * @internal\n */\nexport function createBladeStack(\n bladeRegistry: IBladeRegistry,\n hasAccess?: (permissions: string | string[] | undefined) => boolean,\n urlSink: UrlSink = NOOP_URL_SINK,\n): IBladeStack {\n // ── Internal State ────────────────────────────────────────────────────────\n const _blades = ref<BladeDescriptor[]>([]);\n\n // Guards: bladeId → guard function (returns true to PREVENT close)\n const _beforeCloseGuards = new Map<string, () => Promise<boolean>>();\n\n // Lifecycle callbacks stored per blade\n const _onOpenCallbacks = new Map<string, () => void>();\n const _onCloseCallbacks = new Map<string, () => void>();\n\n // Maximized state per blade\n const _maximized = new Map<string, Ref<boolean>>();\n\n // ── Computed (readonly) ───────────────────────────────────────────────────\n const workspace = computed(() => _blades.value[0]);\n\n const blades = computed<readonly BladeDescriptor[]>(() => _blades.value);\n\n const activeBlade = computed(() => {\n for (let i = _blades.value.length - 1; i >= 0; i--) {\n if (_blades.value[i].visible) return _blades.value[i];\n }\n return undefined;\n });\n\n // ── Internal Helpers ──────────────────────────────────────────────────────\n\n function _cleanupBlade(bladeId: string): void {\n _beforeCloseGuards.delete(bladeId);\n _onOpenCallbacks.delete(bladeId);\n _onCloseCallbacks.delete(bladeId);\n _maximized.delete(bladeId);\n }\n\n function _resolveUrl(name: string): string | undefined {\n const registration = bladeRegistry.getBlade(name);\n if (!registration) return undefined;\n // registration.route holds the URL segment (e.g. \"/orders\")\n return registration.route;\n }\n\n // Shared context for the descriptor factories — encodes ID generation and\n // URL resolution once so all four open paths produce descriptors identically.\n const _descriptorCtx: DescriptorFactoryContext = {\n generateId: generateBladeId,\n resolveUrl: _resolveUrl,\n };\n\n /**\n * Check guards for a list of blades (deepest first).\n * Returns true if any guard prevented the close.\n */\n async function _checkGuards(bladesToClose: BladeDescriptor[]): Promise<boolean> {\n // Reverse: check deepest blade first\n for (let i = bladesToClose.length - 1; i >= 0; i--) {\n const guard = _beforeCloseGuards.get(bladesToClose[i].id);\n if (guard) {\n const prevented = await guard();\n if (prevented) return true;\n }\n }\n return false;\n }\n\n /**\n * Fire onClose callbacks and cleanup for a list of blades.\n */\n function _closeBladesCleanup(bladesToClose: BladeDescriptor[]): void {\n for (const blade of bladesToClose) {\n _onCloseCallbacks.get(blade.id)?.();\n _cleanupBlade(blade.id);\n }\n }\n\n // ── Actions ───────────────────────────────────────────────────────────────\n\n async function _openWorkspace(event: BladeOpenEvent): Promise<void> {\n const currentWorkspace = workspace.value;\n\n // Same workspace — no-op\n if (currentWorkspace?.name === event.name) return;\n\n // Validate blade exists in registry\n const bladeData = bladeRegistry.getBlade(event.name);\n if (!bladeData) {\n throw new Error(`[BladeStack] Blade '${event.name}' not found in registry`);\n }\n\n // Permission check (workspace only)\n if (hasAccess && bladeData.permissions && !hasAccess(bladeData.permissions)) {\n console.warn(`[BladeStack] Access denied to workspace '${event.name}'`);\n return;\n }\n\n // Close all existing blades (no guards — workspace switch is unconditional)\n _closeBladesCleanup([..._blades.value]);\n\n // Create workspace descriptor\n const descriptor = createWorkspaceDescriptor(event, _descriptorCtx);\n\n _blades.value = [descriptor];\n\n if (event.onOpen) _onOpenCallbacks.set(descriptor.id, event.onOpen);\n if (event.onClose) _onCloseCallbacks.set(descriptor.id, event.onClose);\n\n event.onOpen?.();\n }\n\n async function _openBlade(event: BladeOpenEvent & { parentId?: string }): Promise<void> {\n // Validate blade exists in registry\n if (!bladeRegistry.getBlade(event.name)) {\n throw new Error(`[BladeStack] Blade '${event.name}' not found in registry`);\n }\n\n const parentId = event.parentId ?? activeBlade.value?.id ?? workspace.value?.id;\n if (!parentId) {\n throw new Error(\"[BladeStack] Cannot open blade: no parent blade found\");\n }\n\n const parentIndex = _blades.value.findIndex((b) => b.id === parentId);\n if (parentIndex === -1) {\n throw new Error(`[BladeStack] Parent blade '${parentId}' not found in stack`);\n }\n\n // Blades after the parent will be closed\n const bladesToClose = _blades.value.slice(parentIndex + 1);\n\n // Check guards (deepest first)\n if (bladesToClose.length > 0) {\n const prevented = await _checkGuards(bladesToClose);\n if (prevented) return;\n }\n\n // Cleanup closing blades\n _closeBladesCleanup(bladesToClose);\n\n // Create new blade descriptor\n const descriptor = createChildDescriptor(event, parentId, _descriptorCtx);\n\n // Replace blades: keep up to parent (inclusive), append new\n _blades.value = [..._blades.value.slice(0, parentIndex + 1), descriptor];\n\n if (event.onOpen) _onOpenCallbacks.set(descriptor.id, event.onOpen);\n if (event.onClose) _onCloseCallbacks.set(descriptor.id, event.onClose);\n\n event.onOpen?.();\n }\n\n async function _closeBlade(bladeId: string): Promise<boolean> {\n const index = _blades.value.findIndex((b) => b.id === bladeId);\n if (index === -1) return false;\n\n // Cannot close the workspace blade\n if (index === 0) return false;\n\n // Everything from this blade onwards will be closed\n const bladesToClose = _blades.value.slice(index);\n\n // Check guards (deepest first)\n const prevented = await _checkGuards(bladesToClose);\n if (prevented) return true;\n\n // Cleanup and fire onClose callbacks\n _closeBladesCleanup(bladesToClose);\n\n // Remove from stack\n _blades.value = _blades.value.slice(0, index);\n\n // Restore visibility of blade hidden by replaceCurrentBlade\n const lastIndex = _blades.value.length - 1;\n if (lastIndex > 0 && !_blades.value[lastIndex].visible) {\n const updated = [..._blades.value];\n updated[lastIndex] = { ...updated[lastIndex], visible: true };\n _blades.value = updated;\n }\n\n return false;\n }\n\n async function _replaceCurrentBlade(event: BladeOpenEvent & { parentId?: string }): Promise<void> {\n const current = activeBlade.value;\n if (!current) {\n throw new Error(\"[BladeStack] No active blade to replace\");\n }\n\n // Validate blade exists in registry\n if (!bladeRegistry.getBlade(event.name)) {\n throw new Error(`[BladeStack] Blade '${event.name}' not found in registry`);\n }\n\n const currentIndex = _blades.value.findIndex((b) => b.id === current.id);\n if (currentIndex === -1) {\n throw new Error(`[BladeStack] Active blade '${current.id}' not found in stack`);\n }\n\n // Close any blades after the current one first\n const bladesToClose = _blades.value.slice(currentIndex + 1);\n if (bladesToClose.length > 0) {\n const prevented = await _checkGuards(bladesToClose);\n if (prevented) return;\n _closeBladesCleanup(bladesToClose);\n }\n\n // Create replacement descriptor — keeps the SAME parent as the replaced blade,\n // so the new blade occupies the exact same position in the hierarchy.\n const descriptor = createReplacementDescriptor(event, current.parentId, _descriptorCtx);\n\n // Destroy old blade and put new one at the same index\n _closeBladesCleanup([current]);\n const updated = [..._blades.value.slice(0, currentIndex), descriptor, ..._blades.value.slice(currentIndex + 1)];\n _blades.value = updated;\n\n if (event.onOpen) _onOpenCallbacks.set(descriptor.id, event.onOpen);\n if (event.onClose) _onCloseCallbacks.set(descriptor.id, event.onClose);\n\n event.onOpen?.();\n }\n\n async function _coverCurrentBlade(event: BladeOpenEvent & { parentId?: string }): Promise<void> {\n const current = activeBlade.value;\n if (!current) {\n throw new Error(\"[BladeStack] No active blade to cover\");\n }\n\n // Validate blade exists in registry\n if (!bladeRegistry.getBlade(event.name)) {\n throw new Error(`[BladeStack] Blade '${event.name}' not found in registry`);\n }\n\n const currentIndex = _blades.value.findIndex((b) => b.id === current.id);\n if (currentIndex === -1) {\n throw new Error(`[BladeStack] Active blade '${current.id}' not found in stack`);\n }\n\n // Close any blades after the current one first\n const bladesToClose = _blades.value.slice(currentIndex + 1);\n if (bladesToClose.length > 0) {\n const prevented = await _checkGuards(bladesToClose);\n if (prevented) return;\n _closeBladesCleanup(bladesToClose);\n }\n\n // Create covering descriptor — parent is the HIDDEN blade (not its parent),\n // so callParent from the covering blade reaches the hidden blade's methods.\n const descriptor = createCoveringDescriptor(event, current.id, _descriptorCtx);\n\n // Hide current blade (don't destroy it) and append new blade after it\n const updated: BladeDescriptor[] = _blades.value.slice(0, currentIndex);\n updated.push({ ...current, visible: false });\n updated.push(descriptor);\n _blades.value = updated;\n\n if (event.onOpen) _onOpenCallbacks.set(descriptor.id, event.onOpen);\n if (event.onClose) _onCloseCallbacks.set(descriptor.id, event.onClose);\n\n event.onOpen?.();\n }\n\n // ── Close Children ──────────────────────────────────────────────────────\n\n async function _closeChildren(parentId: string): Promise<void> {\n const parentIndex = _blades.value.findIndex((b) => b.id === parentId);\n if (parentIndex === -1) return;\n\n const children = _blades.value.slice(parentIndex + 1);\n if (children.length === 0) return;\n\n // Check guards (deepest first)\n const prevented = await _checkGuards(children);\n if (prevented) return;\n\n // Cleanup and remove\n _closeBladesCleanup(children);\n _blades.value = _blades.value.slice(0, parentIndex + 1);\n }\n\n // ── URL sync ──────────────────────────────────────────────────────────────\n // The sink resolves the location from this stack, so it must run after the\n // mutation. Opens sync only when the resulting blade has a URL segment: a\n // blade without one (e.g. a third-level detail panel) leaves the address bar\n // on the previous blade. Closes always sync.\n\n function _syncOpened(verb: \"push\" | \"replace\"): void {\n if (activeBlade.value?.url) urlSink[verb]();\n }\n\n async function openWorkspace(event: BladeOpenEvent): Promise<void> {\n await _openWorkspace(event);\n _syncOpened(\"push\");\n }\n\n async function openBlade(event: BladeOpenEvent & { parentId?: string }): Promise<void> {\n await _openBlade(event);\n _syncOpened(\"push\");\n }\n\n async function replaceCurrentBlade(event: BladeOpenEvent & { parentId?: string }): Promise<void> {\n await _replaceCurrentBlade(event);\n _syncOpened(\"replace\");\n }\n\n async function coverCurrentBlade(event: BladeOpenEvent & { parentId?: string }): Promise<void> {\n await _coverCurrentBlade(event);\n _syncOpened(\"push\");\n }\n\n async function closeBlade(bladeId: string): Promise<boolean> {\n const prevented = await _closeBlade(bladeId);\n if (!prevented) urlSink.replace();\n return prevented;\n }\n\n async function closeChildren(parentId: string): Promise<void> {\n await _closeChildren(parentId);\n urlSink.replace();\n }\n\n // ── Guards ────────────────────────────────────────────────────────────────\n\n function registerBeforeClose(bladeId: string, guard: () => Promise<boolean>): void {\n _beforeCloseGuards.set(bladeId, guard);\n }\n\n function unregisterBeforeClose(bladeId: string): void {\n _beforeCloseGuards.delete(bladeId);\n }\n\n // ── Error Management ──────────────────────────────────────────────────────\n\n function setBladeError(bladeId: string, error: unknown): void {\n const index = _blades.value.findIndex((b) => b.id === bladeId);\n if (index === -1) return;\n\n // Immutable update: create new array with updated descriptor\n const updated = [..._blades.value];\n updated[index] = { ...updated[index], error };\n _blades.value = updated;\n }\n\n function clearBladeError(bladeId: string): void {\n const index = _blades.value.findIndex((b) => b.id === bladeId);\n if (index === -1) return;\n\n const updated = [..._blades.value];\n updated[index] = { ...updated[index], error: undefined };\n _blades.value = updated;\n }\n\n // ── Title Management ───────────────────────────────────────────────────────\n\n function setBladeTitle(bladeId: string, title: string | undefined): void {\n const index = _blades.value.findIndex((b) => b.id === bladeId);\n if (index === -1) return;\n if (_blades.value[index].title === title) return; // no-op if unchanged\n\n const updated = [..._blades.value];\n updated[index] = { ...updated[index], title };\n _blades.value = updated;\n }\n\n // ── Query Management ──────────────────────────────────────────────────────\n\n function updateBladeQuery(bladeId: string, patch: Record<string, string>): void {\n const index = _blades.value.findIndex((b) => b.id === bladeId);\n if (index === -1) return;\n\n const current = _blades.value[index].query ?? {};\n const merged: Record<string, string> = { ...current };\n for (const [key, value] of Object.entries(patch)) {\n if (value === \"\" || value == null) {\n delete merged[key];\n } else {\n merged[key] = value;\n }\n }\n\n // No-op if nothing actually changed (avoids redundant reactive updates).\n const currentKeys = Object.keys(current);\n const mergedKeys = Object.keys(merged);\n if (currentKeys.length === mergedKeys.length && mergedKeys.every((k) => current[k] === merged[k])) {\n return;\n }\n\n const updated = [..._blades.value];\n updated[index] = { ...updated[index], query: merged };\n _blades.value = updated;\n }\n\n // ── Maximized Management ───────────────────────────────────────────────────\n\n function getMaximizedRef(id: string): Ref<boolean> {\n let r = _maximized.get(id);\n if (!r) {\n r = ref(false);\n _maximized.set(id, r);\n }\n return r;\n }\n function isMaximized(id: string): boolean {\n return _maximized.get(id)?.value ?? false;\n }\n function setMaximized(id: string, value: boolean): void {\n getMaximizedRef(id).value = value;\n }\n function toggleMaximized(id: string): void {\n const r = getMaximizedRef(id);\n r.value = !r.value;\n }\n\n // ── Internal: Restore (used by HistoryManager) ────────────────────────────\n\n function _restoreStack(descriptors: BladeDescriptor[]): void {\n // Clear all existing callbacks/guards\n for (const blade of _blades.value) {\n _cleanupBlade(blade.id);\n }\n _blades.value = descriptors;\n }\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n return {\n workspace,\n blades,\n activeBlade,\n openWorkspace,\n openBlade,\n closeBlade,\n closeChildren,\n replaceCurrentBlade,\n coverCurrentBlade,\n registerBeforeClose,\n unregisterBeforeClose,\n setBladeError,\n clearBladeError,\n setBladeTitle,\n updateBladeQuery,\n getMaximizedRef,\n isMaximized,\n setMaximized,\n toggleMaximized,\n _restoreStack,\n };\n}\n\n/**\n * Composable for accessing the BladeStack from within a component.\n * Must be used after BladeStack is provided via BladeStackKey.\n * @internal\n */\nexport function useBladeStack(): IBladeStack {\n const stack = inject(BladeStackKey);\n if (!stack) {\n throw new Error(\"[useBladeStack] BladeStack not found. Ensure BladeNavigationPlugin is installed.\");\n }\n return stack;\n}\n","import { inject, provide } from \"vue\";\nimport { createAiAgentService, type IAiAgentServiceInternal } from \"@core/plugins/ai-agent/services/ai-agent-service\";\nimport { AiAgentServiceKey, LanguageServiceKey, ToolbarServiceKey } from \"@framework/injection-keys\";\nimport type {\n IAiAgentService,\n IAiAgentConfig,\n IAiAgentMessage,\n IAiAgentBladeContext,\n} from \"@core/plugins/ai-agent/types\";\nimport { createLogger } from \"@core/utilities\";\nimport { hotkey } from \"@core/composables/useKeyboardShortcuts\";\nimport { useUser } from \"@core/composables/useUser\";\nimport { useBlade } from \"@core/composables/useBlade\";\nimport { useBladeStack } from \"@core/blade-navigation\";\nimport {\n AI_AGENT_TOOLBAR_BUTTON_ID,\n AI_AGENT_TOOLBAR_BUTTON_ICON,\n AI_AGENT_TOOLBAR_BUTTON_TITLE,\n} from \"@core/plugins/ai-agent/constants\";\nimport type { IToolbarService } from \"@core/services/toolbar-service\";\n\nconst logger = createLogger(\"use-ai-agent\");\n\n/**\n * Options for providing the AI agent service\n */\nexport interface ProvideAiAgentServiceOptions {\n /** Initial configuration for the AI agent */\n config?: Partial<IAiAgentConfig>;\n /**\n * Whether to add the AI button to all blade toolbars automatically.\n * Default: true\n */\n addGlobalToolbarButton?: boolean;\n isEmbedded?: boolean;\n}\n\n/**\n * Provides the AI agent service at the current component level.\n * Should be called once at the app level (in VcApp or plugin install).\n *\n * @param options - Configuration options\n */\nexport function provideAiAgentService(options?: ProvideAiAgentServiceOptions): IAiAgentServiceInternal {\n const languageService = inject(LanguageServiceKey);\n const { user, getAccessToken } = useUser();\n const { openBlade } = useBlade();\n const { blades, activeBlade } = useBladeStack();\n const isEmbedded = options?.isEmbedded;\n\n // Create the service\n const service = createAiAgentService({\n userGetter: () => {\n if (!user.value) return undefined;\n return {\n id: user.value.id,\n userName: user.value.userName,\n isAdministrator: user.value.isAdministrator,\n permissions: user.value.permissions,\n };\n },\n bladeGetter: (): IAiAgentBladeContext | null => {\n const currentBlade = activeBlade.value ?? blades.value[blades.value.length - 1];\n if (!currentBlade) return null;\n\n return {\n id: currentBlade.id,\n name: currentBlade.name,\n title: currentBlade.title,\n param: currentBlade.param,\n options: currentBlade.options,\n };\n },\n localeGetter: () => languageService?.currentLocale.value ?? \"en\",\n tokenGetter: getAccessToken,\n navigateToBlade: (bladeName: string, param?: string, bladeOptions?: Record<string, unknown>) => {\n openBlade({ name: bladeName, param, options: bladeOptions })\n .then(() => {\n logger.debug(`Navigated to blade: ${bladeName}`);\n })\n .catch((error) => {\n logger.warn(`Blade not found or cannot be opened: ${bladeName}`, error);\n });\n },\n initialConfig: options?.config,\n isEmbedded,\n });\n\n provide(AiAgentServiceKey, service);\n logger.debug(\"AiAgentService provided\");\n\n // Register global toolbar button with wildcard \"*\" if enabled\n const addGlobalToolbarButton = options?.addGlobalToolbarButton ?? true;\n if (addGlobalToolbarButton) {\n // Get toolbar service from injection (already created by VcShell plugin)\n const toolbarService = inject<IToolbarService | null>(ToolbarServiceKey, null);\n if (toolbarService) {\n toolbarService.registerToolbarItem(\n {\n id: AI_AGENT_TOOLBAR_BUTTON_ID,\n icon: AI_AGENT_TOOLBAR_BUTTON_ICON,\n title: AI_AGENT_TOOLBAR_BUTTON_TITLE,\n shortcut: hotkey.mod.i,\n clickHandler: () => {\n service.togglePanel();\n },\n },\n \"*\", // Wildcard for all blades\n );\n logger.debug(\"Global AI toolbar button registered with wildcard '*'\");\n } else {\n logger.warn(\"Toolbar service not available, AI button not registered\");\n }\n }\n\n return service;\n}\n\n/**\n * Return type for useAiAgent composable\n */\nexport interface UseAiAgentReturn {\n /** Current panel state (\"closed\" | \"open\" | \"expanded\") */\n panelState: IAiAgentService[\"panelState\"];\n /** Panel configuration */\n config: IAiAgentService[\"config\"];\n /** Current context (reactive) */\n context: IAiAgentService[\"context\"];\n /** Whether panel is open (not closed) */\n isOpen: IAiAgentService[\"isOpen\"];\n /** Whether panel is in expanded state */\n isExpanded: IAiAgentService[\"isExpanded\"];\n /** Total count of items in current context */\n totalItemsCount: IAiAgentService[\"totalItemsCount\"];\n /** Open the AI panel */\n openPanel: () => void;\n /** Close the AI panel */\n closePanel: () => void;\n /** Toggle panel open/close */\n togglePanel: () => void;\n /** Expand the panel to larger width */\n expandPanel: () => void;\n /** Collapse panel to normal width */\n collapsePanel: () => void;\n /** Update configuration */\n setConfig: (config: Partial<IAiAgentConfig>) => void;\n /** Send message to AI agent iframe */\n sendMessage: IAiAgentService[\"sendMessage\"];\n /** Register message handler, returns unsubscribe function */\n onMessage: (handler: (event: IAiAgentMessage) => void) => () => void;\n}\n\n/**\n * Composable for interacting with the AI agent panel.\n *\n * @example\n * ```typescript\n * const { togglePanel, isOpen, onMessage } = useAiAgent();\n *\n * // Toggle AI panel\n * const handleAiClick = () => togglePanel();\n *\n * // Listen for messages from AI agent\n * onMessage((message) => {\n * if (message.type === 'NAVIGATE_TO_APP') {\n * // Handle navigation request\n * }\n * });\n * ```\n */\nexport function useAiAgent(): UseAiAgentReturn | undefined {\n const service = inject(AiAgentServiceKey);\n if (!service) {\n logger.error(\"AiAgentService not found. Did you forget to call provideAiAgentService()?\");\n return;\n }\n\n return {\n // State\n panelState: service.panelState,\n config: service.config,\n context: service.context,\n isOpen: service.isOpen,\n isExpanded: service.isExpanded,\n totalItemsCount: service.totalItemsCount,\n\n // Panel control\n openPanel: service.openPanel,\n closePanel: service.closePanel,\n togglePanel: service.togglePanel,\n expandPanel: service.expandPanel,\n collapsePanel: service.collapsePanel,\n\n // Configuration\n setConfig: service.setConfig,\n\n // Communication\n sendMessage: service.sendMessage,\n onMessage: service.onMessage,\n };\n}\n\n/**\n * @deprecated The AI toolbar button is registered automatically by provideAiAgentService().\n * If you need a custom button, use useAiAgent().togglePanel directly.\n */\nexport function createAiAgentToolbarButton(options?: { title?: string; icon?: string }) {\n return {\n id: \"ai-agent-toggle\",\n icon: options?.icon ?? \"lucide-sparkles\",\n title: options?.title ?? \"AI Assistant\",\n clickHandler: () => {\n console.warn(\"[ai-agent] createAiAgentToolbarButton is deprecated. Use useAiAgent().togglePanel instead.\");\n },\n };\n}\n","<template>\n <svg\n :width=\"width\"\n :height=\"height\"\n viewBox=\"0 0 99 108\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"vc-virto-oz-logo\"\n >\n <!-- White hexagon background -->\n <path\n d=\"M40.1199 2.41576C45.6989 -0.805254 52.5724 -0.805253 58.1514 2.41576L89.2556 20.3738C94.8345 23.5948 98.2713 29.5475 98.2713 35.9895V71.9055C98.2713 78.3475 94.8345 84.3002 89.2556 87.5212L58.1514 105.479C52.5724 108.7 45.6989 108.7 40.1199 105.479L9.01574 87.5212C3.43678 84.3002 0 78.3475 0 71.9055V35.9895C0 29.5475 3.43678 23.5948 9.01574 20.3738L40.1199 2.41576Z\"\n fill=\"white\"\n />\n\n <!-- Static gradient spiral pattern (using foreignObject with conic-gradient) -->\n <g\n v-if=\"!animated\"\n :clip-path=\"`url(#${clipPathId})`\"\n >\n <g transform=\"matrix(0 -0.161514 0.160417 0 49.1357 53.9479)\">\n <foreignObject\n x=\"-334.01\"\n y=\"-334.01\"\n width=\"668.02\"\n height=\"668.02\"\n >\n <div\n xmlns=\"http://www.w3.org/1999/xhtml\"\n style=\"\n background: conic-gradient(\n from 90deg,\n rgba(255, 149, 51, 1) 0deg,\n rgba(255, 79, 187, 1) 43.2deg,\n rgba(234, 255, 79, 1) 143.654deg,\n rgba(28, 145, 252, 1) 252.692deg,\n rgba(154, 45, 248, 1) 316.8deg,\n rgba(255, 149, 51, 1) 360deg\n );\n height: 100%;\n width: 100%;\n opacity: 1;\n \"\n />\n </foreignObject>\n </g>\n </g>\n\n <!-- Animated gradient spiral pattern (using linearGradient with animate) -->\n <path\n v-else\n d=\"M72.9199 46.4165C73.2527 46.9495 73.5831 47.4996 73.9092 48.0679C78.4022 55.8976 79.0605 66.3551 76.7793 76.6079C74.5635 86.5668 69.6096 96.1504 62.9795 102.692L58.1514 105.48C52.5725 108.701 45.699 108.701 40.1201 105.48L21.665 94.8247C29.1398 95.4723 37.0781 94.4072 44.3848 91.9233C54.5984 88.4512 63.7463 82.1497 68.6807 73.6548C75.124 62.5619 75.4351 53.2694 72.9199 46.4165ZM56.5205 29.5093C65.5697 29.5331 75.1259 33.9964 83.0215 40.8853C89.9848 46.9608 95.5441 54.8286 98.2715 62.9478V71.9058C98.2715 78.3478 94.8348 84.301 89.2559 87.522L69.4658 98.9468C74.0688 92.6731 77.4601 84.9996 79.207 77.1479C81.5723 66.517 80.9666 55.3703 76.0654 46.8296C69.6817 35.7054 61.7917 30.789 54.6006 29.5396C55.2271 29.5179 55.867 29.5076 56.5205 29.5093ZM0 50.688C3.16812 57.476 8.04614 63.7935 13.8389 68.853C21.9305 75.9204 31.9368 80.6465 41.7578 80.6724C54.5833 80.706 62.7851 76.3308 67.4629 70.728C67.1684 71.2812 66.8584 71.8408 66.5303 72.4058C61.9844 80.2318 53.417 86.2251 43.584 89.5679C34.4355 92.6779 24.3375 93.4401 15.6328 91.3423L9.01562 87.522C3.43667 84.301 0 78.3478 0 71.9058V50.688ZM26.7559 10.1313C22.5672 16.2131 19.6599 23.483 18.2695 30.9126C16.3077 41.3962 17.3358 52.3558 22.2188 60.8647C28.6034 71.9905 36.4946 76.9061 43.6865 78.1548C43.0594 78.1765 42.4188 78.1868 41.7646 78.1851C32.7113 78.1612 23.2602 73.7801 15.4746 66.98C8.2197 60.6434 2.52684 52.3035 0 43.7075V35.9897C6.33247e-05 29.5479 3.43687 23.5955 9.01562 20.3745L26.7559 10.1313ZM51.2432 31.6978C54.0287 31.7659 57.0796 32.4389 60.1875 33.9976C58.8529 33.7029 57.5584 33.677 56.3965 33.9722L57.0088 36.3833C58.4774 36.0102 60.6741 36.4134 63.0332 37.8237C65.3553 39.212 67.6865 41.4953 69.375 44.5923C70.7081 47.0376 71.6489 50.015 71.8535 53.4839C71.4414 52.1828 70.818 51.0505 69.9824 50.1929L68.2012 51.9282C69.2585 53.0135 70.0076 55.1176 69.9658 57.8657C69.9246 60.5708 69.1121 63.731 67.2744 66.7417C65.8225 69.1203 63.7129 71.4251 60.8086 73.3374C61.7311 72.329 62.4012 71.2217 62.7266 70.0679L60.333 69.3931C59.9218 70.8514 58.4742 72.5523 56.0732 73.8901C53.71 75.207 50.5672 76.0837 47.041 75.9976C44.2551 75.9294 41.204 75.2549 38.0957 73.6958C39.4307 73.9907 40.7254 74.0184 41.8877 73.7231L41.2754 71.312C39.8069 71.6851 37.6101 71.2818 35.251 69.8716C32.9289 68.4834 30.5977 66.2 28.9092 63.103C27.5754 60.6565 26.6337 57.6775 26.4297 54.2065C26.8418 55.5096 27.4661 56.6438 28.3027 57.5024L30.084 55.7661C29.0267 54.6807 28.2775 52.5767 28.3193 49.8286C28.3606 47.1236 29.173 43.9633 31.0107 40.9526C32.4621 38.5751 34.5702 36.2706 37.4727 34.3589C36.5514 35.3666 35.8827 36.4736 35.5576 37.6265L37.9512 38.3013C38.3625 36.8429 39.8101 35.142 42.2109 33.8042C44.5742 32.4874 47.717 31.6116 51.2432 31.6978ZM40.1201 2.4165C45.6991 -0.804509 52.5724 -0.804509 58.1514 2.4165L75.6777 12.5356C68.4683 12.0708 60.8765 13.1991 53.8691 15.6333C43.6671 19.1774 34.5353 25.5492 29.6035 34.0396C23.1612 45.1305 22.8486 54.4223 25.3623 61.2749C25.0301 60.7429 24.7004 60.1936 24.375 59.6265C19.8639 51.765 18.8286 41.4457 20.7139 31.3706C22.4486 22.1007 26.633 13.1734 32.6709 6.71631L40.1201 2.4165ZM54.6855 17.9829C63.3703 14.966 72.9092 14.0715 81.3008 15.7817L89.2559 20.3745C94.8346 23.5955 98.2714 29.5479 98.2715 35.9897V56.4692C95.0606 49.9731 90.2759 43.9144 84.6562 39.0112C76.4636 31.8632 66.3524 27.0488 56.5273 27.0229C43.6978 26.9893 35.4935 31.3659 30.8164 36.9712C31.1117 36.4161 31.4247 35.8554 31.7539 35.2886C36.3024 27.4582 44.8633 21.395 54.6855 17.9829Z\"\n fill=\"url(#virto-oz-gradient-animated)\"\n />\n\n <!-- White center circle -->\n <path\n d=\"M72.1266 54.0945C72.1266 60.0873 74.3028 71.0379 60.6238 82.8517C65.2871 73.0587 55.8339 77.1002 49.1209 77.1002C36.4152 77.1002 26.1152 66.8002 26.1152 54.0945C26.1152 41.3889 36.4152 31.0889 49.1209 31.0889C61.8266 31.0889 72.1266 41.3889 72.1266 54.0945Z\"\n fill=\"white\"\n />\n\n <!-- Center dots (eyes) -->\n <ellipse\n cx=\"49.12\"\n cy=\"54.09\"\n rx=\"4.05\"\n ry=\"4.05\"\n fill=\"#6C6C6C\"\n />\n <ellipse\n cx=\"60.62\"\n cy=\"54.09\"\n rx=\"4.05\"\n ry=\"4.05\"\n fill=\"#6C6C6C\"\n />\n <ellipse\n cx=\"37.62\"\n cy=\"54.09\"\n rx=\"4.05\"\n ry=\"4.05\"\n fill=\"#6C6C6C\"\n />\n\n <!-- Definitions -->\n <defs>\n <!-- Clip path for static conic gradient (spiral shape) -->\n <clipPath\n v-if=\"!animated\"\n :id=\"clipPathId\"\n >\n <path\n d=\"M72.9199 46.4165C73.2527 46.9495 73.5831 47.4996 73.9092 48.0679C78.4022 55.8976 79.0605 66.3551 76.7793 76.6079C74.5635 86.5668 69.6096 96.1504 62.9795 102.692L58.1514 105.48C52.5725 108.701 45.699 108.701 40.1201 105.48L21.665 94.8247C29.1398 95.4723 37.0781 94.4072 44.3848 91.9233C54.5984 88.4512 63.7463 82.1497 68.6807 73.6548C75.124 62.5619 75.4351 53.2694 72.9199 46.4165ZM56.5205 29.5093C65.5697 29.5331 75.1259 33.9964 83.0215 40.8853C89.9848 46.9608 95.5441 54.8286 98.2715 62.9478V71.9058C98.2715 78.3478 94.8348 84.301 89.2559 87.522L69.4658 98.9468C74.0688 92.6731 77.4601 84.9996 79.207 77.1479C81.5723 66.517 80.9666 55.3703 76.0654 46.8296C69.6817 35.7054 61.7917 30.789 54.6006 29.5396C55.2271 29.5179 55.867 29.5076 56.5205 29.5093ZM0 50.688C3.16812 57.476 8.04614 63.7935 13.8389 68.853C21.9305 75.9204 31.9368 80.6465 41.7578 80.6724C54.5833 80.706 62.7851 76.3308 67.4629 70.728C67.1684 71.2812 66.8584 71.8408 66.5303 72.4058C61.9844 80.2318 53.417 86.2251 43.584 89.5679C34.4355 92.6779 24.3375 93.4401 15.6328 91.3423L9.01562 87.522C3.43667 84.301 0 78.3478 0 71.9058V50.688ZM26.7559 10.1313C22.5672 16.2131 19.6599 23.483 18.2695 30.9126C16.3077 41.3962 17.3358 52.3558 22.2188 60.8647C28.6034 71.9905 36.4946 76.9061 43.6865 78.1548C43.0594 78.1765 42.4188 78.1868 41.7646 78.1851C32.7113 78.1612 23.2602 73.7801 15.4746 66.98C8.2197 60.6434 2.52684 52.3035 0 43.7075V35.9897C6.33247e-05 29.5479 3.43687 23.5955 9.01562 20.3745L26.7559 10.1313ZM51.2432 31.6978C54.0287 31.7659 57.0796 32.4389 60.1875 33.9976C58.8529 33.7029 57.5584 33.677 56.3965 33.9722L57.0088 36.3833C58.4774 36.0102 60.6741 36.4134 63.0332 37.8237C65.3553 39.212 67.6865 41.4953 69.375 44.5923C70.7081 47.0376 71.6489 50.015 71.8535 53.4839C71.4414 52.1828 70.818 51.0505 69.9824 50.1929L68.2012 51.9282C69.2585 53.0135 70.0076 55.1176 69.9658 57.8657C69.9246 60.5708 69.1121 63.731 67.2744 66.7417C65.8225 69.1203 63.7129 71.4251 60.8086 73.3374C61.7311 72.329 62.4012 71.2217 62.7266 70.0679L60.333 69.3931C59.9218 70.8514 58.4742 72.5523 56.0732 73.8901C53.71 75.207 50.5672 76.0837 47.041 75.9976C44.2551 75.9294 41.204 75.2549 38.0957 73.6958C39.4307 73.9907 40.7254 74.0184 41.8877 73.7231L41.2754 71.312C39.8069 71.6851 37.6101 71.2818 35.251 69.8716C32.9289 68.4834 30.5977 66.2 28.9092 63.103C27.5754 60.6565 26.6337 57.6775 26.4297 54.2065C26.8418 55.5096 27.4661 56.6438 28.3027 57.5024L30.084 55.7661C29.0267 54.6807 28.2775 52.5767 28.3193 49.8286C28.3606 47.1236 29.173 43.9633 31.0107 40.9526C32.4621 38.5751 34.5702 36.2706 37.4727 34.3589C36.5514 35.3666 35.8827 36.4736 35.5576 37.6265L37.9512 38.3013C38.3625 36.8429 39.8101 35.142 42.2109 33.8042C44.5742 32.4874 47.717 31.6116 51.2432 31.6978ZM40.1201 2.4165C45.6991 -0.804509 52.5724 -0.804509 58.1514 2.4165L75.6777 12.5356C68.4683 12.0708 60.8765 13.1991 53.8691 15.6333C43.6671 19.1774 34.5353 25.5492 29.6035 34.0396C23.1612 45.1305 22.8486 54.4223 25.3623 61.2749C25.0301 60.7429 24.7004 60.1936 24.375 59.6265C19.8639 51.765 18.8286 41.4457 20.7139 31.3706C22.4486 22.1007 26.633 13.1734 32.6709 6.71631L40.1201 2.4165ZM54.6855 17.9829C63.3703 14.966 72.9092 14.0715 81.3008 15.7817L89.2559 20.3745C94.8346 23.5955 98.2714 29.5479 98.2715 35.9897V56.4692C95.0606 49.9731 90.2759 43.9144 84.6562 39.0112C76.4636 31.8632 66.3524 27.0488 56.5273 27.0229C43.6978 26.9893 35.4935 31.3659 30.8164 36.9712C31.1117 36.4161 31.4247 35.8554 31.7539 35.2886C36.3024 27.4582 44.8633 21.395 54.6855 17.9829Z\"\n />\n </clipPath>\n\n <!-- Animated gradient -->\n <linearGradient\n v-if=\"animated\"\n id=\"virto-oz-gradient-animated\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"0\"\n y1=\"0\"\n x2=\"99\"\n y2=\"108\"\n >\n <stop\n offset=\"0%\"\n stop-color=\"#FF9533\"\n >\n <animate\n attributeName=\"stop-color\"\n values=\"#FF9533;#FF4FBB;#EAFF4F;#1C91FC;#9A2DF8;#FF9533\"\n dur=\"4s\"\n repeatCount=\"indefinite\"\n />\n </stop>\n <stop\n offset=\"25%\"\n stop-color=\"#FF4FBB\"\n >\n <animate\n attributeName=\"stop-color\"\n values=\"#FF4FBB;#EAFF4F;#1C91FC;#9A2DF8;#FF9533;#FF4FBB\"\n dur=\"4s\"\n repeatCount=\"indefinite\"\n />\n </stop>\n <stop\n offset=\"50%\"\n stop-color=\"#EAFF4F\"\n >\n <animate\n attributeName=\"stop-color\"\n values=\"#EAFF4F;#1C91FC;#9A2DF8;#FF9533;#FF4FBB;#EAFF4F\"\n dur=\"4s\"\n repeatCount=\"indefinite\"\n />\n </stop>\n <stop\n offset=\"75%\"\n stop-color=\"#1C91FC\"\n >\n <animate\n attributeName=\"stop-color\"\n values=\"#1C91FC;#9A2DF8;#FF9533;#FF4FBB;#EAFF4F;#1C91FC\"\n dur=\"4s\"\n repeatCount=\"indefinite\"\n />\n </stop>\n <stop\n offset=\"100%\"\n stop-color=\"#9A2DF8\"\n >\n <animate\n attributeName=\"stop-color\"\n values=\"#9A2DF8;#FF9533;#FF4FBB;#EAFF4F;#1C91FC;#9A2DF8\"\n dur=\"4s\"\n repeatCount=\"indefinite\"\n />\n </stop>\n </linearGradient>\n </defs>\n </svg>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\n\nexport interface Props {\n /** Width in pixels */\n width?: number;\n /** Height in pixels */\n height?: number;\n /** Enable animated gradient */\n animated?: boolean;\n}\n\nwithDefaults(defineProps<Props>(), {\n width: 22,\n height: 24,\n animated: false,\n});\n\n// Generate unique ID for clip path to avoid conflicts when multiple logos are rendered\nconst clipPathId = computed(() => `virto-oz-clip-${Math.random().toString(36).substring(2, 11)}`);\n</script>\n\n<style lang=\"scss\">\n.vc-virto-oz-logo {\n display: block;\n}\n</style>\n","<template>\n <span class=\"vc-shortcut-kbd\">\n <template\n v-for=\"(part, index) in parts\"\n :key=\"index\"\n >\n <span\n v-if=\"separated && index > 0\"\n class=\"vc-shortcut-kbd__plus\"\n >+</span\n >\n <kbd class=\"vc-shortcut-kbd__key\">{{ part }}</kbd>\n </template>\n </span>\n</template>\n\n<script lang=\"ts\" setup>\nwithDefaults(\n defineProps<{\n parts: string[];\n /** Show a `+` between chips (Windows/Linux). macOS glyphs sit flush. */\n separated?: boolean;\n }>(),\n { separated: false },\n);\n</script>\n\n<style lang=\"scss\">\n.vc-shortcut-kbd {\n @apply tw-inline-flex tw-items-center tw-gap-1;\n\n &__plus {\n @apply tw-text-[10px] tw-text-[color:var(--neutrals-300)];\n }\n\n &__key {\n @apply tw-inline-flex tw-items-center tw-justify-center;\n @apply tw-min-w-[20px] tw-h-[18px] tw-px-1;\n @apply tw-rounded-sm tw-leading-none;\n @apply tw-text-[10px] tw-font-medium;\n @apply tw-text-[color:var(--neutrals-500)];\n @apply tw-bg-[color:var(--neutrals-100)];\n @apply tw-border tw-border-solid tw-border-[color:var(--neutrals-200)];\n box-shadow: 0 1px 0 var(--neutrals-200);\n }\n}\n</style>\n","<template>\n <div class=\"vc-ai-agent-header\">\n <div class=\"vc-ai-agent-header__icon\">\n <VcVirtoOzLogo\n :width=\"22\"\n :height=\"24\"\n show-dots\n />\n </div>\n\n <div class=\"vc-ai-agent-header__wrapper\">\n <div class=\"vc-ai-agent-header__content\">\n <div class=\"vc-ai-agent-header__title\">\n {{ title }}\n </div>\n </div>\n </div>\n\n <div class=\"vc-ai-agent-header__controls\">\n <VcTooltip\n v-if=\"isExpanded\"\n placement=\"bottom\"\n >\n <div\n class=\"vc-ai-agent-header__button\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t('COMPONENTS.ORGANISMS.VC_BLADE_HEADER.RESTORE')\"\n :aria-keyshortcuts=\"expandAria\"\n @click=\"$emit('collapse')\"\n @keydown.enter.prevent=\"$emit('collapse')\"\n @keydown.space.prevent=\"$emit('collapse')\"\n >\n <VcIcon icon=\"lucide-minus\" />\n </div>\n <template #tooltip>\n <span class=\"tw-inline-flex tw-items-center tw-gap-2\">\n {{ t(\"COMPONENTS.ORGANISMS.VC_BLADE_HEADER.RESTORE\") }}\n <ShortcutKbd\n :parts=\"expandFmt.parts\"\n :separated=\"!isMac\"\n />\n </span>\n </template>\n </VcTooltip>\n <VcTooltip\n v-else\n placement=\"bottom\"\n >\n <div\n class=\"vc-ai-agent-header__button\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t('COMPONENTS.ORGANISMS.VC_BLADE_HEADER.MAXIMIZE')\"\n :aria-keyshortcuts=\"expandAria\"\n @click=\"$emit('expand')\"\n @keydown.enter.prevent=\"$emit('expand')\"\n @keydown.space.prevent=\"$emit('expand')\"\n >\n <VcIcon icon=\"lucide-panel-top\" />\n </div>\n <template #tooltip>\n <span class=\"tw-inline-flex tw-items-center tw-gap-2\">\n {{ t(\"COMPONENTS.ORGANISMS.VC_BLADE_HEADER.MAXIMIZE\") }}\n <ShortcutKbd\n :parts=\"expandFmt.parts\"\n :separated=\"!isMac\"\n />\n </span>\n </template>\n </VcTooltip>\n <VcTooltip placement=\"bottom\">\n <div\n class=\"vc-ai-agent-header__button\"\n role=\"button\"\n tabindex=\"0\"\n :aria-label=\"t('COMPONENTS.ORGANISMS.VC_BLADE_HEADER.CLOSE')\"\n :aria-keyshortcuts=\"escapeAria\"\n @click=\"$emit('close')\"\n @keydown.enter.prevent=\"$emit('close')\"\n @keydown.space.prevent=\"$emit('close')\"\n >\n <VcIcon icon=\"lucide-x\" />\n </div>\n <template #tooltip>\n <span class=\"tw-inline-flex tw-items-center tw-gap-2\">\n {{ t(\"COMPONENTS.ORGANISMS.VC_BLADE_HEADER.CLOSE\") }}\n <ShortcutKbd\n :parts=\"escapeFmt.parts\"\n :separated=\"!isMac\"\n />\n </span>\n </template>\n </VcTooltip>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed } from \"vue\";\nimport { useI18n } from \"vue-i18n\";\nimport VcVirtoOzLogo from \"@core/plugins/ai-agent/components/_internal/VcVirtoOzLogo.vue\";\nimport { VcIcon } from \"@ui/components/atoms/vc-icon\";\nimport { VcTooltip } from \"@ui/components/atoms/vc-tooltip\";\nimport ShortcutKbd from \"@ui/components/organisms/vc-blade/_internal/toolbar/ShortcutKbd.vue\";\nimport { hotkey, formatShortcut, useKeyboardShortcuts } from \"@core/composables/useKeyboardShortcuts\";\n\ndefineProps<{\n title?: string;\n isExpanded: boolean;\n itemsCount?: number;\n}>();\n\ndefineEmits<{\n (e: \"close\"): void;\n (e: \"expand\"): void;\n (e: \"collapse\"): void;\n}>();\n\nconst { t } = useI18n();\nconst { isMac } = useKeyboardShortcuts();\nconst escapeFmt = computed(() => formatShortcut(hotkey.escape, isMac));\nconst expandFmt = computed(() => formatShortcut(hotkey.mod.backslash, isMac));\nconst escapeAria = computed(() => escapeFmt.value.aria);\nconst expandAria = computed(() => expandFmt.value.aria);\n</script>\n\n<style lang=\"scss\">\n.vc-ai-agent-header {\n @apply tw-shrink-0 tw-flex tw-items-center tw-py-0 tw-px-6 tw-border-solid tw-border-b;\n height: var(--blade-header-height, 70px);\n background-color: var(--blade-header-background-color, var(--additional-50));\n border-color: var(--blade-header-border-color, var(--neutrals-200));\n\n &__left {\n @apply tw-flex tw-flex-row tw-items-center;\n }\n\n &__icon {\n @apply tw-mr-3;\n color: var(--primary-500);\n }\n\n &__wrapper {\n @apply tw-flex tw-items-center tw-justify-between tw-grow tw-basis-0 tw-overflow-hidden;\n }\n\n &__content {\n @apply tw-overflow-hidden;\n }\n\n &__title {\n @apply tw-truncate tw-font-semibold;\n color: var(--blade-header-title-color, var(--neutrals-950));\n font-size: var(--blade-header-title-font-size, 19px);\n }\n\n &__controls {\n @apply tw-flex tw-items-center;\n }\n\n &__button {\n @apply tw-ml-2.5 tw-cursor-pointer;\n color: var(--blade-header-button-color, var(--neutrals-400));\n\n &:hover {\n color: var(--blade-header-button-color-hover, var(--neutrals-500));\n }\n }\n\n &__badge {\n @apply tw-ml-2 tw-text-xs tw-font-medium tw-px-1.5 tw-py-0.5 tw-rounded-full;\n background-color: var(--ai-panel-badge-bg);\n color: var(--ai-panel-badge-color);\n }\n}\n</style>\n","<template>\r\n <div class=\"vc-ai-agent-loader\">\r\n <div class=\"vc-ai-agent-loader__content\">\r\n <div class=\"vc-ai-agent-loader__logo\">\r\n <VcVirtoOzLogo\r\n :width=\"80\"\r\n :height=\"87\"\r\n animated\r\n />\r\n </div>\r\n <p\r\n v-if=\"text\"\r\n class=\"vc-ai-agent-loader__text\"\r\n >\r\n {{ text }}\r\n </p>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport VcVirtoOzLogo from \"@core/plugins/ai-agent/components/_internal/VcVirtoOzLogo.vue\";\r\n\r\nexport interface Props {\r\n /** Loading text to display */\r\n text?: string;\r\n}\r\n\r\ndefineProps<Props>();\r\n</script>\r\n\r\n<style lang=\"scss\">\r\n@keyframes virto-oz-float {\r\n 0%,\r\n 100% {\r\n transform: translateY(0);\r\n }\r\n 50% {\r\n transform: translateY(-6px);\r\n }\r\n}\r\n\r\n@keyframes virto-oz-glow {\r\n 0%,\r\n 100% {\r\n filter: drop-shadow(0 4px 15px rgba(255, 149, 51, 0.4));\r\n }\r\n 25% {\r\n filter: drop-shadow(0 4px 15px rgba(255, 79, 187, 0.4));\r\n }\r\n 50% {\r\n filter: drop-shadow(0 4px 15px rgba(28, 145, 252, 0.4));\r\n }\r\n 75% {\r\n filter: drop-shadow(0 4px 15px rgba(154, 45, 248, 0.4));\r\n }\r\n}\r\n\r\n.vc-ai-agent-loader {\r\n @apply tw-absolute tw-inset-0 tw-flex tw-items-center tw-justify-center tw-z-[var(--z-local-sticky)];\r\n background: linear-gradient(135deg, var(--additional-50) 0%, var(--neutrals-50) 100%);\r\n\r\n &__content {\r\n @apply tw-flex tw-flex-col tw-items-center tw-gap-5;\r\n }\r\n\r\n &__logo {\r\n animation:\r\n virto-oz-float 2.5s ease-in-out infinite,\r\n virto-oz-glow 4s linear infinite;\r\n }\r\n\r\n &__text {\r\n @apply tw-text-sm tw-m-0 tw-font-medium;\r\n color: var(--neutrals-600);\r\n }\r\n}\r\n</style>\r\n","<template>\n <div class=\"vc-ai-agent-iframe\">\n <!-- Loading overlay -->\n <Transition name=\"fade\">\n <VcAiAgentLoader\n v-if=\"isLoading && url\"\n :text=\"$t('AI_AGENT.LOADING')\"\n />\n </Transition>\n\n <iframe\n v-if=\"url\"\n ref=\"iframeRef\"\n :src=\"url\"\n class=\"vc-ai-agent-iframe__frame\"\n :class=\"{ 'vc-ai-agent-iframe__frame--loading': isLoading }\"\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox\"\n allow=\"clipboard-read; clipboard-write\"\n @load=\"onLoad\"\n />\n <div\n v-else\n class=\"vc-ai-agent-iframe__placeholder\"\n >\n <VcIcon\n icon=\"lucide-sparkles\"\n size=\"xl\"\n class=\"vc-ai-agent-iframe__placeholder-icon\"\n />\n <p class=\"vc-ai-agent-iframe__placeholder-text\">AI Agent URL not configured</p>\n </div>\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, watch } from \"vue\";\nimport VcAiAgentLoader from \"@core/plugins/ai-agent/components/_internal/VcAiAgentLoader.vue\";\nimport { createLogger } from \"@core/utilities\";\nimport { VcIcon } from \"@ui/components/atoms/vc-icon\";\n\nconst logger = createLogger(\"ai-agent-iframe\");\n\nconst props = defineProps<{\n url: string;\n}>();\n\nconst emit = defineEmits<{\n (e: \"iframe-ready\", iframe: HTMLIFrameElement): void;\n}>();\n\nconst iframeRef = ref<HTMLIFrameElement | null>(null);\nconst isLoading = ref(true);\n\n// Emit iframe ref as soon as it's available in the DOM (before @load)\n// This is critical because chatbot sends CHAT_READY before @load fires\nwatch(\n iframeRef,\n (iframe) => {\n if (iframe) {\n emit(\"iframe-ready\", iframe);\n }\n },\n { immediate: true },\n);\n\nconst onLoad = () => {\n // Hide loader after iframe loads\n isLoading.value = false;\n logger.debug(\"Iframe loaded\");\n};\n\n// Reset loading state when URL changes\nwatch(\n () => props.url,\n () => {\n isLoading.value = true;\n },\n);\n</script>\n\n<style lang=\"scss\">\n// Fade transition\n.fade-enter-active,\n.fade-leave-active {\n transition: opacity 0.3s ease;\n}\n\n.fade-enter-from,\n.fade-leave-to {\n opacity: 0;\n}\n\n.vc-ai-agent-iframe {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col tw-relative;\n\n &__frame {\n @apply tw-w-full tw-h-full tw-border-0 tw-flex-1;\n background-color: var(--ai-panel-iframe-bg, var(--additional-50));\n transition: opacity 0.3s ease;\n\n &--loading {\n opacity: 0;\n }\n }\n\n &__placeholder {\n @apply tw-w-full tw-h-full tw-flex tw-flex-col tw-items-center tw-justify-center tw-gap-4;\n background-color: var(--ai-panel-placeholder-bg, var(--neutrals-50));\n }\n\n &__placeholder-icon {\n color: var(--ai-panel-placeholder-icon-color, var(--neutrals-300));\n }\n\n &__placeholder-text {\n @apply tw-text-sm tw-m-0;\n color: var(--ai-panel-placeholder-text-color, var(--neutrals-500));\n }\n}\n</style>\n","<template>\n <Transition name=\"ai-panel-slide\">\n <div\n v-if=\"isOpen\"\n ref=\"panelRef\"\n class=\"vc-ai-agent-panel\"\n :class=\"{\n 'vc-ai-agent-panel--expanded': isExpanded,\n }\"\n :style=\"panelStyle\"\n :inert=\"inert || undefined\"\n >\n <VcAiAgentHeader\n :title=\"config.title\"\n :is-expanded=\"isExpanded\"\n :items-count=\"totalItemsCount\"\n @close=\"closePanel\"\n @expand=\"expandPanel\"\n @collapse=\"collapsePanel\"\n />\n\n <div class=\"vc-ai-agent-panel__content\">\n <VcAiAgentIframe\n :url=\"config.url\"\n @iframe-ready=\"onIframeReady\"\n />\n </div>\n </div>\n </Transition>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed, onUnmounted, inject, ref } from \"vue\";\nimport { useEventListener } from \"@vueuse/core\";\nimport { AiAgentServiceKey, EmbeddedModeKey } from \"@framework/injection-keys\";\nimport type { IAiAgentServiceInternal } from \"@core/plugins/ai-agent/services/ai-agent-service\";\nimport VcAiAgentHeader from \"@core/plugins/ai-agent/components/_internal/VcAiAgentHeader.vue\";\nimport VcAiAgentIframe from \"@core/plugins/ai-agent/components/_internal/VcAiAgentIframe.vue\";\nimport { hotkey, matchesEvent, useKeyboardShortcuts } from \"@core/composables/useKeyboardShortcuts\";\n\nconst { isMac } = useKeyboardShortcuts();\n\ndefineProps<{\n inert?: boolean;\n}>();\n\n// Inject AI agent service\nconst aiAgentService = inject(AiAgentServiceKey) as IAiAgentServiceInternal | undefined;\nconst isEmbedded = inject(EmbeddedModeKey, false);\n\nif (!aiAgentService) {\n console.error(\"[VcAiAgentPanel] AiAgentService not provided\");\n}\n\n// Destructure service properties\nconst config = computed(\n () => aiAgentService?.config.value ?? { url: \"\", title: \"AI Assistant\", width: 362, expandedWidth: 500 },\n);\nconst isOpen = computed(() => !isEmbedded && (aiAgentService?.isOpen.value ?? false));\nconst isExpanded = computed(() => aiAgentService?.isExpanded.value ?? false);\nconst totalItemsCount = computed(() => aiAgentService?.totalItemsCount.value ?? 0);\n\n// Panel style with dynamic width\nconst panelStyle = computed(() => ({\n width: isExpanded.value ? `${config.value.expandedWidth ?? 500}px` : `${config.value.width ?? 362}px`,\n}));\n\n// Panel control methods\nconst closePanel = () => aiAgentService?.closePanel();\nconst expandPanel = () => aiAgentService?.expandPanel();\nconst collapsePanel = () => aiAgentService?.collapsePanel();\nconst panelRef = ref<HTMLElement | null>(null);\n\n// Consume Escape while the panel is open so the blade-nav shortcut dispatcher\n// (which bails on defaultPrevented) does not close the blade behind it.\n// Listening on document's bubble phase still runs before the dispatcher's\n// window bubble-phase listener (target -> ... -> document -> window), while\n// deferring to any overlay above the panel (dropdown/popover/modal) that\n// consumes Escape earlier in the bubble chain.\nuseEventListener(document, \"keydown\", (event: KeyboardEvent) => {\n if (!isOpen.value) return;\n if (event.isComposing) return;\n if (event.defaultPrevented) return; // a higher overlay already consumed Escape\n if (event.key === \"Escape\") {\n event.preventDefault();\n closePanel();\n return;\n }\n // The iframe itself is activeElement while the user types in chat. Claim\n // mod+\\ only for panel focus; otherwise the focused blade must receive it.\n if (matchesEvent(hotkey.mod.backslash, event, isMac)) {\n const activeElement = document.activeElement;\n if (!activeElement || !panelRef.value?.contains(activeElement)) return;\n\n event.preventDefault();\n if (isExpanded.value) {\n collapsePanel();\n } else {\n expandPanel();\n }\n }\n});\n\n// Handle iframe ready event\nconst onIframeReady = (iframe: HTMLIFrameElement) => {\n aiAgentService?._setIframeRef(iframe);\n};\n\n// Clean up iframe ref on unmount\nonUnmounted(() => {\n aiAgentService?._setIframeRef(null);\n});\n</script>\n\n<style lang=\"scss\">\n:root {\n --ai-panel-bg: var(--additional-50);\n --ai-panel-border-color: var(--neutrals-200);\n --ai-panel-shadow: -4px 0 12px rgba(0, 0, 0, 0.08);\n --ai-panel-header-bg: var(--primary-50);\n --ai-panel-header-border: var(--neutrals-200);\n --ai-panel-icon-color: var(--primary-500);\n --ai-panel-title-color: var(--secondary-950);\n --ai-panel-badge-bg: var(--primary-100);\n --ai-panel-badge-color: var(--primary-700);\n --ai-panel-button-color: var(--neutrals-600);\n --ai-panel-button-hover-bg: var(--neutrals-100);\n --ai-panel-button-hover-color: var(--neutrals-900);\n --ai-panel-iframe-bg: var(--additional-50);\n --ai-panel-placeholder-bg: var(--neutrals-50);\n --ai-panel-placeholder-icon-color: var(--neutrals-300);\n --ai-panel-placeholder-text-color: var(--neutrals-500);\n}\n\n// Slide transition for panel\n.ai-panel-slide-enter-active,\n.ai-panel-slide-leave-active {\n transition: transform var(--app-panel-transition-duration, 0.3s)\n var(--app-panel-transition-timing, cubic-bezier(0.4, 0, 0.2, 1));\n}\n\n.ai-panel-slide-enter-from,\n.ai-panel-slide-leave-to {\n transform: translateX(100%);\n}\n\n.vc-ai-agent-panel {\n @apply tw-flex tw-flex-col tw-h-full tw-shrink-0;\n background-color: var(--ai-panel-bg);\n box-shadow: var(--ai-panel-shadow);\n // Width transition for expand/collapse\n transition: width var(--app-panel-transition-duration, 0.3s)\n var(--app-panel-transition-timing, cubic-bezier(0.4, 0, 0.2, 1));\n overflow: hidden;\n border-width: 1px;\n border-style: solid;\n border-color: var(--ai-panel-border-color);\n\n &--expanded {\n // Additional expanded styles if needed\n }\n\n &__content {\n @apply tw-flex-1 tw-overflow-hidden tw-flex tw-flex-col tw-pt-3;\n }\n}\n</style>\n"],"names":["DEFAULT_AI_AGENT_CONFIG","AI_AGENT_URL_ENV_KEY","EMBEDDED_TO_HOST_MESSAGE_TYPES","HOST_TO_EMBEDDED_MESSAGE_TYPES","AI_AGENT_TOOLBAR_BUTTON_ID","AI_AGENT_TOOLBAR_BUTTON_ICON","AI_AGENT_TOOLBAR_BUTTON_TITLE","logger","createLogger","createPanelController","panelState","ref","isInitialized","isOpen","computed","isExpanded","open","close","toBladeContext","blade","createContextManager","options","userGetter","bladeGetter","localeGetter","tokenGetter","bladeContexts","getActiveBladeContext","activeBlade","contextItems","contextType","contextSuggestions","totalItemsCount","items","type","suggestions","bladeId","targetBladeId","accessToken","cloneDeep","createMessageTransport","getConfig","isEmbedded","navigateToBlade","closePanel","iframeRef","shallowRef","pendingInitContext","isListenerRegistered","messageHandlers","chatReadyHandlers","handleChatMessage","payload","navPayload","normalized","handler","e","handleIncomingMessage","event","allowedOrigins","expectedSource","message","chatMessage","h","iframe","targetOrigin","parentOrigin","createAiAgentService","initialConfig","config","panel","contextManager","transport","context","flushPendingInit","watch","openPanel","togglePanel","_setIframeRef","_setContextData","cleared","newConfig","MODIFIERS","makeBuilder","mods","_target","prop","hotkey","MAC_GLYPH","WIN_WORD","KEY_LABEL","KEY_ARIA","keyLabel","key","keyAria","formatShortcut","def","isMac","useCtrl","useMeta","parts","ariaMods","aria","CODE_KEYS","NAMED_KEYS","isLetter","isDigit","isFunctionKey","expectedCode","expectedEventKey","keyMatches","code","evKey","matchesEvent","expectedCtrl","expectedMeta","expectedAlt","expectedShift","NON_TEXT_INPUT_TYPES","isTextInputFocused","el","tag","attr","useIsMac","useKeyboardShortcuts","bladeNavigationInstance","bladeStackInstance","bladeMessagingInstance","bladeRegistryInstance","setBladeNavigationInstance","instance","setBladeStackInstance","setBladeMessagingInstance","setBladeRegistryInstance","CONTEXT_ERROR_SUFFIX","requireContext","method","useBlade","_stack","getCurrentInstance","inject","BladeStackKey","_messaging","BladeMessagingKey","bladeStack","messaging","descriptor","BladeDescriptorKey","bannersRef","BladeBannersKey","id","param","query","closable","expanded","name","activeChildParam","selfId","b","_bladeDataProvided","provideBladeData","data","reactiveData","isRef","provide","BladeDataKey","openBlade","isWorkspace","bladeEvent","parentId","closeSelf","closeChildren","replaceWith","coverWith","callParent","args","exposeToChildren","methods","onBeforeClose","guard","setError","error","clearError","_bannerCounter","addBanner","removeBanner","clearBanners","_activatedRegistered","_deactivatedRegistered","onActivated","callback","val","onDeactivated","createWorkspaceDescriptor","ctx","createChildDescriptor","createReplacementDescriptor","replacedParentId","createCoveringDescriptor","hiddenBladeId","_idCounter","generateBladeId","createBladeStack","bladeRegistry","hasAccess","urlSink","NOOP_URL_SINK","_blades","_beforeCloseGuards","_onOpenCallbacks","_onCloseCallbacks","_maximized","workspace","blades","i","_cleanupBlade","_resolveUrl","registration","_descriptorCtx","_checkGuards","bladesToClose","_closeBladesCleanup","_openWorkspace","bladeData","_openBlade","parentIndex","_closeBlade","index","lastIndex","updated","_replaceCurrentBlade","current","currentIndex","_coverCurrentBlade","_closeChildren","children","_syncOpened","verb","openWorkspace","replaceCurrentBlade","coverCurrentBlade","closeBlade","prevented","registerBeforeClose","unregisterBeforeClose","setBladeError","clearBladeError","setBladeTitle","title","updateBladeQuery","patch","merged","value","currentKeys","mergedKeys","k","getMaximizedRef","isMaximized","setMaximized","toggleMaximized","_restoreStack","descriptors","useBladeStack","stack","provideAiAgentService","languageService","LanguageServiceKey","user","getAccessToken","useUser","service","currentBlade","bladeName","bladeOptions","AiAgentServiceKey","toolbarService","ToolbarServiceKey","useAiAgent","createAiAgentToolbarButton","clipPathId","_createElementBlock","__props","_createElementVNode","_openBlock","_hoisted_3","_hoisted_5","_cache","_hoisted_1","_Fragment","_renderList","part","_hoisted_2","_toDisplayString","t","useI18n","escapeFmt","expandFmt","escapeAria","expandAria","_createVNode","VcVirtoOzLogo","_hoisted_4","_hoisted_6","_createBlock","_unref","VcTooltip","_hoisted_8","_createTextVNode","ShortcutKbd","$emit","VcIcon","_hoisted_10","_hoisted_12","props","emit","__emit","isLoading","onLoad","_Transition","VcAiAgentLoader","$t","_normalizeClass","aiAgentService","EmbeddedModeKey","panelStyle","expandPanel","collapsePanel","panelRef","useEventListener","activeElement","onIframeReady","onUnmounted","VcAiAgentHeader","VcAiAgentIframe"],"mappings":";;;;;AAKO,MAAMA,KAA0C;AAAA,EACrD,KAAK;AAAA,EACL,OAAO;AAAA,EACP,OAAO;AAAA,EACP,eAAe;AAAA;AAAA,EAEf,gBAAgB,CAAA;AAClB,GAKaC,KAAuB,oBAuBvBC,KAAiC;AAAA,EAC5C,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,mBAAmB;AAAA,EACnB,kBAAkB;AACpB,GAKaC,KAAiC;AAAA,EAC5C,qBAAqB;AAAA,EACrB,iBAAiB;AACnB,GAuCaC,KAA6B,mBAK7BC,KAA+B,mBAK/BC,KAAgC,gBClGvCC,KAASC,EAAa,gBAAgB;AAerC,SAASC,KAAyC;AACvD,QAAMC,IAAaC,EAAuB,QAAQ,GAC5CC,IAAgBD,EAAI,EAAK,GAEzBE,IAASC,EAAS,MAAMJ,EAAW,UAAU,QAAQ,GACrDK,IAAaD,EAAS,MAAMJ,EAAW,UAAU,UAAU,GAE3DM,IAAO,MAAM;AACjB,IAAIN,EAAW,UAAU,aACvBA,EAAW,QAAQ,QACnBH,GAAO,MAAM,cAAc;AAAA,EAE/B,GAEMU,IAAQ,MAAM;AAClB,IAAAP,EAAW,QAAQ,UACnBE,EAAc,QAAQ,IACtBL,GAAO,MAAM,uCAAuC;AAAA,EACtD;AAwBA,SAAO;AAAA,IACL,YAAAG;AAAA,IACA,QAAAG;AAAA,IACA,YAAAE;AAAA,IACA,eAAAH;AAAA,IACA,MAAAI;AAAA,IACA,OAAAC;AAAA,IACA,QA7Ba,MAAM;AACnB,MAAIP,EAAW,UAAU,WACvBM,EAAA,IAEAC,EAAA;AAAA,IAEJ;AAAA,IAwBE,QAtBa,MAAM;AACnB,MAAIP,EAAW,UAAU,WACvBA,EAAW,QAAQ,YACnBH,GAAO,MAAM,gBAAgB;AAAA,IAEjC;AAAA,IAkBE,UAhBe,MAAM;AACrB,MAAIG,EAAW,UAAU,eACvBA,EAAW,QAAQ,QACnBH,GAAO,MAAM,iBAAiB;AAAA,IAElC;AAAA,IAYE,kBAAkB,MAAM;AACtB,MAAAK,EAAc,QAAQ;AAAA,IACxB;AAAA,EAAA;AAEJ;AC9DA,MAAML,KAASC,EAAa,kBAAkB;AAwB9C,SAASU,GAAeC,GAAuD;AAC7E,SAAKA,IAGE;AAAA,IACL,IAAIA,EAAM;AAAA,IACV,MAAMA,EAAM;AAAA,IACZ,OAAOA,EAAM,SAASA,EAAM;AAAA,IAC5B,OAAOA,EAAM;AAAA,EAAA,IANN,EAAE,IAAI,WAAW,MAAM,WAAW,OAAO,UAAA;AAQpD;AAEO,SAASC,GAAqBC,GAAgD;AACnF,QAAM,EAAE,YAAAC,GAAY,aAAAC,GAAa,cAAAC,GAAc,aAAAC,MAAgBJ,GAEzDK,IAAgBf,EAEpB,oBAAI,KAAK,GAELgB,IAAwB,MAAM;AAClC,UAAMC,IAAcL,EAAA;AACpB,WAAKK,IAOHF,EAAc,MAAM,IAAIE,EAAY,EAAE,KAAK;AAAA,MACzC,OAAO,CAAA;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA,IATR;AAAA,MACL,OAAO,CAAA;AAAA,MACP,MAAM;AAAA,MACN,aAAa;AAAA,IAAA;AAAA,EASnB,GAEMC,IAAef,EAAS,MAAMa,EAAA,EAAwB,KAAK,GAC3DG,IAAchB,EAAS,MAAMa,EAAA,EAAwB,IAAI,GACzDI,IAAqBjB,EAAS,MAAMa,EAAA,EAAwB,WAAW,GACvEK,IAAkBlB,EAAS,MAAMe,EAAa,MAAM,MAAM;AAqDhE,SAAO;AAAA,IACL,cAAAA;AAAA,IACA,aAAAC;AAAA,IACA,oBAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,gBAxDqB,CACrBC,GACAC,GACAC,GACAC,MACyB;AAIzB,YAAMC,IAAgBd,KAAe,MAAMa;AAC3C,aAAKC,IAKDJ,EAAM,WAAW,KAAK,CAACE,KACzBT,EAAc,MAAM,OAAOW,CAAa,GACxC9B,GAAO,MAAM,8BAA8B8B,CAAa,EAAE,GACnD,EAAE,SAAS,GAAA,MAElBX,EAAc,MAAM,IAAIW,GAAe,EAAE,OAAAJ,GAAO,MAAAC,GAAM,aAAAC,GAAa,GACnE5B,GAAO,MAAM,0BAA0B8B,CAAa,YAAYJ,EAAM,MAAM,WAAWC,CAAI,EAAE,GACtF,EAAE,SAAS,GAAA,MAXlB3B,GAAO,KAAK,gDAAgD,GACrD,EAAE,SAAS,GAAA;AAAA,IAYtB;AAAA,IAiCE,kBA/BuB,YAA0C;AACjE,YAAM+B,IAAcb,IAAgB,MAAMA,EAAA,KAAkB,SAAa;AACzE,aAAO;AAAA,QACL,QAAQH,KAAc,MAAM;AAAA,QAC5B,QAAQE,EAAA;AAAA,QACR,OAAON,GAAeK,GAAa;AAAA,QACnC,aAAaO,EAAY;AAAA,QACzB,OAAOS,GAAUV,EAAa,KAAK;AAAA,QACnC,aAAaE,EAAmB,QAAQQ,GAAUR,EAAmB,KAAK,IAAI;AAAA,QAC9E,aAAAO;AAAA,MAAA;AAAA,IAEJ;AAAA,IAqBE,oBAnByB,YAA4C;AACrE,YAAMA,IAAcb,IAAgB,MAAMA,EAAA,KAAkB,SAAa;AACzE,aAAO;AAAA,QACL,OAAOP,GAAeK,GAAa;AAAA,QACnC,aAAaO,EAAY;AAAA,QACzB,OAAOS,GAAUV,EAAa,KAAK;AAAA,QACnC,aAAaE,EAAmB,QAAQQ,GAAUR,EAAmB,KAAK,IAAI;AAAA,QAC9E,QAAQP,EAAA;AAAA,QACR,aAAAc;AAAA,MAAA;AAAA,IAEJ;AAAA,EASE;AAEJ;AChIA,MAAM/B,IAASC,EAAa,oBAAoB;AAuBzC,SAASgC,GAAuBnB,GAAoD;AACzF,QAAM,EAAE,WAAAoB,GAAW,YAAAC,GAAY,iBAAAC,GAAiB,YAAAC,MAAevB,GAEzDwB,IAAkDC,GAAW,IAAI,GACjEC,IAAqBpC,EAAI,EAAK,GAC9BqC,IAAuBrC,EAAI,EAAK,GAEhCsC,wBAAsB,IAAA,GACtBC,wBAAwB,IAAA;AAG9B,WAASC,EAAkBjB,GAAckB,GAAwB;AAC/D,YAAQlB,GAAA;AAAA,MACN,KAAK,mBAAmB;AACtB,cAAMmB,IAAaD;AACnB,QAAIT,KAAmBU,GAAY,cACjCV,EAAgBU,EAAW,WAAWA,EAAW,OAAOA,EAAW,OAAO,GAC1E9C,EAAO,MAAM,4BAA4B8C,EAAW,SAAS,EAAE;AAEjE;AAAA,MACF;AAAA;AAAA;AAAA;AAAA;AAAA,MAKA,KAAK,eAAe;AAClB,QAAIT,MACFA,EAAA,GACArC,EAAO,MAAM,sCAAsC;AAErD;AAAA,MACF;AAAA,IAEE;AAIJ,UAAM+C,IAA8B;AAAA,MAClC,MAAApB;AAAA,MACA,SAAAkB;AAAA,MACA,WAAW,KAAK,IAAA;AAAA,IAAI;AAEtB,IAAAH,EAAgB,QAAQ,CAACM,MAAY;AACnC,UAAI;AACF,QAAAA,EAAQD,CAAU;AAAA,MACpB,SAASE,GAAG;AACVjD,QAAAA,EAAO,MAAM,kBAAkBiD,CAAC;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAASC,EAAsBC,GAA2B;AAExD,UAAMC,IADSlB,EAAA,EACe,kBAAkB,CAAA;AAChD,QAAIkB,EAAe,WAAW,GAAG;AAC/BpD,MAAAA,EAAO;AAAA,QACL;AAAA,QAEA,EAAE,QAAQmD,EAAM,QAAQ,MAAMA,EAAM,MAAM,KAAA;AAAA,MAAK;AAEjD;AAAA,IACF;AACA,QAAIC,EAAe,SAAS,GAAG,GAAG;AAChCpD,MAAAA,EAAO;AAAA,QACL;AAAA,MAAA;AAGF;AAAA,IACF;AACA,QAAI,CAACoD,EAAe,SAASD,EAAM,MAAM;AACvC;AAGF,UAAME,IAAiBlB,IAAa,OAAO,SAASG,EAAU,OAAO;AACrE,QAAI,CAACe,KAAkBF,EAAM,WAAWE;AACtC;AAGF,UAAMC,IAAUH,EAAM;AACtB,QAAI,GAACG,GAAS,QAAQ,OAAOA,EAAQ,QAAS;AAI9C,cAFAtD,EAAO,MAAM,qBAAqBsD,EAAQ,IAAI,EAAE,GAExCA,EAAQ,MAAA;AAAA;AAAA,QAEd,KAAK,mBAAmB;AACtB,cAAInB,GAAY;AACd,kBAAMoB,IAAcD,EAAQ;AAC5B,YAAIC,GAAa,QACfX,EAAkBW,EAAY,MAAMA,EAAY,OAAO;AAAA,UAE3D;AACA;AAAA,QACF;AAAA;AAAA,QAEA,KAAK;AACH,UAAAZ,EAAkB,QAAQ,CAACa,MAAM;AAC/B,gBAAI;AACF,cAAAA,EAAA;AAAA,YACF,SAASP,GAAG;AACVjD,cAAAA,EAAO,MAAM,4BAA4BiD,CAAC;AAAA,YAC5C;AAAA,UACF,CAAC;AACD;AAAA;AAAA,QAEF;AACE,UAAAL,EAAkBU,EAAQ,MAAMA,EAAQ,OAAO;AAC/C;AAAA,MAAA;AAAA,EAEN;AAEA,SAAO;AAAA,IACL,WAAAhB;AAAA,IACA,oBAAAE;AAAA,IACA,sBAAAC;AAAA,IAEA,aAAagB,GAAkC;AAC7C,MAAAnB,EAAU,QAAQmB,GAClBzD,EAAO,MAAM,mBAAmByD,IAAS,cAAc,MAAM;AAAA,IAC/D;AAAA,IAEA,aAAaH,GAA8C;AACzD,UAAI,CAAChB,EAAU,OAAO,eAAe;AACnCtC,QAAAA,EAAO,KAAK,2CAA2C;AACvD;AAAA,MACF;AACA,YAAM0D,IAAexB,IAAY,iBAAiB,CAAC;AACnD,UAAI,CAACwB,KAAgBA,MAAiB,KAAK;AACzC1D,QAAAA,EAAO;AAAA,UACL;AAAA,UAEA,EAAE,MAAMsD,EAAQ,KAAA;AAAA,QAAK;AAEvB;AAAA,MACF;AACA,MAAAhB,EAAU,MAAM,cAAc,YAAYgB,GAASI,CAAY,GAC/D1D,EAAO,MAAM,mBAAmBsD,EAAQ,IAAI,EAAE;AAAA,IAChD;AAAA,IAEA,aAAaA,GAA8C;AACzD,UAAI,CAAC,OAAO,UAAU,OAAO,WAAW,QAAQ;AAC9CtD,QAAAA,EAAO,KAAK,sCAAsC;AAClD;AAAA,MACF;AACA,YAAM2D,IAAezB,IAAY;AACjC,UAAI,CAACyB,KAAgBA,MAAiB,KAAK;AACzC3D,QAAAA,EAAO;AAAA,UACL;AAAA,UAEA,EAAE,MAAMsD,EAAQ,KAAA;AAAA,QAAK;AAEvB;AAAA,MACF;AACA,aAAO,OAAO,YAAYA,GAASK,CAAY,GAC/C3D,EAAO,MAAM,mBAAmBsD,EAAQ,IAAI,EAAE;AAAA,IAChD;AAAA,IAEA,iBAAiB;AACf,MAAKb,EAAqB,UACxB,OAAO,iBAAiB,WAAWS,CAAqB,GACxDT,EAAqB,QAAQ;AAAA,IAEjC;AAAA,IAEA,gBAAgB;AACd,MAAIA,EAAqB,UACvB,OAAO,oBAAoB,WAAWS,CAAqB,GAC3DT,EAAqB,QAAQ;AAAA,IAEjC;AAAA,IAEA,YAAYO,GAAqB;AAC/B,aAAAL,EAAkB,IAAIK,CAAO,GACtB,MAAM;AACX,QAAAL,EAAkB,OAAOK,CAAO;AAAA,MAClC;AAAA,IACF;AAAA,IAEA,UAAUA,GAA2C;AACnD,aAAAN,EAAgB,IAAIM,CAAO,GACpB,MAAM;AACX,QAAAN,EAAgB,OAAOM,CAAO;AAAA,MAChC;AAAA,IACF;AAAA,EAAA;AAEJ;ACzMA,MAAMhD,KAASC,EAAa,kBAAkB;AA8CvC,SAAS2D,GAAqB9C,GAA+D;AAClG,QAAM;AAAA,IACJ,YAAAC;AAAA,IACA,aAAAC;AAAA,IACA,cAAAC;AAAA,IACA,aAAAC;AAAA,IACA,iBAAAkB;AAAA,IACA,eAAAyB;AAAA,IACA,YAAA1B,IAAa;AAAA,EAAA,IACXrB,GAEEgD,IAAS1D,EAAoB,EAAE,GAAGX,IAAyB,GAAGoE,GAAe,GAG7EE,IAAQ7D,GAAA,GAER8D,IAAiBnD,GAAqB;AAAA,IAC1C,YAAAE;AAAA,IACA,aAAAC;AAAA,IACA,cAAAC;AAAA,IACA,aAAAC;AAAA,EAAA,CACD,GAEK+C,IAAYhC,GAAuB;AAAA,IACvC,WAAW,MAAM6B,EAAO;AAAA,IACxB,YAAA3B;AAAA,IACA,iBAAAC;AAAA,IACA,YAAY,MAAM2B,EAAM,MAAA;AAAA,EAAM,CAC/B,GAGKG,IAAU3D,EAA0B,OAAO;AAAA,IAC/C,MAAMQ,EAAA;AAAA,IACN,cAAcC,EAAA;AAAA,IACd,OAAOgD,EAAe,aAAa;AAAA,EAAA,EACnC,GAKIG,IAAmB,YAAY;AACnC,QAAIF,EAAU,mBAAmB,SAASA,EAAU,UAAU,OAAO,eAAe;AAClF,MAAAA,EAAU,mBAAmB,QAAQ,IACrCF,EAAM,cAAc,QAAQ;AAC5B,YAAMlB,IAAU,MAAMmB,EAAe,iBAAA;AACrC,MAAAC,EAAU,aAAa,EAAE,MAAM,gBAAgB,SAAApB,GAAS,GACxD7C,GAAO,MAAM,8BAA8B;AAAA,IAC7C;AAAA,EACF;AAGA,EAAAiE,EAAU,YAAY,MAAM;AAC1B,IAAIA,EAAU,UAAU,OAAO,iBAC7BF,EAAM,cAAc,QAAQ,IAC5BC,EAAe,iBAAA,EAAmB,KAAK,CAACnB,MAAY;AAClD,MAAAoB,EAAU,aAAa,EAAE,MAAM,gBAAgB,SAAApB,GAAS,GACxD7C,GAAO,KAAK,kCAAkC;AAAA,IAChD,CAAC,MAEDiE,EAAU,mBAAmB,QAAQ,IACrCjE,GAAO,KAAK,oEAAoE;AAAA,EAEpF,CAAC,GAGDoE,EAAMH,EAAU,WAAW,MAAME,EAAA,CAAkB,GAGnDC;AAAA,IACE,OAAO,EAAE,cAAcF,EAAQ,MAAM,cAAc,OAAOA,EAAQ,MAAM;IACxE,YAAY;AACV,UAAI/B,GAAY;AACd,cAAMU,IAAU,MAAMmB,EAAe,iBAAA;AACrC,QAAAC,EAAU,aAAa,EAAE,MAAM,qBAAqB,SAAApB,GAAS;AAC7D;AAAA,MACF;AACA,UAAIkB,EAAM,OAAO,SAASA,EAAM,cAAc,SAASE,EAAU,UAAU,OAAO,eAAe;AAC/F,cAAMpB,IAAU,MAAMmB,EAAe,mBAAA;AACrC,QAAAC,EAAU,aAAa,EAAE,MAAM,kBAAkB,SAAApB,GAAS;AAAA,MAC5D;AAAA,IACF;AAAA,IACA,EAAE,MAAM,GAAA;AAAA,EAAK;AAIf,QAAMwB,IAAY,MAAOlC,IAAa8B,EAAU,aAAa,EAAE,MAAM,kBAAA,CAAmB,IAAIF,EAAM,KAAA,GAC5F1B,IAAa,MAAOF,IAAa8B,EAAU,aAAa,EAAE,MAAM,kBAAA,CAAmB,IAAIF,EAAM,MAAA,GAC7FO,IAAc,MAAOnC,IAAa8B,EAAU,aAAa,EAAE,MAAM,kBAAA,CAAmB,IAAIF,EAAM,OAAA,GAG9FQ,IAAgB,CAACd,MAAqC;AAC1D,IAAAQ,EAAU,aAAaR,CAAM,GAC7BU,EAAA;AAAA,EACF,GAGMK,IAAkB,CACtB9C,GACAC,GACAC,GACAC,MACG;AACH,UAAM,EAAE,SAAA4C,MAAYT,EAAe,eAAetC,GAAOC,GAAMC,GAAaC,CAAO;AACnF,IAAIM,KAAcsC,KAChBR,EAAU,aAAa,EAAE,MAAM,mBAAA,CAAoB;AAAA,EAEvD;AAGA,SAAAA,EAAU,eAAA,GAGN9B,MACF8B,EAAU,aAAa;AAAA,IACrB,MAAM;AAAA,IACN,SAAS,EAAE,mBAAmB,CAAC,UAAU,EAAA;AAAA,EAAE,CAC5C,GACDjE,GAAO,KAAK,kDAAkD,IAGzD;AAAA;AAAA,IAEL,YAAY+D,EAAM;AAAA,IAClB,QAAAD;AAAA,IACA,SAAAI;AAAA,IACA,QAAQ3D,EAAS,MAAM,CAAC4B,KAAc4B,EAAM,OAAO,KAAK;AAAA,IACxD,YAAYA,EAAM;AAAA,IAClB,iBAAiBC,EAAe;AAAA;AAAA,IAGhC,WAAAK;AAAA,IACA,YAAAhC;AAAA,IACA,aAAAiC;AAAA,IACA,aAAa,MAAMP,EAAM,OAAA;AAAA,IACzB,eAAe,MAAMA,EAAM,SAAA;AAAA;AAAA,IAG3B,WAAW,CAACW,MAAuC;AACjD,MAAAZ,EAAO,QAAQ,EAAE,GAAGA,EAAO,OAAO,GAAGY,EAAA;AAAA,IACvC;AAAA;AAAA,IAGA,aAAa,CAAC/C,GAA0BkB,MAAqB;AAC3D,MAAAoB,EAAU,aAAa,EAAE,MAAAtC,GAAM,SAAAkB,EAAA,CAAS;AAAA,IAC1C;AAAA,IACA,WAAWoB,EAAU;AAAA;AAAA,IAGrB,WAAWA,EAAU;AAAA,IACrB,eAAAM;AAAA,IACA,iBAAiBN,EAAU;AAAA,IAC3B,gBAAgBA,EAAU;AAAA,IAC1B,iBAAAO;AAAA,EAAA;AAEJ;ACrJA,MAAMG,yBAAqC,IAAI,CAAC,OAAO,QAAQ,QAAQ,OAAO,OAAO,CAAC;AAItF,SAASC,GAAYC,GAAyD;AAC5E,SAAO,IAAI;AAAA,IACT,CAAA;AAAA,IACA;AAAA,MACE,IAAIC,GAASC,GAAM;AACjB,YAAI,SAAOA,KAAS,YAAYA,MAAS;AACzC,iBAAIJ,GAAU,IAAII,CAAI,IACbH,GAAY,EAAE,GAAGC,GAAM,CAACE,CAAgB,GAAG,IAAM,IAGnD,EAAE,KAAKA,GAAM,GAAGF,EAAA;AAAA,MACzB;AAAA,IAAA;AAAA,EACF;AAEJ;AAMO,MAAMG,KAAwBJ,GAAY,CAAA,CAAE,GCzF7CK,KAAY,EAAE,MAAM,KAAK,KAAK,KAAK,OAAO,KAAK,MAAM,IAAA,GACrDC,KAAW,EAAE,MAAM,QAAQ,KAAK,OAAO,OAAO,SAAS,MAAM,OAAA,GAG7DC,KAAoC;AAAA,EACxC,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AACT,GAGMC,KAAmC;AAAA,EACvC,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AACT;AAEA,SAASC,GAASC,GAAqB;AACrC,SAAIA,KAAOH,KAAkBA,GAAUG,CAAG,KACtCA,EAAI,WAAW,GAAUA,EAAI,YAAA;AAEnC;AAEA,SAASC,GAAQD,GAAqB;AACpC,SAAIA,KAAOF,KAAiBA,GAASE,CAAG,IACpCA,EAAI,WAAW,IAAUA,EAAI,YAAA,IAC1BA,EAAI,OAAO,CAAC,EAAE,gBAAgBA,EAAI,MAAM,CAAC;AAClD;AAOO,SAASE,GAAeC,GAAyBC,GAAmD;AACzG,QAAMC,IAAU,CAAC,CAACF,EAAI,QAAS,CAAC,CAACA,EAAI,OAAO,CAACC,GACvCE,IAAU,CAAC,CAACH,EAAI,QAAS,CAAC,CAACA,EAAI,OAAOC,GAEtCG,IAAkB,CAAA,GAClBC,IAAqB,CAAA;AAE3B,EAAIJ,KAEEC,KAASE,EAAM,KAAKZ,GAAU,IAAI,GAClCQ,EAAI,OAAKI,EAAM,KAAKZ,GAAU,GAAG,GACjCQ,EAAI,SAAOI,EAAM,KAAKZ,GAAU,KAAK,GACrCW,KAASC,EAAM,KAAKZ,GAAU,IAAI,MAElCU,KAASE,EAAM,KAAKX,GAAS,IAAI,GACjCU,KAASC,EAAM,KAAKX,GAAS,IAAI,GACjCO,EAAI,OAAKI,EAAM,KAAKX,GAAS,GAAG,GAChCO,EAAI,SAAOI,EAAM,KAAKX,GAAS,KAAK,IAKtCS,KAASG,EAAS,KAAK,SAAS,GAChCF,KAASE,EAAS,KAAK,MAAM,GAC7BL,EAAI,OAAKK,EAAS,KAAK,KAAK,GAC5BL,EAAI,SAAOK,EAAS,KAAK,OAAO,GAEpCD,EAAM,KAAKR,GAASI,EAAI,GAAG,CAAC;AAC5B,QAAMM,IAAO,CAAC,GAAGD,GAAUP,GAAQE,EAAI,GAAG,CAAC,EAAE,KAAK,GAAG;AAErD,SAAO,EAAE,OAAAI,GAAO,MAAAE,EAAA;AAClB;ACvFA,MAAMC,KAAoC;AAAA,EACxC,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AACT,GAGMC,KAAqC;AAAA,EACzC,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,SAAS;AAAA,EACT,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AACd;AAEA,SAASC,GAASZ,GAAsB;AACtC,SAAOA,EAAI,WAAW,KAAKA,KAAO,OAAOA,KAAO;AAClD;AACA,SAASa,GAAQb,GAAsB;AACrC,SAAOA,EAAI,WAAW,KAAKA,KAAO,OAAOA,KAAO;AAClD;AACA,SAASc,GAAcd,GAAsB;AAC3C,SAAO,oBAAoB,KAAKA,CAAG;AACrC;AAGO,SAASe,GAAaf,GAAiC;AAC5D,MAAIY,GAASZ,CAAG,UAAU,MAAMA,EAAI,aAAa;AACjD,MAAIa,GAAQb,CAAG,EAAG,QAAO,QAAQA,CAAG;AACpC,MAAIA,KAAOU,GAAW,QAAOA,GAAUV,CAAG;AAE5C;AAGO,SAASgB,GAAiBhB,GAAiC;AAChE,MAAIA,KAAOW,GAAY,QAAOA,GAAWX,CAAG;AAC5C,MAAIc,GAAcd,CAAG,EAAG,QAAOA,EAAI,YAAA;AAErC;AAEA,SAASiB,GAAWd,GAAyBtC,GAA+B;AAC1E,QAAMqD,IAAOH,GAAaZ,EAAI,GAAG;AACjC,MAAIe,MAAS,OAAW,QAAOrD,EAAM,SAASqD;AAC9C,QAAMC,IAAQH,GAAiBb,EAAI,GAAG;AACtC,SAAIgB,MAAU,SAAkBtD,EAAM,QAAQsD,IACvC;AACT;AAOO,SAASC,GAAajB,GAAyBtC,GAAsBuC,GAAyB;AACnG,QAAMiB,IAAe,CAAC,CAAClB,EAAI,QAAS,CAAC,CAACA,EAAI,OAAO,CAACC,GAC5CkB,IAAe,CAAC,CAACnB,EAAI,QAAS,CAAC,CAACA,EAAI,OAAOC,GAC3CmB,IAAc,CAAC,CAACpB,EAAI,KACpBqB,IAAgB,CAAC,CAACrB,EAAI;AAK5B,SAHItC,EAAM,YAAYwD,KAClBxD,EAAM,YAAYyD,KAClBzD,EAAM,WAAW0D,KACjB1D,EAAM,aAAa2D,IAAsB,KAEtCP,GAAWd,GAAKtC,CAAK;AAC9B;AAGA,MAAM4D,yBAAgD,IAAI;AAAA,EACxD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,SAASC,KAA8B;AAC5C,QAAMC,IAAK,SAAS;AACpB,MAAI,CAACA,EAAI,QAAO;AAChB,QAAMC,IAAMD,EAAG;AACf,MAAIC,MAAQ,QAAS,QAAO,CAACH,GAAqB,IAAKE,EAAwB,IAAI;AAEnF,MADIC,MAAQ,cAAcA,MAAQ,YAC9BD,EAAG,sBAAsB,GAAM,QAAO;AAG1C,QAAME,IAAOF,EAAG,aAAa,iBAAiB;AAC9C,SAAOE,MAAS,UAAUA,MAAS;AACrC;AC3FO,SAASC,KAAoB;AAClC,SAAI,OAAO,YAAc,MAAoB,KACtC,wBAAwB,KAAK,UAAU,SAAS;AACzD;AAaO,SAASC,KAAmD;AACjE,QAAM3B,IAAQ0B,GAAA;AACd,SAAO;AAAA,IACL,QAAApC;AAAA,IACA,OAAAU;AAAA,IACA,gBAAgB,CAACD,MAA4BD,GAAeC,GAAKC,CAAK;AAAA,EAAA;AAE1E;ACrBO,IAAI4B,IACAC,IACAC,IACAC;AAEJ,SAASC,GAA2BC,GAAuC;AAChF,EAAAL,KAA0BK;AAC5B;AAEO,SAASC,GAAsBD,GAA6B;AACjE,EAAAJ,KAAqBI;AACvB;AAEO,SAASE,GAA0BF,GAAiC;AACzE,EAAAH,KAAyBG;AAC3B;AAEO,SAASG,GAAyBH,GAAgC;AACvE,EAAAF,KAAwBE;AAC1B;ACmBA,MAAMI,KACJ;AAGF,SAASC,EAAeC,GAAuB;AAC7C,QAAM,IAAI,MAAM,cAAcA,CAAM;AAAA,EAA6BF,EAAoB,EAAE;AACzF;AA0BO,SAASG,KAAyE;AAEvF,QAAMC,KACHC,OAAuBC,EAAOC,IAAe,MAAS,IAAI,WAAcf,IACrEgB,KACHH,OAAuBC,EAAOG,IAAmB,MAAS,IAAI,WAAchB;AAE/E,MAAI,CAACW,KAAU,CAACI;AACd,UAAM,IAAI;AAAA,MACR;AAAA,IAAA;AAMJ,QAAME,IAAaN,GACbO,IAAYH,GAGZI,IAAaP,GAAA,IAAuBC,EAAOO,IAAoB,MAAS,IAAI,QAG5EC,IAAaT,GAAA,IAAuBC,EAAOS,IAAiB,MAAS,IAAI,QAGzEC,IAAKxI,EAAS,OACboI,KAAYX,EAAe,IAAI,GAC7BW,EAAY,MAAM,GAC1B,GACKK,IAAQzI,EAAS,OAChBoI,KAAYX,EAAe,OAAO,GAChCW,EAAY,MAAM,MAC1B,GACK7H,IAAUP,EAAS,OAClBoI,KAAYX,EAAe,SAAS,GAClCW,EAAY,MAAM,QAC1B,GACKM,IAAQ1I,EAAS,OAChBoI,KAAYX,EAAe,OAAO,GAChCW,EAAY,MAAM,MAC1B,GACKO,IAAW3I,EAAS,OACnBoI,KAAYX,EAAe,UAAU,GACnCW,EAAY,MAAM,aAAa,OACvC,GACKQ,IAAW5I,EAAS,OACnBoI,KAAYX,EAAe,UAAU,GAC3BS,EAAW,YAAY,OACvB,OAAOE,EAAY,MAAM,GACzC,GACKS,IAAO7I,EAAS,OACfoI,KAAYX,EAAe,MAAM,GAC/BW,EAAY,MAAM,KAC1B,GAKKU,IAAmB9I,EAA6B,MAAM;AAC1D,QAAI,CAACoI,EAAY;AACjB,UAAMW,IAASX,EAAW,MAAM;AAChC,WAAOF,EAAW,OAAO,MAAM,KAAK,CAACc,MAAMA,EAAE,aAAaD,CAAM,GAAG;AAAA,EACrE,CAAC;AAID,MAAIE,IAAqB;AAEzB,WAASC,EAAiBC,GAA+C;AACvE,QAAIF,GAAoB;AACtB,cAAQ;AAAA,QACN;AAAA,MAAA;AAEF;AAAA,IACF;AACA,IAAAA,IAAqB;AAErB,UAAMG,IAAeC,GAAMF,CAAI,IAAIA,IAAOtJ,EAAIsJ,CAAI;AAClD,IAAAG,GAAQC,IAAcH,CAAY;AAAA,EACpC;AAIA,iBAAeI,EAAU5G,GAAkE;AACzF,UAAM,EAAE,aAAA6G,GAAa,GAAGC,EAAA,IAAe9G;AAEvC,QAAI6G;AAEF,YAAMvB,EAAW,cAAcwB,CAAU;AAAA,SACpC;AACL,YAAMC,KAAWvB,GAAY,MAAM;AACnC,MAAIuB,KAEF,MAAMzB,EAAW,UAAU,EAAE,GAAGwB,GAAY,UAAAC,IAAU,IAGtD,MAAMzB,EAAW,UAAUwB,CAAU;AAAA,IAEzC;AAAA,EACF;AAIA,iBAAeE,IAA8B;AAC3C,WAAKxB,KAAYX,EAAe,aAAa,GACtCS,EAAW,WAAWE,EAAY,MAAM,EAAE;AAAA,EACnD;AAEA,iBAAeyB,IAA+B;AAC5C,IAAKzB,KAAYX,EAAe,iBAAiB,GACjD,MAAMS,EAAW,cAAcE,EAAY,MAAM,EAAE;AAAA,EACrD;AAEA,iBAAe0B,EAAYlH,GAAsC;AAC/D,IAAKwF,KAAYX,EAAe,eAAe,GAC/C,MAAMS,EAAW,oBAAoB;AAAA,MACnC,GAAGtF;AAAA,MACH,UAAUwF,EAAY,MAAM;AAAA,IAAA,CAC7B;AAAA,EACH;AAEA,iBAAe2B,EAAUnH,GAAsC;AAC7D,IAAKwF,KAAYX,EAAe,aAAa,GAC7C,MAAMS,EAAW,kBAAkB;AAAA,MACjC,GAAGtF;AAAA,MACH,UAAUwF,EAAY,MAAM;AAAA,IAAA,CAC7B;AAAA,EACH;AAIA,iBAAe4B,EAAwBtC,GAAgBuC,GAA4B;AACjF,WAAK7B,KAAYX,EAAe,cAAc,GACvCU,EAAU,WAAcC,EAAY,MAAM,IAAIV,GAAQuC,CAAI;AAAA,EACnE;AAEA,WAASC,EAAiBC,GAAwD;AAChF,IAAK/B,KAAYX,EAAe,oBAAoB,GACpDU,EAAU,iBAAiBC,EAAY,MAAM,IAAI+B,CAAO;AAAA,EAC1D;AAIA,WAASC,EAAcC,GAAqC;AAC1D,IAAKjC,KAAYX,EAAe,iBAAiB,GACjDS,EAAW,oBAAoBE,EAAY,MAAM,IAAIiC,CAAK;AAAA,EAC5D;AAIA,WAASC,GAASC,GAAsB;AACtC,IAAKnC,KAAYX,EAAe,YAAY,GAC5CS,EAAW,cAAcE,EAAY,MAAM,IAAImC,CAAK;AAAA,EACtD;AAEA,WAASC,KAAmB;AAC1B,IAAKpC,KAAYX,EAAe,cAAc,GAC9CS,EAAW,gBAAgBE,EAAY,MAAM,EAAE;AAAA,EACjD;AAIA,MAAIqC,KAAiB;AAErB,WAASC,GAAUnK,GAAuD;AACxE,IAAK+H,KAAYb,EAAe,aAAa;AAC7C,UAAMe,IAAK,UAAUJ,EAAY,MAAM,EAAE,IAAI,EAAEqC,EAAc;AAC7D,WAAAnC,EAAY,MAAM,KAAK;AAAA,MACrB,GAAG/H;AAAAA,MACH,IAAAiI;AAAAA,MACA,aAAajI,EAAQ,eAAe;AAAA,IAAA,CACrC,GACMiI;AAAAA,EACT;AAEA,WAASmC,GAAanC,GAAkB;AACtC,IAAKF,KAAYb,EAAe,gBAAgB,GAChDa,EAAY,QAAQA,EAAY,MAAM,OAAO,CAACU,MAAMA,EAAE,OAAOR,CAAE;AAAA,EACjE;AAEA,WAASoC,KAAqB;AAC5B,IAAKtC,KAAYb,EAAe,gBAAgB,GAChDa,EAAY,QAAQA,EAAY,MAAM,OAAO,CAACU,MAAMA,EAAE,OAAO;AAAA,EAC/D;AAIA,MAAI6B,KAAuB,IACvBC,KAAyB;AAE7B,WAASC,GAAYC,GAA4B;AAE/C,QADK5C,KAAYX,EAAe,eAAe,GAC3CoD,IAAsB;AACxB,cAAQ,KAAK,4DAA4D;AACzE;AAAA,IACF;AACA,IAAAA,KAAuB,IACvBhH,EAAM+E,GAAU,CAACqC,MAAQ;AACvB,MAAIA,KAAKD,EAAA;AAAA,IACX,CAAC;AAAA,EACH;AAEA,WAASE,GAAcF,GAA4B;AAEjD,QADK5C,KAAYX,EAAe,iBAAiB,GAC7CqD,IAAwB;AAC1B,cAAQ,KAAK,8DAA8D;AAC3E;AAAA,IACF;AACA,IAAAA,KAAyB,IACzBjH,EAAM+E,GAAU,CAACqC,MAAQ;AACvB,MAAKA,KAAKD,EAAA;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,SAAO;AAAA,IACL,IAAAxC;AAAA,IACA,OAAAC;AAAA,IACA,kBAAAK;AAAA,IACA,SAAAvI;AAAA,IACA,OAAAmI;AAAA,IACA,UAAAC;AAAA,IACA,UAAAC;AAAA,IACA,MAAAC;AAAA,IACA,kBAAAK;AAAA,IACA,WAAAM;AAAA,IACA,WAAAI;AAAA,IACA,eAAAC;AAAA,IACA,aAAAC;AAAA,IACA,WAAAC;AAAA,IACA,YAAAC;AAAA,IACA,kBAAAE;AAAA,IACA,eAAAE;AAAA,IACA,aAAAW;AAAA,IACA,eAAAG;AAAA,IACA,UAAAZ;AAAA,IACA,YAAAE;AAAA,IACA,WAAAE;AAAA,IACA,cAAAC;AAAA,IACA,cAAAC;AAAA,EAAA;AAEJ;AC7SO,SAASO,GAA0BvI,GAAuBwI,GAAgD;AAC/G,SAAO;AAAA,IACL,IAAIA,EAAI,WAAA;AAAA,IACR,MAAMxI,EAAM;AAAA,IACZ,KAAKwI,EAAI,WAAWxI,EAAM,IAAI;AAAA;AAAA,IAE9B,OAAOA,EAAM;AAAA,IACb,SAASA,EAAM;AAAA,IACf,SAAS;AAAA,EAAA;AAEb;AAQO,SAASyI,GACdzI,GACA+G,GACAyB,GACiB;AACjB,SAAO;AAAA,IACL,IAAIA,EAAI,WAAA;AAAA,IACR,MAAMxI,EAAM;AAAA,IACZ,KAAKwI,EAAI,WAAWxI,EAAM,IAAI;AAAA,IAC9B,OAAOA,EAAM;AAAA,IACb,OAAOA,EAAM;AAAA,IACb,SAASA,EAAM;AAAA,IACf,UAAA+G;AAAA,IACA,SAAS;AAAA,EAAA;AAEb;AASO,SAAS2B,GACd1I,GACA2I,GACAH,GACiB;AACjB,SAAO;AAAA,IACL,IAAIA,EAAI,WAAA;AAAA,IACR,MAAMxI,EAAM;AAAA,IACZ,KAAKwI,EAAI,WAAWxI,EAAM,IAAI;AAAA,IAC9B,OAAOA,EAAM;AAAA,IACb,OAAOA,EAAM;AAAA,IACb,SAASA,EAAM;AAAA,IACf,UAAU2I;AAAA,IACV,SAAS;AAAA,EAAA;AAEb;AAUO,SAASC,GACd5I,GACA6I,GACAL,GACiB;AACjB,SAAO;AAAA,IACL,IAAIA,EAAI,WAAA;AAAA,IACR,MAAMxI,EAAM;AAAA,IACZ,KAAKwI,EAAI,WAAWxI,EAAM,IAAI;AAAA,IAC9B,OAAOA,EAAM;AAAA,IACb,OAAOA,EAAM;AAAA,IACb,SAASA,EAAM;AAAA,IACf,UAAU6I;AAAA,IACV,SAAS;AAAA,EAAA;AAEb;AC3FA,IAAIC,KAAa;AAGjB,SAASC,KAA0B;AACjC,SAAO,SAAS,EAAED,EAAU,IAAI,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AACxE;AAiBO,SAASE,GACdC,GACAC,GACAC,IAAmBC,IACN;AAEb,QAAMC,IAAUpM,EAAuB,EAAE,GAGnCqM,wBAAyB,IAAA,GAGzBC,wBAAuB,IAAA,GACvBC,wBAAwB,IAAA,GAGxBC,wBAAiB,IAAA,GAGjBC,IAAYtM,EAAS,MAAMiM,EAAQ,MAAM,CAAC,CAAC,GAE3CM,IAASvM,EAAqC,MAAMiM,EAAQ,KAAK,GAEjEnL,IAAcd,EAAS,MAAM;AACjC,aAASwM,IAAIP,EAAQ,MAAM,SAAS,GAAGO,KAAK,GAAGA;AAC7C,UAAIP,EAAQ,MAAMO,CAAC,EAAE,QAAS,QAAOP,EAAQ,MAAMO,CAAC;AAAA,EAGxD,CAAC;AAID,WAASC,EAAcnL,GAAuB;AAC5C,IAAA4K,EAAmB,OAAO5K,CAAO,GACjC6K,EAAiB,OAAO7K,CAAO,GAC/B8K,EAAkB,OAAO9K,CAAO,GAChC+K,EAAW,OAAO/K,CAAO;AAAA,EAC3B;AAEA,WAASoL,EAAY7D,GAAkC;AACrD,UAAM8D,IAAed,EAAc,SAAShD,CAAI;AAChD,QAAK8D;AAEL,aAAOA,EAAa;AAAA,EACtB;AAIA,QAAMC,IAA2C;AAAA,IAC/C,YAAYjB;AAAA,IACZ,YAAYe;AAAA,EAAA;AAOd,iBAAeG,EAAaC,GAAoD;AAE9E,aAASN,IAAIM,EAAc,SAAS,GAAGN,KAAK,GAAGA,KAAK;AAClD,YAAMnC,IAAQ6B,EAAmB,IAAIY,EAAcN,CAAC,EAAE,EAAE;AACxD,UAAInC,KACgB,MAAMA,EAAA;AACT,eAAO;AAAA,IAE1B;AACA,WAAO;AAAA,EACT;AAKA,WAAS0C,EAAoBD,GAAwC;AACnE,eAAWzM,KAASyM;AAClB,MAAAV,EAAkB,IAAI/L,EAAM,EAAE,IAAA,GAC9BoM,EAAcpM,EAAM,EAAE;AAAA,EAE1B;AAIA,iBAAe2M,EAAepK,GAAsC;AAIlE,QAHyB0J,EAAU,OAGb,SAAS1J,EAAM,KAAM;AAG3C,UAAMqK,IAAYpB,EAAc,SAASjJ,EAAM,IAAI;AACnD,QAAI,CAACqK;AACH,YAAM,IAAI,MAAM,uBAAuBrK,EAAM,IAAI,yBAAyB;AAI5E,QAAIkJ,KAAamB,EAAU,eAAe,CAACnB,EAAUmB,EAAU,WAAW,GAAG;AAC3E,cAAQ,KAAK,4CAA4CrK,EAAM,IAAI,GAAG;AACtE;AAAA,IACF;AAGA,IAAAmK,EAAoB,CAAC,GAAGd,EAAQ,KAAK,CAAC;AAGtC,UAAM7D,IAAa+C,GAA0BvI,GAAOgK,CAAc;AAElE,IAAAX,EAAQ,QAAQ,CAAC7D,CAAU,GAEvBxF,EAAM,UAAQuJ,EAAiB,IAAI/D,EAAW,IAAIxF,EAAM,MAAM,GAC9DA,EAAM,WAASwJ,EAAkB,IAAIhE,EAAW,IAAIxF,EAAM,OAAO,GAErEA,EAAM,SAAA;AAAA,EACR;AAEA,iBAAesK,EAAWtK,GAA8D;AAEtF,QAAI,CAACiJ,EAAc,SAASjJ,EAAM,IAAI;AACpC,YAAM,IAAI,MAAM,uBAAuBA,EAAM,IAAI,yBAAyB;AAG5E,UAAM+G,IAAW/G,EAAM,YAAY9B,EAAY,OAAO,MAAMwL,EAAU,OAAO;AAC7E,QAAI,CAAC3C;AACH,YAAM,IAAI,MAAM,uDAAuD;AAGzE,UAAMwD,IAAclB,EAAQ,MAAM,UAAU,CAACjD,MAAMA,EAAE,OAAOW,CAAQ;AACpE,QAAIwD,MAAgB;AAClB,YAAM,IAAI,MAAM,8BAA8BxD,CAAQ,sBAAsB;AAI9E,UAAMmD,IAAgBb,EAAQ,MAAM,MAAMkB,IAAc,CAAC;AAGzD,QAAIL,EAAc,SAAS,KACP,MAAMD,EAAaC,CAAa;AACnC;AAIjB,IAAAC,EAAoBD,CAAa;AAGjC,UAAM1E,IAAaiD,GAAsBzI,GAAO+G,GAAUiD,CAAc;AAGxE,IAAAX,EAAQ,QAAQ,CAAC,GAAGA,EAAQ,MAAM,MAAM,GAAGkB,IAAc,CAAC,GAAG/E,CAAU,GAEnExF,EAAM,UAAQuJ,EAAiB,IAAI/D,EAAW,IAAIxF,EAAM,MAAM,GAC9DA,EAAM,WAASwJ,EAAkB,IAAIhE,EAAW,IAAIxF,EAAM,OAAO,GAErEA,EAAM,SAAA;AAAA,EACR;AAEA,iBAAewK,EAAY9L,GAAmC;AAC5D,UAAM+L,IAAQpB,EAAQ,MAAM,UAAU,CAACjD,MAAMA,EAAE,OAAO1H,CAAO;AAI7D,QAHI+L,MAAU,MAGVA,MAAU,EAAG,QAAO;AAGxB,UAAMP,IAAgBb,EAAQ,MAAM,MAAMoB,CAAK;AAI/C,QADkB,MAAMR,EAAaC,CAAa,EACnC,QAAO;AAGtB,IAAAC,EAAoBD,CAAa,GAGjCb,EAAQ,QAAQA,EAAQ,MAAM,MAAM,GAAGoB,CAAK;AAG5C,UAAMC,IAAYrB,EAAQ,MAAM,SAAS;AACzC,QAAIqB,IAAY,KAAK,CAACrB,EAAQ,MAAMqB,CAAS,EAAE,SAAS;AACtD,YAAMC,IAAU,CAAC,GAAGtB,EAAQ,KAAK;AACjC,MAAAsB,EAAQD,CAAS,IAAI,EAAE,GAAGC,EAAQD,CAAS,GAAG,SAAS,GAAA,GACvDrB,EAAQ,QAAQsB;AAAA,IAClB;AAEA,WAAO;AAAA,EACT;AAEA,iBAAeC,EAAqB5K,GAA8D;AAChG,UAAM6K,IAAU3M,EAAY;AAC5B,QAAI,CAAC2M;AACH,YAAM,IAAI,MAAM,yCAAyC;AAI3D,QAAI,CAAC5B,EAAc,SAASjJ,EAAM,IAAI;AACpC,YAAM,IAAI,MAAM,uBAAuBA,EAAM,IAAI,yBAAyB;AAG5E,UAAM8K,IAAezB,EAAQ,MAAM,UAAU,CAACjD,MAAMA,EAAE,OAAOyE,EAAQ,EAAE;AACvE,QAAIC,MAAiB;AACnB,YAAM,IAAI,MAAM,8BAA8BD,EAAQ,EAAE,sBAAsB;AAIhF,UAAMX,IAAgBb,EAAQ,MAAM,MAAMyB,IAAe,CAAC;AAC1D,QAAIZ,EAAc,SAAS,GAAG;AAE5B,UADkB,MAAMD,EAAaC,CAAa,EACnC;AACf,MAAAC,EAAoBD,CAAa;AAAA,IACnC;AAIA,UAAM1E,IAAakD,GAA4B1I,GAAO6K,EAAQ,UAAUb,CAAc;AAGtF,IAAAG,EAAoB,CAACU,CAAO,CAAC;AAC7B,UAAMF,IAAU,CAAC,GAAGtB,EAAQ,MAAM,MAAM,GAAGyB,CAAY,GAAGtF,GAAY,GAAG6D,EAAQ,MAAM,MAAMyB,IAAe,CAAC,CAAC;AAC9G,IAAAzB,EAAQ,QAAQsB,GAEZ3K,EAAM,UAAQuJ,EAAiB,IAAI/D,EAAW,IAAIxF,EAAM,MAAM,GAC9DA,EAAM,WAASwJ,EAAkB,IAAIhE,EAAW,IAAIxF,EAAM,OAAO,GAErEA,EAAM,SAAA;AAAA,EACR;AAEA,iBAAe+K,EAAmB/K,GAA8D;AAC9F,UAAM6K,IAAU3M,EAAY;AAC5B,QAAI,CAAC2M;AACH,YAAM,IAAI,MAAM,uCAAuC;AAIzD,QAAI,CAAC5B,EAAc,SAASjJ,EAAM,IAAI;AACpC,YAAM,IAAI,MAAM,uBAAuBA,EAAM,IAAI,yBAAyB;AAG5E,UAAM8K,IAAezB,EAAQ,MAAM,UAAU,CAACjD,MAAMA,EAAE,OAAOyE,EAAQ,EAAE;AACvE,QAAIC,MAAiB;AACnB,YAAM,IAAI,MAAM,8BAA8BD,EAAQ,EAAE,sBAAsB;AAIhF,UAAMX,IAAgBb,EAAQ,MAAM,MAAMyB,IAAe,CAAC;AAC1D,QAAIZ,EAAc,SAAS,GAAG;AAE5B,UADkB,MAAMD,EAAaC,CAAa,EACnC;AACf,MAAAC,EAAoBD,CAAa;AAAA,IACnC;AAIA,UAAM1E,IAAaoD,GAAyB5I,GAAO6K,EAAQ,IAAIb,CAAc,GAGvEW,IAA6BtB,EAAQ,MAAM,MAAM,GAAGyB,CAAY;AACtE,IAAAH,EAAQ,KAAK,EAAE,GAAGE,GAAS,SAAS,IAAO,GAC3CF,EAAQ,KAAKnF,CAAU,GACvB6D,EAAQ,QAAQsB,GAEZ3K,EAAM,UAAQuJ,EAAiB,IAAI/D,EAAW,IAAIxF,EAAM,MAAM,GAC9DA,EAAM,WAASwJ,EAAkB,IAAIhE,EAAW,IAAIxF,EAAM,OAAO,GAErEA,EAAM,SAAA;AAAA,EACR;AAIA,iBAAegL,EAAejE,GAAiC;AAC7D,UAAMwD,IAAclB,EAAQ,MAAM,UAAU,CAACjD,MAAMA,EAAE,OAAOW,CAAQ;AACpE,QAAIwD,MAAgB,GAAI;AAExB,UAAMU,IAAW5B,EAAQ,MAAM,MAAMkB,IAAc,CAAC;AAKpD,IAJIU,EAAS,WAAW,KAGN,MAAMhB,EAAagB,CAAQ,MAI7Cd,EAAoBc,CAAQ,GAC5B5B,EAAQ,QAAQA,EAAQ,MAAM,MAAM,GAAGkB,IAAc,CAAC;AAAA,EACxD;AAQA,WAASW,EAAYC,GAAgC;AACnD,IAAIjN,EAAY,OAAO,OAAKiL,EAAQgC,CAAI,EAAA;AAAA,EAC1C;AAEA,iBAAeC,EAAcpL,GAAsC;AACjE,UAAMoK,EAAepK,CAAK,GAC1BkL,EAAY,MAAM;AAAA,EACpB;AAEA,iBAAetE,GAAU5G,GAA8D;AACrF,UAAMsK,EAAWtK,CAAK,GACtBkL,EAAY,MAAM;AAAA,EACpB;AAEA,iBAAeG,GAAoBrL,GAA8D;AAC/F,UAAM4K,EAAqB5K,CAAK,GAChCkL,EAAY,SAAS;AAAA,EACvB;AAEA,iBAAeI,GAAkBtL,GAA8D;AAC7F,UAAM+K,EAAmB/K,CAAK,GAC9BkL,EAAY,MAAM;AAAA,EACpB;AAEA,iBAAeK,GAAW7M,GAAmC;AAC3D,UAAM8M,IAAY,MAAMhB,EAAY9L,CAAO;AAC3C,WAAK8M,KAAWrC,EAAQ,QAAA,GACjBqC;AAAA,EACT;AAEA,iBAAevE,GAAcF,GAAiC;AAC5D,UAAMiE,EAAejE,CAAQ,GAC7BoC,EAAQ,QAAA;AAAA,EACV;AAIA,WAASsC,GAAoB/M,GAAiB+I,GAAqC;AACjF,IAAA6B,EAAmB,IAAI5K,GAAS+I,CAAK;AAAA,EACvC;AAEA,WAASiE,GAAsBhN,GAAuB;AACpD,IAAA4K,EAAmB,OAAO5K,CAAO;AAAA,EACnC;AAIA,WAASiN,GAAcjN,GAAiBiJ,GAAsB;AAC5D,UAAM8C,IAAQpB,EAAQ,MAAM,UAAU,CAACjD,MAAMA,EAAE,OAAO1H,CAAO;AAC7D,QAAI+L,MAAU,GAAI;AAGlB,UAAME,IAAU,CAAC,GAAGtB,EAAQ,KAAK;AACjC,IAAAsB,EAAQF,CAAK,IAAI,EAAE,GAAGE,EAAQF,CAAK,GAAG,OAAA9C,EAAA,GACtC0B,EAAQ,QAAQsB;AAAA,EAClB;AAEA,WAASiB,GAAgBlN,GAAuB;AAC9C,UAAM+L,IAAQpB,EAAQ,MAAM,UAAU,CAACjD,MAAMA,EAAE,OAAO1H,CAAO;AAC7D,QAAI+L,MAAU,GAAI;AAElB,UAAME,IAAU,CAAC,GAAGtB,EAAQ,KAAK;AACjC,IAAAsB,EAAQF,CAAK,IAAI,EAAE,GAAGE,EAAQF,CAAK,GAAG,OAAO,OAAA,GAC7CpB,EAAQ,QAAQsB;AAAA,EAClB;AAIA,WAASkB,GAAcnN,GAAiBoN,GAAiC;AACvE,UAAMrB,IAAQpB,EAAQ,MAAM,UAAU,CAACjD,MAAMA,EAAE,OAAO1H,CAAO;AAE7D,QADI+L,MAAU,MACVpB,EAAQ,MAAMoB,CAAK,EAAE,UAAUqB,EAAO;AAE1C,UAAMnB,IAAU,CAAC,GAAGtB,EAAQ,KAAK;AACjC,IAAAsB,EAAQF,CAAK,IAAI,EAAE,GAAGE,EAAQF,CAAK,GAAG,OAAAqB,EAAA,GACtCzC,EAAQ,QAAQsB;AAAA,EAClB;AAIA,WAASoB,EAAiBrN,GAAiBsN,GAAqC;AAC9E,UAAMvB,IAAQpB,EAAQ,MAAM,UAAU,CAACjD,MAAMA,EAAE,OAAO1H,CAAO;AAC7D,QAAI+L,MAAU,GAAI;AAElB,UAAMI,IAAUxB,EAAQ,MAAMoB,CAAK,EAAE,SAAS,CAAA,GACxCwB,IAAiC,EAAE,GAAGpB,EAAA;AAC5C,eAAW,CAAC1I,GAAK+J,EAAK,KAAK,OAAO,QAAQF,CAAK;AAC7C,MAAIE,OAAU,MAAMA,MAAS,OAC3B,OAAOD,EAAO9J,CAAG,IAEjB8J,EAAO9J,CAAG,IAAI+J;AAKlB,UAAMC,IAAc,OAAO,KAAKtB,CAAO,GACjCuB,IAAa,OAAO,KAAKH,CAAM;AACrC,QAAIE,EAAY,WAAWC,EAAW,UAAUA,EAAW,MAAM,CAACC,MAAMxB,EAAQwB,CAAC,MAAMJ,EAAOI,CAAC,CAAC;AAC9F;AAGF,UAAM1B,KAAU,CAAC,GAAGtB,EAAQ,KAAK;AACjC,IAAAsB,GAAQF,CAAK,IAAI,EAAE,GAAGE,GAAQF,CAAK,GAAG,OAAOwB,EAAA,GAC7C5C,EAAQ,QAAQsB;AAAA,EAClB;AAIA,WAAS2B,EAAgB1G,GAA0B;AACjD,QAAI,IAAI6D,EAAW,IAAI7D,CAAE;AACzB,WAAK,MACH,IAAI3I,EAAI,EAAK,GACbwM,EAAW,IAAI7D,GAAI,CAAC,IAEf;AAAA,EACT;AACA,WAAS2G,EAAY3G,GAAqB;AACxC,WAAO6D,EAAW,IAAI7D,CAAE,GAAG,SAAS;AAAA,EACtC;AACA,WAAS4G,GAAa5G,GAAYsG,GAAsB;AACtD,IAAAI,EAAgB1G,CAAE,EAAE,QAAQsG;AAAA,EAC9B;AACA,WAASO,GAAgB7G,GAAkB;AACzC,UAAM,IAAI0G,EAAgB1G,CAAE;AAC5B,MAAE,QAAQ,CAAC,EAAE;AAAA,EACf;AAIA,WAAS8G,GAAcC,GAAsC;AAE3D,eAAWlP,KAAS4L,EAAQ;AAC1B,MAAAQ,EAAcpM,EAAM,EAAE;AAExB,IAAA4L,EAAQ,QAAQsD;AAAA,EAClB;AAIA,SAAO;AAAA,IACL,WAAAjD;AAAA,IACA,QAAAC;AAAA,IACA,aAAAzL;AAAA,IACA,eAAAkN;AAAA,IACA,WAAAxE;AAAA,IACA,YAAA2E;AAAA,IACA,eAAAtE;AAAA,IACA,qBAAAoE;AAAA,IACA,mBAAAC;AAAA,IACA,qBAAAG;AAAA,IACA,uBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,kBAAAE;AAAA,IACA,iBAAAO;AAAA,IACA,aAAAC;AAAA,IACA,cAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,eAAAC;AAAA,EAAA;AAEJ;AAOO,SAASE,KAA6B;AAC3C,QAAMC,IAAQ3H,EAAOC,EAAa;AAClC,MAAI,CAAC0H;AACH,UAAM,IAAI,MAAM,kFAAkF;AAEpG,SAAOA;AACT;AC1dA,MAAMhQ,IAASC,EAAa,cAAc;AAsBnC,SAASgQ,GAAsBnP,GAAiE;AACrG,QAAMoP,IAAkB7H,EAAO8H,EAAkB,GAC3C,EAAE,MAAAC,GAAM,gBAAAC,EAAA,IAAmBC,GAAA,GAC3B,EAAE,WAAAvG,EAAA,IAAc7B,GAAA,GAChB,EAAE,QAAA4E,GAAQ,aAAAzL,EAAA,IAAgB0O,GAAA,GAC1B5N,IAAarB,GAAS,YAGtByP,IAAU3M,GAAqB;AAAA,IACnC,YAAY,MAAM;AAChB,UAAKwM,EAAK;AACV,eAAO;AAAA,UACL,IAAIA,EAAK,MAAM;AAAA,UACf,UAAUA,EAAK,MAAM;AAAA,UACrB,iBAAiBA,EAAK,MAAM;AAAA,UAC5B,aAAaA,EAAK,MAAM;AAAA,QAAA;AAAA,IAE5B;AAAA,IACA,aAAa,MAAmC;AAC9C,YAAMI,IAAenP,EAAY,SAASyL,EAAO,MAAMA,EAAO,MAAM,SAAS,CAAC;AAC9E,aAAK0D,IAEE;AAAA,QACL,IAAIA,EAAa;AAAA,QACjB,MAAMA,EAAa;AAAA,QACnB,OAAOA,EAAa;AAAA,QACpB,OAAOA,EAAa;AAAA,QACpB,SAASA,EAAa;AAAA,MAAA,IAPE;AAAA,IAS5B;AAAA,IACA,cAAc,MAAMN,GAAiB,cAAc,SAAS;AAAA,IAC5D,aAAaG;AAAA,IACb,iBAAiB,CAACI,GAAmBzH,GAAgB0H,MAA2C;AAC9F,MAAA3G,EAAU,EAAE,MAAM0G,GAAW,OAAAzH,GAAO,SAAS0H,EAAA,CAAc,EACxD,KAAK,MAAM;AACV,QAAA1Q,EAAO,MAAM,uBAAuByQ,CAAS,EAAE;AAAA,MACjD,CAAC,EACA,MAAM,CAAC3F,MAAU;AAChB,QAAA9K,EAAO,KAAK,wCAAwCyQ,CAAS,IAAI3F,CAAK;AAAA,MACxE,CAAC;AAAA,IACL;AAAA,IACA,eAAehK,GAAS;AAAA,IACxB,YAAAqB;AAAA,EAAA,CACD;AAOD,MALA0H,GAAQ8G,IAAmBJ,CAAO,GAClCvQ,EAAO,MAAM,yBAAyB,GAGPc,GAAS,0BAA0B,IACtC;AAE1B,UAAM8P,IAAiBvI,EAA+BwI,IAAmB,IAAI;AAC7E,IAAID,KACFA,EAAe;AAAA,MACb;AAAA,QACE,IAAI/Q;AAAA,QACJ,MAAMC;AAAA,QACN,OAAOC;AAAA,QACP,UAAUiF,GAAO,IAAI;AAAA,QACrB,cAAc,MAAM;AAClB,UAAAuL,EAAQ,YAAA;AAAA,QACV;AAAA,MAAA;AAAA,MAEF;AAAA;AAAA,IAAA,GAEFvQ,EAAO,MAAM,uDAAuD,KAEpEA,EAAO,KAAK,yDAAyD;AAAA,EAEzE;AAEA,SAAOuQ;AACT;AAsDO,SAASO,KAA2C;AACzD,QAAMP,IAAUlI,EAAOsI,EAAiB;AACxC,MAAI,CAACJ,GAAS;AACZ,IAAAvQ,EAAO,MAAM,2EAA2E;AACxF;AAAA,EACF;AAEA,SAAO;AAAA;AAAA,IAEL,YAAYuQ,EAAQ;AAAA,IACpB,QAAQA,EAAQ;AAAA,IAChB,SAASA,EAAQ;AAAA,IACjB,QAAQA,EAAQ;AAAA,IAChB,YAAYA,EAAQ;AAAA,IACpB,iBAAiBA,EAAQ;AAAA;AAAA,IAGzB,WAAWA,EAAQ;AAAA,IACnB,YAAYA,EAAQ;AAAA,IACpB,aAAaA,EAAQ;AAAA,IACrB,aAAaA,EAAQ;AAAA,IACrB,eAAeA,EAAQ;AAAA;AAAA,IAGvB,WAAWA,EAAQ;AAAA;AAAA,IAGnB,aAAaA,EAAQ;AAAA,IACrB,WAAWA,EAAQ;AAAA,EAAA;AAEvB;AAMO,SAASQ,GAA2BjQ,GAA6C;AACtF,SAAO;AAAA,IACL,IAAI;AAAA,IACJ,MAAMA,GAAS,QAAQ;AAAA,IACvB,OAAOA,GAAS,SAAS;AAAA,IACzB,cAAc,MAAM;AAClB,cAAQ,KAAK,4FAA4F;AAAA,IAC3G;AAAA,EAAA;AAEJ;;;;;;;;;;;;;;;;;;;;;AC9BA,UAAMkQ,IAAazQ,EAAS,MAAM,iBAAiB,KAAK,OAAA,EAAS,SAAS,EAAE,EAAE,UAAU,GAAG,EAAE,CAAC,EAAE;2BAxL9F0Q,EAkKM,OAAA;AAAA,MAjKH,OAAOC,EAAA;AAAA,MACP,QAAQA,EAAA;AAAA,MACT,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN,OAAM;AAAA,IAAA;sBAGNC,EAGE,QAAA;AAAA,QAFA,GAAE;AAAA,QACF,MAAK;AAAA,MAAA;MAKED,EAAA,YAgCTE,EAAA,GAAAH,EAIE,QAJFI,EAIE,WArCFJ,EA8BI,KAAA;AAAA;QA5BD,qBAAmBD,EAAA,KAAU;AAAA,MAAA;QAE9BG,EAyBI,KAAA,EAzBD,WAAU,oDAAgD;AAAA,UAC3DA,EAuBgB,iBAAA;AAAA,YAtBd,GAAE;AAAA,YACF,GAAE;AAAA,YACF,OAAM;AAAA,YACN,QAAO;AAAA,UAAA;YAEPA,EAgBE,OAAA;AAAA,cAfA,OAAM;AAAA,cACN,OAAA,EAAA,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAA,QAAA,QAAA,OAAA,QAAA,SAAA,IAAA;AAAA,YAAA;;;;sBA2BRA,EAGE,QAAA;AAAA,QAFA,GAAE;AAAA,QACF,MAAK;AAAA,MAAA;sBAIPA,EAME,WAAA;AAAA,QALA,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,MAAK;AAAA,MAAA;sBAEPA,EAME,WAAA;AAAA,QALA,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,MAAK;AAAA,MAAA;sBAEPA,EAME,WAAA;AAAA,QALA,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,IAAG;AAAA,QACH,MAAK;AAAA,MAAA;MAIPA,EA6EO,QAAA,MAAA;AAAA,QA1EID,EAAA,6BADTD,EAOW,YAAA;AAAA;UALR,IAAID,EAAA;AAAA,QAAA;UAELG,EAEE,QAAA,EADA,GAAE,k5GAAA,GAAi5G,MAAA,EAAA;AAAA,QAAA;QAM/4GD,EAAA,YADRE,KAAAH,EAgEiB,kBAhEjBK,IAgEiB,CAAA,GAAAC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA;AAAA;;;;;;;;;;;;;;;sBChKrBH,EAAA,GAAAH,EAYO,QAZPO,IAYO;AAAA,OAXLJ,EAAA,EAAA,GAAAH,EAUWQ,IAAA,MAAAC,GATeR,EAAA,OAAK,CAArBS,GAAM/D,yBACRA,KAAK;AAAA,QAGHsD,EAAA,aAAatD,IAAK,UAD1BqD,EAIC,QAJDW,IAGG,GAAC;QAEJT,EAAkD,OAAlDE,IAAkDQ,EAAbF,CAAI,GAAA,CAAA;AAAA,MAAA;;;;;;;;;;;;AC4G/C,UAAM,EAAE,GAAAG,EAAA,IAAMC,GAAA,GACR,EAAE,OAAArM,EAAA,IAAU2B,GAAA,GACZ2K,IAAYzR,EAAS,MAAMiF,GAAeR,GAAO,QAAQU,CAAK,CAAC,GAC/DuM,IAAY1R,EAAS,MAAMiF,GAAeR,GAAO,IAAI,WAAWU,CAAK,CAAC,GACtEwM,IAAa3R,EAAS,MAAMyR,EAAU,MAAM,IAAI,GAChDG,IAAa5R,EAAS,MAAM0R,EAAU,MAAM,IAAI;sBA3HpDb,EAAA,GAAAH,EA8FM,OA9FNO,IA8FM;AAAA,MA7FJL,EAMM,OANNS,IAMM;AAAA,QALJQ,EAIEC,IAAA;AAAA,UAHC,OAAO;AAAA,UACP,QAAQ;AAAA,UACT,aAAA;AAAA,QAAA;;MAIJlB,EAMM,OANNE,IAMM;AAAA,QALJF,EAIM,OAJNmB,IAIM;AAAA,UAHJnB,EAEM,OAFNG,IAEMO,EADDX,EAAA,KAAK,GAAA,CAAA;AAAA,QAAA;;MAKdC,EA4EM,OA5ENoB,IA4EM;AAAA,QA1EIrB,EAAA,mBADRsB,GAyBYC,EAAAC,EAAA,GAAA;AAAA;UAvBV,WAAU;AAAA,QAAA;UAcC,WACT,MAMO;AAAA,YANPvB,EAMO,QANPwB,IAMO;AAAA,cALFC,GAAAf,EAAAY,EAAAX,CAAA,qDAAoD,KACvD,CAAA;AAAA,cAAAM,EAGES,IAAA;AAAA,gBAFC,OAAOZ,EAAA,MAAU;AAAA,gBACjB,YAAYQ,EAAA/M,CAAA;AAAA,cAAA;;;qBAjBnB,MAWM;AAAA,YAXNyL,EAWM,OAAA;AAAA,cAVJ,OAAM;AAAA,cACN,MAAK;AAAA,cACL,UAAS;AAAA,cACR,cAAYsB,EAAAX,CAAA,EAAC,8CAAA;AAAA,cACb,qBAAmBK,EAAA;AAAA,cACnB,gCAAOW,EAAAA,MAAK,UAAA;AAAA,cACZ,WAAO;AAAA,2CAAgBA,EAAAA,MAAK,UAAA,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,2CACLA,EAAAA,MAAK,UAAA,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,cAAA;AAAA;cAE7BV,EAA8BK,EAAAM,EAAA,GAAA,EAAtB,MAAK,gBAAc;AAAA,YAAA;;;oBAY/BP,GAyBYC,EAAAC,EAAA,GAAA;AAAA;UAvBV,WAAU;AAAA,QAAA;UAcC,WACT,MAMO;AAAA,YANPvB,EAMO,QANP6B,IAMO;AAAA,cALFJ,GAAAf,EAAAY,EAAAX,CAAA,sDAAqD,KACxD,CAAA;AAAA,cAAAM,EAGES,IAAA;AAAA,gBAFC,OAAOZ,EAAA,MAAU;AAAA,gBACjB,YAAYQ,EAAA/M,CAAA;AAAA,cAAA;;;qBAjBnB,MAWM;AAAA,YAXNyL,EAWM,OAAA;AAAA,cAVJ,OAAM;AAAA,cACN,MAAK;AAAA,cACL,UAAS;AAAA,cACR,cAAYsB,EAAAX,CAAA,EAAC,+CAAA;AAAA,cACb,qBAAmBK,EAAA;AAAA,cACnB,gCAAOW,EAAAA,MAAK,QAAA;AAAA,cACZ,WAAO;AAAA,2CAAgBA,EAAAA,MAAK,QAAA,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,2CACLA,EAAAA,MAAK,QAAA,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,cAAA;AAAA;cAE7BV,EAAkCK,EAAAM,EAAA,GAAA,EAA1B,MAAK,oBAAkB;AAAA,YAAA;;;;QAYnCX,EAsBYK,EAAAC,EAAA,GAAA,EAtBD,WAAU,YAAQ;AAAA,UAahB,WACT,MAMO;AAAA,YANPvB,EAMO,QANP8B,IAMO;AAAA,cALFL,GAAAf,EAAAY,EAAAX,CAAA,mDAAkD,KACrD,CAAA;AAAA,cAAAM,EAGES,IAAA;AAAA,gBAFC,OAAOb,EAAA,MAAU;AAAA,gBACjB,YAAYS,EAAA/M,CAAA;AAAA,cAAA;;;qBAjBnB,MAWM;AAAA,YAXNyL,EAWM,OAAA;AAAA,cAVJ,OAAM;AAAA,cACN,MAAK;AAAA,cACL,UAAS;AAAA,cACR,cAAYsB,EAAAX,CAAA,EAAC,4CAAA;AAAA,cACb,qBAAmBI,EAAA;AAAA,cACnB,gCAAOY,EAAAA,MAAK,OAAA;AAAA,cACZ,WAAO;AAAA,2CAAgBA,EAAAA,MAAK,OAAA,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,2CACLA,EAAAA,MAAK,OAAA,GAAA,CAAA,SAAA,CAAA,GAAA,CAAA,OAAA,CAAA;AAAA,cAAA;AAAA;cAE7BV,EAA0BK,EAAAM,EAAA,GAAA,EAAlB,MAAK,YAAU;AAAA,YAAA;;;;;;;;;;;;;;;;sBCjF/B3B,EAAA,GAAAH,EAgBM,OAhBNO,IAgBM;AAAA,MAfJL,EAcM,OAdNS,IAcM;AAAA,QAbJT,EAMM,OANNE,IAMM;AAAA,UALJe,EAIEC,IAAA;AAAA,YAHC,OAAO;AAAA,YACP,QAAQ;AAAA,YACT,UAAA;AAAA,UAAA;;QAIInB,EAAA,aADRD,EAKI,KALJqB,IAKIT,EADCX,EAAA,IAAI,GAAA,CAAA;;;;;;;;;;;;;;AC0Bf,UAAMlR,IAASC,EAAa,iBAAiB,GAEvCiT,IAAQhC,GAIRiC,IAAOC,GAIP9Q,IAAYlC,EAA8B,IAAI,GAC9CiT,IAAYjT,EAAI,EAAI;AAI1B,IAAAgE;AAAA,MACE9B;AAAA,MACA,CAACmB,MAAW;AACV,QAAIA,KACF0P,EAAK,gBAAgB1P,CAAM;AAAA,MAE/B;AAAA,MACA,EAAE,WAAW,GAAA;AAAA,IAAK;AAGpB,UAAM6P,IAAS,MAAM;AAEnB,MAAAD,EAAU,QAAQ,IAClBrT,EAAO,MAAM,eAAe;AAAA,IAC9B;AAGA,WAAAoE;AAAA,MACE,MAAM8O,EAAM;AAAA,MACZ,MAAM;AACJ,QAAAG,EAAU,QAAQ;AAAA,MACpB;AAAA,IAAA,cA3EAjC,EAAA,GAAAH,EA8BM,OA9BNO,IA8BM;AAAA,MA5BJY,EAKamB,IAAA,EALD,MAAK,UAAM;AAAA,mBACrB,MAGE;AAAA,UAFMF,EAAA,SAAanC,EAAA,YADrBsB,GAGEgB,IAAA;AAAA;YADC,MAAMC,EAAAA,GAAE,kBAAA;AAAA,UAAA;;;;MAKLvC,EAAA,YADRD,EASE,UAAA;AAAA;iBAPI;AAAA,QAAJ,KAAI3O;AAAA,QACH,KAAK4O,EAAA;AAAA,QACN,OAAKwC,GAAA,CAAC,6BAA2B,EAAA,sCACeL,EAAA,MAAA,CAAS,CAAA;AAAA,QACzD,SAAQ;AAAA,QACR,OAAM;AAAA,QACL,QAAAC;AAAA,MAAA,qBAEHlC,EAAA,GAAAH,EAUM,OAVNI,IAUM;AAAA,QANJe,EAIEK,EAAAM,EAAA,GAAA;AAAA,UAHA,MAAK;AAAA,UACL,MAAK;AAAA,UACL,OAAM;AAAA,QAAA;QAERxB,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAAJ,EAA+E,KAAA,EAA5E,OAAM,0CAAuC,+BAA2B,EAAA;AAAA,MAAA;;;;;;;;;ACWjF,UAAM,EAAE,OAAAzL,EAAA,IAAU2B,GAAA,GAOZsM,IAAiBtL,EAAOsI,EAAiB,GACzCxO,IAAakG,EAAOuL,IAAiB,EAAK;AAEhD,IAAKD,KACH,QAAQ,MAAM,8CAA8C;AAI9D,UAAM7P,IAASvD;AAAA,MACb,MAAMoT,GAAgB,OAAO,SAAS,EAAE,KAAK,IAAI,OAAO,gBAAgB,OAAO,KAAK,eAAe,IAAA;AAAA,IAAI,GAEnGrT,IAASC,EAAS,MAAM,CAAC4B,MAAewR,GAAgB,OAAO,SAAS,GAAM,GAC9EnT,IAAaD,EAAS,MAAMoT,GAAgB,WAAW,SAAS,EAAK,GACrElS,IAAkBlB,EAAS,MAAMoT,GAAgB,gBAAgB,SAAS,CAAC,GAG3EE,IAAatT,EAAS,OAAO;AAAA,MACjC,OAAOC,EAAW,QAAQ,GAAGsD,EAAO,MAAM,iBAAiB,GAAG,OAAO,GAAGA,EAAO,MAAM,SAAS,GAAG;AAAA,IAAA,EACjG,GAGIzB,IAAa,MAAMsR,GAAgB,WAAA,GACnCG,IAAc,MAAMH,GAAgB,YAAA,GACpCI,IAAgB,MAAMJ,GAAgB,cAAA,GACtCK,IAAW5T,EAAwB,IAAI;AAQ7C,IAAA6T,GAAiB,UAAU,WAAW,CAAC9Q,MAAyB;AAC9D,UAAK7C,EAAO,SACR,CAAA6C,EAAM,eACN,CAAAA,EAAM,kBACV;AAAA,YAAIA,EAAM,QAAQ,UAAU;AAC1B,UAAAA,EAAM,eAAA,GACNd,EAAA;AACA;AAAA,QACF;AAGA,YAAIqE,GAAa1B,GAAO,IAAI,WAAW7B,GAAOuC,CAAK,GAAG;AACpD,gBAAMwO,IAAgB,SAAS;AAC/B,cAAI,CAACA,KAAiB,CAACF,EAAS,OAAO,SAASE,CAAa,EAAG;AAEhE,UAAA/Q,EAAM,eAAA,GACF3C,EAAW,QACbuT,EAAA,IAEAD,EAAA;AAAA,QAEJ;AAAA;AAAA,IACF,CAAC;AAGD,UAAMK,IAAgB,CAAC1Q,MAA8B;AACnD,MAAAkQ,GAAgB,cAAclQ,CAAM;AAAA,IACtC;AAGA,WAAA2Q,GAAY,MAAM;AAChB,MAAAT,GAAgB,cAAc,IAAI;AAAA,IACpC,CAAC,mBA9GCnB,GA2Bae,IAAA,EA3BD,MAAK,oBAAgB;AAAA,iBAC/B,MAyBM;AAAA,QAxBEjT,EAAA,cADR2Q,EAyBM,OAAA;AAAA;mBAvBA;AAAA,UAAJ,KAAI+C;AAAA,UACJ,WAAM,qBAAmB;AAAA,2CACwBxT,EAAA;AAAA,UAAA;UAGhD,UAAOqT,EAAA,KAAU;AAAA,UACjB,OAAO3C,EAAA,SAAS;AAAA,QAAA;UAEjBkB,EAOEiC,IAAA;AAAA,YANC,OAAOvQ,EAAA,MAAO;AAAA,YACd,eAAatD,EAAA;AAAA,YACb,eAAaiB,EAAA;AAAA,YACb,SAAOY;AAAA,YACP,UAAQyR;AAAA,YACR,YAAUC;AAAA,UAAA;UAGb5C,EAKM,OALNS,IAKM;AAAA,YAJJQ,EAGEkC,IAAA;AAAA,cAFC,KAAKxQ,EAAA,MAAO;AAAA,cACZ,eAAAqQ;AAAA,YAAA;;;;;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { nextTick as $e, ref as D, computed as y, getCurrentInstance as Tt, inject as Ce, defineComponent as Q, openBlock as s, createElementBlock as g, createElementVNode as w, watch as oe, onMounted as lt, onBeforeUnmount as He, toValue as xe, reactive as vt, shallowRef as Un, provide as De, createBlock as P, unref as n, withCtx as x, withDirectives as Xe, resolveDynamicComponent as qe, vShow as _t, createCommentVNode as M, toRef as Ie, normalizeClass as X, renderSlot as z, toDisplayString as F, Teleport as gt, createVNode as A, Transition as Fe, normalizeStyle as he, Fragment as Z, renderList as de, createTextVNode as ve, mergeProps as Le, withModifiers as ue, isRef as bt, h as io, withKeys as Ae, createSlots as Ne, markRaw as On, useId as Bt, useSlots as ht, TransitionGroup as zn, toHandlers as Ol, onUnmounted as Rt, hasInjectionContext as so, getCurrentScope as ro, onScopeDispose as Hn, useAttrs as Pi, watchEffect as Wn, vModelText as Vi, toRefs as Fi, normalizeProps as ft, guardReactiveProps as mt, vModelCheckbox as Ui, toRaw as co } from "vue";
|
|
2
2
|
import { ab as zi, c as et, x as Hi, d as uo, B as al, Q as Gn, P as vo, e as fo, K as mo, _ as le, u as Pt, A as Wi, a as pt, b as po, W as go, h as Gi, L as Mn, t as Ln, n as qi, O as Ki, af as bo, M as Yi, U as qn, E as ol, z as In, w as ji, a3 as Xi, Z as ho, G as Qi, F as yo, s as Zi, a8 as Ji } from "./VcAiAgentPanel.vue_vue_type_style_index_0_lang-0llGMIi1.js";
|
|
3
3
|
import { P as St, af as es, aR as ts, a as ls, X as Pe, H as il, l as Se, aP as wo, N as sl, am as ns, an as as, x as we, F as Qe, M as os, t as rt, a8 as is, T as Pl, Q as wt, a0 as ss, aS as rs, I as Vt, V as Ze, ap as cs, u as us, aT as ds, ak as Co, aU as vs, aV as fs, au as _o, aN as ko, O as Vl, aO as ms, q as Ve, v as $t, E as Eo, p as ps, Y as gs, y as bs, az as hs, C as ys, w as Ct, s as ws, aW as Fl, K as So, aX as $o, aY as Ro, aZ as ll, a_ as Ao, a$ as Cs, A as To, n as _s, o as pn } from "./VcScheduler.vue_vue_type_style_index_0_lang-CwXsJo6H.js";
|
|
4
|
-
import { q as Ft, p as gn, o as ks, n as Ml, r as Es, m as xn, v as Al, t as Oo, f as Kn, w as Ss, _ as $s } from "./VcAiAgentPanel.vue_vue_type_script_setup_true_lang-
|
|
4
|
+
import { q as Ft, p as gn, o as ks, n as Ml, r as Es, m as xn, v as Al, t as Oo, f as Kn, w as Ss, _ as $s } from "./VcAiAgentPanel.vue_vue_type_script_setup_true_lang-Cfv6Pk05.js";
|
|
5
5
|
import { u as ze } from "./vendor-vue-i18n-LO-EJStU.js";
|
|
6
6
|
import { s as Ul, f as Yn, o as jn, d as Rs } from "./vendor-floating-ui-dom-BvVXFZ4B.js";
|
|
7
7
|
import As from "../assets/d5f9664ebbfb104b.svg";
|