@grafana/assistant 0.1.21 → 0.1.22

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/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","mappings":"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","sources":["webpack://@grafana/assistant/webpack/bootstrap","webpack://@grafana/assistant/webpack/runtime/compat get default export","webpack://@grafana/assistant/webpack/runtime/define property getters","webpack://@grafana/assistant/webpack/runtime/hasOwnProperty shorthand","webpack://@grafana/assistant/webpack/runtime/make namespace object","webpack://@grafana/assistant/./src/utils/hash.ts","webpack://@grafana/assistant/./src/context/base.ts","webpack://@grafana/assistant/external commonjs2 \"@grafana/runtime\"","webpack://@grafana/assistant/external commonjs2 \"react\"","webpack://@grafana/assistant/./src/context/page.ts","webpack://@grafana/assistant/./src/context/component.ts","webpack://@grafana/assistant/./src/context/dashboard.ts","webpack://@grafana/assistant/./src/context/datasource.ts","webpack://@grafana/assistant/./src/context/entity.ts","webpack://@grafana/assistant/./src/context/label.ts","webpack://@grafana/assistant/./src/context/factory.ts","webpack://@grafana/assistant/./src/context/chat.ts","webpack://@grafana/assistant/./src/context/skill.ts","webpack://@grafana/assistant/./src/context/questions.ts","webpack://@grafana/assistant/external commonjs2 \"@grafana/data\"","webpack://@grafana/assistant/./src/investigations.ts","webpack://@grafana/assistant/./src/functions.ts","webpack://@grafana/assistant/external commonjs2 \"rxjs\"","webpack://@grafana/assistant/./src/plugin.ts","webpack://@grafana/assistant/./src/sidebar.ts","webpack://@grafana/assistant/./src/hook.ts","webpack://@grafana/assistant/external commonjs2 \"@grafana/ui\"","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+css@11.10.6/node_modules/@emotion/css/create-instance/dist/emotion-css-create-instance.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+css@11.10.6/node_modules/@emotion/css/dist/emotion-css.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js","webpack://@grafana/assistant/./src/components/button/OpenAssistantButton.tsx","webpack://@grafana/assistant/./src/components/button/OpenAssistantSplitButton.tsx","webpack://@grafana/assistant/./src/utils/theme.ts","webpack://@grafana/assistant/./src/inline/inlineAssistant.ts","webpack://@grafana/assistant/./src/inline/useInlineAssistant.ts","webpack://@grafana/assistant/./src/components/input/useAIGeneration.ts","webpack://@grafana/assistant/./src/components/input/useGeneratingPlaceholder.ts","webpack://@grafana/assistant/./src/components/input/AITextInput.tsx","webpack://@grafana/assistant/./src/components/input/AITextArea.tsx","webpack://@grafana/assistant/./src/terms/versionCompare.ts","webpack://@grafana/assistant/./src/terms/index.ts","webpack://@grafana/assistant/./src/tools/toolFactory.ts","webpack://@grafana/assistant/./src/limits/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * Simple hash function that generates a deterministic hash for a given input string.\n * Uses the djb2 algorithm for simplicity and good distribution.\n */\nexport function hash(input: string): string {\n let hash = 5381;\n\n for (let i = 0; i < input.length; i++) {\n hash = (hash << 5) + hash + input.charCodeAt(i);\n }\n\n // Convert to positive hex string\n return (hash >>> 0).toString(16);\n}\n","import { IconName } from '@grafana/ui';\nimport { ItemDataType, type ContextItemData, type UnknownItemData } from './types';\nimport { hash } from '../utils/hash';\n\nexport interface BaseParams {\n title?: string;\n // If true, the context item will not be shown in the context pills\n hidden?: boolean;\n // Image to display, if not selected, we fallback to icon\n img?: string;\n // Icon to display, if img is provided, icon is ignored\n icon?: IconName;\n /**\n * When true, bypasses size limits for fixed-size content that doesn't need truncation.\n *\n * Set `bypassLimits: true` for fixed-size content like:\n * - Static instructions or prompts\n * - Configuration that doesn't change\n * - Small, bounded metadata\n *\n * Keep `bypassLimits: false` (default) for variable-size content like:\n * - Query results, data tables, graphs\n * - User-generated content, logs\n * - Any content that could grow unexpectedly large\n *\n * @default false\n */\n bypassLimits?: boolean;\n}\n\nexport interface NodeDataParams extends BaseParams {\n id: string;\n type: ItemDataType;\n text?: string;\n}\n\nexport class NodeData {\n public id: string;\n public text = '';\n public type: ItemDataType;\n\n constructor(public params: NodeDataParams) {\n this.id = hash(params.id);\n this.type = params.type;\n }\n\n /** Whether size limits should be bypassed for this context item. Defaults to false. */\n get bypassLimits(): boolean {\n return this.params.bypassLimits ?? false;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.params.text ?? '',\n text: this.params.text ?? '',\n } satisfies UnknownItemData,\n };\n }\n\n equals(other: unknown): boolean {\n if (!(other instanceof NodeData)) {\n return false;\n }\n return this.id === other.id && this.type === other.type;\n }\n}\n\nexport interface StructuredNodeDataParams extends BaseParams {\n data: Record<string, any>;\n}\n\nexport class StructuredNodeData extends NodeData {\n public data: Record<string, any>;\n constructor(params: StructuredNodeDataParams) {\n super({ ...params, id: hash(JSON.stringify(params.data)), type: 'structured' });\n this.data = params.data;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: this.data,\n };\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@grafana/runtime\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","import { useLocationService } from '@grafana/runtime';\nimport { ChatContextItem } from './types';\nimport { useEffect, useState, useRef, useCallback } from 'react';\n\n// Extend window interface for global registry\ndeclare global {\n interface Window {\n [key: string]: any;\n }\n}\n\nexport interface PageContextRegistration {\n id: string;\n urlPattern: string | RegExp;\n context: ChatContextItem[];\n}\n\n// Global registry key\nconst GLOBAL_REGISTRY_KEY = '__grafanaAssistantPageContextRegistry__';\n\n// Custom event for registry changes\nconst REGISTRY_CHANGE_EVENT = 'grafana-assistant:page-context-registry-changed';\n\n/**\n * Legacy event names for backward compatibility with the previous implementation.\n * These events are emitted alongside the new REGISTRY_CHANGE_EVENT to ensure\n * any existing code listening to the old events continues to work.\n *\n * @deprecated These event name is maintained for backward compatibility only.\n * TODO: Remove after old event-based approach is fully deprecated\n */\nconst LEGACY_REGISTRY_UPDATE_EVENT = 'grafana-assistant:page-context-update';\n/**\n * @deprecated These event name is maintained for backward compatibility only.\n * TODO: Remove after old event-based approach is fully deprecated\n */\nconst LEGACY_REGISTRY_REMOVE_EVENT = 'grafana-assistant:page-context-remove';\n/**\n * @deprecated These event name is maintained for backward compatibility only.\n * TODO: Remove after old event-based approach is fully deprecated\n */\nconst LEGACY_REGISTRY_SYNC_EVENT = 'grafana-assistant:page-context-sync';\n\n// Ensure global registry exists on window\nif (!window[GLOBAL_REGISTRY_KEY]) {\n window[GLOBAL_REGISTRY_KEY] = [];\n}\n\n// Get reference to the global registry\nfunction getPageContextRegistry(): PageContextRegistration[] {\n return window[GLOBAL_REGISTRY_KEY];\n}\n\n// TODO: Remove skipLegacyEvents parameter after old event-based approach is fully deprecated\nfunction setPageContextRegistry(newRegistry: PageContextRegistration[], skipLegacyEvents = false): void {\n window[GLOBAL_REGISTRY_KEY] = newRegistry;\n // Notify all listeners that the registry has changed\n window.dispatchEvent(new CustomEvent(REGISTRY_CHANGE_EVENT));\n\n // TODO: Remove this legacy event emission after old event-based approach is fully deprecated\n // Emit legacy sync event for backward compatibility (unless we're processing a legacy event)\n if (!skipLegacyEvents) {\n window.dispatchEvent(\n new CustomEvent(LEGACY_REGISTRY_SYNC_EVENT, {\n detail: { registry: newRegistry },\n })\n );\n }\n}\n\n/**\n * Bridge to handle legacy events from external apps using old versions of @grafana/assistant.\n * This ensures that registrations from external apps get synced into our window registry.\n *\n * TODO: Remove this entire bridge after old event-based approach is fully deprecated\n */\nlet legacyBridgeInitialized = false;\n\nfunction initializeLegacyEventBridge(): void {\n if (legacyBridgeInitialized) {\n return;\n }\n legacyBridgeInitialized = true;\n\n // Handle legacy update events (registration added or updated)\n window.addEventListener(LEGACY_REGISTRY_UPDATE_EVENT, (event: Event) => {\n const customEvent = event as CustomEvent;\n const registration = customEvent.detail as PageContextRegistration;\n\n if (!registration || !registration.id) {\n return;\n }\n\n const currentRegistry = getPageContextRegistry();\n const existingIndex = currentRegistry.findIndex((r) => r.id === registration.id);\n\n if (existingIndex !== -1) {\n // Update existing registration\n const newRegistry = [...currentRegistry];\n newRegistry[existingIndex] = registration;\n setPageContextRegistry(newRegistry, true); // Skip legacy events to avoid loops\n } else {\n // Add new registration\n setPageContextRegistry([...currentRegistry, registration], true); // Skip legacy events to avoid loops\n }\n });\n\n // Handle legacy remove events (registration removed)\n window.addEventListener(LEGACY_REGISTRY_REMOVE_EVENT, (event: Event) => {\n const customEvent = event as CustomEvent;\n const id = customEvent.detail?.id;\n\n if (!id) {\n return;\n }\n\n const currentRegistry = getPageContextRegistry();\n const index = currentRegistry.findIndex((r) => r.id === id);\n\n if (index !== -1) {\n const newRegistry = currentRegistry.filter((_, i) => i !== index);\n setPageContextRegistry(newRegistry, true); // Skip legacy events to avoid loops\n }\n });\n\n // Handle legacy sync events (entire registry sync from external app)\n window.addEventListener(LEGACY_REGISTRY_SYNC_EVENT, (event: Event) => {\n const customEvent = event as CustomEvent;\n const incomingRegistry = customEvent.detail?.registry as PageContextRegistration[];\n\n if (!Array.isArray(incomingRegistry)) {\n return;\n }\n\n const currentRegistry = getPageContextRegistry();\n const currentIds = new Set(currentRegistry.map((r) => r.id));\n\n // Merge: add any registrations from external app that we don't have\n const newRegistrations = incomingRegistry.filter((r) => !currentIds.has(r.id));\n\n if (newRegistrations.length > 0) {\n setPageContextRegistry([...currentRegistry, ...newRegistrations], true); // Skip legacy events to avoid loops\n }\n });\n}\n\n// TODO: Remove this initialization after old event-based approach is fully deprecated\n// Initialize the bridge on module load\ninitializeLegacyEventBridge();\n\n/**\n * Registers context items for specific pages based on URL patterns.\n * Returns a setter function to update the context dynamically, similar to useState.\n *\n * Multiple registrations with the same URL pattern are allowed and will all be merged\n * when the pattern matches. Each call creates a new independent registration.\n *\n * @param urlPattern - URL pattern (string or RegExp) to match against page URLs\n * @param initialContext - *Initial* array of ContextItems to provide when the pattern matches. IMPORTANT: will be overwritten when setContext is used to update the context.\n * @returns A setter function to update the context, with an unregister method attached\n */\nexport function providePageContext(\n urlPattern: string | RegExp,\n initialContext: ChatContextItem[]\n): ((context: ChatContextItem[]) => void) & { unregister: () => void } {\n // Validate URL pattern at registration time (only warn once, not on every match)\n validateUrlPattern(urlPattern);\n\n // Always create a new registration to allow multiple providers with the same URL pattern\n const registration: PageContextRegistration = {\n id: generateRegistrationId(),\n urlPattern,\n context: [...initialContext],\n };\n\n const registry = getPageContextRegistry();\n setPageContextRegistry([...registry, registration]);\n\n // TODO: Remove this legacy event emission after old event-based approach is fully deprecated\n // Emit legacy update event for backward compatibility\n window.dispatchEvent(\n new CustomEvent(LEGACY_REGISTRY_UPDATE_EVENT, {\n detail: registration,\n })\n );\n\n // Create setter function that can update the context\n const setContext = (newContext: ChatContextItem[]) => {\n const currentRegistry = getPageContextRegistry();\n const index = currentRegistry.findIndex((reg) => reg.id === registration.id);\n if (index !== -1) {\n const newRegistry = [...currentRegistry];\n newRegistry[index] = { ...newRegistry[index], context: [...newContext] };\n setPageContextRegistry(newRegistry);\n\n // TODO: Remove this legacy event emission after old event-based approach is fully deprecated\n // Emit legacy update event for backward compatibility\n window.dispatchEvent(\n new CustomEvent(LEGACY_REGISTRY_UPDATE_EVENT, {\n detail: newRegistry[index],\n })\n );\n }\n };\n\n // Add unregister method to the setter\n setContext.unregister = () => {\n const currentRegistry = getPageContextRegistry();\n const index = currentRegistry.findIndex((reg) => reg.id === registration.id);\n if (index !== -1) {\n const newRegistry = currentRegistry.filter((_, i) => i !== index);\n setPageContextRegistry(newRegistry);\n\n // TODO: Remove this legacy event emission after old event-based approach is fully deprecated\n // Emit legacy remove event for backward compatibility\n window.dispatchEvent(\n new CustomEvent(LEGACY_REGISTRY_REMOVE_EVENT, {\n detail: { id: registration.id },\n })\n );\n }\n };\n\n return setContext;\n}\n\nconst empty: ChatContextItem[] = [];\n\n/**\n * React hook for providing page context that automatically cleans up on unmount.\n * This is the recommended way to use page context in React components.\n *\n * @param urlPattern - URL pattern (string or RegExp) to match against page URLs\n * @param initialContext - Initial array of ContextItems to provide when the pattern matches. IMPORTANT: will be overwritten when setContext is used to update the context.\n * @returns A setter function to update the context\n */\nexport function useProvidePageContext(\n urlPattern: string | RegExp,\n initialContext: ChatContextItem[] = empty\n): (context: ChatContextItem[]) => void {\n const setContextRef = useRef<ReturnType<typeof providePageContext> | undefined>(undefined);\n const pendingUpdate = useRef<ChatContextItem[] | undefined>(undefined);\n const isModified = useRef(false);\n\n // Create or update the registration when dependencies change\n useEffect(() => {\n // Reset isModified flag when urlPattern changes so that initialContext updates\n // are applied to the new registration until manually modified again\n isModified.current = false;\n\n // If we have pending updates, prefer those over initialContext as they represent\n // newer state from child components\n const contextToUse = pendingUpdate.current !== undefined ? pendingUpdate.current : initialContext;\n setContextRef.current = providePageContext(urlPattern, contextToUse);\n\n // Clear pending update as it's now applied\n if (pendingUpdate.current !== undefined) {\n pendingUpdate.current = undefined;\n }\n\n // Cleanup on unmount or dependency change\n return () => {\n setContextRef.current?.unregister();\n setContextRef.current = undefined;\n };\n // We intentionally exclude initialContext from deps to prevent re-registering on every render\n // Updates to initialContext are handled by the second effect\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [urlPattern]);\n\n // Update context when initialContext changes, BUT only if we haven't manually modified it.\n // This prevents unstable initialContext props (e.g. passing [] inline) from overwriting\n // updates made via setContext by child components.\n useEffect(() => {\n if (!isModified.current && setContextRef.current) {\n setContextRef.current(initialContext);\n }\n }, [initialContext]);\n\n // Return a stable setter function\n const setContext = useCallback((newContext: ChatContextItem[]) => {\n isModified.current = true;\n if (setContextRef.current) {\n setContextRef.current(newContext);\n } else {\n pendingUpdate.current = newContext;\n }\n }, []);\n\n return setContext;\n}\n\n/**\n * Gets all context items that match the current URL.\n *\n * @param currentUrl - The current page URL to match against\n * @param registrations - Array of registrations to match against\n * @returns Array of ChatContextItem from all matching registrations\n */\nfunction getActivePageContext(currentUrl: string): ChatContextItem[] {\n if (!currentUrl) {\n return [];\n }\n\n const activeContext: ChatContextItem[] = [];\n const registry = getPageContextRegistry();\n\n for (const registration of registry) {\n if (matchesUrlPattern(currentUrl, registration.urlPattern)) {\n activeContext.push(...registration.context);\n }\n }\n\n return activeContext;\n}\n\nexport function usePageContext(\n options: { allowQuestions: boolean; allowComponents: boolean } = { allowQuestions: false, allowComponents: false }\n): ChatContextItem[] {\n const [pageContext, setPageContext] = useState<ChatContextItem[]>([]);\n const location = useLocationService();\n const currentPathnameRef = useRef<string>('');\n\n useEffect(() => {\n // Function to update context based on current location and registry\n const updateContext = () => {\n const pathname = location.getLocation().pathname;\n const context = getActivePageContext(pathname);\n setPageContext(context);\n };\n\n // Handle registry changes\n const handleRegistryChange = () => {\n updateContext();\n };\n\n // Subscribe to location changes\n const locationSub = location.getLocationObservable().subscribe((loc: { pathname: string }) => {\n const pathname = loc.pathname;\n if (pathname !== currentPathnameRef.current) {\n currentPathnameRef.current = pathname;\n updateContext();\n }\n });\n\n // Listen for registry changes\n window.addEventListener(REGISTRY_CHANGE_EVENT, handleRegistryChange);\n\n // TODO: Remove these legacy event listeners after old event-based approach is fully deprecated\n // Listen for legacy events for backward compatibility\n window.addEventListener(LEGACY_REGISTRY_UPDATE_EVENT, handleRegistryChange);\n window.addEventListener(LEGACY_REGISTRY_REMOVE_EVENT, handleRegistryChange);\n window.addEventListener(LEGACY_REGISTRY_SYNC_EVENT, handleRegistryChange);\n\n // Initial update\n updateContext();\n\n return () => {\n locationSub.unsubscribe();\n window.removeEventListener(REGISTRY_CHANGE_EVENT, handleRegistryChange);\n // TODO: Remove these legacy event listener removals after old event-based approach is fully deprecated\n window.removeEventListener(LEGACY_REGISTRY_UPDATE_EVENT, handleRegistryChange);\n window.removeEventListener(LEGACY_REGISTRY_REMOVE_EVENT, handleRegistryChange);\n window.removeEventListener(LEGACY_REGISTRY_SYNC_EVENT, handleRegistryChange);\n };\n }, [location]);\n\n let filteredContext = pageContext;\n\n if (!options.allowQuestions) {\n filteredContext = filteredContext.filter((item) => item.node.data?.type !== 'question');\n }\n\n if (!options.allowComponents) {\n filteredContext = filteredContext.filter((item) => item.node.data?.type !== 'component');\n }\n\n return filteredContext;\n}\n\nexport function generateRegistrationId(prefix = 'page-context'): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Validates the URL pattern at registration time and logs warnings for problematic patterns.\n * This is called once during registration, not on every URL match.\n */\nfunction validateUrlPattern(pattern: string | RegExp): void {\n if (pattern instanceof RegExp) {\n // Check if RegExp pattern matches everything (e.g., /.*/, /^.*$/)\n // This is intentional for global contexts (e.g., components), so we use a scoped warning\n const source = pattern.source;\n if (source === '.*' || source === '^.*$' || source === '^.*' || source === '.*$') {\n // Note: This is expected for global contexts like provideComponents.\n // The warning is intentionally omitted here since it's a valid use case.\n // If you want to warn for specific cases, filter them here.\n }\n return;\n }\n\n if (typeof pattern === 'string') {\n // Validate urlPattern - log error if empty string is passed\n if (!pattern || pattern.trim() === '') {\n console.warn(\n 'useProvidePageContext: Empty string passed as urlPattern. This will cause the context to not match any pages.'\n );\n return;\n }\n\n // Check if the pattern matches everything (e.g., ** becomes ^.*$)\n if (pattern === '**') {\n // Note: This is expected for global contexts.\n // The warning is intentionally omitted here since it's a valid use case.\n }\n }\n}\n\nfunction matchesUrlPattern(url: string, pattern: string | RegExp): boolean {\n if (pattern instanceof RegExp) {\n return pattern.test(url);\n }\n\n // For string patterns, support simple wildcards\n if (typeof pattern === 'string') {\n // Empty pattern never matches\n if (!pattern || pattern.trim() === '') {\n return false;\n }\n\n // Convert simple wildcard pattern to regex\n // * matches any characters except /, ** matches any path segments\n // Handle ** first with a placeholder to avoid conflicts\n const regexPattern = pattern\n .replace(/\\*\\*/g, '\\u0000DOUBLE_STAR\\u0000') // Temporary placeholder for **\n .replace(/\\*/g, '[^/]*') // * becomes [^/]*\n .replace(/\\u0000DOUBLE_STAR\\u0000/g, '.*') // Replace placeholder with .*\n .replace(/\\?/g, '.'); // ? becomes .\n\n const finalRegex = `^${regexPattern}$`;\n const regex = new RegExp(finalRegex);\n return regex.test(url);\n }\n\n return false;\n}\n\n/**\n * Test utility function to clear all registrations from the registry.\n * This should only be used in tests to ensure a clean slate between test runs.\n *\n * @internal This is for testing purposes only\n */\nexport function __clearPageContextRegistryForTesting(): void {\n setPageContextRegistry([]);\n}\n","import { ComponentType, useMemo } from 'react';\nimport { BaseParams, NodeData } from './base';\nimport { type ContextItemData, type ComponentItemData } from './types';\nimport { providePageContext, usePageContext } from './page';\nimport { createAssistantContextItem } from './chat';\n\nexport type ComponentImplementation = ComponentType<any>;\nexport type NamedComponents = Record<string, ComponentImplementation>;\n\n/**\n * Type used to create a component context item.\n */\nexport interface CreateComponentContextParams extends BaseParams {\n components: Record<string, ComponentType<any>>;\n prompt: string;\n namespace?: string;\n}\n\nexport class ComponentNodeData extends NodeData {\n public components: Record<string, ComponentType<any>>;\n public prompt: string;\n public namespace: string;\n\n constructor(params: CreateComponentContextParams) {\n const namespace = params.namespace || 'components';\n super({ ...params, id: `${namespace}-${Object.keys(params.components).join('-')}`, type: 'component' });\n this.components = params.components;\n this.prompt = params.prompt;\n this.namespace = namespace;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n data: {\n name: `Custom UI components (${this.namespace})`,\n prompt: this.prompt\n ? this.prompt +\n '\\n\\nIMPORTANT: The instructions and components described above are scoped to this specific context item only. Do not apply them to unrelated queries or components.'\n : '',\n } satisfies Omit<ComponentItemData, 'components' | 'text' | 'namespace'>,\n };\n }\n}\n\n/**\n * React hook that provides all components available globally.\n * Components are available everywhere, regardless of URL patterns.\n *\n * @returns Object containing all components available globally, keyed by namespace.componentName\n */\nexport function usePageComponents(): Record<string, ComponentImplementation> {\n const pageContext = usePageContext({ allowComponents: true, allowQuestions: false });\n\n // Use useMemo to avoid recreating the components object on every render\n const components = useMemo(() => {\n const allComponents: Record<string, ComponentImplementation> = {};\n\n // Filter for component context items and extract their components\n pageContext\n .filter((item) => item.node.data?.components)\n .forEach((item) => {\n const componentData = item.node.data;\n if (componentData?.components && Object.keys(componentData.components).length > 0) {\n const namespace = componentData.namespace || componentData.name || 'components';\n\n // Add each component with namespace_componentName format\n Object.entries(componentData.components).forEach(([componentName, component]) => {\n allComponents[`${namespace}_${componentName}`] = component as ComponentImplementation;\n });\n }\n });\n\n return allComponents;\n }, [pageContext]);\n\n return components;\n}\n\n/**\n * Provide components to the assistant.\n *\n * Components are always available globally, but the prompt is only applied when the URL pattern matches.\n *\n * For catch-all URL patterns, returns a setter that takes a context array.\n * For specific URL patterns, returns a setter that takes components and prompt separately.\n *\n * @param prompt - The prompt to use for the components (only applied when URL matches).\n * @param namespace - The namespace to use for the components.\n * @param components - The components to provide (always available).\n * @param urlPattern - The URL pattern to match for the prompt (components are always available).\n * @returns A setter function to update the context, with an unregister method attached\n */\nexport function provideComponents(\n prompt: string,\n namespace: string,\n components: Record<string, ComponentImplementation>,\n urlPattern: string | RegExp = /.*/\n): ((newComponents: Record<string, ComponentImplementation>, newPrompt: string) => void) & { unregister: () => void } {\n // Check if the URL pattern is catch-all (.*) - if so, register everything together\n const isCatchAll = (pattern: string | RegExp) => {\n if (pattern instanceof RegExp) {\n return pattern.source === '.*' && pattern.flags === '';\n }\n return pattern === '.*' || pattern === '/.*/';\n };\n\n if (isCatchAll(urlPattern)) {\n // If pattern is catch-all, register components and prompt together globally\n const setContext = providePageContext(/.*/, [\n createAssistantContextItem('component', {\n components,\n prompt,\n namespace,\n }),\n ]);\n\n // Create a wrapper setter that matches the expected signature\n const setter = (newComponents: Record<string, ComponentImplementation>, newPrompt: string) => {\n setContext([\n createAssistantContextItem('component', {\n components: newComponents,\n prompt: newPrompt,\n namespace,\n }),\n ]);\n };\n\n // Attach unregister method\n setter.unregister = setContext.unregister;\n\n return setter;\n }\n\n // For specific URL patterns, separate components (global) from prompt (URL-specific)\n const globalComponents = providePageContext(/.*/, [\n createAssistantContextItem('component', {\n components,\n prompt: '', // No prompt for global components\n namespace,\n }),\n ]);\n\n // Only register prompt for specific URL pattern\n const promptContext = providePageContext(urlPattern, [\n createAssistantContextItem('component', {\n components: {}, // No components, just prompt\n prompt,\n namespace,\n }),\n ]);\n\n // Return a setter that properly separates components and prompt\n // When updating, we extract components and prompt from the new data and update each registration appropriately\n const setter = (newComponents: Record<string, ComponentImplementation>, newPrompt: string) => {\n // Update global components registration with new components (but empty prompt)\n globalComponents([\n createAssistantContextItem('component', {\n components: newComponents,\n prompt: '', // No prompt for global components\n namespace,\n }),\n ]);\n\n // Update URL-specific registration with new prompt (but empty components)\n promptContext([\n createAssistantContextItem('component', {\n components: {}, // No components, just prompt\n prompt: newPrompt,\n namespace,\n }),\n ]);\n };\n\n // Attach unregister method that cleans up both registrations\n setter.unregister = () => {\n globalComponents.unregister();\n promptContext.unregister();\n };\n\n return setter;\n}\n","import { BaseParams, NodeData } from './base';\nimport { type ContextItemData, type DashboardItemData, type FolderItemData } from './types';\n\nexport interface CreateDashboardContextParams extends BaseParams {\n dashboardUid: string;\n dashboardTitle: string;\n folderUid?: string;\n folderTitle?: string;\n}\n\nexport interface CreateFolderContextParams extends BaseParams {\n folderUid: string;\n folderTitle: string;\n}\n\nexport class DashboardNodeData extends NodeData {\n public dashboardUid: string;\n public dashboardTitle: string;\n public folderUid?: string;\n public folderTitle?: string;\n\n constructor(params: CreateDashboardContextParams) {\n super({ ...params, id: params.dashboardUid, type: 'dashboard' });\n this.dashboardUid = params.dashboardUid;\n this.dashboardTitle = params.dashboardTitle;\n this.folderUid = params.folderUid;\n this.folderTitle = params.folderTitle;\n this.text = params.dashboardTitle;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.dashboardTitle,\n dashboardUid: this.dashboardUid,\n dashboardTitle: this.dashboardTitle,\n folderUid: this.folderUid,\n folderTitle: this.folderTitle,\n text: this.text,\n } satisfies DashboardItemData,\n };\n }\n}\n\nexport class FolderNodeData extends NodeData {\n public folderUid: string;\n public folderTitle: string;\n public text = '';\n\n constructor(params: CreateFolderContextParams) {\n super({ ...params, id: params.folderUid, type: 'dashboard_folder' });\n this.folderUid = params.folderUid;\n this.folderTitle = params.folderTitle;\n this.text = params.folderTitle;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.folderTitle,\n folderUid: this.folderUid,\n folderTitle: this.folderTitle,\n text: this.text,\n } satisfies FolderItemData,\n };\n }\n}\n","import { BaseParams, NodeData } from './base';\nimport { DatasourceMeta } from './factory';\nimport { type ContextItemData, type DatasourceItemData } from './types';\n\n/**\n * Type used to create a datasource context item.\n *\n * All required attributes will be inferred from the datasources uid.\n */\nexport interface CreateDatasourceContextParams extends BaseParams {\n datasourceUid: string;\n}\n\nexport class DatasourceNodeData extends NodeData {\n public datasourceUid: string;\n public datasourceType: string;\n public datasourceName: string;\n public img?: string;\n\n constructor(params: CreateDatasourceContextParams & DatasourceMeta) {\n super({ ...params, id: params.datasourceUid, type: 'datasource' });\n this.datasourceUid = params.datasourceUid;\n this.datasourceType = params.datasourceType;\n this.datasourceName = params.datasourceName;\n this.img = params.img;\n this.text = params.datasourceName;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.datasourceName,\n uid: this.datasourceUid,\n type: this.datasourceType,\n text: this.text,\n } satisfies DatasourceItemData,\n };\n }\n}\n","import { BaseParams, NodeData } from './base';\nimport { type ContextItemData, type EntityItemData } from './types';\n\n/**\n * Type used to create an entity context item.\n */\nexport interface CreateEntityContextParams extends BaseParams {\n type: string;\n name: string;\n scope?: {\n env?: string;\n site?: string;\n namespace?: string;\n };\n properties?: Record<string, any>;\n}\n\nexport class EntityNodeData extends NodeData {\n public entityType: string;\n public name: string;\n public scope?: {\n env?: string;\n site?: string;\n namespace?: string;\n };\n public properties?: Record<string, any>;\n\n constructor(params: CreateEntityContextParams) {\n super({\n id: `${params.type}-${params.name}-${[params.scope?.env, params.scope?.site, params.scope?.namespace].filter(Boolean).join('-')}`,\n type: 'entity',\n title: params.title,\n hidden: params.hidden,\n img: params.img,\n icon: params.icon,\n text: params.name,\n });\n this.entityType = params.type;\n this.name = params.name;\n this.scope = params.scope;\n this.properties = params.properties;\n this.text = params.name;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: 'entity',\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.name,\n text: this.text,\n type: this.entityType,\n scope: this.scope,\n properties: this.properties,\n } satisfies EntityItemData,\n };\n }\n}\n","import { BaseParams, NodeData } from './base';\nimport { DatasourceMeta } from './factory';\nimport { type ContextItemData, type LabelNameItemData, type LabelValueItemData } from './types';\n\nexport interface CreateLabelNameContextParams extends BaseParams {\n datasourceUid: string;\n labelName: string;\n}\n\nexport interface CreateLabelValueContextParams extends CreateLabelNameContextParams {\n labelValue: string;\n /** Filter operator (e.g., '=', '!=', '=~', '!~'). Defaults to '=' if not specified */\n operator?: string;\n}\n\nexport class LabelNameNodeData extends NodeData {\n public datasourceUid: string;\n public datasourceType: string;\n public datasourceName: string;\n public labelName: string;\n public img?: string;\n\n constructor(params: CreateLabelNameContextParams & DatasourceMeta) {\n super({ ...params, id: `${params.datasourceUid}-${params.labelName}`, type: 'label_name' });\n this.datasourceUid = params.datasourceUid;\n this.datasourceType = params.datasourceType;\n this.datasourceName = params.datasourceName;\n this.labelName = params.labelName;\n this.text = params.labelName;\n this.img = params.img;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.labelName,\n datasourceUid: this.datasourceUid,\n datasourceType: this.datasourceType,\n datasourceName: this.datasourceName,\n labelName: this.labelName,\n text: this.text,\n } satisfies LabelNameItemData,\n };\n }\n}\n\nexport class LabelValueNodeData extends NodeData {\n public datasourceUid: string;\n public datasourceType: string;\n public datasourceName: string;\n public labelName: string;\n public labelValue: string;\n public img?: string;\n public operator: string;\n\n constructor(params: CreateLabelValueContextParams & DatasourceMeta) {\n super({\n ...params,\n id: `${params.datasourceUid}-${params.labelName}-${params.labelValue}-${params.operator || '='}`,\n type: 'label_value',\n });\n this.datasourceUid = params.datasourceUid;\n this.datasourceType = params.datasourceType;\n this.datasourceName = params.datasourceName;\n this.labelName = params.labelName;\n this.labelValue = params.labelValue;\n this.text = params.labelValue;\n this.img = params.img;\n this.operator = params.operator || '=';\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.labelValue,\n datasourceUid: this.datasourceUid,\n datasourceType: this.datasourceType,\n datasourceName: this.datasourceName,\n labelName: this.labelName,\n labelValue: this.labelValue,\n text: this.text,\n operator: this.operator,\n } satisfies LabelValueItemData,\n };\n }\n}\n","import { getDataSourceSrv } from '@grafana/runtime';\nimport { NodeData, NodeDataParams, StructuredNodeData, StructuredNodeDataParams } from './base';\nimport { ComponentNodeData, type CreateComponentContextParams } from './component';\nimport {\n DashboardNodeData,\n FolderNodeData,\n type CreateDashboardContextParams,\n type CreateFolderContextParams,\n} from './dashboard';\nimport { DatasourceNodeData, type CreateDatasourceContextParams } from './datasource';\nimport { EntityNodeData, type CreateEntityContextParams } from './entity';\nimport {\n LabelNameNodeData,\n LabelValueNodeData,\n type CreateLabelNameContextParams,\n type CreateLabelValueContextParams,\n} from './label';\n\n/**\n * registry to handle the type mappings between ItemData type, params and node data\n */\nexport type ContextTypeRegistry = {\n datasource: { params: CreateDatasourceContextParams; node: DatasourceNodeData };\n label_name: { params: CreateLabelNameContextParams; node: LabelNameNodeData };\n label_value: { params: CreateLabelValueContextParams; node: LabelValueNodeData };\n dashboard: { params: CreateDashboardContextParams; node: DashboardNodeData };\n dashboard_folder: { params: CreateFolderContextParams; node: FolderNodeData };\n structured: { params: StructuredNodeDataParams; node: StructuredNodeData };\n component: { params: CreateComponentContextParams; node: ComponentNodeData };\n entity: { params: CreateEntityContextParams; node: EntityNodeData };\n unknown: { params: NodeDataParams; node: NodeData };\n};\n\nexport type DatasourceMeta = {\n datasourceType: string;\n datasourceName: string;\n img?: string;\n};\n\n/**\n * Helper function to get datasource type from datasource UID\n */\nfunction getDatasourceMeta(datasourceUid: string): DatasourceMeta {\n const datasourceInstance = getDataSourceSrv().getInstanceSettings(datasourceUid);\n return {\n datasourceType: datasourceInstance?.type ?? 'unknown',\n datasourceName: datasourceInstance?.name ?? datasourceUid,\n img: datasourceInstance?.meta?.info?.logos?.small,\n };\n}\n\n/**\n * Creates context nodes based on type with full type safety using generics\n */\nexport function createContextByType<T extends keyof ContextTypeRegistry>(\n type: T,\n params: ContextTypeRegistry[T]['params']\n): ContextTypeRegistry[T]['node'] {\n switch (type) {\n case 'datasource':\n return new DatasourceNodeData({\n ...(params as CreateDatasourceContextParams),\n ...getDatasourceMeta((params as CreateDatasourceContextParams).datasourceUid),\n });\n case 'label_name':\n return new LabelNameNodeData({\n ...(params as CreateLabelNameContextParams),\n ...getDatasourceMeta((params as CreateLabelNameContextParams).datasourceUid),\n });\n case 'label_value':\n return new LabelValueNodeData({\n ...(params as CreateLabelValueContextParams),\n ...getDatasourceMeta((params as CreateLabelValueContextParams).datasourceUid),\n });\n case 'dashboard':\n return new DashboardNodeData(params as CreateDashboardContextParams);\n case 'dashboard_folder':\n return new FolderNodeData(params as CreateFolderContextParams);\n case 'structured':\n return new StructuredNodeData(params as StructuredNodeDataParams);\n case 'component':\n return new ComponentNodeData({\n ...(params as CreateComponentContextParams),\n hidden: true,\n });\n case 'entity':\n return new EntityNodeData(params as CreateEntityContextParams);\n case 'unknown':\n return new NodeData(params as NodeDataParams);\n default:\n console.error(`Unknown context type: ${type}`);\n return new NodeData(params as NodeDataParams);\n }\n}\n","import { IconName } from '@grafana/ui';\nimport { NodeData, StructuredNodeData } from './base';\nimport { createContextByType, ContextTypeRegistry } from './factory';\nimport { ChatContextItem, ItemDataType } from './types';\n\nconst defaultIcons: Record<ItemDataType, IconName> = {\n datasource: 'database',\n label_name: 'database',\n label_value: 'database',\n dashboard: 'dashboard',\n dashboard_folder: 'folder',\n unknown: 'circle-mono',\n structured: 'gf-grid',\n component: 'gf-grid',\n entity: 'asserts',\n skill: 'play',\n};\n\nfunction getTitleFromContextNode(nodeData: NodeData | StructuredNodeData): string {\n return nodeData instanceof StructuredNodeData\n ? nodeData.formatForLLM().data.name\n : (nodeData.text ?? 'Given Context');\n}\n\nfunction getImgFromContextNode(nodeData: NodeData | StructuredNodeData): string | undefined {\n if ('img' in nodeData) {\n return (nodeData as { img?: string }).img;\n }\n return undefined;\n}\n\n/**\n * Creates a new chat context item that can be added to conversations.\n *\n * This function creates structured context items that provide additional information\n * to the AI assistant during conversations. Context items can include:\n * - Datasources (metrics, logs, traces)\n * - Labels and their values\n * - Dashboards and folders\n * - Structured data objects\n *\n * The created context item includes display metadata (title, icon, image) and\n * the underlying data that will be formatted and sent to the LLM when the\n * context is included in a conversation.\n *\n * @param type - The type of context to create (Datasource, Label, Dashboard etc.)\n * @param params - Type-specific parameters for creating the context item\n * @returns A ChatContextItem that can be added to conversation context\n *\n * @example\n * ```typescript\n * // Create a context that will be passed into the function triggering an assistant open\n * openAssistant({\n * ...\n * origin: 'my-feature',\n * context: [\n * createAssistantContextItem('datasource', {\n * datasourceUid: datasource.uid,\n * img: datasource.meta?.info?.logos?.small,\n * }),\n * ],\n * });\n * ```\n */\nexport function createAssistantContextItem<T extends keyof ContextTypeRegistry>(\n type: T,\n params: ContextTypeRegistry[T]['params']\n): ChatContextItem {\n const nodeData = createContextByType(type, params);\n const defaultTitle = params.title ?? getTitleFromContextNode(nodeData);\n const img = params.img ?? getImgFromContextNode(nodeData);\n return {\n node: {\n id: nodeData.id,\n name: defaultTitle,\n img,\n icon: params.icon ?? defaultIcons[type],\n navigable: false,\n selectable: true,\n data: nodeData,\n },\n occurrences: [],\n };\n}\n","import { BaseParams, NodeData } from './base';\nimport { type ContextItemData, type SkillItemData } from './types';\n\nexport interface CreateSkillContextParams extends BaseParams {\n skillId: string;\n skillName: string;\n}\n\nexport class SkillNodeData extends NodeData {\n public skillId: string;\n public skillName: string;\n\n constructor(params: CreateSkillContextParams) {\n super({\n ...params,\n id: params.skillId,\n type: 'skill',\n text: params.skillName,\n });\n this.skillId = params.skillId;\n this.skillName = params.skillName;\n this.text = params.skillName;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.skillName,\n skillId: this.skillId,\n skillName: this.skillName,\n text: this.text,\n } satisfies SkillItemData,\n };\n }\n}\n","import { useMemo } from 'react';\nimport { ChatContextItem } from './types';\nimport { providePageContext, useProvidePageContext, usePageContext, generateRegistrationId } from './page';\n\nexport interface Question {\n prompt: string;\n title?: string;\n context?: ChatContextItem[];\n}\n\nexport interface QuestionRegistration {\n id: string;\n urlPattern: string | RegExp;\n questions: Question[];\n}\n\n/**\n * Registers questions for specific pages based on URL patterns.\n * Returns a setter function to update the questions dynamically, similar to useState.\n *\n * Multiple registrations with the same URL pattern are allowed and will all be merged\n * when the pattern matches. Each call creates a new independent registration.\n *\n * @param urlPattern - URL pattern (string or RegExp) to match against page URLs\n * @param initialQuestions - Initial array of questions to provide when the pattern matches\n * @returns A setter function to update the questions, with an unregister method attached\n */\nexport function provideQuestions(\n urlPattern: string | RegExp,\n initialQuestions: Question[]\n): ((questions: Question[]) => void) & { unregister: () => void } {\n // Generate a unique registration ID to prevent collisions when multiple registrations exist\n const registrationId = generateRegistrationId('question');\n\n // Convert questions to ChatContextItem format for the underlying system\n const convertQuestionsToContext = (questions: Question[]): ChatContextItem[] => {\n return questions.map((question, index) => ({\n node: {\n id: `question-${registrationId}-${index}`,\n name: question.title || question.prompt,\n navigable: false,\n selectable: true,\n icon: 'question-circle',\n data: {\n type: 'question',\n prompt: question.prompt,\n title: question.title,\n context: question.context || [],\n },\n },\n occurrences: [],\n }));\n };\n\n // Use the existing providePageContext system\n const setContext = providePageContext(urlPattern, convertQuestionsToContext(initialQuestions));\n\n // Create a wrapper that converts between questions and context\n const setQuestions = (newQuestions: Question[]) => {\n setContext(convertQuestionsToContext(newQuestions));\n };\n\n // Add unregister method\n setQuestions.unregister = setContext.unregister;\n\n return setQuestions;\n}\n\n/**\n * React hook for providing questions that automatically cleans up on unmount.\n * This is the recommended way to use questions in React components.\n *\n * @param urlPattern - URL pattern (string or RegExp) to match against page URLs\n * @param initialQuestions - Initial array of questions to provide when the pattern matches\n * @returns A setter function to update the questions\n */\nexport function useProvideQuestions(\n urlPattern: string | RegExp,\n initialQuestions: Question[] = []\n): (questions: Question[]) => void {\n // Generate a stable unique registration ID per component instance to prevent collisions\n const registrationId = useMemo(\n () => generateRegistrationId('question'),\n [] // Empty deps = generated once per component instance\n );\n\n // Convert questions to ChatContextItem format for the underlying system\n const convertQuestionsToContext = (questions: Question[]): ChatContextItem[] => {\n return questions.map((question, index) => ({\n node: {\n id: `question-${registrationId}-${index}`,\n name: question.title ?? question.prompt,\n navigable: false,\n selectable: true,\n icon: 'question-circle',\n data: {\n type: 'question',\n prompt: question.prompt,\n title: question.title,\n context: question.context || [],\n },\n },\n occurrences: [],\n }));\n };\n\n // Use the existing useProvidePageContext system\n const setContext = useProvidePageContext(urlPattern, convertQuestionsToContext(initialQuestions));\n\n // Create a wrapper that converts between questions and context\n const setQuestions = (newQuestions: Question[]) => {\n setContext(convertQuestionsToContext(newQuestions));\n };\n\n return setQuestions;\n}\n\n/**\n * React hook to get all questions that match the current URL.\n * This filters the page context to only return question-type items.\n *\n * @returns Array of questions from all matching registrations\n */\nexport function useQuestions(): Question[] {\n const pageContext = usePageContext({ allowQuestions: true, allowComponents: false });\n\n // Filter and convert context items to questions\n return convertContextToQuestions(pageContext);\n}\n\nconst convertContextToQuestions = (contextItems: ChatContextItem[]): Question[] => {\n return contextItems\n .filter((item) => item.node.data?.type === 'question')\n .map((item) => ({\n prompt: item.node.data?.prompt || item.node.name,\n title: item.node.data?.title,\n context: item.node.data?.context || [],\n }));\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@grafana/data\");","import { BusEventWithPayload } from '@grafana/data';\nimport { getAppEvents } from '@grafana/runtime';\n\n/**\n * Payload for the InvestigationCreatedEvent\n */\nexport interface InvestigationCreatedPayload {\n /** The ID of the newly created investigation */\n investigationId: string;\n}\n\n/**\n * Event emitted when an investigation is created.\n * External integrations can subscribe to this event to react to new investigations.\n */\nexport class InvestigationCreatedEvent extends BusEventWithPayload<InvestigationCreatedPayload> {\n static type = 'grafana-assistant:investigation-created';\n}\n\n/**\n * Emit an InvestigationCreatedEvent to notify subscribers that a new investigation was created.\n *\n * @param investigationId - The ID of the newly created investigation\n */\nexport function emitInvestigationCreated(investigationId: string): void {\n const event = new InvestigationCreatedEvent({ investigationId });\n getAppEvents().publish(event);\n}\n\n/**\n * Subscribe to investigation created events.\n *\n * @param callback - Function to call when an investigation is created\n * @returns Unsubscribe function to stop listening for events\n *\n * @example\n * ```typescript\n * import { onInvestigationCreated } from '@grafana/assistant';\n *\n * const unsubscribe = onInvestigationCreated((payload) => {\n * console.log('Investigation created:', payload.investigationId);\n * });\n *\n * // Later, when you want to stop listening\n * unsubscribe();\n * ```\n */\nexport function onInvestigationCreated(callback: (payload: InvestigationCreatedPayload) => void): () => void {\n const subscription = getAppEvents().subscribe(InvestigationCreatedEvent, (event) => {\n callback(event.payload);\n });\n\n return () => subscription.unsubscribe();\n}\n","import { PluginExtensionAddedFunctionConfig } from '@grafana/data';\n\nexport type CallbackFunction = () => FunctionNamespace[];\nexport type FunctionImplementation = (...args: any[]) => any;\nexport const CALLBACK_EXTENSION_POINT = 'grafana-assistant-app/callback/v0-alpha';\n\nexport type NamedFunctions = Record<string, FunctionImplementation>;\nexport type FunctionNamespace = {\n namespace: string;\n functions: NamedFunctions;\n};\n\nexport function newFunctionNamespace(namespace: string, functions: NamedFunctions): FunctionNamespace {\n return {\n namespace,\n functions,\n };\n}\n\nexport function getExposeAssistantFunctionsConfig(\n namespaces: FunctionNamespace[]\n): PluginExtensionAddedFunctionConfig<() => FunctionNamespace[]> {\n return {\n title: 'callback',\n targets: [CALLBACK_EXTENSION_POINT],\n fn: () => {\n return namespaces.map((namespace) => {\n return {\n namespace: namespace.namespace,\n functions: namespace.functions,\n };\n });\n },\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"rxjs\");","import { getObservablePluginLinks } from '@grafana/runtime';\nimport { catchError, defer, map, Observable, of, retry, throwError, timer } from 'rxjs';\n\nexport const ASSISTANT_PLUGIN_ID = 'grafana-assistant-app';\nexport const ASSISTANT_PLUGIN_TITLE = 'Grafana Assistant';\n\nconst MAX_RETRY_ATTEMPTS = 10;\nconst INITIAL_RETRY_DELAY = 100; // 100ms\nconst MAX_RETRY_DELAY = 5000; // 5 seconds\n\n/**\n * Check if the assistant is available.\n * @returns An observable that emits true if the assistant is available, false otherwise.\n */\nexport function isAssistantAvailable(): Observable<boolean> {\n // this is to avoid crashing in older Grafana versions\n if (!getObservablePluginLinks) {\n return of(false);\n }\n\n // Use defer to make the call lazy and handle both sync and async errors\n return defer(() => {\n try {\n const links = getObservablePluginLinks({\n extensionPointId: 'grafana/extension-sidebar/v0-alpha',\n });\n return links.pipe(\n map((links: Array<{ pluginId: string; title: string }>) =>\n links.some((link) => link.pluginId === ASSISTANT_PLUGIN_ID && link.title === ASSISTANT_PLUGIN_TITLE)\n )\n );\n } catch (error) {\n // If getObservablePluginLinks throws synchronously, convert to observable error\n return throwError(() => error);\n }\n }).pipe(\n retry({\n count: MAX_RETRY_ATTEMPTS,\n delay: (error, retryCount) => {\n // Check if error indicates Grafana hasn't started yet\n const errorMessage = error?.message?.toLowerCase() || '';\n const isGrafanaNotReady =\n errorMessage.includes('can only be used after') ||\n errorMessage.includes('grafana instance has started') ||\n errorMessage.includes('not started');\n\n // Don't retry for non-race-condition errors\n if (!isGrafanaNotReady) {\n throw error;\n }\n\n // Exponential backoff: delay = INITIAL_RETRY_DELAY * 2^retryCount, capped at MAX_RETRY_DELAY\n const delayMs = Math.min(INITIAL_RETRY_DELAY * Math.pow(2, retryCount - 1), MAX_RETRY_DELAY);\n return timer(delayMs);\n },\n }),\n catchError(() => {\n // After all retries exhausted, return false\n return of(false);\n })\n );\n}\n","import { BusEventBase, BusEventWithPayload } from '@grafana/data';\nimport { getAppEvents, reportInteraction } from '@grafana/runtime';\nimport { ChatContextItem } from './context/types';\nimport { ASSISTANT_PLUGIN_ID, ASSISTANT_PLUGIN_TITLE } from './plugin';\n\ninterface OpenExtensionSidebarPayload {\n props?: Record<string, unknown>;\n pluginId: string;\n componentTitle: string;\n}\n\nclass OpenExtensionSidebarEvent extends BusEventWithPayload<OpenExtensionSidebarPayload> {\n static type = 'open-extension-sidebar';\n}\n\nclass CloseExtensionSidebarEvent extends BusEventBase {\n static type = 'close-extension-sidebar';\n}\n\nclass ToggleExtensionSidebarEvent extends BusEventWithPayload<OpenExtensionSidebarPayload> {\n static type = 'toggle-extension-sidebar';\n}\n\nfunction openExtensionSidebar(pluginId: string, componentTitle: string, props?: Record<string, unknown>) {\n const event = new OpenExtensionSidebarEvent({\n pluginId,\n componentTitle,\n props,\n });\n getAppEvents().publish(event);\n}\n\nfunction closeExtensionSidebar() {\n const event = new CloseExtensionSidebarEvent();\n getAppEvents().publish(event);\n}\n\nfunction toggleExtensionSidebar(pluginId: string, componentTitle: string, props?: Record<string, unknown>) {\n const event = new ToggleExtensionSidebarEvent({\n pluginId,\n componentTitle,\n props,\n });\n getAppEvents().publish(event);\n}\n\nexport type OpenAssistantProps = {\n origin: string;\n\n prompt?: string;\n context?: ChatContextItem[];\n autoSend?: boolean;\n /** Mode to open the assistant in. Built-in modes: 'assistant', 'investigation', 'dashboarding'. Can also be a backend agent ID. */\n mode?: string;\n};\n\n/**\n * Open the Grafana Assistant sidebar with a given initial prompt.\n *\n * @param props - The props to pass to the assistant.\n * @param props.origin - The origin of the request that opened the assistant. This is used to track the source of the request. Should be a structured string using forward slashes, with the first part as a namespace. Examples: 'grafana-datasources/prometheus/query-builder', 'grafana-slo-app/slo-editor-overview', 'grafana/trace-view-analyzer`.\n * @param props.prompt - The initial prompt to display in the assistant.\n * @param props.context - The initial context to display in the assistant. Created with `createContext`.\n * @param props.autoSend - Whether to automatically send the initial prompt. When true, opens a chat and sends the initial prompt right away. When false, opens chat and updates user message without sending it. Defaults to true.\n * @param props.mode - The mode to open the assistant in. Built-in modes: 'assistant', 'investigation', 'dashboarding'. Can also be a backend agent ID. Defaults to 'assistant'.\n */\nexport function openAssistant(props: OpenAssistantProps) {\n reportInteraction('grafana_assistant_app_opened_sidebar', {\n from: props.origin,\n prompt: props.prompt ?? '',\n });\n\n openExtensionSidebar(ASSISTANT_PLUGIN_ID, ASSISTANT_PLUGIN_TITLE, {\n initialPrompt: props.prompt,\n initialContext: props.context,\n initialAutoSend: props.autoSend ?? true,\n origin: props.origin,\n initialMode: props.mode,\n });\n}\n\n/**\n * Close the Grafana Assistant sidebar.\n */\nexport function closeAssistant() {\n closeExtensionSidebar();\n}\n\nexport function toggleAssistant(props: OpenAssistantProps) {\n reportInteraction('grafana_assistant_app_toggled_sidebar', {\n from: props.origin,\n prompt: props.prompt ?? '',\n });\n\n toggleExtensionSidebar(ASSISTANT_PLUGIN_ID, ASSISTANT_PLUGIN_TITLE, {\n initialPrompt: props.prompt,\n initialContext: props.context,\n initialAutoSend: props.autoSend ?? true,\n origin: props.origin,\n initialMode: props.mode,\n });\n}\n","import { useEffect, useState } from 'react';\nimport { isAssistantAvailable } from './plugin';\nimport { closeAssistant, openAssistant, toggleAssistant, OpenAssistantProps } from './sidebar';\n\nexport type AssistantHook = {\n /** Whether the availability check is still in progress. */\n isLoading: boolean;\n isAvailable: boolean;\n openAssistant: ((props: OpenAssistantProps) => void) | undefined;\n closeAssistant: (() => void) | undefined;\n toggleAssistant: ((props: OpenAssistantProps) => void) | undefined;\n};\n/**\n * Hook to check if the assistant is available and return the open, close, and toggle functions.\n * @returns {AssistantHook}\n */\nexport function useAssistant(): AssistantHook {\n const [available, setAvailable] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n const sub = isAssistantAvailable().subscribe(setAvailable);\n return () => sub.unsubscribe();\n }, []);\n\n const isAvailable = available ?? false;\n\n return {\n isLoading: available === undefined,\n isAvailable,\n openAssistant: isAvailable ? openAssistant : undefined,\n closeAssistant: isAvailable ? closeAssistant : undefined,\n toggleAssistant: isAvailable ? toggleAssistant : undefined,\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@grafana/ui\");","var isDevelopment = false;\n\n/*\n\nBased off glamor's StyleSheet, thanks Sunil ❤️\n\nhigh performance StyleSheet for css-in-js systems\n\n- uses multiple style tags behind the scenes for millions of rules\n- uses `insertRule` for appending in production for *much* faster performance\n\n// usage\n\nimport { StyleSheet } from '@emotion/sheet'\n\nlet styleSheet = new StyleSheet({ key: '', container: document.head })\n\nstyleSheet.insert('#box { border: 1px solid red; }')\n- appends a css rule into the stylesheet\n\nstyleSheet.flush()\n- empties the stylesheet of all its contents\n\n*/\n\nfunction sheetForTag(tag) {\n if (tag.sheet) {\n return tag.sheet;\n } // this weirdness brought to you by firefox\n\n /* istanbul ignore next */\n\n\n for (var i = 0; i < document.styleSheets.length; i++) {\n if (document.styleSheets[i].ownerNode === tag) {\n return document.styleSheets[i];\n }\n } // this function should always return with a value\n // TS can't understand it though so we make it stop complaining here\n\n\n return undefined;\n}\n\nfunction createStyleElement(options) {\n var tag = document.createElement('style');\n tag.setAttribute('data-emotion', options.key);\n\n if (options.nonce !== undefined) {\n tag.setAttribute('nonce', options.nonce);\n }\n\n tag.appendChild(document.createTextNode(''));\n tag.setAttribute('data-s', '');\n return tag;\n}\n\nvar StyleSheet = /*#__PURE__*/function () {\n // Using Node instead of HTMLElement since container may be a ShadowRoot\n function StyleSheet(options) {\n var _this = this;\n\n this._insertTag = function (tag) {\n var before;\n\n if (_this.tags.length === 0) {\n if (_this.insertionPoint) {\n before = _this.insertionPoint.nextSibling;\n } else if (_this.prepend) {\n before = _this.container.firstChild;\n } else {\n before = _this.before;\n }\n } else {\n before = _this.tags[_this.tags.length - 1].nextSibling;\n }\n\n _this.container.insertBefore(tag, before);\n\n _this.tags.push(tag);\n };\n\n this.isSpeedy = options.speedy === undefined ? !isDevelopment : options.speedy;\n this.tags = [];\n this.ctr = 0;\n this.nonce = options.nonce; // key is the value of the data-emotion attribute, it's used to identify different sheets\n\n this.key = options.key;\n this.container = options.container;\n this.prepend = options.prepend;\n this.insertionPoint = options.insertionPoint;\n this.before = null;\n }\n\n var _proto = StyleSheet.prototype;\n\n _proto.hydrate = function hydrate(nodes) {\n nodes.forEach(this._insertTag);\n };\n\n _proto.insert = function insert(rule) {\n // the max length is how many rules we have per style tag, it's 65000 in speedy mode\n // it's 1 in dev because we insert source maps that map a single rule to a location\n // and you can only have one source map per style tag\n if (this.ctr % (this.isSpeedy ? 65000 : 1) === 0) {\n this._insertTag(createStyleElement(this));\n }\n\n var tag = this.tags[this.tags.length - 1];\n\n if (this.isSpeedy) {\n var sheet = sheetForTag(tag);\n\n try {\n // this is the ultrafast version, works across browsers\n // the big drawback is that the css won't be editable in devtools\n sheet.insertRule(rule, sheet.cssRules.length);\n } catch (e) {\n }\n } else {\n tag.appendChild(document.createTextNode(rule));\n }\n\n this.ctr++;\n };\n\n _proto.flush = function flush() {\n this.tags.forEach(function (tag) {\n var _tag$parentNode;\n\n return (_tag$parentNode = tag.parentNode) == null ? void 0 : _tag$parentNode.removeChild(tag);\n });\n this.tags = [];\n this.ctr = 0;\n };\n\n return StyleSheet;\n}();\n\nexport { StyleSheet };\n","/**\n * @param {number}\n * @return {number}\n */\nexport var abs = Math.abs\n\n/**\n * @param {number}\n * @return {string}\n */\nexport var from = String.fromCharCode\n\n/**\n * @param {object}\n * @return {object}\n */\nexport var assign = Object.assign\n\n/**\n * @param {string} value\n * @param {number} length\n * @return {number}\n */\nexport function hash (value, length) {\n\treturn charat(value, 0) ^ 45 ? (((((((length << 2) ^ charat(value, 0)) << 2) ^ charat(value, 1)) << 2) ^ charat(value, 2)) << 2) ^ charat(value, 3) : 0\n}\n\n/**\n * @param {string} value\n * @return {string}\n */\nexport function trim (value) {\n\treturn value.trim()\n}\n\n/**\n * @param {string} value\n * @param {RegExp} pattern\n * @return {string?}\n */\nexport function match (value, pattern) {\n\treturn (value = pattern.exec(value)) ? value[0] : value\n}\n\n/**\n * @param {string} value\n * @param {(string|RegExp)} pattern\n * @param {string} replacement\n * @return {string}\n */\nexport function replace (value, pattern, replacement) {\n\treturn value.replace(pattern, replacement)\n}\n\n/**\n * @param {string} value\n * @param {string} search\n * @return {number}\n */\nexport function indexof (value, search) {\n\treturn value.indexOf(search)\n}\n\n/**\n * @param {string} value\n * @param {number} index\n * @return {number}\n */\nexport function charat (value, index) {\n\treturn value.charCodeAt(index) | 0\n}\n\n/**\n * @param {string} value\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function substr (value, begin, end) {\n\treturn value.slice(begin, end)\n}\n\n/**\n * @param {string} value\n * @return {number}\n */\nexport function strlen (value) {\n\treturn value.length\n}\n\n/**\n * @param {any[]} value\n * @return {number}\n */\nexport function sizeof (value) {\n\treturn value.length\n}\n\n/**\n * @param {any} value\n * @param {any[]} array\n * @return {any}\n */\nexport function append (value, array) {\n\treturn array.push(value), value\n}\n\n/**\n * @param {string[]} array\n * @param {function} callback\n * @return {string}\n */\nexport function combine (array, callback) {\n\treturn array.map(callback).join('')\n}\n","import {from, trim, charat, strlen, substr, append, assign} from './Utility.js'\n\nexport var line = 1\nexport var column = 1\nexport var length = 0\nexport var position = 0\nexport var character = 0\nexport var characters = ''\n\n/**\n * @param {string} value\n * @param {object | null} root\n * @param {object | null} parent\n * @param {string} type\n * @param {string[] | string} props\n * @param {object[] | string} children\n * @param {number} length\n */\nexport function node (value, root, parent, type, props, children, length) {\n\treturn {value: value, root: root, parent: parent, type: type, props: props, children: children, line: line, column: column, length: length, return: ''}\n}\n\n/**\n * @param {object} root\n * @param {object} props\n * @return {object}\n */\nexport function copy (root, props) {\n\treturn assign(node('', null, null, '', null, null, 0), root, {length: -root.length}, props)\n}\n\n/**\n * @return {number}\n */\nexport function char () {\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function prev () {\n\tcharacter = position > 0 ? charat(characters, --position) : 0\n\n\tif (column--, character === 10)\n\t\tcolumn = 1, line--\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function next () {\n\tcharacter = position < length ? charat(characters, position++) : 0\n\n\tif (column++, character === 10)\n\t\tcolumn = 1, line++\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function peek () {\n\treturn charat(characters, position)\n}\n\n/**\n * @return {number}\n */\nexport function caret () {\n\treturn position\n}\n\n/**\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function slice (begin, end) {\n\treturn substr(characters, begin, end)\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function token (type) {\n\tswitch (type) {\n\t\t// \\0 \\t \\n \\r \\s whitespace token\n\t\tcase 0: case 9: case 10: case 13: case 32:\n\t\t\treturn 5\n\t\t// ! + , / > @ ~ isolate token\n\t\tcase 33: case 43: case 44: case 47: case 62: case 64: case 126:\n\t\t// ; { } breakpoint token\n\t\tcase 59: case 123: case 125:\n\t\t\treturn 4\n\t\t// : accompanied token\n\t\tcase 58:\n\t\t\treturn 3\n\t\t// \" ' ( [ opening delimit token\n\t\tcase 34: case 39: case 40: case 91:\n\t\t\treturn 2\n\t\t// ) ] closing delimit token\n\t\tcase 41: case 93:\n\t\t\treturn 1\n\t}\n\n\treturn 0\n}\n\n/**\n * @param {string} value\n * @return {any[]}\n */\nexport function alloc (value) {\n\treturn line = column = 1, length = strlen(characters = value), position = 0, []\n}\n\n/**\n * @param {any} value\n * @return {any}\n */\nexport function dealloc (value) {\n\treturn characters = '', value\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function delimit (type) {\n\treturn trim(slice(position - 1, delimiter(type === 91 ? type + 2 : type === 40 ? type + 1 : type)))\n}\n\n/**\n * @param {string} value\n * @return {string[]}\n */\nexport function tokenize (value) {\n\treturn dealloc(tokenizer(alloc(value)))\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function whitespace (type) {\n\twhile (character = peek())\n\t\tif (character < 33)\n\t\t\tnext()\n\t\telse\n\t\t\tbreak\n\n\treturn token(type) > 2 || token(character) > 3 ? '' : ' '\n}\n\n/**\n * @param {string[]} children\n * @return {string[]}\n */\nexport function tokenizer (children) {\n\twhile (next())\n\t\tswitch (token(character)) {\n\t\t\tcase 0: append(identifier(position - 1), children)\n\t\t\t\tbreak\n\t\t\tcase 2: append(delimit(character), children)\n\t\t\t\tbreak\n\t\t\tdefault: append(from(character), children)\n\t\t}\n\n\treturn children\n}\n\n/**\n * @param {number} index\n * @param {number} count\n * @return {string}\n */\nexport function escaping (index, count) {\n\twhile (--count && next())\n\t\t// not 0-9 A-F a-f\n\t\tif (character < 48 || character > 102 || (character > 57 && character < 65) || (character > 70 && character < 97))\n\t\t\tbreak\n\n\treturn slice(index, caret() + (count < 6 && peek() == 32 && next() == 32))\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function delimiter (type) {\n\twhile (next())\n\t\tswitch (character) {\n\t\t\t// ] ) \" '\n\t\t\tcase type:\n\t\t\t\treturn position\n\t\t\t// \" '\n\t\t\tcase 34: case 39:\n\t\t\t\tif (type !== 34 && type !== 39)\n\t\t\t\t\tdelimiter(character)\n\t\t\t\tbreak\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (type === 41)\n\t\t\t\t\tdelimiter(type)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tnext()\n\t\t\t\tbreak\n\t\t}\n\n\treturn position\n}\n\n/**\n * @param {number} type\n * @param {number} index\n * @return {number}\n */\nexport function commenter (type, index) {\n\twhile (next())\n\t\t// //\n\t\tif (type + character === 47 + 10)\n\t\t\tbreak\n\t\t// /*\n\t\telse if (type + character === 42 + 42 && peek() === 47)\n\t\t\tbreak\n\n\treturn '/*' + slice(index, position - 1) + '*' + from(type === 47 ? type : next())\n}\n\n/**\n * @param {number} index\n * @return {string}\n */\nexport function identifier (index) {\n\twhile (!token(peek()))\n\t\tnext()\n\n\treturn slice(index, position)\n}\n","export var MS = '-ms-'\nexport var MOZ = '-moz-'\nexport var WEBKIT = '-webkit-'\n\nexport var COMMENT = 'comm'\nexport var RULESET = 'rule'\nexport var DECLARATION = 'decl'\n\nexport var PAGE = '@page'\nexport var MEDIA = '@media'\nexport var IMPORT = '@import'\nexport var CHARSET = '@charset'\nexport var VIEWPORT = '@viewport'\nexport var SUPPORTS = '@supports'\nexport var DOCUMENT = '@document'\nexport var NAMESPACE = '@namespace'\nexport var KEYFRAMES = '@keyframes'\nexport var FONT_FACE = '@font-face'\nexport var COUNTER_STYLE = '@counter-style'\nexport var FONT_FEATURE_VALUES = '@font-feature-values'\nexport var LAYER = '@layer'\n","import {IMPORT, LAYER, COMMENT, RULESET, DECLARATION, KEYFRAMES} from './Enum.js'\nimport {strlen, sizeof} from './Utility.js'\n\n/**\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function serialize (children, callback) {\n\tvar output = ''\n\tvar length = sizeof(children)\n\n\tfor (var i = 0; i < length; i++)\n\t\toutput += callback(children[i], i, children, callback) || ''\n\n\treturn output\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function stringify (element, index, children, callback) {\n\tswitch (element.type) {\n\t\tcase LAYER: if (element.children.length) break\n\t\tcase IMPORT: case DECLARATION: return element.return = element.return || element.value\n\t\tcase COMMENT: return ''\n\t\tcase KEYFRAMES: return element.return = element.value + '{' + serialize(element.children, callback) + '}'\n\t\tcase RULESET: element.value = element.props.join(',')\n\t}\n\n\treturn strlen(children = serialize(element.children, callback)) ? element.return = element.value + '{' + children + '}' : ''\n}\n","import {COMMENT, RULESET, DECLARATION} from './Enum.js'\nimport {abs, charat, trim, from, sizeof, strlen, substr, append, replace, indexof} from './Utility.js'\nimport {node, char, prev, next, peek, caret, alloc, dealloc, delimit, whitespace, escaping, identifier, commenter} from './Tokenizer.js'\n\n/**\n * @param {string} value\n * @return {object[]}\n */\nexport function compile (value) {\n\treturn dealloc(parse('', null, null, null, [''], value = alloc(value), 0, [0], value))\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {string[]} rule\n * @param {string[]} rules\n * @param {string[]} rulesets\n * @param {number[]} pseudo\n * @param {number[]} points\n * @param {string[]} declarations\n * @return {object}\n */\nexport function parse (value, root, parent, rule, rules, rulesets, pseudo, points, declarations) {\n\tvar index = 0\n\tvar offset = 0\n\tvar length = pseudo\n\tvar atrule = 0\n\tvar property = 0\n\tvar previous = 0\n\tvar variable = 1\n\tvar scanning = 1\n\tvar ampersand = 1\n\tvar character = 0\n\tvar type = ''\n\tvar props = rules\n\tvar children = rulesets\n\tvar reference = rule\n\tvar characters = type\n\n\twhile (scanning)\n\t\tswitch (previous = character, character = next()) {\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (previous != 108 && charat(characters, length - 1) == 58) {\n\t\t\t\t\tif (indexof(characters += replace(delimit(character), '&', '&\\f'), '&\\f') != -1)\n\t\t\t\t\t\tampersand = -1\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t// \" ' [\n\t\t\tcase 34: case 39: case 91:\n\t\t\t\tcharacters += delimit(character)\n\t\t\t\tbreak\n\t\t\t// \\t \\n \\r \\s\n\t\t\tcase 9: case 10: case 13: case 32:\n\t\t\t\tcharacters += whitespace(previous)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tcharacters += escaping(caret() - 1, 7)\n\t\t\t\tcontinue\n\t\t\t// /\n\t\t\tcase 47:\n\t\t\t\tswitch (peek()) {\n\t\t\t\t\tcase 42: case 47:\n\t\t\t\t\t\tappend(comment(commenter(next(), caret()), root, parent), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcharacters += '/'\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t// {\n\t\t\tcase 123 * variable:\n\t\t\t\tpoints[index++] = strlen(characters) * ampersand\n\t\t\t// } ; \\0\n\t\t\tcase 125 * variable: case 59: case 0:\n\t\t\t\tswitch (character) {\n\t\t\t\t\t// \\0 }\n\t\t\t\t\tcase 0: case 125: scanning = 0\n\t\t\t\t\t// ;\n\t\t\t\t\tcase 59 + offset: if (ampersand == -1) characters = replace(characters, /\\f/g, '')\n\t\t\t\t\t\tif (property > 0 && (strlen(characters) - length))\n\t\t\t\t\t\t\tappend(property > 32 ? declaration(characters + ';', rule, parent, length - 1) : declaration(replace(characters, ' ', '') + ';', rule, parent, length - 2), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @ ;\n\t\t\t\t\tcase 59: characters += ';'\n\t\t\t\t\t// { rule/at-rule\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tappend(reference = ruleset(characters, root, parent, index, offset, rules, points, type, props = [], children = [], length), rulesets)\n\n\t\t\t\t\t\tif (character === 123)\n\t\t\t\t\t\t\tif (offset === 0)\n\t\t\t\t\t\t\t\tparse(characters, root, reference, reference, props, rulesets, length, points, children)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tswitch (atrule === 99 && charat(characters, 3) === 110 ? 100 : atrule) {\n\t\t\t\t\t\t\t\t\t// d l m s\n\t\t\t\t\t\t\t\t\tcase 100: case 108: case 109: case 115:\n\t\t\t\t\t\t\t\t\t\tparse(value, reference, reference, rule && append(ruleset(value, reference, reference, 0, 0, rules, points, type, rules, props = [], length), children), rules, children, length, points, rule ? props : children)\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tparse(characters, reference, reference, reference, [''], children, 0, points, children)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = offset = property = 0, variable = ampersand = 1, type = characters = '', length = pseudo\n\t\t\t\tbreak\n\t\t\t// :\n\t\t\tcase 58:\n\t\t\t\tlength = 1 + strlen(characters), property = previous\n\t\t\tdefault:\n\t\t\t\tif (variable < 1)\n\t\t\t\t\tif (character == 123)\n\t\t\t\t\t\t--variable\n\t\t\t\t\telse if (character == 125 && variable++ == 0 && prev() == 125)\n\t\t\t\t\t\tcontinue\n\n\t\t\t\tswitch (characters += from(character), character * variable) {\n\t\t\t\t\t// &\n\t\t\t\t\tcase 38:\n\t\t\t\t\t\tampersand = offset > 0 ? 1 : (characters += '\\f', -1)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// ,\n\t\t\t\t\tcase 44:\n\t\t\t\t\t\tpoints[index++] = (strlen(characters) - 1) * ampersand, ampersand = 1\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @\n\t\t\t\t\tcase 64:\n\t\t\t\t\t\t// -\n\t\t\t\t\t\tif (peek() === 45)\n\t\t\t\t\t\t\tcharacters += delimit(next())\n\n\t\t\t\t\t\tatrule = peek(), offset = length = strlen(type = characters += identifier(caret())), character++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// -\n\t\t\t\t\tcase 45:\n\t\t\t\t\t\tif (previous === 45 && strlen(characters) == 2)\n\t\t\t\t\t\t\tvariable = 0\n\t\t\t\t}\n\t\t}\n\n\treturn rulesets\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} index\n * @param {number} offset\n * @param {string[]} rules\n * @param {number[]} points\n * @param {string} type\n * @param {string[]} props\n * @param {string[]} children\n * @param {number} length\n * @return {object}\n */\nexport function ruleset (value, root, parent, index, offset, rules, points, type, props, children, length) {\n\tvar post = offset - 1\n\tvar rule = offset === 0 ? rules : ['']\n\tvar size = sizeof(rule)\n\n\tfor (var i = 0, j = 0, k = 0; i < index; ++i)\n\t\tfor (var x = 0, y = substr(value, post + 1, post = abs(j = points[i])), z = value; x < size; ++x)\n\t\t\tif (z = trim(j > 0 ? rule[x] + ' ' + y : replace(y, /&\\f/g, rule[x])))\n\t\t\t\tprops[k++] = z\n\n\treturn node(value, root, parent, offset === 0 ? RULESET : type, props, children, length)\n}\n\n/**\n * @param {number} value\n * @param {object} root\n * @param {object?} parent\n * @return {object}\n */\nexport function comment (value, root, parent) {\n\treturn node(value, root, parent, COMMENT, from(char()), substr(value, 2, -2), 0)\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} length\n * @return {object}\n */\nexport function declaration (value, root, parent, length) {\n\treturn node(value, root, parent, DECLARATION, substr(value, 0, length), substr(value, length + 1, -1), length)\n}\n","import { StyleSheet } from '@emotion/sheet';\nimport { dealloc, alloc, next, token, from, peek, delimit, slice, position, RULESET, combine, match, serialize, copy, replace, WEBKIT, MOZ, MS, KEYFRAMES, DECLARATION, hash, charat, strlen, indexof, stringify, rulesheet, middleware, compile } from 'stylis';\nimport '@emotion/weak-memoize';\nimport '@emotion/memoize';\n\nvar identifierWithPointTracking = function identifierWithPointTracking(begin, points, index) {\n var previous = 0;\n var character = 0;\n\n while (true) {\n previous = character;\n character = peek(); // &\\f\n\n if (previous === 38 && character === 12) {\n points[index] = 1;\n }\n\n if (token(character)) {\n break;\n }\n\n next();\n }\n\n return slice(begin, position);\n};\n\nvar toRules = function toRules(parsed, points) {\n // pretend we've started with a comma\n var index = -1;\n var character = 44;\n\n do {\n switch (token(character)) {\n case 0:\n // &\\f\n if (character === 38 && peek() === 12) {\n // this is not 100% correct, we don't account for literal sequences here - like for example quoted strings\n // stylis inserts \\f after & to know when & where it should replace this sequence with the context selector\n // and when it should just concatenate the outer and inner selectors\n // it's very unlikely for this sequence to actually appear in a different context, so we just leverage this fact here\n points[index] = 1;\n }\n\n parsed[index] += identifierWithPointTracking(position - 1, points, index);\n break;\n\n case 2:\n parsed[index] += delimit(character);\n break;\n\n case 4:\n // comma\n if (character === 44) {\n // colon\n parsed[++index] = peek() === 58 ? '&\\f' : '';\n points[index] = parsed[index].length;\n break;\n }\n\n // fallthrough\n\n default:\n parsed[index] += from(character);\n }\n } while (character = next());\n\n return parsed;\n};\n\nvar getRules = function getRules(value, points) {\n return dealloc(toRules(alloc(value), points));\n}; // WeakSet would be more appropriate, but only WeakMap is supported in IE11\n\n\nvar fixedElements = /* #__PURE__ */new WeakMap();\nvar compat = function compat(element) {\n if (element.type !== 'rule' || !element.parent || // positive .length indicates that this rule contains pseudo\n // negative .length indicates that this rule has been already prefixed\n element.length < 1) {\n return;\n }\n\n var value = element.value;\n var parent = element.parent;\n var isImplicitRule = element.column === parent.column && element.line === parent.line;\n\n while (parent.type !== 'rule') {\n parent = parent.parent;\n if (!parent) return;\n } // short-circuit for the simplest case\n\n\n if (element.props.length === 1 && value.charCodeAt(0) !== 58\n /* colon */\n && !fixedElements.get(parent)) {\n return;\n } // if this is an implicitly inserted rule (the one eagerly inserted at the each new nested level)\n // then the props has already been manipulated beforehand as they that array is shared between it and its \"rule parent\"\n\n\n if (isImplicitRule) {\n return;\n }\n\n fixedElements.set(element, true);\n var points = [];\n var rules = getRules(value, points);\n var parentRules = parent.props;\n\n for (var i = 0, k = 0; i < rules.length; i++) {\n for (var j = 0; j < parentRules.length; j++, k++) {\n element.props[k] = points[i] ? rules[i].replace(/&\\f/g, parentRules[j]) : parentRules[j] + \" \" + rules[i];\n }\n }\n};\nvar removeLabel = function removeLabel(element) {\n if (element.type === 'decl') {\n var value = element.value;\n\n if ( // charcode for l\n value.charCodeAt(0) === 108 && // charcode for b\n value.charCodeAt(2) === 98) {\n // this ignores label\n element[\"return\"] = '';\n element.value = '';\n }\n }\n};\n\n/* eslint-disable no-fallthrough */\n\nfunction prefix(value, length) {\n switch (hash(value, length)) {\n // color-adjust\n case 5103:\n return WEBKIT + 'print-' + value + value;\n // animation, animation-(delay|direction|duration|fill-mode|iteration-count|name|play-state|timing-function)\n\n case 5737:\n case 4201:\n case 3177:\n case 3433:\n case 1641:\n case 4457:\n case 2921: // text-decoration, filter, clip-path, backface-visibility, column, box-decoration-break\n\n case 5572:\n case 6356:\n case 5844:\n case 3191:\n case 6645:\n case 3005: // mask, mask-image, mask-(mode|clip|size), mask-(repeat|origin), mask-position, mask-composite,\n\n case 6391:\n case 5879:\n case 5623:\n case 6135:\n case 4599:\n case 4855: // background-clip, columns, column-(count|fill|gap|rule|rule-color|rule-style|rule-width|span|width)\n\n case 4215:\n case 6389:\n case 5109:\n case 5365:\n case 5621:\n case 3829:\n return WEBKIT + value + value;\n // appearance, user-select, transform, hyphens, text-size-adjust\n\n case 5349:\n case 4246:\n case 4810:\n case 6968:\n case 2756:\n return WEBKIT + value + MOZ + value + MS + value + value;\n // flex, flex-direction\n\n case 6828:\n case 4268:\n return WEBKIT + value + MS + value + value;\n // order\n\n case 6165:\n return WEBKIT + value + MS + 'flex-' + value + value;\n // align-items\n\n case 5187:\n return WEBKIT + value + replace(value, /(\\w+).+(:[^]+)/, WEBKIT + 'box-$1$2' + MS + 'flex-$1$2') + value;\n // align-self\n\n case 5443:\n return WEBKIT + value + MS + 'flex-item-' + replace(value, /flex-|-self/, '') + value;\n // align-content\n\n case 4675:\n return WEBKIT + value + MS + 'flex-line-pack' + replace(value, /align-content|flex-|-self/, '') + value;\n // flex-shrink\n\n case 5548:\n return WEBKIT + value + MS + replace(value, 'shrink', 'negative') + value;\n // flex-basis\n\n case 5292:\n return WEBKIT + value + MS + replace(value, 'basis', 'preferred-size') + value;\n // flex-grow\n\n case 6060:\n return WEBKIT + 'box-' + replace(value, '-grow', '') + WEBKIT + value + MS + replace(value, 'grow', 'positive') + value;\n // transition\n\n case 4554:\n return WEBKIT + replace(value, /([^-])(transform)/g, '$1' + WEBKIT + '$2') + value;\n // cursor\n\n case 6187:\n return replace(replace(replace(value, /(zoom-|grab)/, WEBKIT + '$1'), /(image-set)/, WEBKIT + '$1'), value, '') + value;\n // background, background-image\n\n case 5495:\n case 3959:\n return replace(value, /(image-set\\([^]*)/, WEBKIT + '$1' + '$`$1');\n // justify-content\n\n case 4968:\n return replace(replace(value, /(.+:)(flex-)?(.*)/, WEBKIT + 'box-pack:$3' + MS + 'flex-pack:$3'), /s.+-b[^;]+/, 'justify') + WEBKIT + value + value;\n // (margin|padding)-inline-(start|end)\n\n case 4095:\n case 3583:\n case 4068:\n case 2532:\n return replace(value, /(.+)-inline(.+)/, WEBKIT + '$1$2') + value;\n // (min|max)?(width|height|inline-size|block-size)\n\n case 8116:\n case 7059:\n case 5753:\n case 5535:\n case 5445:\n case 5701:\n case 4933:\n case 4677:\n case 5533:\n case 5789:\n case 5021:\n case 4765:\n // stretch, max-content, min-content, fill-available\n if (strlen(value) - 1 - length > 6) switch (charat(value, length + 1)) {\n // (m)ax-content, (m)in-content\n case 109:\n // -\n if (charat(value, length + 4) !== 45) break;\n // (f)ill-available, (f)it-content\n\n case 102:\n return replace(value, /(.+:)(.+)-([^]+)/, '$1' + WEBKIT + '$2-$3' + '$1' + MOZ + (charat(value, length + 3) == 108 ? '$3' : '$2-$3')) + value;\n // (s)tretch\n\n case 115:\n return ~indexof(value, 'stretch') ? prefix(replace(value, 'stretch', 'fill-available'), length) + value : value;\n }\n break;\n // position: sticky\n\n case 4949:\n // (s)ticky?\n if (charat(value, length + 1) !== 115) break;\n // display: (flex|inline-flex)\n\n case 6444:\n switch (charat(value, strlen(value) - 3 - (~indexof(value, '!important') && 10))) {\n // stic(k)y\n case 107:\n return replace(value, ':', ':' + WEBKIT) + value;\n // (inline-)?fl(e)x\n\n case 101:\n return replace(value, /(.+:)([^;!]+)(;|!.+)?/, '$1' + WEBKIT + (charat(value, 14) === 45 ? 'inline-' : '') + 'box$3' + '$1' + WEBKIT + '$2$3' + '$1' + MS + '$2box$3') + value;\n }\n\n break;\n // writing-mode\n\n case 5936:\n switch (charat(value, length + 11)) {\n // vertical-l(r)\n case 114:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'tb') + value;\n // vertical-r(l)\n\n case 108:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'tb-rl') + value;\n // horizontal(-)tb\n\n case 45:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'lr') + value;\n }\n\n return WEBKIT + value + MS + value + value;\n }\n\n return value;\n}\n\nvar prefixer = function prefixer(element, index, children, callback) {\n if (element.length > -1) if (!element[\"return\"]) switch (element.type) {\n case DECLARATION:\n element[\"return\"] = prefix(element.value, element.length);\n break;\n\n case KEYFRAMES:\n return serialize([copy(element, {\n value: replace(element.value, '@', '@' + WEBKIT)\n })], callback);\n\n case RULESET:\n if (element.length) return combine(element.props, function (value) {\n switch (match(value, /(::plac\\w+|:read-\\w+)/)) {\n // :read-(only|write)\n case ':read-only':\n case ':read-write':\n return serialize([copy(element, {\n props: [replace(value, /:(read-\\w+)/, ':' + MOZ + '$1')]\n })], callback);\n // :placeholder\n\n case '::placeholder':\n return serialize([copy(element, {\n props: [replace(value, /:(plac\\w+)/, ':' + WEBKIT + 'input-$1')]\n }), copy(element, {\n props: [replace(value, /:(plac\\w+)/, ':' + MOZ + '$1')]\n }), copy(element, {\n props: [replace(value, /:(plac\\w+)/, MS + 'input-$1')]\n })], callback);\n }\n\n return '';\n });\n }\n};\n\nvar defaultStylisPlugins = [prefixer];\n\nvar createCache = function createCache(options) {\n var key = options.key;\n\n if (key === 'css') {\n var ssrStyles = document.querySelectorAll(\"style[data-emotion]:not([data-s])\"); // get SSRed styles out of the way of React's hydration\n // document.head is a safe place to move them to(though note document.head is not necessarily the last place they will be)\n // note this very very intentionally targets all style elements regardless of the key to ensure\n // that creating a cache works inside of render of a React component\n\n Array.prototype.forEach.call(ssrStyles, function (node) {\n // we want to only move elements which have a space in the data-emotion attribute value\n // because that indicates that it is an Emotion 11 server-side rendered style elements\n // while we will already ignore Emotion 11 client-side inserted styles because of the :not([data-s]) part in the selector\n // Emotion 10 client-side inserted styles did not have data-s (but importantly did not have a space in their data-emotion attributes)\n // so checking for the space ensures that loading Emotion 11 after Emotion 10 has inserted some styles\n // will not result in the Emotion 10 styles being destroyed\n var dataEmotionAttribute = node.getAttribute('data-emotion');\n\n if (dataEmotionAttribute.indexOf(' ') === -1) {\n return;\n }\n\n document.head.appendChild(node);\n node.setAttribute('data-s', '');\n });\n }\n\n var stylisPlugins = options.stylisPlugins || defaultStylisPlugins;\n\n var inserted = {};\n var container;\n var nodesToHydrate = [];\n\n {\n container = options.container || document.head;\n Array.prototype.forEach.call( // this means we will ignore elements which don't have a space in them which\n // means that the style elements we're looking at are only Emotion 11 server-rendered style elements\n document.querySelectorAll(\"style[data-emotion^=\\\"\" + key + \" \\\"]\"), function (node) {\n var attrib = node.getAttribute(\"data-emotion\").split(' ');\n\n for (var i = 1; i < attrib.length; i++) {\n inserted[attrib[i]] = true;\n }\n\n nodesToHydrate.push(node);\n });\n }\n\n var _insert;\n\n var omnipresentPlugins = [compat, removeLabel];\n\n {\n var currentSheet;\n var finalizingPlugins = [stringify, rulesheet(function (rule) {\n currentSheet.insert(rule);\n })];\n var serializer = middleware(omnipresentPlugins.concat(stylisPlugins, finalizingPlugins));\n\n var stylis = function stylis(styles) {\n return serialize(compile(styles), serializer);\n };\n\n _insert = function insert(selector, serialized, sheet, shouldCache) {\n currentSheet = sheet;\n\n stylis(selector ? selector + \"{\" + serialized.styles + \"}\" : serialized.styles);\n\n if (shouldCache) {\n cache.inserted[serialized.name] = true;\n }\n };\n }\n\n var cache = {\n key: key,\n sheet: new StyleSheet({\n key: key,\n container: container,\n nonce: options.nonce,\n speedy: options.speedy,\n prepend: options.prepend,\n insertionPoint: options.insertionPoint\n }),\n nonce: options.nonce,\n inserted: inserted,\n registered: {},\n insert: _insert\n };\n cache.sheet.hydrate(nodesToHydrate);\n return cache;\n};\n\nexport { createCache as default };\n","var unitlessKeys = {\n animationIterationCount: 1,\n aspectRatio: 1,\n borderImageOutset: 1,\n borderImageSlice: 1,\n borderImageWidth: 1,\n boxFlex: 1,\n boxFlexGroup: 1,\n boxOrdinalGroup: 1,\n columnCount: 1,\n columns: 1,\n flex: 1,\n flexGrow: 1,\n flexPositive: 1,\n flexShrink: 1,\n flexNegative: 1,\n flexOrder: 1,\n gridRow: 1,\n gridRowEnd: 1,\n gridRowSpan: 1,\n gridRowStart: 1,\n gridColumn: 1,\n gridColumnEnd: 1,\n gridColumnSpan: 1,\n gridColumnStart: 1,\n msGridRow: 1,\n msGridRowSpan: 1,\n msGridColumn: 1,\n msGridColumnSpan: 1,\n fontWeight: 1,\n lineHeight: 1,\n opacity: 1,\n order: 1,\n orphans: 1,\n scale: 1,\n tabSize: 1,\n widows: 1,\n zIndex: 1,\n zoom: 1,\n WebkitLineClamp: 1,\n // SVG-related properties\n fillOpacity: 1,\n floodOpacity: 1,\n stopOpacity: 1,\n strokeDasharray: 1,\n strokeDashoffset: 1,\n strokeMiterlimit: 1,\n strokeOpacity: 1,\n strokeWidth: 1\n};\n\nexport { unitlessKeys as default };\n","function memoize(fn) {\n var cache = Object.create(null);\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport { memoize as default };\n","import hashString from '@emotion/hash';\nimport unitless from '@emotion/unitless';\nimport memoize from '@emotion/memoize';\n\nvar isDevelopment = false;\n\nvar hyphenateRegex = /[A-Z]|^ms/g;\nvar animationRegex = /_EMO_([^_]+?)_([^]*?)_EMO_/g;\n\nvar isCustomProperty = function isCustomProperty(property) {\n return property.charCodeAt(1) === 45;\n};\n\nvar isProcessableValue = function isProcessableValue(value) {\n return value != null && typeof value !== 'boolean';\n};\n\nvar processStyleName = /* #__PURE__ */memoize(function (styleName) {\n return isCustomProperty(styleName) ? styleName : styleName.replace(hyphenateRegex, '-$&').toLowerCase();\n});\n\nvar processStyleValue = function processStyleValue(key, value) {\n switch (key) {\n case 'animation':\n case 'animationName':\n {\n if (typeof value === 'string') {\n return value.replace(animationRegex, function (match, p1, p2) {\n cursor = {\n name: p1,\n styles: p2,\n next: cursor\n };\n return p1;\n });\n }\n }\n }\n\n if (unitless[key] !== 1 && !isCustomProperty(key) && typeof value === 'number' && value !== 0) {\n return value + 'px';\n }\n\n return value;\n};\n\nvar noComponentSelectorMessage = 'Component selectors can only be used in conjunction with ' + '@emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware ' + 'compiler transform.';\n\nfunction handleInterpolation(mergedProps, registered, interpolation) {\n if (interpolation == null) {\n return '';\n }\n\n var componentSelector = interpolation;\n\n if (componentSelector.__emotion_styles !== undefined) {\n\n return componentSelector;\n }\n\n switch (typeof interpolation) {\n case 'boolean':\n {\n return '';\n }\n\n case 'object':\n {\n var keyframes = interpolation;\n\n if (keyframes.anim === 1) {\n cursor = {\n name: keyframes.name,\n styles: keyframes.styles,\n next: cursor\n };\n return keyframes.name;\n }\n\n var serializedStyles = interpolation;\n\n if (serializedStyles.styles !== undefined) {\n var next = serializedStyles.next;\n\n if (next !== undefined) {\n // not the most efficient thing ever but this is a pretty rare case\n // and there will be very few iterations of this generally\n while (next !== undefined) {\n cursor = {\n name: next.name,\n styles: next.styles,\n next: cursor\n };\n next = next.next;\n }\n }\n\n var styles = serializedStyles.styles + \";\";\n return styles;\n }\n\n return createStringFromObject(mergedProps, registered, interpolation);\n }\n\n case 'function':\n {\n if (mergedProps !== undefined) {\n var previousCursor = cursor;\n var result = interpolation(mergedProps);\n cursor = previousCursor;\n return handleInterpolation(mergedProps, registered, result);\n }\n\n break;\n }\n } // finalize string values (regular strings and functions interpolated into css calls)\n\n\n var asString = interpolation;\n\n if (registered == null) {\n return asString;\n }\n\n var cached = registered[asString];\n return cached !== undefined ? cached : asString;\n}\n\nfunction createStringFromObject(mergedProps, registered, obj) {\n var string = '';\n\n if (Array.isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n string += handleInterpolation(mergedProps, registered, obj[i]) + \";\";\n }\n } else {\n for (var key in obj) {\n var value = obj[key];\n\n if (typeof value !== 'object') {\n var asString = value;\n\n if (registered != null && registered[asString] !== undefined) {\n string += key + \"{\" + registered[asString] + \"}\";\n } else if (isProcessableValue(asString)) {\n string += processStyleName(key) + \":\" + processStyleValue(key, asString) + \";\";\n }\n } else {\n if (key === 'NO_COMPONENT_SELECTOR' && isDevelopment) {\n throw new Error(noComponentSelectorMessage);\n }\n\n if (Array.isArray(value) && typeof value[0] === 'string' && (registered == null || registered[value[0]] === undefined)) {\n for (var _i = 0; _i < value.length; _i++) {\n if (isProcessableValue(value[_i])) {\n string += processStyleName(key) + \":\" + processStyleValue(key, value[_i]) + \";\";\n }\n }\n } else {\n var interpolated = handleInterpolation(mergedProps, registered, value);\n\n switch (key) {\n case 'animation':\n case 'animationName':\n {\n string += processStyleName(key) + \":\" + interpolated + \";\";\n break;\n }\n\n default:\n {\n\n string += key + \"{\" + interpolated + \"}\";\n }\n }\n }\n }\n }\n }\n\n return string;\n}\n\nvar labelPattern = /label:\\s*([^\\s;{]+)\\s*(;|$)/g; // this is the cursor for keyframes\n// keyframes are stored on the SerializedStyles object as a linked list\n\nvar cursor;\nfunction serializeStyles(args, registered, mergedProps) {\n if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null && args[0].styles !== undefined) {\n return args[0];\n }\n\n var stringMode = true;\n var styles = '';\n cursor = undefined;\n var strings = args[0];\n\n if (strings == null || strings.raw === undefined) {\n stringMode = false;\n styles += handleInterpolation(mergedProps, registered, strings);\n } else {\n var asTemplateStringsArr = strings;\n\n styles += asTemplateStringsArr[0];\n } // we start at 1 since we've already handled the first arg\n\n\n for (var i = 1; i < args.length; i++) {\n styles += handleInterpolation(mergedProps, registered, args[i]);\n\n if (stringMode) {\n var templateStringsArr = strings;\n\n styles += templateStringsArr[i];\n }\n } // using a global regex with .exec is stateful so lastIndex has to be reset each time\n\n\n labelPattern.lastIndex = 0;\n var identifierName = '';\n var match; // https://esbench.com/bench/5b809c2cf2949800a0f61fb5\n\n while ((match = labelPattern.exec(styles)) !== null) {\n identifierName += '-' + match[1];\n }\n\n var name = hashString(styles) + identifierName;\n\n return {\n name: name,\n styles: styles,\n next: cursor\n };\n}\n\nexport { serializeStyles };\n","/* eslint-disable */\n// Inspired by https://github.com/garycourt/murmurhash-js\n// Ported from https://github.com/aappleby/smhasher/blob/61a0530f28277f2e850bfc39600ce61d02b518de/src/MurmurHash2.cpp#L37-L86\nfunction murmur2(str) {\n // 'm' and 'r' are mixing constants generated offline.\n // They're not really 'magic', they just happen to work well.\n // const m = 0x5bd1e995;\n // const r = 24;\n // Initialize the hash\n var h = 0; // Mix 4 bytes at a time into the hash\n\n var k,\n i = 0,\n len = str.length;\n\n for (; len >= 4; ++i, len -= 4) {\n k = str.charCodeAt(i) & 0xff | (str.charCodeAt(++i) & 0xff) << 8 | (str.charCodeAt(++i) & 0xff) << 16 | (str.charCodeAt(++i) & 0xff) << 24;\n k =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16);\n k ^=\n /* k >>> r: */\n k >>> 24;\n h =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16) ^\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n } // Handle the last few bytes of the input array\n\n\n switch (len) {\n case 3:\n h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\n\n case 2:\n h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\n\n case 1:\n h ^= str.charCodeAt(i) & 0xff;\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n } // Do a few final mixes of the hash to ensure the last few\n // bytes are well-incorporated.\n\n\n h ^= h >>> 13;\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n return ((h ^ h >>> 15) >>> 0).toString(36);\n}\n\nexport { murmur2 as default };\n","var isBrowser = true;\n\nfunction getRegisteredStyles(registered, registeredStyles, classNames) {\n var rawClassName = '';\n classNames.split(' ').forEach(function (className) {\n if (registered[className] !== undefined) {\n registeredStyles.push(registered[className] + \";\");\n } else if (className) {\n rawClassName += className + \" \";\n }\n });\n return rawClassName;\n}\nvar registerStyles = function registerStyles(cache, serialized, isStringTag) {\n var className = cache.key + \"-\" + serialized.name;\n\n if ( // we only need to add the styles to the registered cache if the\n // class name could be used further down\n // the tree but if it's a string tag, we know it won't\n // so we don't have to add it to registered cache.\n // this improves memory usage since we can avoid storing the whole style string\n (isStringTag === false || // we need to always store it if we're in compat mode and\n // in node since emotion-server relies on whether a style is in\n // the registered cache to know whether a style is global or not\n // also, note that this check will be dead code eliminated in the browser\n isBrowser === false ) && cache.registered[className] === undefined) {\n cache.registered[className] = serialized.styles;\n }\n};\nvar insertStyles = function insertStyles(cache, serialized, isStringTag) {\n registerStyles(cache, serialized, isStringTag);\n var className = cache.key + \"-\" + serialized.name;\n\n if (cache.inserted[serialized.name] === undefined) {\n var current = serialized;\n\n do {\n cache.insert(serialized === current ? \".\" + className : '', current, cache.sheet, true);\n\n current = current.next;\n } while (current !== undefined);\n }\n};\n\nexport { getRegisteredStyles, insertStyles, registerStyles };\n","import createCache from '@emotion/cache';\nimport { serializeStyles } from '@emotion/serialize';\nimport { getRegisteredStyles, insertStyles } from '@emotion/utils';\n\nfunction insertWithoutScoping(cache, serialized) {\n if (cache.inserted[serialized.name] === undefined) {\n return cache.insert('', serialized, cache.sheet, true);\n }\n}\n\nfunction merge(registered, css, className) {\n var registeredStyles = [];\n var rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n if (registeredStyles.length < 2) {\n return className;\n }\n\n return rawClassName + css(registeredStyles);\n}\n\nvar createEmotion = function createEmotion(options) {\n var cache = createCache(options); // $FlowFixMe\n\n cache.sheet.speedy = function (value) {\n if (process.env.NODE_ENV !== 'production' && this.ctr !== 0) {\n throw new Error('speedy must be changed before any rules are inserted');\n }\n\n this.isSpeedy = value;\n };\n\n cache.compat = true;\n\n var css = function css() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var serialized = serializeStyles(args, cache.registered, undefined);\n insertStyles(cache, serialized, false);\n return cache.key + \"-\" + serialized.name;\n };\n\n var keyframes = function keyframes() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n var animation = \"animation-\" + serialized.name;\n insertWithoutScoping(cache, {\n name: serialized.name,\n styles: \"@keyframes \" + animation + \"{\" + serialized.styles + \"}\"\n });\n return animation;\n };\n\n var injectGlobal = function injectGlobal() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n insertWithoutScoping(cache, serialized);\n };\n\n var cx = function cx() {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return merge(cache.registered, css, classnames(args));\n };\n\n return {\n css: css,\n cx: cx,\n injectGlobal: injectGlobal,\n keyframes: keyframes,\n hydrate: function hydrate(ids) {\n ids.forEach(function (key) {\n cache.inserted[key] = true;\n });\n },\n flush: function flush() {\n cache.registered = {};\n cache.inserted = {};\n cache.sheet.flush();\n },\n // $FlowFixMe\n sheet: cache.sheet,\n cache: cache,\n getRegisteredStyles: getRegisteredStyles.bind(null, cache.registered),\n merge: merge.bind(null, cache.registered, css)\n };\n};\n\nvar classnames = function classnames(args) {\n var cls = '';\n\n for (var i = 0; i < args.length; i++) {\n var arg = args[i];\n if (arg == null) continue;\n var toAdd = void 0;\n\n switch (typeof arg) {\n case 'boolean':\n break;\n\n case 'object':\n {\n if (Array.isArray(arg)) {\n toAdd = classnames(arg);\n } else {\n toAdd = '';\n\n for (var k in arg) {\n if (arg[k] && k) {\n toAdd && (toAdd += ' ');\n toAdd += k;\n }\n }\n }\n\n break;\n }\n\n default:\n {\n toAdd = arg;\n }\n }\n\n if (toAdd) {\n cls && (cls += ' ');\n cls += toAdd;\n }\n }\n\n return cls;\n};\n\nexport default createEmotion;\n","import '@emotion/cache';\nimport '@emotion/serialize';\nimport '@emotion/utils';\nimport createEmotion from '../create-instance/dist/emotion-css-create-instance.esm.js';\n\nvar _createEmotion = createEmotion({\n key: 'css'\n}),\n flush = _createEmotion.flush,\n hydrate = _createEmotion.hydrate,\n cx = _createEmotion.cx,\n merge = _createEmotion.merge,\n getRegisteredStyles = _createEmotion.getRegisteredStyles,\n injectGlobal = _createEmotion.injectGlobal,\n keyframes = _createEmotion.keyframes,\n css = _createEmotion.css,\n sheet = _createEmotion.sheet,\n cache = _createEmotion.cache;\n\nexport { cache, css, cx, flush, getRegisteredStyles, hydrate, injectGlobal, keyframes, merge, sheet };\n","import {MS, MOZ, WEBKIT, RULESET, KEYFRAMES, DECLARATION} from './Enum.js'\nimport {match, charat, substr, strlen, sizeof, replace, combine} from './Utility.js'\nimport {copy, tokenize} from './Tokenizer.js'\nimport {serialize} from './Serializer.js'\nimport {prefix} from './Prefixer.js'\n\n/**\n * @param {function[]} collection\n * @return {function}\n */\nexport function middleware (collection) {\n\tvar length = sizeof(collection)\n\n\treturn function (element, index, children, callback) {\n\t\tvar output = ''\n\n\t\tfor (var i = 0; i < length; i++)\n\t\t\toutput += collection[i](element, index, children, callback) || ''\n\n\t\treturn output\n\t}\n}\n\n/**\n * @param {function} callback\n * @return {function}\n */\nexport function rulesheet (callback) {\n\treturn function (element) {\n\t\tif (!element.root)\n\t\t\tif (element = element.return)\n\t\t\t\tcallback(element)\n\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n */\nexport function prefixer (element, index, children, callback) {\n\tif (element.length > -1)\n\t\tif (!element.return)\n\t\t\tswitch (element.type) {\n\t\t\t\tcase DECLARATION: element.return = prefix(element.value, element.length, children)\n\t\t\t\t\treturn\n\t\t\t\tcase KEYFRAMES:\n\t\t\t\t\treturn serialize([copy(element, {value: replace(element.value, '@', '@' + WEBKIT)})], callback)\n\t\t\t\tcase RULESET:\n\t\t\t\t\tif (element.length)\n\t\t\t\t\t\treturn combine(element.props, function (value) {\n\t\t\t\t\t\t\tswitch (match(value, /(::plac\\w+|:read-\\w+)/)) {\n\t\t\t\t\t\t\t\t// :read-(only|write)\n\t\t\t\t\t\t\t\tcase ':read-only': case ':read-write':\n\t\t\t\t\t\t\t\t\treturn serialize([copy(element, {props: [replace(value, /:(read-\\w+)/, ':' + MOZ + '$1')]})], callback)\n\t\t\t\t\t\t\t\t// :placeholder\n\t\t\t\t\t\t\t\tcase '::placeholder':\n\t\t\t\t\t\t\t\t\treturn serialize([\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, ':' + WEBKIT + 'input-$1')]}),\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, ':' + MOZ + '$1')]}),\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, MS + 'input-$1')]})\n\t\t\t\t\t\t\t\t\t], callback)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn ''\n\t\t\t\t\t\t})\n\t\t\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n */\nexport function namespace (element) {\n\tswitch (element.type) {\n\t\tcase RULESET:\n\t\t\telement.props = element.props.map(function (value) {\n\t\t\t\treturn combine(tokenize(value), function (value, index, children) {\n\t\t\t\t\tswitch (charat(value, 0)) {\n\t\t\t\t\t\t// \\f\n\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\treturn substr(value, 1, strlen(value))\n\t\t\t\t\t\t// \\0 ( + > ~\n\t\t\t\t\t\tcase 0: case 40: case 43: case 62: case 126:\n\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t// :\n\t\t\t\t\t\tcase 58:\n\t\t\t\t\t\t\tif (children[++index] === 'global')\n\t\t\t\t\t\t\t\tchildren[index] = '', children[++index] = '\\f' + substr(children[index], index = 1, -1)\n\t\t\t\t\t\t// \\s\n\t\t\t\t\t\tcase 32:\n\t\t\t\t\t\t\treturn index === 1 ? '' : value\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tswitch (index) {\n\t\t\t\t\t\t\t\tcase 0: element = value\n\t\t\t\t\t\t\t\t\treturn sizeof(children) > 1 ? '' : value\n\t\t\t\t\t\t\t\tcase index = sizeof(children) - 1: case 2:\n\t\t\t\t\t\t\t\t\treturn index === 2 ? value + element + element : value + element\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t}\n}\n","import React, { useEffect } from 'react';\nimport { Button, IconButton, useStyles2 } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { ChatContextItem } from '../../context/types';\nimport { useAssistant } from '../../hook';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { OpenAssistantProps } from '../../sidebar';\nimport { reportInteraction } from '@grafana/runtime';\n\nexport interface OpenAssistantButtonProps {\n /** Prompt to pass to the openAssistant function. */\n prompt: string;\n /** Origin of the request that opened the assistant. This is used to track the source of the request. Should be a structured string using forward slashes, with the first part as a namespace. Examples: 'grafana-datasources/prometheus/query-builder', 'grafana-slo-app/slo-editor-overview', 'grafana/trace-view-analyzer`. */\n origin: string;\n /** Context to pass to the openAssistant function. Optional, defaults to undefined. Created with `createAssistantContextItem`. */\n context?: ChatContextItem[];\n /** Whether to automatically send the prompt. Optional, defaults to true. */\n autoSend?: boolean;\n /** Text to display on the button. Optional, defaults to 'Analyze with Assistant' */\n title?: string;\n /** Button size, defaults to sm */\n size?: 'xs' | 'sm' | 'md' | 'lg';\n /** If true, the button will be Assistant icon only with name as title. Defaults to false. */\n iconOnlyButton?: boolean;\n /** Function to call when the button is clicked. Optional, defaults to undefined. */\n onClick?: () => void;\n}\n\n/**\n * A button component that opens the Grafana Assistant with configurable prompt and context.\n */\nexport function OpenAssistantButton(props: OpenAssistantButtonProps) {\n // If the assistant is not available, return empty\n const { isAvailable, openAssistant } = useAssistant();\n if (!isAvailable || !openAssistant) {\n return null;\n }\n return <OpenAssistantButtonView {...props} openAssistant={openAssistant} />;\n}\n\n/**\n * Presentational component separated from OpenAssistantButton to avoid hook dependencies in Storybook.\n * It is not exported for users of the package.\n */\nexport function OpenAssistantButtonView({\n prompt,\n origin,\n context,\n autoSend = true,\n title = 'Analyze with Assistant',\n size = 'sm',\n iconOnlyButton = false,\n openAssistant,\n onClick,\n}: OpenAssistantButtonProps & {\n openAssistant: (props: OpenAssistantProps) => void;\n}) {\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n reportInteraction('grafana_assistant_app_open_sidebar_button_displayed', {\n from: origin,\n });\n }, [origin]);\n\n return (\n <>\n {iconOnlyButton ? (\n <IconButton\n name=\"ai-sparkle\"\n onClick={() => {\n onClick?.();\n openAssistant({ prompt, context, autoSend, origin });\n }}\n variant=\"secondary\"\n size={size}\n aria-label={title}\n className={styles.icon}\n tooltip={title}\n data-testid=\"assistant-icon-button\"\n />\n ) : (\n <Button\n icon=\"ai-sparkle\"\n onClick={() => {\n onClick?.();\n openAssistant({ prompt, context, autoSend, origin });\n }}\n variant=\"secondary\"\n fill=\"solid\"\n size={size}\n title={title}\n aria-label={title}\n className={styles.button}\n data-testid=\"assistant-button\"\n >\n {title}\n </Button>\n )}\n </>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const baseBackground = theme.colors.secondary.main;\n const elevatedBackground = theme.colors.emphasize(baseBackground, 0.05);\n\n // Canvas is what's typically underneath buttons\n const underlyingColor = theme.colors.background.canvas;\n\n const borderWidth = 1;\n const outerRadius = theme.shape.radius.default;\n // inner radius = outer radius - border width, but take at least 1px\n const innerRadius = `max(calc(${outerRadius} - ${borderWidth}px), 1px)`;\n\n // Gradient border layer (::before)\n const gradientBorderLayer = {\n content: '\"\"',\n position: 'absolute' as const,\n inset: 0,\n borderRadius: outerRadius,\n cornerShape: 'squircle',\n background: 'linear-gradient(90deg, rgb(168, 85, 247), rgb(249, 115, 22))',\n zIndex: -2,\n pointerEvents: 'none' as const,\n };\n\n // Solid background layer factory (::after)\n // Layer transparent color over canvas to make it opaque and mask the gradient properly\n const solidBackgroundLayer = (background: string) => ({\n content: '\"\"',\n position: 'absolute' as const,\n inset: `${borderWidth}px`,\n borderRadius: innerRadius,\n cornerShape: 'squircle',\n background: `linear-gradient(${background}, ${background}), ${underlyingColor}`,\n zIndex: -1,\n transition: 'none',\n pointerEvents: 'none' as const,\n });\n\n return {\n button: css({\n label: 'assistant-button',\n position: 'relative',\n isolation: 'isolate',\n border: 'none',\n transition: 'none !important',\n '&::before': gradientBorderLayer,\n '&::after': {\n ...solidBackgroundLayer(baseBackground),\n transition: 'none',\n },\n '&:hover': {\n transition: 'none !important',\n },\n '&:hover::after': {\n background: `linear-gradient(${elevatedBackground}, ${elevatedBackground}), ${underlyingColor}`,\n },\n }),\n icon: css({\n label: 'assistant-icon',\n position: 'relative',\n isolation: 'isolate',\n border: 'none',\n background: 'none',\n padding: theme.spacing(0.5),\n '&::before': { ...gradientBorderLayer, transition: 'background 0.1s ease' },\n '&:hover::after': {\n ...solidBackgroundLayer(baseBackground),\n background: `linear-gradient(${elevatedBackground}, ${elevatedBackground}), ${underlyingColor}`,\n },\n }),\n };\n};\n","import React, { ReactElement, useEffect } from 'react';\nimport { Button, ButtonGroup, Dropdown, Tooltip, useStyles2 } from '@grafana/ui';\nimport { css, cx } from '@emotion/css';\nimport { ChatContextItem } from '../../context/types';\nimport { useAssistant } from '../../hook';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { OpenAssistantProps } from '../../sidebar';\nimport { reportInteraction } from '@grafana/runtime';\n\nexport interface OpenAssistantSplitButtonProps {\n /** Prompt to pass to the openAssistant function. */\n prompt: string;\n /** Origin of the request that opened the assistant. */\n origin: string;\n /** Context to pass to the openAssistant function. Optional, defaults to undefined. */\n context?: ChatContextItem[];\n /** Whether to automatically send the prompt. Optional, defaults to true. */\n autoSend?: boolean;\n /** Text to display on the button. Optional, defaults to 'Chat with Assistant' */\n title?: string;\n /** Button size, defaults to sm */\n size?: 'sm' | 'md' | 'lg';\n /** Function to call when the main button is clicked. Optional. */\n onClick?: () => void;\n /** Additional menu items to show in the dropdown. Optional. */\n menuItems?: ReactElement;\n /** Tooltip text to display on hover. Optional. */\n tooltip?: string;\n /** Width for the dropdown/chevron segment. Accepts pixels as number or any CSS width value. */\n dropdownButtonWidth?: number | string;\n}\n\ntype AssistantButtonSize = NonNullable<OpenAssistantSplitButtonProps['size']>;\n\nconst defaultDropdownButtonWidths: Record<AssistantButtonSize, number> = {\n sm: 32,\n md: 36,\n lg: 40,\n};\n\n/**\n * A split button component that opens the Grafana Assistant with a dropdown for additional actions.\n * The gradient border wraps around both buttons as a unified control.\n */\nexport function OpenAssistantSplitButton(props: OpenAssistantSplitButtonProps) {\n const { isAvailable, openAssistant } = useAssistant();\n if (!isAvailable || !openAssistant) {\n return null;\n }\n return <OpenAssistantSplitButtonView {...props} openAssistant={openAssistant} />;\n}\n\nexport function OpenAssistantSplitButtonView({\n prompt,\n origin,\n context,\n autoSend = true,\n title = 'Chat with Assistant',\n size = 'sm',\n onClick,\n menuItems,\n tooltip,\n dropdownButtonWidth,\n openAssistant,\n}: OpenAssistantSplitButtonProps & {\n openAssistant: (props: OpenAssistantProps) => void;\n}) {\n const styles = useStyles2(getStyles);\n const hasMenuItems = Boolean(menuItems);\n const resolvedDropdownButtonWidth = toCssWidth(dropdownButtonWidth ?? defaultDropdownButtonWidths[size]);\n\n useEffect(() => {\n reportInteraction('grafana_assistant_app_open_sidebar_split_button_displayed', {\n from: origin,\n });\n }, [origin]);\n\n const handleMainClick = () => {\n onClick?.();\n openAssistant({ prompt, context, autoSend, origin });\n };\n\n const wrapperContent = (\n <div className={styles.wrapper}>\n <ButtonGroup className={styles.buttonGroup}>\n <Button\n icon=\"ai-sparkle\"\n onClick={handleMainClick}\n variant=\"secondary\"\n fill=\"solid\"\n size={size}\n aria-label={title}\n className={cx(styles.segmentButton, hasMenuItems ? styles.mainButtonSplit : styles.mainButtonSolo)}\n data-testid=\"assistant-split-button-main\"\n >\n {title}\n </Button>\n {menuItems && (\n <Dropdown overlay={menuItems}>\n <Button\n variant=\"secondary\"\n icon=\"angle-down\"\n size={size}\n aria-label=\"More AI actions\"\n className={cx(styles.segmentButton, styles.dropdownButton)}\n style={{ width: resolvedDropdownButtonWidth, minWidth: resolvedDropdownButtonWidth }}\n data-testid=\"assistant-split-button-dropdown\"\n />\n </Dropdown>\n )}\n </ButtonGroup>\n </div>\n );\n\n return tooltip ? <Tooltip content={tooltip}>{wrapperContent}</Tooltip> : wrapperContent;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const baseBackground = theme.colors.secondary.main;\n const elevatedBackground = theme.colors.emphasize(baseBackground, 0.05);\n const underlyingColor = theme.colors.background.canvas;\n const dividerColor = theme.colors.border.weak;\n const borderWidth = 1;\n const outerRadius = theme.shape.radius.default;\n const innerRadius = `max(calc(${outerRadius} - ${borderWidth}px), 1px)`;\n\n return {\n wrapper: css({\n label: 'assistant-split-button-wrapper',\n position: 'relative',\n isolation: 'isolate',\n display: 'inline-block',\n // Gradient border around the entire button group\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n inset: 0,\n borderRadius: outerRadius,\n cornerShape: 'squircle',\n background: 'linear-gradient(90deg, rgb(168, 85, 247), rgb(249, 115, 22))',\n zIndex: -1,\n pointerEvents: 'none',\n },\n // Solid background layer\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n inset: `${borderWidth}px`,\n borderRadius: innerRadius,\n cornerShape: 'squircle',\n background: `linear-gradient(${baseBackground}, ${baseBackground}), ${underlyingColor}`,\n zIndex: -1,\n pointerEvents: 'none',\n },\n }),\n buttonGroup: css({\n label: 'assistant-split-button-group',\n gap: 0,\n position: 'relative',\n zIndex: 1,\n borderRadius: innerRadius,\n overflow: 'hidden',\n // Make buttons transparent to show the wrapper's gradient\n '& button': {\n border: 'none',\n boxShadow: 'none',\n background: 'transparent !important',\n },\n }),\n segmentButton: css({\n label: 'assistant-split-button-segment',\n position: 'relative',\n '&:hover': {\n background: `${elevatedBackground} !important`,\n },\n '&:focus-visible': {\n background: `${elevatedBackground} !important`,\n },\n '&[aria-expanded=\"true\"]': {\n background: `${elevatedBackground} !important`,\n },\n }),\n mainButtonSolo: css({\n label: 'assistant-split-button-main-solo',\n borderRadius: innerRadius,\n }),\n mainButtonSplit: css({\n label: 'assistant-split-button-main-split',\n borderTopLeftRadius: innerRadius,\n borderBottomLeftRadius: innerRadius,\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n }),\n dropdownButton: css({\n label: 'assistant-split-button-dropdown',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 0,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n borderTopRightRadius: innerRadius,\n borderBottomRightRadius: innerRadius,\n padding: '0 !important',\n boxShadow: `inset 1px 0 0 ${dividerColor}`,\n '& svg': {\n margin: 0,\n },\n }),\n };\n};\n\nfunction toCssWidth(width: number | string): string {\n return typeof width === 'number' ? `${width}px` : width;\n}\n","import { GrafanaTheme2 } from '@grafana/data';\n\n/**\n * Default gradient colors for the assistant\n */\nconst GRADIENT_COLORS = {\n PURPLE: 'rgb(168, 85, 247)',\n ORANGE: 'rgb(249, 115, 22)',\n} as const;\n\n// FIXME: use SDK as single source of truth for these color schemes?\n\n/**\n * Returns the colors of the background gradient based on the theme.\n *\n * @param theme - The Grafana theme object.\n * @returns The colors of the background gradient as tuple.\n */\nexport const getBackgroundGradientColors = (theme: GrafanaTheme2): [string, string] => {\n const defaultGradientColors: [string, string] = [GRADIENT_COLORS.PURPLE, GRADIENT_COLORS.ORANGE];\n\n // Check if the theme does not use gradients by default\n if (theme.name.toLowerCase() === 'dark' || theme.name.toLowerCase() === 'light') {\n return defaultGradientColors;\n }\n\n // If the theme uses gradients, extract the colors from the gradient string\n const gradientString = theme.colors.gradients.brandHorizontal;\n const hexColorRegex = /#[0-9A-Fa-f]{6}/g;\n const matches = gradientString.match(hexColorRegex);\n if (!matches || matches.length < 2) {\n // Fallback to default colors if extraction fails\n return defaultGradientColors;\n }\n\n return [matches[0], matches[1]];\n};\n\n/**\n * Creates animation keyframes for a rotating gradient border effect.\n * This is used for loading states in inputs and other components.\n *\n * @param theme - The Grafana theme object\n * @param backgroundColor - The background color to use in the animation\n * @param color1 - First gradient color (optional, defaults to theme purple)\n * @param color2 - Second gradient color (optional, defaults to theme orange)\n * @returns Animation keyframes object for use with @emotion/css keyframes\n *\n * @example\n * ```ts\n * const borderAnimation = keyframes({\n * label: 'border-animation',\n * ...createBorderAnimation(theme, theme.colors.background.primary),\n * });\n * ```\n */\nexport const createBorderAnimation = (\n theme: GrafanaTheme2,\n backgroundColor: string,\n color1?: string,\n color2?: string\n): Record<string, { backgroundImage: string }> => {\n const animationSteps = Array.from({ length: 101 }, (_, i) => i);\n const animationFrames: Record<string, { backgroundImage: string }> = {};\n const [gradientColor1, gradientColor2] = getBackgroundGradientColors(theme);\n\n const finalColor1 = color1 ?? gradientColor1;\n const finalColor2 = color2 ?? gradientColor2;\n\n animationSteps.forEach((step) => {\n animationFrames[`${step}%`] = {\n backgroundImage: `\n linear-gradient(${backgroundColor}, ${backgroundColor}),\n conic-gradient(from ${step * 3.6}deg, transparent 60%, ${finalColor1} 80%, ${finalColor2} 100%, transparent 15%)\n `,\n };\n });\n\n return animationFrames;\n};\n","import type { InlineToolRunnable } from '../tools/types';\n\nexport interface InlineAssistantPromptOptions {\n prompt: string;\n agentName?: string;\n agentId?: string;\n systemPrompt?: string;\n tools?: InlineToolRunnable[];\n onStart?: () => void;\n onDelta?: (delta: string) => void;\n onComplete?: (text: string) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface InlineAssistant {\n sendPrompt(options: InlineAssistantPromptOptions): Promise<void>;\n cancel(): void;\n dispose(): void;\n}\n\n// Extend window interface for global registry\ndeclare global {\n interface Window {\n [key: string]: any;\n }\n}\n\nexport type InlineAssistantFactory = (origin: string) => Promise<InlineAssistant>;\nexport type InlineAssistantInitializer = () => Promise<void>;\n\n// Global registry keys for cross-plugin sharing\nconst GLOBAL_FACTORY_KEY = '__grafanaAssistantInlineFactory__';\nconst GLOBAL_INITIALIZER_KEY = '__grafanaAssistantInlineInitializer__';\nconst GLOBAL_INITIALIZATION_PROMISE_KEY = '__grafanaAssistantInlineInitPromise__';\n\nexport function setInlineAssistantFactory(fn: InlineAssistantFactory): void {\n const existing = window[GLOBAL_FACTORY_KEY] as InlineAssistantFactory | undefined;\n if (existing && existing !== fn) {\n console.warn('InlineAssistant factory already set; ignoring subsequent setInlineAssistantFactory call');\n return;\n }\n if (!existing) {\n window[GLOBAL_FACTORY_KEY] = fn;\n }\n}\n\n/**\n * Register a lazy initializer that will be called on first use.\n * The plugin code should register this to enable lazy loading of the inline assistant.\n *\n * This uses global storage (window) so that all plugins share the same initializer,\n * regardless of which plugin instance or package version loads first.\n */\nexport function setInlineAssistantInitializer(fn: InlineAssistantInitializer): void {\n const existing = window[GLOBAL_INITIALIZER_KEY] as InlineAssistantInitializer | undefined;\n if (existing && existing !== fn) {\n console.warn('InlineAssistant initializer already set; ignoring subsequent setInlineAssistantInitializer call');\n return;\n }\n if (!existing) {\n window[GLOBAL_INITIALIZER_KEY] = fn;\n }\n}\n\n/**\n * Ensure the inline assistant is initialized. If an initializer is registered,\n * it will be called on first use. Otherwise, checks if factory is already registered.\n *\n * Uses global storage (window) so that initialization is shared across all plugins.\n */\nexport async function ensureInlineAssistantInitialized(): Promise<void> {\n // If factory is already set, we're good\n const factory = window[GLOBAL_FACTORY_KEY] as InlineAssistantFactory | undefined;\n if (factory) {\n return;\n }\n\n // If no initializer is registered, throw error\n const initializer = window[GLOBAL_INITIALIZER_KEY] as InlineAssistantInitializer | undefined;\n if (!initializer) {\n throw new Error(\n 'InlineAssistant not initialized. Make sure the Grafana Assistant plugin is loaded and initialized.'\n );\n }\n\n // If initialization is in progress, wait for it\n const existingPromise = window[GLOBAL_INITIALIZATION_PROMISE_KEY] as Promise<void> | null | undefined;\n if (existingPromise) {\n return existingPromise;\n }\n\n // Start initialization\n const initPromise = (async () => {\n try {\n await initializer();\n } catch (err) {\n // Reset on error so retry is possible\n window[GLOBAL_INITIALIZATION_PROMISE_KEY] = null;\n throw err;\n }\n })();\n\n window[GLOBAL_INITIALIZATION_PROMISE_KEY] = initPromise;\n return initPromise;\n}\n\nexport function getInlineAssistantFactory(): InlineAssistantFactory {\n const factory = window[GLOBAL_FACTORY_KEY] as InlineAssistantFactory | undefined;\n if (!factory) {\n throw new Error('InlineAssistant factory not initialized. Make sure the Grafana Assistant plugin is loaded.');\n }\n return factory;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { InlineAssistantOptions, InlineAssistantResult } from './types';\nimport { getInlineAssistantFactory, InlineAssistant, ensureInlineAssistantInitialized } from './inlineAssistant';\n\n/**\n * React hook for inline assistant generation with streaming support.\n *\n * This hook enables generating content (like panel titles or descriptions) inline\n * without opening the assistant sidebar. Each hook instance creates its own chat\n * conversation, so all generations from the same instance are grouped together.\n * Generated content is ephemeral - it won't appear in the user's chat history\n * but will be tracked in the admin UI for analytics.\n *\n * Uses the full BaseMultiStepAgent infrastructure for tool execution and multi-step workflows.\n *\n * The implementation is lazy-loaded on first use to reduce initial bundle size.\n *\n * @example\n * ```typescript\n * function PanelEditor() {\n * const { generate, isGenerating, content, error, reset } = useInlineAssistant();\n * const [title, setTitle] = useState('');\n *\n * const handleGenerate = () => {\n * generate({\n * prompt: 'Generate a panel title for CPU metrics',\n * origin: 'grafana/panel-editor/title',\n * systemPrompt: 'Generate only the title text, no explanation',\n * onComplete: (text) => setTitle(text.trim()),\n * onError: (err) => console.error(err)\n * });\n * };\n *\n * return (\n * <div>\n * <input value={title} onChange={(e) => setTitle(e.target.value)} />\n * <button onClick={handleGenerate} disabled={isGenerating}>\n * {isGenerating ? 'Generating...' : 'Generate with Assistant'}\n * </button>\n * {isGenerating && <div>{content}</div>}\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Using tools with inline assistant\n * import { lokiQueryHandlerTool } from 'agent/tools';\n *\n * function ComponentWithTools() {\n * const { generate } = useInlineAssistant();\n *\n * const handleGenerate = async () => {\n * await generate({\n * prompt: 'Query Loki for error logs from the last hour',\n * origin: 'my-app/component',\n * tools: [lokiQueryHandlerTool],\n * onComplete: (text) => console.log('Generated:', text),\n * });\n * };\n *\n * return <button onClick={handleGenerate}>Generate</button>;\n * }\n * ```\n */\nexport function useInlineAssistant(): InlineAssistantResult {\n const [isGenerating, setIsGenerating] = useState(false);\n const [content, setContent] = useState('');\n const [error, setError] = useState<Error | null>(null);\n const assistantRef = useRef<InlineAssistant | null>(null);\n\n /**\n * Reset error and content state\n */\n const reset = useCallback(() => {\n setError(null);\n setContent('');\n }, []);\n\n /**\n * Cancel the current generation\n */\n const cancel = useCallback(() => {\n if (assistantRef.current) {\n assistantRef.current.cancel();\n }\n setIsGenerating(false);\n }, []);\n\n /**\n * Generate content with the given options\n */\n const generate = useCallback(async (options: InlineAssistantOptions): Promise<void> => {\n // Reset state\n setError(null);\n setContent('');\n setIsGenerating(true);\n\n try {\n // Ensure the inline assistant is initialized (lazy-loads on first use)\n await ensureInlineAssistantInitialized();\n\n const factory = getInlineAssistantFactory();\n\n // Create or reuse assistant for this origin\n if (!assistantRef.current) {\n assistantRef.current = await factory(options.origin);\n }\n\n await assistantRef.current.sendPrompt({\n prompt: options.prompt,\n agentName: options.agentName,\n agentId: options.agentId,\n systemPrompt: options.systemPrompt,\n tools: options.tools,\n onStart: () => {\n setIsGenerating(true);\n },\n onDelta: (delta) => {\n setContent((prev) => prev + delta);\n options.onDelta?.(delta);\n },\n onComplete: (text) => {\n setContent(text);\n setIsGenerating(false);\n options.onComplete?.(text);\n },\n onError: (err) => {\n setError(err);\n setIsGenerating(false);\n options.onError?.(err);\n },\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsGenerating(false);\n options.onError?.(error);\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (assistantRef.current) {\n assistantRef.current.cancel();\n assistantRef.current.dispose();\n assistantRef.current = null;\n }\n };\n }, []);\n\n return {\n generate,\n isGenerating,\n content,\n error,\n cancel,\n reset,\n };\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useInlineAssistant } from '../../inline/useInlineAssistant';\n\nexport interface UseAIGenerationOptions {\n value: string;\n onChange: (value: string) => void;\n origin: string;\n systemPrompt?: string;\n onComplete?: (text: string) => void;\n onError?: (error: Error) => void;\n onDelta?: (delta: string) => void;\n disabled?: boolean;\n autoGenerate?: boolean;\n streaming?: boolean;\n getUserPrompt?: (textInput: string) => string;\n}\n\nexport function useAIGeneration({\n value,\n onChange,\n origin,\n systemPrompt,\n onComplete,\n onError,\n onDelta,\n disabled = false,\n autoGenerate = false,\n streaming = false,\n getUserPrompt,\n}: UseAIGenerationOptions) {\n const { generate, isGenerating, content, error, reset } = useInlineAssistant();\n const hasAutoGenerated = useRef(false);\n const valueBeforeGeneration = useRef(value);\n\n const displayValue = isGenerating ? (streaming ? content : '') : value;\n const resolvedPrompt = getUserPrompt ? getUserPrompt(value.trim()) : value.trim();\n const isSendDisabled = !resolvedPrompt || disabled || isGenerating;\n\n const doGenerate = useCallback(\n (prompt: string) => {\n valueBeforeGeneration.current = value;\n onChange('');\n reset();\n\n generate({\n prompt,\n origin,\n systemPrompt,\n onDelta,\n onComplete: (text) => {\n onChange(text);\n onComplete?.(text);\n },\n onError: (err) => {\n onChange(valueBeforeGeneration.current);\n onError?.(err);\n },\n });\n },\n [value, onChange, origin, systemPrompt, onDelta, onComplete, onError, generate, reset]\n );\n\n useEffect(() => {\n if (autoGenerate && systemPrompt && !value && !hasAutoGenerated.current && !disabled) {\n hasAutoGenerated.current = true;\n doGenerate(systemPrompt);\n }\n // Only run on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleGenerate = useCallback(() => {\n if (isSendDisabled) {\n return;\n }\n doGenerate(resolvedPrompt);\n }, [isSendDisabled, doGenerate, resolvedPrompt]);\n\n return {\n displayValue,\n isSendDisabled,\n handleGenerate,\n isGenerating,\n error,\n };\n}\n","import { useRef, useState } from 'react';\n\nconst GENERATING_PHRASES = [\n 'Generating...',\n 'Brewing...',\n 'Cooking...',\n 'Crunching...',\n 'Phrasing...',\n 'Wording...',\n 'Crafting...',\n 'Composing...',\n 'Drafting...',\n 'Shaping...',\n 'Forming...',\n 'Molding...',\n 'Sketching...',\n 'Whipping up...',\n 'Conjuring...',\n 'Stirring...',\n];\n\n/**\n * Returns a random placeholder phrase while generating, or the provided\n * default placeholder when idle. A new phrase is picked each time generation starts.\n */\nexport function useGeneratingPlaceholder(isGenerating: boolean, defaultPlaceholder: string): string {\n const [phrase, setPhrase] = useState('');\n const wasGenerating = useRef(false);\n\n if (isGenerating && !wasGenerating.current) {\n const next = GENERATING_PHRASES[Math.floor(Math.random() * GENERATING_PHRASES.length)];\n setPhrase(next);\n wasGenerating.current = true;\n return next;\n }\n\n if (!isGenerating) {\n wasGenerating.current = false;\n }\n\n return isGenerating ? phrase : defaultPlaceholder;\n}\n","import React, { KeyboardEvent } from 'react';\nimport { Input, IconButton, useStyles2 } from '@grafana/ui';\nimport { css, cx, keyframes } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { createBorderAnimation, getBackgroundGradientColors } from '../../utils/theme';\nimport { AIInputProps } from './types';\nimport { useAIGeneration } from './useAIGeneration';\nimport { useGeneratingPlaceholder } from './useGeneratingPlaceholder';\n\nexport interface AITextInputProps extends AIInputProps {}\n\n/**\n * An AI-powered controlled text input component that uses the Grafana Assistant engine to generate content.\n * Features an integrated send button as well as a gradient border animation while generating.\n */\nexport function AITextInput({\n value,\n onChange,\n placeholder,\n origin,\n systemPrompt,\n onComplete,\n onError,\n onDelta,\n disabled = false,\n autoGenerate = false,\n streaming = false,\n getUserPrompt,\n className,\n 'data-testid': dataTestId,\n}: AITextInputProps) {\n const { displayValue, isSendDisabled, handleGenerate, isGenerating, error } = useAIGeneration({\n value,\n onChange,\n origin,\n systemPrompt,\n onComplete,\n onError,\n onDelta,\n disabled,\n autoGenerate,\n streaming,\n getUserPrompt,\n });\n const styles = useStyles2(getStyles);\n const activePlaceholder = useGeneratingPlaceholder(isGenerating, placeholder ?? 'Ask AI to generate...');\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n // Cmd/Ctrl + Enter to send\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleGenerate();\n }\n };\n\n const addonAfter = (\n <IconButton\n name=\"ai-sparkle\"\n onClick={handleGenerate}\n disabled={isSendDisabled}\n tooltip={isSendDisabled ? 'Enter text to generate' : 'Generate with AI'}\n data-testid={dataTestId ? `${dataTestId}-send` : undefined}\n />\n );\n\n return (\n <div className={cx(styles.wrapper, { [styles.animatedWrapper]: isGenerating }, className)} data-testid={dataTestId}>\n <Input\n value={displayValue}\n onKeyDown={handleKeyDown}\n onChange={(e) => onChange(e.currentTarget.value)}\n placeholder={activePlaceholder}\n disabled={disabled || isGenerating}\n suffix={addonAfter}\n invalid={!!error}\n data-testid={dataTestId ? `${dataTestId}-input` : undefined}\n />\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const backgroundColor = theme.colors.background.primary;\n const borderAnimation = keyframes({\n label: 'ai-input-border-animation',\n ...createBorderAnimation(theme, backgroundColor),\n });\n\n const [gradientColor1, gradientColor2] = getBackgroundGradientColors(theme);\n\n return {\n wrapper: css({\n label: 'ai-text-input-wrapper',\n position: 'relative',\n border: '1px solid transparent',\n borderRadius: theme.shape.radius.default,\n cornerShape: 'squircle',\n }),\n animatedWrapper: css({\n label: 'ai-text-input-animated',\n border: `1px solid transparent`,\n // Set initial backgroundImage with both gradients so Chrome can animate properly\n backgroundImage: `\n linear-gradient(${backgroundColor}, ${backgroundColor}),\n conic-gradient(from 0deg, transparent 60%, ${gradientColor1} 80%, ${gradientColor2} 100%, transparent 15%)\n `,\n backgroundOrigin: 'border-box',\n backgroundClip: 'padding-box, border-box',\n animation: `${borderAnimation} 2s linear infinite`,\n '& input': {\n // Remove the default border from the input when animated wrapper is active\n border: 'none !important',\n },\n }),\n };\n};\n","import React, { KeyboardEvent } from 'react';\nimport { TextArea, IconButton, useStyles2 } from '@grafana/ui';\nimport { css, cx, keyframes } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { createBorderAnimation, getBackgroundGradientColors } from '../../utils/theme';\nimport { AIInputProps } from './types';\nimport { useAIGeneration } from './useAIGeneration';\nimport { useGeneratingPlaceholder } from './useGeneratingPlaceholder';\n\nexport interface AITextAreaProps extends AIInputProps {\n /** Number of rows for the textarea */\n rows?: number;\n}\n\n/**\n * An AI-powered controlled textarea component that uses the Grafana Assistant engine to generate content.\n * Features an integrated send button as well as a gradient border animation while generating.\n */\nexport function AITextArea({\n value,\n onChange,\n placeholder,\n origin,\n systemPrompt,\n onComplete,\n onError,\n onDelta,\n disabled = false,\n autoGenerate = false,\n streaming = false,\n getUserPrompt,\n rows = 4,\n className,\n 'data-testid': dataTestId,\n}: AITextAreaProps) {\n const { displayValue, isSendDisabled, handleGenerate, isGenerating, error } = useAIGeneration({\n value,\n onChange,\n origin,\n systemPrompt,\n onComplete,\n onError,\n onDelta,\n disabled,\n autoGenerate,\n streaming,\n getUserPrompt,\n });\n const styles = useStyles2(getStyles);\n const activePlaceholder = useGeneratingPlaceholder(\n isGenerating,\n placeholder ?? 'Ask AI to generate... (Cmd/Ctrl+Enter to send)'\n );\n const effectiveRows = Math.max(rows, 2);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Cmd/Ctrl + Enter to send\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleGenerate();\n }\n };\n\n return (\n <div\n className={cx(styles.textareaWrapper, { [styles.animatedWrapper]: isGenerating }, className)}\n data-testid={dataTestId}\n >\n <TextArea\n value={displayValue}\n onKeyDown={handleKeyDown}\n onChange={(e) => onChange(e.currentTarget.value)}\n placeholder={activePlaceholder}\n disabled={disabled || isGenerating}\n rows={effectiveRows}\n className={styles.textarea}\n invalid={!!error}\n data-testid={dataTestId ? `${dataTestId}-textarea` : undefined}\n />\n <IconButton\n name=\"ai-sparkle\"\n onClick={handleGenerate}\n disabled={isSendDisabled}\n className={styles.sendButton}\n aria-label=\"Generate with AI\"\n tooltip={isSendDisabled ? 'Enter text to generate' : 'Generate with AI (Cmd/Ctrl+Enter)'}\n data-testid={dataTestId ? `${dataTestId}-send` : undefined}\n />\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const backgroundColor = theme.colors.background.primary;\n const borderAnimation = keyframes({\n label: 'ai-textarea-border-animation',\n ...createBorderAnimation(theme, backgroundColor),\n });\n\n const [gradientColor1, gradientColor2] = getBackgroundGradientColors(theme);\n\n return {\n textareaWrapper: css({\n label: 'ai-textarea-wrapper',\n position: 'relative',\n border: '1px solid transparent',\n borderRadius: theme.shape.radius.default,\n cornerShape: 'squircle',\n }),\n animatedWrapper: css({\n label: 'ai-textarea-animated',\n border: `1px solid transparent`,\n // Set initial backgroundImage with both gradients so Chrome can animate properly\n backgroundImage: `\n linear-gradient(${backgroundColor}, ${backgroundColor}),\n conic-gradient(from 0deg, transparent 60%, ${gradientColor1} 80%, ${gradientColor2} 100%, transparent 15%)\n `,\n backgroundOrigin: 'border-box',\n backgroundClip: 'padding-box, border-box',\n animation: `${borderAnimation} 2s linear infinite`,\n '& textarea': {\n // Remove the default border from the textarea when animated wrapper is active\n border: 'none !important',\n },\n }),\n textarea: css({\n label: 'ai-textarea',\n // ensures the text does not \"underflow\" the send button\n paddingRight: theme.spacing(4),\n // Keep at least a 2-row visual height even if outer styles try to shrink the control\n minHeight: theme.spacing(6),\n '& textarea': {\n minHeight: theme.spacing(6),\n },\n // Hide scrollbar\n scrollbarWidth: 'none', // Firefox\n '&::-webkit-scrollbar': {\n display: 'none', // Chrome, Safari, Edge\n },\n }),\n sendButton: css({\n label: 'ai-textarea-send',\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n }),\n };\n};\n","/**\n * Lightweight semantic version comparison utility.\n * Replaces semver library to reduce bundle size.\n *\n * Supports standard semver format: major.minor.patch[-prerelease][+build]\n * Pre-release versions are considered lower than release versions.\n * Build metadata is ignored for comparison purposes.\n */\n\ninterface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n prerelease?: string;\n}\n\n/**\n * Parses a semantic version string into its components.\n * @param version - Version string (e.g., \"1.2.3\", \"0.0.2-ga\", \"1.2.3+build\")\n * @returns Parsed version object or null if invalid\n */\nfunction parseVersion(version: string): ParsedVersion | null {\n // Remove build metadata (everything after +)\n const withoutBuild = version.split('+')[0];\n\n // Split into version and prerelease parts\n const parts = withoutBuild.split('-');\n const versionPart = parts[0];\n const prerelease = parts.length > 1 ? parts.slice(1).join('-') : undefined;\n\n // Parse major.minor.patch\n const numbers = versionPart.split('.').map(Number);\n if (numbers.length !== 3 || numbers.some(isNaN)) {\n return null;\n }\n\n return {\n major: numbers[0],\n minor: numbers[1],\n patch: numbers[2],\n prerelease,\n };\n}\n\n/**\n * Compares two semantic versions.\n * @param v1 - First version string\n * @param v2 - Second version string\n * @returns -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2, or null if either version is invalid\n */\nfunction compareVersions(v1: string, v2: string): number | null {\n const parsed1 = parseVersion(v1);\n const parsed2 = parseVersion(v2);\n\n if (!parsed1 || !parsed2) {\n return null;\n }\n\n // Compare major version\n if (parsed1.major !== parsed2.major) {\n return parsed1.major > parsed2.major ? 1 : -1;\n }\n\n // Compare minor version\n if (parsed1.minor !== parsed2.minor) {\n return parsed1.minor > parsed2.minor ? 1 : -1;\n }\n\n // Compare patch version\n if (parsed1.patch !== parsed2.patch) {\n return parsed1.patch > parsed2.patch ? 1 : -1;\n }\n\n // If both have prerelease, compare lexicographically\n // If only one has prerelease, it's considered lower\n if (parsed1.prerelease && parsed2.prerelease) {\n if (parsed1.prerelease === parsed2.prerelease) {\n return 0;\n }\n return parsed1.prerelease > parsed2.prerelease ? 1 : -1;\n }\n\n if (parsed1.prerelease && !parsed2.prerelease) {\n return -1; // v1 has prerelease, v2 doesn't, so v1 < v2\n }\n\n if (!parsed1.prerelease && parsed2.prerelease) {\n return 1; // v1 doesn't have prerelease, v2 does, so v1 > v2\n }\n\n return 0; // Both are release versions with same major.minor.patch\n}\n\n/**\n * Checks if version v1 is greater than version v2.\n * @param v1 - First version string\n * @param v2 - Second version string\n * @returns true if v1 > v2, false otherwise (including if either version is invalid)\n */\nexport function isVersionGreaterThan(v1: string, v2: string): boolean {\n const result = compareVersions(v1, v2);\n return result === 1;\n}\n","import { config, getBackendSrv } from '@grafana/runtime';\nimport { lastValueFrom } from 'rxjs';\nimport { useState, useEffect } from 'react';\nimport { ASSISTANT_PLUGIN_ID } from '../plugin';\nimport { isVersionGreaterThan } from './versionCompare';\nimport type { components } from './settings.gen';\n\n/**\n * The type of terms that apply to a tenant.\n * - 'msa': Master Service Agreement - only requires acceptance, no version checking\n * - 'termsAndConditions': Full terms and conditions - requires acceptance AND version checking\n */\nexport type TermsType = components['schemas']['TermsAndConditionsResponse']['termsType'];\n\n/**\n * Internal result type for fetching terms data.\n */\ninterface TermsCheckResult {\n accepted: boolean;\n termsType: TermsType;\n}\n\n/**\n * Event name that is dispatched when terms and conditions are accepted.\n * Other components can listen to this event to refresh their UI.\n */\nexport const TERMS_AND_CONDITIONS_REFRESH_EVENT = 'grafana-assistant-terms-and-conditions-refresh';\n\n/**\n * Internal function that fetches and evaluates terms data.\n * Returns both the acceptance status and the terms type.\n */\nasync function fetchTermsData(): Promise<TermsCheckResult> {\n const backendSrv = getBackendSrv();\n const appSubUrl = config?.appSubUrl ?? '';\n const apiUrl = `${appSubUrl}/api/plugins/${ASSISTANT_PLUGIN_ID}/resources/api/v1/settings/terms`;\n\n const response = await lastValueFrom(\n backendSrv.fetch({\n url: apiUrl,\n method: 'GET',\n showErrorAlert: false,\n })\n );\n\n // The API returns { status: \"success\", data: { ... } }, so we need to access response.data.data\n const responseBody = response.data as { data: components['schemas']['TermsAndConditionsResponse'] };\n const termsData = responseBody.data;\n\n const termsAccepted = termsData.acceptedTermsAndConditions ?? false;\n const acceptedVersion = termsData.acceptedVersion;\n const currentVersion = termsData.version;\n const termsType = termsData.termsType;\n\n // For MSA, we only check if terms are accepted\n if (termsType === 'msa') {\n return { accepted: termsAccepted, termsType };\n }\n\n // Check if terms are not accepted, or if no version was recorded or current version is missing\n if (!termsAccepted || !acceptedVersion || !currentVersion) {\n return { accepted: false, termsType };\n }\n\n // Check if the current version is newer than the accepted version\n const needsAcceptance = isVersionGreaterThan(currentVersion, acceptedVersion);\n return { accepted: termsAccepted && !needsAcceptance, termsType };\n}\n\n/**\n * Checks whether terms and conditions are accepted and up-to-date.\n * This function verifies that:\n * 1. Terms have been accepted\n * 2. The accepted version matches or exceeds the current version\n *\n * @returns A promise that resolves to `true` if terms are accepted and up-to-date, `false` otherwise\n * @throws Error if the API call fails\n *\n * @example\n * ```typescript\n * import { checkTerms } from '@grafana/assistant';\n *\n * const accepted = await checkTerms();\n * if (!accepted) {\n * // Show terms acceptance UI\n * console.log('Terms need to be accepted');\n * }\n * ```\n */\nexport async function checkTerms(): Promise<boolean> {\n try {\n const result = await fetchTermsData();\n return result.accepted;\n } catch (error) {\n // If API call fails, throw the error so callers can handle it\n throw new Error(`Failed to check terms requirements: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * React hook to check terms and conditions acceptance status.\n * Automatically fetches terms data on mount and re-fetches when terms change\n * (via TERMS_AND_CONDITIONS_REFRESH_EVENT).\n *\n * @returns An object containing whether terms are accepted, the terms type, loading state, and error state\n *\n * @example\n * ```typescript\n * import { useTerms } from '@grafana/assistant';\n *\n * function MyComponent() {\n * const { accepted, termsType, loading, error } = useTerms();\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error}</div>;\n * return <div>Terms accepted</div>;\n * }\n * ```\n */\nexport function useTerms() {\n const [accepted, setAccepted] = useState<boolean>(false);\n const [termsType, setTermsType] = useState<TermsType | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n async function fetchTerms() {\n try {\n setLoading(true);\n setError(null);\n const result = await fetchTermsData();\n setAccepted(result.accepted);\n setTermsType(result.termsType);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to check terms';\n setError(errorMessage);\n setAccepted(false);\n setTermsType(null);\n } finally {\n setLoading(false);\n }\n }\n\n fetchTerms();\n\n // Listen for the refresh event to re-fetch when terms change\n const handleTermsRefresh = () => {\n fetchTerms();\n };\n document.addEventListener(TERMS_AND_CONDITIONS_REFRESH_EVENT, handleTermsRefresh);\n return () => {\n document.removeEventListener(TERMS_AND_CONDITIONS_REFRESH_EVENT, handleTermsRefresh);\n };\n }, []);\n\n return {\n accepted,\n termsType,\n loading,\n error,\n };\n}\n","import { ToolInvokeOptions, ToolOutput, JSONSchema, JsonObject, InlineToolRunnable } from './types';\n\n/**\n * Creates a tool with the given implementation, schema, and metadata.\n * This is a zod-free implementation that accepts JSON Schema directly and a validation function.\n *\n * @param func The function implementation for the tool\n * @param options Tool configuration options\n * @returns A tool object that can be used in the agent\n */\nexport function createTool<T>(\n func: (input: T, options: ToolInvokeOptions) => Promise<ToolOutput>,\n options: {\n name: string;\n description: string;\n inputSchema: JSONSchema; // JSON Schema directly - no zod dependency!\n validate: (input: JsonObject) => T; // Validation function - replaces zod.parse()\n metadata?: {\n explainer?: (input?: T) => string;\n [key: string]: any;\n };\n verboseParsingErrors?: boolean;\n responseFormat?: 'content_and_artifact' | string;\n }\n): InlineToolRunnable {\n const { explainer, ...metadata } = options.metadata ?? {};\n const toolObj: InlineToolRunnable = {\n name: options.name,\n description: options.description,\n inputSchema: options.inputSchema,\n metadata: explainer\n ? {\n ...metadata,\n explainer: (input: JsonObject) => explainer(input as T),\n }\n : metadata,\n responseFormat: options.responseFormat,\n verboseParsingErrors: options.verboseParsingErrors,\n async invoke(input: JsonObject, invokeOptions: ToolInvokeOptions): Promise<ToolOutput> {\n try {\n if (invokeOptions.signal?.aborted) {\n throw new Error(`Tool ${options.name} execution was aborted`);\n }\n\n // Use the provided validation function instead of zod.parse()\n const parsedInput = options.validate(input);\n const functionPromise = func(parsedInput, invokeOptions);\n const promises = [functionPromise];\n\n if (invokeOptions.signal) {\n promises.push(\n new Promise((_, reject) => {\n invokeOptions.signal?.addEventListener(\n 'abort',\n () => {\n reject(new Error(`Tool ${options.name} execution was aborted`));\n },\n { once: true }\n );\n })\n );\n }\n\n // If we have a timeout, add a promise to handle it\n if (invokeOptions.timeout && invokeOptions.timeout > 0) {\n promises.push(\n new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Tool ${options.name} execution timed out after ${invokeOptions.timeout}ms`));\n }, invokeOptions.timeout);\n })\n );\n }\n\n // Race the function promise against the abort and timeout promises\n return Promise.race(promises);\n } catch (error) {\n // Handle parsing errors and wrap them in ToolError\n if (options.verboseParsingErrors) {\n console.error(`Error invoking tool ${options.name}:`, error, input);\n }\n throw error;\n }\n },\n };\n\n return toolObj;\n}\n","import { config, getBackendSrv } from '@grafana/runtime';\nimport { lastValueFrom } from 'rxjs';\nimport { useState, useEffect, useCallback } from 'react';\nimport { ASSISTANT_PLUGIN_ID } from '../plugin';\n\n/**\n * Event name dispatched when limits are updated via SSE.\n * Other components can listen to this event to get real-time updates.\n */\nexport const LIMITS_UPDATED_EVENT = 'grafana-assistant-limits-updated';\n\n/**\n * Detail payload for the LIMITS_UPDATED_EVENT custom event.\n */\nexport interface LimitsUpdatedEventDetail {\n count: number;\n limit: number;\n}\n\n/**\n * Result type for limits data.\n */\nexport interface LimitsData {\n /** Current prompt count for the month */\n count: number;\n /** Monthly prompt limit (0 = unlimited) */\n limit: number;\n /** Current month in YYYY-MM format */\n month: string;\n /** Whether the limit has been reached */\n isLimitReached: boolean;\n}\n\n/**\n * Internal function that fetches limits data from the API.\n */\nasync function fetchLimitsData(): Promise<LimitsData> {\n const backendSrv = getBackendSrv();\n const appSubUrl = config?.appSubUrl ?? '';\n const apiUrl = `${appSubUrl}/api/plugins/${ASSISTANT_PLUGIN_ID}/resources/api/v1/usage/limits/prompt`;\n\n const response = await lastValueFrom(\n backendSrv.fetch({\n url: apiUrl,\n method: 'GET',\n showErrorAlert: false,\n })\n );\n\n // The API returns { status: \"success\", data: { total, limit, month } }\n const responseBody = response.data as { data: { total: number; limit: number; month: string } };\n const limitsData = responseBody.data;\n\n const count = limitsData.total ?? 0;\n const limit = limitsData.limit ?? 0;\n const month = limitsData.month ?? '';\n\n return {\n count,\n limit,\n month,\n isLimitReached: limit > 0 && count >= limit,\n };\n}\n\n/**\n * Checks whether the user has reached their monthly prompt limit.\n *\n * @returns A promise that resolves to `true` if limits are reached, `false` otherwise\n * @throws Error if the API call fails\n *\n * @example\n * ```typescript\n * import { checkLimits } from '@grafana/assistant';\n *\n * const data = await checkLimits();\n * if (data.isLimitReached) {\n * console.log('Monthly limit reached');\n * }\n * ```\n */\nexport async function checkLimits(): Promise<LimitsData> {\n try {\n return await fetchLimitsData();\n } catch (error) {\n throw new Error(`Failed to check limits: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * React hook to check user prompt limits.\n * Automatically fetches limits data on mount and listens to real-time updates\n * via the LIMITS_UPDATED_EVENT custom event.\n *\n * @returns An object containing limit data, loading state, error state, and refetch function\n *\n * @example\n * ```typescript\n * import { useLimits } from '@grafana/assistant';\n *\n * function MyComponent() {\n * const { count, limit, isLimitReached, loading, error, refetch } = useLimits();\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error}</div>;\n * if (isLimitReached) return <div>Monthly limit reached ({count}/{limit})</div>;\n * return <div>Prompts used: {count}/{limit || 'unlimited'}</div>;\n * }\n * ```\n */\nexport function useLimits() {\n const [count, setCount] = useState<number>(0);\n const [limit, setLimit] = useState<number>(0);\n const [month, setMonth] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchLimits = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n const result = await fetchLimitsData();\n setCount(result.count);\n setLimit(result.limit);\n setMonth(result.month);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch limits';\n setError(errorMessage);\n setCount(0);\n setLimit(0);\n setMonth('');\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Fetch on mount\n useEffect(() => {\n fetchLimits();\n }, [fetchLimits]);\n\n // Listen for real-time updates via custom event\n useEffect(() => {\n const handleLimitsUpdate = (event: Event) => {\n const customEvent = event as CustomEvent<LimitsUpdatedEventDetail>;\n if (customEvent.detail) {\n setCount(customEvent.detail.count);\n setLimit(customEvent.detail.limit);\n // Clear any previous error since we received valid data via SSE\n setError(null);\n }\n };\n\n window.addEventListener(LIMITS_UPDATED_EVENT, handleLimitsUpdate);\n\n return () => {\n window.removeEventListener(LIMITS_UPDATED_EVENT, handleLimitsUpdate);\n };\n }, []);\n\n // Calculate isLimitReached based on current state\n const isLimitReached = limit > 0 && count >= limit;\n\n return {\n count,\n limit,\n month,\n isLimitReached,\n loading,\n error,\n refetch: fetchLimits,\n };\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","hash","input","i","length","charCodeAt","toString","NodeData","constructor","params","text","this","id","type","bypassLimits","formatForLLM","codeElementIds","data","name","equals","other","StructuredNodeData","super","JSON","stringify","require","GLOBAL_REGISTRY_KEY","REGISTRY_CHANGE_EVENT","LEGACY_REGISTRY_UPDATE_EVENT","LEGACY_REGISTRY_REMOVE_EVENT","LEGACY_REGISTRY_SYNC_EVENT","getPageContextRegistry","window","setPageContextRegistry","newRegistry","skipLegacyEvents","dispatchEvent","CustomEvent","detail","registry","legacyBridgeInitialized","providePageContext","urlPattern","initialContext","pattern","RegExp","source","trim","console","warn","registration","generateRegistrationId","context","setContext","newContext","currentRegistry","index","findIndex","reg","unregister","filter","_","addEventListener","event","existingIndex","r","incomingRegistry","Array","isArray","currentIds","Set","map","newRegistrations","has","empty","useProvidePageContext","setContextRef","useRef","undefined","pendingUpdate","isModified","useEffect","current","contextToUse","useCallback","usePageContext","options","allowQuestions","allowComponents","pageContext","setPageContext","useState","location","useLocationService","currentPathnameRef","updateContext","currentUrl","activeContext","matchesUrlPattern","push","getActivePageContext","getLocation","pathname","handleRegistryChange","locationSub","getLocationObservable","subscribe","loc","unsubscribe","removeEventListener","filteredContext","item","node","prefix","Date","now","Math","random","slice","url","test","regexPattern","replace","ComponentNodeData","namespace","keys","components","join","prompt","usePageComponents","useMemo","allComponents","forEach","componentData","entries","componentName","component","provideComponents","flags","createAssistantContextItem","setter","newComponents","newPrompt","globalComponents","promptContext","DashboardNodeData","dashboardUid","dashboardTitle","folderUid","folderTitle","FolderNodeData","DatasourceNodeData","datasourceUid","datasourceType","datasourceName","img","uid","EntityNodeData","scope","env","site","Boolean","title","hidden","icon","entityType","properties","LabelNameNodeData","labelName","LabelValueNodeData","labelValue","operator","getDatasourceMeta","datasourceInstance","getDataSourceSrv","getInstanceSettings","meta","info","logos","small","defaultIcons","datasource","label_name","label_value","dashboard","dashboard_folder","unknown","structured","entity","skill","nodeData","error","createContextByType","defaultTitle","getTitleFromContextNode","getImgFromContextNode","navigable","selectable","occurrences","SkillNodeData","skillId","skillName","provideQuestions","initialQuestions","registrationId","convertQuestionsToContext","questions","question","setQuestions","newQuestions","useProvideQuestions","useQuestions","convertContextToQuestions","contextItems","InvestigationCreatedEvent","BusEventWithPayload","emitInvestigationCreated","investigationId","getAppEvents","publish","onInvestigationCreated","callback","subscription","payload","CALLBACK_EXTENSION_POINT","newFunctionNamespace","functions","getExposeAssistantFunctionsConfig","namespaces","targets","fn","ASSISTANT_PLUGIN_ID","ASSISTANT_PLUGIN_TITLE","MAX_RETRY_ATTEMPTS","INITIAL_RETRY_DELAY","MAX_RETRY_DELAY","isAssistantAvailable","getObservablePluginLinks","defer","extensionPointId","pipe","links","some","link","pluginId","throwError","retry","count","delay","retryCount","errorMessage","message","toLowerCase","includes","delayMs","min","pow","timer","catchError","of","OpenExtensionSidebarEvent","CloseExtensionSidebarEvent","BusEventBase","ToggleExtensionSidebarEvent","openAssistant","props","reportInteraction","from","origin","componentTitle","openExtensionSidebar","initialPrompt","initialAutoSend","autoSend","initialMode","mode","closeAssistant","closeExtensionSidebar","toggleAssistant","toggleExtensionSidebar","useAssistant","available","setAvailable","sub","isAvailable","isLoading","StyleSheet","_this","_insertTag","tag","before","tags","insertionPoint","nextSibling","prepend","container","firstChild","insertBefore","isSpeedy","speedy","ctr","nonce","_proto","hydrate","nodes","insert","rule","document","createElement","setAttribute","appendChild","createTextNode","createStyleElement","sheet","styleSheets","ownerNode","sheetForTag","insertRule","cssRules","e","flush","_tag$parentNode","parentNode","removeChild","abs","String","fromCharCode","assign","replacement","indexof","search","indexOf","begin","end","array","line","column","position","character","characters","root","parent","children","return","prev","next","peek","caret","token","alloc","dealloc","delimit","delimiter","whitespace","escaping","commenter","identifier","COMMENT","output","element","compile","parse","rules","rulesets","pseudo","points","declarations","offset","atrule","property","previous","variable","scanning","ampersand","reference","comment","declaration","ruleset","post","size","j","k","x","y","z","identifierWithPointTracking","fixedElements","WeakMap","compat","isImplicitRule","set","parsed","toRules","getRules","parentRules","removeLabel","defaultStylisPlugins","exec","unitlessKeys","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","msGridRow","msGridRowSpan","msGridColumn","msGridColumnSpan","fontWeight","lineHeight","opacity","order","orphans","scale","tabSize","widows","zIndex","zoom","WebkitLineClamp","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","memoize","cache","create","arg","hyphenateRegex","animationRegex","isCustomProperty","isProcessableValue","processStyleName","styleName","processStyleValue","match","p1","p2","cursor","styles","handleInterpolation","mergedProps","registered","interpolation","componentSelector","__emotion_styles","keyframes","anim","serializedStyles","string","asString","interpolated","_i","createStringFromObject","previousCursor","result","cached","labelPattern","serializeStyles","args","stringMode","strings","raw","lastIndex","identifierName","str","h","len","getRegisteredStyles","registeredStyles","classNames","rawClassName","split","className","insertWithoutScoping","serialized","inserted","merge","css","classnames","cls","toAdd","_createEmotion","ssrStyles","querySelectorAll","getAttribute","head","_insert","stylisPlugins","nodesToHydrate","attrib","currentSheet","collection","finalizingPlugins","serializer","concat","selector","shouldCache","createCache","_len","arguments","_key","registerStyles","insertStyles","cx","_len4","_key4","injectGlobal","_len3","_key3","_len2","_key2","animation","ids","bind","OpenAssistantButton","OpenAssistantButtonView","iconOnlyButton","onClick","useStyles2","getStyles","IconButton","variant","tooltip","Button","fill","button","theme","baseBackground","colors","secondary","main","elevatedBackground","emphasize","underlyingColor","background","canvas","outerRadius","shape","radius","default","innerRadius","gradientBorderLayer","content","inset","borderRadius","cornerShape","pointerEvents","solidBackgroundLayer","transition","label","isolation","border","padding","spacing","defaultDropdownButtonWidths","sm","md","lg","OpenAssistantSplitButton","OpenAssistantSplitButtonView","menuItems","dropdownButtonWidth","hasMenuItems","resolvedDropdownButtonWidth","width","wrapperContent","wrapper","ButtonGroup","buttonGroup","segmentButton","mainButtonSplit","mainButtonSolo","Dropdown","overlay","dropdownButton","style","minWidth","Tooltip","dividerColor","weak","display","gap","overflow","boxShadow","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","alignItems","justifyContent","margin","getBackgroundGradientColors","defaultGradientColors","matches","gradients","brandHorizontal","createBorderAnimation","backgroundColor","color1","color2","animationSteps","animationFrames","gradientColor1","gradientColor2","finalColor1","finalColor2","step","backgroundImage","GLOBAL_FACTORY_KEY","GLOBAL_INITIALIZER_KEY","GLOBAL_INITIALIZATION_PROMISE_KEY","setInlineAssistantFactory","existing","setInlineAssistantInitializer","async","ensureInlineAssistantInitialized","initializer","Error","existingPromise","initPromise","err","getInlineAssistantFactory","factory","useInlineAssistant","isGenerating","setIsGenerating","setContent","setError","assistantRef","reset","cancel","generate","sendPrompt","agentName","agentId","systemPrompt","tools","onStart","onDelta","delta","onComplete","onError","dispose","useAIGeneration","onChange","disabled","autoGenerate","streaming","getUserPrompt","hasAutoGenerated","valueBeforeGeneration","displayValue","resolvedPrompt","isSendDisabled","doGenerate","handleGenerate","GENERATING_PHRASES","useGeneratingPlaceholder","defaultPlaceholder","phrase","setPhrase","wasGenerating","floor","AITextInput","placeholder","dataTestId","activePlaceholder","addonAfter","animatedWrapper","Input","onKeyDown","metaKey","ctrlKey","preventDefault","currentTarget","suffix","invalid","primary","borderAnimation","backgroundOrigin","backgroundClip","AITextArea","rows","effectiveRows","max","textareaWrapper","TextArea","textarea","sendButton","paddingRight","minHeight","scrollbarWidth","right","top","parseVersion","version","parts","versionPart","prerelease","numbers","Number","isNaN","major","minor","patch","TERMS_AND_CONDITIONS_REFRESH_EVENT","fetchTermsData","backendSrv","getBackendSrv","apiUrl","config","appSubUrl","termsData","lastValueFrom","fetch","method","showErrorAlert","termsAccepted","acceptedTermsAndConditions","acceptedVersion","currentVersion","termsType","accepted","needsAcceptance","v1","v2","parsed1","parsed2","compareVersions","checkTerms","useTerms","setAccepted","setTermsType","loading","setLoading","fetchTerms","handleTermsRefresh","createTool","func","explainer","metadata","toolObj","description","inputSchema","responseFormat","verboseParsingErrors","invoke","invokeOptions","signal","aborted","parsedInput","validate","promises","Promise","reject","once","timeout","setTimeout","race","LIMITS_UPDATED_EVENT","fetchLimitsData","limitsData","total","limit","month","isLimitReached","checkLimits","useLimits","setCount","setLimit","setMonth","fetchLimits","handleLimitsUpdate","customEvent","refetch"],"ignoreList":[],"sourceRoot":""}
1
+ {"version":3,"file":"index.js","mappings":"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","sources":["webpack://@grafana/assistant/webpack/bootstrap","webpack://@grafana/assistant/webpack/runtime/compat get default export","webpack://@grafana/assistant/webpack/runtime/define property getters","webpack://@grafana/assistant/webpack/runtime/hasOwnProperty shorthand","webpack://@grafana/assistant/webpack/runtime/make namespace object","webpack://@grafana/assistant/./src/utils/hash.ts","webpack://@grafana/assistant/./src/context/base.ts","webpack://@grafana/assistant/external commonjs2 \"@grafana/runtime\"","webpack://@grafana/assistant/external commonjs2 \"react\"","webpack://@grafana/assistant/./src/context/page.ts","webpack://@grafana/assistant/./src/context/component.ts","webpack://@grafana/assistant/./src/context/dashboard.ts","webpack://@grafana/assistant/./src/context/datasource.ts","webpack://@grafana/assistant/./src/context/entity.ts","webpack://@grafana/assistant/./src/context/label.ts","webpack://@grafana/assistant/./src/context/factory.ts","webpack://@grafana/assistant/./src/context/chat.ts","webpack://@grafana/assistant/./src/context/skill.ts","webpack://@grafana/assistant/./src/context/questions.ts","webpack://@grafana/assistant/external commonjs2 \"@grafana/data\"","webpack://@grafana/assistant/./src/investigations.ts","webpack://@grafana/assistant/./src/functions.ts","webpack://@grafana/assistant/external commonjs2 \"rxjs\"","webpack://@grafana/assistant/./src/plugin.ts","webpack://@grafana/assistant/./src/sidebar.ts","webpack://@grafana/assistant/./src/hook.ts","webpack://@grafana/assistant/external commonjs2 \"@grafana/ui\"","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+sheet@1.4.0/node_modules/@emotion/sheet/dist/emotion-sheet.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Utility.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Tokenizer.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Enum.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Serializer.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Parser.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+cache@11.14.0/node_modules/@emotion/cache/dist/emotion-cache.browser.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+unitless@0.10.0/node_modules/@emotion/unitless/dist/emotion-unitless.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+memoize@0.9.0/node_modules/@emotion/memoize/dist/emotion-memoize.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+serialize@1.3.3/node_modules/@emotion/serialize/dist/emotion-serialize.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+hash@0.9.2/node_modules/@emotion/hash/dist/emotion-hash.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+utils@1.4.2/node_modules/@emotion/utils/dist/emotion-utils.browser.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+css@11.10.6/node_modules/@emotion/css/create-instance/dist/emotion-css-create-instance.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/@emotion+css@11.10.6/node_modules/@emotion/css/dist/emotion-css.esm.js","webpack://@grafana/assistant/../../../node_modules/.pnpm/stylis@4.2.0/node_modules/stylis/src/Middleware.js","webpack://@grafana/assistant/./src/components/button/OpenAssistantButton.tsx","webpack://@grafana/assistant/./src/components/button/OpenAssistantSplitButton.tsx","webpack://@grafana/assistant/./src/utils/theme.ts","webpack://@grafana/assistant/./src/inline/inlineAssistant.ts","webpack://@grafana/assistant/./src/inline/useInlineAssistant.ts","webpack://@grafana/assistant/./src/components/input/useAIGeneration.ts","webpack://@grafana/assistant/./src/components/input/useGeneratingPlaceholder.ts","webpack://@grafana/assistant/./src/components/input/AITextInput.tsx","webpack://@grafana/assistant/./src/components/input/AITextArea.tsx","webpack://@grafana/assistant/./src/components/button/QueryWithAssistantButton.tsx","webpack://@grafana/assistant/./src/terms/versionCompare.ts","webpack://@grafana/assistant/./src/terms/index.ts","webpack://@grafana/assistant/./src/tools/toolFactory.ts","webpack://@grafana/assistant/./src/limits/index.ts"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","/**\n * Simple hash function that generates a deterministic hash for a given input string.\n * Uses the djb2 algorithm for simplicity and good distribution.\n */\nexport function hash(input: string): string {\n let hash = 5381;\n\n for (let i = 0; i < input.length; i++) {\n hash = (hash << 5) + hash + input.charCodeAt(i);\n }\n\n // Convert to positive hex string\n return (hash >>> 0).toString(16);\n}\n","import { IconName } from '@grafana/ui';\nimport { ItemDataType, type ContextItemData, type UnknownItemData } from './types';\nimport { hash } from '../utils/hash';\n\nexport interface BaseParams {\n title?: string;\n // If true, the context item will not be shown in the context pills\n hidden?: boolean;\n // Image to display, if not selected, we fallback to icon\n img?: string;\n // Icon to display, if img is provided, icon is ignored\n icon?: IconName;\n /**\n * When true, bypasses size limits for fixed-size content that doesn't need truncation.\n *\n * Set `bypassLimits: true` for fixed-size content like:\n * - Static instructions or prompts\n * - Configuration that doesn't change\n * - Small, bounded metadata\n *\n * Keep `bypassLimits: false` (default) for variable-size content like:\n * - Query results, data tables, graphs\n * - User-generated content, logs\n * - Any content that could grow unexpectedly large\n *\n * @default false\n */\n bypassLimits?: boolean;\n}\n\nexport interface NodeDataParams extends BaseParams {\n id: string;\n type: ItemDataType;\n text?: string;\n}\n\nexport class NodeData {\n public id: string;\n public text = '';\n public type: ItemDataType;\n\n constructor(public params: NodeDataParams) {\n this.id = hash(params.id);\n this.type = params.type;\n }\n\n /** Whether size limits should be bypassed for this context item. Defaults to false. */\n get bypassLimits(): boolean {\n return this.params.bypassLimits ?? false;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.params.text ?? '',\n text: this.params.text ?? '',\n } satisfies UnknownItemData,\n };\n }\n\n equals(other: unknown): boolean {\n if (!(other instanceof NodeData)) {\n return false;\n }\n return this.id === other.id && this.type === other.type;\n }\n}\n\nexport interface StructuredNodeDataParams extends BaseParams {\n data: Record<string, any>;\n}\n\nexport class StructuredNodeData extends NodeData {\n public data: Record<string, any>;\n constructor(params: StructuredNodeDataParams) {\n super({ ...params, id: hash(JSON.stringify(params.data)), type: 'structured' });\n this.data = params.data;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: this.data,\n };\n }\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@grafana/runtime\");","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"react\");","import { useLocationService } from '@grafana/runtime';\nimport { ChatContextItem } from './types';\nimport { useEffect, useState, useRef, useCallback } from 'react';\n\n// Extend window interface for global registry\ndeclare global {\n interface Window {\n [key: string]: any;\n }\n}\n\nexport interface PageContextRegistration {\n id: string;\n urlPattern: string | RegExp;\n context: ChatContextItem[];\n}\n\n// Global registry key\nconst GLOBAL_REGISTRY_KEY = '__grafanaAssistantPageContextRegistry__';\n\n// Custom event for registry changes\nconst REGISTRY_CHANGE_EVENT = 'grafana-assistant:page-context-registry-changed';\n\n/**\n * Legacy event names for backward compatibility with the previous implementation.\n * These events are emitted alongside the new REGISTRY_CHANGE_EVENT to ensure\n * any existing code listening to the old events continues to work.\n *\n * @deprecated These event name is maintained for backward compatibility only.\n * TODO: Remove after old event-based approach is fully deprecated\n */\nconst LEGACY_REGISTRY_UPDATE_EVENT = 'grafana-assistant:page-context-update';\n/**\n * @deprecated These event name is maintained for backward compatibility only.\n * TODO: Remove after old event-based approach is fully deprecated\n */\nconst LEGACY_REGISTRY_REMOVE_EVENT = 'grafana-assistant:page-context-remove';\n/**\n * @deprecated These event name is maintained for backward compatibility only.\n * TODO: Remove after old event-based approach is fully deprecated\n */\nconst LEGACY_REGISTRY_SYNC_EVENT = 'grafana-assistant:page-context-sync';\n\n// Ensure global registry exists on window\nif (!window[GLOBAL_REGISTRY_KEY]) {\n window[GLOBAL_REGISTRY_KEY] = [];\n}\n\n// Get reference to the global registry\nfunction getPageContextRegistry(): PageContextRegistration[] {\n return window[GLOBAL_REGISTRY_KEY];\n}\n\n// TODO: Remove skipLegacyEvents parameter after old event-based approach is fully deprecated\nfunction setPageContextRegistry(newRegistry: PageContextRegistration[], skipLegacyEvents = false): void {\n window[GLOBAL_REGISTRY_KEY] = newRegistry;\n // Notify all listeners that the registry has changed\n window.dispatchEvent(new CustomEvent(REGISTRY_CHANGE_EVENT));\n\n // TODO: Remove this legacy event emission after old event-based approach is fully deprecated\n // Emit legacy sync event for backward compatibility (unless we're processing a legacy event)\n if (!skipLegacyEvents) {\n window.dispatchEvent(\n new CustomEvent(LEGACY_REGISTRY_SYNC_EVENT, {\n detail: { registry: newRegistry },\n })\n );\n }\n}\n\n/**\n * Bridge to handle legacy events from external apps using old versions of @grafana/assistant.\n * This ensures that registrations from external apps get synced into our window registry.\n *\n * TODO: Remove this entire bridge after old event-based approach is fully deprecated\n */\nlet legacyBridgeInitialized = false;\n\nfunction initializeLegacyEventBridge(): void {\n if (legacyBridgeInitialized) {\n return;\n }\n legacyBridgeInitialized = true;\n\n // Handle legacy update events (registration added or updated)\n window.addEventListener(LEGACY_REGISTRY_UPDATE_EVENT, (event: Event) => {\n const customEvent = event as CustomEvent;\n const registration = customEvent.detail as PageContextRegistration;\n\n if (!registration || !registration.id) {\n return;\n }\n\n const currentRegistry = getPageContextRegistry();\n const existingIndex = currentRegistry.findIndex((r) => r.id === registration.id);\n\n if (existingIndex !== -1) {\n // Update existing registration\n const newRegistry = [...currentRegistry];\n newRegistry[existingIndex] = registration;\n setPageContextRegistry(newRegistry, true); // Skip legacy events to avoid loops\n } else {\n // Add new registration\n setPageContextRegistry([...currentRegistry, registration], true); // Skip legacy events to avoid loops\n }\n });\n\n // Handle legacy remove events (registration removed)\n window.addEventListener(LEGACY_REGISTRY_REMOVE_EVENT, (event: Event) => {\n const customEvent = event as CustomEvent;\n const id = customEvent.detail?.id;\n\n if (!id) {\n return;\n }\n\n const currentRegistry = getPageContextRegistry();\n const index = currentRegistry.findIndex((r) => r.id === id);\n\n if (index !== -1) {\n const newRegistry = currentRegistry.filter((_, i) => i !== index);\n setPageContextRegistry(newRegistry, true); // Skip legacy events to avoid loops\n }\n });\n\n // Handle legacy sync events (entire registry sync from external app)\n window.addEventListener(LEGACY_REGISTRY_SYNC_EVENT, (event: Event) => {\n const customEvent = event as CustomEvent;\n const incomingRegistry = customEvent.detail?.registry as PageContextRegistration[];\n\n if (!Array.isArray(incomingRegistry)) {\n return;\n }\n\n const currentRegistry = getPageContextRegistry();\n const currentIds = new Set(currentRegistry.map((r) => r.id));\n\n // Merge: add any registrations from external app that we don't have\n const newRegistrations = incomingRegistry.filter((r) => !currentIds.has(r.id));\n\n if (newRegistrations.length > 0) {\n setPageContextRegistry([...currentRegistry, ...newRegistrations], true); // Skip legacy events to avoid loops\n }\n });\n}\n\n// TODO: Remove this initialization after old event-based approach is fully deprecated\n// Initialize the bridge on module load\ninitializeLegacyEventBridge();\n\n/**\n * Registers context items for specific pages based on URL patterns.\n * Returns a setter function to update the context dynamically, similar to useState.\n *\n * Multiple registrations with the same URL pattern are allowed and will all be merged\n * when the pattern matches. Each call creates a new independent registration.\n *\n * @param urlPattern - URL pattern (string or RegExp) to match against page URLs\n * @param initialContext - *Initial* array of ContextItems to provide when the pattern matches. IMPORTANT: will be overwritten when setContext is used to update the context.\n * @returns A setter function to update the context, with an unregister method attached\n */\nexport function providePageContext(\n urlPattern: string | RegExp,\n initialContext: ChatContextItem[]\n): ((context: ChatContextItem[]) => void) & { unregister: () => void } {\n // Validate URL pattern at registration time (only warn once, not on every match)\n validateUrlPattern(urlPattern);\n\n // Always create a new registration to allow multiple providers with the same URL pattern\n const registration: PageContextRegistration = {\n id: generateRegistrationId(),\n urlPattern,\n context: [...initialContext],\n };\n\n const registry = getPageContextRegistry();\n setPageContextRegistry([...registry, registration]);\n\n // TODO: Remove this legacy event emission after old event-based approach is fully deprecated\n // Emit legacy update event for backward compatibility\n window.dispatchEvent(\n new CustomEvent(LEGACY_REGISTRY_UPDATE_EVENT, {\n detail: registration,\n })\n );\n\n // Create setter function that can update the context\n const setContext = (newContext: ChatContextItem[]) => {\n const currentRegistry = getPageContextRegistry();\n const index = currentRegistry.findIndex((reg) => reg.id === registration.id);\n if (index !== -1) {\n const newRegistry = [...currentRegistry];\n newRegistry[index] = { ...newRegistry[index], context: [...newContext] };\n setPageContextRegistry(newRegistry);\n\n // TODO: Remove this legacy event emission after old event-based approach is fully deprecated\n // Emit legacy update event for backward compatibility\n window.dispatchEvent(\n new CustomEvent(LEGACY_REGISTRY_UPDATE_EVENT, {\n detail: newRegistry[index],\n })\n );\n }\n };\n\n // Add unregister method to the setter\n setContext.unregister = () => {\n const currentRegistry = getPageContextRegistry();\n const index = currentRegistry.findIndex((reg) => reg.id === registration.id);\n if (index !== -1) {\n const newRegistry = currentRegistry.filter((_, i) => i !== index);\n setPageContextRegistry(newRegistry);\n\n // TODO: Remove this legacy event emission after old event-based approach is fully deprecated\n // Emit legacy remove event for backward compatibility\n window.dispatchEvent(\n new CustomEvent(LEGACY_REGISTRY_REMOVE_EVENT, {\n detail: { id: registration.id },\n })\n );\n }\n };\n\n return setContext;\n}\n\nconst empty: ChatContextItem[] = [];\n\n/**\n * React hook for providing page context that automatically cleans up on unmount.\n * This is the recommended way to use page context in React components.\n *\n * @param urlPattern - URL pattern (string or RegExp) to match against page URLs\n * @param initialContext - Initial array of ContextItems to provide when the pattern matches. IMPORTANT: will be overwritten when setContext is used to update the context.\n * @returns A setter function to update the context\n */\nexport function useProvidePageContext(\n urlPattern: string | RegExp,\n initialContext: ChatContextItem[] = empty\n): (context: ChatContextItem[]) => void {\n const setContextRef = useRef<ReturnType<typeof providePageContext> | undefined>(undefined);\n const pendingUpdate = useRef<ChatContextItem[] | undefined>(undefined);\n const isModified = useRef(false);\n\n // Create or update the registration when dependencies change\n useEffect(() => {\n // Reset isModified flag when urlPattern changes so that initialContext updates\n // are applied to the new registration until manually modified again\n isModified.current = false;\n\n // If we have pending updates, prefer those over initialContext as they represent\n // newer state from child components\n const contextToUse = pendingUpdate.current !== undefined ? pendingUpdate.current : initialContext;\n setContextRef.current = providePageContext(urlPattern, contextToUse);\n\n // Clear pending update as it's now applied\n if (pendingUpdate.current !== undefined) {\n pendingUpdate.current = undefined;\n }\n\n // Cleanup on unmount or dependency change\n return () => {\n setContextRef.current?.unregister();\n setContextRef.current = undefined;\n };\n // We intentionally exclude initialContext from deps to prevent re-registering on every render\n // Updates to initialContext are handled by the second effect\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [urlPattern]);\n\n // Update context when initialContext changes, BUT only if we haven't manually modified it.\n // This prevents unstable initialContext props (e.g. passing [] inline) from overwriting\n // updates made via setContext by child components.\n useEffect(() => {\n if (!isModified.current && setContextRef.current) {\n setContextRef.current(initialContext);\n }\n }, [initialContext]);\n\n // Return a stable setter function\n const setContext = useCallback((newContext: ChatContextItem[]) => {\n isModified.current = true;\n if (setContextRef.current) {\n setContextRef.current(newContext);\n } else {\n pendingUpdate.current = newContext;\n }\n }, []);\n\n return setContext;\n}\n\n/**\n * Gets all context items that match the current URL.\n *\n * @param currentUrl - The current page URL to match against\n * @param registrations - Array of registrations to match against\n * @returns Array of ChatContextItem from all matching registrations\n */\nfunction getActivePageContext(currentUrl: string): ChatContextItem[] {\n if (!currentUrl) {\n return [];\n }\n\n const activeContext: ChatContextItem[] = [];\n const registry = getPageContextRegistry();\n\n for (const registration of registry) {\n if (matchesUrlPattern(currentUrl, registration.urlPattern)) {\n activeContext.push(...registration.context);\n }\n }\n\n return activeContext;\n}\n\nexport function usePageContext(\n options: { allowQuestions: boolean; allowComponents: boolean } = { allowQuestions: false, allowComponents: false }\n): ChatContextItem[] {\n const [pageContext, setPageContext] = useState<ChatContextItem[]>([]);\n const location = useLocationService();\n const currentPathnameRef = useRef<string>('');\n\n useEffect(() => {\n // Function to update context based on current location and registry\n const updateContext = () => {\n const pathname = location.getLocation().pathname;\n const context = getActivePageContext(pathname);\n setPageContext(context);\n };\n\n // Handle registry changes\n const handleRegistryChange = () => {\n updateContext();\n };\n\n // Subscribe to location changes\n const locationSub = location.getLocationObservable().subscribe((loc: { pathname: string }) => {\n const pathname = loc.pathname;\n if (pathname !== currentPathnameRef.current) {\n currentPathnameRef.current = pathname;\n updateContext();\n }\n });\n\n // Listen for registry changes\n window.addEventListener(REGISTRY_CHANGE_EVENT, handleRegistryChange);\n\n // TODO: Remove these legacy event listeners after old event-based approach is fully deprecated\n // Listen for legacy events for backward compatibility\n window.addEventListener(LEGACY_REGISTRY_UPDATE_EVENT, handleRegistryChange);\n window.addEventListener(LEGACY_REGISTRY_REMOVE_EVENT, handleRegistryChange);\n window.addEventListener(LEGACY_REGISTRY_SYNC_EVENT, handleRegistryChange);\n\n // Initial update\n updateContext();\n\n return () => {\n locationSub.unsubscribe();\n window.removeEventListener(REGISTRY_CHANGE_EVENT, handleRegistryChange);\n // TODO: Remove these legacy event listener removals after old event-based approach is fully deprecated\n window.removeEventListener(LEGACY_REGISTRY_UPDATE_EVENT, handleRegistryChange);\n window.removeEventListener(LEGACY_REGISTRY_REMOVE_EVENT, handleRegistryChange);\n window.removeEventListener(LEGACY_REGISTRY_SYNC_EVENT, handleRegistryChange);\n };\n }, [location]);\n\n let filteredContext = pageContext;\n\n if (!options.allowQuestions) {\n filteredContext = filteredContext.filter((item) => item.node.data?.type !== 'question');\n }\n\n if (!options.allowComponents) {\n filteredContext = filteredContext.filter((item) => item.node.data?.type !== 'component');\n }\n\n return filteredContext;\n}\n\nexport function generateRegistrationId(prefix = 'page-context'): string {\n return `${prefix}-${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\n/**\n * Validates the URL pattern at registration time and logs warnings for problematic patterns.\n * This is called once during registration, not on every URL match.\n */\nfunction validateUrlPattern(pattern: string | RegExp): void {\n if (pattern instanceof RegExp) {\n // Check if RegExp pattern matches everything (e.g., /.*/, /^.*$/)\n // This is intentional for global contexts (e.g., components), so we use a scoped warning\n const source = pattern.source;\n if (source === '.*' || source === '^.*$' || source === '^.*' || source === '.*$') {\n // Note: This is expected for global contexts like provideComponents.\n // The warning is intentionally omitted here since it's a valid use case.\n // If you want to warn for specific cases, filter them here.\n }\n return;\n }\n\n if (typeof pattern === 'string') {\n // Validate urlPattern - log error if empty string is passed\n if (!pattern || pattern.trim() === '') {\n console.warn(\n 'useProvidePageContext: Empty string passed as urlPattern. This will cause the context to not match any pages.'\n );\n return;\n }\n\n // Check if the pattern matches everything (e.g., ** becomes ^.*$)\n if (pattern === '**') {\n // Note: This is expected for global contexts.\n // The warning is intentionally omitted here since it's a valid use case.\n }\n }\n}\n\nfunction matchesUrlPattern(url: string, pattern: string | RegExp): boolean {\n if (pattern instanceof RegExp) {\n return pattern.test(url);\n }\n\n // For string patterns, support simple wildcards\n if (typeof pattern === 'string') {\n // Empty pattern never matches\n if (!pattern || pattern.trim() === '') {\n return false;\n }\n\n // Convert simple wildcard pattern to regex\n // * matches any characters except /, ** matches any path segments\n // Handle ** first with a placeholder to avoid conflicts\n const regexPattern = pattern\n .replace(/\\*\\*/g, '\\u0000DOUBLE_STAR\\u0000') // Temporary placeholder for **\n .replace(/\\*/g, '[^/]*') // * becomes [^/]*\n .replace(/\\u0000DOUBLE_STAR\\u0000/g, '.*') // Replace placeholder with .*\n .replace(/\\?/g, '.'); // ? becomes .\n\n const finalRegex = `^${regexPattern}$`;\n const regex = new RegExp(finalRegex);\n return regex.test(url);\n }\n\n return false;\n}\n\n/**\n * Test utility function to clear all registrations from the registry.\n * This should only be used in tests to ensure a clean slate between test runs.\n *\n * @internal This is for testing purposes only\n */\nexport function __clearPageContextRegistryForTesting(): void {\n setPageContextRegistry([]);\n}\n","import { ComponentType, useMemo } from 'react';\nimport { BaseParams, NodeData } from './base';\nimport { type ContextItemData, type ComponentItemData } from './types';\nimport { providePageContext, usePageContext } from './page';\nimport { createAssistantContextItem } from './chat';\n\nexport type ComponentImplementation = ComponentType<any>;\nexport type NamedComponents = Record<string, ComponentImplementation>;\n\n/**\n * Type used to create a component context item.\n */\nexport interface CreateComponentContextParams extends BaseParams {\n components: Record<string, ComponentType<any>>;\n prompt: string;\n namespace?: string;\n}\n\nexport class ComponentNodeData extends NodeData {\n public components: Record<string, ComponentType<any>>;\n public prompt: string;\n public namespace: string;\n\n constructor(params: CreateComponentContextParams) {\n const namespace = params.namespace || 'components';\n super({ ...params, id: `${namespace}-${Object.keys(params.components).join('-')}`, type: 'component' });\n this.components = params.components;\n this.prompt = params.prompt;\n this.namespace = namespace;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n data: {\n name: `Custom UI components (${this.namespace})`,\n prompt: this.prompt\n ? this.prompt +\n '\\n\\nIMPORTANT: The instructions and components described above are scoped to this specific context item only. Do not apply them to unrelated queries or components.'\n : '',\n } satisfies Omit<ComponentItemData, 'components' | 'text' | 'namespace'>,\n };\n }\n}\n\n/**\n * React hook that provides all components available globally.\n * Components are available everywhere, regardless of URL patterns.\n *\n * @returns Object containing all components available globally, keyed by namespace.componentName\n */\nexport function usePageComponents(): Record<string, ComponentImplementation> {\n const pageContext = usePageContext({ allowComponents: true, allowQuestions: false });\n\n // Use useMemo to avoid recreating the components object on every render\n const components = useMemo(() => {\n const allComponents: Record<string, ComponentImplementation> = {};\n\n // Filter for component context items and extract their components\n pageContext\n .filter((item) => item.node.data?.components)\n .forEach((item) => {\n const componentData = item.node.data;\n if (componentData?.components && Object.keys(componentData.components).length > 0) {\n const namespace = componentData.namespace || componentData.name || 'components';\n\n // Add each component with namespace_componentName format\n Object.entries(componentData.components).forEach(([componentName, component]) => {\n allComponents[`${namespace}_${componentName}`] = component as ComponentImplementation;\n });\n }\n });\n\n return allComponents;\n }, [pageContext]);\n\n return components;\n}\n\n/**\n * Provide components to the assistant.\n *\n * Components are always available globally, but the prompt is only applied when the URL pattern matches.\n *\n * For catch-all URL patterns, returns a setter that takes a context array.\n * For specific URL patterns, returns a setter that takes components and prompt separately.\n *\n * @param prompt - The prompt to use for the components (only applied when URL matches).\n * @param namespace - The namespace to use for the components.\n * @param components - The components to provide (always available).\n * @param urlPattern - The URL pattern to match for the prompt (components are always available).\n * @returns A setter function to update the context, with an unregister method attached\n */\nexport function provideComponents(\n prompt: string,\n namespace: string,\n components: Record<string, ComponentImplementation>,\n urlPattern: string | RegExp = /.*/\n): ((newComponents: Record<string, ComponentImplementation>, newPrompt: string) => void) & { unregister: () => void } {\n // Check if the URL pattern is catch-all (.*) - if so, register everything together\n const isCatchAll = (pattern: string | RegExp) => {\n if (pattern instanceof RegExp) {\n return pattern.source === '.*' && pattern.flags === '';\n }\n return pattern === '.*' || pattern === '/.*/';\n };\n\n if (isCatchAll(urlPattern)) {\n // If pattern is catch-all, register components and prompt together globally\n const setContext = providePageContext(/.*/, [\n createAssistantContextItem('component', {\n components,\n prompt,\n namespace,\n }),\n ]);\n\n // Create a wrapper setter that matches the expected signature\n const setter = (newComponents: Record<string, ComponentImplementation>, newPrompt: string) => {\n setContext([\n createAssistantContextItem('component', {\n components: newComponents,\n prompt: newPrompt,\n namespace,\n }),\n ]);\n };\n\n // Attach unregister method\n setter.unregister = setContext.unregister;\n\n return setter;\n }\n\n // For specific URL patterns, separate components (global) from prompt (URL-specific)\n const globalComponents = providePageContext(/.*/, [\n createAssistantContextItem('component', {\n components,\n prompt: '', // No prompt for global components\n namespace,\n }),\n ]);\n\n // Only register prompt for specific URL pattern\n const promptContext = providePageContext(urlPattern, [\n createAssistantContextItem('component', {\n components: {}, // No components, just prompt\n prompt,\n namespace,\n }),\n ]);\n\n // Return a setter that properly separates components and prompt\n // When updating, we extract components and prompt from the new data and update each registration appropriately\n const setter = (newComponents: Record<string, ComponentImplementation>, newPrompt: string) => {\n // Update global components registration with new components (but empty prompt)\n globalComponents([\n createAssistantContextItem('component', {\n components: newComponents,\n prompt: '', // No prompt for global components\n namespace,\n }),\n ]);\n\n // Update URL-specific registration with new prompt (but empty components)\n promptContext([\n createAssistantContextItem('component', {\n components: {}, // No components, just prompt\n prompt: newPrompt,\n namespace,\n }),\n ]);\n };\n\n // Attach unregister method that cleans up both registrations\n setter.unregister = () => {\n globalComponents.unregister();\n promptContext.unregister();\n };\n\n return setter;\n}\n","import { BaseParams, NodeData } from './base';\nimport { type ContextItemData, type DashboardItemData, type FolderItemData } from './types';\n\nexport interface CreateDashboardContextParams extends BaseParams {\n dashboardUid: string;\n dashboardTitle: string;\n folderUid?: string;\n folderTitle?: string;\n}\n\nexport interface CreateFolderContextParams extends BaseParams {\n folderUid: string;\n folderTitle: string;\n}\n\nexport class DashboardNodeData extends NodeData {\n public dashboardUid: string;\n public dashboardTitle: string;\n public folderUid?: string;\n public folderTitle?: string;\n\n constructor(params: CreateDashboardContextParams) {\n super({ ...params, id: params.dashboardUid, type: 'dashboard' });\n this.dashboardUid = params.dashboardUid;\n this.dashboardTitle = params.dashboardTitle;\n this.folderUid = params.folderUid;\n this.folderTitle = params.folderTitle;\n this.text = params.dashboardTitle;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.dashboardTitle,\n dashboardUid: this.dashboardUid,\n dashboardTitle: this.dashboardTitle,\n folderUid: this.folderUid,\n folderTitle: this.folderTitle,\n text: this.text,\n } satisfies DashboardItemData,\n };\n }\n}\n\nexport class FolderNodeData extends NodeData {\n public folderUid: string;\n public folderTitle: string;\n public text = '';\n\n constructor(params: CreateFolderContextParams) {\n super({ ...params, id: params.folderUid, type: 'dashboard_folder' });\n this.folderUid = params.folderUid;\n this.folderTitle = params.folderTitle;\n this.text = params.folderTitle;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.folderTitle,\n folderUid: this.folderUid,\n folderTitle: this.folderTitle,\n text: this.text,\n } satisfies FolderItemData,\n };\n }\n}\n","import { BaseParams, NodeData } from './base';\nimport { DatasourceMeta } from './factory';\nimport { type ContextItemData, type DatasourceItemData } from './types';\n\n/**\n * Type used to create a datasource context item.\n *\n * All required attributes will be inferred from the datasources uid.\n */\nexport interface CreateDatasourceContextParams extends BaseParams {\n datasourceUid: string;\n}\n\nexport class DatasourceNodeData extends NodeData {\n public datasourceUid: string;\n public datasourceType: string;\n public datasourceName: string;\n public img?: string;\n\n constructor(params: CreateDatasourceContextParams & DatasourceMeta) {\n super({ ...params, id: params.datasourceUid, type: 'datasource' });\n this.datasourceUid = params.datasourceUid;\n this.datasourceType = params.datasourceType;\n this.datasourceName = params.datasourceName;\n this.img = params.img;\n this.text = params.datasourceName;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.datasourceName,\n uid: this.datasourceUid,\n type: this.datasourceType,\n text: this.text,\n } satisfies DatasourceItemData,\n };\n }\n}\n","import { BaseParams, NodeData } from './base';\nimport { type ContextItemData, type EntityItemData } from './types';\n\n/**\n * Type used to create an entity context item.\n */\nexport interface CreateEntityContextParams extends BaseParams {\n type: string;\n name: string;\n scope?: {\n env?: string;\n site?: string;\n namespace?: string;\n };\n properties?: Record<string, any>;\n}\n\nexport class EntityNodeData extends NodeData {\n public entityType: string;\n public name: string;\n public scope?: {\n env?: string;\n site?: string;\n namespace?: string;\n };\n public properties?: Record<string, any>;\n\n constructor(params: CreateEntityContextParams) {\n super({\n id: `${params.type}-${params.name}-${[params.scope?.env, params.scope?.site, params.scope?.namespace].filter(Boolean).join('-')}`,\n type: 'entity',\n title: params.title,\n hidden: params.hidden,\n img: params.img,\n icon: params.icon,\n text: params.name,\n });\n this.entityType = params.type;\n this.name = params.name;\n this.scope = params.scope;\n this.properties = params.properties;\n this.text = params.name;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: 'entity',\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.name,\n text: this.text,\n type: this.entityType,\n scope: this.scope,\n properties: this.properties,\n } satisfies EntityItemData,\n };\n }\n}\n","import { BaseParams, NodeData } from './base';\nimport { DatasourceMeta } from './factory';\nimport { type ContextItemData, type LabelNameItemData, type LabelValueItemData } from './types';\n\nexport interface CreateLabelNameContextParams extends BaseParams {\n datasourceUid: string;\n labelName: string;\n}\n\nexport interface CreateLabelValueContextParams extends CreateLabelNameContextParams {\n labelValue: string;\n /** Filter operator (e.g., '=', '!=', '=~', '!~'). Defaults to '=' if not specified */\n operator?: string;\n}\n\nexport class LabelNameNodeData extends NodeData {\n public datasourceUid: string;\n public datasourceType: string;\n public datasourceName: string;\n public labelName: string;\n public img?: string;\n\n constructor(params: CreateLabelNameContextParams & DatasourceMeta) {\n super({ ...params, id: `${params.datasourceUid}-${params.labelName}`, type: 'label_name' });\n this.datasourceUid = params.datasourceUid;\n this.datasourceType = params.datasourceType;\n this.datasourceName = params.datasourceName;\n this.labelName = params.labelName;\n this.text = params.labelName;\n this.img = params.img;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.labelName,\n datasourceUid: this.datasourceUid,\n datasourceType: this.datasourceType,\n datasourceName: this.datasourceName,\n labelName: this.labelName,\n text: this.text,\n } satisfies LabelNameItemData,\n };\n }\n}\n\nexport class LabelValueNodeData extends NodeData {\n public datasourceUid: string;\n public datasourceType: string;\n public datasourceName: string;\n public labelName: string;\n public labelValue: string;\n public img?: string;\n public operator: string;\n\n constructor(params: CreateLabelValueContextParams & DatasourceMeta) {\n super({\n ...params,\n id: `${params.datasourceUid}-${params.labelName}-${params.labelValue}-${params.operator || '='}`,\n type: 'label_value',\n });\n this.datasourceUid = params.datasourceUid;\n this.datasourceType = params.datasourceType;\n this.datasourceName = params.datasourceName;\n this.labelName = params.labelName;\n this.labelValue = params.labelValue;\n this.text = params.labelValue;\n this.img = params.img;\n this.operator = params.operator || '=';\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.labelValue,\n datasourceUid: this.datasourceUid,\n datasourceType: this.datasourceType,\n datasourceName: this.datasourceName,\n labelName: this.labelName,\n labelValue: this.labelValue,\n text: this.text,\n operator: this.operator,\n } satisfies LabelValueItemData,\n };\n }\n}\n","import { getDataSourceSrv } from '@grafana/runtime';\nimport { NodeData, NodeDataParams, StructuredNodeData, StructuredNodeDataParams } from './base';\nimport { ComponentNodeData, type CreateComponentContextParams } from './component';\nimport {\n DashboardNodeData,\n FolderNodeData,\n type CreateDashboardContextParams,\n type CreateFolderContextParams,\n} from './dashboard';\nimport { DatasourceNodeData, type CreateDatasourceContextParams } from './datasource';\nimport { EntityNodeData, type CreateEntityContextParams } from './entity';\nimport {\n LabelNameNodeData,\n LabelValueNodeData,\n type CreateLabelNameContextParams,\n type CreateLabelValueContextParams,\n} from './label';\n\n/**\n * registry to handle the type mappings between ItemData type, params and node data\n */\nexport type ContextTypeRegistry = {\n datasource: { params: CreateDatasourceContextParams; node: DatasourceNodeData };\n label_name: { params: CreateLabelNameContextParams; node: LabelNameNodeData };\n label_value: { params: CreateLabelValueContextParams; node: LabelValueNodeData };\n dashboard: { params: CreateDashboardContextParams; node: DashboardNodeData };\n dashboard_folder: { params: CreateFolderContextParams; node: FolderNodeData };\n structured: { params: StructuredNodeDataParams; node: StructuredNodeData };\n component: { params: CreateComponentContextParams; node: ComponentNodeData };\n entity: { params: CreateEntityContextParams; node: EntityNodeData };\n unknown: { params: NodeDataParams; node: NodeData };\n};\n\nexport type DatasourceMeta = {\n datasourceType: string;\n datasourceName: string;\n img?: string;\n};\n\n/**\n * Helper function to get datasource type from datasource UID\n */\nfunction getDatasourceMeta(datasourceUid: string): DatasourceMeta {\n const datasourceInstance = getDataSourceSrv().getInstanceSettings(datasourceUid);\n return {\n datasourceType: datasourceInstance?.type ?? 'unknown',\n datasourceName: datasourceInstance?.name ?? datasourceUid,\n img: datasourceInstance?.meta?.info?.logos?.small,\n };\n}\n\n/**\n * Creates context nodes based on type with full type safety using generics\n */\nexport function createContextByType<T extends keyof ContextTypeRegistry>(\n type: T,\n params: ContextTypeRegistry[T]['params']\n): ContextTypeRegistry[T]['node'] {\n switch (type) {\n case 'datasource':\n return new DatasourceNodeData({\n ...(params as CreateDatasourceContextParams),\n ...getDatasourceMeta((params as CreateDatasourceContextParams).datasourceUid),\n });\n case 'label_name':\n return new LabelNameNodeData({\n ...(params as CreateLabelNameContextParams),\n ...getDatasourceMeta((params as CreateLabelNameContextParams).datasourceUid),\n });\n case 'label_value':\n return new LabelValueNodeData({\n ...(params as CreateLabelValueContextParams),\n ...getDatasourceMeta((params as CreateLabelValueContextParams).datasourceUid),\n });\n case 'dashboard':\n return new DashboardNodeData(params as CreateDashboardContextParams);\n case 'dashboard_folder':\n return new FolderNodeData(params as CreateFolderContextParams);\n case 'structured':\n return new StructuredNodeData(params as StructuredNodeDataParams);\n case 'component':\n return new ComponentNodeData({\n ...(params as CreateComponentContextParams),\n hidden: true,\n });\n case 'entity':\n return new EntityNodeData(params as CreateEntityContextParams);\n case 'unknown':\n return new NodeData(params as NodeDataParams);\n default:\n console.error(`Unknown context type: ${type}`);\n return new NodeData(params as NodeDataParams);\n }\n}\n","import { IconName } from '@grafana/ui';\nimport { NodeData, StructuredNodeData } from './base';\nimport { createContextByType, ContextTypeRegistry } from './factory';\nimport { ChatContextItem, ItemDataType } from './types';\n\nconst defaultIcons: Record<ItemDataType, IconName> = {\n datasource: 'database',\n label_name: 'database',\n label_value: 'database',\n dashboard: 'dashboard',\n dashboard_folder: 'folder',\n unknown: 'circle-mono',\n structured: 'gf-grid',\n component: 'gf-grid',\n entity: 'asserts',\n skill: 'play',\n};\n\nfunction getTitleFromContextNode(nodeData: NodeData | StructuredNodeData): string {\n return nodeData instanceof StructuredNodeData\n ? nodeData.formatForLLM().data.name\n : (nodeData.text ?? 'Given Context');\n}\n\nfunction getImgFromContextNode(nodeData: NodeData | StructuredNodeData): string | undefined {\n if ('img' in nodeData) {\n return (nodeData as { img?: string }).img;\n }\n return undefined;\n}\n\n/**\n * Creates a new chat context item that can be added to conversations.\n *\n * This function creates structured context items that provide additional information\n * to the AI assistant during conversations. Context items can include:\n * - Datasources (metrics, logs, traces)\n * - Labels and their values\n * - Dashboards and folders\n * - Structured data objects\n *\n * The created context item includes display metadata (title, icon, image) and\n * the underlying data that will be formatted and sent to the LLM when the\n * context is included in a conversation.\n *\n * @param type - The type of context to create (Datasource, Label, Dashboard etc.)\n * @param params - Type-specific parameters for creating the context item\n * @returns A ChatContextItem that can be added to conversation context\n *\n * @example\n * ```typescript\n * // Create a context that will be passed into the function triggering an assistant open\n * openAssistant({\n * ...\n * origin: 'my-feature',\n * context: [\n * createAssistantContextItem('datasource', {\n * datasourceUid: datasource.uid,\n * img: datasource.meta?.info?.logos?.small,\n * }),\n * ],\n * });\n * ```\n */\nexport function createAssistantContextItem<T extends keyof ContextTypeRegistry>(\n type: T,\n params: ContextTypeRegistry[T]['params']\n): ChatContextItem {\n const nodeData = createContextByType(type, params);\n const defaultTitle = params.title ?? getTitleFromContextNode(nodeData);\n const img = params.img ?? getImgFromContextNode(nodeData);\n return {\n node: {\n id: nodeData.id,\n name: defaultTitle,\n img,\n icon: params.icon ?? defaultIcons[type],\n navigable: false,\n selectable: true,\n data: nodeData,\n },\n occurrences: [],\n };\n}\n","import { BaseParams, NodeData } from './base';\nimport { type ContextItemData, type SkillItemData } from './types';\n\nexport interface CreateSkillContextParams extends BaseParams {\n skillId: string;\n skillName: string;\n}\n\nexport class SkillNodeData extends NodeData {\n public skillId: string;\n public skillName: string;\n\n constructor(params: CreateSkillContextParams) {\n super({\n ...params,\n id: params.skillId,\n type: 'skill',\n text: params.skillName,\n });\n this.skillId = params.skillId;\n this.skillName = params.skillName;\n this.text = params.skillName;\n }\n\n formatForLLM(codeElementIds?: string[]): ContextItemData {\n return {\n type: this.type,\n codeElementIds,\n bypassLimits: this.bypassLimits,\n data: {\n name: this.skillName,\n skillId: this.skillId,\n skillName: this.skillName,\n text: this.text,\n } satisfies SkillItemData,\n };\n }\n}\n","import { useMemo } from 'react';\nimport { ChatContextItem } from './types';\nimport { providePageContext, useProvidePageContext, usePageContext, generateRegistrationId } from './page';\n\nexport interface Question {\n prompt: string;\n title?: string;\n context?: ChatContextItem[];\n}\n\nexport interface QuestionRegistration {\n id: string;\n urlPattern: string | RegExp;\n questions: Question[];\n}\n\n/**\n * Registers questions for specific pages based on URL patterns.\n * Returns a setter function to update the questions dynamically, similar to useState.\n *\n * Multiple registrations with the same URL pattern are allowed and will all be merged\n * when the pattern matches. Each call creates a new independent registration.\n *\n * @param urlPattern - URL pattern (string or RegExp) to match against page URLs\n * @param initialQuestions - Initial array of questions to provide when the pattern matches\n * @returns A setter function to update the questions, with an unregister method attached\n */\nexport function provideQuestions(\n urlPattern: string | RegExp,\n initialQuestions: Question[]\n): ((questions: Question[]) => void) & { unregister: () => void } {\n // Generate a unique registration ID to prevent collisions when multiple registrations exist\n const registrationId = generateRegistrationId('question');\n\n // Convert questions to ChatContextItem format for the underlying system\n const convertQuestionsToContext = (questions: Question[]): ChatContextItem[] => {\n return questions.map((question, index) => ({\n node: {\n id: `question-${registrationId}-${index}`,\n name: question.title || question.prompt,\n navigable: false,\n selectable: true,\n icon: 'question-circle',\n data: {\n type: 'question',\n prompt: question.prompt,\n title: question.title,\n context: question.context || [],\n },\n },\n occurrences: [],\n }));\n };\n\n // Use the existing providePageContext system\n const setContext = providePageContext(urlPattern, convertQuestionsToContext(initialQuestions));\n\n // Create a wrapper that converts between questions and context\n const setQuestions = (newQuestions: Question[]) => {\n setContext(convertQuestionsToContext(newQuestions));\n };\n\n // Add unregister method\n setQuestions.unregister = setContext.unregister;\n\n return setQuestions;\n}\n\n/**\n * React hook for providing questions that automatically cleans up on unmount.\n * This is the recommended way to use questions in React components.\n *\n * @param urlPattern - URL pattern (string or RegExp) to match against page URLs\n * @param initialQuestions - Initial array of questions to provide when the pattern matches\n * @returns A setter function to update the questions\n */\nexport function useProvideQuestions(\n urlPattern: string | RegExp,\n initialQuestions: Question[] = []\n): (questions: Question[]) => void {\n // Generate a stable unique registration ID per component instance to prevent collisions\n const registrationId = useMemo(\n () => generateRegistrationId('question'),\n [] // Empty deps = generated once per component instance\n );\n\n // Convert questions to ChatContextItem format for the underlying system\n const convertQuestionsToContext = (questions: Question[]): ChatContextItem[] => {\n return questions.map((question, index) => ({\n node: {\n id: `question-${registrationId}-${index}`,\n name: question.title ?? question.prompt,\n navigable: false,\n selectable: true,\n icon: 'question-circle',\n data: {\n type: 'question',\n prompt: question.prompt,\n title: question.title,\n context: question.context || [],\n },\n },\n occurrences: [],\n }));\n };\n\n // Use the existing useProvidePageContext system\n const setContext = useProvidePageContext(urlPattern, convertQuestionsToContext(initialQuestions));\n\n // Create a wrapper that converts between questions and context\n const setQuestions = (newQuestions: Question[]) => {\n setContext(convertQuestionsToContext(newQuestions));\n };\n\n return setQuestions;\n}\n\n/**\n * React hook to get all questions that match the current URL.\n * This filters the page context to only return question-type items.\n *\n * @returns Array of questions from all matching registrations\n */\nexport function useQuestions(): Question[] {\n const pageContext = usePageContext({ allowQuestions: true, allowComponents: false });\n\n // Filter and convert context items to questions\n return convertContextToQuestions(pageContext);\n}\n\nconst convertContextToQuestions = (contextItems: ChatContextItem[]): Question[] => {\n return contextItems\n .filter((item) => item.node.data?.type === 'question')\n .map((item) => ({\n prompt: item.node.data?.prompt || item.node.name,\n title: item.node.data?.title,\n context: item.node.data?.context || [],\n }));\n};\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@grafana/data\");","import { BusEventWithPayload } from '@grafana/data';\nimport { getAppEvents } from '@grafana/runtime';\n\n/**\n * Payload for the InvestigationCreatedEvent\n */\nexport interface InvestigationCreatedPayload {\n /** The ID of the newly created investigation */\n investigationId: string;\n}\n\n/**\n * Event emitted when an investigation is created.\n * External integrations can subscribe to this event to react to new investigations.\n */\nexport class InvestigationCreatedEvent extends BusEventWithPayload<InvestigationCreatedPayload> {\n static type = 'grafana-assistant:investigation-created';\n}\n\n/**\n * Emit an InvestigationCreatedEvent to notify subscribers that a new investigation was created.\n *\n * @param investigationId - The ID of the newly created investigation\n */\nexport function emitInvestigationCreated(investigationId: string): void {\n const event = new InvestigationCreatedEvent({ investigationId });\n getAppEvents().publish(event);\n}\n\n/**\n * Subscribe to investigation created events.\n *\n * @param callback - Function to call when an investigation is created\n * @returns Unsubscribe function to stop listening for events\n *\n * @example\n * ```typescript\n * import { onInvestigationCreated } from '@grafana/assistant';\n *\n * const unsubscribe = onInvestigationCreated((payload) => {\n * console.log('Investigation created:', payload.investigationId);\n * });\n *\n * // Later, when you want to stop listening\n * unsubscribe();\n * ```\n */\nexport function onInvestigationCreated(callback: (payload: InvestigationCreatedPayload) => void): () => void {\n const subscription = getAppEvents().subscribe(InvestigationCreatedEvent, (event) => {\n callback(event.payload);\n });\n\n return () => subscription.unsubscribe();\n}\n","import { PluginExtensionAddedFunctionConfig } from '@grafana/data';\n\nexport type CallbackFunction = () => FunctionNamespace[];\nexport type FunctionImplementation = (...args: any[]) => any;\nexport const CALLBACK_EXTENSION_POINT = 'grafana-assistant-app/callback/v0-alpha';\n\nexport type NamedFunctions = Record<string, FunctionImplementation>;\nexport type FunctionNamespace = {\n namespace: string;\n functions: NamedFunctions;\n};\n\nexport function newFunctionNamespace(namespace: string, functions: NamedFunctions): FunctionNamespace {\n return {\n namespace,\n functions,\n };\n}\n\nexport function getExposeAssistantFunctionsConfig(\n namespaces: FunctionNamespace[]\n): PluginExtensionAddedFunctionConfig<() => FunctionNamespace[]> {\n return {\n title: 'callback',\n targets: [CALLBACK_EXTENSION_POINT],\n fn: () => {\n return namespaces.map((namespace) => {\n return {\n namespace: namespace.namespace,\n functions: namespace.functions,\n };\n });\n },\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"rxjs\");","import { getObservablePluginLinks } from '@grafana/runtime';\nimport { catchError, defer, map, Observable, of, retry, throwError, timer } from 'rxjs';\n\nexport const ASSISTANT_PLUGIN_ID = 'grafana-assistant-app';\nexport const ASSISTANT_PLUGIN_TITLE = 'Grafana Assistant';\n\nconst MAX_RETRY_ATTEMPTS = 10;\nconst INITIAL_RETRY_DELAY = 100; // 100ms\nconst MAX_RETRY_DELAY = 5000; // 5 seconds\n\n/**\n * Check if the assistant is available.\n * @returns An observable that emits true if the assistant is available, false otherwise.\n */\nexport function isAssistantAvailable(): Observable<boolean> {\n // this is to avoid crashing in older Grafana versions\n if (!getObservablePluginLinks) {\n return of(false);\n }\n\n // Use defer to make the call lazy and handle both sync and async errors\n return defer(() => {\n try {\n const links = getObservablePluginLinks({\n extensionPointId: 'grafana/extension-sidebar/v0-alpha',\n });\n return links.pipe(\n map((links: Array<{ pluginId: string; title: string }>) =>\n links.some((link) => link.pluginId === ASSISTANT_PLUGIN_ID && link.title === ASSISTANT_PLUGIN_TITLE)\n )\n );\n } catch (error) {\n // If getObservablePluginLinks throws synchronously, convert to observable error\n return throwError(() => error);\n }\n }).pipe(\n retry({\n count: MAX_RETRY_ATTEMPTS,\n delay: (error, retryCount) => {\n // Check if error indicates Grafana hasn't started yet\n const errorMessage = error?.message?.toLowerCase() || '';\n const isGrafanaNotReady =\n errorMessage.includes('can only be used after') ||\n errorMessage.includes('grafana instance has started') ||\n errorMessage.includes('not started');\n\n // Don't retry for non-race-condition errors\n if (!isGrafanaNotReady) {\n throw error;\n }\n\n // Exponential backoff: delay = INITIAL_RETRY_DELAY * 2^retryCount, capped at MAX_RETRY_DELAY\n const delayMs = Math.min(INITIAL_RETRY_DELAY * Math.pow(2, retryCount - 1), MAX_RETRY_DELAY);\n return timer(delayMs);\n },\n }),\n catchError(() => {\n // After all retries exhausted, return false\n return of(false);\n })\n );\n}\n","import { BusEventBase, BusEventWithPayload } from '@grafana/data';\nimport { getAppEvents, reportInteraction } from '@grafana/runtime';\nimport { ChatContextItem } from './context/types';\nimport { ASSISTANT_PLUGIN_ID, ASSISTANT_PLUGIN_TITLE } from './plugin';\n\ninterface OpenExtensionSidebarPayload {\n props?: Record<string, unknown>;\n pluginId: string;\n componentTitle: string;\n}\n\nclass OpenExtensionSidebarEvent extends BusEventWithPayload<OpenExtensionSidebarPayload> {\n static type = 'open-extension-sidebar';\n}\n\nclass CloseExtensionSidebarEvent extends BusEventBase {\n static type = 'close-extension-sidebar';\n}\n\nclass ToggleExtensionSidebarEvent extends BusEventWithPayload<OpenExtensionSidebarPayload> {\n static type = 'toggle-extension-sidebar';\n}\n\nfunction openExtensionSidebar(pluginId: string, componentTitle: string, props?: Record<string, unknown>) {\n const event = new OpenExtensionSidebarEvent({\n pluginId,\n componentTitle,\n props,\n });\n getAppEvents().publish(event);\n}\n\nfunction closeExtensionSidebar() {\n const event = new CloseExtensionSidebarEvent();\n getAppEvents().publish(event);\n}\n\nfunction toggleExtensionSidebar(pluginId: string, componentTitle: string, props?: Record<string, unknown>) {\n const event = new ToggleExtensionSidebarEvent({\n pluginId,\n componentTitle,\n props,\n });\n getAppEvents().publish(event);\n}\n\nexport type OpenAssistantProps = {\n origin: string;\n\n prompt?: string;\n context?: ChatContextItem[];\n autoSend?: boolean;\n /** Mode to open the assistant in. Built-in modes: 'assistant', 'investigation', 'dashboarding'. Can also be a backend agent ID. */\n mode?: string;\n};\n\n/**\n * Open the Grafana Assistant sidebar with a given initial prompt.\n *\n * @param props - The props to pass to the assistant.\n * @param props.origin - The origin of the request that opened the assistant. This is used to track the source of the request. Should be a structured string using forward slashes, with the first part as a namespace. Examples: 'grafana-datasources/prometheus/query-builder', 'grafana-slo-app/slo-editor-overview', 'grafana/trace-view-analyzer`.\n * @param props.prompt - The initial prompt to display in the assistant.\n * @param props.context - The initial context to display in the assistant. Created with `createContext`.\n * @param props.autoSend - Whether to automatically send the initial prompt. When true, opens a chat and sends the initial prompt right away. When false, opens chat and updates user message without sending it. Defaults to true.\n * @param props.mode - The mode to open the assistant in. Built-in modes: 'assistant', 'investigation', 'dashboarding'. Can also be a backend agent ID. Defaults to 'assistant'.\n */\nexport function openAssistant(props: OpenAssistantProps) {\n reportInteraction('grafana_assistant_app_opened_sidebar', {\n from: props.origin,\n prompt: props.prompt ?? '',\n });\n\n openExtensionSidebar(ASSISTANT_PLUGIN_ID, ASSISTANT_PLUGIN_TITLE, {\n initialPrompt: props.prompt,\n initialContext: props.context,\n initialAutoSend: props.autoSend ?? true,\n origin: props.origin,\n initialMode: props.mode,\n });\n}\n\n/**\n * Close the Grafana Assistant sidebar.\n */\nexport function closeAssistant() {\n closeExtensionSidebar();\n}\n\nexport function toggleAssistant(props: OpenAssistantProps) {\n reportInteraction('grafana_assistant_app_toggled_sidebar', {\n from: props.origin,\n prompt: props.prompt ?? '',\n });\n\n toggleExtensionSidebar(ASSISTANT_PLUGIN_ID, ASSISTANT_PLUGIN_TITLE, {\n initialPrompt: props.prompt,\n initialContext: props.context,\n initialAutoSend: props.autoSend ?? true,\n origin: props.origin,\n initialMode: props.mode,\n });\n}\n","import { useEffect, useState } from 'react';\nimport { isAssistantAvailable } from './plugin';\nimport { closeAssistant, openAssistant, toggleAssistant, OpenAssistantProps } from './sidebar';\n\nexport type AssistantHook = {\n /** Whether the availability check is still in progress. */\n isLoading: boolean;\n isAvailable: boolean;\n openAssistant: ((props: OpenAssistantProps) => void) | undefined;\n closeAssistant: (() => void) | undefined;\n toggleAssistant: ((props: OpenAssistantProps) => void) | undefined;\n};\n/**\n * Hook to check if the assistant is available and return the open, close, and toggle functions.\n * @returns {AssistantHook}\n */\nexport function useAssistant(): AssistantHook {\n const [available, setAvailable] = useState<boolean | undefined>(undefined);\n\n useEffect(() => {\n const sub = isAssistantAvailable().subscribe(setAvailable);\n return () => sub.unsubscribe();\n }, []);\n\n const isAvailable = available ?? false;\n\n return {\n isLoading: available === undefined,\n isAvailable,\n openAssistant: isAvailable ? openAssistant : undefined,\n closeAssistant: isAvailable ? closeAssistant : undefined,\n toggleAssistant: isAvailable ? toggleAssistant : undefined,\n };\n}\n","const __WEBPACK_NAMESPACE_OBJECT__ = require(\"@grafana/ui\");","var isDevelopment = false;\n\n/*\n\nBased off glamor's StyleSheet, thanks Sunil ❤️\n\nhigh performance StyleSheet for css-in-js systems\n\n- uses multiple style tags behind the scenes for millions of rules\n- uses `insertRule` for appending in production for *much* faster performance\n\n// usage\n\nimport { StyleSheet } from '@emotion/sheet'\n\nlet styleSheet = new StyleSheet({ key: '', container: document.head })\n\nstyleSheet.insert('#box { border: 1px solid red; }')\n- appends a css rule into the stylesheet\n\nstyleSheet.flush()\n- empties the stylesheet of all its contents\n\n*/\n\nfunction sheetForTag(tag) {\n if (tag.sheet) {\n return tag.sheet;\n } // this weirdness brought to you by firefox\n\n /* istanbul ignore next */\n\n\n for (var i = 0; i < document.styleSheets.length; i++) {\n if (document.styleSheets[i].ownerNode === tag) {\n return document.styleSheets[i];\n }\n } // this function should always return with a value\n // TS can't understand it though so we make it stop complaining here\n\n\n return undefined;\n}\n\nfunction createStyleElement(options) {\n var tag = document.createElement('style');\n tag.setAttribute('data-emotion', options.key);\n\n if (options.nonce !== undefined) {\n tag.setAttribute('nonce', options.nonce);\n }\n\n tag.appendChild(document.createTextNode(''));\n tag.setAttribute('data-s', '');\n return tag;\n}\n\nvar StyleSheet = /*#__PURE__*/function () {\n // Using Node instead of HTMLElement since container may be a ShadowRoot\n function StyleSheet(options) {\n var _this = this;\n\n this._insertTag = function (tag) {\n var before;\n\n if (_this.tags.length === 0) {\n if (_this.insertionPoint) {\n before = _this.insertionPoint.nextSibling;\n } else if (_this.prepend) {\n before = _this.container.firstChild;\n } else {\n before = _this.before;\n }\n } else {\n before = _this.tags[_this.tags.length - 1].nextSibling;\n }\n\n _this.container.insertBefore(tag, before);\n\n _this.tags.push(tag);\n };\n\n this.isSpeedy = options.speedy === undefined ? !isDevelopment : options.speedy;\n this.tags = [];\n this.ctr = 0;\n this.nonce = options.nonce; // key is the value of the data-emotion attribute, it's used to identify different sheets\n\n this.key = options.key;\n this.container = options.container;\n this.prepend = options.prepend;\n this.insertionPoint = options.insertionPoint;\n this.before = null;\n }\n\n var _proto = StyleSheet.prototype;\n\n _proto.hydrate = function hydrate(nodes) {\n nodes.forEach(this._insertTag);\n };\n\n _proto.insert = function insert(rule) {\n // the max length is how many rules we have per style tag, it's 65000 in speedy mode\n // it's 1 in dev because we insert source maps that map a single rule to a location\n // and you can only have one source map per style tag\n if (this.ctr % (this.isSpeedy ? 65000 : 1) === 0) {\n this._insertTag(createStyleElement(this));\n }\n\n var tag = this.tags[this.tags.length - 1];\n\n if (this.isSpeedy) {\n var sheet = sheetForTag(tag);\n\n try {\n // this is the ultrafast version, works across browsers\n // the big drawback is that the css won't be editable in devtools\n sheet.insertRule(rule, sheet.cssRules.length);\n } catch (e) {\n }\n } else {\n tag.appendChild(document.createTextNode(rule));\n }\n\n this.ctr++;\n };\n\n _proto.flush = function flush() {\n this.tags.forEach(function (tag) {\n var _tag$parentNode;\n\n return (_tag$parentNode = tag.parentNode) == null ? void 0 : _tag$parentNode.removeChild(tag);\n });\n this.tags = [];\n this.ctr = 0;\n };\n\n return StyleSheet;\n}();\n\nexport { StyleSheet };\n","/**\n * @param {number}\n * @return {number}\n */\nexport var abs = Math.abs\n\n/**\n * @param {number}\n * @return {string}\n */\nexport var from = String.fromCharCode\n\n/**\n * @param {object}\n * @return {object}\n */\nexport var assign = Object.assign\n\n/**\n * @param {string} value\n * @param {number} length\n * @return {number}\n */\nexport function hash (value, length) {\n\treturn charat(value, 0) ^ 45 ? (((((((length << 2) ^ charat(value, 0)) << 2) ^ charat(value, 1)) << 2) ^ charat(value, 2)) << 2) ^ charat(value, 3) : 0\n}\n\n/**\n * @param {string} value\n * @return {string}\n */\nexport function trim (value) {\n\treturn value.trim()\n}\n\n/**\n * @param {string} value\n * @param {RegExp} pattern\n * @return {string?}\n */\nexport function match (value, pattern) {\n\treturn (value = pattern.exec(value)) ? value[0] : value\n}\n\n/**\n * @param {string} value\n * @param {(string|RegExp)} pattern\n * @param {string} replacement\n * @return {string}\n */\nexport function replace (value, pattern, replacement) {\n\treturn value.replace(pattern, replacement)\n}\n\n/**\n * @param {string} value\n * @param {string} search\n * @return {number}\n */\nexport function indexof (value, search) {\n\treturn value.indexOf(search)\n}\n\n/**\n * @param {string} value\n * @param {number} index\n * @return {number}\n */\nexport function charat (value, index) {\n\treturn value.charCodeAt(index) | 0\n}\n\n/**\n * @param {string} value\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function substr (value, begin, end) {\n\treturn value.slice(begin, end)\n}\n\n/**\n * @param {string} value\n * @return {number}\n */\nexport function strlen (value) {\n\treturn value.length\n}\n\n/**\n * @param {any[]} value\n * @return {number}\n */\nexport function sizeof (value) {\n\treturn value.length\n}\n\n/**\n * @param {any} value\n * @param {any[]} array\n * @return {any}\n */\nexport function append (value, array) {\n\treturn array.push(value), value\n}\n\n/**\n * @param {string[]} array\n * @param {function} callback\n * @return {string}\n */\nexport function combine (array, callback) {\n\treturn array.map(callback).join('')\n}\n","import {from, trim, charat, strlen, substr, append, assign} from './Utility.js'\n\nexport var line = 1\nexport var column = 1\nexport var length = 0\nexport var position = 0\nexport var character = 0\nexport var characters = ''\n\n/**\n * @param {string} value\n * @param {object | null} root\n * @param {object | null} parent\n * @param {string} type\n * @param {string[] | string} props\n * @param {object[] | string} children\n * @param {number} length\n */\nexport function node (value, root, parent, type, props, children, length) {\n\treturn {value: value, root: root, parent: parent, type: type, props: props, children: children, line: line, column: column, length: length, return: ''}\n}\n\n/**\n * @param {object} root\n * @param {object} props\n * @return {object}\n */\nexport function copy (root, props) {\n\treturn assign(node('', null, null, '', null, null, 0), root, {length: -root.length}, props)\n}\n\n/**\n * @return {number}\n */\nexport function char () {\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function prev () {\n\tcharacter = position > 0 ? charat(characters, --position) : 0\n\n\tif (column--, character === 10)\n\t\tcolumn = 1, line--\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function next () {\n\tcharacter = position < length ? charat(characters, position++) : 0\n\n\tif (column++, character === 10)\n\t\tcolumn = 1, line++\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function peek () {\n\treturn charat(characters, position)\n}\n\n/**\n * @return {number}\n */\nexport function caret () {\n\treturn position\n}\n\n/**\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function slice (begin, end) {\n\treturn substr(characters, begin, end)\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function token (type) {\n\tswitch (type) {\n\t\t// \\0 \\t \\n \\r \\s whitespace token\n\t\tcase 0: case 9: case 10: case 13: case 32:\n\t\t\treturn 5\n\t\t// ! + , / > @ ~ isolate token\n\t\tcase 33: case 43: case 44: case 47: case 62: case 64: case 126:\n\t\t// ; { } breakpoint token\n\t\tcase 59: case 123: case 125:\n\t\t\treturn 4\n\t\t// : accompanied token\n\t\tcase 58:\n\t\t\treturn 3\n\t\t// \" ' ( [ opening delimit token\n\t\tcase 34: case 39: case 40: case 91:\n\t\t\treturn 2\n\t\t// ) ] closing delimit token\n\t\tcase 41: case 93:\n\t\t\treturn 1\n\t}\n\n\treturn 0\n}\n\n/**\n * @param {string} value\n * @return {any[]}\n */\nexport function alloc (value) {\n\treturn line = column = 1, length = strlen(characters = value), position = 0, []\n}\n\n/**\n * @param {any} value\n * @return {any}\n */\nexport function dealloc (value) {\n\treturn characters = '', value\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function delimit (type) {\n\treturn trim(slice(position - 1, delimiter(type === 91 ? type + 2 : type === 40 ? type + 1 : type)))\n}\n\n/**\n * @param {string} value\n * @return {string[]}\n */\nexport function tokenize (value) {\n\treturn dealloc(tokenizer(alloc(value)))\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function whitespace (type) {\n\twhile (character = peek())\n\t\tif (character < 33)\n\t\t\tnext()\n\t\telse\n\t\t\tbreak\n\n\treturn token(type) > 2 || token(character) > 3 ? '' : ' '\n}\n\n/**\n * @param {string[]} children\n * @return {string[]}\n */\nexport function tokenizer (children) {\n\twhile (next())\n\t\tswitch (token(character)) {\n\t\t\tcase 0: append(identifier(position - 1), children)\n\t\t\t\tbreak\n\t\t\tcase 2: append(delimit(character), children)\n\t\t\t\tbreak\n\t\t\tdefault: append(from(character), children)\n\t\t}\n\n\treturn children\n}\n\n/**\n * @param {number} index\n * @param {number} count\n * @return {string}\n */\nexport function escaping (index, count) {\n\twhile (--count && next())\n\t\t// not 0-9 A-F a-f\n\t\tif (character < 48 || character > 102 || (character > 57 && character < 65) || (character > 70 && character < 97))\n\t\t\tbreak\n\n\treturn slice(index, caret() + (count < 6 && peek() == 32 && next() == 32))\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function delimiter (type) {\n\twhile (next())\n\t\tswitch (character) {\n\t\t\t// ] ) \" '\n\t\t\tcase type:\n\t\t\t\treturn position\n\t\t\t// \" '\n\t\t\tcase 34: case 39:\n\t\t\t\tif (type !== 34 && type !== 39)\n\t\t\t\t\tdelimiter(character)\n\t\t\t\tbreak\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (type === 41)\n\t\t\t\t\tdelimiter(type)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tnext()\n\t\t\t\tbreak\n\t\t}\n\n\treturn position\n}\n\n/**\n * @param {number} type\n * @param {number} index\n * @return {number}\n */\nexport function commenter (type, index) {\n\twhile (next())\n\t\t// //\n\t\tif (type + character === 47 + 10)\n\t\t\tbreak\n\t\t// /*\n\t\telse if (type + character === 42 + 42 && peek() === 47)\n\t\t\tbreak\n\n\treturn '/*' + slice(index, position - 1) + '*' + from(type === 47 ? type : next())\n}\n\n/**\n * @param {number} index\n * @return {string}\n */\nexport function identifier (index) {\n\twhile (!token(peek()))\n\t\tnext()\n\n\treturn slice(index, position)\n}\n","export var MS = '-ms-'\nexport var MOZ = '-moz-'\nexport var WEBKIT = '-webkit-'\n\nexport var COMMENT = 'comm'\nexport var RULESET = 'rule'\nexport var DECLARATION = 'decl'\n\nexport var PAGE = '@page'\nexport var MEDIA = '@media'\nexport var IMPORT = '@import'\nexport var CHARSET = '@charset'\nexport var VIEWPORT = '@viewport'\nexport var SUPPORTS = '@supports'\nexport var DOCUMENT = '@document'\nexport var NAMESPACE = '@namespace'\nexport var KEYFRAMES = '@keyframes'\nexport var FONT_FACE = '@font-face'\nexport var COUNTER_STYLE = '@counter-style'\nexport var FONT_FEATURE_VALUES = '@font-feature-values'\nexport var LAYER = '@layer'\n","import {IMPORT, LAYER, COMMENT, RULESET, DECLARATION, KEYFRAMES} from './Enum.js'\nimport {strlen, sizeof} from './Utility.js'\n\n/**\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function serialize (children, callback) {\n\tvar output = ''\n\tvar length = sizeof(children)\n\n\tfor (var i = 0; i < length; i++)\n\t\toutput += callback(children[i], i, children, callback) || ''\n\n\treturn output\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function stringify (element, index, children, callback) {\n\tswitch (element.type) {\n\t\tcase LAYER: if (element.children.length) break\n\t\tcase IMPORT: case DECLARATION: return element.return = element.return || element.value\n\t\tcase COMMENT: return ''\n\t\tcase KEYFRAMES: return element.return = element.value + '{' + serialize(element.children, callback) + '}'\n\t\tcase RULESET: element.value = element.props.join(',')\n\t}\n\n\treturn strlen(children = serialize(element.children, callback)) ? element.return = element.value + '{' + children + '}' : ''\n}\n","import {COMMENT, RULESET, DECLARATION} from './Enum.js'\nimport {abs, charat, trim, from, sizeof, strlen, substr, append, replace, indexof} from './Utility.js'\nimport {node, char, prev, next, peek, caret, alloc, dealloc, delimit, whitespace, escaping, identifier, commenter} from './Tokenizer.js'\n\n/**\n * @param {string} value\n * @return {object[]}\n */\nexport function compile (value) {\n\treturn dealloc(parse('', null, null, null, [''], value = alloc(value), 0, [0], value))\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {string[]} rule\n * @param {string[]} rules\n * @param {string[]} rulesets\n * @param {number[]} pseudo\n * @param {number[]} points\n * @param {string[]} declarations\n * @return {object}\n */\nexport function parse (value, root, parent, rule, rules, rulesets, pseudo, points, declarations) {\n\tvar index = 0\n\tvar offset = 0\n\tvar length = pseudo\n\tvar atrule = 0\n\tvar property = 0\n\tvar previous = 0\n\tvar variable = 1\n\tvar scanning = 1\n\tvar ampersand = 1\n\tvar character = 0\n\tvar type = ''\n\tvar props = rules\n\tvar children = rulesets\n\tvar reference = rule\n\tvar characters = type\n\n\twhile (scanning)\n\t\tswitch (previous = character, character = next()) {\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (previous != 108 && charat(characters, length - 1) == 58) {\n\t\t\t\t\tif (indexof(characters += replace(delimit(character), '&', '&\\f'), '&\\f') != -1)\n\t\t\t\t\t\tampersand = -1\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t// \" ' [\n\t\t\tcase 34: case 39: case 91:\n\t\t\t\tcharacters += delimit(character)\n\t\t\t\tbreak\n\t\t\t// \\t \\n \\r \\s\n\t\t\tcase 9: case 10: case 13: case 32:\n\t\t\t\tcharacters += whitespace(previous)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tcharacters += escaping(caret() - 1, 7)\n\t\t\t\tcontinue\n\t\t\t// /\n\t\t\tcase 47:\n\t\t\t\tswitch (peek()) {\n\t\t\t\t\tcase 42: case 47:\n\t\t\t\t\t\tappend(comment(commenter(next(), caret()), root, parent), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcharacters += '/'\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t// {\n\t\t\tcase 123 * variable:\n\t\t\t\tpoints[index++] = strlen(characters) * ampersand\n\t\t\t// } ; \\0\n\t\t\tcase 125 * variable: case 59: case 0:\n\t\t\t\tswitch (character) {\n\t\t\t\t\t// \\0 }\n\t\t\t\t\tcase 0: case 125: scanning = 0\n\t\t\t\t\t// ;\n\t\t\t\t\tcase 59 + offset: if (ampersand == -1) characters = replace(characters, /\\f/g, '')\n\t\t\t\t\t\tif (property > 0 && (strlen(characters) - length))\n\t\t\t\t\t\t\tappend(property > 32 ? declaration(characters + ';', rule, parent, length - 1) : declaration(replace(characters, ' ', '') + ';', rule, parent, length - 2), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @ ;\n\t\t\t\t\tcase 59: characters += ';'\n\t\t\t\t\t// { rule/at-rule\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tappend(reference = ruleset(characters, root, parent, index, offset, rules, points, type, props = [], children = [], length), rulesets)\n\n\t\t\t\t\t\tif (character === 123)\n\t\t\t\t\t\t\tif (offset === 0)\n\t\t\t\t\t\t\t\tparse(characters, root, reference, reference, props, rulesets, length, points, children)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tswitch (atrule === 99 && charat(characters, 3) === 110 ? 100 : atrule) {\n\t\t\t\t\t\t\t\t\t// d l m s\n\t\t\t\t\t\t\t\t\tcase 100: case 108: case 109: case 115:\n\t\t\t\t\t\t\t\t\t\tparse(value, reference, reference, rule && append(ruleset(value, reference, reference, 0, 0, rules, points, type, rules, props = [], length), children), rules, children, length, points, rule ? props : children)\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tparse(characters, reference, reference, reference, [''], children, 0, points, children)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = offset = property = 0, variable = ampersand = 1, type = characters = '', length = pseudo\n\t\t\t\tbreak\n\t\t\t// :\n\t\t\tcase 58:\n\t\t\t\tlength = 1 + strlen(characters), property = previous\n\t\t\tdefault:\n\t\t\t\tif (variable < 1)\n\t\t\t\t\tif (character == 123)\n\t\t\t\t\t\t--variable\n\t\t\t\t\telse if (character == 125 && variable++ == 0 && prev() == 125)\n\t\t\t\t\t\tcontinue\n\n\t\t\t\tswitch (characters += from(character), character * variable) {\n\t\t\t\t\t// &\n\t\t\t\t\tcase 38:\n\t\t\t\t\t\tampersand = offset > 0 ? 1 : (characters += '\\f', -1)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// ,\n\t\t\t\t\tcase 44:\n\t\t\t\t\t\tpoints[index++] = (strlen(characters) - 1) * ampersand, ampersand = 1\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @\n\t\t\t\t\tcase 64:\n\t\t\t\t\t\t// -\n\t\t\t\t\t\tif (peek() === 45)\n\t\t\t\t\t\t\tcharacters += delimit(next())\n\n\t\t\t\t\t\tatrule = peek(), offset = length = strlen(type = characters += identifier(caret())), character++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// -\n\t\t\t\t\tcase 45:\n\t\t\t\t\t\tif (previous === 45 && strlen(characters) == 2)\n\t\t\t\t\t\t\tvariable = 0\n\t\t\t\t}\n\t\t}\n\n\treturn rulesets\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} index\n * @param {number} offset\n * @param {string[]} rules\n * @param {number[]} points\n * @param {string} type\n * @param {string[]} props\n * @param {string[]} children\n * @param {number} length\n * @return {object}\n */\nexport function ruleset (value, root, parent, index, offset, rules, points, type, props, children, length) {\n\tvar post = offset - 1\n\tvar rule = offset === 0 ? rules : ['']\n\tvar size = sizeof(rule)\n\n\tfor (var i = 0, j = 0, k = 0; i < index; ++i)\n\t\tfor (var x = 0, y = substr(value, post + 1, post = abs(j = points[i])), z = value; x < size; ++x)\n\t\t\tif (z = trim(j > 0 ? rule[x] + ' ' + y : replace(y, /&\\f/g, rule[x])))\n\t\t\t\tprops[k++] = z\n\n\treturn node(value, root, parent, offset === 0 ? RULESET : type, props, children, length)\n}\n\n/**\n * @param {number} value\n * @param {object} root\n * @param {object?} parent\n * @return {object}\n */\nexport function comment (value, root, parent) {\n\treturn node(value, root, parent, COMMENT, from(char()), substr(value, 2, -2), 0)\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} length\n * @return {object}\n */\nexport function declaration (value, root, parent, length) {\n\treturn node(value, root, parent, DECLARATION, substr(value, 0, length), substr(value, length + 1, -1), length)\n}\n","import { StyleSheet } from '@emotion/sheet';\nimport { dealloc, alloc, next, token, from, peek, delimit, slice, position, RULESET, combine, match, serialize, copy, replace, WEBKIT, MOZ, MS, KEYFRAMES, DECLARATION, hash, charat, strlen, indexof, stringify, rulesheet, middleware, compile } from 'stylis';\nimport '@emotion/weak-memoize';\nimport '@emotion/memoize';\n\nvar identifierWithPointTracking = function identifierWithPointTracking(begin, points, index) {\n var previous = 0;\n var character = 0;\n\n while (true) {\n previous = character;\n character = peek(); // &\\f\n\n if (previous === 38 && character === 12) {\n points[index] = 1;\n }\n\n if (token(character)) {\n break;\n }\n\n next();\n }\n\n return slice(begin, position);\n};\n\nvar toRules = function toRules(parsed, points) {\n // pretend we've started with a comma\n var index = -1;\n var character = 44;\n\n do {\n switch (token(character)) {\n case 0:\n // &\\f\n if (character === 38 && peek() === 12) {\n // this is not 100% correct, we don't account for literal sequences here - like for example quoted strings\n // stylis inserts \\f after & to know when & where it should replace this sequence with the context selector\n // and when it should just concatenate the outer and inner selectors\n // it's very unlikely for this sequence to actually appear in a different context, so we just leverage this fact here\n points[index] = 1;\n }\n\n parsed[index] += identifierWithPointTracking(position - 1, points, index);\n break;\n\n case 2:\n parsed[index] += delimit(character);\n break;\n\n case 4:\n // comma\n if (character === 44) {\n // colon\n parsed[++index] = peek() === 58 ? '&\\f' : '';\n points[index] = parsed[index].length;\n break;\n }\n\n // fallthrough\n\n default:\n parsed[index] += from(character);\n }\n } while (character = next());\n\n return parsed;\n};\n\nvar getRules = function getRules(value, points) {\n return dealloc(toRules(alloc(value), points));\n}; // WeakSet would be more appropriate, but only WeakMap is supported in IE11\n\n\nvar fixedElements = /* #__PURE__ */new WeakMap();\nvar compat = function compat(element) {\n if (element.type !== 'rule' || !element.parent || // positive .length indicates that this rule contains pseudo\n // negative .length indicates that this rule has been already prefixed\n element.length < 1) {\n return;\n }\n\n var value = element.value;\n var parent = element.parent;\n var isImplicitRule = element.column === parent.column && element.line === parent.line;\n\n while (parent.type !== 'rule') {\n parent = parent.parent;\n if (!parent) return;\n } // short-circuit for the simplest case\n\n\n if (element.props.length === 1 && value.charCodeAt(0) !== 58\n /* colon */\n && !fixedElements.get(parent)) {\n return;\n } // if this is an implicitly inserted rule (the one eagerly inserted at the each new nested level)\n // then the props has already been manipulated beforehand as they that array is shared between it and its \"rule parent\"\n\n\n if (isImplicitRule) {\n return;\n }\n\n fixedElements.set(element, true);\n var points = [];\n var rules = getRules(value, points);\n var parentRules = parent.props;\n\n for (var i = 0, k = 0; i < rules.length; i++) {\n for (var j = 0; j < parentRules.length; j++, k++) {\n element.props[k] = points[i] ? rules[i].replace(/&\\f/g, parentRules[j]) : parentRules[j] + \" \" + rules[i];\n }\n }\n};\nvar removeLabel = function removeLabel(element) {\n if (element.type === 'decl') {\n var value = element.value;\n\n if ( // charcode for l\n value.charCodeAt(0) === 108 && // charcode for b\n value.charCodeAt(2) === 98) {\n // this ignores label\n element[\"return\"] = '';\n element.value = '';\n }\n }\n};\n\n/* eslint-disable no-fallthrough */\n\nfunction prefix(value, length) {\n switch (hash(value, length)) {\n // color-adjust\n case 5103:\n return WEBKIT + 'print-' + value + value;\n // animation, animation-(delay|direction|duration|fill-mode|iteration-count|name|play-state|timing-function)\n\n case 5737:\n case 4201:\n case 3177:\n case 3433:\n case 1641:\n case 4457:\n case 2921: // text-decoration, filter, clip-path, backface-visibility, column, box-decoration-break\n\n case 5572:\n case 6356:\n case 5844:\n case 3191:\n case 6645:\n case 3005: // mask, mask-image, mask-(mode|clip|size), mask-(repeat|origin), mask-position, mask-composite,\n\n case 6391:\n case 5879:\n case 5623:\n case 6135:\n case 4599:\n case 4855: // background-clip, columns, column-(count|fill|gap|rule|rule-color|rule-style|rule-width|span|width)\n\n case 4215:\n case 6389:\n case 5109:\n case 5365:\n case 5621:\n case 3829:\n return WEBKIT + value + value;\n // appearance, user-select, transform, hyphens, text-size-adjust\n\n case 5349:\n case 4246:\n case 4810:\n case 6968:\n case 2756:\n return WEBKIT + value + MOZ + value + MS + value + value;\n // flex, flex-direction\n\n case 6828:\n case 4268:\n return WEBKIT + value + MS + value + value;\n // order\n\n case 6165:\n return WEBKIT + value + MS + 'flex-' + value + value;\n // align-items\n\n case 5187:\n return WEBKIT + value + replace(value, /(\\w+).+(:[^]+)/, WEBKIT + 'box-$1$2' + MS + 'flex-$1$2') + value;\n // align-self\n\n case 5443:\n return WEBKIT + value + MS + 'flex-item-' + replace(value, /flex-|-self/, '') + value;\n // align-content\n\n case 4675:\n return WEBKIT + value + MS + 'flex-line-pack' + replace(value, /align-content|flex-|-self/, '') + value;\n // flex-shrink\n\n case 5548:\n return WEBKIT + value + MS + replace(value, 'shrink', 'negative') + value;\n // flex-basis\n\n case 5292:\n return WEBKIT + value + MS + replace(value, 'basis', 'preferred-size') + value;\n // flex-grow\n\n case 6060:\n return WEBKIT + 'box-' + replace(value, '-grow', '') + WEBKIT + value + MS + replace(value, 'grow', 'positive') + value;\n // transition\n\n case 4554:\n return WEBKIT + replace(value, /([^-])(transform)/g, '$1' + WEBKIT + '$2') + value;\n // cursor\n\n case 6187:\n return replace(replace(replace(value, /(zoom-|grab)/, WEBKIT + '$1'), /(image-set)/, WEBKIT + '$1'), value, '') + value;\n // background, background-image\n\n case 5495:\n case 3959:\n return replace(value, /(image-set\\([^]*)/, WEBKIT + '$1' + '$`$1');\n // justify-content\n\n case 4968:\n return replace(replace(value, /(.+:)(flex-)?(.*)/, WEBKIT + 'box-pack:$3' + MS + 'flex-pack:$3'), /s.+-b[^;]+/, 'justify') + WEBKIT + value + value;\n // (margin|padding)-inline-(start|end)\n\n case 4095:\n case 3583:\n case 4068:\n case 2532:\n return replace(value, /(.+)-inline(.+)/, WEBKIT + '$1$2') + value;\n // (min|max)?(width|height|inline-size|block-size)\n\n case 8116:\n case 7059:\n case 5753:\n case 5535:\n case 5445:\n case 5701:\n case 4933:\n case 4677:\n case 5533:\n case 5789:\n case 5021:\n case 4765:\n // stretch, max-content, min-content, fill-available\n if (strlen(value) - 1 - length > 6) switch (charat(value, length + 1)) {\n // (m)ax-content, (m)in-content\n case 109:\n // -\n if (charat(value, length + 4) !== 45) break;\n // (f)ill-available, (f)it-content\n\n case 102:\n return replace(value, /(.+:)(.+)-([^]+)/, '$1' + WEBKIT + '$2-$3' + '$1' + MOZ + (charat(value, length + 3) == 108 ? '$3' : '$2-$3')) + value;\n // (s)tretch\n\n case 115:\n return ~indexof(value, 'stretch') ? prefix(replace(value, 'stretch', 'fill-available'), length) + value : value;\n }\n break;\n // position: sticky\n\n case 4949:\n // (s)ticky?\n if (charat(value, length + 1) !== 115) break;\n // display: (flex|inline-flex)\n\n case 6444:\n switch (charat(value, strlen(value) - 3 - (~indexof(value, '!important') && 10))) {\n // stic(k)y\n case 107:\n return replace(value, ':', ':' + WEBKIT) + value;\n // (inline-)?fl(e)x\n\n case 101:\n return replace(value, /(.+:)([^;!]+)(;|!.+)?/, '$1' + WEBKIT + (charat(value, 14) === 45 ? 'inline-' : '') + 'box$3' + '$1' + WEBKIT + '$2$3' + '$1' + MS + '$2box$3') + value;\n }\n\n break;\n // writing-mode\n\n case 5936:\n switch (charat(value, length + 11)) {\n // vertical-l(r)\n case 114:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'tb') + value;\n // vertical-r(l)\n\n case 108:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'tb-rl') + value;\n // horizontal(-)tb\n\n case 45:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'lr') + value;\n }\n\n return WEBKIT + value + MS + value + value;\n }\n\n return value;\n}\n\nvar prefixer = function prefixer(element, index, children, callback) {\n if (element.length > -1) if (!element[\"return\"]) switch (element.type) {\n case DECLARATION:\n element[\"return\"] = prefix(element.value, element.length);\n break;\n\n case KEYFRAMES:\n return serialize([copy(element, {\n value: replace(element.value, '@', '@' + WEBKIT)\n })], callback);\n\n case RULESET:\n if (element.length) return combine(element.props, function (value) {\n switch (match(value, /(::plac\\w+|:read-\\w+)/)) {\n // :read-(only|write)\n case ':read-only':\n case ':read-write':\n return serialize([copy(element, {\n props: [replace(value, /:(read-\\w+)/, ':' + MOZ + '$1')]\n })], callback);\n // :placeholder\n\n case '::placeholder':\n return serialize([copy(element, {\n props: [replace(value, /:(plac\\w+)/, ':' + WEBKIT + 'input-$1')]\n }), copy(element, {\n props: [replace(value, /:(plac\\w+)/, ':' + MOZ + '$1')]\n }), copy(element, {\n props: [replace(value, /:(plac\\w+)/, MS + 'input-$1')]\n })], callback);\n }\n\n return '';\n });\n }\n};\n\nvar defaultStylisPlugins = [prefixer];\n\nvar createCache = function createCache(options) {\n var key = options.key;\n\n if (key === 'css') {\n var ssrStyles = document.querySelectorAll(\"style[data-emotion]:not([data-s])\"); // get SSRed styles out of the way of React's hydration\n // document.head is a safe place to move them to(though note document.head is not necessarily the last place they will be)\n // note this very very intentionally targets all style elements regardless of the key to ensure\n // that creating a cache works inside of render of a React component\n\n Array.prototype.forEach.call(ssrStyles, function (node) {\n // we want to only move elements which have a space in the data-emotion attribute value\n // because that indicates that it is an Emotion 11 server-side rendered style elements\n // while we will already ignore Emotion 11 client-side inserted styles because of the :not([data-s]) part in the selector\n // Emotion 10 client-side inserted styles did not have data-s (but importantly did not have a space in their data-emotion attributes)\n // so checking for the space ensures that loading Emotion 11 after Emotion 10 has inserted some styles\n // will not result in the Emotion 10 styles being destroyed\n var dataEmotionAttribute = node.getAttribute('data-emotion');\n\n if (dataEmotionAttribute.indexOf(' ') === -1) {\n return;\n }\n\n document.head.appendChild(node);\n node.setAttribute('data-s', '');\n });\n }\n\n var stylisPlugins = options.stylisPlugins || defaultStylisPlugins;\n\n var inserted = {};\n var container;\n var nodesToHydrate = [];\n\n {\n container = options.container || document.head;\n Array.prototype.forEach.call( // this means we will ignore elements which don't have a space in them which\n // means that the style elements we're looking at are only Emotion 11 server-rendered style elements\n document.querySelectorAll(\"style[data-emotion^=\\\"\" + key + \" \\\"]\"), function (node) {\n var attrib = node.getAttribute(\"data-emotion\").split(' ');\n\n for (var i = 1; i < attrib.length; i++) {\n inserted[attrib[i]] = true;\n }\n\n nodesToHydrate.push(node);\n });\n }\n\n var _insert;\n\n var omnipresentPlugins = [compat, removeLabel];\n\n {\n var currentSheet;\n var finalizingPlugins = [stringify, rulesheet(function (rule) {\n currentSheet.insert(rule);\n })];\n var serializer = middleware(omnipresentPlugins.concat(stylisPlugins, finalizingPlugins));\n\n var stylis = function stylis(styles) {\n return serialize(compile(styles), serializer);\n };\n\n _insert = function insert(selector, serialized, sheet, shouldCache) {\n currentSheet = sheet;\n\n stylis(selector ? selector + \"{\" + serialized.styles + \"}\" : serialized.styles);\n\n if (shouldCache) {\n cache.inserted[serialized.name] = true;\n }\n };\n }\n\n var cache = {\n key: key,\n sheet: new StyleSheet({\n key: key,\n container: container,\n nonce: options.nonce,\n speedy: options.speedy,\n prepend: options.prepend,\n insertionPoint: options.insertionPoint\n }),\n nonce: options.nonce,\n inserted: inserted,\n registered: {},\n insert: _insert\n };\n cache.sheet.hydrate(nodesToHydrate);\n return cache;\n};\n\nexport { createCache as default };\n","var unitlessKeys = {\n animationIterationCount: 1,\n aspectRatio: 1,\n borderImageOutset: 1,\n borderImageSlice: 1,\n borderImageWidth: 1,\n boxFlex: 1,\n boxFlexGroup: 1,\n boxOrdinalGroup: 1,\n columnCount: 1,\n columns: 1,\n flex: 1,\n flexGrow: 1,\n flexPositive: 1,\n flexShrink: 1,\n flexNegative: 1,\n flexOrder: 1,\n gridRow: 1,\n gridRowEnd: 1,\n gridRowSpan: 1,\n gridRowStart: 1,\n gridColumn: 1,\n gridColumnEnd: 1,\n gridColumnSpan: 1,\n gridColumnStart: 1,\n msGridRow: 1,\n msGridRowSpan: 1,\n msGridColumn: 1,\n msGridColumnSpan: 1,\n fontWeight: 1,\n lineHeight: 1,\n opacity: 1,\n order: 1,\n orphans: 1,\n scale: 1,\n tabSize: 1,\n widows: 1,\n zIndex: 1,\n zoom: 1,\n WebkitLineClamp: 1,\n // SVG-related properties\n fillOpacity: 1,\n floodOpacity: 1,\n stopOpacity: 1,\n strokeDasharray: 1,\n strokeDashoffset: 1,\n strokeMiterlimit: 1,\n strokeOpacity: 1,\n strokeWidth: 1\n};\n\nexport { unitlessKeys as default };\n","function memoize(fn) {\n var cache = Object.create(null);\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport { memoize as default };\n","import hashString from '@emotion/hash';\nimport unitless from '@emotion/unitless';\nimport memoize from '@emotion/memoize';\n\nvar isDevelopment = false;\n\nvar hyphenateRegex = /[A-Z]|^ms/g;\nvar animationRegex = /_EMO_([^_]+?)_([^]*?)_EMO_/g;\n\nvar isCustomProperty = function isCustomProperty(property) {\n return property.charCodeAt(1) === 45;\n};\n\nvar isProcessableValue = function isProcessableValue(value) {\n return value != null && typeof value !== 'boolean';\n};\n\nvar processStyleName = /* #__PURE__ */memoize(function (styleName) {\n return isCustomProperty(styleName) ? styleName : styleName.replace(hyphenateRegex, '-$&').toLowerCase();\n});\n\nvar processStyleValue = function processStyleValue(key, value) {\n switch (key) {\n case 'animation':\n case 'animationName':\n {\n if (typeof value === 'string') {\n return value.replace(animationRegex, function (match, p1, p2) {\n cursor = {\n name: p1,\n styles: p2,\n next: cursor\n };\n return p1;\n });\n }\n }\n }\n\n if (unitless[key] !== 1 && !isCustomProperty(key) && typeof value === 'number' && value !== 0) {\n return value + 'px';\n }\n\n return value;\n};\n\nvar noComponentSelectorMessage = 'Component selectors can only be used in conjunction with ' + '@emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware ' + 'compiler transform.';\n\nfunction handleInterpolation(mergedProps, registered, interpolation) {\n if (interpolation == null) {\n return '';\n }\n\n var componentSelector = interpolation;\n\n if (componentSelector.__emotion_styles !== undefined) {\n\n return componentSelector;\n }\n\n switch (typeof interpolation) {\n case 'boolean':\n {\n return '';\n }\n\n case 'object':\n {\n var keyframes = interpolation;\n\n if (keyframes.anim === 1) {\n cursor = {\n name: keyframes.name,\n styles: keyframes.styles,\n next: cursor\n };\n return keyframes.name;\n }\n\n var serializedStyles = interpolation;\n\n if (serializedStyles.styles !== undefined) {\n var next = serializedStyles.next;\n\n if (next !== undefined) {\n // not the most efficient thing ever but this is a pretty rare case\n // and there will be very few iterations of this generally\n while (next !== undefined) {\n cursor = {\n name: next.name,\n styles: next.styles,\n next: cursor\n };\n next = next.next;\n }\n }\n\n var styles = serializedStyles.styles + \";\";\n return styles;\n }\n\n return createStringFromObject(mergedProps, registered, interpolation);\n }\n\n case 'function':\n {\n if (mergedProps !== undefined) {\n var previousCursor = cursor;\n var result = interpolation(mergedProps);\n cursor = previousCursor;\n return handleInterpolation(mergedProps, registered, result);\n }\n\n break;\n }\n } // finalize string values (regular strings and functions interpolated into css calls)\n\n\n var asString = interpolation;\n\n if (registered == null) {\n return asString;\n }\n\n var cached = registered[asString];\n return cached !== undefined ? cached : asString;\n}\n\nfunction createStringFromObject(mergedProps, registered, obj) {\n var string = '';\n\n if (Array.isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n string += handleInterpolation(mergedProps, registered, obj[i]) + \";\";\n }\n } else {\n for (var key in obj) {\n var value = obj[key];\n\n if (typeof value !== 'object') {\n var asString = value;\n\n if (registered != null && registered[asString] !== undefined) {\n string += key + \"{\" + registered[asString] + \"}\";\n } else if (isProcessableValue(asString)) {\n string += processStyleName(key) + \":\" + processStyleValue(key, asString) + \";\";\n }\n } else {\n if (key === 'NO_COMPONENT_SELECTOR' && isDevelopment) {\n throw new Error(noComponentSelectorMessage);\n }\n\n if (Array.isArray(value) && typeof value[0] === 'string' && (registered == null || registered[value[0]] === undefined)) {\n for (var _i = 0; _i < value.length; _i++) {\n if (isProcessableValue(value[_i])) {\n string += processStyleName(key) + \":\" + processStyleValue(key, value[_i]) + \";\";\n }\n }\n } else {\n var interpolated = handleInterpolation(mergedProps, registered, value);\n\n switch (key) {\n case 'animation':\n case 'animationName':\n {\n string += processStyleName(key) + \":\" + interpolated + \";\";\n break;\n }\n\n default:\n {\n\n string += key + \"{\" + interpolated + \"}\";\n }\n }\n }\n }\n }\n }\n\n return string;\n}\n\nvar labelPattern = /label:\\s*([^\\s;{]+)\\s*(;|$)/g; // this is the cursor for keyframes\n// keyframes are stored on the SerializedStyles object as a linked list\n\nvar cursor;\nfunction serializeStyles(args, registered, mergedProps) {\n if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null && args[0].styles !== undefined) {\n return args[0];\n }\n\n var stringMode = true;\n var styles = '';\n cursor = undefined;\n var strings = args[0];\n\n if (strings == null || strings.raw === undefined) {\n stringMode = false;\n styles += handleInterpolation(mergedProps, registered, strings);\n } else {\n var asTemplateStringsArr = strings;\n\n styles += asTemplateStringsArr[0];\n } // we start at 1 since we've already handled the first arg\n\n\n for (var i = 1; i < args.length; i++) {\n styles += handleInterpolation(mergedProps, registered, args[i]);\n\n if (stringMode) {\n var templateStringsArr = strings;\n\n styles += templateStringsArr[i];\n }\n } // using a global regex with .exec is stateful so lastIndex has to be reset each time\n\n\n labelPattern.lastIndex = 0;\n var identifierName = '';\n var match; // https://esbench.com/bench/5b809c2cf2949800a0f61fb5\n\n while ((match = labelPattern.exec(styles)) !== null) {\n identifierName += '-' + match[1];\n }\n\n var name = hashString(styles) + identifierName;\n\n return {\n name: name,\n styles: styles,\n next: cursor\n };\n}\n\nexport { serializeStyles };\n","/* eslint-disable */\n// Inspired by https://github.com/garycourt/murmurhash-js\n// Ported from https://github.com/aappleby/smhasher/blob/61a0530f28277f2e850bfc39600ce61d02b518de/src/MurmurHash2.cpp#L37-L86\nfunction murmur2(str) {\n // 'm' and 'r' are mixing constants generated offline.\n // They're not really 'magic', they just happen to work well.\n // const m = 0x5bd1e995;\n // const r = 24;\n // Initialize the hash\n var h = 0; // Mix 4 bytes at a time into the hash\n\n var k,\n i = 0,\n len = str.length;\n\n for (; len >= 4; ++i, len -= 4) {\n k = str.charCodeAt(i) & 0xff | (str.charCodeAt(++i) & 0xff) << 8 | (str.charCodeAt(++i) & 0xff) << 16 | (str.charCodeAt(++i) & 0xff) << 24;\n k =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16);\n k ^=\n /* k >>> r: */\n k >>> 24;\n h =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16) ^\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n } // Handle the last few bytes of the input array\n\n\n switch (len) {\n case 3:\n h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\n\n case 2:\n h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\n\n case 1:\n h ^= str.charCodeAt(i) & 0xff;\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n } // Do a few final mixes of the hash to ensure the last few\n // bytes are well-incorporated.\n\n\n h ^= h >>> 13;\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n return ((h ^ h >>> 15) >>> 0).toString(36);\n}\n\nexport { murmur2 as default };\n","var isBrowser = true;\n\nfunction getRegisteredStyles(registered, registeredStyles, classNames) {\n var rawClassName = '';\n classNames.split(' ').forEach(function (className) {\n if (registered[className] !== undefined) {\n registeredStyles.push(registered[className] + \";\");\n } else if (className) {\n rawClassName += className + \" \";\n }\n });\n return rawClassName;\n}\nvar registerStyles = function registerStyles(cache, serialized, isStringTag) {\n var className = cache.key + \"-\" + serialized.name;\n\n if ( // we only need to add the styles to the registered cache if the\n // class name could be used further down\n // the tree but if it's a string tag, we know it won't\n // so we don't have to add it to registered cache.\n // this improves memory usage since we can avoid storing the whole style string\n (isStringTag === false || // we need to always store it if we're in compat mode and\n // in node since emotion-server relies on whether a style is in\n // the registered cache to know whether a style is global or not\n // also, note that this check will be dead code eliminated in the browser\n isBrowser === false ) && cache.registered[className] === undefined) {\n cache.registered[className] = serialized.styles;\n }\n};\nvar insertStyles = function insertStyles(cache, serialized, isStringTag) {\n registerStyles(cache, serialized, isStringTag);\n var className = cache.key + \"-\" + serialized.name;\n\n if (cache.inserted[serialized.name] === undefined) {\n var current = serialized;\n\n do {\n cache.insert(serialized === current ? \".\" + className : '', current, cache.sheet, true);\n\n current = current.next;\n } while (current !== undefined);\n }\n};\n\nexport { getRegisteredStyles, insertStyles, registerStyles };\n","import createCache from '@emotion/cache';\nimport { serializeStyles } from '@emotion/serialize';\nimport { getRegisteredStyles, insertStyles } from '@emotion/utils';\n\nfunction insertWithoutScoping(cache, serialized) {\n if (cache.inserted[serialized.name] === undefined) {\n return cache.insert('', serialized, cache.sheet, true);\n }\n}\n\nfunction merge(registered, css, className) {\n var registeredStyles = [];\n var rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n if (registeredStyles.length < 2) {\n return className;\n }\n\n return rawClassName + css(registeredStyles);\n}\n\nvar createEmotion = function createEmotion(options) {\n var cache = createCache(options); // $FlowFixMe\n\n cache.sheet.speedy = function (value) {\n if (process.env.NODE_ENV !== 'production' && this.ctr !== 0) {\n throw new Error('speedy must be changed before any rules are inserted');\n }\n\n this.isSpeedy = value;\n };\n\n cache.compat = true;\n\n var css = function css() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var serialized = serializeStyles(args, cache.registered, undefined);\n insertStyles(cache, serialized, false);\n return cache.key + \"-\" + serialized.name;\n };\n\n var keyframes = function keyframes() {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n var animation = \"animation-\" + serialized.name;\n insertWithoutScoping(cache, {\n name: serialized.name,\n styles: \"@keyframes \" + animation + \"{\" + serialized.styles + \"}\"\n });\n return animation;\n };\n\n var injectGlobal = function injectGlobal() {\n for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n args[_key3] = arguments[_key3];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n insertWithoutScoping(cache, serialized);\n };\n\n var cx = function cx() {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n\n return merge(cache.registered, css, classnames(args));\n };\n\n return {\n css: css,\n cx: cx,\n injectGlobal: injectGlobal,\n keyframes: keyframes,\n hydrate: function hydrate(ids) {\n ids.forEach(function (key) {\n cache.inserted[key] = true;\n });\n },\n flush: function flush() {\n cache.registered = {};\n cache.inserted = {};\n cache.sheet.flush();\n },\n // $FlowFixMe\n sheet: cache.sheet,\n cache: cache,\n getRegisteredStyles: getRegisteredStyles.bind(null, cache.registered),\n merge: merge.bind(null, cache.registered, css)\n };\n};\n\nvar classnames = function classnames(args) {\n var cls = '';\n\n for (var i = 0; i < args.length; i++) {\n var arg = args[i];\n if (arg == null) continue;\n var toAdd = void 0;\n\n switch (typeof arg) {\n case 'boolean':\n break;\n\n case 'object':\n {\n if (Array.isArray(arg)) {\n toAdd = classnames(arg);\n } else {\n toAdd = '';\n\n for (var k in arg) {\n if (arg[k] && k) {\n toAdd && (toAdd += ' ');\n toAdd += k;\n }\n }\n }\n\n break;\n }\n\n default:\n {\n toAdd = arg;\n }\n }\n\n if (toAdd) {\n cls && (cls += ' ');\n cls += toAdd;\n }\n }\n\n return cls;\n};\n\nexport default createEmotion;\n","import '@emotion/cache';\nimport '@emotion/serialize';\nimport '@emotion/utils';\nimport createEmotion from '../create-instance/dist/emotion-css-create-instance.esm.js';\n\nvar _createEmotion = createEmotion({\n key: 'css'\n}),\n flush = _createEmotion.flush,\n hydrate = _createEmotion.hydrate,\n cx = _createEmotion.cx,\n merge = _createEmotion.merge,\n getRegisteredStyles = _createEmotion.getRegisteredStyles,\n injectGlobal = _createEmotion.injectGlobal,\n keyframes = _createEmotion.keyframes,\n css = _createEmotion.css,\n sheet = _createEmotion.sheet,\n cache = _createEmotion.cache;\n\nexport { cache, css, cx, flush, getRegisteredStyles, hydrate, injectGlobal, keyframes, merge, sheet };\n","import {MS, MOZ, WEBKIT, RULESET, KEYFRAMES, DECLARATION} from './Enum.js'\nimport {match, charat, substr, strlen, sizeof, replace, combine} from './Utility.js'\nimport {copy, tokenize} from './Tokenizer.js'\nimport {serialize} from './Serializer.js'\nimport {prefix} from './Prefixer.js'\n\n/**\n * @param {function[]} collection\n * @return {function}\n */\nexport function middleware (collection) {\n\tvar length = sizeof(collection)\n\n\treturn function (element, index, children, callback) {\n\t\tvar output = ''\n\n\t\tfor (var i = 0; i < length; i++)\n\t\t\toutput += collection[i](element, index, children, callback) || ''\n\n\t\treturn output\n\t}\n}\n\n/**\n * @param {function} callback\n * @return {function}\n */\nexport function rulesheet (callback) {\n\treturn function (element) {\n\t\tif (!element.root)\n\t\t\tif (element = element.return)\n\t\t\t\tcallback(element)\n\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n */\nexport function prefixer (element, index, children, callback) {\n\tif (element.length > -1)\n\t\tif (!element.return)\n\t\t\tswitch (element.type) {\n\t\t\t\tcase DECLARATION: element.return = prefix(element.value, element.length, children)\n\t\t\t\t\treturn\n\t\t\t\tcase KEYFRAMES:\n\t\t\t\t\treturn serialize([copy(element, {value: replace(element.value, '@', '@' + WEBKIT)})], callback)\n\t\t\t\tcase RULESET:\n\t\t\t\t\tif (element.length)\n\t\t\t\t\t\treturn combine(element.props, function (value) {\n\t\t\t\t\t\t\tswitch (match(value, /(::plac\\w+|:read-\\w+)/)) {\n\t\t\t\t\t\t\t\t// :read-(only|write)\n\t\t\t\t\t\t\t\tcase ':read-only': case ':read-write':\n\t\t\t\t\t\t\t\t\treturn serialize([copy(element, {props: [replace(value, /:(read-\\w+)/, ':' + MOZ + '$1')]})], callback)\n\t\t\t\t\t\t\t\t// :placeholder\n\t\t\t\t\t\t\t\tcase '::placeholder':\n\t\t\t\t\t\t\t\t\treturn serialize([\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, ':' + WEBKIT + 'input-$1')]}),\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, ':' + MOZ + '$1')]}),\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, MS + 'input-$1')]})\n\t\t\t\t\t\t\t\t\t], callback)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn ''\n\t\t\t\t\t\t})\n\t\t\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n */\nexport function namespace (element) {\n\tswitch (element.type) {\n\t\tcase RULESET:\n\t\t\telement.props = element.props.map(function (value) {\n\t\t\t\treturn combine(tokenize(value), function (value, index, children) {\n\t\t\t\t\tswitch (charat(value, 0)) {\n\t\t\t\t\t\t// \\f\n\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\treturn substr(value, 1, strlen(value))\n\t\t\t\t\t\t// \\0 ( + > ~\n\t\t\t\t\t\tcase 0: case 40: case 43: case 62: case 126:\n\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t// :\n\t\t\t\t\t\tcase 58:\n\t\t\t\t\t\t\tif (children[++index] === 'global')\n\t\t\t\t\t\t\t\tchildren[index] = '', children[++index] = '\\f' + substr(children[index], index = 1, -1)\n\t\t\t\t\t\t// \\s\n\t\t\t\t\t\tcase 32:\n\t\t\t\t\t\t\treturn index === 1 ? '' : value\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tswitch (index) {\n\t\t\t\t\t\t\t\tcase 0: element = value\n\t\t\t\t\t\t\t\t\treturn sizeof(children) > 1 ? '' : value\n\t\t\t\t\t\t\t\tcase index = sizeof(children) - 1: case 2:\n\t\t\t\t\t\t\t\t\treturn index === 2 ? value + element + element : value + element\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t}\n}\n","import React, { useEffect } from 'react';\nimport { Button, IconButton, useStyles2 } from '@grafana/ui';\nimport { css } from '@emotion/css';\nimport { ChatContextItem } from '../../context/types';\nimport { useAssistant } from '../../hook';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { OpenAssistantProps } from '../../sidebar';\nimport { reportInteraction } from '@grafana/runtime';\n\nexport interface OpenAssistantButtonProps {\n /** Prompt to pass to the openAssistant function. */\n prompt: string;\n /** Origin of the request that opened the assistant. This is used to track the source of the request. Should be a structured string using forward slashes, with the first part as a namespace. Examples: 'grafana-datasources/prometheus/query-builder', 'grafana-slo-app/slo-editor-overview', 'grafana/trace-view-analyzer`. */\n origin: string;\n /** Context to pass to the openAssistant function. Optional, defaults to undefined. Created with `createAssistantContextItem`. */\n context?: ChatContextItem[];\n /** Whether to automatically send the prompt. Optional, defaults to true. */\n autoSend?: boolean;\n /** Text to display on the button. Optional, defaults to 'Analyze with Assistant' */\n title?: string;\n /** Button size, defaults to sm */\n size?: 'xs' | 'sm' | 'md' | 'lg';\n /** If true, the button will be Assistant icon only with name as title. Defaults to false. */\n iconOnlyButton?: boolean;\n /** Function to call when the button is clicked. Optional, defaults to undefined. */\n onClick?: () => void;\n}\n\n/**\n * A button component that opens the Grafana Assistant with configurable prompt and context.\n */\nexport function OpenAssistantButton(props: OpenAssistantButtonProps) {\n // If the assistant is not available, return empty\n const { isAvailable, openAssistant } = useAssistant();\n if (!isAvailable || !openAssistant) {\n return null;\n }\n return <OpenAssistantButtonView {...props} openAssistant={openAssistant} />;\n}\n\n/**\n * Presentational component separated from OpenAssistantButton to avoid hook dependencies in Storybook.\n * It is not exported for users of the package.\n */\nexport function OpenAssistantButtonView({\n prompt,\n origin,\n context,\n autoSend = true,\n title = 'Analyze with Assistant',\n size = 'sm',\n iconOnlyButton = false,\n openAssistant,\n onClick,\n}: OpenAssistantButtonProps & {\n openAssistant: (props: OpenAssistantProps) => void;\n}) {\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n reportInteraction('grafana_assistant_app_open_sidebar_button_displayed', {\n from: origin,\n });\n }, [origin]);\n\n return (\n <>\n {iconOnlyButton ? (\n <IconButton\n name=\"ai-sparkle\"\n onClick={() => {\n onClick?.();\n openAssistant({ prompt, context, autoSend, origin });\n }}\n variant=\"secondary\"\n size={size}\n aria-label={title}\n className={styles.icon}\n tooltip={title}\n data-testid=\"assistant-icon-button\"\n />\n ) : (\n <Button\n icon=\"ai-sparkle\"\n onClick={() => {\n onClick?.();\n openAssistant({ prompt, context, autoSend, origin });\n }}\n variant=\"secondary\"\n fill=\"solid\"\n size={size}\n title={title}\n aria-label={title}\n className={styles.button}\n data-testid=\"assistant-button\"\n >\n {title}\n </Button>\n )}\n </>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const baseBackground = theme.colors.secondary.main;\n const elevatedBackground = theme.colors.emphasize(baseBackground, 0.05);\n\n // Canvas is what's typically underneath buttons\n const underlyingColor = theme.colors.background.canvas;\n\n const borderWidth = 1;\n const outerRadius = theme.shape.radius.default;\n // inner radius = outer radius - border width, but take at least 1px\n const innerRadius = `max(calc(${outerRadius} - ${borderWidth}px), 1px)`;\n\n // Gradient border layer (::before)\n const gradientBorderLayer = {\n content: '\"\"',\n position: 'absolute' as const,\n inset: 0,\n borderRadius: outerRadius,\n cornerShape: 'squircle',\n background: 'linear-gradient(90deg, rgb(168, 85, 247), rgb(249, 115, 22))',\n zIndex: -2,\n pointerEvents: 'none' as const,\n };\n\n // Solid background layer factory (::after)\n // Layer transparent color over canvas to make it opaque and mask the gradient properly\n const solidBackgroundLayer = (background: string) => ({\n content: '\"\"',\n position: 'absolute' as const,\n inset: `${borderWidth}px`,\n borderRadius: innerRadius,\n cornerShape: 'squircle',\n background: `linear-gradient(${background}, ${background}), ${underlyingColor}`,\n zIndex: -1,\n transition: 'none',\n pointerEvents: 'none' as const,\n });\n\n return {\n button: css({\n label: 'assistant-button',\n width: 'fit-content',\n maxWidth: '100%',\n position: 'relative',\n isolation: 'isolate',\n border: 'none',\n transition: 'none !important',\n '&::before': gradientBorderLayer,\n '&::after': {\n ...solidBackgroundLayer(baseBackground),\n transition: 'none',\n },\n '&:hover': {\n transition: 'none !important',\n },\n '&:hover::after': {\n background: `linear-gradient(${elevatedBackground}, ${elevatedBackground}), ${underlyingColor}`,\n },\n }),\n icon: css({\n label: 'assistant-icon',\n position: 'relative',\n isolation: 'isolate',\n border: 'none',\n background: 'none',\n padding: theme.spacing(0.5),\n '&::before': { ...gradientBorderLayer, transition: 'background 0.1s ease' },\n '&:hover::after': {\n ...solidBackgroundLayer(baseBackground),\n background: `linear-gradient(${elevatedBackground}, ${elevatedBackground}), ${underlyingColor}`,\n },\n }),\n };\n};\n","import React, { ReactElement, useEffect } from 'react';\nimport { Button, ButtonGroup, Dropdown, Tooltip, useStyles2 } from '@grafana/ui';\nimport { css, cx } from '@emotion/css';\nimport { ChatContextItem } from '../../context/types';\nimport { useAssistant } from '../../hook';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { OpenAssistantProps } from '../../sidebar';\nimport { reportInteraction } from '@grafana/runtime';\n\nexport interface OpenAssistantSplitButtonProps {\n /** Prompt to pass to the openAssistant function. */\n prompt: string;\n /** Origin of the request that opened the assistant. */\n origin: string;\n /** Context to pass to the openAssistant function. Optional, defaults to undefined. */\n context?: ChatContextItem[];\n /** Whether to automatically send the prompt. Optional, defaults to true. */\n autoSend?: boolean;\n /** Text to display on the button. Optional, defaults to 'Chat with Assistant' */\n title?: string;\n /** Button size, defaults to sm */\n size?: 'sm' | 'md' | 'lg';\n /** Function to call when the main button is clicked. Optional. */\n onClick?: () => void;\n /** Additional menu items to show in the dropdown. Optional. */\n menuItems?: ReactElement;\n /** Tooltip text to display on hover. Optional. */\n tooltip?: string;\n /** Width for the dropdown/chevron segment. Accepts pixels as number or any CSS width value. */\n dropdownButtonWidth?: number | string;\n}\n\ntype AssistantButtonSize = NonNullable<OpenAssistantSplitButtonProps['size']>;\n\nconst defaultDropdownButtonWidths: Record<AssistantButtonSize, number> = {\n sm: 32,\n md: 36,\n lg: 40,\n};\n\n/**\n * A split button component that opens the Grafana Assistant with a dropdown for additional actions.\n * The gradient border wraps around both buttons as a unified control.\n */\nexport function OpenAssistantSplitButton(props: OpenAssistantSplitButtonProps) {\n const { isAvailable, openAssistant } = useAssistant();\n if (!isAvailable || !openAssistant) {\n return null;\n }\n return <OpenAssistantSplitButtonView {...props} openAssistant={openAssistant} />;\n}\n\nexport function OpenAssistantSplitButtonView({\n prompt,\n origin,\n context,\n autoSend = true,\n title = 'Chat with Assistant',\n size = 'sm',\n onClick,\n menuItems,\n tooltip,\n dropdownButtonWidth,\n openAssistant,\n}: OpenAssistantSplitButtonProps & {\n openAssistant: (props: OpenAssistantProps) => void;\n}) {\n const styles = useStyles2(getStyles);\n const hasMenuItems = Boolean(menuItems);\n const resolvedDropdownButtonWidth = toCssWidth(dropdownButtonWidth ?? defaultDropdownButtonWidths[size]);\n\n useEffect(() => {\n reportInteraction('grafana_assistant_app_open_sidebar_split_button_displayed', {\n from: origin,\n });\n }, [origin]);\n\n const handleMainClick = () => {\n onClick?.();\n openAssistant({ prompt, context, autoSend, origin });\n };\n\n const wrapperContent = (\n <div className={styles.wrapper}>\n <ButtonGroup className={styles.buttonGroup}>\n <Button\n icon=\"ai-sparkle\"\n onClick={handleMainClick}\n variant=\"secondary\"\n fill=\"solid\"\n size={size}\n aria-label={title}\n className={cx(styles.segmentButton, hasMenuItems ? styles.mainButtonSplit : styles.mainButtonSolo)}\n data-testid=\"assistant-split-button-main\"\n >\n {title}\n </Button>\n {menuItems && (\n <Dropdown overlay={menuItems}>\n <Button\n variant=\"secondary\"\n icon=\"angle-down\"\n size={size}\n aria-label=\"More AI actions\"\n className={cx(styles.segmentButton, styles.dropdownButton)}\n style={{ width: resolvedDropdownButtonWidth, minWidth: resolvedDropdownButtonWidth }}\n data-testid=\"assistant-split-button-dropdown\"\n />\n </Dropdown>\n )}\n </ButtonGroup>\n </div>\n );\n\n return tooltip ? <Tooltip content={tooltip}>{wrapperContent}</Tooltip> : wrapperContent;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const baseBackground = theme.colors.secondary.main;\n const elevatedBackground = theme.colors.emphasize(baseBackground, 0.05);\n const underlyingColor = theme.colors.background.canvas;\n const dividerColor = theme.colors.border.weak;\n const borderWidth = 1;\n const outerRadius = theme.shape.radius.default;\n const innerRadius = `max(calc(${outerRadius} - ${borderWidth}px), 1px)`;\n\n return {\n wrapper: css({\n label: 'assistant-split-button-wrapper',\n position: 'relative',\n isolation: 'isolate',\n display: 'inline-block',\n // Gradient border around the entire button group\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n inset: 0,\n borderRadius: outerRadius,\n cornerShape: 'squircle',\n background: 'linear-gradient(90deg, rgb(168, 85, 247), rgb(249, 115, 22))',\n zIndex: -1,\n pointerEvents: 'none',\n },\n // Solid background layer\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n inset: `${borderWidth}px`,\n borderRadius: innerRadius,\n cornerShape: 'squircle',\n background: `linear-gradient(${baseBackground}, ${baseBackground}), ${underlyingColor}`,\n zIndex: -1,\n pointerEvents: 'none',\n },\n }),\n buttonGroup: css({\n label: 'assistant-split-button-group',\n gap: 0,\n position: 'relative',\n zIndex: 1,\n borderRadius: innerRadius,\n overflow: 'hidden',\n // Make buttons transparent to show the wrapper's gradient\n '& button': {\n border: 'none',\n boxShadow: 'none',\n background: 'transparent !important',\n },\n }),\n segmentButton: css({\n label: 'assistant-split-button-segment',\n position: 'relative',\n '&:hover': {\n background: `${elevatedBackground} !important`,\n },\n '&:focus-visible': {\n background: `${elevatedBackground} !important`,\n },\n '&[aria-expanded=\"true\"]': {\n background: `${elevatedBackground} !important`,\n },\n }),\n mainButtonSolo: css({\n label: 'assistant-split-button-main-solo',\n borderRadius: innerRadius,\n }),\n mainButtonSplit: css({\n label: 'assistant-split-button-main-split',\n borderTopLeftRadius: innerRadius,\n borderBottomLeftRadius: innerRadius,\n borderTopRightRadius: 0,\n borderBottomRightRadius: 0,\n }),\n dropdownButton: css({\n label: 'assistant-split-button-dropdown',\n display: 'inline-flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: 0,\n borderTopLeftRadius: 0,\n borderBottomLeftRadius: 0,\n borderTopRightRadius: innerRadius,\n borderBottomRightRadius: innerRadius,\n padding: '0 !important',\n boxShadow: `inset 1px 0 0 ${dividerColor}`,\n '& svg': {\n margin: 0,\n },\n }),\n };\n};\n\nfunction toCssWidth(width: number | string): string {\n return typeof width === 'number' ? `${width}px` : width;\n}\n","import { GrafanaTheme2 } from '@grafana/data';\n\n/**\n * Default gradient colors for the assistant\n */\nconst GRADIENT_COLORS = {\n PURPLE: 'rgb(168, 85, 247)',\n ORANGE: 'rgb(249, 115, 22)',\n} as const;\n\n// FIXME: use SDK as single source of truth for these color schemes?\n\n/**\n * Returns the colors of the background gradient based on the theme.\n *\n * @param theme - The Grafana theme object.\n * @returns The colors of the background gradient as tuple.\n */\nexport const getBackgroundGradientColors = (theme: GrafanaTheme2): [string, string] => {\n const defaultGradientColors: [string, string] = [GRADIENT_COLORS.PURPLE, GRADIENT_COLORS.ORANGE];\n\n // Check if the theme does not use gradients by default\n if (theme.name.toLowerCase() === 'dark' || theme.name.toLowerCase() === 'light') {\n return defaultGradientColors;\n }\n\n // If the theme uses gradients, extract the colors from the gradient string\n const gradientString = theme.colors.gradients.brandHorizontal;\n const hexColorRegex = /#[0-9A-Fa-f]{6}/g;\n const matches = gradientString.match(hexColorRegex);\n if (!matches || matches.length < 2) {\n // Fallback to default colors if extraction fails\n return defaultGradientColors;\n }\n\n return [matches[0], matches[1]];\n};\n\n/**\n * Creates animation keyframes for a rotating gradient border effect.\n * This is used for loading states in inputs and other components.\n *\n * @param theme - The Grafana theme object\n * @param backgroundColor - The background color to use in the animation\n * @param color1 - First gradient color (optional, defaults to theme purple)\n * @param color2 - Second gradient color (optional, defaults to theme orange)\n * @returns Animation keyframes object for use with @emotion/css keyframes\n *\n * @example\n * ```ts\n * const borderAnimation = keyframes({\n * label: 'border-animation',\n * ...createBorderAnimation(theme, theme.colors.background.primary),\n * });\n * ```\n */\nexport const createBorderAnimation = (\n theme: GrafanaTheme2,\n backgroundColor: string,\n color1?: string,\n color2?: string\n): Record<string, { backgroundImage: string }> => {\n const animationSteps = Array.from({ length: 101 }, (_, i) => i);\n const animationFrames: Record<string, { backgroundImage: string }> = {};\n const [gradientColor1, gradientColor2] = getBackgroundGradientColors(theme);\n\n const finalColor1 = color1 ?? gradientColor1;\n const finalColor2 = color2 ?? gradientColor2;\n\n animationSteps.forEach((step) => {\n animationFrames[`${step}%`] = {\n backgroundImage: `\n linear-gradient(${backgroundColor}, ${backgroundColor}),\n conic-gradient(from ${step * 3.6}deg, transparent 60%, ${finalColor1} 80%, ${finalColor2} 100%, transparent 15%)\n `,\n };\n });\n\n return animationFrames;\n};\n","import type { InlineToolRunnable } from '../tools/types';\n\nexport interface InlineAssistantPromptOptions {\n prompt: string;\n agentName?: string;\n agentId?: string;\n systemPrompt?: string;\n tools?: InlineToolRunnable[];\n onStart?: () => void;\n onDelta?: (delta: string) => void;\n onComplete?: (text: string) => void;\n onError?: (error: Error) => void;\n}\n\nexport interface InlineAssistant {\n sendPrompt(options: InlineAssistantPromptOptions): Promise<void>;\n cancel(): void;\n dispose(): void;\n}\n\n// Extend window interface for global registry\ndeclare global {\n interface Window {\n [key: string]: any;\n }\n}\n\nexport type InlineAssistantFactory = (origin: string) => Promise<InlineAssistant>;\nexport type InlineAssistantInitializer = () => Promise<void>;\n\n// Global registry keys for cross-plugin sharing\nconst GLOBAL_FACTORY_KEY = '__grafanaAssistantInlineFactory__';\nconst GLOBAL_INITIALIZER_KEY = '__grafanaAssistantInlineInitializer__';\nconst GLOBAL_INITIALIZATION_PROMISE_KEY = '__grafanaAssistantInlineInitPromise__';\n\nexport function setInlineAssistantFactory(fn: InlineAssistantFactory): void {\n const existing = window[GLOBAL_FACTORY_KEY] as InlineAssistantFactory | undefined;\n if (existing && existing !== fn) {\n console.warn('InlineAssistant factory already set; ignoring subsequent setInlineAssistantFactory call');\n return;\n }\n if (!existing) {\n window[GLOBAL_FACTORY_KEY] = fn;\n }\n}\n\n/**\n * Register a lazy initializer that will be called on first use.\n * The plugin code should register this to enable lazy loading of the inline assistant.\n *\n * This uses global storage (window) so that all plugins share the same initializer,\n * regardless of which plugin instance or package version loads first.\n */\nexport function setInlineAssistantInitializer(fn: InlineAssistantInitializer): void {\n const existing = window[GLOBAL_INITIALIZER_KEY] as InlineAssistantInitializer | undefined;\n if (existing && existing !== fn) {\n console.warn('InlineAssistant initializer already set; ignoring subsequent setInlineAssistantInitializer call');\n return;\n }\n if (!existing) {\n window[GLOBAL_INITIALIZER_KEY] = fn;\n }\n}\n\n/**\n * Ensure the inline assistant is initialized. If an initializer is registered,\n * it will be called on first use. Otherwise, checks if factory is already registered.\n *\n * Uses global storage (window) so that initialization is shared across all plugins.\n */\nexport async function ensureInlineAssistantInitialized(): Promise<void> {\n // If factory is already set, we're good\n const factory = window[GLOBAL_FACTORY_KEY] as InlineAssistantFactory | undefined;\n if (factory) {\n return;\n }\n\n // If no initializer is registered, throw error\n const initializer = window[GLOBAL_INITIALIZER_KEY] as InlineAssistantInitializer | undefined;\n if (!initializer) {\n throw new Error(\n 'InlineAssistant not initialized. Make sure the Grafana Assistant plugin is loaded and initialized.'\n );\n }\n\n // If initialization is in progress, wait for it\n const existingPromise = window[GLOBAL_INITIALIZATION_PROMISE_KEY] as Promise<void> | null | undefined;\n if (existingPromise) {\n return existingPromise;\n }\n\n // Start initialization\n const initPromise = (async () => {\n try {\n await initializer();\n } catch (err) {\n // Reset on error so retry is possible\n window[GLOBAL_INITIALIZATION_PROMISE_KEY] = null;\n throw err;\n }\n })();\n\n window[GLOBAL_INITIALIZATION_PROMISE_KEY] = initPromise;\n return initPromise;\n}\n\nexport function getInlineAssistantFactory(): InlineAssistantFactory {\n const factory = window[GLOBAL_FACTORY_KEY] as InlineAssistantFactory | undefined;\n if (!factory) {\n throw new Error('InlineAssistant factory not initialized. Make sure the Grafana Assistant plugin is loaded.');\n }\n return factory;\n}\n","import { useState, useCallback, useRef, useEffect } from 'react';\nimport { InlineAssistantOptions, InlineAssistantResult } from './types';\nimport { getInlineAssistantFactory, InlineAssistant, ensureInlineAssistantInitialized } from './inlineAssistant';\n\n/**\n * React hook for inline assistant generation with streaming support.\n *\n * This hook enables generating content (like panel titles or descriptions) inline\n * without opening the assistant sidebar. Each hook instance creates its own chat\n * conversation, so all generations from the same instance are grouped together.\n * Generated content is ephemeral - it won't appear in the user's chat history\n * but will be tracked in the admin UI for analytics.\n *\n * Uses the full BaseMultiStepAgent infrastructure for tool execution and multi-step workflows.\n *\n * The implementation is lazy-loaded on first use to reduce initial bundle size.\n *\n * @example\n * ```typescript\n * function PanelEditor() {\n * const { generate, isGenerating, content, error, reset } = useInlineAssistant();\n * const [title, setTitle] = useState('');\n *\n * const handleGenerate = () => {\n * generate({\n * prompt: 'Generate a panel title for CPU metrics',\n * origin: 'grafana/panel-editor/title',\n * systemPrompt: 'Generate only the title text, no explanation',\n * onComplete: (text) => setTitle(text.trim()),\n * onError: (err) => console.error(err)\n * });\n * };\n *\n * return (\n * <div>\n * <input value={title} onChange={(e) => setTitle(e.target.value)} />\n * <button onClick={handleGenerate} disabled={isGenerating}>\n * {isGenerating ? 'Generating...' : 'Generate with Assistant'}\n * </button>\n * {isGenerating && <div>{content}</div>}\n * </div>\n * );\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Using tools with inline assistant\n * import { lokiQueryHandlerTool } from 'agent/tools';\n *\n * function ComponentWithTools() {\n * const { generate } = useInlineAssistant();\n *\n * const handleGenerate = async () => {\n * await generate({\n * prompt: 'Query Loki for error logs from the last hour',\n * origin: 'my-app/component',\n * tools: [lokiQueryHandlerTool],\n * onComplete: (text) => console.log('Generated:', text),\n * });\n * };\n *\n * return <button onClick={handleGenerate}>Generate</button>;\n * }\n * ```\n */\nexport function useInlineAssistant(): InlineAssistantResult {\n const [isGenerating, setIsGenerating] = useState(false);\n const [content, setContent] = useState('');\n const [error, setError] = useState<Error | null>(null);\n const assistantRef = useRef<InlineAssistant | null>(null);\n\n /**\n * Reset error and content state\n */\n const reset = useCallback(() => {\n setError(null);\n setContent('');\n }, []);\n\n /**\n * Cancel the current generation\n */\n const cancel = useCallback(() => {\n if (assistantRef.current) {\n assistantRef.current.cancel();\n }\n setIsGenerating(false);\n }, []);\n\n /**\n * Generate content with the given options\n */\n const generate = useCallback(async (options: InlineAssistantOptions): Promise<void> => {\n // Reset state\n setError(null);\n setContent('');\n setIsGenerating(true);\n\n try {\n // Ensure the inline assistant is initialized (lazy-loads on first use)\n await ensureInlineAssistantInitialized();\n\n const factory = getInlineAssistantFactory();\n\n // Create or reuse assistant for this origin\n if (!assistantRef.current) {\n assistantRef.current = await factory(options.origin);\n }\n\n await assistantRef.current.sendPrompt({\n prompt: options.prompt,\n agentName: options.agentName,\n agentId: options.agentId,\n systemPrompt: options.systemPrompt,\n tools: options.tools,\n onStart: () => {\n setIsGenerating(true);\n },\n onDelta: (delta) => {\n setContent((prev) => prev + delta);\n options.onDelta?.(delta);\n },\n onComplete: (text) => {\n setContent(text);\n setIsGenerating(false);\n options.onComplete?.(text);\n },\n onError: (err) => {\n setError(err);\n setIsGenerating(false);\n options.onError?.(err);\n },\n });\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n setIsGenerating(false);\n options.onError?.(error);\n }\n }, []);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (assistantRef.current) {\n assistantRef.current.cancel();\n assistantRef.current.dispose();\n assistantRef.current = null;\n }\n };\n }, []);\n\n return {\n generate,\n isGenerating,\n content,\n error,\n cancel,\n reset,\n };\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useInlineAssistant } from '../../inline/useInlineAssistant';\n\nexport interface UseAIGenerationOptions {\n value: string;\n onChange: (value: string) => void;\n origin: string;\n systemPrompt?: string;\n onComplete?: (text: string) => void;\n onError?: (error: Error) => void;\n onDelta?: (delta: string) => void;\n disabled?: boolean;\n autoGenerate?: boolean;\n streaming?: boolean;\n getUserPrompt?: (textInput: string) => string;\n}\n\nexport function useAIGeneration({\n value,\n onChange,\n origin,\n systemPrompt,\n onComplete,\n onError,\n onDelta,\n disabled = false,\n autoGenerate = false,\n streaming = false,\n getUserPrompt,\n}: UseAIGenerationOptions) {\n const { generate, isGenerating, content, error, reset } = useInlineAssistant();\n const hasAutoGenerated = useRef(false);\n const valueBeforeGeneration = useRef(value);\n\n const displayValue = isGenerating ? (streaming ? content : '') : value;\n const resolvedPrompt = getUserPrompt ? getUserPrompt(value.trim()) : value.trim();\n const isSendDisabled = !resolvedPrompt || disabled || isGenerating;\n\n const doGenerate = useCallback(\n (prompt: string) => {\n valueBeforeGeneration.current = value;\n onChange('');\n reset();\n\n generate({\n prompt,\n origin,\n systemPrompt,\n onDelta,\n onComplete: (text) => {\n onChange(text);\n onComplete?.(text);\n },\n onError: (err) => {\n onChange(valueBeforeGeneration.current);\n onError?.(err);\n },\n });\n },\n [value, onChange, origin, systemPrompt, onDelta, onComplete, onError, generate, reset]\n );\n\n useEffect(() => {\n if (autoGenerate && systemPrompt && !value && !hasAutoGenerated.current && !disabled) {\n hasAutoGenerated.current = true;\n doGenerate(systemPrompt);\n }\n // Only run on mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleGenerate = useCallback(() => {\n if (isSendDisabled) {\n return;\n }\n doGenerate(resolvedPrompt);\n }, [isSendDisabled, doGenerate, resolvedPrompt]);\n\n return {\n displayValue,\n isSendDisabled,\n handleGenerate,\n isGenerating,\n error,\n };\n}\n","import { useRef, useState } from 'react';\n\nconst GENERATING_PHRASES = [\n 'Generating...',\n 'Brewing...',\n 'Cooking...',\n 'Crunching...',\n 'Phrasing...',\n 'Wording...',\n 'Crafting...',\n 'Composing...',\n 'Drafting...',\n 'Shaping...',\n 'Forming...',\n 'Molding...',\n 'Sketching...',\n 'Whipping up...',\n 'Conjuring...',\n 'Stirring...',\n];\n\n/**\n * Returns a random placeholder phrase while generating, or the provided\n * default placeholder when idle. A new phrase is picked each time generation starts.\n */\nexport function useGeneratingPlaceholder(isGenerating: boolean, defaultPlaceholder: string): string {\n const [phrase, setPhrase] = useState('');\n const wasGenerating = useRef(false);\n\n if (isGenerating && !wasGenerating.current) {\n const next = GENERATING_PHRASES[Math.floor(Math.random() * GENERATING_PHRASES.length)];\n setPhrase(next);\n wasGenerating.current = true;\n return next;\n }\n\n if (!isGenerating) {\n wasGenerating.current = false;\n }\n\n return isGenerating ? phrase : defaultPlaceholder;\n}\n","import React, { KeyboardEvent } from 'react';\nimport { Input, IconButton, useStyles2 } from '@grafana/ui';\nimport { css, cx, keyframes } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { createBorderAnimation, getBackgroundGradientColors } from '../../utils/theme';\nimport { AIInputProps } from './types';\nimport { useAIGeneration } from './useAIGeneration';\nimport { useGeneratingPlaceholder } from './useGeneratingPlaceholder';\n\nexport interface AITextInputProps extends AIInputProps {}\n\n/**\n * An AI-powered controlled text input component that uses the Grafana Assistant engine to generate content.\n * Features an integrated send button as well as a gradient border animation while generating.\n */\nexport function AITextInput({\n value,\n onChange,\n placeholder,\n origin,\n systemPrompt,\n onComplete,\n onError,\n onDelta,\n disabled = false,\n autoGenerate = false,\n streaming = false,\n getUserPrompt,\n className,\n 'data-testid': dataTestId,\n}: AITextInputProps) {\n const { displayValue, isSendDisabled, handleGenerate, isGenerating, error } = useAIGeneration({\n value,\n onChange,\n origin,\n systemPrompt,\n onComplete,\n onError,\n onDelta,\n disabled,\n autoGenerate,\n streaming,\n getUserPrompt,\n });\n const styles = useStyles2(getStyles);\n const activePlaceholder = useGeneratingPlaceholder(isGenerating, placeholder ?? 'Ask AI to generate...');\n\n const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n // Cmd/Ctrl + Enter to send\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleGenerate();\n }\n };\n\n const addonAfter = (\n <IconButton\n name=\"ai-sparkle\"\n onClick={handleGenerate}\n disabled={isSendDisabled}\n tooltip={isSendDisabled ? 'Enter text to generate' : 'Generate with AI'}\n data-testid={dataTestId ? `${dataTestId}-send` : undefined}\n />\n );\n\n return (\n <div className={cx(styles.wrapper, { [styles.animatedWrapper]: isGenerating }, className)} data-testid={dataTestId}>\n <Input\n value={displayValue}\n onKeyDown={handleKeyDown}\n onChange={(e) => onChange(e.currentTarget.value)}\n placeholder={activePlaceholder}\n disabled={disabled || isGenerating}\n suffix={addonAfter}\n invalid={!!error}\n data-testid={dataTestId ? `${dataTestId}-input` : undefined}\n />\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const backgroundColor = theme.colors.background.primary;\n const borderAnimation = keyframes({\n label: 'ai-input-border-animation',\n ...createBorderAnimation(theme, backgroundColor),\n });\n\n const [gradientColor1, gradientColor2] = getBackgroundGradientColors(theme);\n\n return {\n wrapper: css({\n label: 'ai-text-input-wrapper',\n position: 'relative',\n border: '1px solid transparent',\n borderRadius: theme.shape.radius.default,\n cornerShape: 'squircle',\n }),\n animatedWrapper: css({\n label: 'ai-text-input-animated',\n border: `1px solid transparent`,\n // Set initial backgroundImage with both gradients so Chrome can animate properly\n backgroundImage: `\n linear-gradient(${backgroundColor}, ${backgroundColor}),\n conic-gradient(from 0deg, transparent 60%, ${gradientColor1} 80%, ${gradientColor2} 100%, transparent 15%)\n `,\n backgroundOrigin: 'border-box',\n backgroundClip: 'padding-box, border-box',\n animation: `${borderAnimation} 2s linear infinite`,\n '& input': {\n // Remove the default border from the input when animated wrapper is active\n border: 'none !important',\n },\n }),\n };\n};\n","import React, { KeyboardEvent } from 'react';\nimport { TextArea, IconButton, useStyles2 } from '@grafana/ui';\nimport { css, cx, keyframes } from '@emotion/css';\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { createBorderAnimation, getBackgroundGradientColors } from '../../utils/theme';\nimport { AIInputProps } from './types';\nimport { useAIGeneration } from './useAIGeneration';\nimport { useGeneratingPlaceholder } from './useGeneratingPlaceholder';\n\nexport interface AITextAreaProps extends AIInputProps {\n /** Number of rows for the textarea */\n rows?: number;\n}\n\n/**\n * An AI-powered controlled textarea component that uses the Grafana Assistant engine to generate content.\n * Features an integrated send button as well as a gradient border animation while generating.\n */\nexport function AITextArea({\n value,\n onChange,\n placeholder,\n origin,\n systemPrompt,\n onComplete,\n onError,\n onDelta,\n disabled = false,\n autoGenerate = false,\n streaming = false,\n getUserPrompt,\n rows = 4,\n className,\n 'data-testid': dataTestId,\n}: AITextAreaProps) {\n const { displayValue, isSendDisabled, handleGenerate, isGenerating, error } = useAIGeneration({\n value,\n onChange,\n origin,\n systemPrompt,\n onComplete,\n onError,\n onDelta,\n disabled,\n autoGenerate,\n streaming,\n getUserPrompt,\n });\n const styles = useStyles2(getStyles);\n const activePlaceholder = useGeneratingPlaceholder(\n isGenerating,\n placeholder ?? 'Ask AI to generate... (Cmd/Ctrl+Enter to send)'\n );\n const effectiveRows = Math.max(rows, 2);\n\n const handleKeyDown = (e: KeyboardEvent<HTMLTextAreaElement>) => {\n // Cmd/Ctrl + Enter to send\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n handleGenerate();\n }\n };\n\n return (\n <div\n className={cx(styles.textareaWrapper, { [styles.animatedWrapper]: isGenerating }, className)}\n data-testid={dataTestId}\n >\n <TextArea\n value={displayValue}\n onKeyDown={handleKeyDown}\n onChange={(e) => onChange(e.currentTarget.value)}\n placeholder={activePlaceholder}\n disabled={disabled || isGenerating}\n rows={effectiveRows}\n className={styles.textarea}\n invalid={!!error}\n data-testid={dataTestId ? `${dataTestId}-textarea` : undefined}\n />\n <IconButton\n name=\"ai-sparkle\"\n onClick={handleGenerate}\n disabled={isSendDisabled}\n className={styles.sendButton}\n aria-label=\"Generate with AI\"\n tooltip={isSendDisabled ? 'Enter text to generate' : 'Generate with AI (Cmd/Ctrl+Enter)'}\n data-testid={dataTestId ? `${dataTestId}-send` : undefined}\n />\n </div>\n );\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n const backgroundColor = theme.colors.background.primary;\n const borderAnimation = keyframes({\n label: 'ai-textarea-border-animation',\n ...createBorderAnimation(theme, backgroundColor),\n });\n\n const [gradientColor1, gradientColor2] = getBackgroundGradientColors(theme);\n\n return {\n textareaWrapper: css({\n label: 'ai-textarea-wrapper',\n position: 'relative',\n border: '1px solid transparent',\n borderRadius: theme.shape.radius.default,\n cornerShape: 'squircle',\n }),\n animatedWrapper: css({\n label: 'ai-textarea-animated',\n border: `1px solid transparent`,\n // Set initial backgroundImage with both gradients so Chrome can animate properly\n backgroundImage: `\n linear-gradient(${backgroundColor}, ${backgroundColor}),\n conic-gradient(from 0deg, transparent 60%, ${gradientColor1} 80%, ${gradientColor2} 100%, transparent 15%)\n `,\n backgroundOrigin: 'border-box',\n backgroundClip: 'padding-box, border-box',\n animation: `${borderAnimation} 2s linear infinite`,\n '& textarea': {\n // Remove the default border from the textarea when animated wrapper is active\n border: 'none !important',\n },\n }),\n textarea: css({\n label: 'ai-textarea',\n // ensures the text does not \"underflow\" the send button\n paddingRight: theme.spacing(4),\n // Keep at least a 2-row visual height even if outer styles try to shrink the control\n minHeight: theme.spacing(6),\n '& textarea': {\n minHeight: theme.spacing(6),\n },\n // Hide scrollbar\n scrollbarWidth: 'none', // Firefox\n '&::-webkit-scrollbar': {\n display: 'none', // Chrome, Safari, Edge\n },\n }),\n sendButton: css({\n label: 'ai-textarea-send',\n position: 'absolute',\n right: theme.spacing(1),\n top: theme.spacing(1),\n }),\n };\n};\n","import { CoreApp, DataSourceApi, DataSourceInstanceSettings } from '@grafana/data';\nimport { DataQuery, DataSourceJsonData } from '@grafana/schema';\nimport { ComponentSize } from '@grafana/ui';\nimport { createAssistantContextItem } from '../../context';\nimport { useAssistant } from '../../hook';\nimport { OpenAssistantButtonView } from './OpenAssistantButton';\nimport React from 'react';\n\nfunction queryIsEmpty(query: DataQuery): boolean {\n const dataQueryProps = ['refId', 'hide', 'key', 'queryType', 'datasource'];\n\n for (const key in query) {\n if (key === 'label') {\n continue;\n }\n if (!dataQueryProps.includes(key)) {\n return false;\n }\n }\n\n return true;\n}\n\nexport interface QueryWithAssistantButtonProps<TQuery extends DataQuery = DataQuery> {\n size?: ComponentSize;\n currentQuery: TQuery;\n queries: TQuery[];\n dataSourceInstanceSettings: DataSourceInstanceSettings;\n app?: CoreApp;\n datasourceApi: DataSourceApi<TQuery, DataSourceJsonData, {}> | null;\n title?: string;\n}\n\nexport function QueryWithAssistantButton<TQuery extends DataQuery = DataQuery>({\n size,\n currentQuery,\n queries,\n dataSourceInstanceSettings,\n app,\n datasourceApi,\n title = 'Query with Assistant',\n}: QueryWithAssistantButtonProps<TQuery>) {\n const { isAvailable, openAssistant } = useAssistant();\n if (!isAvailable || !openAssistant) {\n return null;\n }\n\n const origin = `grafana/query-editor/${dataSourceInstanceSettings.type}/${app ?? CoreApp.Unknown ?? 'unknown'}`;\n\n const hasCurrentQuery = !queryIsEmpty(currentQuery);\n const otherQueries = queries.filter((q) => q.refId !== currentQuery.refId && !queryIsEmpty(q));\n\n const context = [\n createAssistantContextItem('datasource', {\n datasourceUid: dataSourceInstanceSettings.uid,\n }),\n ];\n\n if (hasCurrentQuery) {\n context.push(\n createAssistantContextItem('structured', {\n title: 'Current query',\n data: currentQuery,\n })\n );\n }\n\n if (otherQueries.length > 0) {\n context.push(\n createAssistantContextItem('structured', {\n title: 'Other queries',\n data: {\n queries: otherQueries,\n },\n })\n );\n }\n\n const queryDisplayText =\n hasCurrentQuery && datasourceApi?.getQueryDisplayText ? datasourceApi.getQueryDisplayText(currentQuery) : null;\n\n const isUpdating = !!queryDisplayText;\n const actionText = isUpdating\n ? 'Help me update the current query to answer my questions and provide the insights I need.'\n : 'Help me create a new query to answer my questions and provide the insights I need.';\n\n const codeBlockLines: string[] = [];\n\n if (queryDisplayText) {\n codeBlockLines.push(`Current query: ${queryDisplayText}`);\n }\n\n codeBlockLines.push(`Selected data source: ${dataSourceInstanceSettings.name}`);\n\n\n const actionableSentence = isUpdating\n ? 'Please describe what you want to change or improve in this query.'\n : \"Please describe what you want to query and what insights you're looking for.\";\n\n const prompt = [actionText, '```', ...codeBlockLines, '```', actionableSentence].join('\\n');\n\n return (\n <OpenAssistantButtonView\n prompt={prompt}\n origin={origin}\n context={context}\n autoSend={false}\n title={title}\n size={size}\n openAssistant={openAssistant}\n />\n );\n}\n","/**\n * Lightweight semantic version comparison utility.\n * Replaces semver library to reduce bundle size.\n *\n * Supports standard semver format: major.minor.patch[-prerelease][+build]\n * Pre-release versions are considered lower than release versions.\n * Build metadata is ignored for comparison purposes.\n */\n\ninterface ParsedVersion {\n major: number;\n minor: number;\n patch: number;\n prerelease?: string;\n}\n\n/**\n * Parses a semantic version string into its components.\n * @param version - Version string (e.g., \"1.2.3\", \"0.0.2-ga\", \"1.2.3+build\")\n * @returns Parsed version object or null if invalid\n */\nfunction parseVersion(version: string): ParsedVersion | null {\n // Remove build metadata (everything after +)\n const withoutBuild = version.split('+')[0];\n\n // Split into version and prerelease parts\n const parts = withoutBuild.split('-');\n const versionPart = parts[0];\n const prerelease = parts.length > 1 ? parts.slice(1).join('-') : undefined;\n\n // Parse major.minor.patch\n const numbers = versionPart.split('.').map(Number);\n if (numbers.length !== 3 || numbers.some(isNaN)) {\n return null;\n }\n\n return {\n major: numbers[0],\n minor: numbers[1],\n patch: numbers[2],\n prerelease,\n };\n}\n\n/**\n * Compares two semantic versions.\n * @param v1 - First version string\n * @param v2 - Second version string\n * @returns -1 if v1 < v2, 0 if v1 === v2, 1 if v1 > v2, or null if either version is invalid\n */\nfunction compareVersions(v1: string, v2: string): number | null {\n const parsed1 = parseVersion(v1);\n const parsed2 = parseVersion(v2);\n\n if (!parsed1 || !parsed2) {\n return null;\n }\n\n // Compare major version\n if (parsed1.major !== parsed2.major) {\n return parsed1.major > parsed2.major ? 1 : -1;\n }\n\n // Compare minor version\n if (parsed1.minor !== parsed2.minor) {\n return parsed1.minor > parsed2.minor ? 1 : -1;\n }\n\n // Compare patch version\n if (parsed1.patch !== parsed2.patch) {\n return parsed1.patch > parsed2.patch ? 1 : -1;\n }\n\n // If both have prerelease, compare lexicographically\n // If only one has prerelease, it's considered lower\n if (parsed1.prerelease && parsed2.prerelease) {\n if (parsed1.prerelease === parsed2.prerelease) {\n return 0;\n }\n return parsed1.prerelease > parsed2.prerelease ? 1 : -1;\n }\n\n if (parsed1.prerelease && !parsed2.prerelease) {\n return -1; // v1 has prerelease, v2 doesn't, so v1 < v2\n }\n\n if (!parsed1.prerelease && parsed2.prerelease) {\n return 1; // v1 doesn't have prerelease, v2 does, so v1 > v2\n }\n\n return 0; // Both are release versions with same major.minor.patch\n}\n\n/**\n * Checks if version v1 is greater than version v2.\n * @param v1 - First version string\n * @param v2 - Second version string\n * @returns true if v1 > v2, false otherwise (including if either version is invalid)\n */\nexport function isVersionGreaterThan(v1: string, v2: string): boolean {\n const result = compareVersions(v1, v2);\n return result === 1;\n}\n","import { config, getBackendSrv } from '@grafana/runtime';\nimport { lastValueFrom } from 'rxjs';\nimport { useState, useEffect } from 'react';\nimport { ASSISTANT_PLUGIN_ID } from '../plugin';\nimport { isVersionGreaterThan } from './versionCompare';\nimport type { components } from './settings.gen';\n\n/**\n * The type of terms that apply to a tenant.\n * - 'msa': Master Service Agreement - only requires acceptance, no version checking\n * - 'termsAndConditions': Full terms and conditions - requires acceptance AND version checking\n */\nexport type TermsType = components['schemas']['TermsAndConditionsResponse']['termsType'];\n\n/**\n * Internal result type for fetching terms data.\n */\ninterface TermsCheckResult {\n accepted: boolean;\n termsType: TermsType;\n}\n\n/**\n * Event name that is dispatched when terms and conditions are accepted.\n * Other components can listen to this event to refresh their UI.\n */\nexport const TERMS_AND_CONDITIONS_REFRESH_EVENT = 'grafana-assistant-terms-and-conditions-refresh';\n\n/**\n * Internal function that fetches and evaluates terms data.\n * Returns both the acceptance status and the terms type.\n */\nasync function fetchTermsData(): Promise<TermsCheckResult> {\n const backendSrv = getBackendSrv();\n const appSubUrl = config?.appSubUrl ?? '';\n const apiUrl = `${appSubUrl}/api/plugins/${ASSISTANT_PLUGIN_ID}/resources/api/v1/settings/terms`;\n\n const response = await lastValueFrom(\n backendSrv.fetch({\n url: apiUrl,\n method: 'GET',\n showErrorAlert: false,\n })\n );\n\n // The API returns { status: \"success\", data: { ... } }, so we need to access response.data.data\n const responseBody = response.data as { data: components['schemas']['TermsAndConditionsResponse'] };\n const termsData = responseBody.data;\n\n const termsAccepted = termsData.acceptedTermsAndConditions ?? false;\n const acceptedVersion = termsData.acceptedVersion;\n const currentVersion = termsData.version;\n const termsType = termsData.termsType;\n\n // For MSA, we only check if terms are accepted\n if (termsType === 'msa') {\n return { accepted: termsAccepted, termsType };\n }\n\n // Check if terms are not accepted, or if no version was recorded or current version is missing\n if (!termsAccepted || !acceptedVersion || !currentVersion) {\n return { accepted: false, termsType };\n }\n\n // Check if the current version is newer than the accepted version\n const needsAcceptance = isVersionGreaterThan(currentVersion, acceptedVersion);\n return { accepted: termsAccepted && !needsAcceptance, termsType };\n}\n\n/**\n * Checks whether terms and conditions are accepted and up-to-date.\n * This function verifies that:\n * 1. Terms have been accepted\n * 2. The accepted version matches or exceeds the current version\n *\n * @returns A promise that resolves to `true` if terms are accepted and up-to-date, `false` otherwise\n * @throws Error if the API call fails\n *\n * @example\n * ```typescript\n * import { checkTerms } from '@grafana/assistant';\n *\n * const accepted = await checkTerms();\n * if (!accepted) {\n * // Show terms acceptance UI\n * console.log('Terms need to be accepted');\n * }\n * ```\n */\nexport async function checkTerms(): Promise<boolean> {\n try {\n const result = await fetchTermsData();\n return result.accepted;\n } catch (error) {\n // If API call fails, throw the error so callers can handle it\n throw new Error(`Failed to check terms requirements: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * React hook to check terms and conditions acceptance status.\n * Automatically fetches terms data on mount and re-fetches when terms change\n * (via TERMS_AND_CONDITIONS_REFRESH_EVENT).\n *\n * @returns An object containing whether terms are accepted, the terms type, loading state, and error state\n *\n * @example\n * ```typescript\n * import { useTerms } from '@grafana/assistant';\n *\n * function MyComponent() {\n * const { accepted, termsType, loading, error } = useTerms();\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error}</div>;\n * return <div>Terms accepted</div>;\n * }\n * ```\n */\nexport function useTerms() {\n const [accepted, setAccepted] = useState<boolean>(false);\n const [termsType, setTermsType] = useState<TermsType | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n async function fetchTerms() {\n try {\n setLoading(true);\n setError(null);\n const result = await fetchTermsData();\n setAccepted(result.accepted);\n setTermsType(result.termsType);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to check terms';\n setError(errorMessage);\n setAccepted(false);\n setTermsType(null);\n } finally {\n setLoading(false);\n }\n }\n\n fetchTerms();\n\n // Listen for the refresh event to re-fetch when terms change\n const handleTermsRefresh = () => {\n fetchTerms();\n };\n document.addEventListener(TERMS_AND_CONDITIONS_REFRESH_EVENT, handleTermsRefresh);\n return () => {\n document.removeEventListener(TERMS_AND_CONDITIONS_REFRESH_EVENT, handleTermsRefresh);\n };\n }, []);\n\n return {\n accepted,\n termsType,\n loading,\n error,\n };\n}\n","import { ToolInvokeOptions, ToolOutput, JSONSchema, JsonObject, InlineToolRunnable } from './types';\n\n/**\n * Creates a tool with the given implementation, schema, and metadata.\n * This is a zod-free implementation that accepts JSON Schema directly and a validation function.\n *\n * @param func The function implementation for the tool\n * @param options Tool configuration options\n * @returns A tool object that can be used in the agent\n */\nexport function createTool<T>(\n func: (input: T, options: ToolInvokeOptions) => Promise<ToolOutput>,\n options: {\n name: string;\n description: string;\n inputSchema: JSONSchema; // JSON Schema directly - no zod dependency!\n validate: (input: JsonObject) => T; // Validation function - replaces zod.parse()\n metadata?: {\n explainer?: (input?: T) => string;\n [key: string]: any;\n };\n verboseParsingErrors?: boolean;\n responseFormat?: 'content_and_artifact' | string;\n }\n): InlineToolRunnable {\n const { explainer, ...metadata } = options.metadata ?? {};\n const toolObj: InlineToolRunnable = {\n name: options.name,\n description: options.description,\n inputSchema: options.inputSchema,\n metadata: explainer\n ? {\n ...metadata,\n explainer: (input: JsonObject) => explainer(input as T),\n }\n : metadata,\n responseFormat: options.responseFormat,\n verboseParsingErrors: options.verboseParsingErrors,\n async invoke(input: JsonObject, invokeOptions: ToolInvokeOptions): Promise<ToolOutput> {\n try {\n if (invokeOptions.signal?.aborted) {\n throw new Error(`Tool ${options.name} execution was aborted`);\n }\n\n // Use the provided validation function instead of zod.parse()\n const parsedInput = options.validate(input);\n const functionPromise = func(parsedInput, invokeOptions);\n const promises = [functionPromise];\n\n if (invokeOptions.signal) {\n promises.push(\n new Promise((_, reject) => {\n invokeOptions.signal?.addEventListener(\n 'abort',\n () => {\n reject(new Error(`Tool ${options.name} execution was aborted`));\n },\n { once: true }\n );\n })\n );\n }\n\n // If we have a timeout, add a promise to handle it\n if (invokeOptions.timeout && invokeOptions.timeout > 0) {\n promises.push(\n new Promise((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Tool ${options.name} execution timed out after ${invokeOptions.timeout}ms`));\n }, invokeOptions.timeout);\n })\n );\n }\n\n // Race the function promise against the abort and timeout promises\n return Promise.race(promises);\n } catch (error) {\n // Handle parsing errors and wrap them in ToolError\n if (options.verboseParsingErrors) {\n console.error(`Error invoking tool ${options.name}:`, error, input);\n }\n throw error;\n }\n },\n };\n\n return toolObj;\n}\n","import { config, getBackendSrv } from '@grafana/runtime';\nimport { lastValueFrom } from 'rxjs';\nimport { useState, useEffect, useCallback } from 'react';\nimport { ASSISTANT_PLUGIN_ID } from '../plugin';\n\n/**\n * Event name dispatched when limits are updated via SSE.\n * Other components can listen to this event to get real-time updates.\n */\nexport const LIMITS_UPDATED_EVENT = 'grafana-assistant-limits-updated';\n\n/**\n * Detail payload for the LIMITS_UPDATED_EVENT custom event.\n */\nexport interface LimitsUpdatedEventDetail {\n count: number;\n limit: number;\n}\n\n/**\n * Result type for limits data.\n */\nexport interface LimitsData {\n /** Current prompt count for the month */\n count: number;\n /** Monthly prompt limit (0 = unlimited) */\n limit: number;\n /** Current month in YYYY-MM format */\n month: string;\n /** Whether the limit has been reached */\n isLimitReached: boolean;\n}\n\n/**\n * Internal function that fetches limits data from the API.\n */\nasync function fetchLimitsData(): Promise<LimitsData> {\n const backendSrv = getBackendSrv();\n const appSubUrl = config?.appSubUrl ?? '';\n const apiUrl = `${appSubUrl}/api/plugins/${ASSISTANT_PLUGIN_ID}/resources/api/v1/usage/limits/prompt`;\n\n const response = await lastValueFrom(\n backendSrv.fetch({\n url: apiUrl,\n method: 'GET',\n showErrorAlert: false,\n })\n );\n\n // The API returns { status: \"success\", data: { total, limit, month } }\n const responseBody = response.data as { data: { total: number; limit: number; month: string } };\n const limitsData = responseBody.data;\n\n const count = limitsData.total ?? 0;\n const limit = limitsData.limit ?? 0;\n const month = limitsData.month ?? '';\n\n return {\n count,\n limit,\n month,\n isLimitReached: limit > 0 && count >= limit,\n };\n}\n\n/**\n * Checks whether the user has reached their monthly prompt limit.\n *\n * @returns A promise that resolves to `true` if limits are reached, `false` otherwise\n * @throws Error if the API call fails\n *\n * @example\n * ```typescript\n * import { checkLimits } from '@grafana/assistant';\n *\n * const data = await checkLimits();\n * if (data.isLimitReached) {\n * console.log('Monthly limit reached');\n * }\n * ```\n */\nexport async function checkLimits(): Promise<LimitsData> {\n try {\n return await fetchLimitsData();\n } catch (error) {\n throw new Error(`Failed to check limits: ${error instanceof Error ? error.message : String(error)}`);\n }\n}\n\n/**\n * React hook to check user prompt limits.\n * Automatically fetches limits data on mount and listens to real-time updates\n * via the LIMITS_UPDATED_EVENT custom event.\n *\n * @returns An object containing limit data, loading state, error state, and refetch function\n *\n * @example\n * ```typescript\n * import { useLimits } from '@grafana/assistant';\n *\n * function MyComponent() {\n * const { count, limit, isLimitReached, loading, error, refetch } = useLimits();\n *\n * if (loading) return <div>Loading...</div>;\n * if (error) return <div>Error: {error}</div>;\n * if (isLimitReached) return <div>Monthly limit reached ({count}/{limit})</div>;\n * return <div>Prompts used: {count}/{limit || 'unlimited'}</div>;\n * }\n * ```\n */\nexport function useLimits() {\n const [count, setCount] = useState<number>(0);\n const [limit, setLimit] = useState<number>(0);\n const [month, setMonth] = useState<string>('');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n const fetchLimits = useCallback(async () => {\n try {\n setLoading(true);\n setError(null);\n const result = await fetchLimitsData();\n setCount(result.count);\n setLimit(result.limit);\n setMonth(result.month);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Failed to fetch limits';\n setError(errorMessage);\n setCount(0);\n setLimit(0);\n setMonth('');\n } finally {\n setLoading(false);\n }\n }, []);\n\n // Fetch on mount\n useEffect(() => {\n fetchLimits();\n }, [fetchLimits]);\n\n // Listen for real-time updates via custom event\n useEffect(() => {\n const handleLimitsUpdate = (event: Event) => {\n const customEvent = event as CustomEvent<LimitsUpdatedEventDetail>;\n if (customEvent.detail) {\n setCount(customEvent.detail.count);\n setLimit(customEvent.detail.limit);\n // Clear any previous error since we received valid data via SSE\n setError(null);\n }\n };\n\n window.addEventListener(LIMITS_UPDATED_EVENT, handleLimitsUpdate);\n\n return () => {\n window.removeEventListener(LIMITS_UPDATED_EVENT, handleLimitsUpdate);\n };\n }, []);\n\n // Calculate isLimitReached based on current state\n const isLimitReached = limit > 0 && count >= limit;\n\n return {\n count,\n limit,\n month,\n isLimitReached,\n loading,\n error,\n refetch: fetchLimits,\n };\n}\n"],"names":["__webpack_require__","module","getter","__esModule","d","a","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","hash","input","i","length","charCodeAt","toString","NodeData","constructor","params","text","this","id","type","bypassLimits","formatForLLM","codeElementIds","data","name","equals","other","StructuredNodeData","super","JSON","stringify","require","GLOBAL_REGISTRY_KEY","REGISTRY_CHANGE_EVENT","LEGACY_REGISTRY_UPDATE_EVENT","LEGACY_REGISTRY_REMOVE_EVENT","LEGACY_REGISTRY_SYNC_EVENT","getPageContextRegistry","window","setPageContextRegistry","newRegistry","skipLegacyEvents","dispatchEvent","CustomEvent","detail","registry","legacyBridgeInitialized","providePageContext","urlPattern","initialContext","pattern","RegExp","source","trim","console","warn","registration","generateRegistrationId","context","setContext","newContext","currentRegistry","index","findIndex","reg","unregister","filter","_","addEventListener","event","existingIndex","r","incomingRegistry","Array","isArray","currentIds","Set","map","newRegistrations","has","empty","useProvidePageContext","setContextRef","useRef","undefined","pendingUpdate","isModified","useEffect","current","contextToUse","useCallback","usePageContext","options","allowQuestions","allowComponents","pageContext","setPageContext","useState","location","useLocationService","currentPathnameRef","updateContext","currentUrl","activeContext","matchesUrlPattern","push","getActivePageContext","getLocation","pathname","handleRegistryChange","locationSub","getLocationObservable","subscribe","loc","unsubscribe","removeEventListener","filteredContext","item","node","prefix","Date","now","Math","random","slice","url","test","regexPattern","replace","ComponentNodeData","namespace","keys","components","join","prompt","usePageComponents","useMemo","allComponents","forEach","componentData","entries","componentName","component","provideComponents","flags","createAssistantContextItem","setter","newComponents","newPrompt","globalComponents","promptContext","DashboardNodeData","dashboardUid","dashboardTitle","folderUid","folderTitle","FolderNodeData","DatasourceNodeData","datasourceUid","datasourceType","datasourceName","img","uid","EntityNodeData","scope","env","site","Boolean","title","hidden","icon","entityType","properties","LabelNameNodeData","labelName","LabelValueNodeData","labelValue","operator","getDatasourceMeta","datasourceInstance","getDataSourceSrv","getInstanceSettings","meta","info","logos","small","defaultIcons","datasource","label_name","label_value","dashboard","dashboard_folder","unknown","structured","entity","skill","nodeData","error","createContextByType","defaultTitle","getTitleFromContextNode","getImgFromContextNode","navigable","selectable","occurrences","SkillNodeData","skillId","skillName","provideQuestions","initialQuestions","registrationId","convertQuestionsToContext","questions","question","setQuestions","newQuestions","useProvideQuestions","useQuestions","convertContextToQuestions","contextItems","InvestigationCreatedEvent","BusEventWithPayload","emitInvestigationCreated","investigationId","getAppEvents","publish","onInvestigationCreated","callback","subscription","payload","CALLBACK_EXTENSION_POINT","newFunctionNamespace","functions","getExposeAssistantFunctionsConfig","namespaces","targets","fn","ASSISTANT_PLUGIN_ID","ASSISTANT_PLUGIN_TITLE","MAX_RETRY_ATTEMPTS","INITIAL_RETRY_DELAY","MAX_RETRY_DELAY","isAssistantAvailable","getObservablePluginLinks","defer","extensionPointId","pipe","links","some","link","pluginId","throwError","retry","count","delay","retryCount","errorMessage","message","toLowerCase","includes","delayMs","min","pow","timer","catchError","of","OpenExtensionSidebarEvent","CloseExtensionSidebarEvent","BusEventBase","ToggleExtensionSidebarEvent","openAssistant","props","reportInteraction","from","origin","componentTitle","openExtensionSidebar","initialPrompt","initialAutoSend","autoSend","initialMode","mode","closeAssistant","closeExtensionSidebar","toggleAssistant","toggleExtensionSidebar","useAssistant","available","setAvailable","sub","isAvailable","isLoading","StyleSheet","_this","_insertTag","tag","before","tags","insertionPoint","nextSibling","prepend","container","firstChild","insertBefore","isSpeedy","speedy","ctr","nonce","_proto","hydrate","nodes","insert","rule","document","createElement","setAttribute","appendChild","createTextNode","createStyleElement","sheet","styleSheets","ownerNode","sheetForTag","insertRule","cssRules","e","flush","_tag$parentNode","parentNode","removeChild","abs","String","fromCharCode","assign","replacement","indexof","search","indexOf","begin","end","array","line","column","position","character","characters","root","parent","children","return","prev","next","peek","caret","token","alloc","dealloc","delimit","delimiter","whitespace","escaping","commenter","identifier","COMMENT","output","element","compile","parse","rules","rulesets","pseudo","points","declarations","offset","atrule","property","previous","variable","scanning","ampersand","reference","comment","declaration","ruleset","post","size","j","k","x","y","z","identifierWithPointTracking","fixedElements","WeakMap","compat","isImplicitRule","set","parsed","toRules","getRules","parentRules","removeLabel","defaultStylisPlugins","exec","unitlessKeys","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","msGridRow","msGridRowSpan","msGridColumn","msGridColumnSpan","fontWeight","lineHeight","opacity","order","orphans","scale","tabSize","widows","zIndex","zoom","WebkitLineClamp","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","memoize","cache","create","arg","hyphenateRegex","animationRegex","isCustomProperty","isProcessableValue","processStyleName","styleName","processStyleValue","match","p1","p2","cursor","styles","handleInterpolation","mergedProps","registered","interpolation","componentSelector","__emotion_styles","keyframes","anim","serializedStyles","string","asString","interpolated","_i","createStringFromObject","previousCursor","result","cached","labelPattern","serializeStyles","args","stringMode","strings","raw","lastIndex","identifierName","str","h","len","getRegisteredStyles","registeredStyles","classNames","rawClassName","split","className","insertWithoutScoping","serialized","inserted","merge","css","classnames","cls","toAdd","_createEmotion","ssrStyles","querySelectorAll","getAttribute","head","_insert","stylisPlugins","nodesToHydrate","attrib","currentSheet","collection","finalizingPlugins","serializer","concat","selector","shouldCache","createCache","_len","arguments","_key","registerStyles","insertStyles","cx","_len4","_key4","injectGlobal","_len3","_key3","_len2","_key2","animation","ids","bind","OpenAssistantButton","OpenAssistantButtonView","iconOnlyButton","onClick","useStyles2","getStyles","IconButton","variant","tooltip","Button","fill","button","theme","baseBackground","colors","secondary","main","elevatedBackground","emphasize","underlyingColor","background","canvas","outerRadius","shape","radius","default","innerRadius","gradientBorderLayer","content","inset","borderRadius","cornerShape","pointerEvents","solidBackgroundLayer","transition","label","width","maxWidth","isolation","border","padding","spacing","defaultDropdownButtonWidths","sm","md","lg","OpenAssistantSplitButton","OpenAssistantSplitButtonView","menuItems","dropdownButtonWidth","hasMenuItems","resolvedDropdownButtonWidth","wrapperContent","wrapper","ButtonGroup","buttonGroup","segmentButton","mainButtonSplit","mainButtonSolo","Dropdown","overlay","dropdownButton","style","minWidth","Tooltip","dividerColor","weak","display","gap","overflow","boxShadow","borderTopLeftRadius","borderBottomLeftRadius","borderTopRightRadius","borderBottomRightRadius","alignItems","justifyContent","margin","getBackgroundGradientColors","defaultGradientColors","matches","gradients","brandHorizontal","createBorderAnimation","backgroundColor","color1","color2","animationSteps","animationFrames","gradientColor1","gradientColor2","finalColor1","finalColor2","step","backgroundImage","GLOBAL_FACTORY_KEY","GLOBAL_INITIALIZER_KEY","GLOBAL_INITIALIZATION_PROMISE_KEY","setInlineAssistantFactory","existing","setInlineAssistantInitializer","async","ensureInlineAssistantInitialized","initializer","Error","existingPromise","initPromise","err","getInlineAssistantFactory","factory","useInlineAssistant","isGenerating","setIsGenerating","setContent","setError","assistantRef","reset","cancel","generate","sendPrompt","agentName","agentId","systemPrompt","tools","onStart","onDelta","delta","onComplete","onError","dispose","useAIGeneration","onChange","disabled","autoGenerate","streaming","getUserPrompt","hasAutoGenerated","valueBeforeGeneration","displayValue","resolvedPrompt","isSendDisabled","doGenerate","handleGenerate","GENERATING_PHRASES","useGeneratingPlaceholder","defaultPlaceholder","phrase","setPhrase","wasGenerating","floor","AITextInput","placeholder","dataTestId","activePlaceholder","addonAfter","animatedWrapper","Input","onKeyDown","metaKey","ctrlKey","preventDefault","currentTarget","suffix","invalid","primary","borderAnimation","backgroundOrigin","backgroundClip","AITextArea","rows","effectiveRows","max","textareaWrapper","TextArea","textarea","sendButton","paddingRight","minHeight","scrollbarWidth","right","top","queryIsEmpty","query","dataQueryProps","QueryWithAssistantButton","currentQuery","queries","dataSourceInstanceSettings","app","datasourceApi","CoreApp","Unknown","hasCurrentQuery","otherQueries","q","refId","queryDisplayText","getQueryDisplayText","isUpdating","actionText","codeBlockLines","actionableSentence","parseVersion","version","parts","versionPart","prerelease","numbers","Number","isNaN","major","minor","patch","TERMS_AND_CONDITIONS_REFRESH_EVENT","fetchTermsData","backendSrv","getBackendSrv","apiUrl","config","appSubUrl","termsData","lastValueFrom","fetch","method","showErrorAlert","termsAccepted","acceptedTermsAndConditions","acceptedVersion","currentVersion","termsType","accepted","needsAcceptance","v1","v2","parsed1","parsed2","compareVersions","checkTerms","useTerms","setAccepted","setTermsType","loading","setLoading","fetchTerms","handleTermsRefresh","createTool","func","explainer","metadata","toolObj","description","inputSchema","responseFormat","verboseParsingErrors","invoke","invokeOptions","signal","aborted","parsedInput","validate","promises","Promise","reject","once","timeout","setTimeout","race","LIMITS_UPDATED_EVENT","fetchLimitsData","limitsData","total","limit","month","isLimitReached","checkLimits","useLimits","setCount","setLimit","setMonth","fetchLimits","handleLimitsUpdate","customEvent","refetch"],"ignoreList":[],"sourceRoot":""}