{"version":3,"file":"discourse-ai.js","names":["define","_exports","Object","defineProperty","value","default","resource","path","map","this","route","resetNamespace","_rest","Adapter","jsonMode","basePath","pathFor","store","type","findArgs","pluralize","apiNameFor","appendQueryParams","AiFeatureAdapter","AiToolAdapter","_ajax","AiEmbedding","createProperties","getProperties","updateProperties","attrs","id","testConfig","ajax","data","ai_embedding","workingCopy","createRecord","AiFeature","AiLlm","llm_quotas","llmConfig","ai_llm","_utilities","CREATE_ATTRIBUTES","SYSTEM_ATTRIBUTES","AiPersona","createUser","result","user","user_id","flattenedToolStructure","tools","tName","toolOptions","forcedTools","includes","populateTools","flatTools","tool","toolId","options","force","mappedOptions","optionId","hasOwnProperty","keys","length","push","system","fromPOJO","dataClone","toPlainObject","persona","create","toPOJO","forced_tool_count","response_format","examples","rag_uploads","_trackedBuiltIns","AiTool","trackParameters","parameters","TrackedArray","p","parameter","TrackedObject","enum","_component","_component2","_dIcon","_number","_getUrl","_templateFactory","AdminReportEmotion","dt7948","c","todayLink","date","moment","format","_filterURL","yesterdayLink","subtract","lastSevenDaysLink","lastThirtyDaysLink","_baseFilter","_model","model","setComponentTemplate","createTemplateFactory","block","moduleName","scope","isStrictMode","attributeBindings","classNames","_tracking","_helper","_modifier","_object","_didInsert","_service","_emberModifier","_dButton","_horizontalOverflowNav","_postList","_dTooltip","_bodyClass","_categoryBadge","_replaceEmoji","_ajaxError","_later","_category","_post","_truthHelpers","_discourseI18n","_doughnutChart","_aiSentimentHorizontalBar","AdminReportSentimentAnalysis","g","prototype","service","router","i","tracked","selectedChart","posts","hasMorePosts","nextOffset","showingSelectedChart","activeFilter","shareIcon","setActiveFilter","modifier","element","clearActiveFilters","querySelector","classList","add","filterButtons","querySelectorAll","button","remove","calculateNeutralScore","total_count","positive_count","negative_count","sentimentMapping","sentiment","text","i18n","icon","groupingType","localePrefix","args","category_name","colors","currentGroupFilter","available_filters","find","filter","currentSortFilter","transformedData","category","findById","category_id","title","tag_name","scores","score_map","positive","neutral","negative","total_score","widths","filteredPosts","list","post","topic_title","postFilters","action","postRequest","group_by","group_value","start_date","end_date","offset","openToChart","queryParams","currentRoute","response","has_more","next_offset","e","popupAjaxError","n","showDetails","currentQueryParams","currentFilters","filters","JSON","parse","transitionTo","name","fetchMorePosts","mappedPosts","backToAllCharts","shareChart","url","currentURL","clipboardCopy","getAbsoluteURL","on","fn","and","_template","_htmlClass","AiArtifactComponent","siteSettings","expanded","showingArtifact","constructor","super","arguments","keydownHandler","handleKeydown","bind","popStateHandler","handlePopState","window","addEventListener","willDestroy","removeEventListener","event","key","history","back","state","artifactId","requireClickToRun","ai_artifact_security","autorun","artifactUrl","artifactVersion","showArtifact","toggleView","pushState","location","href","wrapperClasses","seamless","setDataAttributes","dataAttributes","entries","forEach","setAttribute","heightStyle","artifactHeight","height","parseInt","isNaN","htmlSafe","showFooter","_didUpdate","_willDestroy","_runloop","_concatClass","Block","show","shown","blinking","AiBlinkingAnimation","blocks","Array","from","nextBlockBlinkingTimer","blockBlinkingTimer","blockShownTimer","setupAnimation","onBlinking","nextBlock","onShowing","at","teardownAnimation","cancel","currentBlock","indexOf","_owner","_pluginOutlet","_userAutocompleteResults","_lazyHash","_hashtagAutocomplete","_textareaTextManipulation","_uppyUpload","_uppyMediaOptimizationPlugin","_userSearch","_userStatusOnAutocomplete","_dAutocomplete","_aiPersonaLlmSelector","AiBotConversations","aiCredits","aiBotConversationsHiddenSubmit","capabilities","mediaOptimizationWorker","site","tooltip","creditStatus","selectedLlmId","uploads","textarea","uppyUpload","fileInputEl","creditLimitTooltipModifier","isSubmitDisabled","instance","register","identifier","content","getCreditLimitMessage","placement","triggers","interactive","trapTab","destroy","handlePaste","document","activeElement","canUpload","canPasteHtml","types","clipboardHelpers","clipboardData","files","addFiles","pasted","init","getOwner","useMultipartUploadsIfAvailable","uppyReady","composer_media_optimization_image_enabled","uppyWrapper","useUploadPlugin","optimizeFn","opts","optimizeImage","runParallel","isMobileDevice","onPreProcessProgress","file","inProgressUpload","inProgressUploads","upl","processing","onPreProcessComplete","uploadDone","upload","onProgressUploadsChanged","notifyPropertyChange","teardown","autocomplete","loading","showUploadsContainer","hard_limit_reached","setPersonaId","personaId","checkCreditStatus","setLlmId","llmModelId","getPersonaCreditStatus","getLlmModelCreditStatus","setTargetRecipient","username","targetUsername","updateInputValue","_autoExpandTextarea","inputValue","target","handleKeyDown","tagName","shiftKey","prepareAndSubmitToBot","setTextArea","setupAutocomplete","scheduleOnce","focusTextarea","focus","applyUserAutocomplete","applyHashtagAutocomplete","enable_mentions","autocompleteHandler","TextareaAutocompleteHandler","component","TRIGGER_KEY","dataSource","term","destroyUserStatuses","includeGroups","then","initUserStatusHtml","users","onRender","renderUserStatusHtml","fixedTextareaPosition","autoSelectFirstSuggestion","transformComplete","obj","validateSearchResult","afterComplete","onClose","hashtagConfig","hashtag_configurations","hashtagAutocompleteOptions","registerFileInput","setup","openFileUpload","click","removeUpload","u","cancelUpload","cancelSingleUpload","fileId","submitToBot","inProgressUploadsCount","error","style","scrollHeight","maxHeight","getComputedStyle","overflowY","_aiConversationsSidebarManager","AiBotHeaderIcon","appEvents","currentUser","navigationMenu","sidebarState","aiConversationsSidebarManager","bots","availableBots","ai_enabled_chat_bots","bot","is_persona","has_default_llm","Boolean","model_name","showHeaderButton","ai_bot_add_to_header","clickShouldRouteOutOfConversations","isHeaderDropdownMode","currentPanel","AI_CONVERSATIONS_PANEL","lastKnownAppURL","onClick","trigger","_templateOnly","undefined","_backToForum","AiBotSidebarNewConversation","shouldRender","isCurrentPanel","shouldShowBackLink","getElementById","routeTo","currentRouteName","outletArgs","toggleNavigationMenu","_dToast","_dToastInstance","_aiHelperOptionsList","_diffModal","_thumbnailSuggestions","AiComposerHelperMenu","modal","newSelectedText","diff","customPromptValue","noContentError","prompts","promptTypes","toolbarEvent","getText","helperOptions","ai_helper_prompts","siteLocale","default_locale","locale","available_locales","l","translatedName","language","translated_name","customPromptIndex","findIndex","customPrompt","splice","unshift","can_use_custom_prompts","reduce","memo","prompt_type","toast","owner","close","duration","theme","message","suggestChanges","option","mode","selectedText","thumbnails","thumbnailSuggestions","showResultAsDiff","revert","undoAiAction","closeMenu","_formatter","AiCreditBar","barClass","classes","allocation","soft_limit_reached","compact","join","fillStyle","percentage_remaining","barText","remaining","number","credits_remaining","total","daily_credits","percentage","tooltipText","formattedDate","Date","next_reset_at","toLocaleString","month","day","hour","minute","timeZone","time","shouldShowTooltip","showTooltip","_siteSetting","_siteSetting2","AiDefaultLlmSelector","defaultLlmSetting","loadDefaultLlmSetting","site_settings","plugin","setting","_adminSectionLandingItem","_adminSectionLandingWrapper","_backButton","_conditionalLoadingSpinner","_form","_arrayTools","AiEmbeddingEditor","toasts","dialog","isSaving","selectedPreset","testRunning","testResult","testError","currentProvider","provider","formData","originalData","stringify","_originalFormData","cached","selectedProviders","embeddings","resultSetMeta","providers","prov","provName","distanceFunctions","t","df","distance_functions","presets","preset","display_name","preset_id","showPresets","isNew","metaProviderParams","provider_params","testErrorMessage","displayTestResult","seeded","configurePreset","item","setProvider","set","params","initialParams","providerParams","acc","field","values","v","normalizeParam","resetForm","save","dataToSave","newModel","addUniqueValueToArray","savedProvider","success","later","test","testModel","configTestResult","confirm","didConfirm","destroyRecord","removeValueFromArray","catch","providerKeys","concat","not","get","eq","_adminConfigAreaEmptyList","_dBreadcrumbsItem","_dPageSubheader","_aiEmbeddingEditor","AiEmbeddingsListEditor","adminPluginNavManager","hasEmbeddingElements","_routing","ExpandableList","isExpanded","maxItemsToShow","hasMore","items","visibleItems","slice","remainingCount","expandToggleLabel","count","toggleExpanded","isLastItem","index","AiFeatureCard","hasGroups","feature","groupList","groups","groupIds","Set","personas","allowed_groups","group","has","LinkTo","_listSetting","AiFeatureSettingField","parseList","toString","split","serializeList","callback","isArray","groupChoices","hasEnumChoices","valid_values","compactListChoices","String","choices","controlType","list_type","_aiFeatureCard","AiFeaturesList","sortedModules","modules","toSorted","a","b","module_name","localeCompare","isSpamModule","aModule","isAutomationModule","featureName","transitionToAutomations","_dSelect","_filterInput","_aiDefaultLlmSelector","_aiFeaturesList","CONFIGURED","UNCONFIGURED","AiFeatures","filterValue","selectedFeatureGroup","features","f","module_enabled","featureGroupOptions","label","filteredFeatures","trim","toLowerCase","featureMatches","module","personaMatches","some","llmMatches","llm_models","llm","groupMatches","console","matchingFeatures","assign","onFilterChange","onFeatureGroupChange","resetAndFocus","hash","_dToggleSwitch","_fullPageSearch","_search","_aiIndicatorWave","AI_RESULTS_TOGGLED","AiFullPageSearch","searching","AiResults","showingAiResults","sortOrder","autoEnabledForZeroResults","shouldAutoEnableWhenAiReady","initialSearchTerm","searchTerm","onSearch","onSearchResultsLoaded","off","searchEnabled","resetAiResults","performHyDESearch","hasZeroRegularResults","addSearchResults","enabled","disableToggleSwitch","validSearchOrder","categories","tags","searchStateText","settled","noResults","searchType","SEARCH_TYPE_DEFAULT","isValidSearchTerm","searchClass","toggleAiResults","q","async","translateResults","results","generatedByAi","finally","sortChanged","_dropdownMenu","_dMenu","_gists3","AiGistToggle","gists","buttons","TABLE_LAYOUT","TABLE_AI_LAYOUT","description","selectedOptionId","currentPreference","currentButton","onRegisterApi","api","dMenu","onSelect","setPreference","_withEventValue","AiHelperCustomPrompt","sendInput","submit","promptArgs","AiHelperLoading","_keyboardShortcuts","_aiHelperCustomPrompt","AiHelperOptionsList","showShortcut","desktopView","shortcutVisible","shortcut","translateModKey","PLATFORM_KEY_MODIFIER","indicatorDots","AiIndicatorWave","DEFAULT_CHOICES","AiLlmAttachmentTypes","currentValue","settingChoices","uniqueItemsFromArray","sort","handleChange","newValues","normalized","onChange","_adminUser","_boundAvatarTemplate","_aiLlmAttachmentTypes","_aiQuotaDurationSelector","_aiLlmQuotaModal","AiLlmEditorForm","testValidationErrors","llmTemplate","modelName","info","llms","modelInfo","models","max_prompt_tokens","tokens","max_output_tokens","tokenizer","endpoint","computeProviderParams","input_cost","output_cost","cached_input_cost","vision_enabled","cache_write_cost","allowed_attachment_types","api_key","tokenizers","adminUser","modulesUsingModel","usedBy","used_by","m","inUseWarning","settings","showAddQuotaButton","currentParams","fromEntries","k","canEditURL","openAddQuotaModal","addItemToCollection","updatedData","replaceWith","testData","validation_errors","providerParamsKeys","gt","_aiLlmEditorForm","AiLlmEditor","_comboBox","AiLlmSelector","_aiCreditBar","_aiLlmEditor","AiLlmsListEditor","formatResetDate","dateString","modelDescription","replace","lookup","ignoreMissing","preseededDescription","isPreseeded","sanitizedTranslationKey","hasLlmElements","preconfiguredTitle","preConfiguredLlms","llmsContent","transitionToLlmEditor","localizeUsage","usage","_constants","_group","_groupChooser","_aiPersonaResponseFormatEditor","_aiLlmSelector","_aiPersonaExample","_aiPersonaToolOptions","_aiToolSelector","_ragOptionsFk","_ragUploader","PersonaEditor","allGroups","dirtyFormData","mapToolOptions","chatPluginEnabled","chat_enabled","allTools","maxPixelValues","forcedToolStrategies","updateAllGroups","findAll","include_everyone","AUTO_GROUPS","everyone","personaToSave","sortPersonas","userClone","toggleEnabled","dirtyData","persistField","togglePriority","form","updateUploads","newUploads","plainUploads","currentUploads","updatedUploads","updateToolNames","currentData","updatedTools","removedTools","ct","updatedOptions","setProperties","updatedForcedTools","fct","availableForcedTools","addExamplesPair","newExamples","currentOptions","toolNames","newValue","updatedDirtyData","update","priority","exportPersona","exportUrl","or","AiPersonaCollapsableExample","collapsed","caretIcon","toggleExample","deletePair","examplesCollection","exampleNumber","exampleTitle","_adminFilterControls","_avatar","_aiPersona","_aiPersonaEditor","LAYOUT_BUTTONS","AiPersonaListEditor","keyValueStore","currentLayout","savedLayoutId","found","searchableProps","dropdownOptions","filterFn","oldValue","err","onLayoutSelect","layoutId","importPersona","fileInput","createElement","accept","display","onchange","handleFileSelect","body","appendChild","removeChild","reader","FileReader","onload","json","uploadPersona","alert","readAsText","personaData","payload","contentType","existingPersona","jqXHR","status","responseJSON","errors","confirmButtonLabel","_dropdownSelectBox","PERSONA_SELECTOR_KEY","LLM_SELECTOR_KEY","AiPersonaLlmSelector","allowLLMSelector","botOptions","loadStoredPersona","loadStoredLlm","next","resetTargetRecipients","composer","hasLlmSelector","ai_enabled_personas","enabledPersonas","allow_personal_messages","filterable","_value","setItem","setAllowLLMSelector","innerPersona","force_default_llm","currentLlm","llm_model_id","botUsername","llmOptions","showPersonaSelector","showLLMSelector","getPersonaIdFromAttrs","personaName","getLlmIdFromAttrs","llmName","getItem","llmId","llmOption","innerLlmOption","AiPersonaToolOptions","showToolOptions","toolsMetadata","metadata","formObjectKeys","toolOptionKeys","_cookText","_fastEdit","_fastEdit2","_decorators","_text","_aiHelperLoading","_aiErrors","_smoothStreamer3","AiPostHelperMenu","messageBus","menu","MENU_STATES","menuState","suggestion","copyButtonIcon","copyButtonLabel","showFastEdit","showAiButtons","streaming","lastSelectedOption","isSavingFootnote","supportsFastEdit","supportsAddFootnote","smoothStreamer","showFootnoteTooltip","_activeAiRequest","footnoteDisabled","_showUserCustomPrompts","canEditPost","highlightedTextToggleIcon","showHighlightedText","allowInsertFootnote","enable_markdown_footnotes","display_footnotes_inline","_sanitizeForFootnote","sanitize","progressChannel","_progressChannel","unsubscribe","subscribe","_updateResult","isAiCreditLimitError","popupAiCreditLimitError","done","updateResult","toggleHighlightedTextPreview","performAiSuggestion","streamableOptions","streamedResult","_handleStreamedResult","progress_channel","method","quoteState","buffer","custom_prompt","suggestions","_handleProofreadOption","getByIdentifier","post_id","postId","client_id","clientId","initialValue","closeFastEdit","cancelAiAction","abort","copySuggestion","setTimeout","hideToolbar","insertFootnote","sanitizedSuggestion","credits","withFootnote","newRaw","raw","DURATION_PRESETS","seconds","nameKey","DurationSelector","selectedPresetId","customHours","Math","round","presetOptions","isCustom","currentDurationSeconds","onPresetChange","updateValue","onCustomHoursChange","AiRegenSummariesButtons","showGistOption","can_request_gists","topicIds","dataPayload","topic_id","topic_ids","regenerateGists","onLoadingChange","onSuccess","regenerateSummaries","AiSearchDiscoveriesTooltip","discobotDiscoveries","_interceptClick","_url","_topic","_aiBlinkingAnimation","AiSearchDiscoveries","search","loadingConversationTopic","fullDiscoveryToggled","discoveryPreviewLength","triggerDiscovery","_updateDiscovery","query","onDiscoveryUpdate","activeGlobalSearchTerm","toggleLabel","toggleIcon","canShowExpandtoggle","loadingDiscoveries","streamedText","renderPreviewOnly","canContinueConversation","discoveryTimedOut","discoverPersona","ai_discover_persona","discoverPersonaHasBot","discovery","isStreaming","continueConvoBtnLabel","toggleDiscovery","handleDiscoveryClick","link","closest","wantsNewWindow","preventDefault","closeSearchMenu","continueConversation","context","continueRequest","topicJSON","topic","afterRouteComplete","focusComposer","AiSentimentHorizontalBar","_adminConfigAreaCard","_dStatTiles","_spamTestModal","AiSpam","scanned_count","spam_detected","false_positives","false_negatives","daily_data","stats","isEnabled","selectedLLM","selectedPersonaId","customInstructions","initializeFromModel","spam_scanning_user","admin","fixScanUserNotAdmin","spamScanningUser","reload","is_enabled","llm_id","availableLLMs","autoSelectedLLM","custom_instructions","ai_persona_id","available_llms","updateLLM","updatePersona","showTestModal","metrics","detected","falsePositives","falseNegatives","flagging_username","spam_score_type","AiSplitTopicSuggester","SUGGESTION_TYPES","tag","input","selectedPosts","cooked","disabled","loadSuggestions","suggestionIds","assistant","s","suggestedCategories","applySuggestion","updateAction","updatedTags","AiSummarySkeleton","_aiToolTestModal","AiToolEditorForm","uploadedFiles","PARAMETER_TYPES","editingModel","mappedParameter","isEnum","ragUploads","plainRagUploads","tool_name","summary","script","toggleIsEnum","parentName","copiedData","uniqueUploads","openTestModal","currentParameterSelection","ragUploadsDescription","rag_images_enabled","exportTool","_aiToolEditorForm","AiToolEditor","_aiTool","AiToolListEditor","expandedCategory","dropdownPresets","is_category","categoryPresets","customPreset","otherPresets","lastIndexOfPresets","expandCategory","collapseCategory","resetMenuState","routeToNewTool","presetId","importTool","uploadTool","ai_tool","toolData","existingTool","_multiSelect","AiToolSelector","AiTopicGist","shouldShow","prefersTableAiLayout","showToggle","hasGist","gist","escapedExcerpt","_chart","AiTranslations","languageNameLookup","translation_progress","posts_with_detected_locale","translation_enabled","no_locales_configured","translationEnabled","content_localization_supported_locales","selectedLocales","originalLocales","isSavingLocales","isTogglingTranslation","hourly_rate","hourlyRate","creditCheckComplete","_checkCredits","getFeatureCreditStatus","creditLimitReached","creditLimitWarningMessage","resetTime","reset_time_formatted","reset_time_absolute","reset_time","localesChanged","showLocaleSelector","showLocalizationSettingsButton","isToggleDisabled","availableLocales","locales","settingsUrl","urlFor","translation_id","descriptionTooltip","navigateToLocalizationSettings","updateSelectedLocales","saveLocales","content_localization_enabled","cancelLocales","resetLocales","toggleTranslationEnabled","ai_translation_enabled","chartRightPadding","max","descriptionKey","backfillStatusMessage","backfill_enabled","backfill_max_age_days","totalRemaining","sum","hoursRemaining","cutoffDate","setDate","getDate","toLocaleDateString","year","timeKey","minutes","ceil","hours","days","eta","chartColors","styles","progress","getPropertyValue","chartConfig","processedData","rawPercentage","donePercentage","trunc","localeName","getLanguageName","languageNameForTooltip","labels","datasets","totalItems","backgroundColor","barThickness","borderRadius","plugins","afterDraw","ctx","scales","textBaseline","fillText","x","getPixelForValue","y","canvas","parentElement","restore","indexAxis","responsive","maintainAspectRatio","layout","padding","right","beginAtZero","grid","ticks","color","legend","displayColors","callbacks","dataset","dataIndex","datalabels","formatter","mobileView","_dateTimeInputRange","AiUsage","toDate","startDate","endDate","selectedFeature","selectedModel","selectedPeriod","isCustomDateActive","loadingData","fetchData","timezone","user_option","tz","guess","onFeatureChanged","onModelChanged","addCurrencyChar","innerText","valueElement","takeUsers","start","end","userSplitPoint","normalizeTimeSeriesData","interval","period","dataMap","Map","d","currentMoment","isSameOrBefore","dateKey","existingData","total_tokens","total_cache_read_tokens","total_cache_write_tokens","total_request_tokens","total_response_tokens","total_requests","total_spending","normalizedData","chartEl","computedStyle","request","cacheRead","cacheWrite","row","stacked","modelsWithCredits","credit_allocation","modelsWithoutCredits","featuresTotals","totalSpending","costType","getFeatureCostType","feature_name","getCostOnlySpending","input_spending","cache_read_spending","cache_write_spending","output_spending","usage_count","modelsWithoutCreditsTotals","usersTotals","formatSpending","toFixed","feature_models","hasIncluded","hasCost","getIncludedModelsForFeature","getCostModelsForFeature","hasIncludedModelsForFeature","hasCostModelsForFeature","availableFeatures","_cachedFeatures","availableModels","_cachedModels","periodOptions","setPeriodDates","now","clone","onPeriodSelect","onCustomDateClick","onDateChange","onChangeDateRange","to","_startDate","_endDate","onRefreshDateRange","fromDate","inputSpending","cacheReadSpending","cacheWriteSpending","outputSpending","_aiRegenSummariesButtons","BulkActionsAiRegenSummaries","topics","handleLoadingChange","isLoading","DoughnutChart","canvasSize","config","totalScore","cutout","radius","displayLegend","position","chart","cssVarColor","documentElement","cssFontSize","cssFontFamily","chartArea","centerX","left","centerY","top","bottom","textAlign","font","meta","getDatasetMeta","tooltipPosition","nonZeroCount","_dModal","AiLlmQuotaModal","quota","group_name","group_id","closeModal","onSave","availableGroups","existingQuotaGroupIds","max_tokens","max_usages","duration_seconds","asSeconds","setGroupId","validateForm","addError","removeError","_jsonSchemaEditor","AiPersonaResponseFormatEditor","showJsonEditorModal","jsonSchema","uniqueItems","properties","array_type","dependencies","required","editorTitle","responseFormatAsJSON","displayJSON","toDisplay","keyDesc","prettyJSON","openModal","updateResponseFormat","AiRegenSummariesModal","handleSuccess","_aiSummarySkeleton","AiSummaryModal","summarizedOn","summarizedBy","newPostsSinceSummary","outdated","canRegenerate","currentIndex","outdatedSummaryWarningText","outdatedText","topRepliesSummaryEnabled","resetSummary","resetStreaming","_channel","postStream","topicId","baseSummarizationURL","channel","_updateSummary","generateSummary","fetchURL","_requestSummary","regenerateSummary","ai_topic_summary","summarized_text","topicSummary","shortDateNoYear","updated_at","algorithm","new_posts_since_summary","can_regenerate","handleClose","triggerElement","array","AiToolTestModal","parameterValues","updateParameter","runTest","jsonToHtml","output","_conditionalLoadingSection","_dModalCancel","ChatModalChannelSummary","sinceHours","availableSummaries","sinceOptions","channelId","summarize","since","_utilities2","DebugAiModal","justCopiedText","activeTab","loadApiRequestInfo","htmlContext","parsed","formattedResponse","raw_response_payload","raw_request_payload","safe","line","escapeExpression","copyRequest","copy","copyResponse","loadLog","logId","prevLog","prev_log_id","nextLog","next_log_id","requestActive","responseActive","requestClicked","responseClicked","_diffStreamer3","ModalDiffModal","finalResult","escapedSelectedText","diffStreamer","diffResult","smoothStreamerResult","renderedText","isDone","primaryBtnLabel","primaryBtnDisabled","cleanup","resetState","cleanupAndClose","force_default_locale","triggerConfirmChanges","replaceText","focusConfirmBtn","reset","ShareModal","shareKey","share_key","generateShareURL","Blob","primaryLabel","deleteLink","share","clipboardCopyAsync","maybeCopyEmbed","contains","stopPropagation","version","artifactEmbed","promise","Promise","resolve","_aiBotHelper","_copyConversation","contextValue","maxContext","allPosts","postNumbers","post_number","postNumber","findPostIdForPostNumber","findLoadedPost","updateHtmlContext","copyContext","shareConversationModal","showShareConversationModal","Input","SpamTestModal","postUrl","isSpam","reason","systemPrompt","sentMessage","scanHistory","post_url","is_spam","llm_name","system_prompt","sent_message","scan_history","_thumbnailSuggestionItem","ThumbnailSuggestions","selectedImages","findThumbnails","isDisabled","addSelection","selection","thumbnailMarkdown","original_filename","width","short_url","removeSelection","thumbnail","appendSelectedImages","imageMarkdown","dEditorInput","setSelectionRange","execCommand","regenerateThumbnails","ModelAccuracies","AiCancelStreamingButton","cancelStreaming","_debugAiModal","AiDebugButton","isPostFromAiBot","debugAiResponse","AiRetryStreamingButton","retrying","retry","_shareModal","shareAiResponse","showFeedback","AiPersonaFlair","isGPTBot","AiCancelStreaming","RagOptionsFk","showIndexingOptions","toggleIndexingOptions","indexingOptionsText","visionLlms","RagUploadProgress","updatedProgress","trackProgress","onIndexingUpdate","indexed","calculateProgress","fullyIndexed","ragIndexingStatuses","_debounce","_trackedTools","_ragUploadProgress","RagUploader","filteredUploads","trackedArray","maxFiles","uploadUrl","preventDirectS3Uploads","uploadedFile","newUpload","statusText","debouncedSearch","didReceiveAttrs","cancelAllUploads","targetName","statuses","_updateTargetWithUploads","acceptedFileTypes","allowImages","submitFiles","openPicker","cancelUploading","toUpperCase","onRemove","_reviewableCreatedBy","_reviewablePostHeader","_chatChannelTitle","_chatChannel","_modelAccuracies","ReviewableAiChatMessage","chatChannel","reviewable","chat_channel","_reviewablePostEdits","_reviewableTopicLink","ReviewableAiPost","_createdBy","_topicLink","_highlightWatchedWords","_channelTitle","ReviewableRefreshAiChatMessage","messageCooked","message_cooked","_aiHelperSuggestions","AiCategorySuggester","untriggers","triggerIcon","showSuggestionButton","composerFields","reply","showTrigger","MIN_CHARACTER_COUNT","topicState","ai_embeddings_enabled","showDropdown","buffered","showSuggestionsError","_discourseTag","AiTagSuggester","disableTagsChooser","tagSelectorHasValues","removedAppliedTag","maxTags","max_tags_per_topic","class","AiTitleSuggester","editTopicTitleField","ThumbnailSuggestionItem","selected","selectIcon","selectLabel","toggleSelection","AISentimentDashboard","ai_sentiment_enabled","_aiCategorySuggester","_showAiHelper","AiCategorySuggestion","showComposerAiHelper","_aiTagSuggester","AiTagSuggestion","_aiTitleSuggester","AiTitleSuggestion","_default","composerModel","renderChatWarning","ai_bot_enable_chat_warning","aiBotClasses","computed","isAiBotChat","targetRecipients","recipients","_aiGistToggle","FilterGistToggle","topicThumbnails","enabledForRoute","SearchResultDecoration","BotSelector","isBotMessage","setPersonaIdOnComposer","metaData","setTargetRecipientsOnComposer","_dTextarea","_autoFocus","AiImageCaptionContainer","imageCaptionPopup","updateCaption","newCaption","saveCaption","hidePopup","resizeTextarea","borderTopWidth","borderBottomWidth","scrollTop","showPopup","_request","toggleLoadingState","AiEditSuggestionButton","showPostAIHelper","_activeAIRequest","prompt","suggest","_aiSearchDiscoveries","_aiSearchDiscoveriesTooltip","AiFullPageDiscobotDiscoveries","ai_discover_enabled","can_use_ai_discover_persona","ai_search_discoveries","creditsAvailable","checkCredits","isFeatureCreditAvailable","previewLength","viewport","md","_aiFullPageSearch","AiFullPageSearchConnector","ai_embeddings_semantic_search_enabled","AiPostMenuTranslationExtras","discourse_ai_enabled","can_localize_content","translate","confirmMessage","yesNoConfirm","_aiPostHelperMenu","AiPostHelperTrigger","postHighlighted","currentMenu","menuData","selectedRange","highlightSelectedText","range","startContainer","nodeType","Node","TEXT_NODE","startOffset","newStartNode","splitText","setStart","endContainer","endOffset","walker","createTreeWalker","commonAncestorContainer","NodeFilter","SHOW_TEXT","acceptNode","node","intersectsNode","FILTER_ACCEPT","FILTER_REJECT","textNodes","currentNode","nextNode","textNode","highlight","cloneNode","parentNode","replaceChild","getSelection","removeAllRanges","removeHighlightedText","span","createTextNode","textContent","showAiPostHelperMenu","closeOnScroll","modalForMobile","fallbackPlacements","updateOnScroll","_loadingSpinner","AiQuickSearchLoader","quickSearch","_searchMenu","_search3","AiQuickSearch","ai_embeddings_semantic_quick_search_enabled","hasAiResults","searchingWithAi","lastSearchTerm","markAiResults","resultsContainer","resultTypes","resultType","aiGenerated","listItem","totalResults","hasModifiers","MODIFIER_REGEXP","shouldAddAiResults","searchingForTopics","searchTopics","hasSearched","inTopicContext","onSearchTermChange","checkAndAddAiResults","currentTerm","performAiSearch","searchResults","appendResults","removeExistingAiResults","getExistingTopicIds","existingTopicIds","aiResults","uniqueAiPosts","topicResultType","rt","componentName","more","AiDiscobotDiscoveries","AiQuickSearchInfo","termTooShort","invalidTerm","_aiSplitTopicSuggester","_aiSummaryModal","AiSummaryTrigger","isAiConversation","is_bot_pm","hasCachedSummary","has_cached_summary","openAiSummaryModal","_participant","_addPmParticipants","AiConversationInvite","header","participants","topicInfo","details","allowed_users","showInvite","inviteModel","_preferenceCheckbox","_adminDashboardTab","AdminDashboardSentiment","emotionFilters","emotions","_controller","DiscourseAiBotConversations","_pluginApi","initialize","container","ai_bot_add_to_community_section","withPluginApi","addCommunitySectionLink","baseSectionLink","defaultPrefixValue","PLUGIN_ID","setAdminPluginIcon","addAdminPluginConfigurationNav","_adminReportEmotion","staff","optionalRequire","registerReportModeComponent","registerValueTransformer","_aiArtifact","initializeAiArtifacts","decorateCookedElement","helper","renderGlimmer","artifactElement","getAttribute","hasAttribute","attr","attributes","startsWith","onlyStream","_aiBotHeaderIcon","_aiPersonaFlair","_aiCancelStreaming","_aiCancelStreamingButton","_aiDebugButton","_aiRetryStreamingButton","_aiShareButton","_progressHandlers","allowDebug","initializeAIBotReplies","dag","firstButtonKey","before","after","metaDataInfoKeys","DATE","initializePauseButton","modifyClass","pluginId","onAIBotStreamedReply","streamPostText","_super","isPrivateMessage","cleanupStreamingData","can_debug_ai_bot_conversations","headerIcons","attachHeaderIcon","renderAfterWrapperOutlet","initializePersonaDecorator","getCurrentUser","archetype","initializeDebugButton","initializeShareButton","registerTopicFooterButton","dependentKeys","displayed","can_share_ai_bot_conversations","ai_persona_name","initializeShareTopicButton","initializeRetryButton","_api","_chatModalChannelSummary","apiInitializer","chatService","canSummarize","can_summarize","userCanChat","registerChatComposerButton","translatedLabel","activeChannel","_aiBotSidebarNewConversation","addSidebarPanel","BaseCustomSidebarPanel","hidden","displayHeader","expandActiveSection","renderInOutlet","transition","forceCustomSidebar","stopForcingCustomSidebar","_aiTopicGist","_aiRegenSummaries","_aiRegenSummariesModal","addBulkActionButton","visible","ai_summarization_enabled","setComponent","afterBulkAction","actionType","OUTLETS","mobile","desktop","renderGistInOutlet","outletName","shouldRenderFn","routeName","addTopicAdminMenuButton","className","gistService","_waitForKeyboard","_aiComposerHelperMenu","onToolbarCreate","toolbar","composerContent","addButton","preventFocus","hideShortcutInTitle","shortcutAction","condition","sendAction","waitForClosedKeyboard","initializeAiHelperTrigger","isAiCaptionableImage","buttonAttrs","ai_helper_enabled_features","can_use_assistant","addComposerImageWrapperButton","popupTrigger","buttonWrapper","imageIndex","imageSrc","image_url","image_url_type","caption","addSaveableUserOption","page","addSearchMenuOnKeyDownCallback","searchMenu","searchContext","lastQuery","addSearchMenuAssistantSelectCallback","updatedTerm","classNameBindings","can_see_sentiment_reports","addAdminSidebarSectionLink","moderator","routeModels","allowedGroups","content_localization_allowed_groups","userGroupIds","groupId","scheduled_posts","errorMessage","_basicTopicList","RelatedTopics","ai_embeddings_semantic_related_topics_enabled","registerMoreTopicsTab","relatedTopics","Superclass","_relatedTopicsRecords","related_topics","_setSuggestedTopics","_cookie","registerCustomPostMessageCallback","topicController","triggerChangedPost","_getOwner","_shareFullTopicModal","getBotType","ensureBotMap","enabledChatBotMap","MAX_PERSONA_USER_ID","getOwnerWithFallback","getAiCreditLimitMessage","isAdmin","userType","errorOrPayload","error_type","reset_time_relative","AI_FEATURE_SETTING_GROUPS","getSettingGroupsForFeature","ai_helper","titleKey","summarization","translation","discord","inference","reloadFn","showProgressBar","actions","_postUpdater","MIN_LETTERS_PER_INTERVAL","addProgressDecoration","thinkingNode","elem","nextSibling","inProgressThinkingNode","lastBlock","lastChild","lastNonEmptyChild","ELEMENT_NODE","dotElement","applyProgress","aiStreamingStatus","updaterClass","updaterInstance","progressTimer","PROGRESS_INTERVAL","noop","ensureProgress","GIVE_UP_INTERVAL","MAX_FLUSH_TIME","previousSibling","updater","startTime","oldRaw","letters","floor","substring","setRaw","setCooked","keepPolling","promises","postStatus","postUpdater","all","handleProgress","_loadMorphlex","_streamUpdater","PostUpdater","morphingOptions","beforeAttributeUpdated","attributeName","postElement","cook","offsetWidth","cookedElement","innerHTML","preventCloak","morphInner","_text3","AiTopicSummary","regenerated","showSummaryBox","canCollapseSummary","loadingSummary","processUpdate","summarized_on","collapse","fromPostNumber","toPostNumber","stream","postIds","post_ids","include_raw","post_stream","generateClipboard","_loadJsDiff","DiffStreamer","words","lastResultText","isThinking","typingTimer","currentWordIndex","currentCharIndex","jsDiff","bufferedToken","rushMode","rushBatchSize","rushTicksLeft","receivedFinalUpdate","typingDelay","loadJSDiff","newTextKey","newText","tail","tokenize","charsLeft","formatDiffWithTags","diffWordsWithSpace","streamNextChar","delta","combined","pop","streamingDiff","original","head","last","secondLast","added","removed","limit","emitted","token","charAt","refresh","useStreaming","delay","wrapChunk","diffArray","highlightLastWord","part","match","tok","lastIndex","chunk","buf","_helperEnabled","ai_helper_enabled","featureType","enableHelper","enableAssistant","canShowInPM","ai_helper_allowed_in_pm","enableFeature","privateMessage","can_use_assistant_in_post","SmoothStreamer","streamedTextLength","getRealtimeText","setRealtimeText","realtimeText","cancelTypingTimer","onTextUpdate","typeCharacter","html","_discourse","DiscourseAiBotConversationsRoute","beforeModel","send","DiscourseAiSharedConversationShowRoute","external_links_in_new_tab","open","intent","redirect","_uploads","AiBotConversationsHiddenSubmit","focusInput","destroyDraft","uploadData","min_personal_message_post_length","didCancel","rawContent","uploadMarkdown","getUploadMarkdown","target_recipients","meta_data","slug","topic_slug","_panels","_aiBotSidebarEmptyState","TITLE_CHANNEL","AiConversationsSidebarManager","routeHistory","sections","isFetching","_registered","_hasScrollListener","_scrollElement","_didInit","_debouncedScrollHandler","clientHeight","fetchMessages","_handleNewBotPM","_attachScrollListener","_watchForTitleUpdates","addEmptyStateClass","toggle","isForcingSidebar","setPanel","setSeparatedMode","hideSwitchPanelButtons","_removeScrollListener","isStillAiPanel","MAIN_PANEL","defaultHomepage","isFirstPage","conversations","per_page","_rebuildSections","_applyTitleUpdate","newTitle","fresh","todaySection","links","postedAtMs","last_posted_at","valueOf","diffDays","dateGroup","sec","getFullYear","getMonth","autoUpdatingRelativeAge","last_read_post_number","addSidebarSection","BaseCustomSidebarSection","manager","events","triggerEvent","emptyStateComponent","AiCredits","pendingRequests","checkPersonaCredits","personaIds","fetchStatus","persona_ids","checkFeatureCredits","featureNames","isPersonaCreditAvailable","credit_status","available","checkLlmModelCredits","llmModelIds","llm_model_ids","cacheKey","delete","DiscobotDiscoveries","modelUsed","discoveryTimeout","model_used","resetDiscovery","showDiscoveryTitle","disableDiscoveries","timeoutDiscovery","TOPIC_LIST_LAYOUT_KEY","DEPRECATED_PM_TOPIC_LIST_LAYOUT_KEY","Gists","loadPreference","preference","oldPmPreference","localStorage","removeItem","routerAttributes","listTopics","directTopics","suggestedTopics","ai_topic_gist","ImageCaptionPopup","matchingPlaceholder","IMAGE_MARKDOWN_REGEX","replacement","QuickSearch","_adminReport","_dashboardPeriodSelector","_aiBotConversations","allowList"],"sources":["discourse/plugins/discourse-ai/discourse/admin-discourse-ai-plugin-route-map.js","discourse/plugins/discourse-ai/discourse/admin-discourse-ai-route-map.js","discourse/plugins/discourse-ai/discourse/admin/adapters/ai-embedding.js","discourse/plugins/discourse-ai/discourse/admin/adapters/ai-feature.js","discourse/plugins/discourse-ai/discourse/admin/adapters/ai-llm.js","discourse/plugins/discourse-ai/discourse/admin/adapters/ai-persona.js","discourse/plugins/discourse-ai/discourse/admin/adapters/ai-tool.js","discourse/plugins/discourse-ai/discourse/admin/models/ai-embedding.js","discourse/plugins/discourse-ai/discourse/admin/models/ai-feature.js","discourse/plugins/discourse-ai/discourse/admin/models/ai-llm.js","discourse/plugins/discourse-ai/discourse/admin/models/ai-persona.js","discourse/plugins/discourse-ai/discourse/admin/models/ai-tool.js","discourse/plugins/discourse-ai/discourse/components/admin-report-emotion.js","discourse/plugins/discourse-ai/discourse/components/admin-report-sentiment-analysis.js","discourse/plugins/discourse-ai/discourse/components/ai-artifact.js","discourse/plugins/discourse-ai/discourse/components/ai-blinking-animation.js","discourse/plugins/discourse-ai/discourse/components/ai-bot-conversations.js","discourse/plugins/discourse-ai/discourse/components/ai-bot-header-icon.js","discourse/plugins/discourse-ai/discourse/components/ai-bot-sidebar-empty-state.js","discourse/plugins/discourse-ai/discourse/components/ai-bot-sidebar-new-conversation.js","discourse/plugins/discourse-ai/discourse/components/ai-composer-helper-menu.js","discourse/plugins/discourse-ai/discourse/components/ai-credit-bar.js","discourse/plugins/discourse-ai/discourse/components/ai-default-llm-selector.js","discourse/plugins/discourse-ai/discourse/components/ai-embedding-editor.js","discourse/plugins/discourse-ai/discourse/components/ai-embeddings-list-editor.js","discourse/plugins/discourse-ai/discourse/components/ai-feature-card.js","discourse/plugins/discourse-ai/discourse/components/ai-feature-setting-field.js","discourse/plugins/discourse-ai/discourse/components/ai-features-list.js","discourse/plugins/discourse-ai/discourse/components/ai-features.js","discourse/plugins/discourse-ai/discourse/components/ai-full-page-search.js","discourse/plugins/discourse-ai/discourse/components/ai-gist-toggle.js","discourse/plugins/discourse-ai/discourse/components/ai-helper-custom-prompt.js","discourse/plugins/discourse-ai/discourse/components/ai-helper-loading.js","discourse/plugins/discourse-ai/discourse/components/ai-helper-options-list.js","discourse/plugins/discourse-ai/discourse/components/ai-indicator-wave.js","discourse/plugins/discourse-ai/discourse/components/ai-llm-attachment-types.js","discourse/plugins/discourse-ai/discourse/components/ai-llm-editor-form.js","discourse/plugins/discourse-ai/discourse/components/ai-llm-editor.js","discourse/plugins/discourse-ai/discourse/components/ai-llm-selector.js","discourse/plugins/discourse-ai/discourse/components/ai-llms-list-editor.js","discourse/plugins/discourse-ai/discourse/components/ai-persona-editor.js","discourse/plugins/discourse-ai/discourse/components/ai-persona-example.js","discourse/plugins/discourse-ai/discourse/components/ai-persona-list-editor.js","discourse/plugins/discourse-ai/discourse/components/ai-persona-llm-selector.js","discourse/plugins/discourse-ai/discourse/components/ai-persona-tool-options.js","discourse/plugins/discourse-ai/discourse/components/ai-post-helper-menu.js","discourse/plugins/discourse-ai/discourse/components/ai-quota-duration-selector.js","discourse/plugins/discourse-ai/discourse/components/ai-regen-summaries-buttons.js","discourse/plugins/discourse-ai/discourse/components/ai-search-discoveries-tooltip.js","discourse/plugins/discourse-ai/discourse/components/ai-search-discoveries.js","discourse/plugins/discourse-ai/discourse/components/ai-sentiment-horizontal-bar.js","discourse/plugins/discourse-ai/discourse/components/ai-spam.js","discourse/plugins/discourse-ai/discourse/components/ai-split-topic-suggester.js","discourse/plugins/discourse-ai/discourse/components/ai-summary-skeleton.js","discourse/plugins/discourse-ai/discourse/components/ai-tool-editor-form.js","discourse/plugins/discourse-ai/discourse/components/ai-tool-editor.js","discourse/plugins/discourse-ai/discourse/components/ai-tool-list-editor.js","discourse/plugins/discourse-ai/discourse/components/ai-tool-selector.js","discourse/plugins/discourse-ai/discourse/components/ai-topic-gist.js","discourse/plugins/discourse-ai/discourse/components/ai-translations.js","discourse/plugins/discourse-ai/discourse/components/ai-usage.js","discourse/plugins/discourse-ai/discourse/components/bulk-actions/ai-regen-summaries.js","discourse/plugins/discourse-ai/discourse/components/doughnut-chart.js","discourse/plugins/discourse-ai/discourse/components/modal/ai-llm-quota-modal.js","discourse/plugins/discourse-ai/discourse/components/modal/ai-persona-response-format-editor.js","discourse/plugins/discourse-ai/discourse/components/modal/ai-regen-summaries-modal.js","discourse/plugins/discourse-ai/discourse/components/modal/ai-summary-modal.js","discourse/plugins/discourse-ai/discourse/components/modal/ai-tool-test-modal.js","discourse/plugins/discourse-ai/discourse/components/modal/chat-modal-channel-summary.js","discourse/plugins/discourse-ai/discourse/components/modal/debug-ai-modal.js","discourse/plugins/discourse-ai/discourse/components/modal/diff-modal.js","discourse/plugins/discourse-ai/discourse/components/modal/share-full-topic-modal.js","discourse/plugins/discourse-ai/discourse/components/modal/share-modal.js","discourse/plugins/discourse-ai/discourse/components/modal/spam-test-modal.js","discourse/plugins/discourse-ai/discourse/components/modal/thumbnail-suggestions.js","discourse/plugins/discourse-ai/discourse/components/model-accuracies.js","discourse/plugins/discourse-ai/discourse/components/post-menu/ai-cancel-streaming-button.js","discourse/plugins/discourse-ai/discourse/components/post-menu/ai-debug-button.js","discourse/plugins/discourse-ai/discourse/components/post-menu/ai-retry-streaming-button.js","discourse/plugins/discourse-ai/discourse/components/post-menu/ai-share-button.js","discourse/plugins/discourse-ai/discourse/components/post/ai-persona-flair.js","discourse/plugins/discourse-ai/discourse/components/post/meta-data/ai-cancel-streaming.js","discourse/plugins/discourse-ai/discourse/components/rag-options-fk.js","discourse/plugins/discourse-ai/discourse/components/rag-upload-progress.js","discourse/plugins/discourse-ai/discourse/components/rag-uploader.js","discourse/plugins/discourse-ai/discourse/components/reviewable-ai-chat-message.js","discourse/plugins/discourse-ai/discourse/components/reviewable-ai-post.js","discourse/plugins/discourse-ai/discourse/components/reviewable-refresh/ai-chat-message.js","discourse/plugins/discourse-ai/discourse/components/reviewable-refresh/ai-post.js","discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-category-suggester.js","discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-tag-suggester.js","discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-title-suggester.js","discourse/plugins/discourse-ai/discourse/components/thumbnail-suggestion-item.js","discourse/plugins/discourse-ai/discourse/connectors/admin-dashboard-tabs-after/admin-sentiment-dashbboard.js","discourse/plugins/discourse-ai/discourse/connectors/after-composer-category-input/ai-category-suggestion.js","discourse/plugins/discourse-ai/discourse/connectors/after-composer-tag-input/ai-tag-suggestion.js","discourse/plugins/discourse-ai/discourse/connectors/after-composer-title-input/ai-title-suggestion.js","discourse/plugins/discourse-ai/discourse/connectors/after-d-editor/composer-open.js","discourse/plugins/discourse-ai/discourse/connectors/after-filter-navigation-menu/filter-gist-toggle.js","discourse/plugins/discourse-ai/discourse/connectors/after-search-result-entry/search-result-decoration.js","discourse/plugins/discourse-ai/discourse/connectors/before-create-topic-button/topic-list-gist-toggle.js","discourse/plugins/discourse-ai/discourse/connectors/composer-fields/persona-llm-selector.js","discourse/plugins/discourse-ai/discourse/connectors/edit-topic-category__after/ai-category-suggestion.js","discourse/plugins/discourse-ai/discourse/connectors/edit-topic-tags__after/ai-tag-suggestion.js","discourse/plugins/discourse-ai/discourse/connectors/edit-topic-title__after/ai-title-suggestion.js","discourse/plugins/discourse-ai/discourse/connectors/editor-preview/ai-image-caption-container.js","discourse/plugins/discourse-ai/discourse/connectors/fast-edit-footer-after/ai-edit-suggestion-button.js","discourse/plugins/discourse-ai/discourse/connectors/full-page-search-below-search-header/ai-full-page-discobot-discoveries.js","discourse/plugins/discourse-ai/discourse/connectors/full-page-search-below-search-header/ai-full-page-search.js","discourse/plugins/discourse-ai/discourse/connectors/post-menu-translations-dropdown/ai-post-menu-translation-extras.js","discourse/plugins/discourse-ai/discourse/connectors/post-text-buttons/ai-post-helper-trigger.js","discourse/plugins/discourse-ai/discourse/connectors/search-menu-before-advanced-search/ai-quick-search-loader.js","discourse/plugins/discourse-ai/discourse/connectors/search-menu-results-bottom/ai-quick-search.js","discourse/plugins/discourse-ai/discourse/connectors/search-menu-results-top/ai-discobot-discoveries.js","discourse/plugins/discourse-ai/discourse/connectors/search-menu-results-top/ai-quick-search-info.js","discourse/plugins/discourse-ai/discourse/connectors/split-new-topic-category-after/ai-category-suggestion.js","discourse/plugins/discourse-ai/discourse/connectors/split-new-topic-tag-after/ai-tag-suggestion.js","discourse/plugins/discourse-ai/discourse/connectors/split-new-topic-title-after/ai-title-suggestion.js","discourse/plugins/discourse-ai/discourse/connectors/topic-map-expanded-after/ai-summary-trigger.js","discourse/plugins/discourse-ai/discourse/connectors/topic-map-participants-after/ai-conversation-invite.js","discourse/plugins/discourse-ai/discourse/connectors/user-messages-controls-bottom/pm-list-gist-toggle.js","discourse/plugins/discourse-ai/discourse/connectors/user-preferences-interface/ai-search-discoveries.js","discourse/plugins/discourse-ai/discourse/controllers/admin/dashboard-sentiment.js","discourse/plugins/discourse-ai/discourse/controllers/discourse-ai-bot-conversations.js","discourse/plugins/discourse-ai/discourse/discourse-ai-bot-dashboard-route-map.js","discourse/plugins/discourse-ai/discourse/discourse-ai-shared-conversation-show-route-map.js","discourse/plugins/discourse-ai/discourse/initializers/add-ai-bot-to-community-section.js","discourse/plugins/discourse-ai/discourse/initializers/admin-plugin-configuration-nav.js","discourse/plugins/discourse-ai/discourse/initializers/admin-reports.js","discourse/plugins/discourse-ai/discourse/initializers/ai-artifacts.js","discourse/plugins/discourse-ai/discourse/initializers/ai-bot-replies.js","discourse/plugins/discourse-ai/discourse/initializers/ai-chat-summarization.js","discourse/plugins/discourse-ai/discourse/initializers/ai-conversations-sidebar.js","discourse/plugins/discourse-ai/discourse/initializers/ai-gist-connector.js","discourse/plugins/discourse-ai/discourse/initializers/ai-gist-topic-list-class.js","discourse/plugins/discourse-ai/discourse/initializers/ai-helper.js","discourse/plugins/discourse-ai/discourse/initializers/ai-image-caption.js","discourse/plugins/discourse-ai/discourse/initializers/ai-search-discoveries.js","discourse/plugins/discourse-ai/discourse/initializers/ai-semantic-search.js","discourse/plugins/discourse-ai/discourse/initializers/ai-sentiment-admin-nav.js","discourse/plugins/discourse-ai/discourse/initializers/ai-translation-topic-admin.js","discourse/plugins/discourse-ai/discourse/initializers/related-topics.js","discourse/plugins/discourse-ai/discourse/initializers/translation.js","discourse/plugins/discourse-ai/discourse/lib/ai-bot-helper.js","discourse/plugins/discourse-ai/discourse/lib/ai-errors.js","discourse/plugins/discourse-ai/discourse/lib/ai-feature-setting-groups.js","discourse/plugins/discourse-ai/discourse/lib/ai-helper-suggestions.js","discourse/plugins/discourse-ai/discourse/lib/ai-streamer/progress-handlers.js","discourse/plugins/discourse-ai/discourse/lib/ai-streamer/updaters/post-updater.js","discourse/plugins/discourse-ai/discourse/lib/ai-streamer/updaters/stream-updater.js","discourse/plugins/discourse-ai/discourse/lib/ai-topic-summary.js","discourse/plugins/discourse-ai/discourse/lib/copy-conversation.js","discourse/plugins/discourse-ai/discourse/lib/diff-streamer.js","discourse/plugins/discourse-ai/discourse/lib/show-ai-helper.js","discourse/plugins/discourse-ai/discourse/lib/smooth-streamer.js","discourse/plugins/discourse-ai/discourse/lib/utilities.js","discourse/plugins/discourse-ai/discourse/routes/discourse-ai-bot-conversations.js","discourse/plugins/discourse-ai/discourse/routes/discourse-ai-shared-conversation-show.js","discourse/plugins/discourse-ai/discourse/services/ai-bot-conversations-hidden-submit.js","discourse/plugins/discourse-ai/discourse/services/ai-conversations-sidebar-manager.js","discourse/plugins/discourse-ai/discourse/services/ai-credits.js","discourse/plugins/discourse-ai/discourse/services/discobot-discoveries.js","discourse/plugins/discourse-ai/discourse/services/gists.js","discourse/plugins/discourse-ai/discourse/services/image-caption-popup.js","discourse/plugins/discourse-ai/discourse/services/quick-search.js","discourse/plugins/discourse-ai/discourse/templates/admin/dashboard-sentiment.js","discourse/plugins/discourse-ai/discourse/templates/discourse-ai-bot-conversations.js","discourse/plugins/discourse-ai/lib/discourse-markdown/ai-tags.js"],"sourcesContent":["define(\"discourse/plugins/discourse-ai/discourse/admin-discourse-ai-plugin-route-map\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = {\n    resource: \"admin.adminPlugins.show\",\n    path: \"/plugins\",\n    map() {\n      this.route(\"discourse-ai-personas\", {\n        path: \"ai-personas\"\n      }, function () {\n        this.route(\"new\");\n        this.route(\"edit\", {\n          path: \"/:id/edit\"\n        });\n      });\n      this.route(\"discourse-ai-llms\", {\n        path: \"ai-llms\"\n      }, function () {\n        this.route(\"new\");\n        this.route(\"edit\", {\n          path: \"/:id/edit\"\n        });\n      });\n      this.route(\"discourse-ai-tools\", {\n        path: \"ai-tools\"\n      }, function () {\n        this.route(\"new\");\n        this.route(\"edit\", {\n          path: \"/:id/edit\"\n        });\n      });\n      this.route(\"discourse-ai-spam\", {\n        path: \"ai-spam\"\n      });\n      this.route(\"discourse-ai-translations\", {\n        path: \"ai-translations\"\n      });\n      this.route(\"discourse-ai-usage\", {\n        path: \"ai-usage\"\n      });\n      this.route(\"discourse-ai-embeddings\", {\n        path: \"ai-embeddings\"\n      }, function () {\n        this.route(\"new\");\n        this.route(\"edit\", {\n          path: \"/:id/edit\"\n        });\n      });\n      this.route(\"discourse-ai-features\", {\n        path: \"ai-features\"\n      }, function () {\n        this.route(\"edit\", {\n          path: \"/:id/edit\"\n        });\n      });\n    }\n  };\n});","define(\"discourse/plugins/discourse-ai/discourse/admin-discourse-ai-route-map\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = {\n    resource: \"admin.dashboard\",\n    path: \"/dashboard\",\n    map() {\n      this.route(\"admin.dashboardSentiment\", {\n        path: \"/dashboard/sentiment\",\n        resetNamespace: true\n      });\n    }\n  };\n});","define(\"discourse/plugins/discourse-ai/discourse/admin/adapters/ai-embedding\", [\"exports\", \"discourse/adapters/rest\"], function (_exports, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class Adapter extends _rest.default {\n    jsonMode = true;\n    basePath() {\n      return \"/admin/plugins/discourse-ai/\";\n    }\n    pathFor(store, type, findArgs) {\n      // removes underscores which are implemented in base\n      let path = this.basePath(store, type, findArgs) + store.pluralize(this.apiNameFor(type));\n      return this.appendQueryParams(path, findArgs);\n    }\n    apiNameFor() {\n      return \"ai-embedding\";\n    }\n  }\n  _exports.default = Adapter;\n});","define(\"discourse/plugins/discourse-ai/discourse/admin/adapters/ai-feature\", [\"exports\", \"discourse/adapters/rest\"], function (_exports, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiFeatureAdapter extends _rest.default {\n    jsonMode = true;\n    basePath() {\n      return \"/admin/plugins/discourse-ai/\";\n    }\n    pathFor(store, type, findArgs) {\n      // removes underscores which are implemented in base\n      let path = this.basePath(store, type, findArgs) + store.pluralize(this.apiNameFor(type));\n      return this.appendQueryParams(path, findArgs);\n    }\n    apiNameFor() {\n      return \"ai-feature\";\n    }\n  }\n  _exports.default = AiFeatureAdapter;\n});","define(\"discourse/plugins/discourse-ai/discourse/admin/adapters/ai-llm\", [\"exports\", \"discourse/adapters/rest\"], function (_exports, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class Adapter extends _rest.default {\n    jsonMode = true;\n    basePath() {\n      return \"/admin/plugins/discourse-ai/\";\n    }\n    pathFor(store, type, findArgs) {\n      // removes underscores which are implemented in base\n      let path = this.basePath(store, type, findArgs) + store.pluralize(this.apiNameFor(type));\n      return this.appendQueryParams(path, findArgs);\n    }\n    apiNameFor() {\n      return \"ai-llm\";\n    }\n  }\n  _exports.default = Adapter;\n});","define(\"discourse/plugins/discourse-ai/discourse/admin/adapters/ai-persona\", [\"exports\", \"discourse/adapters/rest\"], function (_exports, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class Adapter extends _rest.default {\n    jsonMode = true;\n    basePath() {\n      return \"/admin/plugins/discourse-ai/\";\n    }\n    pathFor(store, type, findArgs) {\n      // removes underscores which are implemented in base\n      let path = this.basePath(store, type, findArgs) + store.pluralize(this.apiNameFor(type));\n      return this.appendQueryParams(path, findArgs);\n    }\n    apiNameFor() {\n      return \"ai-persona\";\n    }\n  }\n  _exports.default = Adapter;\n});","define(\"discourse/plugins/discourse-ai/discourse/admin/adapters/ai-tool\", [\"exports\", \"discourse/adapters/rest\"], function (_exports, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiToolAdapter extends _rest.default {\n    jsonMode = true;\n    basePath() {\n      return \"/admin/plugins/discourse-ai/\";\n    }\n    pathFor(store, type, findArgs) {\n      // removes underscores which are implemented in base\n      let path = this.basePath(store, type, findArgs) + store.pluralize(this.apiNameFor(type));\n      return this.appendQueryParams(path, findArgs);\n    }\n    apiNameFor() {\n      return \"ai-tool\";\n    }\n  }\n  _exports.default = AiToolAdapter;\n});","define(\"discourse/plugins/discourse-ai/discourse/admin/models/ai-embedding\", [\"exports\", \"discourse/lib/ajax\", \"discourse/models/rest\"], function (_exports, _ajax, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiEmbedding extends _rest.default {\n    createProperties() {\n      return this.getProperties(\"id\", \"display_name\", \"dimensions\", \"provider\", \"tokenizer_class\", \"dimensions\", \"url\", \"api_key\", \"max_sequence_length\", \"provider_params\", \"pg_function\", \"embed_prompt\", \"search_prompt\", \"matryoshka_dimensions\");\n    }\n    updateProperties() {\n      const attrs = this.createProperties();\n      attrs.id = this.id;\n      return attrs;\n    }\n    async testConfig() {\n      return await (0, _ajax.ajax)(`/admin/plugins/discourse-ai/ai-embeddings/test.json`, {\n        data: {\n          ai_embedding: this.createProperties()\n        }\n      });\n    }\n    workingCopy() {\n      const attrs = this.createProperties();\n      return this.store.createRecord(\"ai-embedding\", attrs);\n    }\n  }\n  _exports.default = AiEmbedding;\n});","define(\"discourse/plugins/discourse-ai/discourse/admin/models/ai-feature\", [\"exports\", \"discourse/models/rest\"], function (_exports, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiFeature extends _rest.default {\n    createProperties() {\n      return this.getProperties(\"id\", \"module\", \"global_enabled\", \"features\");\n    }\n  }\n  _exports.default = AiFeature;\n});","define(\"discourse/plugins/discourse-ai/discourse/admin/models/ai-llm\", [\"exports\", \"discourse/lib/ajax\", \"discourse/models/rest\"], function (_exports, _ajax, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiLlm extends _rest.default {\n    createProperties() {\n      return this.getProperties(\"id\", \"display_name\", \"name\", \"provider\", \"tokenizer\", \"max_prompt_tokens\", \"max_output_tokens\", \"url\", \"api_key\", \"provider_params\", \"vision_enabled\", \"input_cost\", \"cached_input_cost\", \"cache_write_cost\", \"output_cost\", \"allowed_attachment_types\");\n    }\n    updateProperties() {\n      const attrs = this.createProperties();\n      attrs.id = this.id;\n      attrs.llm_quotas = this.llm_quotas;\n      return attrs;\n    }\n    async testConfig(llmConfig) {\n      return await (0, _ajax.ajax)(\"/admin/plugins/discourse-ai/ai-llms/test.json\", {\n        data: {\n          ai_llm: llmConfig ?? this.createProperties()\n        }\n      });\n    }\n  }\n  _exports.default = AiLlm;\n});","define(\"discourse/plugins/discourse-ai/discourse/admin/models/ai-persona\", [\"exports\", \"discourse/lib/ajax\", \"discourse/models/rest\", \"discourse/plugins/discourse-ai/discourse/lib/utilities\"], function (_exports, _ajax, _rest, _utilities) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const CREATE_ATTRIBUTES = [\"id\", \"name\", \"description\", \"tools\", \"system_prompt\", \"allowed_group_ids\", \"enabled\", \"system\", \"priority\", \"top_p\", \"temperature\", \"user_id\", \"default_llm_id\", \"force_default_llm\", \"user\", \"max_context_posts\", \"vision_enabled\", \"vision_max_pixels\", \"rag_uploads\", \"rag_chunk_tokens\", \"rag_chunk_overlap_tokens\", \"rag_conversation_chunks\", \"rag_llm_model_id\", \"question_consolidator_llm_id\", \"allow_chat\", \"show_thinking\", \"forced_tool_count\", \"allow_personal_messages\", \"allow_topic_mentions\", \"allow_chat_channel_mentions\", \"allow_chat_direct_messages\", \"response_format\", \"examples\"];\n  const SYSTEM_ATTRIBUTES = [\"id\", \"allowed_group_ids\", \"enabled\", \"system\", \"priority\", \"tools\", \"user_id\", \"default_llm_id\", \"force_default_llm\", \"user\", \"max_context_posts\", \"vision_enabled\", \"vision_max_pixels\", \"rag_uploads\", \"rag_chunk_tokens\", \"rag_chunk_overlap_tokens\", \"rag_conversation_chunks\", \"rag_llm_model_id\", \"question_consolidator_llm_id\", \"show_thinking\", \"allow_personal_messages\", \"allow_topic_mentions\", \"allow_chat_channel_mentions\", \"allow_chat_direct_messages\"];\n  class AiPersona extends _rest.default {\n    async createUser() {\n      const result = await (0, _ajax.ajax)(`/admin/plugins/discourse-ai/ai-personas/${this.id}/create-user.json`, {\n        type: \"POST\"\n      });\n      this.user = result.user;\n      this.user_id = this.user.id;\n      return this.user;\n    }\n    flattenedToolStructure(data) {\n      return (data.tools || []).map(tName => {\n        return [tName, data.toolOptions[tName] || {}, data.forcedTools.includes(tName)];\n      });\n    }\n\n    // this code is here to convert the wire schema to easier to work with object\n    // on the wire we pass in/out tools as an Array.\n    // [[ToolName, {option1: value, option2: value}, force], ToolName2, ToolName3]\n    // We split it into tools, options and a list of forced ones.\n    populateTools(attrs) {\n      const forcedTools = [];\n      const toolOptions = {};\n      const flatTools = attrs.tools?.map(tool => {\n        if (typeof tool === \"string\") {\n          return tool;\n        } else {\n          let [toolId, options, force] = tool;\n          const mappedOptions = {};\n          for (const optionId in options) {\n            if (!options.hasOwnProperty(optionId)) {\n              continue;\n            }\n            mappedOptions[optionId] = options[optionId];\n          }\n          if (Object.keys(mappedOptions).length > 0) {\n            toolOptions[toolId] = mappedOptions;\n          }\n          if (force) {\n            forcedTools.push(toolId);\n          }\n          return toolId;\n        }\n      });\n      attrs.tools = flatTools;\n      attrs.forcedTools = forcedTools;\n      attrs.toolOptions = toolOptions;\n    }\n    updateProperties() {\n      const attrs = this.system ? this.getProperties(SYSTEM_ATTRIBUTES) : this.getProperties(CREATE_ATTRIBUTES);\n      attrs.id = this.id;\n      return attrs;\n    }\n    createProperties() {\n      return this.getProperties(CREATE_ATTRIBUTES);\n    }\n    fromPOJO(data) {\n      const dataClone = (0, _utilities.toPlainObject)(data);\n      const persona = AiPersona.create(dataClone);\n      persona.tools = this.flattenedToolStructure(dataClone);\n      return persona;\n    }\n    toPOJO() {\n      const attrs = this.getProperties(CREATE_ATTRIBUTES);\n      this.populateTools(attrs);\n      attrs.forced_tool_count = this.forced_tool_count || -1;\n      attrs.response_format = attrs.response_format || [];\n      attrs.examples = attrs.examples || [];\n\n      // FormKit uses Immer proxies which cause issues when passed to upload handlers.\n      // Convert to plain objects to ensure compatibility.\n      if (attrs.rag_uploads?.length > 0) {\n        attrs.rag_uploads = (0, _utilities.toPlainObject)(attrs.rag_uploads);\n      }\n      return attrs;\n    }\n  }\n  _exports.default = AiPersona;\n});","define(\"discourse/plugins/discourse-ai/discourse/admin/models/ai-tool\", [\"exports\", \"@ember-compat/tracked-built-ins\", \"discourse/models/rest\"], function (_exports, _trackedBuiltIns, _rest) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const CREATE_ATTRIBUTES = [\"id\", \"name\", \"tool_name\", \"description\", \"parameters\", \"script\", \"summary\", \"rag_uploads\", \"rag_chunk_tokens\", \"rag_chunk_overlap_tokens\", \"rag_llm_model_id\", \"enabled\"];\n  class AiTool extends _rest.default {\n    createProperties() {\n      return this.getProperties(CREATE_ATTRIBUTES);\n    }\n    updateProperties() {\n      return this.getProperties(CREATE_ATTRIBUTES);\n    }\n    trackParameters(parameters) {\n      return new _trackedBuiltIns.TrackedArray(parameters?.map(p => {\n        const parameter = new _trackedBuiltIns.TrackedObject(p);\n        if (parameter.enum && parameter.enum.length) {\n          parameter.enum = new _trackedBuiltIns.TrackedArray(parameter.enum);\n        } else {\n          parameter.enum = null;\n        }\n        return parameter;\n      }));\n    }\n    workingCopy() {\n      const attrs = this.getProperties(CREATE_ATTRIBUTES);\n      attrs.parameters = this.trackParameters(attrs.parameters);\n      return this.store.createRecord(\"ai-tool\", attrs);\n    }\n  }\n  _exports.default = AiTool;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/admin-report-emotion\", [\"exports\", \"@ember/component\", \"@ember-decorators/component\", \"discourse/helpers/d-icon\", \"discourse/helpers/number\", \"discourse/lib/get-url\", \"@ember/template-factory\"], function (_exports, _component, _component2, _dIcon, _number, _getUrl, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /* eslint-disable ember/no-classic-components */\n  const AdminReportEmotion = dt7948.c(class AdminReportEmotion extends _component.default {\n    get todayLink() {\n      let date = moment().format(\"YYYY-MM-DD\");\n      return this._filterURL(date);\n    }\n    get yesterdayLink() {\n      let date = moment().subtract(1, \"day\").format(\"YYYY-MM-DD\");\n      return this._filterURL(date);\n    }\n    get lastSevenDaysLink() {\n      let date = moment().subtract(1, \"week\").format(\"YYYY-MM-DD\");\n      return this._filterURL(date);\n    }\n    get lastThirtyDaysLink() {\n      let date = moment().subtract(1, \"month\").format(\"YYYY-MM-DD\");\n      return this._filterURL(date);\n    }\n    _baseFilter() {\n      return \"/filter?q=activity-after%3A\";\n    }\n    _model() {\n      return \"%20order%3A\" + this.model.type;\n    }\n    _filterURL(date) {\n      return (0, _getUrl.default)(`${this._baseFilter()}${date}${this._model()}`);\n    }\n    static {\n      (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"cell title\">\n        {{#if this.model.icon}}\n          {{icon this.model.icon}}\n        {{/if}}\n        {{this.model.title}}\n      </div>\n      \n      <div class=\"cell value today-count\">\n        <a href={{this.todayLink}}>\n          {{number this.model.todayCount}}\n        </a>\n      </div>\n      \n      <div\n        class=\"cell value yesterday-count {{this.model.yesterdayTrend}}\"\n        title={{this.model.yesterdayCountTitle}}\n      >\n        <a href={{this.yesterdayLink}}>\n          {{number this.model.yesterdayCount}}\n        </a>\n        {{icon this.model.yesterdayTrendIcon}}\n      </div>\n      \n      <div\n        class=\"cell value sevendays-count {{this.model.sevenDaysTrend}}\"\n        title={{this.model.sevenDaysCountTitle}}\n      >\n        <a href={{this.lastSevenDaysLink}}>\n          {{number this.model.lastSevenDaysCount}}\n        </a>\n        {{icon this.model.sevenDaysTrendIcon}}\n      </div>\n      \n      <div\n        class=\"cell value thirty-days-count {{this.model.thirtyDaysTrend}}\"\n        title={{this.model.thirtyDaysCountTitle}}\n      >\n      \n        <a href={{this.lastThirtyDaysLink}}>\n          {{number this.model.lastThirtyDaysCount}}\n        </a>\n        {{#if this.model.canDisplayTrendIcon}}\n          {{icon this.model.thirtyDaysTrendIcon}}\n        {{/if}}\n      </div>\n      */\n      {\n        \"id\": \"t3NbwKbK\",\n        \"block\": \"[[[10,0],[14,0,\\\"cell title\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"model\\\",\\\"icon\\\"]],[[[1,\\\"    \\\"],[1,[28,[32,0],[[30,0,[\\\"model\\\",\\\"icon\\\"]]],null]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"],[1,[30,0,[\\\"model\\\",\\\"title\\\"]]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"cell value today-count\\\"],[12],[1,\\\"\\\\n  \\\"],[10,3],[15,6,[30,0,[\\\"todayLink\\\"]]],[12],[1,\\\"\\\\n    \\\"],[1,[28,[32,1],[[30,0,[\\\"model\\\",\\\"todayCount\\\"]]],null]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"cell value yesterday-count \\\",[30,0,[\\\"model\\\",\\\"yesterdayTrend\\\"]]]]],[15,\\\"title\\\",[30,0,[\\\"model\\\",\\\"yesterdayCountTitle\\\"]]],[12],[1,\\\"\\\\n  \\\"],[10,3],[15,6,[30,0,[\\\"yesterdayLink\\\"]]],[12],[1,\\\"\\\\n    \\\"],[1,[28,[32,1],[[30,0,[\\\"model\\\",\\\"yesterdayCount\\\"]]],null]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[1,[28,[32,0],[[30,0,[\\\"model\\\",\\\"yesterdayTrendIcon\\\"]]],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"cell value sevendays-count \\\",[30,0,[\\\"model\\\",\\\"sevenDaysTrend\\\"]]]]],[15,\\\"title\\\",[30,0,[\\\"model\\\",\\\"sevenDaysCountTitle\\\"]]],[12],[1,\\\"\\\\n  \\\"],[10,3],[15,6,[30,0,[\\\"lastSevenDaysLink\\\"]]],[12],[1,\\\"\\\\n    \\\"],[1,[28,[32,1],[[30,0,[\\\"model\\\",\\\"lastSevenDaysCount\\\"]]],null]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[1,[28,[32,0],[[30,0,[\\\"model\\\",\\\"sevenDaysTrendIcon\\\"]]],null]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[15,0,[29,[\\\"cell value thirty-days-count \\\",[30,0,[\\\"model\\\",\\\"thirtyDaysTrend\\\"]]]]],[15,\\\"title\\\",[30,0,[\\\"model\\\",\\\"thirtyDaysCountTitle\\\"]]],[12],[1,\\\"\\\\n\\\\n  \\\"],[10,3],[15,6,[30,0,[\\\"lastThirtyDaysLink\\\"]]],[12],[1,\\\"\\\\n    \\\"],[1,[28,[32,1],[[30,0,[\\\"model\\\",\\\"lastThirtyDaysCount\\\"]]],null]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"model\\\",\\\"canDisplayTrendIcon\\\"]],[[[1,\\\"    \\\"],[1,[28,[32,0],[[30,0,[\\\"model\\\",\\\"thirtyDaysTrendIcon\\\"]]],null]],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/admin-report-emotion.js\",\n        \"scope\": () => [_dIcon.default, _number.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }, [(0, _component2.attributeBindings)(\"model.description:title\"), (0, _component2.classNames)(\"admin-report-counters\")]);\n  var _default = _exports.default = AdminReportEmotion;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/admin-report-sentiment-analysis\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/service\", \"@ember-compat/tracked-built-ins\", \"ember-modifier\", \"discourse/components/d-button\", \"discourse/components/horizontal-overflow-nav\", \"discourse/components/post-list\", \"discourse/float-kit/components/d-tooltip\", \"discourse/helpers/body-class\", \"discourse/helpers/category-badge\", \"discourse/helpers/d-icon\", \"discourse/helpers/replace-emoji\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/get-url\", \"discourse/lib/later\", \"discourse/lib/utilities\", \"discourse/models/category\", \"discourse/models/post\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/doughnut-chart\", \"discourse/plugins/discourse-ai/discourse/components/ai-sentiment-horizontal-bar\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _didInsert, _service, _trackedBuiltIns, _emberModifier, _dButton, _horizontalOverflowNav, _postList, _dTooltip, _bodyClass, _categoryBadge, _dIcon, _replaceEmoji, _ajax, _ajaxError, _getUrl, _later, _utilities, _category, _post, _truthHelpers, _discourseI18n, _doughnutChart, _aiSentimentHorizontalBar, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AdminReportSentimentAnalysis extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedChart\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #selectedChart = (dt7948.i(this, \"selectedChart\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"posts\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #posts = (dt7948.i(this, \"posts\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"hasMorePosts\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #hasMorePosts = (dt7948.i(this, \"hasMorePosts\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"nextOffset\", [_tracking.tracked], function () {\n        return 0;\n      });\n    }\n    #nextOffset = (dt7948.i(this, \"nextOffset\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"showingSelectedChart\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #showingSelectedChart = (dt7948.i(this, \"showingSelectedChart\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"activeFilter\", [_tracking.tracked], function () {\n        return \"all\";\n      });\n    }\n    #activeFilter = (dt7948.i(this, \"activeFilter\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"shareIcon\", [_tracking.tracked], function () {\n        return \"link\";\n      });\n    }\n    #shareIcon = (dt7948.i(this, \"shareIcon\"), void 0);\n    setActiveFilter = (0, _emberModifier.modifier)(element => {\n      this.clearActiveFilters(element);\n      element.querySelector(`li[data-filter-type=\"${this.activeFilter}\"] button`).classList.add(\"active\");\n    });\n    clearActiveFilters(element) {\n      const filterButtons = element.querySelectorAll(\"li button\");\n      for (let button of filterButtons) {\n        button.classList.remove(\"active\");\n      }\n    }\n    calculateNeutralScore(data) {\n      return data.total_count - (data.positive_count + data.negative_count);\n    }\n    sentimentMapping(sentiment) {\n      switch (sentiment) {\n        case \"positive\":\n          return {\n            id: \"positive\",\n            text: (0, _discourseI18n.i18n)(\"discourse_ai.sentiments.sentiment_analysis.filter_types.positive\"),\n            icon: \"face-smile\"\n          };\n        case \"neutral\":\n          return {\n            id: \"neutral\",\n            text: (0, _discourseI18n.i18n)(\"discourse_ai.sentiments.sentiment_analysis.filter_types.neutral\"),\n            icon: \"face-meh\"\n          };\n        case \"negative\":\n          return {\n            id: \"negative\",\n            text: (0, _discourseI18n.i18n)(\"discourse_ai.sentiments.sentiment_analysis.filter_types.negative\"),\n            icon: \"face-angry\"\n          };\n      }\n    }\n    get groupingType() {\n      const dataSample = this.args.model.data[0];\n      const localePrefix = \"discourse_ai.sentiments.sentiment_analysis.group_types\";\n      return dataSample.category_name ? (0, _discourseI18n.i18n)(`${localePrefix}.category`) : (0, _discourseI18n.i18n)(`${localePrefix}.tag`);\n    }\n    get colors() {\n      return [\"#2ecc71\", \"#95a5a6\", \"#e74c3c\"];\n    }\n    get currentGroupFilter() {\n      return this.args.model.available_filters.find(filter => filter.id === \"group_by\").default;\n    }\n    get currentSortFilter() {\n      return this.args.model.available_filters.find(filter => filter.id === \"sort_by\").default;\n    }\n    get transformedData() {\n      return this.args.model.data.map(data => {\n        return {\n          category: _category.default.findById(data.category_id),\n          title: data.category_name || data.tag_name,\n          scores: [data.positive_count, this.calculateNeutralScore(data), data.negative_count],\n          score_map: {\n            positive: data.positive_count,\n            neutral: this.calculateNeutralScore(data),\n            negative: data.negative_count\n          },\n          total_score: data.total_count,\n          widths: {\n            positive: data.positive_count / data.total_count * 100,\n            neutral: this.calculateNeutralScore(data) / data.total_count * 100,\n            negative: data.negative_count / data.total_count * 100\n          }\n        };\n      });\n    }\n    get filteredPosts() {\n      let list;\n      if (!this.posts || !this.posts.length) {\n        list = [];\n      } else {\n        list = this.posts.filter(post => {\n          post.topic_title = (0, _replaceEmoji.default)(post.topic_title);\n          post.category = _category.default.findById(post.category_id);\n          if (this.activeFilter === \"all\") {\n            return true;\n          }\n          return post.sentiment === this.activeFilter;\n        });\n      }\n      return new _trackedBuiltIns.TrackedArray(list);\n    }\n    get postFilters() {\n      return [{\n        id: \"all\",\n        text: `${(0, _discourseI18n.i18n)(\"discourse_ai.sentiments.sentiment_analysis.filter_types.all\")} (${this.selectedChart.total_score})`,\n        icon: \"bars-staggered\",\n        action: () => {\n          this.activeFilter = \"all\";\n        }\n      }, {\n        id: \"positive\",\n        text: `${(0, _discourseI18n.i18n)(\"discourse_ai.sentiments.sentiment_analysis.filter_types.positive\")} (${this.selectedChart.scores[0]})`,\n        icon: \"face-smile\",\n        action: () => {\n          this.activeFilter = \"positive\";\n        }\n      }, {\n        id: \"neutral\",\n        text: `${(0, _discourseI18n.i18n)(\"discourse_ai.sentiments.sentiment_analysis.filter_types.neutral\")} (${this.selectedChart.scores[1]})`,\n        icon: \"face-meh\",\n        action: () => {\n          this.activeFilter = \"neutral\";\n        }\n      }, {\n        id: \"negative\",\n        text: `${(0, _discourseI18n.i18n)(\"discourse_ai.sentiments.sentiment_analysis.filter_types.negative\")} (${this.selectedChart.scores[2]})`,\n        icon: \"face-angry\",\n        action: () => {\n          this.activeFilter = \"negative\";\n        }\n      }];\n    }\n    async postRequest() {\n      return await (0, _ajax.ajax)(\"/discourse-ai/sentiment/posts\", {\n        data: {\n          group_by: this.currentGroupFilter,\n          group_value: this.selectedChart?.title,\n          start_date: this.args.model.start_date,\n          end_date: this.args.model.end_date,\n          offset: this.nextOffset\n        }\n      });\n    }\n    async openToChart() {\n      const queryParams = this.router.currentRoute.queryParams;\n      if (queryParams.selectedChart) {\n        this.selectedChart = this.transformedData.find(data => data.title === queryParams.selectedChart);\n        if (!this.selectedChart) {\n          return;\n        }\n        this.showingSelectedChart = true;\n        try {\n          const response = await this.postRequest();\n          this.posts = response.posts.map(post => _post.default.create(post));\n          this.hasMorePosts = response.has_more;\n          this.nextOffset = response.next_offset;\n        } catch (e) {\n          (0, _ajaxError.popupAjaxError)(e);\n        }\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"openToChart\", [_object.action]);\n    }\n    async showDetails(data) {\n      if (this.selectedChart === data) {\n        // Don't do anything if the same chart is clicked again\n        return;\n      }\n      const currentQueryParams = this.router.currentRoute.queryParams;\n      const currentFilters = currentQueryParams?.filters ? JSON.parse(currentQueryParams.filters) : {};\n      this.router.transitionTo(this.router.currentRoute.name, {\n        queryParams: {\n          ...currentQueryParams,\n          filters: currentFilters,\n          selectedChart: data.title\n        }\n      });\n      this.selectedChart = data;\n      this.showingSelectedChart = true;\n      try {\n        const response = await this.postRequest();\n        this.posts = response.posts.map(post => _post.default.create(post));\n        this.hasMorePosts = response.has_more;\n        this.nextOffset = response.next_offset;\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"showDetails\", [_object.action]);\n    }\n    async fetchMorePosts() {\n      if (!this.hasMorePosts || this.selectedChart === null) {\n        return [];\n      }\n      try {\n        const response = await this.postRequest();\n        this.hasMorePosts = response.has_more;\n        this.nextOffset = response.next_offset;\n        const mappedPosts = response.posts.map(post => _post.default.create(post));\n        this.posts.push(mappedPosts);\n        return mappedPosts;\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"fetchMorePosts\", [_object.action]);\n    }\n    backToAllCharts() {\n      this.showingSelectedChart = false;\n      this.selectedChart = null;\n      this.activeFilter = \"all\";\n      this.posts = [];\n      const currentQueryParams = this.router.currentRoute.queryParams;\n      const currentFilters = currentQueryParams?.filters ? JSON.parse(currentQueryParams.filters) : {};\n      this.router.transitionTo(this.router.currentRoute.name, {\n        queryParams: {\n          ...currentQueryParams,\n          filters: currentFilters,\n          selectedChart: null\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"backToAllCharts\", [_object.action]);\n    }\n    shareChart() {\n      const url = this.router.currentURL;\n      if (!url) {\n        return;\n      }\n      (0, _utilities.clipboardCopy)((0, _getUrl.getAbsoluteURL)(url));\n      this.shareIcon = \"check\";\n      (0, _later.default)(() => {\n        this.shareIcon = \"link\";\n      }, 2000);\n    }\n    static {\n      dt7948.n(this.prototype, \"shareChart\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <span {{didInsert this.openToChart}}></span>\n      \n      {{#unless this.showingSelectedChart}}\n        <div class=\"admin-report-sentiment-analysis\">\n          <table class=\"sentiment-analysis-table md-table\">\n            <thead>\n              <th>{{this.groupingType}}</th>\n              <th>{{i18n\n                  \"discourse_ai.sentiments.sentiment_analysis.table.total_count\"\n                }}</th>\n              <th>{{i18n\n                  \"discourse_ai.sentiments.sentiment_analysis.table.sentiment\"\n                }}</th>\n            </thead>\n      \n            <tbody>\n              {{#each this.transformedData as |data|}}\n                <tr\n                  class=\"sentiment-analysis-table__row\"\n                  role=\"button\"\n                  {{on \"click\" (fn this.showDetails data)}}\n                >\n                  <td class=\"sentiment-analysis-table__title\">\n                    {{#if data.category}}\n                      {{categoryBadge data.category}}\n                    {{else}}\n                      {{data.title}}\n                    {{/if}}\n                  </td>\n                  <td\n                    class=\"sentiment-analysis-table__total-score\"\n                  >{{data.total_score}}</td>\n                  <td class=\"sentiment-horizontal-bar\">\n                    <AiSentimentHorizontalBar\n                      @type=\"positive\"\n                      @score={{data.score_map.positive}}\n                      @width={{data.widths.positive}}\n                    />\n                    <AiSentimentHorizontalBar\n                      @type=\"negative\"\n                      @score={{data.score_map.negative}}\n                      @width={{data.widths.negative}}\n                    />\n                    <AiSentimentHorizontalBar\n                      @type=\"neutral\"\n                      @score={{data.score_map.neutral}}\n                      @width={{data.widths.neutral}}\n                    />\n                  </td>\n                </tr>\n              {{/each}}\n            </tbody>\n          </table>\n        </div>\n      {{/unless}}\n      \n      {{#if (and this.selectedChart this.showingSelectedChart)}}\n        {{bodyClass \"showing-sentiment-analysis-chart\"}}\n        <div class=\"admin-report-sentiment-analysis__selected-chart\">\n          <div class=\"admin-report-sentiment-analysis__selected-chart-actions\">\n            <DButton\n              @label=\"back_button\"\n              @icon=\"chevron-left\"\n              class=\"btn-flat\"\n              @action={{this.backToAllCharts}}\n            />\n      \n            <DTooltip\n              class=\"share btn-flat\"\n              @icon={{this.shareIcon}}\n              {{on \"click\" this.shareChart}}\n              @content={{i18n\n                \"discourse_ai.sentiments.sentiment_analysis.share_chart\"\n              }}\n            />\n          </div>\n      \n          <DoughnutChart\n            @labels={{@model.labels}}\n            @colors={{this.colors}}\n            @data={{this.selectedChart.scores}}\n            @totalScore={{this.selectedChart.total_score}}\n            @doughnutTitle={{this.selectedChart.title}}\n            @displayLegend={{true}}\n          />\n      \n        </div>\n        <div class=\"admin-report-sentiment-analysis-details\">\n          <HorizontalOverflowNav\n            {{this.setActiveFilter}}\n            class=\"admin-report-sentiment-analysis-details__filters\"\n          >\n            {{#each this.postFilters as |filter|}}\n              <li data-filter-type={{filter.id}}>\n                <DButton\n                  @icon={{filter.icon}}\n                  @translatedLabel={{filter.text}}\n                  @action={{filter.action}}\n                  class=\"btn-transparent\"\n                />\n              </li>\n            {{/each}}\n          </HorizontalOverflowNav>\n      \n          <PostList\n            @posts={{this.filteredPosts}}\n            @urlPath=\"url\"\n            @idPath=\"post_id\"\n            @titlePath=\"topic_title\"\n            @usernamePath=\"username\"\n            @fetchMorePosts={{this.fetchMorePosts}}\n            class=\"admin-report-sentiment-analysis-details__post-list\"\n          >\n            <:abovePostItemExcerpt as |post|>\n              {{#let (this.sentimentMapping post.sentiment) as |sentiment|}}\n                <span\n                  class=\"admin-report-sentiment-analysis-details__post-score\"\n                  data-sentiment-score={{sentiment.id}}\n                >\n                  {{icon sentiment.icon}}\n                  {{sentiment.text}}\n                </span>\n              {{/let}}\n            </:abovePostItemExcerpt>\n          </PostList>\n        </div>\n      {{/if}}\n      */\n      {\n        \"id\": \"9cnc8qCf\",\n        \"block\": \"[[[11,1],[4,[32,0],[[30,0,[\\\"openToChart\\\"]]],null],[12],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[30,0,[\\\"showingSelectedChart\\\"]]],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"admin-report-sentiment-analysis\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"table\\\"],[14,0,\\\"sentiment-analysis-table md-table\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[12],[1,[30,0,[\\\"groupingType\\\"]]],[13],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.sentiments.sentiment_analysis.table.total_count\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.sentiments.sentiment_analysis.table.sentiment\\\"],null]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"transformedData\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[11,\\\"tr\\\"],[24,0,\\\"sentiment-analysis-table__row\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[32,2],[\\\"click\\\",[28,[32,3],[[30,0,[\\\"showDetails\\\"]],[30,1]],null]],null],[12],[1,\\\"\\\\n            \\\"],[10,\\\"td\\\"],[14,0,\\\"sentiment-analysis-table__title\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"category\\\"]],[[[1,\\\"                \\\"],[1,[28,[32,4],[[30,1,[\\\"category\\\"]]],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                \\\"],[1,[30,1,[\\\"title\\\"]]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"td\\\"],[14,0,\\\"sentiment-analysis-table__total-score\\\"],[12],[1,[30,1,[\\\"total_score\\\"]]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"td\\\"],[14,0,\\\"sentiment-horizontal-bar\\\"],[12],[1,\\\"\\\\n              \\\"],[8,[32,5],null,[[\\\"@type\\\",\\\"@score\\\",\\\"@width\\\"],[\\\"positive\\\",[30,1,[\\\"score_map\\\",\\\"positive\\\"]],[30,1,[\\\"widths\\\",\\\"positive\\\"]]]],null],[1,\\\"\\\\n              \\\"],[8,[32,5],null,[[\\\"@type\\\",\\\"@score\\\",\\\"@width\\\"],[\\\"negative\\\",[30,1,[\\\"score_map\\\",\\\"negative\\\"]],[30,1,[\\\"widths\\\",\\\"negative\\\"]]]],null],[1,\\\"\\\\n              \\\"],[8,[32,5],null,[[\\\"@type\\\",\\\"@score\\\",\\\"@width\\\"],[\\\"neutral\\\",[30,1,[\\\"score_map\\\",\\\"neutral\\\"]],[30,1,[\\\"widths\\\",\\\"neutral\\\"]]]],null],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[32,6],[[30,0,[\\\"selectedChart\\\"]],[30,0,[\\\"showingSelectedChart\\\"]]],null],[[[1,\\\"  \\\"],[1,[28,[32,7],[\\\"showing-sentiment-analysis-chart\\\"],null]],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"admin-report-sentiment-analysis__selected-chart\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"admin-report-sentiment-analysis__selected-chart-actions\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,8],[[24,0,\\\"btn-flat\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\"],[\\\"back_button\\\",\\\"chevron-left\\\",[30,0,[\\\"backToAllCharts\\\"]]]],null],[1,\\\"\\\\n\\\\n      \\\"],[8,[32,9],[[24,0,\\\"share btn-flat\\\"],[4,[32,2],[\\\"click\\\",[30,0,[\\\"shareChart\\\"]]],null]],[[\\\"@icon\\\",\\\"@content\\\"],[[30,0,[\\\"shareIcon\\\"]],[28,[32,1],[\\\"discourse_ai.sentiments.sentiment_analysis.share_chart\\\"],null]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[8,[32,10],null,[[\\\"@labels\\\",\\\"@colors\\\",\\\"@data\\\",\\\"@totalScore\\\",\\\"@doughnutTitle\\\",\\\"@displayLegend\\\"],[[30,2,[\\\"labels\\\"]],[30,0,[\\\"colors\\\"]],[30,0,[\\\"selectedChart\\\",\\\"scores\\\"]],[30,0,[\\\"selectedChart\\\",\\\"total_score\\\"]],[30,0,[\\\"selectedChart\\\",\\\"title\\\"]],true]],null],[1,\\\"\\\\n\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"admin-report-sentiment-analysis-details\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,11],[[24,0,\\\"admin-report-sentiment-analysis-details__filters\\\"],[4,[30,0,[\\\"setActiveFilter\\\"]],null,null]],null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"postFilters\\\"]]],null]],null],null,[[[1,\\\"        \\\"],[10,\\\"li\\\"],[15,\\\"data-filter-type\\\",[30,3,[\\\"id\\\"]]],[12],[1,\\\"\\\\n          \\\"],[8,[32,8],[[24,0,\\\"btn-transparent\\\"]],[[\\\"@icon\\\",\\\"@translatedLabel\\\",\\\"@action\\\"],[[30,3,[\\\"icon\\\"]],[30,3,[\\\"text\\\"]],[30,3,[\\\"action\\\"]]]],null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"    \\\"]],[]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[32,12],[[24,0,\\\"admin-report-sentiment-analysis-details__post-list\\\"]],[[\\\"@posts\\\",\\\"@urlPath\\\",\\\"@idPath\\\",\\\"@titlePath\\\",\\\"@usernamePath\\\",\\\"@fetchMorePosts\\\"],[[30,0,[\\\"filteredPosts\\\"]],\\\"url\\\",\\\"post_id\\\",\\\"topic_title\\\",\\\"username\\\",[30,0,[\\\"fetchMorePosts\\\"]]]],[[\\\"abovePostItemExcerpt\\\"],[[[[1,\\\"\\\\n\\\"],[44,[[28,[30,0,[\\\"sentimentMapping\\\"]],[[30,4,[\\\"sentiment\\\"]]],null]],[[[1,\\\"          \\\"],[10,1],[14,0,\\\"admin-report-sentiment-analysis-details__post-score\\\"],[15,\\\"data-sentiment-score\\\",[30,5,[\\\"id\\\"]]],[12],[1,\\\"\\\\n            \\\"],[1,[28,[32,13],[[30,5,[\\\"icon\\\"]]],null]],[1,\\\"\\\\n            \\\"],[1,[30,5,[\\\"text\\\"]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[5]]],[1,\\\"      \\\"]],[4]]]]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"data\\\",\\\"@model\\\",\\\"filter\\\",\\\"post\\\",\\\"sentiment\\\"],[\\\"unless\\\",\\\"each\\\",\\\"-track-array\\\",\\\"if\\\",\\\"let\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/admin-report-sentiment-analysis.js\",\n        \"scope\": () => [_didInsert.default, _discourseI18n.i18n, _modifier.on, _helper.fn, _categoryBadge.default, _aiSentimentHorizontalBar.default, _truthHelpers.and, _bodyClass.default, _dButton.default, _dTooltip.default, _doughnutChart.default, _horizontalOverflowNav.default, _postList.default, _dIcon.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AdminReportSentimentAnalysis;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-artifact\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/service\", \"@ember/template\", \"discourse/components/d-button\", \"discourse/helpers/html-class\", \"discourse/lib/get-url\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _didInsert, _service, _template, _dButton, _htmlClass, _getUrl, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiArtifactComponent extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"expanded\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #expanded = (dt7948.i(this, \"expanded\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"showingArtifact\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #showingArtifact = (dt7948.i(this, \"showingArtifact\"), void 0);\n    constructor() {\n      super(...arguments);\n      this.keydownHandler = this.handleKeydown.bind(this);\n      this.popStateHandler = this.handlePopState.bind(this);\n      window.addEventListener(\"popstate\", this.popStateHandler);\n    }\n    willDestroy() {\n      super.willDestroy(...arguments);\n      window.removeEventListener(\"keydown\", this.keydownHandler);\n      window.removeEventListener(\"popstate\", this.popStateHandler);\n    }\n    handleKeydown(event) {\n      if (event.key === \"Escape\" || event.key === \"Esc\") {\n        history.back();\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"handleKeydown\", [_object.action]);\n    }\n    handlePopState(event) {\n      const state = event.state;\n      this.expanded = state?.artifactId === this.args.artifactId;\n      if (!this.expanded) {\n        window.removeEventListener(\"keydown\", this.keydownHandler);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"handlePopState\", [_object.action]);\n    }\n    get requireClickToRun() {\n      if (this.showingArtifact) {\n        return false;\n      }\n      if (this.siteSettings.ai_artifact_security === \"strict\") {\n        return true;\n      }\n      if (this.siteSettings.ai_artifact_security === \"hybrid\") {\n        const shouldAutorun = this.args.autorun === \"true\" || this.args.autorun === true || this.args.autorun === \"1\";\n        return !shouldAutorun;\n      }\n      return this.siteSettings.ai_artifact_security !== \"lax\";\n    }\n    get artifactUrl() {\n      let url = (0, _getUrl.default)(`/discourse-ai/ai-bot/artifacts/${this.args.artifactId}`);\n      if (this.args.artifactVersion) {\n        url = `${url}/${this.args.artifactVersion}`;\n      }\n      return url;\n    }\n    showArtifact() {\n      this.showingArtifact = true;\n    }\n    static {\n      dt7948.n(this.prototype, \"showArtifact\", [_object.action]);\n    }\n    toggleView() {\n      if (!this.expanded) {\n        window.history.pushState({\n          artifactId: this.args.artifactId\n        }, \"\", window.location.href + \"#artifact-fullscreen\");\n        window.addEventListener(\"keydown\", this.keydownHandler);\n      } else {\n        history.back();\n      }\n      this.expanded = !this.expanded;\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleView\", [_object.action]);\n    }\n    get wrapperClasses() {\n      return `ai-artifact__wrapper ${this.expanded ? \"ai-artifact__expanded\" : \"\"} ${this.seamless ? \"ai-artifact__seamless\" : \"\"}`;\n    }\n    setDataAttributes(element) {\n      if (this.args.dataAttributes) {\n        Object.entries(this.args.dataAttributes).forEach(([key, value]) => {\n          element.setAttribute(key, value);\n        });\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"setDataAttributes\", [_object.action]);\n    }\n    get heightStyle() {\n      if (this.args.artifactHeight) {\n        let height = parseInt(this.args.artifactHeight, 10);\n        if (isNaN(height) || height <= 0) {\n          height = 500; // default height if the provided value is invalid\n        }\n        if (height > 2000) {\n          height = 2000; // cap the height to a maximum of 2000px\n        }\n        return (0, _template.htmlSafe)(`height: ${height}px;`);\n      }\n    }\n    get seamless() {\n      return this.args.seamless === \"true\" || this.args.seamless === true || this.args.seamless === \"1\";\n    }\n    get showFooter() {\n      return !this.seamless && !this.requireClickToRun;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.expanded}}\n        {{htmlClass \"ai-artifact-expanded\"}}\n      {{/if}}\n      <div class={{this.wrapperClasses}} style={{this.heightStyle}}>\n        <div class=\"ai-artifact__panel--wrapper\">\n          <div class=\"ai-artifact__panel\">\n            <DButton\n              class=\"btn-flat btn-icon-text\"\n              @icon=\"discourse-compress\"\n              @label=\"discourse_ai.ai_artifact.collapse_view_label\"\n              @action={{this.toggleView}}\n            />\n          </div>\n        </div>\n        {{#if this.requireClickToRun}}\n          <div class=\"ai-artifact__click-to-run\">\n            <DButton\n              class=\"btn btn-primary\"\n              @icon=\"play\"\n              @label=\"discourse_ai.ai_artifact.click_to_run_label\"\n              @action={{this.showArtifact}}\n            />\n          </div>\n        {{else}}\n          <iframe\n            title=\"AI Artifact\"\n            src={{this.artifactUrl}}\n            width=\"100%\"\n            frameborder=\"0\"\n            {{didInsert this.setDataAttributes}}\n          ></iframe>\n        {{/if}}\n        {{#if this.showFooter}}\n          <div class=\"ai-artifact__footer\">\n            <DButton\n              class=\"btn-transparent btn-icon-text ai-artifact__expand-button\"\n              @icon=\"discourse-expand\"\n              @label=\"discourse_ai.ai_artifact.expand_view_label\"\n              @action={{this.toggleView}}\n            />\n          </div>\n        {{/if}}\n      </div>\n      */\n      {\n        \"id\": \"y+hC3soH\",\n        \"block\": \"[[[41,[30,0,[\\\"expanded\\\"]],[[[1,\\\"  \\\"],[1,[28,[32,0],[\\\"ai-artifact-expanded\\\"],null]],[1,\\\"\\\\n\\\"]],[]],null],[10,0],[15,0,[30,0,[\\\"wrapperClasses\\\"]]],[15,5,[30,0,[\\\"heightStyle\\\"]]],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"ai-artifact__panel--wrapper\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-artifact__panel\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,1],[[24,0,\\\"btn-flat btn-icon-text\\\"]],[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\"],[\\\"discourse-compress\\\",\\\"discourse_ai.ai_artifact.collapse_view_label\\\",[30,0,[\\\"toggleView\\\"]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"requireClickToRun\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"ai-artifact__click-to-run\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,1],[[24,0,\\\"btn btn-primary\\\"]],[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\"],[\\\"play\\\",\\\"discourse_ai.ai_artifact.click_to_run_label\\\",[30,0,[\\\"showArtifact\\\"]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[11,\\\"iframe\\\"],[24,\\\"title\\\",\\\"AI Artifact\\\"],[16,\\\"src\\\",[30,0,[\\\"artifactUrl\\\"]]],[24,\\\"width\\\",\\\"100%\\\"],[24,\\\"frameborder\\\",\\\"0\\\"],[4,[32,2],[[30,0,[\\\"setDataAttributes\\\"]]],null],[12],[13],[1,\\\"\\\\n\\\"]],[]]],[41,[30,0,[\\\"showFooter\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"ai-artifact__footer\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,1],[[24,0,\\\"btn-transparent btn-icon-text ai-artifact__expand-button\\\"]],[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\"],[\\\"discourse-expand\\\",\\\"discourse_ai.ai_artifact.expand_view_label\\\",[30,0,[\\\"toggleView\\\"]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-artifact.js\",\n        \"scope\": () => [_htmlClass.default, _dButton.default, _didInsert.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiArtifactComponent;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-blinking-animation\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/render-modifiers/modifiers/did-update\", \"@ember/render-modifiers/modifiers/will-destroy\", \"@ember/runloop\", \"discourse/helpers/concat-class\", \"discourse/lib/later\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _didInsert, _didUpdate, _willDestroy, _runloop, _concatClass, _later, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class Block {\n    static {\n      dt7948.g(this.prototype, \"show\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #show = (dt7948.i(this, \"show\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"shown\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #shown = (dt7948.i(this, \"shown\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"blinking\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #blinking = (dt7948.i(this, \"blinking\"), void 0);\n    constructor(args = {}) {\n      this.show = args.show ?? false;\n      this.shown = args.shown ?? false;\n    }\n  }\n  const BLOCKS_SIZE = 20; // changing this requires to change css accordingly\n  class AiBlinkingAnimation extends _component.default {\n    blocks = [...Array.from({\n      length: BLOCKS_SIZE\n    }, () => new Block())];\n    #nextBlockBlinkingTimer;\n    #blockBlinkingTimer;\n    #blockShownTimer;\n    setupAnimation() {\n      this.blocks[0].show = true;\n      this.blocks[0].shown = true;\n    }\n    static {\n      dt7948.n(this.prototype, \"setupAnimation\", [_object.action]);\n    }\n    onBlinking(block) {\n      if (!block.blinking) {\n        return;\n      }\n      block.show = false;\n      this.#nextBlockBlinkingTimer = (0, _later.default)(this, () => {\n        this.#nextBlock(block).blinking = true;\n      }, 250);\n      this.#blockBlinkingTimer = (0, _later.default)(this, () => {\n        block.blinking = false;\n      }, 500);\n    }\n    static {\n      dt7948.n(this.prototype, \"onBlinking\", [_object.action]);\n    }\n    onShowing(block) {\n      if (!block.show) {\n        return;\n      }\n      this.#blockShownTimer = (0, _later.default)(this, () => {\n        this.#nextBlock(block).show = true;\n        this.#nextBlock(block).shown = true;\n        if (this.blocks.at(-1) === block) {\n          this.blocks[0].blinking = true;\n        }\n      }, 250);\n    }\n    static {\n      dt7948.n(this.prototype, \"onShowing\", [_object.action]);\n    }\n    teardownAnimation() {\n      (0, _runloop.cancel)(this.#blockShownTimer);\n      (0, _runloop.cancel)(this.#nextBlockBlinkingTimer);\n      (0, _runloop.cancel)(this.#blockBlinkingTimer);\n    }\n    static {\n      dt7948.n(this.prototype, \"teardownAnimation\", [_object.action]);\n    }\n    #nextBlock(currentBlock) {\n      if (currentBlock === this.blocks.at(-1)) {\n        return this.blocks[0];\n      } else {\n        return this.blocks[this.blocks.indexOf(currentBlock) + 1];\n      }\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <ul class=\"ai-blinking-animation\" {{didInsert this.setupAnimation}}>\n        {{#each this.blocks as |block|}}\n          <li\n            class={{concatClass\n              \"ai-blinking-animation__list-item\"\n              (if block.show \"show\")\n              (if block.shown \"is-shown\")\n              (if block.blinking \"blink\")\n            }}\n            {{didUpdate (fn this.onBlinking block) block.blinking}}\n            {{didUpdate (fn this.onShowing block) block.show}}\n            {{willDestroy this.teardownAnimation}}\n          ></li>\n        {{/each}}\n      </ul>\n      */\n      {\n        \"id\": \"JNDFGwia\",\n        \"block\": \"[[[11,\\\"ul\\\"],[24,0,\\\"ai-blinking-animation\\\"],[4,[32,0],[[30,0,[\\\"setupAnimation\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"blocks\\\"]]],null]],null],null,[[[1,\\\"    \\\"],[11,\\\"li\\\"],[16,0,[28,[32,1],[\\\"ai-blinking-animation__list-item\\\",[52,[30,1,[\\\"show\\\"]],\\\"show\\\"],[52,[30,1,[\\\"shown\\\"]],\\\"is-shown\\\"],[52,[30,1,[\\\"blinking\\\"]],\\\"blink\\\"]],null]],[4,[32,2],[[28,[32,3],[[30,0,[\\\"onBlinking\\\"]],[30,1]],null],[30,1,[\\\"blinking\\\"]]],null],[4,[32,2],[[28,[32,3],[[30,0,[\\\"onShowing\\\"]],[30,1]],null],[30,1,[\\\"show\\\"]]],null],[4,[32,4],[[30,0,[\\\"teardownAnimation\\\"]]],null],[12],[13],[1,\\\"\\\\n\\\"]],[1]],null],[13]],[\\\"block\\\"],[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-blinking-animation.js\",\n        \"scope\": () => [_didInsert.default, _concatClass.default, _didUpdate.default, _helper.fn, _willDestroy.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiBlinkingAnimation;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-bot-conversations\", [\"exports\", \"@glimmer/tracking\", \"@ember/component\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"@ember/owner\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/runloop\", \"@ember/service\", \"@ember/template\", \"@ember-compat/tracked-built-ins\", \"ember-modifier\", \"discourse/components/d-button\", \"discourse/components/plugin-outlet\", \"discourse/components/user-autocomplete-results\", \"discourse/helpers/body-class\", \"discourse/helpers/concat-class\", \"discourse/helpers/lazy-hash\", \"discourse/lib/ajax-error\", \"discourse/lib/hashtag-autocomplete\", \"discourse/lib/textarea-text-manipulation\", \"discourse/lib/uppy/uppy-upload\", \"discourse/lib/uppy-media-optimization-plugin\", \"discourse/lib/user-search\", \"discourse/lib/user-status-on-autocomplete\", \"discourse/lib/utilities\", \"discourse/modifiers/d-autocomplete\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-persona-llm-selector\", \"@ember/template-factory\"], function (_exports, _tracking, _component, _helper, _modifier, _object, _owner, _didInsert, _runloop, _service, _template, _trackedBuiltIns, _emberModifier, _dButton, _pluginOutlet, _userAutocompleteResults, _bodyClass, _concatClass, _lazyHash, _ajaxError, _hashtagAutocomplete, _textareaTextManipulation, _uppyUpload, _uppyMediaOptimizationPlugin, _userSearch, _userStatusOnAutocomplete, _utilities, _dAutocomplete, _discourseI18n, _aiPersonaLlmSelector, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /* eslint-disable ember/no-classic-components */\n\n  class AiBotConversations extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"aiCredits\", [_service.service]);\n    }\n    #aiCredits = (dt7948.i(this, \"aiCredits\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"aiBotConversationsHiddenSubmit\", [_service.service]);\n    }\n    #aiBotConversationsHiddenSubmit = (dt7948.i(this, \"aiBotConversationsHiddenSubmit\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"capabilities\", [_service.service]);\n    }\n    #capabilities = (dt7948.i(this, \"capabilities\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"mediaOptimizationWorker\", [_service.service]);\n    }\n    #mediaOptimizationWorker = (dt7948.i(this, \"mediaOptimizationWorker\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"site\", [_service.service]);\n    }\n    #site = (dt7948.i(this, \"site\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"tooltip\", [_service.service]);\n    }\n    #tooltip = (dt7948.i(this, \"tooltip\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"creditStatus\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #creditStatus = (dt7948.i(this, \"creditStatus\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedLlmId\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #selectedLlmId = (dt7948.i(this, \"selectedLlmId\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"uploads\", [_tracking.tracked], function () {\n        return new _trackedBuiltIns.TrackedArray();\n      });\n    }\n    #uploads = (dt7948.i(this, \"uploads\"), void 0);\n    // Don't track this directly - we'll get it from uppyUpload\n    textarea = null;\n    uppyUpload = null;\n    fileInputEl = null;\n    creditLimitTooltipModifier = (0, _emberModifier.modifier)(element => {\n      if (!this.isSubmitDisabled) {\n        return;\n      }\n      const instance = this.tooltip.register(element, {\n        identifier: \"ai-credit-limit-tooltip\",\n        content: (0, _template.htmlSafe)(this.aiCredits.getCreditLimitMessage(this.creditStatus)),\n        placement: \"top\",\n        triggers: \"hover\",\n        interactive: true,\n        trapTab: false\n      });\n      return () => {\n        instance.destroy();\n      };\n    });\n    #handlePaste = event => {\n      if (document.activeElement !== this.textarea) {\n        return;\n      }\n      const {\n        canUpload,\n        canPasteHtml,\n        types\n      } = (0, _utilities.clipboardHelpers)(event, {\n        siteSettings: this.siteSettings,\n        canUpload: true\n      });\n      if (!canUpload || canPasteHtml || types.includes(\"text/plain\")) {\n        return;\n      }\n      if (event && event.clipboardData && event.clipboardData.files) {\n        this.uppyUpload.addFiles([...event.clipboardData.files], {\n          pasted: true\n        });\n      }\n    };\n    init() {\n      super.init(...arguments);\n      this.uppyUpload = new _uppyUpload.default((0, _owner.getOwner)(this), {\n        id: \"ai-bot-file-uploader\",\n        type: \"ai-bot-conversation\",\n        useMultipartUploadsIfAvailable: true,\n        uppyReady: () => {\n          if (this.siteSettings.composer_media_optimization_image_enabled) {\n            this.uppyUpload.uppyWrapper.useUploadPlugin(_uppyMediaOptimizationPlugin.default, {\n              optimizeFn: (data, opts) => this.mediaOptimizationWorker.optimizeImage(data, opts),\n              runParallel: !this.capabilities.isMobileDevice\n            });\n          }\n          this.uppyUpload.uppyWrapper.onPreProcessProgress(file => {\n            const inProgressUpload = this.inProgressUploads?.find(upl => upl.id === file.id);\n            if (inProgressUpload && !inProgressUpload.processing) {\n              inProgressUpload.processing = true;\n            }\n          });\n          this.uppyUpload.uppyWrapper.onPreProcessComplete(file => {\n            const inProgressUpload = this.inProgressUploads?.find(upl => upl.id === file.id);\n            if (inProgressUpload) {\n              inProgressUpload.processing = false;\n            }\n          });\n          this.textarea?.addEventListener(\"paste\", this.#handlePaste);\n        },\n        uploadDone: upload => {\n          this.uploads.push(upload);\n        },\n        // Fix: Don't try to set inProgressUploads directly\n        onProgressUploadsChanged: () => {\n          // This is just for UI triggers - we're already tracking inProgressUploads\n          this.notifyPropertyChange(\"inProgressUploads\");\n        }\n      });\n    }\n    willDestroy() {\n      super.willDestroy(...arguments);\n      this.textarea?.removeEventListener(\"paste\", this.#handlePaste);\n      this.uppyUpload?.teardown();\n      // needed for safety (textarea may not have a autocomplete)\n      if (this.textarea.autocomplete) {\n        this.textarea.autocomplete(\"destroy\");\n      }\n    }\n    get loading() {\n      return this.aiBotConversationsHiddenSubmit?.loading;\n    }\n    get inProgressUploads() {\n      return this.uppyUpload?.inProgressUploads || [];\n    }\n    get showUploadsContainer() {\n      return this.uploads?.length > 0 || this.inProgressUploads?.length > 0;\n    }\n    get isSubmitDisabled() {\n      return this.creditStatus?.hard_limit_reached === true;\n    }\n    async setPersonaId(id) {\n      this.aiBotConversationsHiddenSubmit.personaId = id;\n      // Only check persona credits if no LLM is explicitly selected\n      // (e.g., when persona has force_default_llm)\n      if (!this.selectedLlmId) {\n        await this.#checkCreditStatus(id, \"persona\");\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"setPersonaId\", [_object.action]);\n    }\n    async setLlmId(llmModelId) {\n      this.selectedLlmId = llmModelId;\n      await this.#checkCreditStatus(llmModelId, \"llm\");\n    }\n    static {\n      dt7948.n(this.prototype, \"setLlmId\", [_object.action]);\n    }\n    async #checkCreditStatus(id, type) {\n      // Clear status immediately to prevent stale data\n      this.creditStatus = null;\n      if (!id) {\n        return;\n      }\n      try {\n        this.creditStatus = type === \"persona\" ? await this.aiCredits.getPersonaCreditStatus(id) : await this.aiCredits.getLlmModelCreditStatus(id);\n      } catch {\n        // Fail open - allow usage if credit check fails\n        this.creditStatus = null;\n      }\n    }\n    setTargetRecipient(username) {\n      this.aiBotConversationsHiddenSubmit.targetUsername = username;\n    }\n    static {\n      dt7948.n(this.prototype, \"setTargetRecipient\", [_object.action]);\n    }\n    updateInputValue(value) {\n      this._autoExpandTextarea();\n      this.aiBotConversationsHiddenSubmit.inputValue = value.target?.value || value;\n    }\n    static {\n      dt7948.n(this.prototype, \"updateInputValue\", [_object.action]);\n    }\n    handleKeyDown(event) {\n      if (event.target.tagName !== \"TEXTAREA\") {\n        return;\n      }\n      if (event.key === \"Enter\" && !event.shiftKey) {\n        this.prepareAndSubmitToBot();\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"handleKeyDown\", [_object.action]);\n    }\n    setTextArea(element) {\n      this.textarea = element;\n      this.setupAutocomplete(element);\n      (0, _runloop.scheduleOnce)(\"afterRender\", this, this.focusTextarea);\n    }\n    static {\n      dt7948.n(this.prototype, \"setTextArea\", [_object.action]);\n    }\n    focusTextarea() {\n      this.textarea?.focus();\n    }\n    static {\n      dt7948.n(this.prototype, \"focusTextarea\", [_object.action]);\n    }\n    setupAutocomplete(textarea) {\n      this.applyUserAutocomplete(textarea);\n      this.applyHashtagAutocomplete(textarea);\n    }\n    static {\n      dt7948.n(this.prototype, \"setupAutocomplete\", [_object.action]);\n    }\n    applyUserAutocomplete(textarea) {\n      if (!this.siteSettings.enable_mentions) {\n        return;\n      }\n      const autocompleteHandler = new _textareaTextManipulation.TextareaAutocompleteHandler(textarea);\n      _dAutocomplete.default.setupAutocomplete((0, _owner.getOwner)(this), textarea, autocompleteHandler, {\n        component: _userAutocompleteResults.default,\n        key: _userAutocompleteResults.default.TRIGGER_KEY,\n        dataSource: term => {\n          (0, _userStatusOnAutocomplete.destroyUserStatuses)();\n          return (0, _userSearch.default)({\n            term,\n            includeGroups: true\n          }).then(result => {\n            (0, _userStatusOnAutocomplete.initUserStatusHtml)((0, _owner.getOwner)(this), result.users);\n            return result;\n          });\n        },\n        onRender: options => (0, _userStatusOnAutocomplete.renderUserStatusHtml)(options),\n        fixedTextareaPosition: true,\n        autoSelectFirstSuggestion: true,\n        offset: 2,\n        transformComplete: obj => {\n          (0, _userSearch.validateSearchResult)(obj);\n          return obj.username || obj.name;\n        },\n        afterComplete: text => {\n          this.textarea.value = text;\n          this.focusTextarea();\n          this.updateInputValue({\n            target: {\n              value: text\n            }\n          });\n        },\n        onClose: _userStatusOnAutocomplete.destroyUserStatuses\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"applyUserAutocomplete\", [_object.action]);\n    }\n    applyHashtagAutocomplete(textarea) {\n      // Use the \"topic-composer\" configuration or create a specific one for AI bot\n      // You can change this to \"chat-composer\" if that's more appropriate\n      const hashtagConfig = this.site.hashtag_configurations[\"topic-composer\"];\n      const autocompleteHandler = new _textareaTextManipulation.TextareaAutocompleteHandler(textarea);\n      _dAutocomplete.default.setupAutocomplete((0, _owner.getOwner)(this), textarea, autocompleteHandler, (0, _hashtagAutocomplete.hashtagAutocompleteOptions)(hashtagConfig, {\n        offset: 2,\n        fixedTextareaPosition: true,\n        afterComplete: text => {\n          this.textarea.value = text;\n          this.focusTextarea();\n          this.updateInputValue({\n            target: {\n              value: text\n            }\n          });\n        }\n      }));\n    }\n    static {\n      dt7948.n(this.prototype, \"applyHashtagAutocomplete\", [_object.action]);\n    }\n    registerFileInput(element) {\n      if (element) {\n        this.fileInputEl = element;\n        if (this.uppyUpload) {\n          this.uppyUpload.setup(element);\n        }\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"registerFileInput\", [_object.action]);\n    }\n    openFileUpload() {\n      if (this.fileInputEl) {\n        this.fileInputEl.click();\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"openFileUpload\", [_object.action]);\n    }\n    removeUpload(upload) {\n      this.uploads = new _trackedBuiltIns.TrackedArray(this.uploads.filter(u => u !== upload));\n    }\n    static {\n      dt7948.n(this.prototype, \"removeUpload\", [_object.action]);\n    }\n    cancelUpload(upload) {\n      this.uppyUpload.cancelSingleUpload({\n        fileId: upload.id\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"cancelUpload\", [_object.action]);\n    }\n    async prepareAndSubmitToBot() {\n      try {\n        await this.aiBotConversationsHiddenSubmit.submitToBot({\n          uploads: this.uploads,\n          inProgressUploadsCount: this.inProgressUploads.length\n        });\n        this.uploads = new _trackedBuiltIns.TrackedArray();\n      } catch (error) {\n        (0, _ajaxError.popupAjaxError)(error);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"prepareAndSubmitToBot\", [_object.action]);\n    }\n    _autoExpandTextarea() {\n      this.textarea.style.height = \"auto\";\n      this.textarea.style.height = this.textarea.scrollHeight + \"px\";\n      // Get the max-height value from CSS (30vh)\n      const maxHeight = parseInt(getComputedStyle(this.textarea).maxHeight, 10);\n      // Only enable scrolling if content exceeds max-height\n      if (this.textarea.scrollHeight > maxHeight) {\n        this.textarea.style.overflowY = \"auto\";\n      } else {\n        this.textarea.style.overflowY = \"hidden\";\n      }\n    }\n    static {\n      (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"ai-bot-conversations\">\n        {{bodyClass \"ai-bot-conversations-page\"}}\n        <AiPersonaLlmSelector\n          @showLabels={{true}}\n          @setPersonaId={{this.setPersonaId}}\n          @setLlmId={{this.setLlmId}}\n          @setTargetRecipient={{this.setTargetRecipient}}\n          @personaName={{@controller.persona}}\n          @llmName={{@controller.llm}}\n        />\n      \n        <div class=\"ai-bot-conversations__content-wrapper\">\n          <div class=\"ai-bot-conversations__title\">\n            {{i18n \"discourse_ai.ai_bot.conversations.header\"}}\n          </div>\n          <PluginOutlet\n            @name=\"ai-bot-conversations-above-input\"\n            @outletArgs={{lazyHash\n              updateInput=this.updateInputValue\n              submit=this.prepareAndSubmitToBot\n            }}\n          />\n      \n          <div\n            {{this.creditLimitTooltipModifier}}\n            class={{concatClass\n              \"ai-bot-conversations__input-wrapper\"\n              (if this.isSubmitDisabled \"--disabled\")\n            }}\n          >\n            <DButton\n              @icon=\"upload\"\n              @action={{unless this.isSubmitDisabled this.openFileUpload}}\n              @disabled={{this.isSubmitDisabled}}\n              @title=\"discourse_ai.ai_bot.conversations.upload_files\"\n              class=\"btn btn-transparent ai-bot-upload-btn\"\n            />\n            <textarea\n              {{didInsert this.setTextArea}}\n              {{on \"input\" this.updateInputValue}}\n              {{on \"keydown\" this.handleKeyDown}}\n              id=\"ai-bot-conversations-input\"\n              autofocus={{unless this.isSubmitDisabled \"true\"}}\n              placeholder={{i18n \"discourse_ai.ai_bot.conversations.placeholder\"}}\n              minlength=\"10\"\n              disabled={{if this.isSubmitDisabled true this.loading}}\n              rows=\"1\"\n            />\n            <DButton\n              @action={{unless this.isSubmitDisabled this.prepareAndSubmitToBot}}\n              @icon=\"paper-plane\"\n              @disabled={{this.isSubmitDisabled}}\n              @isLoading={{unless this.isSubmitDisabled this.loading}}\n              @title=\"discourse_ai.ai_bot.conversations.header\"\n              class=\"ai-bot-button btn-transparent ai-conversation-submit\"\n            />\n            <input\n              type=\"file\"\n              id=\"ai-bot-file-uploader\"\n              class=\"hidden-upload-field\"\n              multiple=\"multiple\"\n              {{didInsert this.registerFileInput}}\n            />\n          </div>\n      \n          <p class=\"ai-disclaimer\">\n            {{i18n \"discourse_ai.ai_bot.conversations.disclaimer\"}}\n          </p>\n      \n          {{#if this.showUploadsContainer}}\n            <div class=\"ai-bot-conversations__uploads-container\">\n              {{#each this.uploads as |upload|}}\n                <div class=\"ai-bot-upload\">\n                  <span class=\"ai-bot-upload__filename\">\n                    {{upload.original_filename}}\n                  </span>\n                  <DButton\n                    @icon=\"xmark\"\n                    @action={{fn this.removeUpload upload}}\n                    class=\"btn-transparent ai-bot-upload__remove\"\n                  />\n                </div>\n              {{/each}}\n      \n              {{#each this.inProgressUploads as |upload|}}\n                <div class=\"ai-bot-upload ai-bot-upload--in-progress\">\n                  <span class=\"ai-bot-upload__filename\">{{upload.fileName}}</span>\n                  <span class=\"ai-bot-upload__progress\">\n                    {{upload.progress}}%\n                  </span>\n                  <DButton\n                    @icon=\"xmark\"\n                    @action={{fn this.cancelUpload upload}}\n                    class=\"btn-flat ai-bot-upload__cancel\"\n                  />\n                </div>\n              {{/each}}\n            </div>\n          {{/if}}\n        </div>\n      </div>\n      */\n      {\n        \"id\": \"Uc5N85W2\",\n        \"block\": \"[[[10,0],[14,0,\\\"ai-bot-conversations\\\"],[12],[1,\\\"\\\\n  \\\"],[1,[28,[32,0],[\\\"ai-bot-conversations-page\\\"],null]],[1,\\\"\\\\n  \\\"],[8,[32,1],null,[[\\\"@showLabels\\\",\\\"@setPersonaId\\\",\\\"@setLlmId\\\",\\\"@setTargetRecipient\\\",\\\"@personaName\\\",\\\"@llmName\\\"],[true,[30,0,[\\\"setPersonaId\\\"]],[30,0,[\\\"setLlmId\\\"]],[30,0,[\\\"setTargetRecipient\\\"]],[30,1,[\\\"persona\\\"]],[30,1,[\\\"llm\\\"]]]],null],[1,\\\"\\\\n\\\\n  \\\"],[10,0],[14,0,\\\"ai-bot-conversations__content-wrapper\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-bot-conversations__title\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[32,2],[\\\"discourse_ai.ai_bot.conversations.header\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[8,[32,3],null,[[\\\"@name\\\",\\\"@outletArgs\\\"],[\\\"ai-bot-conversations-above-input\\\",[28,[32,4],null,[[\\\"updateInput\\\",\\\"submit\\\"],[[30,0,[\\\"updateInputValue\\\"]],[30,0,[\\\"prepareAndSubmitToBot\\\"]]]]]]],null],[1,\\\"\\\\n\\\\n    \\\"],[11,0],[16,0,[28,[32,5],[\\\"ai-bot-conversations__input-wrapper\\\",[52,[30,0,[\\\"isSubmitDisabled\\\"]],\\\"--disabled\\\"]],null]],[4,[30,0,[\\\"creditLimitTooltipModifier\\\"]],null,null],[12],[1,\\\"\\\\n      \\\"],[8,[32,6],[[24,0,\\\"btn btn-transparent ai-bot-upload-btn\\\"]],[[\\\"@icon\\\",\\\"@action\\\",\\\"@disabled\\\",\\\"@title\\\"],[\\\"upload\\\",[52,[51,[30,0,[\\\"isSubmitDisabled\\\"]]],[30,0,[\\\"openFileUpload\\\"]]],[30,0,[\\\"isSubmitDisabled\\\"]],\\\"discourse_ai.ai_bot.conversations.upload_files\\\"]],null],[1,\\\"\\\\n      \\\"],[11,\\\"textarea\\\"],[24,1,\\\"ai-bot-conversations-input\\\"],[16,\\\"autofocus\\\",[52,[51,[30,0,[\\\"isSubmitDisabled\\\"]]],\\\"true\\\"]],[16,\\\"placeholder\\\",[28,[32,2],[\\\"discourse_ai.ai_bot.conversations.placeholder\\\"],null]],[24,\\\"minlength\\\",\\\"10\\\"],[16,\\\"disabled\\\",[52,[30,0,[\\\"isSubmitDisabled\\\"]],true,[30,0,[\\\"loading\\\"]]]],[24,\\\"rows\\\",\\\"1\\\"],[4,[32,7],[[30,0,[\\\"setTextArea\\\"]]],null],[4,[32,8],[\\\"input\\\",[30,0,[\\\"updateInputValue\\\"]]],null],[4,[32,8],[\\\"keydown\\\",[30,0,[\\\"handleKeyDown\\\"]]],null],[12],[13],[1,\\\"      \\\"],[8,[32,6],[[24,0,\\\"ai-bot-button btn-transparent ai-conversation-submit\\\"]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@disabled\\\",\\\"@isLoading\\\",\\\"@title\\\"],[[52,[51,[30,0,[\\\"isSubmitDisabled\\\"]]],[30,0,[\\\"prepareAndSubmitToBot\\\"]]],\\\"paper-plane\\\",[30,0,[\\\"isSubmitDisabled\\\"]],[52,[51,[30,0,[\\\"isSubmitDisabled\\\"]]],[30,0,[\\\"loading\\\"]]],\\\"discourse_ai.ai_bot.conversations.header\\\"]],null],[1,\\\"\\\\n      \\\"],[11,\\\"input\\\"],[24,1,\\\"ai-bot-file-uploader\\\"],[24,0,\\\"hidden-upload-field\\\"],[24,\\\"multiple\\\",\\\"multiple\\\"],[24,4,\\\"file\\\"],[4,[32,7],[[30,0,[\\\"registerFileInput\\\"]]],null],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,2],[14,0,\\\"ai-disclaimer\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[32,2],[\\\"discourse_ai.ai_bot.conversations.disclaimer\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"showUploadsContainer\\\"]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"ai-bot-conversations__uploads-container\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,3],[[28,[31,3],[[30,0,[\\\"uploads\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[10,0],[14,0,\\\"ai-bot-upload\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"ai-bot-upload__filename\\\"],[12],[1,\\\"\\\\n              \\\"],[1,[30,2,[\\\"original_filename\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[8,[32,6],[[24,0,\\\"btn-transparent ai-bot-upload__remove\\\"]],[[\\\"@icon\\\",\\\"@action\\\"],[\\\"xmark\\\",[28,[32,9],[[30,0,[\\\"removeUpload\\\"]],[30,2]],null]]],null],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"\\\\n\\\"],[42,[28,[31,3],[[28,[31,3],[[30,0,[\\\"inProgressUploads\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[10,0],[14,0,\\\"ai-bot-upload ai-bot-upload--in-progress\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"ai-bot-upload__filename\\\"],[12],[1,[30,3,[\\\"fileName\\\"]]],[13],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"ai-bot-upload__progress\\\"],[12],[1,\\\"\\\\n              \\\"],[1,[30,3,[\\\"progress\\\"]]],[1,\\\"%\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[8,[32,6],[[24,0,\\\"btn-flat ai-bot-upload__cancel\\\"]],[[\\\"@icon\\\",\\\"@action\\\"],[\\\"xmark\\\",[28,[32,9],[[30,0,[\\\"cancelUpload\\\"]],[30,3]],null]]],null],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@controller\\\",\\\"upload\\\",\\\"upload\\\"],[\\\"if\\\",\\\"unless\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-bot-conversations.js\",\n        \"scope\": () => [_bodyClass.default, _aiPersonaLlmSelector.default, _discourseI18n.i18n, _pluginOutlet.default, _lazyHash.default, _concatClass.default, _dButton.default, _didInsert.default, _modifier.on, _helper.fn],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiBotConversations;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-bot-header-icon\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/components/plugin-outlet\", \"discourse/helpers/lazy-hash\", \"discourse/lib/get-url\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/services/ai-conversations-sidebar-manager\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _service, _dButton, _pluginOutlet, _lazyHash, _getUrl, _discourseI18n, _aiConversationsSidebarManager, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiBotHeaderIcon extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"appEvents\", [_service.service]);\n    }\n    #appEvents = (dt7948.i(this, \"appEvents\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"navigationMenu\", [_service.service]);\n    }\n    #navigationMenu = (dt7948.i(this, \"navigationMenu\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"sidebarState\", [_service.service]);\n    }\n    #sidebarState = (dt7948.i(this, \"sidebarState\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"aiConversationsSidebarManager\", [_service.service]);\n    }\n    #aiConversationsSidebarManager = (dt7948.i(this, \"aiConversationsSidebarManager\"), void 0);\n    get bots() {\n      const availableBots = this.currentUser.ai_enabled_chat_bots.filter(bot => !bot.is_persona || bot.has_default_llm).filter(Boolean);\n      return availableBots ? availableBots.map(bot => bot.model_name) : [];\n    }\n    get showHeaderButton() {\n      return this.bots.length > 0 && this.siteSettings.ai_bot_add_to_header;\n    }\n    get title() {\n      if (this.clickShouldRouteOutOfConversations) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.exit\");\n      }\n      return (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.shortcut_title\");\n    }\n    get icon() {\n      if (this.clickShouldRouteOutOfConversations) {\n        return \"shuffle\";\n      }\n      return \"robot\";\n    }\n    get clickShouldRouteOutOfConversations() {\n      return !this.navigationMenu.isHeaderDropdownMode && this.sidebarState.currentPanel?.key === _aiConversationsSidebarManager.AI_CONVERSATIONS_PANEL;\n    }\n    get href() {\n      if (this.clickShouldRouteOutOfConversations) {\n        return (0, _getUrl.default)(this.aiConversationsSidebarManager.lastKnownAppURL || \"/\");\n      }\n      return (0, _getUrl.default)(\"/discourse-ai/ai-bot/conversations\");\n    }\n    onClick() {\n      if (!this.clickShouldRouteOutOfConversations) {\n        this.appEvents.trigger(\"discourse-ai:bot-header-icon-clicked\");\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"onClick\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.showHeaderButton}}\n        <li>\n          <PluginOutlet\n            @name=\"ai-bot-header-icon\"\n            @outletArgs={{lazyHash onClick=this.onClick icon=this.icon}}\n          >\n            <DButton\n              @href={{this.href}}\n              @action={{unless this.href this.onClick}}\n              @icon={{this.icon}}\n              title={{this.title}}\n              class=\"ai-bot-button icon btn-flat\"\n            />\n          </PluginOutlet>\n        </li>\n      {{/if}}\n      */\n      {\n        \"id\": \"eIDsUVF0\",\n        \"block\": \"[[[41,[30,0,[\\\"showHeaderButton\\\"]],[[[1,\\\"  \\\"],[10,\\\"li\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,0],null,[[\\\"@name\\\",\\\"@outletArgs\\\"],[\\\"ai-bot-header-icon\\\",[28,[32,1],null,[[\\\"onClick\\\",\\\"icon\\\"],[[30,0,[\\\"onClick\\\"]],[30,0,[\\\"icon\\\"]]]]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[32,2],[[16,\\\"title\\\",[30,0,[\\\"title\\\"]]],[24,0,\\\"ai-bot-button icon btn-flat\\\"]],[[\\\"@href\\\",\\\"@action\\\",\\\"@icon\\\"],[[30,0,[\\\"href\\\"]],[52,[51,[30,0,[\\\"href\\\"]]],[30,0,[\\\"onClick\\\"]]],[30,0,[\\\"icon\\\"]]]],null],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],[\\\"if\\\",\\\"unless\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-bot-header-icon.js\",\n        \"scope\": () => [_pluginOutlet.default, _lazyHash.default, _dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiBotHeaderIcon;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-bot-sidebar-empty-state\", [\"exports\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _discourseI18n, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"ai-bot-sidebar-empty-state\">\n    {{i18n \"discourse_ai.ai_bot.sidebar_empty\"}}\n  </div>\n  */\n  {\n    \"id\": \"QWE2zuns\",\n    \"block\": \"[[[10,0],[14,0,\\\"ai-bot-sidebar-empty-state\\\"],[12],[1,\\\"\\\\n  \\\"],[1,[28,[32,0],[\\\"discourse_ai.ai_bot.sidebar_empty\\\"],null]],[1,\\\"\\\\n\\\"],[13]],[],[]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-bot-sidebar-empty-state.js\",\n    \"scope\": () => [_discourseI18n.i18n],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"ai-bot-sidebar-empty-state\"));\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-bot-sidebar-new-conversation\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/components/sidebar/back-to-forum\", \"discourse/plugins/discourse-ai/discourse/services/ai-conversations-sidebar-manager\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _service, _dButton, _backToForum, _aiConversationsSidebarManager, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const TEXTAREA_ID = \"ai-bot-conversations-input\";\n  class AiBotSidebarNewConversation extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"appEvents\", [_service.service]);\n    }\n    #appEvents = (dt7948.i(this, \"appEvents\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"sidebarState\", [_service.service]);\n    }\n    #sidebarState = (dt7948.i(this, \"sidebarState\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    get shouldRender() {\n      return this.sidebarState.isCurrentPanel(_aiConversationsSidebarManager.AI_CONVERSATIONS_PANEL);\n    }\n    get shouldShowBackLink() {\n      return !this.siteSettings.ai_bot_add_to_header;\n    }\n    focusTextarea() {\n      document.getElementById(TEXTAREA_ID)?.focus();\n    }\n    static {\n      dt7948.n(this.prototype, \"focusTextarea\", [_object.action]);\n    }\n    routeTo() {\n      this.appEvents.trigger(\"discourse-ai:new-conversation-btn-clicked\");\n      if (this.router.currentRouteName !== \"discourse-ai-bot-conversations\") {\n        this.router.transitionTo(\"/discourse-ai/ai-bot/conversations\");\n      } else {\n        this.focusTextarea();\n      }\n      this.args.outletArgs?.toggleNavigationMenu?.();\n    }\n    static {\n      dt7948.n(this.prototype, \"routeTo\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.shouldRender}}\n        {{#if this.shouldShowBackLink}}\n          <BackToForum />\n        {{/if}}\n        <div class=\"ai-new-question-button__wrapper\">\n          <DButton\n            @label=\"discourse_ai.ai_bot.conversations.new\"\n            @icon=\"plus\"\n            @action={{this.routeTo}}\n            class=\"ai-new-question-button btn-default\"\n          />\n        </div>\n      {{/if}}\n      */\n      {\n        \"id\": \"WpO6XIBG\",\n        \"block\": \"[[[41,[30,0,[\\\"shouldRender\\\"]],[[[41,[30,0,[\\\"shouldShowBackLink\\\"]],[[[1,\\\"    \\\"],[8,[32,0],null,null,null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"],[10,0],[14,0,\\\"ai-new-question-button__wrapper\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,1],[[24,0,\\\"ai-new-question-button btn-default\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\"],[\\\"discourse_ai.ai_bot.conversations.new\\\",\\\"plus\\\",[30,0,[\\\"routeTo\\\"]]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-bot-sidebar-new-conversation.js\",\n        \"scope\": () => [_backToForum.default, _dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiBotSidebarNewConversation;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-composer-helper-menu\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/owner\", \"@ember/service\", \"discourse/float-kit/components/d-toast\", \"discourse/float-kit/lib/d-toast-instance\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-helper-options-list\", \"discourse/plugins/discourse-ai/discourse/components/modal/diff-modal\", \"discourse/plugins/discourse-ai/discourse/components/modal/thumbnail-suggestions\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _owner, _service, _dToast, _dToastInstance, _discourseI18n, _aiHelperOptionsList, _diffModal, _thumbnailSuggestions, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiComposerHelperMenu extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"site\", [_service.service]);\n    }\n    #site = (dt7948.i(this, \"site\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"newSelectedText\", [_tracking.tracked]);\n    }\n    #newSelectedText = (dt7948.i(this, \"newSelectedText\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"diff\", [_tracking.tracked]);\n    }\n    #diff = (dt7948.i(this, \"diff\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"customPromptValue\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #customPromptValue = (dt7948.i(this, \"customPromptValue\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"noContentError\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #noContentError = (dt7948.i(this, \"noContentError\"), void 0);\n    prompts = [];\n    promptTypes = {};\n    constructor() {\n      super(...arguments);\n      if (this.args.data.toolbarEvent.getText().length === 0) {\n        this.noContentError = true;\n      }\n    }\n    get helperOptions() {\n      let prompts = this.currentUser?.ai_helper_prompts;\n      prompts = prompts.filter(p => p.location.includes(\"composer\")).filter(p => p.name !== \"generate_titles\").map(p => {\n        // AI helper by default returns interface locale on translations\n        // Since we want site default translations (and we are using: force_default_locale)\n        // we need to replace the translated_name with the site default locale name\n        const siteLocale = this.siteSettings.default_locale;\n        const availableLocales = this.siteSettings.available_locales;\n        const locale = availableLocales.find(l => l.value === siteLocale);\n        const translatedName = (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.context_menu.translate_prompt\", {\n          language: locale.name\n        });\n        if (p.name === \"translate\") {\n          return {\n            ...p,\n            translated_name: translatedName\n          };\n        }\n        return p;\n      });\n      // Find the custom_prompt object and move it to the beginning of the array\n      const customPromptIndex = prompts.findIndex(p => p.name === \"custom_prompt\");\n      if (customPromptIndex !== -1) {\n        const customPrompt = prompts.splice(customPromptIndex, 1)[0];\n        prompts.unshift(customPrompt);\n      }\n      if (!this.currentUser?.can_use_custom_prompts) {\n        prompts = prompts.filter(p => p.name !== \"custom_prompt\");\n      }\n      prompts.forEach(p => {\n        this.prompts[p.name] = p;\n      });\n      this.promptTypes = prompts.reduce((memo, p) => {\n        memo[p.name] = p.prompt_type;\n        return memo;\n      }, {});\n      return prompts;\n    }\n    get toast() {\n      const owner = (0, _owner.getOwner)(this);\n      const options = {\n        close: () => this.args.close(),\n        duration: \"short\",\n        data: {\n          theme: \"error\",\n          icon: \"triangle-exclamation\",\n          message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.no_content_error\")\n        }\n      };\n      const custom = class CustomToastInstance extends _dToastInstance.default {\n        constructor() {\n          super(owner, options);\n        }\n        close() {\n          this.options.close();\n        }\n        static {\n          dt7948.n(this.prototype, \"close\", [_object.action]);\n        }\n      };\n      return new custom(owner, options);\n    }\n    async suggestChanges(option) {\n      await this.args.close();\n      if (option.name === \"illustrate_post\") {\n        return this.modal.show(_thumbnailSuggestions.default, {\n          model: {\n            mode: option.name,\n            selectedText: this.args.data.selectedText,\n            thumbnails: this.thumbnailSuggestions\n          }\n        });\n      }\n      const showResultAsDiff = option.prompt_type === \"diff\" && option.name !== \"markdown_table\";\n      return this.modal.show(_diffModal.default, {\n        model: {\n          mode: option.name,\n          selectedText: this.args.data.selectedText,\n          revert: this.undoAiAction,\n          toolbarEvent: this.args.data.toolbarEvent,\n          customPromptValue: this.customPromptValue,\n          showResultAsDiff\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"suggestChanges\", [_object.action]);\n    }\n    closeMenu() {\n      this.customPromptValue = \"\";\n      this.args.close();\n    }\n    static {\n      dt7948.n(this.prototype, \"closeMenu\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.noContentError}}\n        <DToast @toast={{this.toast}} />\n      {{else}}\n        <div class=\"ai-composer-helper-menu\">\n          {{#if this.site.mobileView}}\n            <div class=\"ai-composer-helper-menu__selected-text\">\n              {{@data.selectedText}}\n            </div>\n          {{/if}}\n      \n          <AiHelperOptionsList\n            @options={{this.helperOptions}}\n            @customPromptValue={{this.customPromptValue}}\n            @performAction={{this.suggestChanges}}\n            @shortcutVisible={{true}}\n          />\n        </div>\n      {{/if}}\n      */\n      {\n        \"id\": \"r+lQM8L8\",\n        \"block\": \"[[[41,[30,0,[\\\"noContentError\\\"]],[[[1,\\\"  \\\"],[8,[32,0],null,[[\\\"@toast\\\"],[[30,0,[\\\"toast\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"ai-composer-helper-menu\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"site\\\",\\\"mobileView\\\"]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"ai-composer-helper-menu__selected-text\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[30,1,[\\\"selectedText\\\"]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[8,[32,1],null,[[\\\"@options\\\",\\\"@customPromptValue\\\",\\\"@performAction\\\",\\\"@shortcutVisible\\\"],[[30,0,[\\\"helperOptions\\\"]],[30,0,[\\\"customPromptValue\\\"]],[30,0,[\\\"suggestChanges\\\"]],true]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[\\\"@data\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-composer-helper-menu.js\",\n        \"scope\": () => [_dToast.default, _aiHelperOptionsList.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiComposerHelperMenu;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-credit-bar\", [\"exports\", \"@glimmer/component\", \"@ember/template\", \"discourse/float-kit/components/d-tooltip\", \"discourse/helpers/concat-class\", \"discourse/lib/formatter\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _template, _dTooltip, _concatClass, _formatter, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * Component to display credit allocation remaining as a horizontal progress bar\n   *\n   * @component AiCreditBar\n   * @param {Object} allocation - LlmCreditAllocation object with daily_credits, credits_remaining, percentage_remaining, soft_limit_reached, hard_limit_reached, next_reset_at\n   * @param {Boolean} showTooltip - Whether to show tooltip on hover (default: true)\n   * @param {Boolean} compact - Whether to show compact format (just percentage) for use in tables (default: false)\n   */class AiCreditBar extends _component.default {\n    get barClass() {\n      const classes = [];\n      if (this.args.allocation.soft_limit_reached) {\n        classes.push(\"ai-credit-bar--warning\");\n      }\n      if (this.args.compact) {\n        classes.push(\"ai-credit-bar--compact\");\n      }\n      return classes.join(\" \");\n    }\n    get fillStyle() {\n      return (0, _template.htmlSafe)(`width: ${this.args.allocation.percentage_remaining}%`);\n    }\n    get barText() {\n      if (this.args.compact) {\n        return `${this.args.allocation.percentage_remaining}%`;\n      }\n      return (0, _discourseI18n.i18n)(\"discourse_ai.llms.credit_allocation.credits_remaining\", {\n        remaining: (0, _formatter.number)(this.args.allocation.credits_remaining),\n        total: (0, _formatter.number)(this.args.allocation.daily_credits),\n        percentage: this.args.allocation.percentage_remaining\n      });\n    }\n    get tooltipText() {\n      if (this.args.compact) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.llms.credit_allocation.credits_remaining\", {\n          remaining: (0, _formatter.number)(this.args.allocation.credits_remaining),\n          total: (0, _formatter.number)(this.args.allocation.daily_credits),\n          percentage: this.args.allocation.percentage_remaining\n        });\n      }\n      const resetDate = new Date(this.args.allocation.next_reset_at);\n      const options = {\n        month: \"long\",\n        day: \"numeric\",\n        hour: \"numeric\",\n        minute: \"2-digit\",\n        timeZone: \"UTC\"\n      };\n      const formattedDate = resetDate.toLocaleString(undefined, options);\n      return (0, _discourseI18n.i18n)(\"discourse_ai.llms.credit_allocation.next_reset\", {\n        time: formattedDate\n      });\n    }\n    get shouldShowTooltip() {\n      return this.args.showTooltip !== false;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.shouldShowTooltip}}\n        <DTooltip @content={{this.tooltipText}}>\n          <:trigger>\n            <div class={{concatClass \"ai-credit-bar\" this.barClass}}>\n              <div class=\"ai-credit-bar__progress\">\n                <div class=\"ai-credit-bar__fill\" style={{this.fillStyle}}></div>\n              </div>\n              <div class=\"ai-credit-bar__text\">\n                {{this.barText}}\n              </div>\n            </div>\n          </:trigger>\n        </DTooltip>\n      {{else}}\n        <div class={{concatClass \"ai-credit-bar\" this.barClass}}>\n          <div class=\"ai-credit-bar__progress\">\n            <div class=\"ai-credit-bar__fill\" style={{this.fillStyle}}></div>\n          </div>\n          <div class=\"ai-credit-bar__text\">\n            {{this.barText}}\n          </div>\n        </div>\n      {{/if}}\n      */\n      {\n        \"id\": \"0gm716pP\",\n        \"block\": \"[[[41,[30,0,[\\\"shouldShowTooltip\\\"]],[[[1,\\\"  \\\"],[8,[32,0],null,[[\\\"@content\\\"],[[30,0,[\\\"tooltipText\\\"]]]],[[\\\"trigger\\\"],[[[[1,\\\"\\\\n      \\\"],[10,0],[15,0,[28,[32,1],[\\\"ai-credit-bar\\\",[30,0,[\\\"barClass\\\"]]],null]],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"ai-credit-bar__progress\\\"],[12],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"ai-credit-bar__fill\\\"],[15,5,[30,0,[\\\"fillStyle\\\"]]],[12],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"ai-credit-bar__text\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[30,0,[\\\"barText\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"  \\\"],[10,0],[15,0,[28,[32,1],[\\\"ai-credit-bar\\\",[30,0,[\\\"barClass\\\"]]],null]],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-credit-bar__progress\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"ai-credit-bar__fill\\\"],[15,5,[30,0,[\\\"fillStyle\\\"]]],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-credit-bar__text\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[30,0,[\\\"barText\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-credit-bar.js\",\n        \"scope\": () => [_dTooltip.default, _concatClass.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiCreditBar;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-default-llm-selector\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"discourse/admin/components/site-setting\", \"discourse/admin/models/site-setting\", \"discourse/lib/ajax\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _siteSetting, _siteSetting2, _ajax, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiDefaultLlmSelector extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"defaultLlmSetting\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #defaultLlmSetting = (dt7948.i(this, \"defaultLlmSetting\"), void 0);\n    constructor() {\n      super(...arguments);\n      this.#loadDefaultLlmSetting();\n    }\n    async #loadDefaultLlmSetting() {\n      const {\n        site_settings\n      } = await (0, _ajax.ajax)(\"/admin/config/site_settings.json\", {\n        data: {\n          plugin: \"discourse-ai\",\n          category: \"discourse_ai\"\n        }\n      });\n      const defaultLlmSetting = site_settings.find(setting => setting.setting === \"ai_default_llm_model\");\n      this.defaultLlmSetting = _siteSetting2.default.create(defaultLlmSetting);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"ai-configure-default-llm\">\n        <div class=\"ai-configure-default-llm__header\">\n          <h3>{{i18n \"discourse_ai.default_llm.title\"}}</h3>\n          <p>{{i18n \"discourse_ai.default_llm.description\"}}</p>\n        </div>\n      \n        {{#if this.defaultLlmSetting}}\n          <SiteSettingComponent\n            @setting={{this.defaultLlmSetting}}\n            class=\"ai-configure-default-llm__setting\"\n          />\n        {{/if}}\n      </div>\n      */\n      {\n        \"id\": \"vBqe6Es9\",\n        \"block\": \"[[[10,0],[14,0,\\\"ai-configure-default-llm\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"ai-configure-default-llm__header\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h3\\\"],[12],[1,[28,[32,0],[\\\"discourse_ai.default_llm.title\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[10,2],[12],[1,[28,[32,0],[\\\"discourse_ai.default_llm.description\\\"],null]],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"defaultLlmSetting\\\"]],[[[1,\\\"    \\\"],[8,[32,1],[[24,0,\\\"ai-configure-default-llm__setting\\\"]],[[\\\"@setting\\\"],[[30,0,[\\\"defaultLlmSetting\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-default-llm-selector.js\",\n        \"scope\": () => [_discourseI18n.i18n, _siteSetting.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiDefaultLlmSelector;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-embedding-editor\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/runloop\", \"@ember/service\", \"discourse/admin/components/admin-section-landing-item\", \"discourse/admin/components/admin-section-landing-wrapper\", \"discourse/components/back-button\", \"discourse/components/conditional-loading-spinner\", \"discourse/components/d-button\", \"discourse/components/form\", \"discourse/helpers/d-icon\", \"discourse/lib/ajax-error\", \"discourse/lib/array-tools\", \"discourse/truth-helpers\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _runloop, _service, _adminSectionLandingItem, _adminSectionLandingWrapper, _backButton, _conditionalLoadingSpinner, _dButton, _form, _dIcon, _ajaxError, _arrayTools, _truthHelpers, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiEmbeddingEditor extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"toasts\", [_service.service]);\n    }\n    #toasts = (dt7948.i(this, \"toasts\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"dialog\", [_service.service]);\n    }\n    #dialog = (dt7948.i(this, \"dialog\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"store\", [_service.service]);\n    }\n    #store = (dt7948.i(this, \"store\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isSaving\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isSaving = (dt7948.i(this, \"isSaving\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedPreset\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #selectedPreset = (dt7948.i(this, \"selectedPreset\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"testRunning\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #testRunning = (dt7948.i(this, \"testRunning\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"testResult\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #testResult = (dt7948.i(this, \"testResult\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"testError\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #testError = (dt7948.i(this, \"testError\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentProvider\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #currentProvider = (dt7948.i(this, \"currentProvider\"), void 0);\n    constructor() {\n      super(...arguments);\n      if (this.args.model) {\n        this.currentProvider = this.args.model.provider;\n      }\n    }\n    get formData() {\n      let data;\n      if (this.selectedPreset) {\n        data = this.store.createRecord(\"ai-embedding\", this.selectedPreset).workingCopy();\n      } else {\n        data = this.args.model.workingCopy();\n      }\n      const originalData = JSON.parse(JSON.stringify(data));\n      this._originalFormData = originalData;\n      return originalData;\n    }\n    static {\n      dt7948.n(this.prototype, \"formData\", [_tracking.cached]);\n    }\n    get selectedProviders() {\n      const t = provName => {\n        return (0, _discourseI18n.i18n)(`discourse_ai.embeddings.providers.${provName}`);\n      };\n      return this.args.embeddings.resultSetMeta.providers.map(prov => {\n        return {\n          id: prov,\n          name: t(prov)\n        };\n      });\n    }\n    get distanceFunctions() {\n      const t = df => {\n        return (0, _discourseI18n.i18n)(`discourse_ai.embeddings.distance_functions.${df}`);\n      };\n      return this.args.embeddings.resultSetMeta.distance_functions.map(df => {\n        return {\n          id: df,\n          name: t(df)\n        };\n      });\n    }\n    get presets() {\n      const presets = this.args.embeddings.resultSetMeta.presets.map(preset => {\n        return {\n          name: preset.display_name,\n          id: preset.preset_id,\n          provider: preset.provider\n        };\n      });\n      presets.unshift({\n        name: (0, _discourseI18n.i18n)(\"discourse_ai.embeddings.configure_manually\"),\n        id: \"manual\",\n        provider: \"fake\"\n      });\n      return presets;\n    }\n    get showPresets() {\n      return !this.selectedPreset && this.args.model.isNew;\n    }\n    get metaProviderParams() {\n      const provider = this.currentProvider;\n      if (!provider) {\n        return {};\n      }\n      const embeddings = this.args.embeddings || {};\n      const meta = embeddings.resultSetMeta || {};\n      const providerParams = meta.provider_params || {};\n      return providerParams[provider] || {};\n    }\n    get testErrorMessage() {\n      return (0, _discourseI18n.i18n)(\"discourse_ai.llms.tests.failure\", {\n        error: this.testError\n      });\n    }\n    get displayTestResult() {\n      return this.testRunning || this.testResult !== null;\n    }\n    get seeded() {\n      return this.args.model.id < 0;\n    }\n    configurePreset(preset) {\n      this.selectedPreset = this.args.embeddings.resultSetMeta.presets.find(item => item.preset_id === preset.id) || {};\n      if (this.selectedPreset.provider) {\n        this.currentProvider = this.selectedPreset.provider;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"configurePreset\", [_object.action]);\n    }\n    setProvider(provider, {\n      set\n    }) {\n      set(\"provider\", provider);\n      this.currentProvider = provider;\n      const providerParams = this.args.embeddings?.resultSetMeta?.provider_params || {};\n      const params = providerParams[provider] || {};\n      const initialParams = {};\n      if (params) {\n        const keys = Object.keys(params);\n        keys.forEach(key => {\n          initialParams[key] = null;\n        });\n      }\n      set(\"provider_params\", initialParams);\n    }\n    static {\n      dt7948.n(this.prototype, \"setProvider\", [_object.action]);\n    }\n    get providerParams() {\n      const normalizeParam = value => {\n        if (!value) {\n          return {\n            type: \"text\"\n          };\n        }\n        if (typeof value === \"string\") {\n          return {\n            type: value\n          };\n        }\n        return {\n          type: value.type || \"text\",\n          values: (value.values || []).map(v => ({\n            id: v,\n            name: v\n          })),\n          default: value.default\n        };\n      };\n      return Object.entries(this.metaProviderParams).reduce((acc, [field, value]) => {\n        acc[field] = normalizeParam(value);\n        return acc;\n      }, {});\n    }\n    resetForm() {\n      this.selectedPreset = null;\n      this.currentProvider = null;\n    }\n    static {\n      dt7948.n(this.prototype, \"resetForm\", [_object.action]);\n    }\n    async save(formData) {\n      this.isSaving = true;\n      const isNew = this.args.model.isNew;\n      try {\n        const dataToSave = {\n          ...formData\n        };\n        if (this.selectedPreset) {\n          // new embeddings\n          const newModel = this.store.createRecord(\"ai-embedding\", {\n            ...this.selectedPreset,\n            ...dataToSave\n          });\n          await newModel.save();\n          (0, _arrayTools.addUniqueValueToArray)(this.args.embeddings.content, newModel);\n        } else {\n          // existing embeddings\n          await this.args.model.save(dataToSave);\n        }\n        if (isNew) {\n          this.router.transitionTo(\"adminPlugins.show.discourse-ai-embeddings.index\");\n        } else {\n          const savedProvider = this.currentProvider;\n          this._originalFormData = JSON.parse(JSON.stringify(dataToSave));\n          this.currentProvider = savedProvider;\n          this.toasts.success({\n            data: {\n              message: (0, _discourseI18n.i18n)(\"discourse_ai.embeddings.saved\")\n            },\n            duration: \"short\"\n          });\n        }\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        (0, _runloop.later)(() => {\n          this.isSaving = false;\n        }, 1000);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"save\", [_object.action]);\n    }\n    async test(data) {\n      this.testRunning = true;\n      try {\n        let testModel;\n        // new embeddings\n        if (this.args.model.isNew || this.selectedPreset) {\n          testModel = this.store.createRecord(\"ai-embedding\", {\n            ...this.selectedPreset,\n            ...data\n          });\n        } else {\n          // existing embeddings\n          testModel = this.args.model;\n        }\n        const configTestResult = await testModel.testConfig(data);\n        this.testResult = configTestResult.success;\n        if (this.testResult) {\n          this.testError = null;\n        } else {\n          this.testError = configTestResult.error;\n        }\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        (0, _runloop.later)(() => {\n          this.testRunning = false;\n        }, 1000);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"test\", [_object.action]);\n    }\n    delete() {\n      return this.dialog.confirm({\n        message: (0, _discourseI18n.i18n)(\"discourse_ai.embeddings.confirm_delete\"),\n        didConfirm: () => {\n          return this.args.model.destroyRecord().then(() => {\n            (0, _arrayTools.removeValueFromArray)(this.args.embeddings, this.args.model);\n            this.router.transitionTo(\"adminPlugins.show.discourse-ai-embeddings.index\");\n          }).catch(_ajaxError.popupAjaxError);\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"delete\", [_object.action]);\n    }\n    providerKeys(providerParams) {\n      return providerParams ? Object.keys(providerParams) : [];\n    }\n    static {\n      dt7948.n(this.prototype, \"providerKeys\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.showPresets}}\n        <BackButton\n          @route=\"adminPlugins.show.discourse-ai-embeddings\"\n          @label=\"discourse_ai.embeddings.back\"\n        />\n        <div class=\"control-group\">\n          <h2>{{i18n \"discourse_ai.embeddings.presets\"}}</h2>\n          <AdminSectionLandingWrapper>\n            {{#each this.presets as |preset|}}\n              <AdminSectionLandingItem\n                @titleLabelTranslated={{preset.name}}\n                @taglineLabel={{concat\n                  \"discourse_ai.embeddings.providers.\"\n                  preset.provider\n                }}\n                data-preset-id={{preset.id}}\n                class=\"ai-llms-list-editor__templates-list-item\"\n              >\n                <:buttons as |buttons|>\n                  <buttons.Default\n                    @action={{fn this.configurePreset preset}}\n                    @icon=\"gear\"\n                    @label=\"discourse_ai.llms.preconfigured.button\"\n                  />\n                </:buttons>\n              </AdminSectionLandingItem>\n            {{/each}}\n          </AdminSectionLandingWrapper>\n        </div>\n      {{else}}\n        <Form\n          @onSubmit={{this.save}}\n          @data={{this.formData}}\n          class=\"form-horizontal ai-embedding-editor {{if this.seeded 'seeded'}}\"\n          as |form data|\n        >\n          {{#if @model.isNew}}\n            <DButton\n              @action={{this.resetForm}}\n              @label=\"back_button\"\n              @icon=\"chevron-left\"\n              class=\"btn-flat back-button\"\n            />\n          {{else}}\n            <BackButton\n              @route=\"adminPlugins.show.discourse-ai-embeddings\"\n              @label=\"discourse_ai.embeddings.back\"\n            />\n          {{/if}}\n      \n          <form.Field\n            @name=\"display_name\"\n            @title={{i18n \"discourse_ai.embeddings.display_name\"}}\n            @validation=\"required|length:1,100\"\n            @format=\"large\"\n            class=\"ai-embedding-editor__display-name\"\n            as |field|\n          >\n            <field.Input />\n          </form.Field>\n      \n          <form.Field\n            @name=\"provider\"\n            @title={{i18n \"discourse_ai.embeddings.provider\"}}\n            @validation=\"required\"\n            @format=\"large\"\n            @onSet={{this.setProvider}}\n            class=\"ai-embedding-editor__provider\"\n            as |field|\n          >\n            <field.Select as |select|>\n              {{#each this.selectedProviders as |provider|}}\n                <select.Option\n                  @value={{provider.id}}\n                >{{provider.name}}</select.Option>\n              {{/each}}\n            </field.Select>\n          </form.Field>\n      \n          <form.Field\n            @name=\"url\"\n            @title={{i18n \"discourse_ai.embeddings.url\"}}\n            @validation=\"required\"\n            @format=\"large\"\n            class=\"ai-embedding-editor__url\"\n            as |field|\n          >\n            <field.Input />\n          </form.Field>\n      \n          <form.Field\n            @name=\"api_key\"\n            @title={{i18n \"discourse_ai.embeddings.api_key\"}}\n            @validation=\"required\"\n            @format=\"large\"\n            class=\"ai-embedding-editor__api-key\"\n            as |field|\n          >\n            <field.Password />\n          </form.Field>\n      \n          <form.Field\n            @name=\"tokenizer_class\"\n            @title={{i18n \"discourse_ai.embeddings.tokenizer\"}}\n            @validation=\"required\"\n            @format=\"large\"\n            class=\"ai-embedding-editor__tokenizer\"\n            as |field|\n          >\n            <field.Select as |select|>\n              {{#each @embeddings.resultSetMeta.tokenizers as |tokenizer|}}\n                <select.Option\n                  @value={{tokenizer.id}}\n                >{{tokenizer.name}}</select.Option>\n              {{/each}}\n            </field.Select>\n          </form.Field>\n      \n          <form.Field\n            @name=\"dimensions\"\n            @title={{i18n \"discourse_ai.embeddings.dimensions\"}}\n            @validation=\"required\"\n            @format=\"large\"\n            @tooltip={{if\n              @model.isNew\n              (i18n \"discourse_ai.embeddings.hints.dimensions_warning\")\n            }}\n            class=\"ai-embedding-editor__dimensions\"\n            as |field|\n          >\n            <field.Input\n              @type=\"number\"\n              step=\"any\"\n              min=\"0\"\n              lang=\"en\"\n              disabled={{not @model.isNew}}\n            />\n          </form.Field>\n      \n          <form.Field\n            @name=\"matryoshka_dimensions\"\n            @title={{i18n \"discourse_ai.embeddings.matryoshka_dimensions\"}}\n            @tooltip={{i18n\n              \"discourse_ai.embeddings.hints.matryoshka_dimensions\"\n            }}\n            @format=\"large\"\n            class=\"ai-embedding-editor__matryoshka_dimensions\"\n            as |field|\n          >\n            <field.Checkbox />\n          </form.Field>\n      \n          <form.Field\n            @name=\"embed_prompt\"\n            @title={{i18n \"discourse_ai.embeddings.embed_prompt\"}}\n            @tooltip={{i18n \"discourse_ai.embeddings.hints.embed_prompt\"}}\n            @format=\"large\"\n            class=\"ai-embedding-editor__embed_prompt\"\n            as |field|\n          >\n            <field.Textarea />\n          </form.Field>\n      \n          <form.Field\n            @name=\"search_prompt\"\n            @title={{i18n \"discourse_ai.embeddings.search_prompt\"}}\n            @tooltip={{i18n \"discourse_ai.embeddings.hints.search_prompt\"}}\n            @format=\"large\"\n            class=\"ai-embedding-editor__search_prompt\"\n            as |field|\n          >\n            <field.Textarea />\n          </form.Field>\n      \n          <form.Field\n            @name=\"max_sequence_length\"\n            @title={{i18n \"discourse_ai.embeddings.max_sequence_length\"}}\n            @tooltip={{i18n \"discourse_ai.embeddings.hints.sequence_length\"}}\n            @validation=\"required\"\n            @format=\"large\"\n            class=\"ai-embedding-editor__max_sequence_length\"\n            as |field|\n          >\n            <field.Input @type=\"number\" step=\"any\" min=\"0\" lang=\"en\" />\n          </form.Field>\n      \n          <form.Field\n            @name=\"pg_function\"\n            @title={{i18n \"discourse_ai.embeddings.distance_function\"}}\n            @tooltip={{i18n \"discourse_ai.embeddings.hints.distance_function\"}}\n            @format=\"large\"\n            @validation=\"required\"\n            class=\"ai-embedding-editor__distance_functions\"\n            as |field|\n          >\n            <field.Select @includeNone={{false}} as |select|>\n              {{#each this.distanceFunctions as |df|}}\n                <select.Option @value={{df.id}}>{{df.name}}</select.Option>\n              {{/each}}\n            </field.Select>\n          </form.Field>\n      \n          {{! provider-specific content }}\n          {{#if this.currentProvider}}\n            <form.Object @name=\"provider_params\" as |object providerData|>\n              {{#each (this.providerKeys providerData) as |name|}}\n                {{#let (get this.providerParams name) as |params|}}\n                  {{#if params}}\n                    <object.Field\n                      @name={{name}}\n                      @title={{i18n\n                        (concat \"discourse_ai.embeddings.provider_fields.\" name)\n                      }}\n                      @format=\"large\"\n                      @validation=\"required\"\n                      class=\"ai-embedding-editor-provider-param__{{params.type}}\"\n                      as |field|\n                    >\n                      {{#if (eq params.type \"enum\")}}\n                        <field.Select @includeNone={{false}} as |select|>\n                          {{#each params.values as |option|}}\n                            <select.Option\n                              @value={{option.id}}\n                            >{{option.name}}</select.Option>\n                          {{/each}}\n                        </field.Select>\n                      {{else if (eq params.type \"checkbox\")}}\n                        <field.Checkbox />\n                      {{else}}\n                        <field.Input @type={{params.type}} />\n                      {{/if}}\n                    </object.Field>\n                  {{/if}}\n                {{/let}}\n              {{/each}}\n            </form.Object>\n          {{/if}}\n      \n          <form.Actions class=\"ai-embedding-editor__action_panel\">\n            <form.Button\n              @action={{fn this.test data}}\n              @disabled={{this.testRunning}}\n              @label=\"discourse_ai.embeddings.tests.title\"\n              class=\"ai-embedding-editor__test\"\n            />\n      \n            <form.Submit\n              @label=\"discourse_ai.embeddings.save\"\n              class=\"btn-primary ai-embedding-editor__save\"\n            />\n      \n            {{#unless data.isNew}}\n              <form.Button\n                @action={{this.delete}}\n                @label=\"discourse_ai.embeddings.delete\"\n                class=\"btn-danger ai-embedding-editor__delete\"\n              />\n            {{/unless}}\n          </form.Actions>\n      \n          {{#if this.displayTestResult}}\n            <form.Container @format=\"full\" class=\"ai-embedding-editor-tests\">\n              <ConditionalLoadingSpinner\n                @size=\"small\"\n                @condition={{this.testRunning}}\n              >\n                {{#if this.testResult}}\n                  <div class=\"ai-embedding-editor-tests__success\">\n                    {{icon \"check\"}}\n                    {{i18n \"discourse_ai.embeddings.tests.success\"}}\n                  </div>\n                {{else}}\n                  <div class=\"ai-embedding-editor-tests__failure\">\n                    {{icon \"xmark\"}}\n                    {{this.testErrorMessage}}\n                  </div>\n                {{/if}}\n              </ConditionalLoadingSpinner>\n            </form.Container>\n          {{/if}}\n        </Form>\n      {{/if}}\n      */\n      {\n        \"id\": \"cu2Ti9s2\",\n        \"block\": \"[[[41,[30,0,[\\\"showPresets\\\"]],[[[1,\\\"  \\\"],[8,[32,0],null,[[\\\"@route\\\",\\\"@label\\\"],[\\\"adminPlugins.show.discourse-ai-embeddings\\\",\\\"discourse_ai.embeddings.back\\\"]],null],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"control-group\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"h2\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.embeddings.presets\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[8,[32,2],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"presets\\\"]]],null]],null],null,[[[1,\\\"        \\\"],[8,[32,3],[[16,\\\"data-preset-id\\\",[30,1,[\\\"id\\\"]]],[24,0,\\\"ai-llms-list-editor__templates-list-item\\\"]],[[\\\"@titleLabelTranslated\\\",\\\"@taglineLabel\\\"],[[30,1,[\\\"name\\\"]],[28,[32,4],[\\\"discourse_ai.embeddings.providers.\\\",[30,1,[\\\"provider\\\"]]],null]]],[[\\\"buttons\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,2,[\\\"Default\\\"]],null,[[\\\"@action\\\",\\\"@icon\\\",\\\"@label\\\"],[[28,[32,5],[[30,0,[\\\"configurePreset\\\"]],[30,1]],null],\\\"gear\\\",\\\"discourse_ai.llms.preconfigured.button\\\"]],null],[1,\\\"\\\\n          \\\"]],[2]]]]],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"    \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"  \\\"],[8,[32,6],[[16,0,[29,[\\\"form-horizontal ai-embedding-editor \\\",[52,[30,0,[\\\"seeded\\\"]],\\\"seeded\\\"]]]]],[[\\\"@onSubmit\\\",\\\"@data\\\"],[[30,0,[\\\"save\\\"]],[30,0,[\\\"formData\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,5,[\\\"isNew\\\"]],[[[1,\\\"      \\\"],[8,[32,7],[[24,0,\\\"btn-flat back-button\\\"]],[[\\\"@action\\\",\\\"@label\\\",\\\"@icon\\\"],[[30,0,[\\\"resetForm\\\"]],\\\"back_button\\\",\\\"chevron-left\\\"]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[8,[32,0],null,[[\\\"@route\\\",\\\"@label\\\"],[\\\"adminPlugins.show.discourse-ai-embeddings\\\",\\\"discourse_ai.embeddings.back\\\"]],null],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__display-name\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"display_name\\\",[28,[32,1],[\\\"discourse_ai.embeddings.display_name\\\"],null],\\\"required|length:1,100\\\",\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,6,[\\\"Input\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[6]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__provider\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\",\\\"@onSet\\\"],[\\\"provider\\\",[28,[32,1],[\\\"discourse_ai.embeddings.provider\\\"],null],\\\"required\\\",\\\"large\\\",[30,0,[\\\"setProvider\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,7,[\\\"Select\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"selectedProviders\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[8,[30,8,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,9,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,[30,9,[\\\"name\\\"]]]],[]]]]],[1,\\\"\\\\n\\\"]],[9]],null],[1,\\\"      \\\"]],[8]]]]],[1,\\\"\\\\n    \\\"]],[7]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__url\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"url\\\",[28,[32,1],[\\\"discourse_ai.embeddings.url\\\"],null],\\\"required\\\",\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,10,[\\\"Input\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[10]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__api-key\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"api_key\\\",[28,[32,1],[\\\"discourse_ai.embeddings.api_key\\\"],null],\\\"required\\\",\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,11,[\\\"Password\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[11]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__tokenizer\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"tokenizer_class\\\",[28,[32,1],[\\\"discourse_ai.embeddings.tokenizer\\\"],null],\\\"required\\\",\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,12,[\\\"Select\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,14,[\\\"resultSetMeta\\\",\\\"tokenizers\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[8,[30,13,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,15,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,[30,15,[\\\"name\\\"]]]],[]]]]],[1,\\\"\\\\n\\\"]],[15]],null],[1,\\\"      \\\"]],[13]]]]],[1,\\\"\\\\n    \\\"]],[12]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__dimensions\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\",\\\"@tooltip\\\"],[\\\"dimensions\\\",[28,[32,1],[\\\"discourse_ai.embeddings.dimensions\\\"],null],\\\"required\\\",\\\"large\\\",[52,[30,5,[\\\"isNew\\\"]],[28,[32,1],[\\\"discourse_ai.embeddings.hints.dimensions_warning\\\"],null]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,16,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"min\\\",\\\"0\\\"],[24,\\\"lang\\\",\\\"en\\\"],[16,\\\"disabled\\\",[28,[32,8],[[30,5,[\\\"isNew\\\"]]],null]]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n    \\\"]],[16]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__matryoshka_dimensions\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"matryoshka_dimensions\\\",[28,[32,1],[\\\"discourse_ai.embeddings.matryoshka_dimensions\\\"],null],[28,[32,1],[\\\"discourse_ai.embeddings.hints.matryoshka_dimensions\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,17,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[17]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__embed_prompt\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"embed_prompt\\\",[28,[32,1],[\\\"discourse_ai.embeddings.embed_prompt\\\"],null],[28,[32,1],[\\\"discourse_ai.embeddings.hints.embed_prompt\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,18,[\\\"Textarea\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[18]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__search_prompt\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"search_prompt\\\",[28,[32,1],[\\\"discourse_ai.embeddings.search_prompt\\\"],null],[28,[32,1],[\\\"discourse_ai.embeddings.hints.search_prompt\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,19,[\\\"Textarea\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[19]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__max_sequence_length\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"max_sequence_length\\\",[28,[32,1],[\\\"discourse_ai.embeddings.max_sequence_length\\\"],null],[28,[32,1],[\\\"discourse_ai.embeddings.hints.sequence_length\\\"],null],\\\"required\\\",\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,20,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"min\\\",\\\"0\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n    \\\"]],[20]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,3,[\\\"Field\\\"]],[[24,0,\\\"ai-embedding-editor__distance_functions\\\"]],[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\",\\\"@validation\\\"],[\\\"pg_function\\\",[28,[32,1],[\\\"discourse_ai.embeddings.distance_function\\\"],null],[28,[32,1],[\\\"discourse_ai.embeddings.hints.distance_function\\\"],null],\\\"large\\\",\\\"required\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,21,[\\\"Select\\\"]],null,[[\\\"@includeNone\\\"],[false]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"distanceFunctions\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[8,[30,22,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,23,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,[30,23,[\\\"name\\\"]]]],[]]]]],[1,\\\"\\\\n\\\"]],[23]],null],[1,\\\"      \\\"]],[22]]]]],[1,\\\"\\\\n    \\\"]],[21]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"currentProvider\\\"]],[[[1,\\\"      \\\"],[8,[30,3,[\\\"Object\\\"]],null,[[\\\"@name\\\"],[\\\"provider_params\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[28,[30,0,[\\\"providerKeys\\\"]],[[30,25]],null]],null]],null],null,[[[44,[[28,[32,9],[[30,0,[\\\"providerParams\\\"]],[30,26]],null]],[[[41,[30,27],[[[1,\\\"              \\\"],[8,[30,24,[\\\"Field\\\"]],[[16,0,[29,[\\\"ai-embedding-editor-provider-param__\\\",[30,27,[\\\"type\\\"]]]]]],[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\",\\\"@validation\\\"],[[30,26],[28,[32,1],[[28,[32,4],[\\\"discourse_ai.embeddings.provider_fields.\\\",[30,26]],null]],null],\\\"large\\\",\\\"required\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[28,[32,10],[[30,27,[\\\"type\\\"]],\\\"enum\\\"],null],[[[1,\\\"                  \\\"],[8,[30,28,[\\\"Select\\\"]],null,[[\\\"@includeNone\\\"],[false]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,27,[\\\"values\\\"]]],null]],null],null,[[[1,\\\"                      \\\"],[8,[30,29,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,30,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,[30,30,[\\\"name\\\"]]]],[]]]]],[1,\\\"\\\\n\\\"]],[30]],null],[1,\\\"                  \\\"]],[29]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,10],[[30,27,[\\\"type\\\"]],\\\"checkbox\\\"],null],[[[1,\\\"                  \\\"],[8,[30,28,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                  \\\"],[8,[30,28,[\\\"Input\\\"]],null,[[\\\"@type\\\"],[[30,27,[\\\"type\\\"]]]],null],[1,\\\"\\\\n                \\\"]],[]]]],[]]],[1,\\\"              \\\"]],[28]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[27]]]],[26]],null],[1,\\\"      \\\"]],[24,25]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"Actions\\\"]],[[24,0,\\\"ai-embedding-editor__action_panel\\\"]],null,[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,3,[\\\"Button\\\"]],[[24,0,\\\"ai-embedding-editor__test\\\"]],[[\\\"@action\\\",\\\"@disabled\\\",\\\"@label\\\"],[[28,[32,5],[[30,0,[\\\"test\\\"]],[30,4]],null],[30,0,[\\\"testRunning\\\"]],\\\"discourse_ai.embeddings.tests.title\\\"]],null],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,3,[\\\"Submit\\\"]],[[24,0,\\\"btn-primary ai-embedding-editor__save\\\"]],[[\\\"@label\\\"],[\\\"discourse_ai.embeddings.save\\\"]],null],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[30,4,[\\\"isNew\\\"]]],[[[1,\\\"        \\\"],[8,[30,3,[\\\"Button\\\"]],[[24,0,\\\"btn-danger ai-embedding-editor__delete\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"delete\\\"]],\\\"discourse_ai.embeddings.delete\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"]],[]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"displayTestResult\\\"]],[[[1,\\\"      \\\"],[8,[30,3,[\\\"Container\\\"]],[[24,0,\\\"ai-embedding-editor-tests\\\"]],[[\\\"@format\\\"],[\\\"full\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[32,11],null,[[\\\"@size\\\",\\\"@condition\\\"],[\\\"small\\\",[30,0,[\\\"testRunning\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"testResult\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"ai-embedding-editor-tests__success\\\"],[12],[1,\\\"\\\\n              \\\"],[1,[28,[32,12],[\\\"check\\\"],null]],[1,\\\"\\\\n              \\\"],[1,[28,[32,1],[\\\"discourse_ai.embeddings.tests.success\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"ai-embedding-editor-tests__failure\\\"],[12],[1,\\\"\\\\n              \\\"],[1,[28,[32,12],[\\\"xmark\\\"],null]],[1,\\\"\\\\n              \\\"],[1,[30,0,[\\\"testErrorMessage\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"]],[]]]]],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[3,4]]]]],[1,\\\"\\\\n\\\"]],[]]]],[\\\"preset\\\",\\\"buttons\\\",\\\"form\\\",\\\"data\\\",\\\"@model\\\",\\\"field\\\",\\\"field\\\",\\\"select\\\",\\\"provider\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"select\\\",\\\"@embeddings\\\",\\\"tokenizer\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"select\\\",\\\"df\\\",\\\"object\\\",\\\"providerData\\\",\\\"name\\\",\\\"params\\\",\\\"field\\\",\\\"select\\\",\\\"option\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\",\\\"let\\\",\\\"unless\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-embedding-editor.js\",\n        \"scope\": () => [_backButton.default, _discourseI18n.i18n, _adminSectionLandingWrapper.default, _adminSectionLandingItem.default, _helper.concat, _helper.fn, _form.default, _dButton.default, _truthHelpers.not, _helper.get, _truthHelpers.eq, _conditionalLoadingSpinner.default, _dIcon.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiEmbeddingEditor;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-embeddings-list-editor\", [\"exports\", \"@glimmer/component\", \"@ember/helper\", \"@ember/service\", \"discourse/admin/components/admin-config-area-empty-list\", \"discourse/components/d-breadcrumbs-item\", \"discourse/components/d-button\", \"discourse/components/d-page-subheader\", \"discourse/float-kit/components/d-tooltip\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-embedding-editor\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _helper, _service, _adminConfigAreaEmptyList, _dBreadcrumbsItem, _dButton, _dPageSubheader, _dTooltip, _discourseI18n, _aiEmbeddingEditor, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiEmbeddingsListEditor extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"adminPluginNavManager\", [_service.service]);\n    }\n    #adminPluginNavManager = (dt7948.i(this, \"adminPluginNavManager\"), void 0);\n    get hasEmbeddingElements() {\n      return this.args.embeddings.content.length !== 0;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DBreadcrumbsItem\n        @path=\"/admin/plugins/{{this.adminPluginNavManager.currentPlugin.name}}/ai-embeddings\"\n        @label={{i18n \"discourse_ai.embeddings.short_title\"}}\n      />\n      <section class=\"ai-embeddings-list-editor admin-detail\">\n        {{#if @currentEmbedding}}\n          <AiEmbeddingEditor\n            @model={{@currentEmbedding}}\n            @embeddings={{@embeddings}}\n          />\n        {{else}}\n          <DPageSubheader\n            @titleLabel={{i18n \"discourse_ai.embeddings.short_title\"}}\n            @descriptionLabel={{i18n \"discourse_ai.embeddings.description\"}}\n            @learnMoreUrl=\"https://meta.discourse.org/t/discourse-ai-embeddings/259603\"\n          >\n            <:actions as |actions|>\n              <actions.Primary\n                @label=\"discourse_ai.embeddings.new\"\n                @route=\"adminPlugins.show.discourse-ai-embeddings.new\"\n                @icon=\"plus\"\n                class=\"ai-embeddings-list-editor__new-button\"\n              />\n            </:actions>\n          </DPageSubheader>\n      \n          {{#if this.hasEmbeddingElements}}\n            <table class=\"d-admin-table\">\n              <thead>\n                <tr>\n                  <th>{{i18n \"discourse_ai.embeddings.display_name\"}}</th>\n                  <th>{{i18n \"discourse_ai.embeddings.provider\"}}</th>\n                  <th></th>\n                </tr>\n              </thead>\n              <tbody>\n                {{#each @embeddings.content as |embedding|}}\n                  <tr class=\"ai-embeddings-list__row d-admin-row__content\">\n                    <td class=\"d-admin-row__overview\">\n                      <div class=\"ai-embeddings-list__name\">\n                        <strong>\n                          {{embedding.display_name}}\n                        </strong>\n                      </div>\n                    </td>\n                    <td class=\"d-admin-row__detail\">\n                      <div class=\"d-admin-row__mobile-label\">\n                        {{i18n \"discourse_ai.embeddings.provider\"}}\n                      </div>\n                      {{i18n\n                        (concat\n                          \"discourse_ai.embeddings.providers.\" embedding.provider\n                        )\n                      }}\n                    </td>\n                    <td class=\"d-admin-row__controls\">\n                      {{#if embedding.seeded}}\n                        <DTooltip\n                          class=\"ai-embeddings-list__edit-disabled-tooltip\"\n                        >\n                          <:trigger>\n                            <DButton\n                              class=\"btn btn-default btn-small disabled\"\n                              @label=\"discourse_ai.embeddings.edit\"\n                            />\n                          </:trigger>\n                          <:content>\n                            {{i18n \"discourse_ai.embeddings.seeded_warning\"}}\n                          </:content>\n                        </DTooltip>\n                      {{else}}\n                        <DButton\n                          class=\"btn btn-default btn-small ai-embeddings-list__edit-button\"\n                          @label=\"discourse_ai.embeddings.edit\"\n                          @route=\"adminPlugins.show.discourse-ai-embeddings.edit\"\n                          @routeModels={{embedding.id}}\n                        />\n                      {{/if}}\n                    </td>\n                  </tr>\n                {{/each}}\n              </tbody>\n            </table>\n          {{else}}\n            <AdminConfigAreaEmptyList\n              @ctaLabel=\"discourse_ai.embeddings.new\"\n              @ctaRoute=\"adminPlugins.show.discourse-ai-embeddings.new\"\n              @ctaClass=\"ai-embeddings-list-editor__empty-new-button\"\n              @emptyLabel=\"discourse_ai.embeddings.empty\"\n            />\n          {{/if}}\n        {{/if}}\n      </section>\n      */\n      {\n        \"id\": \"KmeohtOO\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@path\\\",\\\"@label\\\"],[[29,[\\\"/admin/plugins/\\\",[30,0,[\\\"adminPluginNavManager\\\",\\\"currentPlugin\\\",\\\"name\\\"]],\\\"/ai-embeddings\\\"]],[28,[32,1],[\\\"discourse_ai.embeddings.short_title\\\"],null]]],null],[1,\\\"\\\\n\\\"],[10,\\\"section\\\"],[14,0,\\\"ai-embeddings-list-editor admin-detail\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1],[[[1,\\\"    \\\"],[8,[32,2],null,[[\\\"@model\\\",\\\"@embeddings\\\"],[[30,1],[30,2]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[8,[32,3],null,[[\\\"@titleLabel\\\",\\\"@descriptionLabel\\\",\\\"@learnMoreUrl\\\"],[[28,[32,1],[\\\"discourse_ai.embeddings.short_title\\\"],null],[28,[32,1],[\\\"discourse_ai.embeddings.description\\\"],null],\\\"https://meta.discourse.org/t/discourse-ai-embeddings/259603\\\"]],[[\\\"actions\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,3,[\\\"Primary\\\"]],[[24,0,\\\"ai-embeddings-list-editor__new-button\\\"]],[[\\\"@label\\\",\\\"@route\\\",\\\"@icon\\\"],[\\\"discourse_ai.embeddings.new\\\",\\\"adminPlugins.show.discourse-ai-embeddings.new\\\",\\\"plus\\\"]],null],[1,\\\"\\\\n      \\\"]],[3]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"hasEmbeddingElements\\\"]],[[[1,\\\"      \\\"],[10,\\\"table\\\"],[14,0,\\\"d-admin-table\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.embeddings.display_name\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.embeddings.provider\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"th\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,2,[\\\"content\\\"]]],null]],null],null,[[[1,\\\"            \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-embeddings-list__row d-admin-row__content\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__overview\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"ai-embeddings-list__name\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"strong\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[30,4,[\\\"display_name\\\"]]],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__detail\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"d-admin-row__mobile-label\\\"],[12],[1,\\\"\\\\n                  \\\"],[1,[28,[32,1],[\\\"discourse_ai.embeddings.provider\\\"],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[1,[28,[32,1],[[28,[32,4],[\\\"discourse_ai.embeddings.providers.\\\",[30,4,[\\\"provider\\\"]]],null]],null]],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n              \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__controls\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,4,[\\\"seeded\\\"]],[[[1,\\\"                  \\\"],[8,[32,5],[[24,0,\\\"ai-embeddings-list__edit-disabled-tooltip\\\"]],null,[[\\\"trigger\\\",\\\"content\\\"],[[[[1,\\\"\\\\n                      \\\"],[8,[32,6],[[24,0,\\\"btn btn-default btn-small disabled\\\"]],[[\\\"@label\\\"],[\\\"discourse_ai.embeddings.edit\\\"]],null],[1,\\\"\\\\n                    \\\"]],[]],[[[1,\\\"\\\\n                      \\\"],[1,[28,[32,1],[\\\"discourse_ai.embeddings.seeded_warning\\\"],null]],[1,\\\"\\\\n                    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                  \\\"],[8,[32,6],[[24,0,\\\"btn btn-default btn-small ai-embeddings-list__edit-button\\\"]],[[\\\"@label\\\",\\\"@route\\\",\\\"@routeModels\\\"],[\\\"discourse_ai.embeddings.edit\\\",\\\"adminPlugins.show.discourse-ai-embeddings.edit\\\",[30,4,[\\\"id\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[8,[32,7],null,[[\\\"@ctaLabel\\\",\\\"@ctaRoute\\\",\\\"@ctaClass\\\",\\\"@emptyLabel\\\"],[\\\"discourse_ai.embeddings.new\\\",\\\"adminPlugins.show.discourse-ai-embeddings.new\\\",\\\"ai-embeddings-list-editor__empty-new-button\\\",\\\"discourse_ai.embeddings.empty\\\"]],null],[1,\\\"\\\\n\\\"]],[]]]],[]]],[13]],[\\\"@currentEmbedding\\\",\\\"@embeddings\\\",\\\"actions\\\",\\\"embedding\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-embeddings-list-editor.js\",\n        \"scope\": () => [_dBreadcrumbsItem.default, _discourseI18n.i18n, _aiEmbeddingEditor.default, _dPageSubheader.default, _helper.concat, _dTooltip.default, _dButton.default, _adminConfigAreaEmptyList.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiEmbeddingsListEditor;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-feature-card\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/routing\", \"discourse/components/d-button\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _routing, _dButton, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class ExpandableList extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"isExpanded\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isExpanded = (dt7948.i(this, \"isExpanded\"), void 0);\n    get maxItemsToShow() {\n      return this.args.maxItemsToShow ?? 5;\n    }\n    get hasMore() {\n      return this.args.items?.length > this.maxItemsToShow;\n    }\n    get visibleItems() {\n      if (!this.args.items) {\n        return [];\n      }\n      return this.isExpanded ? this.args.items : this.args.items.slice(0, this.maxItemsToShow);\n    }\n    get remainingCount() {\n      return this.args.items?.length - this.maxItemsToShow;\n    }\n    get expandToggleLabel() {\n      if (this.isExpanded) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.features.collapse_list\");\n      } else {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.features.expand_list\", {\n          count: this.remainingCount\n        });\n      }\n    }\n    toggleExpanded() {\n      this.isExpanded = !this.isExpanded;\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleExpanded\", [_object.action]);\n    }\n    isLastItem(index) {\n      return index === this.visibleItems.length - 1;\n    }\n    static {\n      dt7948.n(this.prototype, \"isLastItem\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#each this.visibleItems as |item index|}}\n        {{yield item index this.isLastItem}}\n      {{/each}}\n      \n      {{#if this.hasMore}}\n        <DButton\n          class=\"btn-flat ai-expanded-list__toggle-button\"\n          @translatedLabel={{this.expandToggleLabel}}\n          @action={{this.toggleExpanded}}\n        />\n      {{/if}}\n      */\n      {\n        \"id\": \"mph6YaIT\",\n        \"block\": \"[[[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"visibleItems\\\"]]],null]],null],null,[[[1,\\\"  \\\"],[18,3,[[30,1],[30,2],[30,0,[\\\"isLastItem\\\"]]]],[1,\\\"\\\\n\\\"]],[1,2]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"hasMore\\\"]],[[[1,\\\"  \\\"],[8,[32,0],[[24,0,\\\"btn-flat ai-expanded-list__toggle-button\\\"]],[[\\\"@translatedLabel\\\",\\\"@action\\\"],[[30,0,[\\\"expandToggleLabel\\\"]],[30,0,[\\\"toggleExpanded\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"item\\\",\\\"index\\\",\\\"&default\\\"],[\\\"each\\\",\\\"-track-array\\\",\\\"yield\\\",\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-feature-card.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  class AiFeatureCard extends _component.default {\n    hasGroups(feature) {\n      return this.groupList(feature).length > 0;\n    }\n    static {\n      dt7948.n(this.prototype, \"hasGroups\", [_object.action]);\n    }\n    groupList(feature) {\n      const groups = [];\n      const groupIds = new Set();\n      if (feature.personas) {\n        feature.personas.forEach(persona => {\n          if (persona.allowed_groups) {\n            persona.allowed_groups.forEach(group => {\n              if (!groupIds.has(group.id)) {\n                groupIds.add(group.id);\n                groups.push(group);\n              }\n            });\n          }\n        });\n      }\n      return groups;\n    }\n    static {\n      dt7948.n(this.prototype, \"groupList\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div\n        class=\"admin-section-landing-item ai-feature-card\"\n        data-feature-name={{@feature.name}}\n      >\n        <div class=\"admin-section-landing-item__content\">\n          <div class=\"ai-feature-card__feature-name\">\n            {{@localizedFeatureName}}\n            {{#unless @feature.enabled}}\n              <span>{{i18n \"discourse_ai.features.disabled\"}}</span>\n            {{/unless}}\n          </div>\n          <div class=\"ai-feature-card__persona\">\n            <span class=\"ai-feature-card__label\">\n              {{i18n\n                \"discourse_ai.features.persona\"\n                count=@feature.personas.length\n              }}\n            </span>\n            {{#if @feature.personas}}\n              <ExpandableList\n                @items={{@feature.personas}}\n                @maxItemsToShow={{5}}\n                as |persona index isLastItem|\n              >\n                <LinkTo\n                  @route=\"adminPlugins.show.discourse-ai-personas.edit\"\n                  @model={{persona.id}}\n                  class=\"ai-feature-card__persona-link\"\n                >\n                  {{concat persona.name (unless (isLastItem index) \", \")}}\n                </LinkTo>\n              </ExpandableList>\n            {{else}}\n              <span class=\"ai-feature-card__label\">\n                {{i18n \"discourse_ai.features.no_persona\"}}\n              </span>\n            {{/if}}\n          </div>\n          <div class=\"ai-feature-card__llm\">\n            {{#if @feature.llm_models}}\n              <span class=\"ai-feature-card__label\">\n                {{i18n\n                  \"discourse_ai.features.llm\"\n                  count=@feature.llm_models.length\n                }}\n              </span>\n              <ExpandableList\n                @items={{@feature.llm_models}}\n                @maxItemsToShow={{5}}\n                as |llm index isLastItem|\n              >\n                <LinkTo\n                  @route=\"adminPlugins.show.discourse-ai-llms.edit\"\n                  @model={{llm.id}}\n                  class=\"ai-feature-card__llm-link\"\n                >\n                  {{concat llm.name (unless (isLastItem index) \", \")}}\n                </LinkTo>\n              </ExpandableList>\n            {{else}}\n              <span class=\"ai-feature-card__label\">\n                {{i18n \"discourse_ai.features.no_llm\"}}\n              </span>\n            {{/if}}\n          </div>\n          {{#if @showGroups}}\n            {{#if @feature.personas}}\n              <div class=\"ai-feature-card__groups\">\n                <span class=\"ai-feature-card__label\">\n                  {{i18n \"discourse_ai.features.groups\"}}\n                </span>\n                {{#if (this.hasGroups @feature)}}\n                  <ul class=\"ai-feature-card__item-groups\">\n                    {{#each (this.groupList @feature) as |group|}}\n                      <li>{{group.name}}</li>\n                    {{/each}}\n                  </ul>\n                {{else}}\n                  <span class=\"ai-feature-card__label\">\n                    {{i18n \"discourse_ai.features.no_groups\"}}\n                  </span>\n                {{/if}}\n              </div>\n            {{/if}}\n          {{/if}}\n        </div>\n      </div>\n      */\n      {\n        \"id\": \"0IpPDfPY\",\n        \"block\": \"[[[10,0],[14,0,\\\"admin-section-landing-item ai-feature-card\\\"],[15,\\\"data-feature-name\\\",[30,1,[\\\"name\\\"]]],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"admin-section-landing-item__content\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-feature-card__feature-name\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[30,2]],[1,\\\"\\\\n\\\"],[41,[51,[30,1,[\\\"enabled\\\"]]],[[[1,\\\"        \\\"],[10,1],[12],[1,[28,[32,0],[\\\"discourse_ai.features.disabled\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-feature-card__persona\\\"],[12],[1,\\\"\\\\n      \\\"],[10,1],[14,0,\\\"ai-feature-card__label\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,0],[\\\"discourse_ai.features.persona\\\"],[[\\\"count\\\"],[[30,1,[\\\"personas\\\",\\\"length\\\"]]]]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"personas\\\"]],[[[1,\\\"        \\\"],[8,[32,1],null,[[\\\"@items\\\",\\\"@maxItemsToShow\\\"],[[30,1,[\\\"personas\\\"]],5]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[32,2],[[24,0,\\\"ai-feature-card__persona-link\\\"]],[[\\\"@route\\\",\\\"@model\\\"],[\\\"adminPlugins.show.discourse-ai-personas.edit\\\",[30,3,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[1,[28,[32,3],[[30,3,[\\\"name\\\"]],[52,[51,[28,[30,5],[[30,4]],null]],\\\", \\\"]],null]],[1,\\\"\\\\n          \\\"]],[]]]]],[1,\\\"\\\\n        \\\"]],[3,4,5]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"ai-feature-card__label\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,0],[\\\"discourse_ai.features.no_persona\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-feature-card__llm\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"llm_models\\\"]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"ai-feature-card__label\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,0],[\\\"discourse_ai.features.llm\\\"],[[\\\"count\\\"],[[30,1,[\\\"llm_models\\\",\\\"length\\\"]]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[8,[32,1],null,[[\\\"@items\\\",\\\"@maxItemsToShow\\\"],[[30,1,[\\\"llm_models\\\"]],5]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[32,2],[[24,0,\\\"ai-feature-card__llm-link\\\"]],[[\\\"@route\\\",\\\"@model\\\"],[\\\"adminPlugins.show.discourse-ai-llms.edit\\\",[30,6,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[1,[28,[32,3],[[30,6,[\\\"name\\\"]],[52,[51,[28,[30,8],[[30,7]],null]],\\\", \\\"]],null]],[1,\\\"\\\\n          \\\"]],[]]]]],[1,\\\"\\\\n        \\\"]],[6,7,8]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"ai-feature-card__label\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,0],[\\\"discourse_ai.features.no_llm\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,9],[[[41,[30,1,[\\\"personas\\\"]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"ai-feature-card__groups\\\"],[12],[1,\\\"\\\\n          \\\"],[10,1],[14,0,\\\"ai-feature-card__label\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[32,0],[\\\"discourse_ai.features.groups\\\"],null]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[30,0,[\\\"hasGroups\\\"]],[[30,1]],null],[[[1,\\\"            \\\"],[10,\\\"ul\\\"],[14,0,\\\"ai-feature-card__item-groups\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,3],[[28,[31,3],[[28,[30,0,[\\\"groupList\\\"]],[[30,1]],null]],null]],null],null,[[[1,\\\"                \\\"],[10,\\\"li\\\"],[12],[1,[30,10,[\\\"name\\\"]]],[13],[1,\\\"\\\\n\\\"]],[10]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,1],[14,0,\\\"ai-feature-card__label\\\"],[12],[1,\\\"\\\\n              \\\"],[1,[28,[32,0],[\\\"discourse_ai.features.no_groups\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@feature\\\",\\\"@localizedFeatureName\\\",\\\"persona\\\",\\\"index\\\",\\\"isLastItem\\\",\\\"llm\\\",\\\"index\\\",\\\"isLastItem\\\",\\\"@showGroups\\\",\\\"group\\\"],[\\\"unless\\\",\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-feature-card.js\",\n        \"scope\": () => [_discourseI18n.i18n, ExpandableList, _routing.LinkTo, _helper.concat],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiFeatureCard;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-feature-setting-field\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/select-kit/components/list-setting\", \"discourse/truth-helpers\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _listSetting, _truthHelpers, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiFeatureSettingField extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"site\", [_service.service]);\n    }\n    #site = (dt7948.i(this, \"site\"), void 0);\n    parseList = value => {\n      return value?.toString().split(\"|\").filter(Boolean) || [];\n    };\n    serializeList = callback => {\n      return values => {\n        callback(Array.isArray(values) ? values.join(\"|\") : values);\n      };\n    };\n    get groupChoices() {\n      return (this.site.groups || []).map(g => ({\n        name: g.name,\n        id: g.id.toString()\n      }));\n    }\n    get hasEnumChoices() {\n      return this.args.setting.valid_values?.length > 0;\n    }\n    get compactListChoices() {\n      if (this.hasEnumChoices) {\n        return this.args.setting.valid_values.map(v => ({\n          name: v.name,\n          value: String(v.value)\n        }));\n      }\n      return this.args.setting.choices;\n    }\n    get controlType() {\n      const {\n        type,\n        list_type\n      } = this.args.setting;\n      if (type === \"list\" && list_type) {\n        return `${list_type}_list`;\n      }\n      return type;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if (eq this.controlType \"bool\")}}\n        <@field.Checkbox>\n          {{@setting.description}}\n        </@field.Checkbox>\n      {{else if (eq this.controlType \"integer\")}}\n        <@field.Input @type=\"number\" />\n      {{else if (eq this.controlType \"enum\")}}\n        <@field.Select as |select|>\n          {{#each @setting.valid_values as |option|}}\n            <select.Option @value={{option.value}}>\n              {{option.name}}\n            </select.Option>\n          {{/each}}\n        </@field.Select>\n      {{else if (eq this.controlType \"group_list\")}}\n        <@field.Custom>\n          <ListSetting\n            @value={{this.parseList @field.value}}\n            @choices={{this.groupChoices}}\n            @settingName={{@setting.setting}}\n            @nameProperty=\"name\"\n            @valueProperty=\"id\"\n            @onChange={{this.serializeList @field.set}}\n          />\n        </@field.Custom>\n      {{else if (eq this.controlType \"compact_list\")}}\n        <@field.Custom>\n          <ListSetting\n            @value={{this.parseList @field.value}}\n            @choices={{this.compactListChoices}}\n            @settingName={{@setting.setting}}\n            @nameProperty={{if this.hasEnumChoices \"name\"}}\n            @valueProperty={{if this.hasEnumChoices \"value\"}}\n            @onChange={{this.serializeList @field.set}}\n          />\n        </@field.Custom>\n      {{else}}\n        <@field.Input />\n      {{/if}}\n      */\n      {\n        \"id\": \"nkAB6Ftk\",\n        \"block\": \"[[[41,[28,[32,0],[[30,0,[\\\"controlType\\\"]],\\\"bool\\\"],null],[[[1,\\\"  \\\"],[8,[30,1,[\\\"Checkbox\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[1,[30,2,[\\\"description\\\"]]],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,0],[[30,0,[\\\"controlType\\\"]],\\\"integer\\\"],null],[[[1,\\\"  \\\"],[8,[30,1,[\\\"Input\\\"]],null,[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,0],[[30,0,[\\\"controlType\\\"]],\\\"enum\\\"],null],[[[1,\\\"  \\\"],[8,[30,1,[\\\"Select\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,2,[\\\"valid_values\\\"]]],null]],null],null,[[[1,\\\"      \\\"],[8,[30,3,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,4,[\\\"value\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[1,[30,4,[\\\"name\\\"]]],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"  \\\"]],[3]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,0],[[30,0,[\\\"controlType\\\"]],\\\"group_list\\\"],null],[[[1,\\\"  \\\"],[8,[30,1,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[32,1],null,[[\\\"@value\\\",\\\"@choices\\\",\\\"@settingName\\\",\\\"@nameProperty\\\",\\\"@valueProperty\\\",\\\"@onChange\\\"],[[28,[30,0,[\\\"parseList\\\"]],[[30,1,[\\\"value\\\"]]],null],[30,0,[\\\"groupChoices\\\"]],[30,2,[\\\"setting\\\"]],\\\"name\\\",\\\"id\\\",[28,[30,0,[\\\"serializeList\\\"]],[[30,1,[\\\"set\\\"]]],null]]],null],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,0],[[30,0,[\\\"controlType\\\"]],\\\"compact_list\\\"],null],[[[1,\\\"  \\\"],[8,[30,1,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[32,1],null,[[\\\"@value\\\",\\\"@choices\\\",\\\"@settingName\\\",\\\"@nameProperty\\\",\\\"@valueProperty\\\",\\\"@onChange\\\"],[[28,[30,0,[\\\"parseList\\\"]],[[30,1,[\\\"value\\\"]]],null],[30,0,[\\\"compactListChoices\\\"]],[30,2,[\\\"setting\\\"]],[52,[30,0,[\\\"hasEnumChoices\\\"]],\\\"name\\\"],[52,[30,0,[\\\"hasEnumChoices\\\"]],\\\"value\\\"],[28,[30,0,[\\\"serializeList\\\"]],[[30,1,[\\\"set\\\"]]],null]]],null],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"  \\\"],[8,[30,1,[\\\"Input\\\"]],null,null,null],[1,\\\"\\\\n\\\"]],[]]]],[]]]],[]]]],[]]]],[]]]],[\\\"@field\\\",\\\"@setting\\\",\\\"select\\\",\\\"option\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-feature-setting-field.js\",\n        \"scope\": () => [_truthHelpers.eq, _listSetting.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiFeatureSettingField;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-features-list\", [\"exports\", \"@glimmer/component\", \"@ember/helper\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-feature-card\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _helper, _object, _service, _dButton, _truthHelpers, _discourseI18n, _aiFeatureCard, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiFeaturesList extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    get sortedModules() {\n      return (this.args.modules || []).toSorted((a, b) => (a.module_name || \"\").localeCompare(b.module_name || \"\"));\n    }\n    isSpamModule(aModule) {\n      return aModule.module_name === \"spam\";\n    }\n    static {\n      dt7948.n(this.prototype, \"isSpamModule\", [_object.action]);\n    }\n    isAutomationModule(aModule) {\n      return aModule.module_name === \"automation_reports\" || aModule.module_name === \"automation_triage\";\n    }\n    static {\n      dt7948.n(this.prototype, \"isAutomationModule\", [_object.action]);\n    }\n    featureName(feature, aModule) {\n      if (this.isAutomationModule(aModule)) {\n        return feature.name;\n      } else {\n        return (0, _discourseI18n.i18n)(`discourse_ai.features.${aModule.module_name}.${feature.name}`);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"featureName\", [_object.action]);\n    }\n    transitionToAutomations() {\n      this.router.transitionTo(\"/admin/plugins/automation/automation\");\n    }\n    static {\n      dt7948.n(this.prototype, \"transitionToAutomations\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"ai-features-list\">\n        {{#each this.sortedModules as |module|}}\n          <div class=\"ai-module\" data-module-name={{module.module_name}}>\n            <div class=\"ai-module__header\">\n              <div class=\"ai-module__module-title\">\n                <h3>\n                  {{i18n\n                    (concat \"discourse_ai.features.\" module.module_name \".name\")\n                  }}\n                </h3>\n                {{#if (this.isSpamModule module)}}\n                  <DButton\n                    class=\"btn-default edit\"\n                    @label=\"discourse_ai.features.edit\"\n                    @route=\"adminPlugins.show.discourse-ai-spam\"\n                  />\n                {{else if (this.isAutomationModule module)}}\n                  <DButton\n                    class=\"btn-default edit\"\n                    @label=\"discourse_ai.features.edit\"\n                    @action={{this.transitionToAutomations}}\n                  />\n                {{else}}\n                  <DButton\n                    class=\"btn-default edit\"\n                    @label=\"discourse_ai.features.edit\"\n                    @route=\"adminPlugins.show.discourse-ai-features.edit\"\n                    @routeModels={{module.id}}\n                  />\n                {{/if}}\n              </div>\n              <div>{{i18n\n                  (concat\n                    \"discourse_ai.features.\" module.module_name \".description\"\n                  )\n                }}</div>\n            </div>\n      \n            <div class=\"admin-section-landing-wrapper ai-feature-cards\">\n              {{#if\n                (and\n                  (this.isAutomationModule module) (eq module.features.length 0)\n                )\n              }}\n                <div>{{i18n \"discourse_ai.features.no_automations\"}}</div>\n              {{else}}\n                {{#each module.features as |feature|}}\n                  <AiFeatureCard\n                    @localizedFeatureName={{this.featureName feature module}}\n                    @feature={{feature}}\n                    @showGroups={{not (this.isSpamModule module)}}\n                  />\n                {{/each}}\n              {{/if}}\n            </div>\n          </div>\n        {{/each}}\n      </div>\n      */\n      {\n        \"id\": \"mjqR79iL\",\n        \"block\": \"[[[10,0],[14,0,\\\"ai-features-list\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"sortedModules\\\"]]],null]],null],null,[[[1,\\\"    \\\"],[10,0],[14,0,\\\"ai-module\\\"],[15,\\\"data-module-name\\\",[30,1,[\\\"module_name\\\"]]],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"ai-module__header\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"ai-module__module-title\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"h3\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[32,0],[[28,[32,1],[\\\"discourse_ai.features.\\\",[30,1,[\\\"module_name\\\"]],\\\".name\\\"],null]],null]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"],[41,[28,[30,0,[\\\"isSpamModule\\\"]],[[30,1]],null],[[[1,\\\"            \\\"],[8,[32,2],[[24,0,\\\"btn-default edit\\\"]],[[\\\"@label\\\",\\\"@route\\\"],[\\\"discourse_ai.features.edit\\\",\\\"adminPlugins.show.discourse-ai-spam\\\"]],null],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[30,0,[\\\"isAutomationModule\\\"]],[[30,1]],null],[[[1,\\\"            \\\"],[8,[32,2],[[24,0,\\\"btn-default edit\\\"]],[[\\\"@label\\\",\\\"@action\\\"],[\\\"discourse_ai.features.edit\\\",[30,0,[\\\"transitionToAutomations\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[8,[32,2],[[24,0,\\\"btn-default edit\\\"]],[[\\\"@label\\\",\\\"@route\\\",\\\"@routeModels\\\"],[\\\"discourse_ai.features.edit\\\",\\\"adminPlugins.show.discourse-ai-features.edit\\\",[30,1,[\\\"id\\\"]]]],null],[1,\\\"\\\\n          \\\"]],[]]]],[]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[12],[1,[28,[32,0],[[28,[32,1],[\\\"discourse_ai.features.\\\",[30,1,[\\\"module_name\\\"]],\\\".description\\\"],null]],null]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[10,0],[14,0,\\\"admin-section-landing-wrapper ai-feature-cards\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[32,3],[[28,[30,0,[\\\"isAutomationModule\\\"]],[[30,1]],null],[28,[32,4],[[30,1,[\\\"features\\\",\\\"length\\\"]],0],null]],null],[[[1,\\\"          \\\"],[10,0],[12],[1,[28,[32,0],[\\\"discourse_ai.features.no_automations\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[42,[28,[31,1],[[28,[31,1],[[30,1,[\\\"features\\\"]]],null]],null],null,[[[1,\\\"            \\\"],[8,[32,5],null,[[\\\"@localizedFeatureName\\\",\\\"@feature\\\",\\\"@showGroups\\\"],[[28,[30,0,[\\\"featureName\\\"]],[[30,2],[30,1]],null],[30,2],[28,[32,6],[[28,[30,0,[\\\"isSpamModule\\\"]],[[30,1]],null]],null]]],null],[1,\\\"\\\\n\\\"]],[2]],null]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[13]],[\\\"module\\\",\\\"feature\\\"],[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-features-list.js\",\n        \"scope\": () => [_discourseI18n.i18n, _helper.concat, _dButton.default, _truthHelpers.and, _truthHelpers.eq, _aiFeatureCard.default, _truthHelpers.not],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiFeaturesList;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-features\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-breadcrumbs-item\", \"discourse/components/d-button\", \"discourse/components/d-page-subheader\", \"discourse/components/d-select\", \"discourse/components/filter-input\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-default-llm-selector\", \"discourse/plugins/discourse-ai/discourse/components/ai-features-list\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _service, _dBreadcrumbsItem, _dButton, _dPageSubheader, _dSelect, _filterInput, _discourseI18n, _aiDefaultLlmSelector, _aiFeaturesList, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const ALL = \"all\";\n  const CONFIGURED = \"configured\";\n  const UNCONFIGURED = \"unconfigured\";\n  class AiFeatures extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"adminPluginNavManager\", [_service.service]);\n    }\n    #adminPluginNavManager = (dt7948.i(this, \"adminPluginNavManager\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"filterValue\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #filterValue = (dt7948.i(this, \"filterValue\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedFeatureGroup\", [_tracking.tracked], function () {\n        return CONFIGURED;\n      });\n    }\n    #selectedFeatureGroup = (dt7948.i(this, \"selectedFeatureGroup\"), void 0);\n    constructor() {\n      super(...arguments);\n      // if there are features but none are configured, show unconfigured\n      if (this.args.features?.length > 0) {\n        const configuredCount = this.args.features.filter(f => f.module_enabled === true).length;\n        if (configuredCount === 0) {\n          this.selectedFeatureGroup = UNCONFIGURED;\n        }\n      }\n    }\n    get featureGroupOptions() {\n      return [{\n        value: ALL,\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.features.filters.all\")\n      }, {\n        value: CONFIGURED,\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.features.nav.configured\")\n      }, {\n        value: UNCONFIGURED,\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.features.nav.unconfigured\")\n      }];\n    }\n    get filteredFeatures() {\n      if (!this.args.features || this.args.features.length === 0) {\n        return [];\n      }\n      let features = this.args.features;\n      if (this.selectedFeatureGroup === CONFIGURED) {\n        features = features.filter(feature => feature.module_enabled === true);\n      } else if (this.selectedFeatureGroup === UNCONFIGURED) {\n        features = features.filter(feature => feature.module_enabled === false);\n      }\n      if (this.filterValue && this.filterValue.trim() !== \"\") {\n        const term = this.filterValue.toLowerCase().trim();\n        const featureMatches = (module, feature) => {\n          try {\n            const featureName = (0, _discourseI18n.i18n)(`discourse_ai.features.${module.module_name}.${feature.name}`).toLowerCase();\n            if (featureName.includes(term)) {\n              return true;\n            }\n            const personaMatches = feature.personas?.some(persona => persona.name?.toLowerCase().includes(term));\n            const llmMatches = feature.llm_models?.some(llm => llm.name?.toLowerCase().includes(term));\n            const groupMatches = feature.personas?.some(persona => persona.allowed_groups?.some(group => group.name?.toLowerCase().includes(term)));\n            return personaMatches || llmMatches || groupMatches;\n          } catch (error) {\n            // eslint-disable-next-line no-console\n            console.error(`Error filtering features`, error);\n            return false;\n          }\n        };\n        // Filter modules by name or features\n        features = features.filter(module => {\n          try {\n            const moduleName = (0, _discourseI18n.i18n)(`discourse_ai.features.${module.module_name}.name`).toLowerCase();\n            if (moduleName.includes(term)) {\n              return true;\n            }\n            return (module.features || []).some(feature => featureMatches(module, feature));\n          } catch (error) {\n            // eslint-disable-next-line no-console\n            console.error(`Error filtering features`, error);\n            return false;\n          }\n        });\n        // For modules that don't match by name, filter features\n        features = features.map(module => {\n          try {\n            const moduleName = (0, _discourseI18n.i18n)(`discourse_ai.features.${module.module_name}.name`).toLowerCase();\n            // if name matches\n            if (moduleName.includes(term)) {\n              return module;\n            }\n            // if no name match\n            const matchingFeatures = (module.features || []).filter(feature => featureMatches(module, feature));\n            // recreate with matching features\n            return Object.assign({}, module, {\n              features: matchingFeatures\n            });\n          } catch (error) {\n            // eslint-disable-next-line no-console\n            console.error(`Error filtering features`, error);\n            return module;\n          }\n        }).filter(module => module.features && module.features.length > 0);\n      }\n      return features;\n    }\n    onFilterChange(event) {\n      this.filterValue = event.target?.value || \"\";\n    }\n    static {\n      dt7948.n(this.prototype, \"onFilterChange\", [_object.action]);\n    }\n    onFeatureGroupChange(value) {\n      this.selectedFeatureGroup = value;\n    }\n    static {\n      dt7948.n(this.prototype, \"onFeatureGroupChange\", [_object.action]);\n    }\n    resetAndFocus() {\n      this.filterValue = \"\";\n      this.selectedFeatureGroup = CONFIGURED;\n      document.querySelector(\".admin-filter__input\").focus();\n    }\n    static {\n      dt7948.n(this.prototype, \"resetAndFocus\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DBreadcrumbsItem\n        @path=\"/admin/plugins/{{this.adminPluginNavManager.currentPlugin.name}}/ai-features\"\n        @label={{i18n \"discourse_ai.features.short_title\"}}\n      />\n      <section class=\"ai-features admin-detail\">\n        <DPageSubheader\n          @titleLabel={{i18n \"discourse_ai.features.short_title\"}}\n          @descriptionLabel={{i18n \"discourse_ai.features.description\"}}\n          @learnMoreUrl=\"todo\"\n        />\n      \n        <div class=\"ai-features__controls\">\n          <DSelect\n            @value={{this.selectedFeatureGroup}}\n            @includeNone={{false}}\n            @onChange={{this.onFeatureGroupChange}}\n            as |select|\n          >\n            {{#each this.featureGroupOptions as |option|}}\n              <select.Option @value={{option.value}}>\n                {{option.label}}\n              </select.Option>\n            {{/each}}\n          </DSelect>\n      \n          <FilterInput\n            placeholder={{i18n \"discourse_ai.features.filters.text\"}}\n            @filterAction={{this.onFilterChange}}\n            @value={{this.filterValue}}\n            class=\"admin-filter__input\"\n            @icons={{hash left=\"magnifying-glass\"}}\n          />\n        </div>\n      \n        <AiDefaultLlmSelector />\n      \n        {{#if this.filteredFeatures.length}}\n          <AiFeaturesList @modules={{this.filteredFeatures}} />\n        {{else}}\n          <div class=\"ai-features__no-results\">\n            <h3>{{i18n \"discourse_ai.features.filters.no_results\"}}</h3>\n            <DButton\n              @icon=\"arrow-rotate-left\"\n              @label=\"discourse_ai.features.filters.reset\"\n              @action={{this.resetAndFocus}}\n              class=\"btn-default\"\n            />\n          </div>\n        {{/if}}\n      </section>\n      */\n      {\n        \"id\": \"mHgVxhNj\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@path\\\",\\\"@label\\\"],[[29,[\\\"/admin/plugins/\\\",[30,0,[\\\"adminPluginNavManager\\\",\\\"currentPlugin\\\",\\\"name\\\"]],\\\"/ai-features\\\"]],[28,[32,1],[\\\"discourse_ai.features.short_title\\\"],null]]],null],[1,\\\"\\\\n\\\"],[10,\\\"section\\\"],[14,0,\\\"ai-features admin-detail\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,2],null,[[\\\"@titleLabel\\\",\\\"@descriptionLabel\\\",\\\"@learnMoreUrl\\\"],[[28,[32,1],[\\\"discourse_ai.features.short_title\\\"],null],[28,[32,1],[\\\"discourse_ai.features.description\\\"],null],\\\"todo\\\"]],null],[1,\\\"\\\\n\\\\n  \\\"],[10,0],[14,0,\\\"ai-features__controls\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,3],null,[[\\\"@value\\\",\\\"@includeNone\\\",\\\"@onChange\\\"],[[30,0,[\\\"selectedFeatureGroup\\\"]],false,[30,0,[\\\"onFeatureGroupChange\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"featureGroupOptions\\\"]]],null]],null],null,[[[1,\\\"        \\\"],[8,[30,1,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,2,[\\\"value\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[1,[30,2,[\\\"label\\\"]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"    \\\"]],[1]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[32,4],[[16,\\\"placeholder\\\",[28,[32,1],[\\\"discourse_ai.features.filters.text\\\"],null]],[24,0,\\\"admin-filter__input\\\"]],[[\\\"@filterAction\\\",\\\"@value\\\",\\\"@icons\\\"],[[30,0,[\\\"onFilterChange\\\"]],[30,0,[\\\"filterValue\\\"]],[28,[32,5],null,[[\\\"left\\\"],[\\\"magnifying-glass\\\"]]]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[8,[32,6],null,null,null],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"filteredFeatures\\\",\\\"length\\\"]],[[[1,\\\"    \\\"],[8,[32,7],null,[[\\\"@modules\\\"],[[30,0,[\\\"filteredFeatures\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"ai-features__no-results\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h3\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.features.filters.no_results\\\"],null]],[13],[1,\\\"\\\\n      \\\"],[8,[32,8],[[24,0,\\\"btn-default\\\"]],[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\"],[\\\"arrow-rotate-left\\\",\\\"discourse_ai.features.filters.reset\\\",[30,0,[\\\"resetAndFocus\\\"]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[13]],[\\\"select\\\",\\\"option\\\"],[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-features.js\",\n        \"scope\": () => [_dBreadcrumbsItem.default, _discourseI18n.i18n, _dPageSubheader.default, _dSelect.default, _filterInput.default, _helper.hash, _aiDefaultLlmSelector.default, _aiFeaturesList.default, _dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiFeatures;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-full-page-search\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/modifier\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-update\", \"@ember/service\", \"discourse/components/d-toggle-switch\", \"discourse/controllers/full-page-search\", \"discourse/float-kit/components/d-tooltip\", \"discourse/helpers/concat-class\", \"discourse/helpers/d-icon\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/search\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-indicator-wave\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _modifier, _object, _didUpdate, _service, _dToggleSwitch, _fullPageSearch, _dTooltip, _concatClass, _dIcon, _ajax, _ajaxError, _search, _discourseI18n, _aiIndicatorWave, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const AI_RESULTS_TOGGLED = \"full-page-search:ai-results-toggled\";\n  class AiFullPageSearch extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"appEvents\", [_service.service]);\n    }\n    #appEvents = (dt7948.i(this, \"appEvents\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"searching\", [_tracking.tracked]);\n    }\n    #searching = (dt7948.i(this, \"searching\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"AiResults\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #AiResults = (dt7948.i(this, \"AiResults\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"showingAiResults\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #showingAiResults = (dt7948.i(this, \"showingAiResults\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"sortOrder\", [_tracking.tracked], function () {\n        return this.args.sortOrder;\n      });\n    }\n    #sortOrder = (dt7948.i(this, \"sortOrder\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"autoEnabledForZeroResults\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #autoEnabledForZeroResults = (dt7948.i(this, \"autoEnabledForZeroResults\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"shouldAutoEnableWhenAiReady\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #shouldAutoEnableWhenAiReady = (dt7948.i(this, \"shouldAutoEnableWhenAiReady\"), void 0);\n    initialSearchTerm = this.args.searchTerm;\n    constructor() {\n      super(...arguments);\n      this.appEvents.on(\"full-page-search:trigger-search\", this, this.onSearch);\n      this.appEvents.on(\"search:search_result_view\", this, this.onSearchResultsLoaded);\n      this.onSearch();\n    }\n    willDestroy() {\n      super.willDestroy(...arguments);\n      this.appEvents.off(\"full-page-search:trigger-search\", this, this.onSearch);\n      this.appEvents.off(\"search:search_result_view\", this, this.onSearchResultsLoaded);\n    }\n    onSearch() {\n      if (!this.searchEnabled) {\n        return;\n      }\n      this.initialSearchTerm = this.args.searchTerm;\n      this.searching = true;\n      this.autoEnabledForZeroResults = false;\n      this.shouldAutoEnableWhenAiReady = false;\n      this.resetAiResults();\n      return this.performHyDESearch();\n    }\n    static {\n      dt7948.n(this.prototype, \"onSearch\", [_object.action]);\n    }\n    onSearchResultsLoaded() {\n      // enable AI results if we have zero regular results and AI results are ready\n      if (this.hasZeroRegularResults && !this.showingAiResults && !this.autoEnabledForZeroResults && this.AiResults.length > 0) {\n        this.autoEnabledForZeroResults = true;\n        this.showingAiResults = true;\n        this.args.addSearchResults(this.AiResults, \"topic_id\");\n        this.appEvents.trigger(AI_RESULTS_TOGGLED, {\n          enabled: true\n        });\n      } else if (this.hasZeroRegularResults && !this.showingAiResults && !this.autoEnabledForZeroResults && this.AiResults.length === 0) {\n        this.shouldAutoEnableWhenAiReady = true;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"onSearchResultsLoaded\", [_object.action]);\n    }\n    get disableToggleSwitch() {\n      if (this.searching || this.AiResults.length === 0 || !this.validSearchOrder) {\n        return true;\n      }\n    }\n    get validSearchOrder() {\n      return this.sortOrder === 0;\n    }\n    get hasZeroRegularResults() {\n      if (!this.args.model) {\n        return false;\n      }\n      const postsCount = this.args.model.posts?.length || 0;\n      const categoriesCount = this.args.model.categories?.length || 0;\n      const tagsCount = this.args.model.tags?.length || 0;\n      const usersCount = this.args.model.users?.length || 0;\n      return postsCount + categoriesCount + tagsCount + usersCount === 0;\n    }\n    get searchStateText() {\n      if (!this.validSearchOrder) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.embeddings.semantic_search_results.unavailable\");\n      }\n      // Auto-enabled and showing results:\n      if (this.autoEnabledForZeroResults && this.showingAiResults && this.AiResults.length > 0) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.embeddings.semantic_search_results.zero_results_expanded\", {\n          count: this.AiResults.length\n        });\n      }\n      // Search loading:\n      if (this.searching) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.embeddings.semantic_search_loading\");\n      }\n      // We have results and we are showing them\n      if (this.AiResults.length && this.showingAiResults) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.embeddings.semantic_search_results.toggle\", {\n          count: this.AiResults.length\n        });\n      }\n      // We have results but are hiding them\n      if (this.AiResults.length && !this.showingAiResults) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.embeddings.semantic_search_results.toggle_hidden\", {\n          count: this.AiResults.length\n        });\n      }\n      // Typing to search:\n      if (this.AiResults.length === 0 && this.searchTerm !== this.initialSearchTerm) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.embeddings.semantic_search_results.new\");\n      }\n      // No results:\n      if (this.AiResults.length === 0) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.embeddings.semantic_search_results.none\");\n      }\n    }\n    get settled() {\n      return this.validSearchOrder && !this.searching && this.searchTerm === this.initialSearchTerm;\n    }\n    get noResults() {\n      return this.settled && this.AiResults.length === 0;\n    }\n    get searchTerm() {\n      if (this.initialSearchTerm !== this.args.searchTerm) {\n        this.initialSearchTerm = undefined;\n      }\n      return this.args.searchTerm;\n    }\n    get searchEnabled() {\n      return this.args.searchType === _fullPageSearch.SEARCH_TYPE_DEFAULT && (0, _search.isValidSearchTerm)(this.searchTerm, this.siteSettings) && this.validSearchOrder;\n    }\n    get searchClass() {\n      if (!this.validSearchOrder) {\n        return \"unavailable\";\n      } else if (this.searching) {\n        return \"in-progress\";\n      } else if (this.noResults) {\n        return \"no-results\";\n      }\n    }\n    get tooltipText() {\n      return (0, _discourseI18n.i18n)(`discourse_ai.embeddings.semantic_search_tooltips.${this.validSearchOrder ? \"results_explanation\" : \"invalid_sort\"}`);\n    }\n    toggleAiResults() {\n      this.appEvents.trigger(AI_RESULTS_TOGGLED, {\n        enabled: !this.showingAiResults\n      });\n      if (this.showingAiResults) {\n        this.args.addSearchResults([], \"topic_id\");\n        this.autoEnabledForZeroResults = false;\n      } else {\n        this.args.addSearchResults(this.AiResults, \"topic_id\");\n      }\n      this.showingAiResults = !this.showingAiResults;\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleAiResults\", [_object.action]);\n    }\n    resetAiResults() {\n      this.AiResults = [];\n      this.showingAiResults = false;\n      this.args.addSearchResults([], \"topic_id\");\n    }\n    static {\n      dt7948.n(this.prototype, \"resetAiResults\", [_object.action]);\n    }\n    performHyDESearch() {\n      this.resetAiResults();\n      (0, _ajax.ajax)(\"/discourse-ai/embeddings/semantic-search\", {\n        data: {\n          q: this.searchTerm\n        }\n      }).then(async results => {\n        const model = (await (0, _search.translateResults)(results)) || {};\n        if (model.posts?.length === 0) {\n          return;\n        }\n        model.posts.forEach(post => {\n          post.generatedByAi = true;\n        });\n        this.AiResults = model.posts;\n        if (this.shouldAutoEnableWhenAiReady && !this.showingAiResults && !this.autoEnabledForZeroResults && this.AiResults.length > 0) {\n          this.autoEnabledForZeroResults = true;\n          this.showingAiResults = true;\n          this.shouldAutoEnableWhenAiReady = false;\n          this.args.addSearchResults(this.AiResults, \"topic_id\");\n          this.appEvents.trigger(AI_RESULTS_TOGGLED, {\n            enabled: true\n          });\n        }\n      }).catch(_ajaxError.popupAjaxError).finally(() => {\n        this.searching = false;\n      });\n    }\n    sortChanged() {\n      if (this.sortOrder !== this.args.sortOrder) {\n        this.sortOrder = this.args.sortOrder;\n        if (this.validSearchOrder) {\n          this.onSearch();\n        } else {\n          this.showingAiResults = false;\n          this.resetAiResults();\n        }\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"sortChanged\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div\n        {{didUpdate this.sortChanged @sortOrder}}\n        class=\"semantic-search__container search-results\"\n        role=\"region\"\n      >\n        <div class=\"semantic-search__results\">\n          <div\n            class={{concatClass \"semantic-search__searching\" this.searchClass}}\n          >\n            <DToggleSwitch\n              disabled={{this.disableToggleSwitch}}\n              @state={{this.showingAiResults}}\n              class=\"semantic-search__results-toggle\"\n              {{on \"click\" this.toggleAiResults}}\n            />\n      \n            <div class=\"semantic-search__searching-text\">\n              {{icon \"discourse-sparkles\"}}\n              {{this.searchStateText}}\n            </div>\n      \n            {{#if this.validSearchOrder}}\n              <AiIndicatorWave @loading={{this.searching}} />\n            {{/if}}\n      \n            <DTooltip\n              @identifier=\"semantic-search-tooltip\"\n              class=\"semantic-search__tooltip\"\n            >\n              <:trigger>\n                {{icon \"far-circle-question\"}}\n              </:trigger>\n              <:content>\n                {{this.tooltipText}}\n              </:content>\n            </DTooltip>\n          </div>\n        </div>\n      </div>\n      */\n      {\n        \"id\": \"Z82upd94\",\n        \"block\": \"[[[11,0],[24,0,\\\"semantic-search__container search-results\\\"],[24,\\\"role\\\",\\\"region\\\"],[4,[32,0],[[30,0,[\\\"sortChanged\\\"]],[30,1]],null],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"semantic-search__results\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[15,0,[28,[32,1],[\\\"semantic-search__searching\\\",[30,0,[\\\"searchClass\\\"]]],null]],[12],[1,\\\"\\\\n      \\\"],[8,[32,2],[[16,\\\"disabled\\\",[30,0,[\\\"disableToggleSwitch\\\"]]],[24,0,\\\"semantic-search__results-toggle\\\"],[4,[32,3],[\\\"click\\\",[30,0,[\\\"toggleAiResults\\\"]]],null]],[[\\\"@state\\\"],[[30,0,[\\\"showingAiResults\\\"]]]],null],[1,\\\"\\\\n\\\\n      \\\"],[10,0],[14,0,\\\"semantic-search__searching-text\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,4],[\\\"discourse-sparkles\\\"],null]],[1,\\\"\\\\n        \\\"],[1,[30,0,[\\\"searchStateText\\\"]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"validSearchOrder\\\"]],[[[1,\\\"        \\\"],[8,[32,5],null,[[\\\"@loading\\\"],[[30,0,[\\\"searching\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n      \\\"],[8,[32,6],[[24,0,\\\"semantic-search__tooltip\\\"]],[[\\\"@identifier\\\"],[\\\"semantic-search-tooltip\\\"]],[[\\\"trigger\\\",\\\"content\\\"],[[[[1,\\\"\\\\n          \\\"],[1,[28,[32,4],[\\\"far-circle-question\\\"],null]],[1,\\\"\\\\n        \\\"]],[]],[[[1,\\\"\\\\n          \\\"],[1,[30,0,[\\\"tooltipText\\\"]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@sortOrder\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-full-page-search.js\",\n        \"scope\": () => [_didUpdate.default, _concatClass.default, _dToggleSwitch.default, _modifier.on, _dIcon.default, _aiIndicatorWave.default, _dTooltip.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiFullPageSearch;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-gist-toggle\", [\"exports\", \"@glimmer/component\", \"@ember/helper\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/components/dropdown-menu\", \"discourse/float-kit/components/d-menu\", \"discourse/helpers/d-icon\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/services/gists\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _helper, _object, _service, _dButton, _dropdownMenu, _dMenu, _dIcon, _truthHelpers, _discourseI18n, _gists3, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiGistToggle extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"gists\", [_service.service]);\n    }\n    #gists = (dt7948.i(this, \"gists\"), void 0);\n    get buttons() {\n      return [{\n        id: _gists3.TABLE_LAYOUT,\n        label: \"discourse_ai.summarization.topic_list_layout.button.compact\",\n        icon: \"discourse-table\"\n      }, {\n        id: _gists3.TABLE_AI_LAYOUT,\n        label: \"discourse_ai.summarization.topic_list_layout.button.expanded\",\n        icon: \"discourse-table-sparkles\",\n        description: \"discourse_ai.summarization.topic_list_layout.button.expanded_description\"\n      }];\n    }\n    get selectedOptionId() {\n      return this.gists.currentPreference;\n    }\n    get currentButton() {\n      const buttonPreference = this.buttons.find(button => button.id === this.selectedOptionId);\n      return buttonPreference || this.buttons[0];\n    }\n    onRegisterApi(api) {\n      this.dMenu = api;\n    }\n    static {\n      dt7948.n(this.prototype, \"onRegisterApi\", [_object.action]);\n    }\n    onSelect(optionId) {\n      this.gists.setPreference(optionId);\n      this.dMenu.close();\n    }\n    static {\n      dt7948.n(this.prototype, \"onSelect\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.gists.showToggle}}\n        <DMenu\n          @modalForMobile={{true}}\n          @autofocus={{true}}\n          @identifier=\"topic-list-layout\"\n          @onRegisterApi={{this.onRegisterApi}}\n          @triggerClass=\"btn-default btn-icon\"\n        >\n          <:trigger>\n            {{icon this.currentButton.icon}}\n          </:trigger>\n          <:content>\n            <DropdownMenu as |dropdown|>\n              {{#each this.buttons as |button|}}\n                <dropdown.item\n                  class={{if (eq this.currentButton.id button.id) \"--selected\"}}\n                >\n                  <DButton\n                    @label={{button.label}}\n                    @icon={{button.icon}}\n                    class=\"btn-transparent\n                      {{if button.description '--with-description'}}\"\n                    @action={{fn this.onSelect button.id}}\n                  >\n                    {{#if button.description}}\n                      <div class=\"btn__description\">\n                        {{i18n button.description}}\n                      </div>\n                    {{/if}}\n                  </DButton>\n                </dropdown.item>\n              {{/each}}\n            </DropdownMenu>\n          </:content>\n        </DMenu>\n      {{/if}}\n      */\n      {\n        \"id\": \"UxfiXTy8\",\n        \"block\": \"[[[41,[30,0,[\\\"gists\\\",\\\"showToggle\\\"]],[[[1,\\\"  \\\"],[8,[32,0],null,[[\\\"@modalForMobile\\\",\\\"@autofocus\\\",\\\"@identifier\\\",\\\"@onRegisterApi\\\",\\\"@triggerClass\\\"],[true,true,\\\"topic-list-layout\\\",[30,0,[\\\"onRegisterApi\\\"]],\\\"btn-default btn-icon\\\"]],[[\\\"trigger\\\",\\\"content\\\"],[[[[1,\\\"\\\\n      \\\"],[1,[28,[32,1],[[30,0,[\\\"currentButton\\\",\\\"icon\\\"]]],null]],[1,\\\"\\\\n    \\\"]],[]],[[[1,\\\"\\\\n      \\\"],[8,[32,2],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"buttons\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[8,[30,1,[\\\"item\\\"]],[[16,0,[52,[28,[32,3],[[30,0,[\\\"currentButton\\\",\\\"id\\\"]],[30,2,[\\\"id\\\"]]],null],\\\"--selected\\\"]]],null,[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[32,4],[[16,0,[29,[\\\"btn-transparent\\\\n                \\\",[52,[30,2,[\\\"description\\\"]],\\\"--with-description\\\"]]]]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\"],[[30,2,[\\\"label\\\"]],[30,2,[\\\"icon\\\"]],[28,[32,5],[[30,0,[\\\"onSelect\\\"]],[30,2,[\\\"id\\\"]]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,2,[\\\"description\\\"]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"btn__description\\\"],[12],[1,\\\"\\\\n                  \\\"],[1,[28,[32,6],[[30,2,[\\\"description\\\"]]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"            \\\"]],[]]]]],[1,\\\"\\\\n          \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"      \\\"]],[1]]]]],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"dropdown\\\",\\\"button\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-gist-toggle.js\",\n        \"scope\": () => [_dMenu.default, _dIcon.default, _dropdownMenu.default, _truthHelpers.eq, _dButton.default, _helper.fn, _discourseI18n.i18n],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiGistToggle;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-helper-custom-prompt\", [\"exports\", \"@glimmer/component\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"discourse/components/d-button\", \"discourse/helpers/with-event-value\", \"discourse/truth-helpers\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _helper, _modifier, _object, _dButton, _withEventValue, _truthHelpers, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiHelperCustomPrompt extends _component.default {\n    sendInput(event) {\n      if (event.key !== \"Enter\") {\n        return;\n      }\n      return this.args.submit(this.args.promptArgs);\n    }\n    static {\n      dt7948.n(this.prototype, \"sendInput\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"ai-custom-prompt\">\n      \n        <input\n          {{on \"input\" (withEventValue (fn (mut @value)))}}\n          {{on \"keydown\" this.sendInput}}\n          value={{@value}}\n          placeholder={{i18n\n            \"discourse_ai.ai_helper.context_menu.custom_prompt.placeholder\"\n          }}\n          class=\"ai-custom-prompt__input\"\n          type=\"text\"\n          autofocus=\"autofocus\"\n        />\n      \n        <DButton\n          @icon=\"discourse-sparkles\"\n          @action={{fn @submit @promptArgs}}\n          @disabled={{not @value.length}}\n          class=\"ai-custom-prompt__submit btn-primary\"\n        />\n      </div>\n      */\n      {\n        \"id\": \"NvOiGme1\",\n        \"block\": \"[[[10,0],[14,0,\\\"ai-custom-prompt\\\"],[12],[1,\\\"\\\\n\\\\n  \\\"],[11,\\\"input\\\"],[16,2,[30,1]],[16,\\\"placeholder\\\",[28,[32,0],[\\\"discourse_ai.ai_helper.context_menu.custom_prompt.placeholder\\\"],null]],[24,0,\\\"ai-custom-prompt__input\\\"],[24,\\\"autofocus\\\",\\\"autofocus\\\"],[24,4,\\\"text\\\"],[4,[32,1],[\\\"input\\\",[28,[32,2],[[28,[32,3],[[28,[31,0],[[30,1]],null]],null]],null]],null],[4,[32,1],[\\\"keydown\\\",[30,0,[\\\"sendInput\\\"]]],null],[12],[13],[1,\\\"\\\\n\\\\n  \\\"],[8,[32,4],[[24,0,\\\"ai-custom-prompt__submit btn-primary\\\"]],[[\\\"@icon\\\",\\\"@action\\\",\\\"@disabled\\\"],[\\\"discourse-sparkles\\\",[28,[32,3],[[30,2],[30,3]],null],[28,[32,5],[[30,1,[\\\"length\\\"]]],null]]],null],[1,\\\"\\\\n\\\"],[13]],[\\\"@value\\\",\\\"@submit\\\",\\\"@promptArgs\\\"],[\\\"mut\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-helper-custom-prompt.js\",\n        \"scope\": () => [_discourseI18n.i18n, _modifier.on, _withEventValue.default, _helper.fn, _dButton.default, _truthHelpers.not],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiHelperCustomPrompt;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-helper-loading\", [\"exports\", \"discourse/components/d-button\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _dButton, _discourseI18n, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const AiHelperLoading = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"ai-helper-loading\">\n    <div class=\"dot-falling\"></div>\n    <span>\n      {{i18n \"discourse_ai.ai_helper.context_menu.loading\"}}\n    </span>\n    <DButton\n      @icon=\"xmark\"\n      @title=\"discourse_ai.ai_helper.context_menu.cancel\"\n      @action={{@cancel}}\n      class=\"btn-flat cancel-request\"\n    />\n  </div>\n  */\n  {\n    \"id\": \"m01xbwss\",\n    \"block\": \"[[[10,0],[14,0,\\\"ai-helper-loading\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"dot-falling\\\"],[12],[13],[1,\\\"\\\\n  \\\"],[10,1],[12],[1,\\\"\\\\n    \\\"],[1,[28,[32,0],[\\\"discourse_ai.ai_helper.context_menu.loading\\\"],null]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[8,[32,1],[[24,0,\\\"btn-flat cancel-request\\\"]],[[\\\"@icon\\\",\\\"@title\\\",\\\"@action\\\"],[\\\"xmark\\\",\\\"discourse_ai.ai_helper.context_menu.cancel\\\",[30,1]]],null],[1,\\\"\\\\n\\\"],[13]],[\\\"@cancel\\\"],[]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-helper-loading.js\",\n    \"scope\": () => [_discourseI18n.i18n, _dButton.default],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"ai-helper-loading:AiHelperLoading\"));\n  var _default = _exports.default = AiHelperLoading;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-helper-options-list\", [\"exports\", \"@glimmer/component\", \"@ember/helper\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/lib/utilities\", \"discourse/services/keyboard-shortcuts\", \"discourse/truth-helpers\", \"discourse/plugins/discourse-ai/discourse/components/ai-helper-custom-prompt\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _helper, _service, _dButton, _utilities, _keyboardShortcuts, _truthHelpers, _aiHelperCustomPrompt, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiHelperOptionsList extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"site\", [_service.service]);\n    }\n    #site = (dt7948.i(this, \"site\"), void 0);\n    get showShortcut() {\n      return this.site.desktopView && this.args.shortcutVisible;\n    }\n    get shortcut() {\n      return (0, _utilities.translateModKey)(`${_keyboardShortcuts.PLATFORM_KEY_MODIFIER} alt p`);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <ul class=\"ai-helper-options\">\n        {{#each @options as |option|}}\n          {{#if (eq option.name \"custom_prompt\")}}\n            <AiHelperCustomPrompt\n              @value={{@customPromptValue}}\n              @promptArgs={{option}}\n              @submit={{@performAction}}\n            />\n          {{else}}\n            <li data-name={{option.translated_name}} data-value={{option.name}}>\n              <DButton\n                @icon={{option.icon}}\n                @translatedLabel={{option.translated_name}}\n                @action={{fn @performAction option}}\n                data-name={{option.name}}\n                class=\"ai-helper-options__button\"\n              >\n                {{#if (and (eq option.name \"proofread\") this.showShortcut)}}\n                  <kbd class=\"shortcut\">{{this.shortcut}}</kbd>\n                {{/if}}\n              </DButton>\n            </li>\n          {{/if}}\n        {{/each}}\n      </ul>\n      */\n      {\n        \"id\": \"P/vOyKfp\",\n        \"block\": \"[[[10,\\\"ul\\\"],[14,0,\\\"ai-helper-options\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,1]],null]],null],null,[[[41,[28,[32,0],[[30,2,[\\\"name\\\"]],\\\"custom_prompt\\\"],null],[[[1,\\\"      \\\"],[8,[32,1],null,[[\\\"@value\\\",\\\"@promptArgs\\\",\\\"@submit\\\"],[[30,3],[30,2],[30,4]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[10,\\\"li\\\"],[15,\\\"data-name\\\",[30,2,[\\\"translated_name\\\"]]],[15,\\\"data-value\\\",[30,2,[\\\"name\\\"]]],[12],[1,\\\"\\\\n        \\\"],[8,[32,2],[[16,\\\"data-name\\\",[30,2,[\\\"name\\\"]]],[24,0,\\\"ai-helper-options__button\\\"]],[[\\\"@icon\\\",\\\"@translatedLabel\\\",\\\"@action\\\"],[[30,2,[\\\"icon\\\"]],[30,2,[\\\"translated_name\\\"]],[28,[32,3],[[30,4],[30,2]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[28,[32,4],[[28,[32,0],[[30,2,[\\\"name\\\"]],\\\"proofread\\\"],null],[30,0,[\\\"showShortcut\\\"]]],null],[[[1,\\\"            \\\"],[10,\\\"kbd\\\"],[14,0,\\\"shortcut\\\"],[12],[1,[30,0,[\\\"shortcut\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"]],[]]]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[2]],null],[13]],[\\\"@options\\\",\\\"option\\\",\\\"@customPromptValue\\\",\\\"@performAction\\\"],[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-helper-options-list.js\",\n        \"scope\": () => [_truthHelpers.eq, _aiHelperCustomPrompt.default, _dButton.default, _helper.fn, _truthHelpers.and],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiHelperOptionsList;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-indicator-wave\", [\"exports\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const indicatorDots = [\".\", \".\", \".\"];\n  const AiIndicatorWave = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    {{#if @loading}}\n    <span class=\"ai-indicator-wave\">\n      {{#each indicatorDots as |dot|}}\n        <span class=\"ai-indicator-wave__dot\">{{dot}}</span>\n      {{/each}}\n    </span>\n  {{/if}}\n  */\n  {\n    \"id\": \"jDNLNjRa\",\n    \"block\": \"[[[41,[30,1],[[[1,\\\"  \\\"],[10,1],[14,0,\\\"ai-indicator-wave\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[32,0]],null]],null],null,[[[1,\\\"      \\\"],[10,1],[14,0,\\\"ai-indicator-wave__dot\\\"],[12],[1,[30,2]],[13],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@loading\\\",\\\"dot\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-indicator-wave.js\",\n    \"scope\": () => [indicatorDots],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"ai-indicator-wave:AiIndicatorWave\"));\n  var _default = _exports.default = AiIndicatorWave;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-llm-attachment-types\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"discourse/lib/array-tools\", \"discourse/select-kit/components/list-setting\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _arrayTools, _listSetting, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const DEFAULT_CHOICES = [\"pdf\", \"txt\", \"doc\", \"docx\", \"rtf\", \"html\", \"markdown\"];\n  /**\n   * @component ai-llm-attachment-types\n   * @param {string[]} [this.args.value]\n   * @param {Function} [this.args.onChange]\n   */\n  class AiLlmAttachmentTypes extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"currentValue\", [_tracking.tracked], function () {\n        return this.args.value || [];\n      });\n    }\n    #currentValue = (dt7948.i(this, \"currentValue\"), void 0);\n    get settingChoices() {\n      return (0, _arrayTools.uniqueItemsFromArray)([...DEFAULT_CHOICES, ...this.currentValue]).sort();\n    }\n    handleChange(newValues) {\n      const normalized = (newValues || []).map(v => v.toString().toLowerCase().trim()).filter(Boolean);\n      this.currentValue = (0, _arrayTools.uniqueItemsFromArray)(normalized);\n      this.args.onChange?.(this.currentValue);\n    }\n    static {\n      dt7948.n(this.prototype, \"handleChange\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <ListSetting\n        @value={{this.currentValue}}\n        @settingName=\"allowed_attachment_types\"\n        @choices={{this.settingChoices}}\n        @onChange={{this.handleChange}}\n        @allowAny={{true}}\n        @options={{hash\n          noneLabel=(i18n \"discourse_ai.llms.attachment_types_placeholder\")\n        }}\n      />\n      */\n      {\n        \"id\": \"b6hvZHlP\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@value\\\",\\\"@settingName\\\",\\\"@choices\\\",\\\"@onChange\\\",\\\"@allowAny\\\",\\\"@options\\\"],[[30,0,[\\\"currentValue\\\"]],\\\"allowed_attachment_types\\\",[30,0,[\\\"settingChoices\\\"]],[30,0,[\\\"handleChange\\\"]],true,[28,[32,1],null,[[\\\"noneLabel\\\"],[[28,[32,2],[\\\"discourse_ai.llms.attachment_types_placeholder\\\"],null]]]]]],null]],[],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-llm-attachment-types.js\",\n        \"scope\": () => [_listSetting.default, _helper.hash, _discourseI18n.i18n],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiLlmAttachmentTypes;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-llm-editor-form\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/routing\", \"@ember/runloop\", \"@ember/service\", \"discourse/admin/models/admin-user\", \"discourse/components/conditional-loading-spinner\", \"discourse/components/form\", \"discourse/helpers/bound-avatar-template\", \"discourse/helpers/d-icon\", \"discourse/lib/ajax-error\", \"discourse/lib/array-tools\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-llm-attachment-types\", \"discourse/plugins/discourse-ai/discourse/components/ai-quota-duration-selector\", \"discourse/plugins/discourse-ai/discourse/components/modal/ai-llm-quota-modal\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _routing, _runloop, _service, _adminUser, _conditionalLoadingSpinner, _form, _boundAvatarTemplate, _dIcon, _ajaxError, _arrayTools, _truthHelpers, _discourseI18n, _aiLlmAttachmentTypes, _aiQuotaDurationSelector, _aiLlmQuotaModal, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiLlmEditorForm extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"toasts\", [_service.service]);\n    }\n    #toasts = (dt7948.i(this, \"toasts\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"dialog\", [_service.service]);\n    }\n    #dialog = (dt7948.i(this, \"dialog\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isSaving\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isSaving = (dt7948.i(this, \"isSaving\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"testRunning\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #testRunning = (dt7948.i(this, \"testRunning\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"testResult\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #testResult = (dt7948.i(this, \"testResult\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"testError\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #testError = (dt7948.i(this, \"testError\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"testValidationErrors\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #testValidationErrors = (dt7948.i(this, \"testValidationErrors\"), void 0);\n    get formData() {\n      if (this.args.llmTemplate) {\n        let [id, modelName] = this.args.llmTemplate.split(/-(.*)/);\n        if (id === \"none\") {\n          return {\n            provider_params: {}\n          };\n        }\n        const info = this.args.llms.resultSetMeta.presets.find(item => item.id === id);\n        const modelInfo = info.models.find(item => item.name === modelName);\n        return {\n          max_prompt_tokens: modelInfo.tokens,\n          max_output_tokens: modelInfo.max_output_tokens,\n          tokenizer: info.tokenizer,\n          url: modelInfo.endpoint || info.endpoint,\n          display_name: modelInfo.display_name,\n          name: modelInfo.name,\n          provider: info.provider,\n          provider_params: this.computeProviderParams(info.provider, modelInfo.provider_params ?? {}),\n          input_cost: modelInfo.input_cost,\n          output_cost: modelInfo.output_cost,\n          cached_input_cost: modelInfo.cached_input_cost,\n          vision_enabled: modelInfo.vision_enabled || false,\n          cache_write_cost: modelInfo.cache_write_cost,\n          allowed_attachment_types: []\n        };\n      }\n      const {\n        model\n      } = this.args;\n      return {\n        max_prompt_tokens: model.max_prompt_tokens,\n        max_output_tokens: model.max_output_tokens,\n        api_key: model.api_key,\n        tokenizer: model.tokenizer,\n        url: model.url,\n        display_name: model.display_name,\n        name: model.name,\n        provider: model.provider,\n        vision_enabled: model.vision_enabled,\n        input_cost: model.input_cost,\n        output_cost: model.output_cost,\n        cached_input_cost: model.cached_input_cost,\n        cache_write_cost: model.cache_write_cost,\n        provider_params: this.computeProviderParams(model.provider, model.provider_params),\n        llm_quotas: model.llm_quotas,\n        allowed_attachment_types: model.allowed_attachment_types || []\n      };\n    }\n    static {\n      dt7948.n(this.prototype, \"formData\", [_tracking.cached]);\n    }\n    get selectedProviders() {\n      const t = provName => {\n        return (0, _discourseI18n.i18n)(`discourse_ai.llms.providers.${provName}`);\n      };\n      return this.args.llms.resultSetMeta.providers.map(prov => {\n        return {\n          id: prov,\n          name: t(prov)\n        };\n      }).sort((a, b) => a.name.localeCompare(b.name));\n    }\n    get tokenizers() {\n      return this.args.llms.resultSetMeta.tokenizers.sort((a, b) => a.name.localeCompare(b.name));\n    }\n    get adminUser() {\n      return _adminUser.default.create(this.args.model?.user);\n    }\n    get testErrorMessage() {\n      if (this.testValidationErrors?.length > 0) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.llms.tests.invalid_config\");\n      } else {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.llms.tests.failure\", {\n          error: this.testError\n        });\n      }\n    }\n    get displayTestResult() {\n      return this.testRunning || this.testResult !== null;\n    }\n    get modulesUsingModel() {\n      const usedBy = this.args.model.used_by?.filter(m => m.type !== \"ai_bot\");\n      if (!usedBy || usedBy.length === 0) {\n        return null;\n      }\n      const localized = usedBy.map(m => {\n        return (0, _discourseI18n.i18n)(`discourse_ai.llms.usage.${m.type}`, {\n          persona: m.name\n        });\n      });\n      // TODO: this is not perfectly localized\n      return localized.join(\", \");\n    }\n    get inUseWarning() {\n      return (0, _discourseI18n.i18n)(\"discourse_ai.llms.in_use_warning\", {\n        settings: this.modulesUsingModel,\n        count: this.args.model.used_by.length\n      });\n    }\n    get showAddQuotaButton() {\n      return !this.args.model.isNew;\n    }\n    computeProviderParams(provider, currentParams = {}) {\n      const params = this.args.llms.resultSetMeta.provider_params[provider] ?? {};\n      return Object.fromEntries(Object.entries(params).map(([k, v]) => [k, currentParams[k] ?? (v?.type === \"enum\" ? v.default : null)]));\n    }\n    canEditURL(provider) {\n      return provider !== \"aws_bedrock\";\n    }\n    static {\n      dt7948.n(this.prototype, \"canEditURL\", [_object.action]);\n    }\n    openAddQuotaModal(addItemToCollection) {\n      this.modal.show(_aiLlmQuotaModal.default, {\n        model: {\n          llm: this.args.model,\n          addItemToCollection\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"openAddQuotaModal\", [_object.action]);\n    }\n    metaProviderParams(provider) {\n      const params = this.args.llms.resultSetMeta.provider_params[provider] || {};\n      return Object.entries(params).reduce((acc, [field, value]) => {\n        if (typeof value === \"string\") {\n          acc[field] = {\n            type: value\n          };\n        } else if (typeof value === \"object\") {\n          if (value.values) {\n            value = {\n              ...value\n            };\n            value.values = value.values.map(v => ({\n              id: v,\n              name: v\n            }));\n          }\n          acc[field] = {\n            type: value.type || \"text\",\n            values: value.values || [],\n            default: value.default ?? undefined\n          };\n        } else {\n          acc[field] = {\n            type: \"text\"\n          }; // fallback\n        }\n        return acc;\n      }, {});\n    }\n    static {\n      dt7948.n(this.prototype, \"metaProviderParams\", [_object.action]);\n    }\n    async save(data) {\n      this.isSaving = true;\n      const isNew = this.args.model.isNew;\n      const updatedData = {\n        ...data\n      };\n      // If max_prompt_tokens input is cleared,\n      // we want the db to store null\n      if (!data.max_output_tokens) {\n        updatedData.max_output_tokens = null;\n      }\n      try {\n        await this.args.model.save(updatedData);\n        if (isNew) {\n          (0, _arrayTools.addUniqueValueToArray)(this.args.llms.content, this.args.model);\n          await this.router.replaceWith(\"adminPlugins.show.discourse-ai-llms.edit\", this.args.model.id);\n        }\n        this.toasts.success({\n          data: {\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.llms.saved\")\n          },\n          duration: \"short\"\n        });\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        (0, _runloop.later)(() => {\n          this.isSaving = false;\n        }, 1000);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"save\", [_object.action]);\n    }\n    async test(data) {\n      this.testRunning = true;\n      try {\n        // For seeded models, include the id so backend can test the existing model\n        const testData = this.args.model.seeded ? {\n          ...data,\n          id: this.args.model.id\n        } : data;\n        const configTestResult = await this.args.model.testConfig(testData);\n        this.testResult = configTestResult.success;\n        if (this.testResult) {\n          this.testError = null;\n          this.testValidationErrors = null;\n        } else {\n          this.testError = configTestResult.error;\n          this.testValidationErrors = configTestResult.validation_errors;\n        }\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        (0, _runloop.later)(() => {\n          this.testRunning = false;\n        }, 1000);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"test\", [_object.action]);\n    }\n    setProvider(provider, {\n      set\n    }) {\n      set(\"provider_params\", this.computeProviderParams(provider));\n      set(\"provider\", provider);\n    }\n    static {\n      dt7948.n(this.prototype, \"setProvider\", [_object.action]);\n    }\n    delete() {\n      return this.dialog.confirm({\n        message: (0, _discourseI18n.i18n)(\"discourse_ai.llms.confirm_delete\"),\n        didConfirm: () => {\n          return this.args.model.destroyRecord().then(() => {\n            (0, _arrayTools.removeValueFromArray)(this.args.llms.content, this.args.model);\n            this.router.transitionTo(\"adminPlugins.show.discourse-ai-llms.index\");\n          }).catch(_ajaxError.popupAjaxError);\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"delete\", [_object.action]);\n    }\n    providerParamsKeys(providerParams) {\n      return providerParams ? Object.keys(providerParams) : [];\n    }\n    static {\n      dt7948.n(this.prototype, \"providerParamsKeys\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <Form\n        @onSubmit={{this.save}}\n        @data={{this.formData}}\n        class=\"ai-llm-editor\"\n        as |form data|\n      >\n        {{#if this.modulesUsingModel}}\n          <form.Alert @icon=\"circle-info\">\n            {{this.inUseWarning}}\n          </form.Alert>\n        {{/if}}\n      \n        <form.Field\n          @name=\"display_name\"\n          @title={{i18n \"discourse_ai.llms.display_name\"}}\n          @validation=\"required|length:1,100\"\n          @format=\"large\"\n          @tooltip={{i18n \"discourse_ai.llms.hints.display_name\"}}\n          @disabled={{@model.seeded}}\n          as |field|\n        >\n          <field.Input />\n        </form.Field>\n      \n        <form.Field\n          @name=\"name\"\n          @title={{i18n \"discourse_ai.llms.name\"}}\n          @tooltip={{i18n \"discourse_ai.llms.hints.name\"}}\n          @validation=\"required\"\n          @format=\"large\"\n          @disabled={{@model.seeded}}\n          as |field|\n        >\n          <field.Input />\n        </form.Field>\n      \n        {{#unless @model.seeded}}\n          <form.Field\n            @name=\"provider\"\n            @title={{i18n \"discourse_ai.llms.provider\"}}\n            @format=\"large\"\n            @validation=\"required\"\n            @onSet={{this.setProvider}}\n            as |field|\n          >\n            <field.Select as |select|>\n              {{#each this.selectedProviders as |provider|}}\n                <select.Option\n                  @value={{provider.id}}\n                >{{provider.name}}</select.Option>\n              {{/each}}\n            </field.Select>\n          </form.Field>\n      \n          {{#if (this.canEditURL data.provider)}}\n            <form.Field\n              @name=\"url\"\n              @title={{i18n \"discourse_ai.llms.url\"}}\n              @validation=\"required\"\n              @format=\"large\"\n              as |field|\n            >\n              <field.Input />\n            </form.Field>\n          {{/if}}\n      \n          <form.Field\n            @name=\"api_key\"\n            @title={{i18n \"discourse_ai.llms.api_key\"}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Password autocomplete=\"off\" data-1p-ignore />\n          </form.Field>\n      \n          <form.Object @name=\"provider_params\" as |object providerParamsData|>\n            {{#each (this.providerParamsKeys providerParamsData) as |name|}}\n              {{#let\n                (get (this.metaProviderParams data.provider) name)\n                as |params|\n              }}\n                <object.Field\n                  @name={{name}}\n                  @title={{i18n\n                    (concat \"discourse_ai.llms.provider_fields.\" name)\n                  }}\n                  @format=\"large\"\n                  as |field|\n                >\n                  {{#if (eq params.type \"enum\")}}\n                    <field.Select @includeNone={{false}} as |select|>\n                      {{#each params.values as |option|}}\n                        <select.Option\n                          @value={{option.id}}\n                        >{{option.name}}</select.Option>\n                      {{/each}}\n                    </field.Select>\n                  {{else if (eq params.type \"checkbox\")}}\n                    <field.Checkbox />\n                  {{else}}\n                    <field.Input @type={{params.type}} />\n                  {{/if}}\n                </object.Field>\n              {{/let}}\n            {{/each}}\n          </form.Object>\n      \n          <form.Field\n            @name=\"tokenizer\"\n            @title={{i18n \"discourse_ai.llms.tokenizer\"}}\n            @format=\"large\"\n            @validation=\"required\"\n            as |field|\n          >\n            <field.Select as |select|>\n              {{#each this.tokenizers as |tokenizer|}}\n                <select.Option\n                  @value={{tokenizer.id}}\n                >{{tokenizer.name}}</select.Option>\n              {{/each}}\n            </field.Select>\n          </form.Field>\n      \n          <form.Field\n            @name=\"max_prompt_tokens\"\n            @title={{i18n \"discourse_ai.llms.max_prompt_tokens\"}}\n            @tooltip={{i18n \"discourse_ai.llms.hints.max_prompt_tokens\"}}\n            @validation=\"required\"\n            @format=\"large\"\n            as |field|\n          >\n            <field.Input @type=\"number\" step=\"any\" min=\"0\" lang=\"en\" />\n          </form.Field>\n      \n          <form.InputGroup as |inputGroup|>\n            <inputGroup.Field\n              @name=\"input_cost\"\n              @title={{i18n \"discourse_ai.llms.cost_input\"}}\n              @tooltip={{i18n \"discourse_ai.llms.hints.cost_input\"}}\n              @helpText={{i18n \"discourse_ai.llms.hints.cost_measure\"}}\n              as |field|\n            >\n              <field.Input @type=\"number\" step=\"any\" min=\"0\" lang=\"en\" />\n            </inputGroup.Field>\n      \n            <inputGroup.Field\n              @name=\"cached_input_cost\"\n              @title={{i18n \"discourse_ai.llms.cost_cached_input\"}}\n              @tooltip={{i18n \"discourse_ai.llms.hints.cost_cached_input\"}}\n              @helpText={{i18n \"discourse_ai.llms.hints.cost_measure\"}}\n              as |field|\n            >\n              <field.Input @type=\"number\" step=\"any\" min=\"0\" lang=\"en\" />\n            </inputGroup.Field>\n      \n            <inputGroup.Field\n              @name=\"cache_write_cost\"\n              @title={{i18n \"discourse_ai.llms.cost_cache_write\"}}\n              @tooltip={{i18n \"discourse_ai.llms.hints.cost_cache_write\"}}\n              @helpText={{i18n \"discourse_ai.llms.hints.cost_measure\"}}\n              as |field|\n            >\n              <field.Input @type=\"number\" step=\"any\" min=\"0\" lang=\"en\" />\n            </inputGroup.Field>\n      \n            <inputGroup.Field\n              @name=\"output_cost\"\n              @title={{i18n \"discourse_ai.llms.cost_output\"}}\n              @tooltip={{i18n \"discourse_ai.llms.hints.cost_output\"}}\n              @helpText={{i18n \"discourse_ai.llms.hints.cost_measure\"}}\n              as |field|\n            >\n              <field.Input @type=\"number\" step=\"any\" min=\"0\" lang=\"en\" />\n            </inputGroup.Field>\n          </form.InputGroup>\n      \n          <form.Field\n            @name=\"max_output_tokens\"\n            @title={{i18n \"discourse_ai.llms.max_output_tokens\"}}\n            @tooltip={{i18n \"discourse_ai.llms.hints.max_output_tokens\"}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Input @type=\"number\" step=\"any\" min=\"0\" lang=\"en\" />\n          </form.Field>\n      \n          <form.Field\n            @name=\"vision_enabled\"\n            @title={{i18n \"discourse_ai.llms.vision_enabled\"}}\n            @tooltip={{i18n \"discourse_ai.llms.hints.vision_enabled\"}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Checkbox />\n          </form.Field>\n      \n          <form.Field\n            @name=\"allowed_attachment_types\"\n            @title={{i18n \"discourse_ai.llms.allowed_attachment_types\"}}\n            @tooltip={{i18n \"discourse_ai.llms.hints.allowed_attachment_types\"}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Label />\n            <field.Custom>\n              <AiLlmAttachmentTypes\n                @value={{field.value}}\n                @onChange={{field.set}}\n              />\n            </field.Custom>\n            <field.Hint />\n          </form.Field>\n      \n          {{#if @model.user}}\n            <form.Container @title={{i18n \"discourse_ai.llms.ai_bot_user\"}}>\n              <a\n                class=\"avatar\"\n                href={{@model.user.path}}\n                data-user-card={{@model.user.username}}\n              >\n                {{Avatar @model.user.avatar_template \"small\"}}\n              </a>\n              <LinkTo @route=\"adminUser\" @model={{this.adminUser}}>\n                {{@model.user.username}}\n              </LinkTo>\n            </form.Container>\n          {{/if}}\n        {{/unless}}\n      \n        {{#if (gt data.llm_quotas.length 0)}}\n          <form.Container @title={{i18n \"discourse_ai.llms.quotas.title\"}}>\n            <table class=\"ai-llm-quotas__table\">\n              <thead class=\"ai-llm-quotas__table-head\">\n                <tr class=\"ai-llm-quotas__header-row\">\n                  <th class=\"ai-llm-quotas__header\">{{i18n\n                      \"discourse_ai.llms.quotas.group\"\n                    }}</th>\n                  <th class=\"ai-llm-quotas__header\">{{i18n\n                      \"discourse_ai.llms.quotas.max_tokens\"\n                    }}</th>\n                  <th class=\"ai-llm-quotas__header\">{{i18n\n                      \"discourse_ai.llms.quotas.max_usages\"\n                    }}</th>\n                  <th class=\"ai-llm-quotas__header\">{{i18n\n                      \"discourse_ai.llms.quotas.duration\"\n                    }}</th>\n                  <th\n                    class=\"ai-llm-quotas__header ai-llm-quotas__header--actions\"\n                  ></th>\n                  <th></th>\n                </tr>\n              </thead>\n              <tbody class=\"ai-llm-quotas__table-body\">\n                <form.Collection\n                  @name=\"llm_quotas\"\n                  @tagName=\"tr\"\n                  class=\"ai-llm-quotas__row\"\n                  as |collection index collectionData|\n                >\n                  <td\n                    class=\"ai-llm-quotas__cell\"\n                  >{{collectionData.group_name}}</td>\n                  <td class=\"ai-llm-quotas__cell\">\n                    <collection.Field\n                      @name=\"max_tokens\"\n                      @title=\"max_tokens\"\n                      @showTitle={{false}}\n                      as |field|\n                    >\n                      <field.Input\n                        @type=\"number\"\n                        class=\"ai-llm-quotas__input\"\n                        min=\"1\"\n                      />\n                    </collection.Field>\n                  </td>\n                  <td class=\"ai-llm-quotas__cell\">\n                    <collection.Field\n                      @name=\"max_usages\"\n                      @title=\"max_usages\"\n                      @showTitle={{false}}\n                      as |field|\n                    >\n                      <field.Input\n                        @type=\"number\"\n                        class=\"ai-llm-quotas__input\"\n                        min=\"1\"\n                      />\n                    </collection.Field>\n                  </td>\n                  <td class=\"ai-llm-quotas__cell\">\n                    <collection.Field\n                      @name=\"duration_seconds\"\n                      @title=\"duration_seconds\"\n                      @showTitle={{false}}\n                      as |field|\n                    >\n                      <field.Custom>\n                        <DurationSelector\n                          @value={{collectionData.duration_seconds}}\n                          @onChange={{field.set}}\n                        />\n                      </field.Custom>\n                    </collection.Field>\n                  </td>\n                  <td>\n                    <form.Button\n                      @icon=\"trash-can\"\n                      @action={{fn collection.remove index}}\n                      class=\"btn-danger ai-llm-quotas__delete-btn\"\n                    />\n                  </td>\n                </form.Collection>\n              </tbody>\n            </table>\n          </form.Container>\n      \n          <form.Button\n            @action={{fn\n              this.openAddQuotaModal\n              (fn form.addItemToCollection \"llm_quotas\")\n            }}\n            @icon=\"plus\"\n            @label=\"discourse_ai.llms.quotas.add\"\n            class=\"ai-llm-editor__add-quota-btn\"\n          />\n        {{/if}}\n      \n        <form.Actions>\n          <form.Button\n            @action={{fn this.test data}}\n            @disabled={{this.testRunning}}\n            @label=\"discourse_ai.llms.tests.title\"\n          />\n      \n          <form.Submit />\n      \n          {{#if (eq data.llm_quotas.length 0)}}\n            <form.Button\n              @action={{fn\n                this.openAddQuotaModal\n                (fn form.addItemToCollection \"llm_quotas\")\n              }}\n              @label=\"discourse_ai.llms.quotas.add\"\n              class=\"ai-llm-editor__add-quota-btn\"\n            />\n          {{/if}}\n      \n          {{#unless @model.isNew}}\n            {{#unless @model.seeded}}\n              <form.Button\n                @action={{this.delete}}\n                @label=\"discourse_ai.llms.delete\"\n                class=\"btn-danger\"\n              />\n            {{/unless}}\n          {{/unless}}\n        </form.Actions>\n      \n        {{#if this.displayTestResult}}\n          <form.Container @format=\"full\">\n            <ConditionalLoadingSpinner\n              @size=\"small\"\n              @condition={{this.testRunning}}\n            >\n              {{#if this.testResult}}\n                <div class=\"ai-llm-editor-tests__success\">\n                  {{icon \"check\"}}\n                  {{i18n \"discourse_ai.llms.tests.success\"}}\n                </div>\n              {{else}}\n                <div class=\"ai-llm-editor-tests__failure\">\n                  {{icon \"xmark\"}}\n                  {{this.testErrorMessage}}\n                  <ul>\n                    {{#each this.testValidationErrors as |error|}}\n                      <li>{{error}}</li>\n                    {{/each}}\n                  </ul>\n                </div>\n              {{/if}}\n            </ConditionalLoadingSpinner>\n          </form.Container>\n        {{/if}}\n      </Form>\n      */\n      {\n        \"id\": \"t1am1lfu\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"ai-llm-editor\\\"]],[[\\\"@onSubmit\\\",\\\"@data\\\"],[[30,0,[\\\"save\\\"]],[30,0,[\\\"formData\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"modulesUsingModel\\\"]],[[[1,\\\"    \\\"],[8,[30,1,[\\\"Alert\\\"]],null,[[\\\"@icon\\\"],[\\\"circle-info\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[1,[30,0,[\\\"inUseWarning\\\"]]],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\",\\\"@tooltip\\\",\\\"@disabled\\\"],[\\\"display_name\\\",[28,[32,1],[\\\"discourse_ai.llms.display_name\\\"],null],\\\"required|length:1,100\\\",\\\"large\\\",[28,[32,1],[\\\"discourse_ai.llms.hints.display_name\\\"],null],[30,3,[\\\"seeded\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,4,[\\\"Input\\\"]],null,null,null],[1,\\\"\\\\n  \\\"]],[4]]]]],[1,\\\"\\\\n\\\\n  \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@validation\\\",\\\"@format\\\",\\\"@disabled\\\"],[\\\"name\\\",[28,[32,1],[\\\"discourse_ai.llms.name\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.name\\\"],null],\\\"required\\\",\\\"large\\\",[30,3,[\\\"seeded\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,5,[\\\"Input\\\"]],null,null,null],[1,\\\"\\\\n  \\\"]],[5]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[30,3,[\\\"seeded\\\"]]],[[[1,\\\"    \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\",\\\"@validation\\\",\\\"@onSet\\\"],[\\\"provider\\\",[28,[32,1],[\\\"discourse_ai.llms.provider\\\"],null],\\\"large\\\",\\\"required\\\",[30,0,[\\\"setProvider\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,6,[\\\"Select\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,3],[[28,[31,3],[[30,0,[\\\"selectedProviders\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[8,[30,7,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,8,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,[30,8,[\\\"name\\\"]]]],[]]]]],[1,\\\"\\\\n\\\"]],[8]],null],[1,\\\"      \\\"]],[7]]]]],[1,\\\"\\\\n    \\\"]],[6]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[30,0,[\\\"canEditURL\\\"]],[[30,2,[\\\"provider\\\"]]],null],[[[1,\\\"      \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"url\\\",[28,[32,1],[\\\"discourse_ai.llms.url\\\"],null],\\\"required\\\",\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,9,[\\\"Input\\\"]],null,null,null],[1,\\\"\\\\n      \\\"]],[9]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\"],[\\\"api_key\\\",[28,[32,1],[\\\"discourse_ai.llms.api_key\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,10,[\\\"Password\\\"]],[[24,\\\"autocomplete\\\",\\\"off\\\"],[24,\\\"data-1p-ignore\\\",\\\"\\\"]],null,null],[1,\\\"\\\\n    \\\"]],[10]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,1,[\\\"Object\\\"]],null,[[\\\"@name\\\"],[\\\"provider_params\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,3],[[28,[31,3],[[28,[30,0,[\\\"providerParamsKeys\\\"]],[[30,12]],null]],null]],null],null,[[[44,[[28,[32,2],[[28,[30,0,[\\\"metaProviderParams\\\"]],[[30,2,[\\\"provider\\\"]]],null],[30,13]],null]],[[[1,\\\"          \\\"],[8,[30,11,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\"],[[30,13],[28,[32,1],[[28,[32,3],[\\\"discourse_ai.llms.provider_fields.\\\",[30,13]],null]],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[28,[32,4],[[30,14,[\\\"type\\\"]],\\\"enum\\\"],null],[[[1,\\\"              \\\"],[8,[30,15,[\\\"Select\\\"]],null,[[\\\"@includeNone\\\"],[false]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,3],[[28,[31,3],[[30,14,[\\\"values\\\"]]],null]],null],null,[[[1,\\\"                  \\\"],[8,[30,16,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,17,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,[30,17,[\\\"name\\\"]]]],[]]]]],[1,\\\"\\\\n\\\"]],[17]],null],[1,\\\"              \\\"]],[16]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,4],[[30,14,[\\\"type\\\"]],\\\"checkbox\\\"],null],[[[1,\\\"              \\\"],[8,[30,15,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"              \\\"],[8,[30,15,[\\\"Input\\\"]],null,[[\\\"@type\\\"],[[30,14,[\\\"type\\\"]]]],null],[1,\\\"\\\\n            \\\"]],[]]]],[]]],[1,\\\"          \\\"]],[15]]]]],[1,\\\"\\\\n\\\"]],[14]]]],[13]],null],[1,\\\"    \\\"]],[11,12]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\",\\\"@validation\\\"],[\\\"tokenizer\\\",[28,[32,1],[\\\"discourse_ai.llms.tokenizer\\\"],null],\\\"large\\\",\\\"required\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,18,[\\\"Select\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,3],[[28,[31,3],[[30,0,[\\\"tokenizers\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[8,[30,19,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,20,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,[30,20,[\\\"name\\\"]]]],[]]]]],[1,\\\"\\\\n\\\"]],[20]],null],[1,\\\"      \\\"]],[19]]]]],[1,\\\"\\\\n    \\\"]],[18]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"max_prompt_tokens\\\",[28,[32,1],[\\\"discourse_ai.llms.max_prompt_tokens\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.max_prompt_tokens\\\"],null],\\\"required\\\",\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,21,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"min\\\",\\\"0\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n    \\\"]],[21]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,1,[\\\"InputGroup\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,22,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@helpText\\\"],[\\\"input_cost\\\",[28,[32,1],[\\\"discourse_ai.llms.cost_input\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.cost_input\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.cost_measure\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,23,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"min\\\",\\\"0\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n      \\\"]],[23]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,22,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@helpText\\\"],[\\\"cached_input_cost\\\",[28,[32,1],[\\\"discourse_ai.llms.cost_cached_input\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.cost_cached_input\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.cost_measure\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,24,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"min\\\",\\\"0\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n      \\\"]],[24]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,22,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@helpText\\\"],[\\\"cache_write_cost\\\",[28,[32,1],[\\\"discourse_ai.llms.cost_cache_write\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.cost_cache_write\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.cost_measure\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,25,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"min\\\",\\\"0\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n      \\\"]],[25]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,22,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@helpText\\\"],[\\\"output_cost\\\",[28,[32,1],[\\\"discourse_ai.llms.cost_output\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.cost_output\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.cost_measure\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,26,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"min\\\",\\\"0\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n      \\\"]],[26]]]]],[1,\\\"\\\\n    \\\"]],[22]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"max_output_tokens\\\",[28,[32,1],[\\\"discourse_ai.llms.max_output_tokens\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.max_output_tokens\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,27,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"min\\\",\\\"0\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n    \\\"]],[27]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"vision_enabled\\\",[28,[32,1],[\\\"discourse_ai.llms.vision_enabled\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.vision_enabled\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,28,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[28]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"allowed_attachment_types\\\",[28,[32,1],[\\\"discourse_ai.llms.allowed_attachment_types\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.hints.allowed_attachment_types\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,29,[\\\"Label\\\"]],null,null,null],[1,\\\"\\\\n      \\\"],[8,[30,29,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[32,5],null,[[\\\"@value\\\",\\\"@onChange\\\"],[[30,29,[\\\"value\\\"]],[30,29,[\\\"set\\\"]]]],null],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n      \\\"],[8,[30,29,[\\\"Hint\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[29]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,3,[\\\"user\\\"]],[[[1,\\\"      \\\"],[8,[30,1,[\\\"Container\\\"]],null,[[\\\"@title\\\"],[[28,[32,1],[\\\"discourse_ai.llms.ai_bot_user\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[10,3],[14,0,\\\"avatar\\\"],[15,6,[30,3,[\\\"user\\\",\\\"path\\\"]]],[15,\\\"data-user-card\\\",[30,3,[\\\"user\\\",\\\"username\\\"]]],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,6],[[30,3,[\\\"user\\\",\\\"avatar_template\\\"]],\\\"small\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[8,[32,7],null,[[\\\"@route\\\",\\\"@model\\\"],[\\\"adminUser\\\",[30,0,[\\\"adminUser\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[1,[30,3,[\\\"user\\\",\\\"username\\\"]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[32,8],[[30,2,[\\\"llm_quotas\\\",\\\"length\\\"]],0],null],[[[1,\\\"    \\\"],[8,[30,1,[\\\"Container\\\"]],null,[[\\\"@title\\\"],[[28,[32,1],[\\\"discourse_ai.llms.quotas.title\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[10,\\\"table\\\"],[14,0,\\\"ai-llm-quotas__table\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"thead\\\"],[14,0,\\\"ai-llm-quotas__table-head\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-llm-quotas__header-row\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"th\\\"],[14,0,\\\"ai-llm-quotas__header\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.llms.quotas.group\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"th\\\"],[14,0,\\\"ai-llm-quotas__header\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.llms.quotas.max_tokens\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"th\\\"],[14,0,\\\"ai-llm-quotas__header\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.llms.quotas.max_usages\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"th\\\"],[14,0,\\\"ai-llm-quotas__header\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.llms.quotas.duration\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"th\\\"],[14,0,\\\"ai-llm-quotas__header ai-llm-quotas__header--actions\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,\\\"th\\\"],[12],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,\\\"tbody\\\"],[14,0,\\\"ai-llm-quotas__table-body\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[30,1,[\\\"Collection\\\"]],[[24,0,\\\"ai-llm-quotas__row\\\"]],[[\\\"@name\\\",\\\"@tagName\\\"],[\\\"llm_quotas\\\",\\\"tr\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-llm-quotas__cell\\\"],[12],[1,[30,32,[\\\"group_name\\\"]]],[13],[1,\\\"\\\\n            \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-llm-quotas__cell\\\"],[12],[1,\\\"\\\\n              \\\"],[8,[30,30,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@showTitle\\\"],[\\\"max_tokens\\\",\\\"max_tokens\\\",false]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                \\\"],[8,[30,33,[\\\"Input\\\"]],[[24,0,\\\"ai-llm-quotas__input\\\"],[24,\\\"min\\\",\\\"1\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n              \\\"]],[33]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-llm-quotas__cell\\\"],[12],[1,\\\"\\\\n              \\\"],[8,[30,30,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@showTitle\\\"],[\\\"max_usages\\\",\\\"max_usages\\\",false]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                \\\"],[8,[30,34,[\\\"Input\\\"]],[[24,0,\\\"ai-llm-quotas__input\\\"],[24,\\\"min\\\",\\\"1\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n              \\\"]],[34]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-llm-quotas__cell\\\"],[12],[1,\\\"\\\\n              \\\"],[8,[30,30,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@showTitle\\\"],[\\\"duration_seconds\\\",\\\"duration_seconds\\\",false]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                \\\"],[8,[30,35,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n                  \\\"],[8,[32,9],null,[[\\\"@value\\\",\\\"@onChange\\\"],[[30,32,[\\\"duration_seconds\\\"]],[30,35,[\\\"set\\\"]]]],null],[1,\\\"\\\\n                \\\"]],[]]]]],[1,\\\"\\\\n              \\\"]],[35]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n              \\\"],[8,[30,1,[\\\"Button\\\"]],[[24,0,\\\"btn-danger ai-llm-quotas__delete-btn\\\"]],[[\\\"@icon\\\",\\\"@action\\\"],[\\\"trash-can\\\",[28,[32,10],[[30,30,[\\\"remove\\\"]],[30,31]],null]]],null],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"]],[30,31,32]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,1,[\\\"Button\\\"]],[[24,0,\\\"ai-llm-editor__add-quota-btn\\\"]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@label\\\"],[[28,[32,10],[[30,0,[\\\"openAddQuotaModal\\\"]],[28,[32,10],[[30,1,[\\\"addItemToCollection\\\"]],\\\"llm_quotas\\\"],null]],null],\\\"plus\\\",\\\"discourse_ai.llms.quotas.add\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"Actions\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,1,[\\\"Button\\\"]],null,[[\\\"@action\\\",\\\"@disabled\\\",\\\"@label\\\"],[[28,[32,10],[[30,0,[\\\"test\\\"]],[30,2]],null],[30,0,[\\\"testRunning\\\"]],\\\"discourse_ai.llms.tests.title\\\"]],null],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,1,[\\\"Submit\\\"]],null,null,null],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[32,4],[[30,2,[\\\"llm_quotas\\\",\\\"length\\\"]],0],null],[[[1,\\\"      \\\"],[8,[30,1,[\\\"Button\\\"]],[[24,0,\\\"ai-llm-editor__add-quota-btn\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[28,[32,10],[[30,0,[\\\"openAddQuotaModal\\\"]],[28,[32,10],[[30,1,[\\\"addItemToCollection\\\"]],\\\"llm_quotas\\\"],null]],null],\\\"discourse_ai.llms.quotas.add\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[51,[30,3,[\\\"isNew\\\"]]],[[[41,[51,[30,3,[\\\"seeded\\\"]]],[[[1,\\\"        \\\"],[8,[30,1,[\\\"Button\\\"]],[[24,0,\\\"btn-danger\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"delete\\\"]],\\\"discourse_ai.llms.delete\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null]],[]],null],[1,\\\"  \\\"]],[]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"displayTestResult\\\"]],[[[1,\\\"    \\\"],[8,[30,1,[\\\"Container\\\"]],null,[[\\\"@format\\\"],[\\\"full\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[32,11],null,[[\\\"@size\\\",\\\"@condition\\\"],[\\\"small\\\",[30,0,[\\\"testRunning\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"testResult\\\"]],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"ai-llm-editor-tests__success\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[32,12],[\\\"check\\\"],null]],[1,\\\"\\\\n            \\\"],[1,[28,[32,1],[\\\"discourse_ai.llms.tests.success\\\"],null]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"ai-llm-editor-tests__failure\\\"],[12],[1,\\\"\\\\n            \\\"],[1,[28,[32,12],[\\\"xmark\\\"],null]],[1,\\\"\\\\n            \\\"],[1,[30,0,[\\\"testErrorMessage\\\"]]],[1,\\\"\\\\n            \\\"],[10,\\\"ul\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,3],[[28,[31,3],[[30,0,[\\\"testValidationErrors\\\"]]],null]],null],null,[[[1,\\\"                \\\"],[10,\\\"li\\\"],[12],[1,[30,36]],[13],[1,\\\"\\\\n\\\"]],[36]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"      \\\"]],[]]]]],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[1,2]]]]]],[\\\"form\\\",\\\"data\\\",\\\"@model\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"select\\\",\\\"provider\\\",\\\"field\\\",\\\"field\\\",\\\"object\\\",\\\"providerParamsData\\\",\\\"name\\\",\\\"params\\\",\\\"field\\\",\\\"select\\\",\\\"option\\\",\\\"field\\\",\\\"select\\\",\\\"tokenizer\\\",\\\"field\\\",\\\"inputGroup\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"collection\\\",\\\"index\\\",\\\"collectionData\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"error\\\"],[\\\"if\\\",\\\"unless\\\",\\\"each\\\",\\\"-track-array\\\",\\\"let\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-llm-editor-form.js\",\n        \"scope\": () => [_form.default, _discourseI18n.i18n, _helper.get, _helper.concat, _truthHelpers.eq, _aiLlmAttachmentTypes.default, _boundAvatarTemplate.default, _routing.LinkTo, _truthHelpers.gt, _aiQuotaDurationSelector.default, _helper.fn, _conditionalLoadingSpinner.default, _dIcon.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiLlmEditorForm;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-llm-editor\", [\"exports\", \"discourse/components/back-button\", \"discourse/plugins/discourse-ai/discourse/components/ai-llm-editor-form\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _backButton, _aiLlmEditorForm, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const AiLlmEditor = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <BackButton\n    @route=\"adminPlugins.show.discourse-ai-llms\"\n    @label=\"discourse_ai.llms.back\"\n  />\n  <AiLlmEditorForm\n    @model={{@model}}\n    @llmTemplate={{@llmTemplate}}\n    @llms={{@llms}}\n  />\n  */\n  {\n    \"id\": \"GEyJ0/I5\",\n    \"block\": \"[[[8,[32,0],null,[[\\\"@route\\\",\\\"@label\\\"],[\\\"adminPlugins.show.discourse-ai-llms\\\",\\\"discourse_ai.llms.back\\\"]],null],[1,\\\"\\\\n\\\"],[8,[32,1],null,[[\\\"@model\\\",\\\"@llmTemplate\\\",\\\"@llms\\\"],[[30,1],[30,2],[30,3]]],null]],[\\\"@model\\\",\\\"@llmTemplate\\\",\\\"@llms\\\"],[]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-llm-editor.js\",\n    \"scope\": () => [_backButton.default, _aiLlmEditorForm.default],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"ai-llm-editor:AiLlmEditor\"));\n  var _default = _exports.default = AiLlmEditor;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-llm-selector\", [\"exports\", \"@ember/helper\", \"discourse/select-kit/components/combo-box\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _helper, _comboBox, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const AiLlmSelector = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <ComboBox\n    @value={{@value}}\n    @content={{@llms}}\n    @onChange={{@onChange}}\n    @options={{hash\n      filterable=true\n      none=\"discourse_ai.ai_persona.no_llm_selected\"\n    }}\n    class={{@class}}\n  />\n  */\n  {\n    \"id\": \"GkXkr1ri\",\n    \"block\": \"[[[8,[32,0],[[16,0,[30,1]]],[[\\\"@value\\\",\\\"@content\\\",\\\"@onChange\\\",\\\"@options\\\"],[[30,2],[30,3],[30,4],[28,[32,1],null,[[\\\"filterable\\\",\\\"none\\\"],[true,\\\"discourse_ai.ai_persona.no_llm_selected\\\"]]]]],null]],[\\\"@class\\\",\\\"@value\\\",\\\"@llms\\\",\\\"@onChange\\\"],[]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-llm-selector.js\",\n    \"scope\": () => [_comboBox.default, _helper.hash],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"ai-llm-selector:AiLlmSelector\"));\n  var _default = _exports.default = AiLlmSelector;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-llms-list-editor\", [\"exports\", \"@glimmer/component\", \"@ember/helper\", \"@ember/object\", \"@ember/service\", \"@ember/template\", \"discourse/admin/components/admin-section-landing-item\", \"discourse/admin/components/admin-section-landing-wrapper\", \"discourse/components/d-breadcrumbs-item\", \"discourse/components/d-button\", \"discourse/components/d-page-subheader\", \"discourse/helpers/d-icon\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-credit-bar\", \"discourse/plugins/discourse-ai/discourse/components/ai-default-llm-selector\", \"discourse/plugins/discourse-ai/discourse/components/ai-llm-editor\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _helper, _object, _service, _template, _adminSectionLandingItem, _adminSectionLandingWrapper, _dBreadcrumbsItem, _dButton, _dPageSubheader, _dIcon, _discourseI18n, _aiCreditBar, _aiDefaultLlmSelector, _aiLlmEditor, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function isPreseeded(llm) {\n    if (llm.id < 0) {\n      return true;\n    }\n  }\n  class AiLlmsListEditor extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"adminPluginNavManager\", [_service.service]);\n    }\n    #adminPluginNavManager = (dt7948.i(this, \"adminPluginNavManager\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    formatResetDate(dateString) {\n      const resetDate = new Date(dateString);\n      const options = {\n        month: \"long\",\n        day: \"numeric\",\n        hour: \"numeric\",\n        minute: \"2-digit\",\n        timeZone: \"UTC\"\n      };\n      return resetDate.toLocaleString(undefined, options);\n    }\n    modelDescription(llm) {\n      // this is a bit of an odd object, it can be an llm model or a preset model\n      // handle both flavors\n      // in the case of model\n      let key = \"\";\n      if (typeof llm.id === \"number\") {\n        key = `${llm.provider}-${llm.name}`;\n      } else {\n        // case of preset\n        key = llm.id.replace(/[.:\\/]/g, \"-\");\n      }\n      key = `discourse_ai.llms.model_description.${key}`;\n      if (_discourseI18n.default.lookup(key, {\n        ignoreMissing: true\n      })) {\n        return (0, _discourseI18n.i18n)(key);\n      }\n      return \"\";\n    }\n    static {\n      dt7948.n(this.prototype, \"modelDescription\", [_object.action]);\n    }\n    preseededDescription(llm) {\n      if (isPreseeded(llm)) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.llms.preseeded_model_description\", {\n          model: llm.name\n        });\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"preseededDescription\", [_object.action]);\n    }\n    sanitizedTranslationKey(id) {\n      return id.replace(/\\./g, \"-\");\n    }\n    get hasLlmElements() {\n      return this.args.llms.content.length !== 0;\n    }\n    get preconfiguredTitle() {\n      if (this.hasLlmElements) {\n        return \"discourse_ai.llms.preconfigured.title\";\n      } else {\n        return \"discourse_ai.llms.preconfigured.title_no_llms\";\n      }\n    }\n    get preConfiguredLlms() {\n      const options = [{\n        id: \"none\",\n        name: (0, _discourseI18n.i18n)(\"discourse_ai.llms.preconfigured.fake\"),\n        provider: \"fake\"\n      }];\n      const llmsContent = this.args.llms.content.map(llm => ({\n        provider: llm.provider,\n        name: llm.name\n      }));\n      this.args.llms.resultSetMeta.presets.forEach(llm => {\n        if (llm.models) {\n          llm.models.forEach(model => {\n            const id = `${llm.id}-${model.name}`;\n            const isConfigured = llmsContent.some(content => content.provider === llm.provider && content.name === model.name);\n            if (!isConfigured) {\n              options.push({\n                id,\n                name: model.display_name,\n                provider: llm.provider\n              });\n            }\n          });\n        }\n      });\n      return options;\n    }\n    transitionToLlmEditor(llmTemplate) {\n      this.router.transitionTo(\"adminPlugins.show.discourse-ai-llms.new\", {\n        queryParams: {\n          llmTemplate\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"transitionToLlmEditor\", [_object.action]);\n    }\n    localizeUsage(usage) {\n      return (0, _discourseI18n.i18n)(`discourse_ai.llms.usage.${usage.type}`, {\n        persona: usage.name\n      });\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DBreadcrumbsItem\n        @path=\"/admin/plugins/{{this.adminPluginNavManager.currentPlugin.name}}/ai-llms\"\n        @label={{i18n \"discourse_ai.llms.short_title\"}}\n      />\n      <section class=\"ai-llm-list-editor admin-detail\">\n        {{#if @currentLlm}}\n          <AiLlmEditor\n            @model={{@currentLlm}}\n            @llms={{@llms}}\n            @llmTemplate={{@llmTemplate}}\n          />\n        {{else}}\n          <DPageSubheader\n            @titleLabel={{i18n \"discourse_ai.llms.short_title\"}}\n            @descriptionLabel={{i18n\n              \"discourse_ai.llms.preconfigured.description\"\n            }}\n            @learnMoreUrl=\"https://meta.discourse.org/t/discourse-ai-large-language-model-llm-settings-page/319903\"\n          />\n      \n          <AiDefaultLlmSelector />\n      \n          {{#if this.hasLlmElements}}\n            <section class=\"ai-llms-list-editor__configured\">\n              <DPageSubheader\n                @titleLabel={{i18n \"discourse_ai.llms.configured.title\"}}\n              />\n              <table class=\"d-admin-table\">\n                <thead>\n                  <tr>\n                    <th>{{i18n \"discourse_ai.llms.display_name\"}}</th>\n                    <th>{{i18n \"discourse_ai.llms.provider\"}}</th>\n                    <th></th>\n                  </tr>\n                </thead>\n                <tbody>\n                  {{#each @llms.content as |llm|}}\n                    <tr\n                      data-llm-id={{llm.name}}\n                      class=\"ai-llm-list__row d-admin-row__content\"\n                    >\n                      <td class=\"d-admin-row__overview\">\n      \n                        <div class=\"ai-llm-list__name\">\n                          <strong>\n                            {{llm.display_name}}\n                          </strong>\n                        </div>\n                        <div class=\"ai-llm-list__description\">\n                          {{this.modelDescription llm}}\n                          {{this.preseededDescription llm}}\n                        </div>\n                        {{#if llm.used_by}}\n                          <ul class=\"ai-llm-list-editor__usages\">\n                            {{#each llm.used_by as |usage|}}\n                              <li>{{this.localizeUsage usage}}</li>\n                            {{/each}}\n                          </ul>\n                        {{/if}}\n                        {{#if llm.llm_credit_allocation}}\n                          <div class=\"ai-llm-list__credit-allocation\">\n                            <AiCreditBar\n                              @allocation={{llm.llm_credit_allocation}}\n                            />\n                            {{#if llm.llm_credit_allocation.hard_limit_reached}}\n                              <div class=\"alert alert-danger ai-credit-warning\">\n                                {{icon \"circle-info\"}}\n                                {{htmlSafe\n                                  (i18n\n                                    \"discourse_ai.llms.credit_allocation.hard_limit_warning\"\n                                    reset_date=(this.formatResetDate\n                                      llm.llm_credit_allocation.next_reset_at\n                                    )\n                                  )\n                                }}\n                              </div>\n                            {{else if\n                              llm.llm_credit_allocation.soft_limit_reached\n                            }}\n                              <div class=\"alert alert-warning ai-credit-warning\">\n                                {{icon \"circle-info\"}}\n                                {{htmlSafe\n                                  (i18n\n                                    \"discourse_ai.llms.credit_allocation.soft_limit_warning\"\n                                    percentage=llm.llm_credit_allocation.percentage_remaining\n                                  )\n                                }}\n                              </div>\n                            {{/if}}\n                          </div>\n                        {{/if}}\n                      </td>\n                      <td class=\"d-admin-row__detail\">\n                        <div class=\"d-admin-row__mobile-label\">\n                          {{i18n \"discourse_ai.llms.provider\"}}\n                        </div>\n                        {{i18n\n                          (concat \"discourse_ai.llms.providers.\" llm.provider)\n                        }}\n                      </td>\n                      <td class=\"d-admin-row__controls\">\n                        <DButton\n                          class=\"btn btn-default btn-small ai-llm-list__edit-button\"\n                          @label=\"discourse_ai.llms.edit\"\n                          @route=\"adminPlugins.show.discourse-ai-llms.edit\"\n                          @routeModels={{llm.id}}\n                        />\n                      </td>\n                    </tr>\n                  {{/each}}\n                </tbody>\n              </table>\n            </section>\n          {{/if}}\n          <section class=\"ai-llms-list-editor__templates\">\n            <DPageSubheader @titleLabel={{i18n this.preconfiguredTitle}} />\n            <AdminSectionLandingWrapper\n              class=\"ai-llms-list-editor__templates-list\"\n            >\n              {{#each this.preConfiguredLlms as |llm|}}\n                <AdminSectionLandingItem\n                  @titleLabelTranslated={{llm.name}}\n                  @descriptionLabelTranslated={{this.modelDescription llm}}\n                  @taglineLabel={{concat\n                    \"discourse_ai.llms.providers.\"\n                    llm.provider\n                  }}\n                  data-llm-id={{llm.id}}\n                  class=\"ai-llms-list-editor__templates-list-item\"\n                >\n                  <:buttons as |buttons|>\n                    <buttons.Default\n                      @action={{fn this.transitionToLlmEditor llm.id}}\n                      @icon=\"gear\"\n                      @label=\"discourse_ai.llms.preconfigured.button\"\n                    />\n                  </:buttons>\n                </AdminSectionLandingItem>\n              {{/each}}\n            </AdminSectionLandingWrapper>\n          </section>\n        {{/if}}\n      </section>\n      */\n      {\n        \"id\": \"3wT7ejoa\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@path\\\",\\\"@label\\\"],[[29,[\\\"/admin/plugins/\\\",[30,0,[\\\"adminPluginNavManager\\\",\\\"currentPlugin\\\",\\\"name\\\"]],\\\"/ai-llms\\\"]],[28,[32,1],[\\\"discourse_ai.llms.short_title\\\"],null]]],null],[1,\\\"\\\\n\\\"],[10,\\\"section\\\"],[14,0,\\\"ai-llm-list-editor admin-detail\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1],[[[1,\\\"    \\\"],[8,[32,2],null,[[\\\"@model\\\",\\\"@llms\\\",\\\"@llmTemplate\\\"],[[30,1],[30,2],[30,3]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[8,[32,3],null,[[\\\"@titleLabel\\\",\\\"@descriptionLabel\\\",\\\"@learnMoreUrl\\\"],[[28,[32,1],[\\\"discourse_ai.llms.short_title\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.preconfigured.description\\\"],null],\\\"https://meta.discourse.org/t/discourse-ai-large-language-model-llm-settings-page/319903\\\"]],null],[1,\\\"\\\\n\\\\n    \\\"],[8,[32,4],null,null,null],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"hasLlmElements\\\"]],[[[1,\\\"      \\\"],[10,\\\"section\\\"],[14,0,\\\"ai-llms-list-editor__configured\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[32,3],null,[[\\\"@titleLabel\\\"],[[28,[32,1],[\\\"discourse_ai.llms.configured.title\\\"],null]]],null],[1,\\\"\\\\n        \\\"],[10,\\\"table\\\"],[14,0,\\\"d-admin-table\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.llms.display_name\\\"],null]],[13],[1,\\\"\\\\n              \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.llms.provider\\\"],null]],[13],[1,\\\"\\\\n              \\\"],[10,\\\"th\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,2,[\\\"content\\\"]]],null]],null],null,[[[1,\\\"              \\\"],[10,\\\"tr\\\"],[15,\\\"data-llm-id\\\",[30,4,[\\\"name\\\"]]],[14,0,\\\"ai-llm-list__row d-admin-row__content\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__overview\\\"],[12],[1,\\\"\\\\n\\\\n                  \\\"],[10,0],[14,0,\\\"ai-llm-list__name\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"strong\\\"],[12],[1,\\\"\\\\n                      \\\"],[1,[30,4,[\\\"display_name\\\"]]],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                  \\\"],[10,0],[14,0,\\\"ai-llm-list__description\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[30,0,[\\\"modelDescription\\\"]],[[30,4]],null]],[1,\\\"\\\\n                    \\\"],[1,[28,[30,0,[\\\"preseededDescription\\\"]],[[30,4]],null]],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,4,[\\\"used_by\\\"]],[[[1,\\\"                    \\\"],[10,\\\"ul\\\"],[14,0,\\\"ai-llm-list-editor__usages\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,4,[\\\"used_by\\\"]]],null]],null],null,[[[1,\\\"                        \\\"],[10,\\\"li\\\"],[12],[1,[28,[30,0,[\\\"localizeUsage\\\"]],[[30,5]],null]],[13],[1,\\\"\\\\n\\\"]],[5]],null],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[30,4,[\\\"llm_credit_allocation\\\"]],[[[1,\\\"                    \\\"],[10,0],[14,0,\\\"ai-llm-list__credit-allocation\\\"],[12],[1,\\\"\\\\n                      \\\"],[8,[32,5],null,[[\\\"@allocation\\\"],[[30,4,[\\\"llm_credit_allocation\\\"]]]],null],[1,\\\"\\\\n\\\"],[41,[30,4,[\\\"llm_credit_allocation\\\",\\\"hard_limit_reached\\\"]],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"alert alert-danger ai-credit-warning\\\"],[12],[1,\\\"\\\\n                          \\\"],[1,[28,[32,6],[\\\"circle-info\\\"],null]],[1,\\\"\\\\n                          \\\"],[1,[28,[32,7],[[28,[32,1],[\\\"discourse_ai.llms.credit_allocation.hard_limit_warning\\\"],[[\\\"reset_date\\\"],[[28,[30,0,[\\\"formatResetDate\\\"]],[[30,4,[\\\"llm_credit_allocation\\\",\\\"next_reset_at\\\"]]],null]]]]],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,4,[\\\"llm_credit_allocation\\\",\\\"soft_limit_reached\\\"]],[[[1,\\\"                        \\\"],[10,0],[14,0,\\\"alert alert-warning ai-credit-warning\\\"],[12],[1,\\\"\\\\n                          \\\"],[1,[28,[32,6],[\\\"circle-info\\\"],null]],[1,\\\"\\\\n                          \\\"],[1,[28,[32,7],[[28,[32,1],[\\\"discourse_ai.llms.credit_allocation.soft_limit_warning\\\"],[[\\\"percentage\\\"],[[30,4,[\\\"llm_credit_allocation\\\",\\\"percentage_remaining\\\"]]]]]],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                      \\\"]],[]],null]],[]]],[1,\\\"                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__detail\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,0],[14,0,\\\"d-admin-row__mobile-label\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[28,[32,1],[\\\"discourse_ai.llms.provider\\\"],null]],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                  \\\"],[1,[28,[32,1],[[28,[32,8],[\\\"discourse_ai.llms.providers.\\\",[30,4,[\\\"provider\\\"]]],null]],null]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__controls\\\"],[12],[1,\\\"\\\\n                  \\\"],[8,[32,9],[[24,0,\\\"btn btn-default btn-small ai-llm-list__edit-button\\\"]],[[\\\"@label\\\",\\\"@route\\\",\\\"@routeModels\\\"],[\\\"discourse_ai.llms.edit\\\",\\\"adminPlugins.show.discourse-ai-llms.edit\\\",[30,4,[\\\"id\\\"]]]],null],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[10,\\\"section\\\"],[14,0,\\\"ai-llms-list-editor__templates\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,3],null,[[\\\"@titleLabel\\\"],[[28,[32,1],[[30,0,[\\\"preconfiguredTitle\\\"]]],null]]],null],[1,\\\"\\\\n      \\\"],[8,[32,10],[[24,0,\\\"ai-llms-list-editor__templates-list\\\"]],null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"preConfiguredLlms\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[8,[32,11],[[16,\\\"data-llm-id\\\",[30,6,[\\\"id\\\"]]],[24,0,\\\"ai-llms-list-editor__templates-list-item\\\"]],[[\\\"@titleLabelTranslated\\\",\\\"@descriptionLabelTranslated\\\",\\\"@taglineLabel\\\"],[[30,6,[\\\"name\\\"]],[28,[30,0,[\\\"modelDescription\\\"]],[[30,6]],null],[28,[32,8],[\\\"discourse_ai.llms.providers.\\\",[30,6,[\\\"provider\\\"]]],null]]],[[\\\"buttons\\\"],[[[[1,\\\"\\\\n              \\\"],[8,[30,7,[\\\"Default\\\"]],null,[[\\\"@action\\\",\\\"@icon\\\",\\\"@label\\\"],[[28,[32,12],[[30,0,[\\\"transitionToLlmEditor\\\"]],[30,6,[\\\"id\\\"]]],null],\\\"gear\\\",\\\"discourse_ai.llms.preconfigured.button\\\"]],null],[1,\\\"\\\\n            \\\"]],[7]]]]],[1,\\\"\\\\n\\\"]],[6]],null],[1,\\\"      \\\"]],[]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[13]],[\\\"@currentLlm\\\",\\\"@llms\\\",\\\"@llmTemplate\\\",\\\"llm\\\",\\\"usage\\\",\\\"llm\\\",\\\"buttons\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-llms-list-editor.js\",\n        \"scope\": () => [_dBreadcrumbsItem.default, _discourseI18n.i18n, _aiLlmEditor.default, _dPageSubheader.default, _aiDefaultLlmSelector.default, _aiCreditBar.default, _dIcon.default, _template.htmlSafe, _helper.concat, _dButton.default, _adminSectionLandingWrapper.default, _adminSectionLandingItem.default, _helper.fn],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiLlmsListEditor;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-persona-editor\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/routing\", \"@ember/runloop\", \"@ember/service\", \"discourse/admin/models/admin-user\", \"discourse/components/back-button\", \"discourse/components/form\", \"discourse/helpers/bound-avatar-template\", \"discourse/lib/ajax-error\", \"discourse/lib/array-tools\", \"discourse/lib/constants\", \"discourse/lib/get-url\", \"discourse/models/group\", \"discourse/select-kit/components/group-chooser\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/modal/ai-persona-response-format-editor\", \"discourse/plugins/discourse-ai/discourse/lib/utilities\", \"discourse/plugins/discourse-ai/discourse/components/ai-llm-selector\", \"discourse/plugins/discourse-ai/discourse/components/ai-persona-example\", \"discourse/plugins/discourse-ai/discourse/components/ai-persona-tool-options\", \"discourse/plugins/discourse-ai/discourse/components/ai-tool-selector\", \"discourse/plugins/discourse-ai/discourse/components/rag-options-fk\", \"discourse/plugins/discourse-ai/discourse/components/rag-uploader\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _didInsert, _routing, _runloop, _service, _adminUser, _backButton, _form, _boundAvatarTemplate, _ajaxError, _arrayTools, _constants, _getUrl, _group, _groupChooser, _truthHelpers, _discourseI18n, _aiPersonaResponseFormatEditor, _utilities, _aiLlmSelector, _aiPersonaExample, _aiPersonaToolOptions, _aiToolSelector, _ragOptionsFk, _ragUploader, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class PersonaEditor extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"dialog\", [_service.service]);\n    }\n    #dialog = (dt7948.i(this, \"dialog\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"toasts\", [_service.service]);\n    }\n    #toasts = (dt7948.i(this, \"toasts\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"allGroups\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #allGroups = (dt7948.i(this, \"allGroups\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isSaving\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isSaving = (dt7948.i(this, \"isSaving\"), void 0);\n    dirtyFormData = null;\n    get formData() {\n      // This is to recover a dirty state after persisting a single form field.\n      // It's meant to be consumed only once.\n      if (this.dirtyFormData) {\n        const data = this.dirtyFormData;\n        this.dirtyFormData = null;\n        return data;\n      } else {\n        const data = this.args.model.toPOJO();\n        if (data.tools) {\n          data.toolOptions = this.mapToolOptions(data.toolOptions, data.tools);\n        }\n        return data;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"formData\", [_tracking.cached]);\n    }\n    get chatPluginEnabled() {\n      return this.siteSettings.chat_enabled;\n    }\n    get allTools() {\n      return this.args.personas.resultSetMeta.tools;\n    }\n    get maxPixelValues() {\n      const l = key => (0, _discourseI18n.i18n)(`discourse_ai.ai_persona.vision_max_pixel_sizes.${key}`);\n      return [{\n        name: l(\"low\"),\n        id: 65536\n      }, {\n        name: l(\"medium\"),\n        id: 262144\n      }, {\n        name: l(\"high\"),\n        id: 1048576\n      }];\n    }\n    get forcedToolStrategies() {\n      const content = [{\n        id: -1,\n        name: (0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.tool_strategies.all\")\n      }];\n      [1, 2, 5].forEach(i => {\n        content.push({\n          id: i,\n          name: (0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.tool_strategies.replies\", {\n            count: i\n          })\n        });\n      });\n      return content;\n    }\n    async updateAllGroups() {\n      const groups = await _group.default.findAll({\n        include_everyone: true\n      });\n      // Backwards-compatibility code. TODO(roman): Remove 01-09-2025\n      const hasEveryoneGroup = groups.find(g => g.id === _constants.AUTO_GROUPS.everyone.id);\n      if (!hasEveryoneGroup) {\n        groups.push({\n          id: _constants.AUTO_GROUPS.everyone.id,\n          name: _constants.AUTO_GROUPS.everyone.name\n        });\n      }\n      this.allGroups = groups;\n    }\n    static {\n      dt7948.n(this.prototype, \"updateAllGroups\", [_object.action]);\n    }\n    async save(data) {\n      const isNew = this.args.model.isNew;\n      this.isSaving = true;\n      try {\n        const personaToSave = Object.assign(this.args.model, this.args.model.fromPOJO(data));\n        await personaToSave.save();\n        this.#sortPersonas();\n        if (isNew && this.args.model.rag_uploads.length === 0) {\n          (0, _arrayTools.addUniqueValueToArray)(this.args.personas.content, personaToSave);\n          await this.router.replaceWith(\"adminPlugins.show.discourse-ai-personas.edit\", personaToSave);\n        }\n        this.toasts.success({\n          data: {\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.saved\")\n          },\n          duration: \"short\"\n        });\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        (0, _runloop.later)(() => {\n          this.isSaving = false;\n        }, 1000);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"save\", [_object.action]);\n    }\n    get adminUser() {\n      // Work around user not being extensible.\n      const userClone = Object.assign({}, this.args.model?.user);\n      return _adminUser.default.create(userClone);\n    }\n    delete() {\n      return this.dialog.confirm({\n        message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.confirm_delete\"),\n        didConfirm: () => {\n          return this.args.model.destroyRecord().then(() => {\n            (0, _arrayTools.removeValueFromArray)(this.args.personas.content, this.args.model);\n            this.router.transitionTo(\"adminPlugins.show.discourse-ai-personas.index\");\n          });\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"delete\", [_object.action]);\n    }\n    async toggleEnabled(dirtyData, value, {\n      set\n    }) {\n      set(\"enabled\", value);\n      await this.persistField(dirtyData, \"enabled\", value);\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleEnabled\", [_object.action]);\n    }\n    async togglePriority(dirtyData, value, {\n      set\n    }) {\n      set(\"priority\", value);\n      await this.persistField(dirtyData, \"priority\", value, true);\n    }\n    static {\n      dt7948.n(this.prototype, \"togglePriority\", [_object.action]);\n    }\n    async createUser(form) {\n      try {\n        let user = await this.args.model.createUser();\n        form.set(\"user\", user);\n        form.set(\"user_id\", user.id);\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"createUser\", [_object.action]);\n    }\n    updateUploads(form, newUploads) {\n      // FormKit uses Immer proxies which cause issues when passed to upload handlers.\n      // Convert to plain objects to ensure compatibility.\n      const plainUploads = (0, _utilities.toPlainObject)(newUploads);\n      form.set(\"rag_uploads\", plainUploads);\n    }\n    static {\n      dt7948.n(this.prototype, \"updateUploads\", [_object.action]);\n    }\n    async removeUpload(form, dirtyData, currentUploads, upload) {\n      const updatedUploads = currentUploads.filter(file => file.id !== upload.id);\n      form.set(\"rag_uploads\", updatedUploads);\n      if (!this.args.model.isNew) {\n        await this.persistField(dirtyData, \"rag_uploads\", updatedUploads);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"removeUpload\", [_object.action]);\n    }\n    updateToolNames(form, currentData, updatedTools) {\n      const removedTools = currentData?.tools?.filter(ct => !updatedTools.includes(ct)) || [];\n      const updatedOptions = this.mapToolOptions(currentData.toolOptions, updatedTools);\n      form.setProperties({\n        tools: updatedTools,\n        toolOptions: updatedOptions\n      });\n      if (currentData.forcedTools?.length > 0) {\n        const updatedForcedTools = currentData.forcedTools.filter(fct => !removedTools.includes(fct));\n        form.set(\"forcedTools\", updatedForcedTools);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"updateToolNames\", [_object.action]);\n    }\n    availableForcedTools(tools) {\n      return this.allTools.filter(tool => tools.includes(tool.id));\n    }\n    static {\n      dt7948.n(this.prototype, \"availableForcedTools\", [_object.action]);\n    }\n    addExamplesPair(form, data) {\n      const newExamples = [...data.examples, [\"\", \"\"]];\n      form.set(\"examples\", newExamples);\n    }\n    static {\n      dt7948.n(this.prototype, \"addExamplesPair\", [_object.action]);\n    }\n    mapToolOptions(currentOptions, toolNames) {\n      const updatedOptions = Object.assign({}, currentOptions);\n      toolNames.forEach(toolId => {\n        const tool = this.allTools.find(item => item.id === toolId);\n        const toolOptions = tool?.options;\n        if (!toolOptions || updatedOptions[toolId]) {\n          return;\n        }\n        const mappedOptions = {};\n        Object.keys(toolOptions).forEach(key => {\n          mappedOptions[key] = null;\n        });\n        updatedOptions[toolId] = mappedOptions;\n      });\n      return updatedOptions;\n    }\n    async persistField(dirtyData, field, newValue, sortPersonas) {\n      if (!this.args.model.isNew) {\n        const updatedDirtyData = Object.assign({}, dirtyData);\n        updatedDirtyData[field] = newValue;\n        try {\n          const args = {};\n          args[field] = newValue;\n          this.dirtyFormData = updatedDirtyData;\n          await this.args.model.update(args);\n          if (sortPersonas) {\n            this.#sortPersonas();\n          }\n        } catch (e) {\n          (0, _ajaxError.popupAjaxError)(e);\n        }\n      }\n    }\n    #sortPersonas() {\n      // .sort is done in place and personas.content is a tracked array.\n      this.args.personas.content.sort((a, b) => {\n        if (a.priority && !b.priority) {\n          return -1;\n        } else if (!a.priority && b.priority) {\n          return 1;\n        } else {\n          return a.name.localeCompare(b.name);\n        }\n      });\n    }\n    exportPersona() {\n      const exportUrl = `/admin/plugins/discourse-ai/ai-personas/${this.args.model.id}/export.json`;\n      window.location.href = (0, _getUrl.default)(exportUrl);\n    }\n    static {\n      dt7948.n(this.prototype, \"exportPersona\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <BackButton\n        @route=\"adminPlugins.show.discourse-ai-personas\"\n        @label=\"discourse_ai.ai_persona.back\"\n      />\n      <div class=\"ai-persona-editor\" {{didInsert this.updateAllGroups @model.id}}>\n        <Form @onSubmit={{this.save}} @data={{this.formData}} as |form data|>\n          <form.Field\n            @name=\"name\"\n            @title={{i18n \"discourse_ai.ai_persona.name\"}}\n            @validation=\"required|length:1,100\"\n            @disabled={{data.system}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Input />\n          </form.Field>\n      \n          <form.Field\n            @name=\"description\"\n            @title={{i18n \"discourse_ai.ai_persona.description\"}}\n            @validation=\"required|length:1,100\"\n            @disabled={{data.system}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Textarea />\n          </form.Field>\n      \n          <form.Field\n            @name=\"system_prompt\"\n            @title={{i18n \"discourse_ai.ai_persona.system_prompt\"}}\n            @validation=\"required|length:1,100000\"\n            @disabled={{data.system}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Textarea />\n          </form.Field>\n      \n          <AiPersonaResponseFormatEditor @form={{form}} @data={{data}} />\n      \n          <form.Field\n            @name=\"default_llm_id\"\n            @title={{i18n \"discourse_ai.ai_persona.default_llm\"}}\n            @tooltip={{i18n \"discourse_ai.ai_persona.default_llm_help\"}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Custom>\n              <AiLlmSelector\n                @value={{field.value}}\n                @llms={{@personas.resultSetMeta.llms}}\n                @onChange={{field.set}}\n                @class=\"ai-persona-editor__llms\"\n              />\n            </field.Custom>\n          </form.Field>\n      \n          <form.Field\n            @name=\"allowed_group_ids\"\n            @title={{i18n \"discourse_ai.ai_persona.allowed_groups\"}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Custom>\n              <GroupChooser\n                @value={{data.allowed_group_ids}}\n                @content={{this.allGroups}}\n                @onChange={{field.set}}\n              />\n            </field.Custom>\n          </form.Field>\n      \n          <form.Field\n            @name=\"vision_enabled\"\n            @title={{i18n \"discourse_ai.ai_persona.vision_enabled\"}}\n            @tooltip={{i18n \"discourse_ai.ai_persona.vision_enabled_help\"}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Checkbox />\n          </form.Field>\n      \n          {{#if data.vision_enabled}}\n            <form.Field\n              @name=\"vision_max_pixels\"\n              @title={{i18n \"discourse_ai.ai_persona.vision_max_pixels\"}}\n              @onSet={{this.onChangeMaxPixels}}\n              @format=\"large\"\n              as |field|\n            >\n              <field.Select @includeNone={{false}} as |select|>\n                {{#each this.maxPixelValues as |pixelValue|}}\n                  <select.Option\n                    @value={{pixelValue.id}}\n                  >{{pixelValue.name}}</select.Option>\n                {{/each}}\n              </field.Select>\n            </form.Field>\n          {{/if}}\n      \n          <form.Field\n            @name=\"max_context_posts\"\n            @title={{i18n \"discourse_ai.ai_persona.max_context_posts\"}}\n            @tooltip={{i18n \"discourse_ai.ai_persona.max_context_posts_help\"}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Input @type=\"number\" lang=\"en\" />\n          </form.Field>\n      \n          {{#unless data.system}}\n            <form.Field\n              @name=\"temperature\"\n              @title={{i18n \"discourse_ai.ai_persona.temperature\"}}\n              @tooltip={{i18n \"discourse_ai.ai_persona.temperature_help\"}}\n              @disabled={{data.system}}\n              @format=\"large\"\n              as |field|\n            >\n              <field.Input @type=\"number\" step=\"any\" lang=\"en\" />\n            </form.Field>\n      \n            <form.Field\n              @name=\"top_p\"\n              @title={{i18n \"discourse_ai.ai_persona.top_p\"}}\n              @tooltip={{i18n \"discourse_ai.ai_persona.top_p_help\"}}\n              @disabled={{data.system}}\n              @format=\"large\"\n              as |field|\n            >\n              <field.Input @type=\"number\" step=\"any\" lang=\"en\" />\n            </form.Field>\n          {{/unless}}\n      \n          <form.Section\n            @title={{i18n \"discourse_ai.ai_persona.examples.title\"}}\n            @subtitle={{i18n \"discourse_ai.ai_persona.examples.examples_help\"}}\n          >\n            {{#unless data.system}}\n              <form.Container>\n                <form.Button\n                  @action={{fn this.addExamplesPair form data}}\n                  @label=\"discourse_ai.ai_persona.examples.new\"\n                  class=\"ai-persona-editor__new_example\"\n                />\n              </form.Container>\n            {{/unless}}\n      \n            {{#if (gt data.examples.length 0)}}\n              <form.Collection @name=\"examples\" as |exCollection exCollectionIdx|>\n                <AiPersonaCollapsableExample\n                  @examplesCollection={{exCollection}}\n                  @exampleNumber={{exCollectionIdx}}\n                  @system={{data.system}}\n                  @form={{form}}\n                />\n              </form.Collection>\n            {{/if}}\n          </form.Section>\n      \n          <form.Section @title={{i18n \"discourse_ai.ai_persona.ai_tools\"}}>\n            <form.Field\n              @name=\"tools\"\n              @title={{i18n \"discourse_ai.ai_persona.tools\"}}\n              @format=\"large\"\n              as |field|\n            >\n              <field.Custom>\n                <AiToolSelector\n                  @value={{field.value}}\n                  @disabled={{data.system}}\n                  @onChange={{fn this.updateToolNames form data}}\n                  @content={{@personas.resultSetMeta.tools}}\n                />\n              </field.Custom>\n            </form.Field>\n      \n            {{#if (gt data.tools.length 0)}}\n              <form.Field\n                @name=\"forcedTools\"\n                @title={{i18n \"discourse_ai.ai_persona.forced_tools\"}}\n                @format=\"large\"\n                as |field|\n              >\n                <field.Custom>\n                  <AiToolSelector\n                    @value={{field.value}}\n                    @disabled={{data.system}}\n                    @onChange={{field.set}}\n                    @content={{this.availableForcedTools data.tools}}\n                  />\n                </field.Custom>\n              </form.Field>\n            {{/if}}\n      \n            {{#if (gt data.forcedTools.length 0)}}\n              <form.Field\n                @name=\"forced_tool_count\"\n                @title={{i18n \"discourse_ai.ai_persona.forced_tool_strategy\"}}\n                @format=\"large\"\n                as |field|\n              >\n                <field.Select @includeNone={{false}} as |select|>\n                  {{#each this.forcedToolStrategies as |fts|}}\n                    <select.Option @value={{fts.id}}>{{fts.name}}</select.Option>\n                  {{/each}}\n                </field.Select>\n              </form.Field>\n            {{/if}}\n      \n            {{#if (gt data.tools.length 0)}}\n              <AiPersonaToolOptions\n                @form={{form}}\n                @data={{data}}\n                @llms={{@personas.resultSetMeta.llms}}\n                @allTools={{@personas.resultSetMeta.tools}}\n              />\n            {{/if}}\n      \n            <form.Field\n              @name=\"show_thinking\"\n              @title={{i18n \"discourse_ai.ai_persona.show_thinking\"}}\n              @tooltip={{i18n \"discourse_ai.ai_persona.show_thinking_help\"}}\n              @format=\"large\"\n              as |field|\n            >\n              <field.Checkbox />\n            </form.Field>\n          </form.Section>\n      \n          {{#if this.siteSettings.ai_embeddings_enabled}}\n            <form.Section @title={{i18n \"discourse_ai.rag.title\"}}>\n              <form.Field\n                @name=\"rag_uploads\"\n                @title={{i18n \"discourse_ai.rag.uploads.title\"}}\n                @format=\"full\"\n                as |field|\n              >\n                <field.Custom>\n                  <RagUploader\n                    @target={{data}}\n                    @targetName=\"AiPersona\"\n                    @updateUploads={{fn this.updateUploads form}}\n                    @onRemove={{fn this.removeUpload form data field.value}}\n                    @allowImages={{@personas.resultSetMeta.settings.rag_images_enabled}}\n                  />\n                </field.Custom>\n              </form.Field>\n      \n              <RagOptionsFk\n                @form={{form}}\n                @data={{data}}\n                @llms={{@personas.resultSetMeta.llms}}\n                @allowImages={{@personas.resultSetMeta.settings.rag_images_enabled}}\n              >\n                <form.Field\n                  @name=\"rag_conversation_chunks\"\n                  @title={{i18n\n                    \"discourse_ai.ai_persona.rag_conversation_chunks\"\n                  }}\n                  @tooltip={{i18n\n                    \"discourse_ai.ai_persona.rag_conversation_chunks_help\"\n                  }}\n                  @format=\"large\"\n                  as |field|\n                >\n                  <field.Input @type=\"number\" step=\"any\" lang=\"en\" />\n                </form.Field>\n      \n                <form.Field\n                  @name=\"question_consolidator_llm_id\"\n                  @title={{i18n\n                    \"discourse_ai.ai_persona.question_consolidator_llm\"\n                  }}\n                  @tooltip={{i18n\n                    \"discourse_ai.ai_persona.question_consolidator_llm_help\"\n                  }}\n                  @format=\"large\"\n                  as |field|\n                >\n                  <field.Custom>\n                    <AiLlmSelector\n                      @value={{field.value}}\n                      @llms={{@personas.resultSetMeta.llms}}\n                      @onChange={{field.set}}\n                      @class=\"ai-persona-editor__llms\"\n                    />\n                  </field.Custom>\n                </form.Field>\n              </RagOptionsFk>\n            </form.Section>\n          {{/if}}\n      \n          <form.Section @title={{i18n \"discourse_ai.ai_persona.ai_bot.title\"}}>\n            <form.Field\n              @name=\"enabled\"\n              @title={{i18n \"discourse_ai.ai_persona.enabled\"}}\n              @onSet={{fn this.toggleEnabled data}}\n              as |field|\n            >\n              <field.Toggle />\n            </form.Field>\n      \n            <form.Field\n              @name=\"priority\"\n              @title={{i18n \"discourse_ai.ai_persona.priority\"}}\n              @onSet={{fn this.togglePriority data}}\n              @tooltip={{i18n \"discourse_ai.ai_persona.priority_help\"}}\n              as |field|\n            >\n              <field.Toggle />\n            </form.Field>\n      \n            {{#if @model.isNew}}\n              <div>{{i18n \"discourse_ai.ai_persona.ai_bot.save_first\"}}</div>\n            {{else}}\n              {{#if data.default_llm_id}}\n                <form.Field\n                  @name=\"force_default_llm\"\n                  @title={{i18n \"discourse_ai.ai_persona.force_default_llm\"}}\n                  @format=\"large\"\n                  as |field|\n                >\n                  <field.Checkbox />\n                </form.Field>\n              {{/if}}\n      \n              <form.Container\n                @title={{i18n \"discourse_ai.ai_persona.user\"}}\n                @tooltip={{unless\n                  data.user\n                  (i18n \"discourse_ai.ai_persona.create_user_help\")\n                }}\n                class=\"ai-persona-editor__ai_bot_user\"\n              >\n                {{#if data.user}}\n                  <a\n                    class=\"avatar\"\n                    href={{data.user.path}}\n                    data-user-card={{data.user.username}}\n                  >\n                    {{Avatar data.user.avatar_template \"small\"}}\n                  </a>\n                  <LinkTo @route=\"adminUser\" @model={{this.adminUser}}>\n                    {{data.user.username}}\n                  </LinkTo>\n                {{else}}\n                  <form.Button\n                    @action={{fn this.createUser form}}\n                    @label=\"discourse_ai.ai_persona.create_user\"\n                    class=\"ai-persona-editor__create-user\"\n                  />\n                {{/if}}\n              </form.Container>\n      \n              {{#if data.user}}\n                <form.Field\n                  @name=\"allow_personal_messages\"\n                  @title={{i18n\n                    \"discourse_ai.ai_persona.allow_personal_messages\"\n                  }}\n                  @tooltip={{i18n\n                    \"discourse_ai.ai_persona.allow_personal_messages_help\"\n                  }}\n                  @format=\"large\"\n                  as |field|\n                >\n                  <field.Checkbox />\n                </form.Field>\n      \n                <form.Field\n                  @name=\"allow_topic_mentions\"\n                  @title={{i18n \"discourse_ai.ai_persona.allow_topic_mentions\"}}\n                  @tooltip={{i18n\n                    \"discourse_ai.ai_persona.allow_topic_mentions_help\"\n                  }}\n                  @format=\"large\"\n                  as |field|\n                >\n                  <field.Checkbox />\n                </form.Field>\n      \n                {{#if this.chatPluginEnabled}}\n                  <form.Field\n                    @name=\"allow_chat_direct_messages\"\n                    @title={{i18n\n                      \"discourse_ai.ai_persona.allow_chat_direct_messages\"\n                    }}\n                    @tooltip={{i18n\n                      \"discourse_ai.ai_persona.allow_chat_direct_messages_help\"\n                    }}\n                    @format=\"large\"\n                    as |field|\n                  >\n                    <field.Checkbox />\n                  </form.Field>\n      \n                  <form.Field\n                    @name=\"allow_chat_channel_mentions\"\n                    @title={{i18n\n                      \"discourse_ai.ai_persona.allow_chat_channel_mentions\"\n                    }}\n                    @tooltip={{i18n\n                      \"discourse_ai.ai_persona.allow_chat_channel_mentions_help\"\n                    }}\n                    @format=\"large\"\n                    as |field|\n                  >\n                    <field.Checkbox />\n                  </form.Field>\n                {{/if}}\n              {{/if}}\n            {{/if}}\n          </form.Section>\n      \n          <form.Actions>\n            <form.Submit />\n      \n            {{#unless (or @model.isNew @model.system)}}\n              <form.Button\n                @label=\"discourse_ai.ai_persona.export\"\n                @action={{this.exportPersona}}\n                class=\"ai-persona-editor__export\"\n              />\n              <form.Button\n                @action={{this.delete}}\n                @label=\"discourse_ai.ai_persona.delete\"\n                class=\"btn-danger\"\n              />\n            {{/unless}}\n          </form.Actions>\n        </Form>\n      </div>\n      */\n      {\n        \"id\": \"3yeUcVfL\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@route\\\",\\\"@label\\\"],[\\\"adminPlugins.show.discourse-ai-personas\\\",\\\"discourse_ai.ai_persona.back\\\"]],null],[1,\\\"\\\\n\\\"],[11,0],[24,0,\\\"ai-persona-editor\\\"],[4,[32,1],[[30,0,[\\\"updateAllGroups\\\"]],[30,1,[\\\"id\\\"]]],null],[12],[1,\\\"\\\\n  \\\"],[8,[32,2],null,[[\\\"@onSubmit\\\",\\\"@data\\\"],[[30,0,[\\\"save\\\"]],[30,0,[\\\"formData\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@disabled\\\",\\\"@format\\\"],[\\\"name\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.name\\\"],null],\\\"required|length:1,100\\\",[30,3,[\\\"system\\\"]],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,4,[\\\"Input\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[4]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@disabled\\\",\\\"@format\\\"],[\\\"description\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.description\\\"],null],\\\"required|length:1,100\\\",[30,3,[\\\"system\\\"]],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,5,[\\\"Textarea\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[5]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@disabled\\\",\\\"@format\\\"],[\\\"system_prompt\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.system_prompt\\\"],null],\\\"required|length:1,100000\\\",[30,3,[\\\"system\\\"]],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,6,[\\\"Textarea\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[6]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[32,4],null,[[\\\"@form\\\",\\\"@data\\\"],[[30,2],[30,3]]],null],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"default_llm_id\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.default_llm\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.default_llm_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,7,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[32,5],null,[[\\\"@value\\\",\\\"@llms\\\",\\\"@onChange\\\",\\\"@class\\\"],[[30,7,[\\\"value\\\"]],[30,8,[\\\"resultSetMeta\\\",\\\"llms\\\"]],[30,7,[\\\"set\\\"]],\\\"ai-persona-editor__llms\\\"]],null],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n    \\\"]],[7]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\"],[\\\"allowed_group_ids\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.allowed_groups\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,9,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[32,6],null,[[\\\"@value\\\",\\\"@content\\\",\\\"@onChange\\\"],[[30,3,[\\\"allowed_group_ids\\\"]],[30,0,[\\\"allGroups\\\"]],[30,9,[\\\"set\\\"]]]],null],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n    \\\"]],[9]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"vision_enabled\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.vision_enabled\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.vision_enabled_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,10,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[10]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,3,[\\\"vision_enabled\\\"]],[[[1,\\\"      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@onSet\\\",\\\"@format\\\"],[\\\"vision_max_pixels\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.vision_max_pixels\\\"],null],[30,0,[\\\"onChangeMaxPixels\\\"]],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,11,[\\\"Select\\\"]],null,[[\\\"@includeNone\\\"],[false]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"maxPixelValues\\\"]]],null]],null],null,[[[1,\\\"            \\\"],[8,[30,12,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,13,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,[30,13,[\\\"name\\\"]]]],[]]]]],[1,\\\"\\\\n\\\"]],[13]],null],[1,\\\"        \\\"]],[12]]]]],[1,\\\"\\\\n      \\\"]],[11]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"max_context_posts\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.max_context_posts\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.max_context_posts_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,14,[\\\"Input\\\"]],[[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n    \\\"]],[14]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[30,3,[\\\"system\\\"]]],[[[1,\\\"      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@disabled\\\",\\\"@format\\\"],[\\\"temperature\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.temperature\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.temperature_help\\\"],null],[30,3,[\\\"system\\\"]],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,15,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n      \\\"]],[15]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@disabled\\\",\\\"@format\\\"],[\\\"top_p\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.top_p\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.top_p_help\\\"],null],[30,3,[\\\"system\\\"]],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,16,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n      \\\"]],[16]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[8,[30,2,[\\\"Section\\\"]],null,[[\\\"@title\\\",\\\"@subtitle\\\"],[[28,[32,3],[\\\"discourse_ai.ai_persona.examples.title\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.examples.examples_help\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[51,[30,3,[\\\"system\\\"]]],[[[1,\\\"        \\\"],[8,[30,2,[\\\"Container\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,2,[\\\"Button\\\"]],[[24,0,\\\"ai-persona-editor__new_example\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[28,[32,7],[[30,0,[\\\"addExamplesPair\\\"]],[30,2],[30,3]],null],\\\"discourse_ai.ai_persona.examples.new\\\"]],null],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[32,8],[[30,3,[\\\"examples\\\",\\\"length\\\"]],0],null],[[[1,\\\"        \\\"],[8,[30,2,[\\\"Collection\\\"]],null,[[\\\"@name\\\"],[\\\"examples\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[32,9],null,[[\\\"@examplesCollection\\\",\\\"@exampleNumber\\\",\\\"@system\\\",\\\"@form\\\"],[[30,17],[30,18],[30,3,[\\\"system\\\"]],[30,2]]],null],[1,\\\"\\\\n        \\\"]],[17,18]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"]],[]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,2,[\\\"Section\\\"]],null,[[\\\"@title\\\"],[[28,[32,3],[\\\"discourse_ai.ai_persona.ai_tools\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\"],[\\\"tools\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.tools\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,19,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[32,10],null,[[\\\"@value\\\",\\\"@disabled\\\",\\\"@onChange\\\",\\\"@content\\\"],[[30,19,[\\\"value\\\"]],[30,3,[\\\"system\\\"]],[28,[32,7],[[30,0,[\\\"updateToolNames\\\"]],[30,2],[30,3]],null],[30,8,[\\\"resultSetMeta\\\",\\\"tools\\\"]]]],null],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n      \\\"]],[19]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[32,8],[[30,3,[\\\"tools\\\",\\\"length\\\"]],0],null],[[[1,\\\"        \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\"],[\\\"forcedTools\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.forced_tools\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,20,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[32,10],null,[[\\\"@value\\\",\\\"@disabled\\\",\\\"@onChange\\\",\\\"@content\\\"],[[30,20,[\\\"value\\\"]],[30,3,[\\\"system\\\"]],[30,20,[\\\"set\\\"]],[28,[30,0,[\\\"availableForcedTools\\\"]],[[30,3,[\\\"tools\\\"]]],null]]],null],[1,\\\"\\\\n          \\\"]],[]]]]],[1,\\\"\\\\n        \\\"]],[20]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[32,8],[[30,3,[\\\"forcedTools\\\",\\\"length\\\"]],0],null],[[[1,\\\"        \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\"],[\\\"forced_tool_count\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.forced_tool_strategy\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,21,[\\\"Select\\\"]],null,[[\\\"@includeNone\\\"],[false]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"forcedToolStrategies\\\"]]],null]],null],null,[[[1,\\\"              \\\"],[8,[30,22,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,23,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,[30,23,[\\\"name\\\"]]]],[]]]]],[1,\\\"\\\\n\\\"]],[23]],null],[1,\\\"          \\\"]],[22]]]]],[1,\\\"\\\\n        \\\"]],[21]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[28,[32,8],[[30,3,[\\\"tools\\\",\\\"length\\\"]],0],null],[[[1,\\\"        \\\"],[8,[32,11],null,[[\\\"@form\\\",\\\"@data\\\",\\\"@llms\\\",\\\"@allTools\\\"],[[30,2],[30,3],[30,8,[\\\"resultSetMeta\\\",\\\"llms\\\"]],[30,8,[\\\"resultSetMeta\\\",\\\"tools\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"show_thinking\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.show_thinking\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.show_thinking_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,24,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n      \\\"]],[24]]]]],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"siteSettings\\\",\\\"ai_embeddings_enabled\\\"]],[[[1,\\\"      \\\"],[8,[30,2,[\\\"Section\\\"]],null,[[\\\"@title\\\"],[[28,[32,3],[\\\"discourse_ai.rag.title\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\"],[\\\"rag_uploads\\\",[28,[32,3],[\\\"discourse_ai.rag.uploads.title\\\"],null],\\\"full\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,25,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[32,12],null,[[\\\"@target\\\",\\\"@targetName\\\",\\\"@updateUploads\\\",\\\"@onRemove\\\",\\\"@allowImages\\\"],[[30,3],\\\"AiPersona\\\",[28,[32,7],[[30,0,[\\\"updateUploads\\\"]],[30,2]],null],[28,[32,7],[[30,0,[\\\"removeUpload\\\"]],[30,2],[30,3],[30,25,[\\\"value\\\"]]],null],[30,8,[\\\"resultSetMeta\\\",\\\"settings\\\",\\\"rag_images_enabled\\\"]]]],null],[1,\\\"\\\\n          \\\"]],[]]]]],[1,\\\"\\\\n        \\\"]],[25]]]]],[1,\\\"\\\\n\\\\n        \\\"],[8,[32,13],null,[[\\\"@form\\\",\\\"@data\\\",\\\"@llms\\\",\\\"@allowImages\\\"],[[30,2],[30,3],[30,8,[\\\"resultSetMeta\\\",\\\"llms\\\"]],[30,8,[\\\"resultSetMeta\\\",\\\"settings\\\",\\\"rag_images_enabled\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"rag_conversation_chunks\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.rag_conversation_chunks\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.rag_conversation_chunks_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,26,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n          \\\"]],[26]]]]],[1,\\\"\\\\n\\\\n          \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"question_consolidator_llm_id\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.question_consolidator_llm\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.question_consolidator_llm_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,27,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n              \\\"],[8,[32,5],null,[[\\\"@value\\\",\\\"@llms\\\",\\\"@onChange\\\",\\\"@class\\\"],[[30,27,[\\\"value\\\"]],[30,8,[\\\"resultSetMeta\\\",\\\"llms\\\"]],[30,27,[\\\"set\\\"]],\\\"ai-persona-editor__llms\\\"]],null],[1,\\\"\\\\n            \\\"]],[]]]]],[1,\\\"\\\\n          \\\"]],[27]]]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[8,[30,2,[\\\"Section\\\"]],null,[[\\\"@title\\\"],[[28,[32,3],[\\\"discourse_ai.ai_persona.ai_bot.title\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@onSet\\\"],[\\\"enabled\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.enabled\\\"],null],[28,[32,7],[[30,0,[\\\"toggleEnabled\\\"]],[30,3]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,28,[\\\"Toggle\\\"]],null,null,null],[1,\\\"\\\\n      \\\"]],[28]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@onSet\\\",\\\"@tooltip\\\"],[\\\"priority\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.priority\\\"],null],[28,[32,7],[[30,0,[\\\"togglePriority\\\"]],[30,3]],null],[28,[32,3],[\\\"discourse_ai.ai_persona.priority_help\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,29,[\\\"Toggle\\\"]],null,null,null],[1,\\\"\\\\n      \\\"]],[29]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,1,[\\\"isNew\\\"]],[[[1,\\\"        \\\"],[10,0],[12],[1,[28,[32,3],[\\\"discourse_ai.ai_persona.ai_bot.save_first\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,3,[\\\"default_llm_id\\\"]],[[[1,\\\"          \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@format\\\"],[\\\"force_default_llm\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.force_default_llm\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,30,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n          \\\"]],[30]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[8,[30,2,[\\\"Container\\\"]],[[24,0,\\\"ai-persona-editor__ai_bot_user\\\"]],[[\\\"@title\\\",\\\"@tooltip\\\"],[[28,[32,3],[\\\"discourse_ai.ai_persona.user\\\"],null],[52,[51,[30,3,[\\\"user\\\"]]],[28,[32,3],[\\\"discourse_ai.ai_persona.create_user_help\\\"],null]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,3,[\\\"user\\\"]],[[[1,\\\"            \\\"],[10,3],[14,0,\\\"avatar\\\"],[15,6,[30,3,[\\\"user\\\",\\\"path\\\"]]],[15,\\\"data-user-card\\\",[30,3,[\\\"user\\\",\\\"username\\\"]]],[12],[1,\\\"\\\\n              \\\"],[1,[28,[32,14],[[30,3,[\\\"user\\\",\\\"avatar_template\\\"]],\\\"small\\\"],null]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[8,[32,15],null,[[\\\"@route\\\",\\\"@model\\\"],[\\\"adminUser\\\",[30,0,[\\\"adminUser\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n              \\\"],[1,[30,3,[\\\"user\\\",\\\"username\\\"]]],[1,\\\"\\\\n            \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[8,[30,2,[\\\"Button\\\"]],[[24,0,\\\"ai-persona-editor__create-user\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[28,[32,7],[[30,0,[\\\"createUser\\\"]],[30,2]],null],\\\"discourse_ai.ai_persona.create_user\\\"]],null],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"        \\\"]],[]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,3,[\\\"user\\\"]],[[[1,\\\"          \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"allow_personal_messages\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.allow_personal_messages\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.allow_personal_messages_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,31,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n          \\\"]],[31]]]]],[1,\\\"\\\\n\\\\n          \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"allow_topic_mentions\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.allow_topic_mentions\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.allow_topic_mentions_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,32,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n          \\\"]],[32]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"chatPluginEnabled\\\"]],[[[1,\\\"            \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"allow_chat_direct_messages\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.allow_chat_direct_messages\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.allow_chat_direct_messages_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n              \\\"],[8,[30,33,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n            \\\"]],[33]]]]],[1,\\\"\\\\n\\\\n            \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"allow_chat_channel_mentions\\\",[28,[32,3],[\\\"discourse_ai.ai_persona.allow_chat_channel_mentions\\\"],null],[28,[32,3],[\\\"discourse_ai.ai_persona.allow_chat_channel_mentions_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n              \\\"],[8,[30,34,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n            \\\"]],[34]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]],null]],[]]],[1,\\\"    \\\"]],[]]]]],[1,\\\"\\\\n\\\\n    \\\"],[8,[30,2,[\\\"Actions\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,2,[\\\"Submit\\\"]],null,null,null],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[28,[32,16],[[30,1,[\\\"isNew\\\"]],[30,1,[\\\"system\\\"]]],null]],[[[1,\\\"        \\\"],[8,[30,2,[\\\"Button\\\"]],[[24,0,\\\"ai-persona-editor__export\\\"]],[[\\\"@label\\\",\\\"@action\\\"],[\\\"discourse_ai.ai_persona.export\\\",[30,0,[\\\"exportPersona\\\"]]]],null],[1,\\\"\\\\n        \\\"],[8,[30,2,[\\\"Button\\\"]],[[24,0,\\\"btn-danger\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"delete\\\"]],\\\"discourse_ai.ai_persona.delete\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"]],[]]]]],[1,\\\"\\\\n  \\\"]],[2,3]]]]],[1,\\\"\\\\n\\\"],[13]],[\\\"@model\\\",\\\"form\\\",\\\"data\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"@personas\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"select\\\",\\\"pixelValue\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"exCollection\\\",\\\"exCollectionIdx\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"select\\\",\\\"fts\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\",\\\"unless\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-persona-editor.js\",\n        \"scope\": () => [_backButton.default, _didInsert.default, _form.default, _discourseI18n.i18n, _aiPersonaResponseFormatEditor.default, _aiLlmSelector.default, _groupChooser.default, _helper.fn, _truthHelpers.gt, _aiPersonaExample.default, _aiToolSelector.default, _aiPersonaToolOptions.default, _ragUploader.default, _ragOptionsFk.default, _boundAvatarTemplate.default, _routing.LinkTo, _truthHelpers.or],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = PersonaEditor;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-persona-example\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"discourse/helpers/d-icon\", \"discourse/truth-helpers\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _dIcon, _truthHelpers, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiPersonaCollapsableExample extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"collapsed\", [_tracking.tracked], function () {\n        return true;\n      });\n    }\n    #collapsed = (dt7948.i(this, \"collapsed\"), void 0);\n    get caretIcon() {\n      return this.collapsed ? \"angle-right\" : \"angle-down\";\n    }\n    toggleExample() {\n      this.collapsed = !this.collapsed;\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleExample\", [_object.action]);\n    }\n    deletePair() {\n      this.collapsed = true;\n      this.args.examplesCollection.remove(this.args.exampleNumber);\n    }\n    static {\n      dt7948.n(this.prototype, \"deletePair\", [_object.action]);\n    }\n    get exampleTitle() {\n      return (0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.examples.collapsable_title\", {\n        number: this.args.exampleNumber + 1\n      });\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div role=\"button\" {{on \"click\" this.toggleExample}}>\n        <span>{{icon this.caretIcon}}</span>\n        {{this.exampleTitle}}\n      </div>\n      {{#unless this.collapsed}}\n        <@examplesCollection.Collection as |exPair pairIdx|>\n          <exPair.Field\n            @title={{i18n\n              (concat\n                \"discourse_ai.ai_persona.examples.\"\n                (if (eq pairIdx 0) \"user\" \"model\")\n              )\n            }}\n            @validation=\"required|length:1,5000\"\n            @disabled={{@system}}\n            as |field|\n          >\n            <field.Textarea />\n          </exPair.Field>\n        </@examplesCollection.Collection>\n      \n        {{#unless @system}}\n          <@form.Container>\n            <@form.Button\n              @action={{this.deletePair}}\n              @label=\"discourse_ai.ai_persona.examples.remove\"\n              class=\"ai-persona-editor__delete_example btn-danger\"\n            />\n          </@form.Container>\n        {{/unless}}\n      {{/unless}}\n      */\n      {\n        \"id\": \"A7lXMTiU\",\n        \"block\": \"[[[11,0],[24,\\\"role\\\",\\\"button\\\"],[4,[32,0],[\\\"click\\\",[30,0,[\\\"toggleExample\\\"]]],null],[12],[1,\\\"\\\\n  \\\"],[10,1],[12],[1,[28,[32,1],[[30,0,[\\\"caretIcon\\\"]]],null]],[13],[1,\\\"\\\\n  \\\"],[1,[30,0,[\\\"exampleTitle\\\"]]],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\"],[41,[51,[30,0,[\\\"collapsed\\\"]]],[[[1,\\\"  \\\"],[8,[30,1,[\\\"Collection\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@title\\\",\\\"@validation\\\",\\\"@disabled\\\"],[[28,[32,2],[[28,[32,3],[\\\"discourse_ai.ai_persona.examples.\\\",[52,[28,[32,4],[[30,3],0],null],\\\"user\\\",\\\"model\\\"]],null]],null],\\\"required|length:1,5000\\\",[30,4]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,5,[\\\"Textarea\\\"]],null,null,null],[1,\\\"\\\\n    \\\"]],[5]]]]],[1,\\\"\\\\n  \\\"]],[2,3]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[51,[30,4]],[[[1,\\\"    \\\"],[8,[30,6,[\\\"Container\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,6,[\\\"Button\\\"]],[[24,0,\\\"ai-persona-editor__delete_example btn-danger\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"deletePair\\\"]],\\\"discourse_ai.ai_persona.examples.remove\\\"]],null],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]],null]],[\\\"@examplesCollection\\\",\\\"exPair\\\",\\\"pairIdx\\\",\\\"@system\\\",\\\"field\\\",\\\"@form\\\"],[\\\"unless\\\",\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-persona-example.js\",\n        \"scope\": () => [_modifier.on, _dIcon.default, _discourseI18n.i18n, _helper.concat, _truthHelpers.eq],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiPersonaCollapsableExample;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-persona-list-editor\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/routing\", \"@ember/service\", \"discourse/admin/components/admin-config-area-empty-list\", \"discourse/admin/components/admin-filter-controls\", \"discourse/components/d-breadcrumbs-item\", \"discourse/components/d-button\", \"discourse/components/d-page-subheader\", \"discourse/components/dropdown-menu\", \"discourse/float-kit/components/d-menu\", \"discourse/helpers/avatar\", \"discourse/helpers/concat-class\", \"discourse/helpers/d-icon\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/array-tools\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/admin/models/ai-persona\", \"discourse/plugins/discourse-ai/discourse/components/ai-persona-editor\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _routing, _service, _adminConfigAreaEmptyList, _adminFilterControls, _dBreadcrumbsItem, _dButton, _dPageSubheader, _dropdownMenu, _dMenu, _avatar, _concatClass, _dIcon, _ajax, _ajaxError, _arrayTools, _truthHelpers, _discourseI18n, _aiPersona, _aiPersonaEditor, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const LAYOUT_BUTTONS = [{\n    id: \"table\",\n    label: \"discourse_ai.layout.table\",\n    icon: \"discourse-table\"\n  }, {\n    id: \"card\",\n    label: \"discourse_ai.layout.card\",\n    icon: \"table\"\n  }];\n  class AiPersonaListEditor extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"adminPluginNavManager\", [_service.service]);\n    }\n    #adminPluginNavManager = (dt7948.i(this, \"adminPluginNavManager\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"keyValueStore\", [_service.service]);\n    }\n    #keyValueStore = (dt7948.i(this, \"keyValueStore\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"capabilities\", [_service.service]);\n    }\n    #capabilities = (dt7948.i(this, \"capabilities\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"dialog\", [_service.service]);\n    }\n    #dialog = (dt7948.i(this, \"dialog\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentLayout\", [_tracking.tracked], function () {\n        return LAYOUT_BUTTONS[0];\n      });\n    }\n    #currentLayout = (dt7948.i(this, \"currentLayout\"), void 0);\n    constructor() {\n      super(...arguments);\n      const savedLayoutId = this.keyValueStore.get(\"ai-persona-list-layout\");\n      if (savedLayoutId) {\n        const found = LAYOUT_BUTTONS.find(b => b.id === savedLayoutId);\n        if (found) {\n          this.currentLayout = found;\n        }\n      }\n    }\n    get searchableProps() {\n      return [\"name\", \"description\"];\n    }\n    get dropdownOptions() {\n      let features = [];\n      (this.args.personas?.content || []).forEach(persona => {\n        (persona.features || []).forEach(feature => {\n          if (feature?.module_name && !features.includes(feature.module_name)) {\n            features.push(feature.module_name);\n          }\n        });\n      });\n      features.sort();\n      return [{\n        value: \"all\",\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.filters.all_features\"),\n        filterFn: () => true\n      }, ...features.map(name => ({\n        value: name,\n        label: (0, _discourseI18n.i18n)(`discourse_ai.features.${name}.name`),\n        filterFn: persona => (persona.features || []).some(feature => feature.module_name === name)\n      }))];\n    }\n    async toggleEnabled(persona) {\n      const oldValue = persona.enabled;\n      const newValue = !oldValue;\n      try {\n        persona.set(\"enabled\", newValue);\n        await persona.save();\n      } catch (err) {\n        persona.set(\"enabled\", oldValue);\n        (0, _ajaxError.popupAjaxError)(err);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleEnabled\", [_object.action]);\n    }\n    onRegisterApi(api) {\n      this.dMenu = api;\n    }\n    static {\n      dt7948.n(this.prototype, \"onRegisterApi\", [_object.action]);\n    }\n    onLayoutSelect(layoutId) {\n      const found = LAYOUT_BUTTONS.find(b => b.id === layoutId);\n      if (found) {\n        this.currentLayout = found;\n        this.keyValueStore.set({\n          key: \"ai-persona-list-layout\",\n          value: layoutId\n        });\n      }\n      this.dMenu.close();\n    }\n    static {\n      dt7948.n(this.prototype, \"onLayoutSelect\", [_object.action]);\n    }\n    importPersona() {\n      const fileInput = document.createElement(\"input\");\n      fileInput.type = \"file\";\n      fileInput.accept = \".json\";\n      fileInput.style.display = \"none\";\n      fileInput.onchange = event => this.handleFileSelect(event);\n      document.body.appendChild(fileInput);\n      fileInput.click();\n      document.body.removeChild(fileInput);\n    }\n    static {\n      dt7948.n(this.prototype, \"importPersona\", [_object.action]);\n    }\n    handleFileSelect(event) {\n      const file = event.target.files[0];\n      if (!file) {\n        return;\n      }\n      const reader = new FileReader();\n      reader.onload = e => {\n        try {\n          const json = JSON.parse(e.target.result);\n          this.uploadPersona(json);\n        } catch {\n          this.dialog.alert((0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.import_error_not_json\"));\n        }\n      };\n      reader.readAsText(file);\n    }\n    static {\n      dt7948.n(this.prototype, \"handleFileSelect\", [_object.action]);\n    }\n    uploadPersona(personaData, force = false) {\n      let url = `/admin/plugins/discourse-ai/ai-personas/import.json`;\n      const payload = personaData;\n      if (force) {\n        payload.force = true;\n      }\n      return (0, _ajax.ajax)(url, {\n        type: \"POST\",\n        data: JSON.stringify(payload),\n        contentType: \"application/json\"\n      }).then(result => {\n        let persona = _aiPersona.default.create(result);\n        let existingPersona = this.args.personas.content.find(item => item.id === persona.id);\n        if (existingPersona) {\n          (0, _arrayTools.removeValueFromArray)(this.args.personas.content, existingPersona);\n        }\n        this.args.personas.content.unshift(persona);\n      }).catch(error => {\n        if (error.jqXHR?.status === 422) {\n          this.dialog.confirm({\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.import_error_conflict\", {\n              name: personaData.persona.name\n            }) + \"\\n\" + error.jqXHR.responseJSON?.errors?.join(\"\\n\"),\n            confirmButtonLabel: \"discourse_ai.ai_persona.overwrite\",\n            didConfirm: () => this.uploadPersona(personaData, true)\n          });\n        } else {\n          (0, _ajaxError.popupAjaxError)(error);\n        }\n      });\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DBreadcrumbsItem\n        @path=\"/admin/plugins/{{this.adminPluginNavManager.currentPlugin.name}}/ai-personas\"\n        @label={{i18n \"discourse_ai.ai_persona.short_title\"}}\n      />\n      <section class=\"ai-persona-list-editor__current admin-detail\">\n        {{#if @currentPersona}}\n          <AiPersonaEditor @model={{@currentPersona}} @personas={{@personas}} />\n        {{else}}\n          <DPageSubheader\n            @titleLabel={{i18n \"discourse_ai.ai_persona.short_title\"}}\n            @descriptionLabel={{i18n\n              \"discourse_ai.ai_persona.persona_description\"\n            }}\n            @learnMoreUrl=\"https://meta.discourse.org/t/ai-bot-personas/306099\"\n          >\n            <:actions as |actions|>\n              <actions.Default\n                @label=\"discourse_ai.ai_persona.import\"\n                @action={{this.importPersona}}\n                @icon=\"upload\"\n                class=\"ai-persona-list-editor__import-button\"\n              />\n              <actions.Primary\n                @label=\"discourse_ai.ai_persona.new\"\n                @route=\"adminPlugins.show.discourse-ai-personas.new\"\n                @icon=\"plus\"\n                class=\"ai-persona-list-editor__new-button\"\n              />\n            </:actions>\n          </DPageSubheader>\n          {{#if @personas.content}}\n            <AdminFilterControls\n              @array={{@personas.content}}\n              @searchableProps={{this.searchableProps}}\n              @dropdownOptions={{this.dropdownOptions}}\n              @inputPlaceholder={{i18n \"discourse_ai.ai_persona.filters.text\"}}\n              @noResultsMessage={{i18n\n                \"discourse_ai.ai_persona.filters.no_results\"\n              }}\n            >\n              <:actions>\n                {{#if this.capabilities.viewport.md}}\n                  <DMenu\n                    @modalForMobile={{true}}\n                    @autofocus={{true}}\n                    @identifier=\"persona-list-layout\"\n                    @onRegisterApi={{this.onRegisterApi}}\n                    @triggerClass=\"btn-default btn-icon\"\n                  >\n                    <:trigger>\n                      {{icon this.currentLayout.icon}}\n                    </:trigger>\n                    <:content>\n                      <DropdownMenu as |dropdown|>\n                        {{#each LAYOUT_BUTTONS as |button|}}\n                          <dropdown.item>\n                            <DButton\n                              @label={{button.label}}\n                              @icon={{button.icon}}\n                              class=\"btn-transparent\"\n                              @action={{fn this.onLayoutSelect button.id}}\n                            />\n                          </dropdown.item>\n                        {{/each}}\n                      </DropdownMenu>\n                    </:content>\n                  </DMenu>\n                {{/if}}\n              </:actions>\n              <:content as |filteredPersonas|>\n                <table\n                  class={{concatClass\n                    \"content-list ai-persona-list-editor d-admin-table\"\n                    (concat \"--layout-\" this.currentLayout.id)\n                  }}\n                >\n                  <thead>\n                    <tr>\n                      <th>{{i18n \"discourse_ai.ai_persona.name\"}}</th>\n                      <th>{{i18n \"discourse_ai.llms.short_title\"}}</th>\n                      <th>{{i18n \"discourse_ai.features.short_title\"}}</th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    {{#each filteredPersonas as |persona|}}\n                      <tr\n                        data-persona-id={{persona.id}}\n                        class={{concatClass\n                          \"ai-persona-list__row d-admin-row__content\"\n                          (if persona.priority \"--priority\")\n                          (if persona.enabled \"--enabled\")\n                        }}\n                      >\n                        <td class=\"d-admin-row__overview\">\n                          <div class=\"ai-persona-list__name-with-description\">\n                            <h3 class=\"ai-persona-list__name\">\n                              {{#if persona.user}}\n                                {{avatar persona.user imageSize=\"tiny\"}}\n                              {{/if}}\n                              {{persona.name}}\n                            </h3>\n                            <div class=\"ai-persona-list__description\">\n                              {{persona.description}}\n                            </div>\n                          </div>\n                        </td>\n                        <td class=\"d-admin-row__llms\">\n                          {{#if persona.default_llm}}\n                            <span class=\"--card-label\">\n                              {{i18n \"discourse_ai.ai_persona.llms_list\"}}\n                            </span>\n                            <DButton\n                              class=\"btn-flat btn-small ai-persona-list__row-item-feature\"\n                              @translatedLabel={{persona.default_llm.display_name}}\n                              @route=\"adminPlugins.show.discourse-ai-llms.edit\"\n                              @routeModels={{persona.default_llm.id}}\n                            />\n                          {{/if}}\n                        </td>\n                        <td class=\"d-admin-row__features\">\n                          {{#if persona.features.length}}\n                            <span class=\"--card-label\">\n                              {{i18n\n                                \"discourse_ai.ai_persona.features_list\"\n                                count=persona.features.length\n                              }}\n                            </span>\n                            {{#each persona.features as |feature index|}}\n                              <span class=\"d-admin-row__row-feature-list\">\n                                {{#if (gt index 0)}}, {{/if}}\n                                <DButton\n                                  class=\"btn-flat btn-small ai-persona-list__row-item-feature\"\n                                  @translatedLabel={{i18n\n                                    (concat\n                                      \"discourse_ai.features.\"\n                                      feature.module_name\n                                      \".name\"\n                                    )\n                                  }}\n                                  @route=\"adminPlugins.show.discourse-ai-features.edit\"\n                                  @routeModels={{feature.id}}\n                                />\n                              </span>\n                            {{/each}}\n                          {{/if}}\n                        </td>\n                        <td class=\"d-admin-row__controls\">\n                          <LinkTo\n                            @route=\"adminPlugins.show.discourse-ai-personas.edit\"\n                            @model={{persona}}\n                            class=\"btn btn-default btn-text btn-small\"\n                          >{{i18n \"discourse_ai.ai_persona.edit\"}} </LinkTo>\n                        </td>\n                      </tr>\n                    {{/each}}\n                  </tbody>\n                </table>\n              </:content>\n            </AdminFilterControls>\n          {{else}}\n            <AdminConfigAreaEmptyList\n              @ctaLabel=\"discourse_ai.ai_persona.new\"\n              @ctaRoute=\"adminPlugins.show.discourse-ai-personas.new\"\n              @ctaClass=\"ai-persona-list-editor__empty-new-button\"\n              @emptyLabel=\"discourse_ai.ai_persona.no_personas\"\n            />\n          {{/if}}\n        {{/if}}\n      </section>\n      */\n      {\n        \"id\": \"utekFgTB\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@path\\\",\\\"@label\\\"],[[29,[\\\"/admin/plugins/\\\",[30,0,[\\\"adminPluginNavManager\\\",\\\"currentPlugin\\\",\\\"name\\\"]],\\\"/ai-personas\\\"]],[28,[32,1],[\\\"discourse_ai.ai_persona.short_title\\\"],null]]],null],[1,\\\"\\\\n\\\"],[10,\\\"section\\\"],[14,0,\\\"ai-persona-list-editor__current admin-detail\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1],[[[1,\\\"    \\\"],[8,[32,2],null,[[\\\"@model\\\",\\\"@personas\\\"],[[30,1],[30,2]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[8,[32,3],null,[[\\\"@titleLabel\\\",\\\"@descriptionLabel\\\",\\\"@learnMoreUrl\\\"],[[28,[32,1],[\\\"discourse_ai.ai_persona.short_title\\\"],null],[28,[32,1],[\\\"discourse_ai.ai_persona.persona_description\\\"],null],\\\"https://meta.discourse.org/t/ai-bot-personas/306099\\\"]],[[\\\"actions\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,3,[\\\"Default\\\"]],[[24,0,\\\"ai-persona-list-editor__import-button\\\"]],[[\\\"@label\\\",\\\"@action\\\",\\\"@icon\\\"],[\\\"discourse_ai.ai_persona.import\\\",[30,0,[\\\"importPersona\\\"]],\\\"upload\\\"]],null],[1,\\\"\\\\n        \\\"],[8,[30,3,[\\\"Primary\\\"]],[[24,0,\\\"ai-persona-list-editor__new-button\\\"]],[[\\\"@label\\\",\\\"@route\\\",\\\"@icon\\\"],[\\\"discourse_ai.ai_persona.new\\\",\\\"adminPlugins.show.discourse-ai-personas.new\\\",\\\"plus\\\"]],null],[1,\\\"\\\\n      \\\"]],[3]]]]],[1,\\\"\\\\n\\\"],[41,[30,2,[\\\"content\\\"]],[[[1,\\\"      \\\"],[8,[32,4],null,[[\\\"@array\\\",\\\"@searchableProps\\\",\\\"@dropdownOptions\\\",\\\"@inputPlaceholder\\\",\\\"@noResultsMessage\\\"],[[30,2,[\\\"content\\\"]],[30,0,[\\\"searchableProps\\\"]],[30,0,[\\\"dropdownOptions\\\"]],[28,[32,1],[\\\"discourse_ai.ai_persona.filters.text\\\"],null],[28,[32,1],[\\\"discourse_ai.ai_persona.filters.no_results\\\"],null]]],[[\\\"actions\\\",\\\"content\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"capabilities\\\",\\\"viewport\\\",\\\"md\\\"]],[[[1,\\\"            \\\"],[8,[32,5],null,[[\\\"@modalForMobile\\\",\\\"@autofocus\\\",\\\"@identifier\\\",\\\"@onRegisterApi\\\",\\\"@triggerClass\\\"],[true,true,\\\"persona-list-layout\\\",[30,0,[\\\"onRegisterApi\\\"]],\\\"btn-default btn-icon\\\"]],[[\\\"trigger\\\",\\\"content\\\"],[[[[1,\\\"\\\\n                \\\"],[1,[28,[32,6],[[30,0,[\\\"currentLayout\\\",\\\"icon\\\"]]],null]],[1,\\\"\\\\n              \\\"]],[]],[[[1,\\\"\\\\n                \\\"],[8,[32,7],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[32,8]],null]],null],null,[[[1,\\\"                    \\\"],[8,[30,4,[\\\"item\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n                      \\\"],[8,[32,9],[[24,0,\\\"btn-transparent\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\"],[[30,5,[\\\"label\\\"]],[30,5,[\\\"icon\\\"]],[28,[32,10],[[30,0,[\\\"onLayoutSelect\\\"]],[30,5,[\\\"id\\\"]]],null]]],null],[1,\\\"\\\\n                    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[5]],null],[1,\\\"                \\\"]],[4]]]]],[1,\\\"\\\\n              \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"]],[]],[[[1,\\\"\\\\n          \\\"],[10,\\\"table\\\"],[15,0,[28,[32,11],[\\\"content-list ai-persona-list-editor d-admin-table\\\",[28,[32,12],[\\\"--layout-\\\",[30,0,[\\\"currentLayout\\\",\\\"id\\\"]]],null]],null]],[12],[1,\\\"\\\\n            \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.ai_persona.name\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.llms.short_title\\\"],null]],[13],[1,\\\"\\\\n                \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.features.short_title\\\"],null]],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,6]],null]],null],null,[[[1,\\\"                \\\"],[10,\\\"tr\\\"],[15,\\\"data-persona-id\\\",[30,7,[\\\"id\\\"]]],[15,0,[28,[32,11],[\\\"ai-persona-list__row d-admin-row__content\\\",[52,[30,7,[\\\"priority\\\"]],\\\"--priority\\\"],[52,[30,7,[\\\"enabled\\\"]],\\\"--enabled\\\"]],null]],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__overview\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,0],[14,0,\\\"ai-persona-list__name-with-description\\\"],[12],[1,\\\"\\\\n                      \\\"],[10,\\\"h3\\\"],[14,0,\\\"ai-persona-list__name\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,7,[\\\"user\\\"]],[[[1,\\\"                          \\\"],[1,[28,[32,13],[[30,7,[\\\"user\\\"]]],[[\\\"imageSize\\\"],[\\\"tiny\\\"]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                        \\\"],[1,[30,7,[\\\"name\\\"]]],[1,\\\"\\\\n                      \\\"],[13],[1,\\\"\\\\n                      \\\"],[10,0],[14,0,\\\"ai-persona-list__description\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[30,7,[\\\"description\\\"]]],[1,\\\"\\\\n                      \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                  \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__llms\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,7,[\\\"default_llm\\\"]],[[[1,\\\"                      \\\"],[10,1],[14,0,\\\"--card-label\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[32,1],[\\\"discourse_ai.ai_persona.llms_list\\\"],null]],[1,\\\"\\\\n                      \\\"],[13],[1,\\\"\\\\n                      \\\"],[8,[32,9],[[24,0,\\\"btn-flat btn-small ai-persona-list__row-item-feature\\\"]],[[\\\"@translatedLabel\\\",\\\"@route\\\",\\\"@routeModels\\\"],[[30,7,[\\\"default_llm\\\",\\\"display_name\\\"]],\\\"adminPlugins.show.discourse-ai-llms.edit\\\",[30,7,[\\\"default_llm\\\",\\\"id\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                  \\\"],[13],[1,\\\"\\\\n                  \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__features\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,7,[\\\"features\\\",\\\"length\\\"]],[[[1,\\\"                      \\\"],[10,1],[14,0,\\\"--card-label\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[32,1],[\\\"discourse_ai.ai_persona.features_list\\\"],[[\\\"count\\\"],[[30,7,[\\\"features\\\",\\\"length\\\"]]]]]],[1,\\\"\\\\n                      \\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,7,[\\\"features\\\"]]],null]],null],null,[[[1,\\\"                        \\\"],[10,1],[14,0,\\\"d-admin-row__row-feature-list\\\"],[12],[1,\\\"\\\\n                          \\\"],[41,[28,[32,14],[[30,9],0],null],[[[1,\\\", \\\"]],[]],null],[1,\\\"\\\\n                          \\\"],[8,[32,9],[[24,0,\\\"btn-flat btn-small ai-persona-list__row-item-feature\\\"]],[[\\\"@translatedLabel\\\",\\\"@route\\\",\\\"@routeModels\\\"],[[28,[32,1],[[28,[32,12],[\\\"discourse_ai.features.\\\",[30,8,[\\\"module_name\\\"]],\\\".name\\\"],null]],null],\\\"adminPlugins.show.discourse-ai-features.edit\\\",[30,8,[\\\"id\\\"]]]],null],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[8,9]],null]],[]],null],[1,\\\"                  \\\"],[13],[1,\\\"\\\\n                  \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__controls\\\"],[12],[1,\\\"\\\\n                    \\\"],[8,[32,15],[[24,0,\\\"btn btn-default btn-text btn-small\\\"]],[[\\\"@route\\\",\\\"@model\\\"],[\\\"adminPlugins.show.discourse-ai-personas.edit\\\",[30,7]]],[[\\\"default\\\"],[[[[1,[28,[32,1],[\\\"discourse_ai.ai_persona.edit\\\"],null]],[1,\\\" \\\"]],[]]]]],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[7]],null],[1,\\\"            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"]],[6]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[8,[32,16],null,[[\\\"@ctaLabel\\\",\\\"@ctaRoute\\\",\\\"@ctaClass\\\",\\\"@emptyLabel\\\"],[\\\"discourse_ai.ai_persona.new\\\",\\\"adminPlugins.show.discourse-ai-personas.new\\\",\\\"ai-persona-list-editor__empty-new-button\\\",\\\"discourse_ai.ai_persona.no_personas\\\"]],null],[1,\\\"\\\\n\\\"]],[]]]],[]]],[13]],[\\\"@currentPersona\\\",\\\"@personas\\\",\\\"actions\\\",\\\"dropdown\\\",\\\"button\\\",\\\"filteredPersonas\\\",\\\"persona\\\",\\\"feature\\\",\\\"index\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-persona-list-editor.js\",\n        \"scope\": () => [_dBreadcrumbsItem.default, _discourseI18n.i18n, _aiPersonaEditor.default, _dPageSubheader.default, _adminFilterControls.default, _dMenu.default, _dIcon.default, _dropdownMenu.default, LAYOUT_BUTTONS, _dButton.default, _helper.fn, _concatClass.default, _helper.concat, _avatar.default, _truthHelpers.gt, _routing.LinkTo, _adminConfigAreaEmptyList.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiPersonaListEditor;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-persona-llm-selector\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/runloop\", \"@ember/service\", \"discourse/select-kit/components/dropdown-select-box\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _runloop, _service, _dropdownSelectBox, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const PERSONA_SELECTOR_KEY = \"ai_persona_selector_id\";\n  const LLM_SELECTOR_KEY = \"ai_llm_selector_id\";\n  class AiPersonaLlmSelector extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"keyValueStore\", [_service.service]);\n    }\n    #keyValueStore = (dt7948.i(this, \"keyValueStore\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"llm\", [_tracking.tracked]);\n    }\n    #llm = (dt7948.i(this, \"llm\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"allowLLMSelector\", [_tracking.tracked], function () {\n        return true;\n      });\n    }\n    #allowLLMSelector = (dt7948.i(this, \"allowLLMSelector\"), void 0);\n    constructor() {\n      super(...arguments);\n      if (this.botOptions?.length) {\n        this.#loadStoredPersona();\n        this.#loadStoredLlm();\n        (0, _runloop.next)(() => {\n          this.resetTargetRecipients();\n        });\n      }\n    }\n    get composer() {\n      return this.args?.outletArgs?.model;\n    }\n    get hasLlmSelector() {\n      return this.currentUser.ai_enabled_chat_bots.some(bot => !bot.is_persona);\n    }\n    get botOptions() {\n      if (!this.currentUser.ai_enabled_personas) {\n        return;\n      }\n      let enabledPersonas = this.currentUser.ai_enabled_personas;\n      enabledPersonas = enabledPersonas.filter(persona => persona.allow_personal_messages);\n      if (!this.hasLlmSelector) {\n        enabledPersonas = enabledPersonas.filter(persona => persona.username);\n      }\n      return enabledPersonas.map(persona => {\n        return {\n          id: persona.id,\n          name: persona.name,\n          description: persona.description\n        };\n      });\n    }\n    get filterable() {\n      return this.botOptions.length > 8;\n    }\n    get value() {\n      return this._value;\n    }\n    set value(newValue) {\n      this._value = newValue;\n      this.keyValueStore.setItem(PERSONA_SELECTOR_KEY, newValue);\n      this.args.setPersonaId(newValue);\n      this.setAllowLLMSelector();\n      this.resetTargetRecipients();\n    }\n    setAllowLLMSelector() {\n      if (!this.hasLlmSelector) {\n        this.allowLLMSelector = false;\n        return;\n      }\n      const persona = this.currentUser.ai_enabled_personas.find(innerPersona => innerPersona.id === this._value);\n      this.allowLLMSelector = !persona?.force_default_llm;\n    }\n    get currentLlm() {\n      return this.llm;\n    }\n    set currentLlm(newValue) {\n      this.llm = newValue;\n      this.keyValueStore.setItem(LLM_SELECTOR_KEY, newValue);\n      // Pass the LLM model ID (not user ID) for credit checking\n      const bot = this.currentUser.ai_enabled_chat_bots.find(b => b.id === newValue);\n      this.args.setLlmId?.(bot?.llm_model_id);\n      this.resetTargetRecipients();\n    }\n    resetTargetRecipients() {\n      if (this.allowLLMSelector) {\n        const botUsername = this.currentUser.ai_enabled_chat_bots.find(bot => bot.id === this.llm).username;\n        this.args.setTargetRecipient(botUsername);\n      } else {\n        const persona = this.currentUser.ai_enabled_personas.find(innerPersona => innerPersona.id === this._value);\n        this.args.setTargetRecipient(persona.username || \"\");\n      }\n    }\n    get llmOptions() {\n      const availableBots = this.currentUser.ai_enabled_chat_bots.filter(bot => !bot.is_persona).filter(Boolean);\n      return availableBots.map(bot => {\n        return {\n          id: bot.id,\n          name: bot.display_name\n        };\n      }).sort((a, b) => a.name.localeCompare(b.name));\n    }\n    get showPersonaSelector() {\n      return this.botOptions?.length > 1;\n    }\n    get showLLMSelector() {\n      return this.allowLLMSelector && this.llmOptions.length > 1;\n    }\n    #getPersonaIdFromAttrs() {\n      const personaName = this.args?.personaName;\n      if (personaName) {\n        const persona = this.botOptions.find(p => p.name === personaName);\n        if (persona) {\n          return persona.id;\n        }\n      }\n    }\n    #getLlmIdFromAttrs() {\n      const llmName = this.args?.llmName;\n      if (llmName) {\n        const llm = this.llmOptions.find(l => l.name === llmName);\n        if (llm) {\n          return llm.id;\n        }\n      }\n    }\n    #loadStoredPersona() {\n      let personaId = this.#getPersonaIdFromAttrs() || this.keyValueStore.getItem(PERSONA_SELECTOR_KEY);\n      this._value = this.botOptions[0].id;\n      if (personaId) {\n        personaId = parseInt(personaId, 10);\n        if (this.botOptions.some(bot => bot.id === personaId)) {\n          this._value = personaId;\n        }\n      }\n      this.args.setPersonaId(this._value);\n    }\n    #loadStoredLlm() {\n      this.setAllowLLMSelector();\n      if (this.hasLlmSelector) {\n        let llmId = this.#getLlmIdFromAttrs() || this.keyValueStore.getItem(LLM_SELECTOR_KEY);\n        if (llmId) {\n          llmId = parseInt(llmId, 10);\n        }\n        const llmOption = this.llmOptions.find(innerLlmOption => innerLlmOption.id === llmId) || this.llmOptions[0];\n        if (llmOption) {\n          llmId = llmOption.id;\n        } else {\n          llmId = \"\";\n        }\n        if (llmId) {\n          (0, _runloop.next)(() => {\n            this.currentLlm = llmId;\n          });\n        }\n      }\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"persona-llm-selector\">\n        {{#if this.showPersonaSelector}}\n          <div class=\"persona-llm-selector__selection-wrapper gpt-persona\">\n            {{#if @showLabels}}\n              <label>{{i18n \"discourse_ai.ai_bot.persona\"}}</label>\n            {{/if}}\n            <DropdownSelectBox\n              class=\"persona-llm-selector__persona-dropdown\"\n              @value={{this.value}}\n              @content={{this.botOptions}}\n              @options={{hash\n                icon=(if @showLabels \"angle-down\" \"robot\")\n                filterable=this.filterable\n              }}\n            />\n          </div>\n        {{/if}}\n        {{#if this.showLLMSelector}}\n          <div class=\"persona-llm-selector__selection-wrapper llm-selector\">\n            {{#if @showLabels}}\n              <label>{{i18n \"discourse_ai.ai_bot.llm\"}}</label>\n            {{/if}}\n            <DropdownSelectBox\n              class=\"persona-llm-selector__llm-dropdown\"\n              @value={{this.currentLlm}}\n              @content={{this.llmOptions}}\n              @options={{hash icon=(if @showLabels \"angle-down\" \"globe\")}}\n            />\n          </div>\n        {{/if}}\n      </div>\n      */\n      {\n        \"id\": \"GxJ3L0YM\",\n        \"block\": \"[[[10,0],[14,0,\\\"persona-llm-selector\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"showPersonaSelector\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"persona-llm-selector__selection-wrapper gpt-persona\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1],[[[1,\\\"        \\\"],[10,\\\"label\\\"],[12],[1,[28,[32,0],[\\\"discourse_ai.ai_bot.persona\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"      \\\"],[8,[32,1],[[24,0,\\\"persona-llm-selector__persona-dropdown\\\"]],[[\\\"@value\\\",\\\"@content\\\",\\\"@options\\\"],[[30,0,[\\\"value\\\"]],[30,0,[\\\"botOptions\\\"]],[28,[32,2],null,[[\\\"icon\\\",\\\"filterable\\\"],[[52,[30,1],\\\"angle-down\\\",\\\"robot\\\"],[30,0,[\\\"filterable\\\"]]]]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[30,0,[\\\"showLLMSelector\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"persona-llm-selector__selection-wrapper llm-selector\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1],[[[1,\\\"        \\\"],[10,\\\"label\\\"],[12],[1,[28,[32,0],[\\\"discourse_ai.ai_bot.llm\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"      \\\"],[8,[32,1],[[24,0,\\\"persona-llm-selector__llm-dropdown\\\"]],[[\\\"@value\\\",\\\"@content\\\",\\\"@options\\\"],[[30,0,[\\\"currentLlm\\\"]],[30,0,[\\\"llmOptions\\\"]],[28,[32,2],null,[[\\\"icon\\\"],[[52,[30,1],\\\"angle-down\\\",\\\"globe\\\"]]]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[\\\"@showLabels\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-persona-llm-selector.js\",\n        \"scope\": () => [_discourseI18n.i18n, _dropdownSelectBox.default, _helper.hash],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiPersonaLlmSelector;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-persona-tool-options\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-llm-selector\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _truthHelpers, _discourseI18n, _aiLlmSelector, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiPersonaToolOptions extends _component.default {\n    get showToolOptions() {\n      const allTools = this.args.allTools;\n      if (!allTools || !this.args.data.tools) {\n        return false;\n      }\n      return this.args.data?.tools.some(tool => allTools.find(item => item.id === tool)?.options);\n    }\n    get toolsMetadata() {\n      const metadata = {};\n      this.args.allTools.map(t => {\n        metadata[t.id] = {\n          name: t.name,\n          ...t?.options\n        };\n      });\n      return metadata;\n    }\n    formObjectKeys(toolOptions) {\n      return toolOptions ? Object.keys(toolOptions) : [];\n    }\n    static {\n      dt7948.n(this.prototype, \"formObjectKeys\", [_object.action]);\n    }\n    toolOptionKeys(toolId) {\n      // this is important, some tools may not have all options defined (for example if a tool option is added)\n      const metadata = this.toolsMetadata[toolId];\n      if (!metadata) {\n        return [];\n      }\n      // a bit more verbose for clarity of our selection\n      const availableOptions = Object.keys(metadata).filter(k => k !== \"name\");\n      return availableOptions;\n    }\n    static {\n      dt7948.n(this.prototype, \"toolOptionKeys\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.showToolOptions}}\n        <@form.Container\n          @title={{i18n \"discourse_ai.ai_persona.tool_options\"}}\n          @direction=\"column\"\n          @format=\"full\"\n        >\n          <@form.Object\n            @name=\"toolOptions\"\n            @title={{i18n \"discourse_ai.ai_persona.tool_options\"}}\n            as |toolObj optsPerTool|\n          >\n            {{#each (this.formObjectKeys optsPerTool) as |toolId|}}\n              <div class=\"ai-persona-editor__tool-options\">\n                {{#let (get this.toolsMetadata toolId) as |toolMeta|}}\n                  <div class=\"ai-persona-editor__tool-options-name\">\n                    {{toolMeta.name}}\n                  </div>\n                  <toolObj.Object @name={{toolId}} as |optionsObj|>\n                    {{#each (this.toolOptionKeys toolId) as |optionName|}}\n                      {{#let (get toolMeta optionName) as |optionMeta|}}\n                        <optionsObj.Field\n                          @name={{optionName}}\n                          @title={{optionMeta.name}}\n                          @helpText={{optionMeta.description}}\n                          @format=\"full\"\n                          as |field|\n                        >\n                          {{#if (eq optionMeta.type \"enum\")}}\n                            <field.Select @includeNone={{false}} as |select|>\n                              {{#each optionMeta.values as |v|}}\n                                <select.Option @value={{v}}>{{v}}</select.Option>\n                              {{/each}}\n                            </field.Select>\n                          {{else if (eq optionMeta.type \"llm\")}}\n                            <field.Custom>\n                              <AiLlmSelector\n                                @value={{field.value}}\n                                @llms={{@llms}}\n                                @onChange={{field.set}}\n                                @class=\"ai-persona-tool-option-editor__llms\"\n                              />\n                            </field.Custom>\n                          {{else if (eq optionMeta.type \"boolean\")}}\n                            <field.Checkbox />\n                          {{else if (eq optionMeta.type \"text\")}}\n                            <field.Textarea />\n                          {{else}}\n                            <field.Input />\n                          {{/if}}\n                        </optionsObj.Field>\n                      {{/let}}\n                    {{/each}}\n                  </toolObj.Object>\n                {{/let}}\n              </div>\n            {{/each}}\n          </@form.Object>\n        </@form.Container>\n      {{/if}}\n      */\n      {\n        \"id\": \"eztFs6Xt\",\n        \"block\": \"[[[41,[30,0,[\\\"showToolOptions\\\"]],[[[1,\\\"  \\\"],[8,[30,1,[\\\"Container\\\"]],null,[[\\\"@title\\\",\\\"@direction\\\",\\\"@format\\\"],[[28,[32,0],[\\\"discourse_ai.ai_persona.tool_options\\\"],null],\\\"column\\\",\\\"full\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,1,[\\\"Object\\\"]],null,[[\\\"@name\\\",\\\"@title\\\"],[\\\"toolOptions\\\",[28,[32,0],[\\\"discourse_ai.ai_persona.tool_options\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[28,[30,0,[\\\"formObjectKeys\\\"]],[[30,3]],null]],null]],null],null,[[[1,\\\"        \\\"],[10,0],[14,0,\\\"ai-persona-editor__tool-options\\\"],[12],[1,\\\"\\\\n\\\"],[44,[[28,[32,1],[[30,0,[\\\"toolsMetadata\\\"]],[30,4]],null]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"ai-persona-editor__tool-options-name\\\"],[12],[1,\\\"\\\\n              \\\"],[1,[30,5,[\\\"name\\\"]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[8,[30,2,[\\\"Object\\\"]],null,[[\\\"@name\\\"],[[30,4]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[28,[30,0,[\\\"toolOptionKeys\\\"]],[[30,4]],null]],null]],null],null,[[[44,[[28,[32,1],[[30,5],[30,7]],null]],[[[1,\\\"                  \\\"],[8,[30,6,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@helpText\\\",\\\"@format\\\"],[[30,7],[30,8,[\\\"name\\\"]],[30,8,[\\\"description\\\"]],\\\"full\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[28,[32,2],[[30,8,[\\\"type\\\"]],\\\"enum\\\"],null],[[[1,\\\"                      \\\"],[8,[30,9,[\\\"Select\\\"]],null,[[\\\"@includeNone\\\"],[false]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,8,[\\\"values\\\"]]],null]],null],null,[[[1,\\\"                          \\\"],[8,[30,10,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,11]]],[[\\\"default\\\"],[[[[1,[30,11]]],[]]]]],[1,\\\"\\\\n\\\"]],[11]],null],[1,\\\"                      \\\"]],[10]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,2],[[30,8,[\\\"type\\\"]],\\\"llm\\\"],null],[[[1,\\\"                      \\\"],[8,[30,9,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n                        \\\"],[8,[32,3],null,[[\\\"@value\\\",\\\"@llms\\\",\\\"@onChange\\\",\\\"@class\\\"],[[30,9,[\\\"value\\\"]],[30,12],[30,9,[\\\"set\\\"]],\\\"ai-persona-tool-option-editor__llms\\\"]],null],[1,\\\"\\\\n                      \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,2],[[30,8,[\\\"type\\\"]],\\\"boolean\\\"],null],[[[1,\\\"                      \\\"],[8,[30,9,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,2],[[30,8,[\\\"type\\\"]],\\\"text\\\"],null],[[[1,\\\"                      \\\"],[8,[30,9,[\\\"Textarea\\\"]],null,null,null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                      \\\"],[8,[30,9,[\\\"Input\\\"]],null,null,null],[1,\\\"\\\\n                    \\\"]],[]]]],[]]]],[]]]],[]]],[1,\\\"                  \\\"]],[9]]]]],[1,\\\"\\\\n\\\"]],[8]]]],[7]],null],[1,\\\"            \\\"]],[6]]]]],[1,\\\"\\\\n\\\"]],[5]]],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"    \\\"]],[2,3]]]]],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@form\\\",\\\"toolObj\\\",\\\"optsPerTool\\\",\\\"toolId\\\",\\\"toolMeta\\\",\\\"optionsObj\\\",\\\"optionName\\\",\\\"optionMeta\\\",\\\"field\\\",\\\"select\\\",\\\"v\\\",\\\"@llms\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\",\\\"let\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-persona-tool-options.js\",\n        \"scope\": () => [_discourseI18n.i18n, _object.get, _truthHelpers.eq, _aiLlmSelector.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiPersonaToolOptions;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-post-helper-menu\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/render-modifiers/modifiers/will-destroy\", \"@ember/service\", \"ember-modifier\", \"discourse/components/cook-text\", \"discourse/components/d-button\", \"discourse/components/fast-edit\", \"discourse/components/modal/fast-edit\", \"discourse/helpers/concat-class\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/decorators\", \"discourse/lib/text\", \"discourse/lib/utilities\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-helper-loading\", \"discourse/plugins/discourse-ai/discourse/components/ai-helper-options-list\", \"discourse/plugins/discourse-ai/discourse/lib/ai-errors\", \"discourse/plugins/discourse-ai/discourse/lib/smooth-streamer\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _willDestroy, _service, _emberModifier, _cookText, _dButton, _fastEdit, _fastEdit2, _concatClass, _ajax, _ajaxError, _decorators, _text, _utilities, _truthHelpers, _discourseI18n, _aiHelperLoading, _aiHelperOptionsList, _aiErrors, _smoothStreamer3, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiPostHelperMenu extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"messageBus\", [_service.service]);\n    }\n    #messageBus = (dt7948.i(this, \"messageBus\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"site\", [_service.service]);\n    }\n    #site = (dt7948.i(this, \"site\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"menu\", [_service.service]);\n    }\n    #menu = (dt7948.i(this, \"menu\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"tooltip\", [_service.service]);\n    }\n    #tooltip = (dt7948.i(this, \"tooltip\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"menuState\", [_tracking.tracked], function () {\n        return this.MENU_STATES.options;\n      });\n    }\n    #menuState = (dt7948.i(this, \"menuState\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"suggestion\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #suggestion = (dt7948.i(this, \"suggestion\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"customPromptValue\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #customPromptValue = (dt7948.i(this, \"customPromptValue\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"copyButtonIcon\", [_tracking.tracked], function () {\n        return \"copy\";\n      });\n    }\n    #copyButtonIcon = (dt7948.i(this, \"copyButtonIcon\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"copyButtonLabel\", [_tracking.tracked], function () {\n        return \"discourse_ai.ai_helper.post_options_menu.copy\";\n      });\n    }\n    #copyButtonLabel = (dt7948.i(this, \"copyButtonLabel\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"showFastEdit\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #showFastEdit = (dt7948.i(this, \"showFastEdit\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"showAiButtons\", [_tracking.tracked], function () {\n        return true;\n      });\n    }\n    #showAiButtons = (dt7948.i(this, \"showAiButtons\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"streaming\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #streaming = (dt7948.i(this, \"streaming\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"lastSelectedOption\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #lastSelectedOption = (dt7948.i(this, \"lastSelectedOption\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isSavingFootnote\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isSavingFootnote = (dt7948.i(this, \"isSavingFootnote\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"supportsAddFootnote\", [_tracking.tracked], function () {\n        return this.args.data.supportsFastEdit;\n      });\n    }\n    #supportsAddFootnote = (dt7948.i(this, \"supportsAddFootnote\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"smoothStreamer\", [_tracking.tracked], function () {\n        return new _smoothStreamer3.default(() => this.suggestion, newValue => this.suggestion = newValue);\n      });\n    }\n    #smoothStreamer = (dt7948.i(this, \"smoothStreamer\"), void 0);\n    MENU_STATES = {\n      options: \"OPTIONS\",\n      loading: \"LOADING\",\n      result: \"RESULT\"\n    };\n    showFootnoteTooltip = (0, _emberModifier.modifier)(element => {\n      if (this.supportsAddFootnote || this.streaming) {\n        return;\n      }\n      const instance = this.tooltip.register(element, {\n        identifier: \"cannot-add-footnote-tooltip\",\n        content: (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.post_options_menu.footnote_disabled\"),\n        placement: \"top\",\n        triggers: \"hover\"\n      });\n      return () => {\n        instance.destroy();\n      };\n    });\n    static {\n      dt7948.g(this.prototype, \"_activeAiRequest\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #_activeAiRequest = (dt7948.i(this, \"_activeAiRequest\"), void 0);\n    get footnoteDisabled() {\n      return this.streaming || !this.supportsAddFootnote;\n    }\n    get helperOptions() {\n      let prompts = this.currentUser?.ai_helper_prompts;\n      prompts = prompts.filter(item => item.location.includes(\"post\"));\n      // Find the custom_prompt object and move it to the beginning of the array\n      const customPromptIndex = prompts.findIndex(p => p.name === \"custom_prompt\");\n      if (customPromptIndex !== -1) {\n        const customPrompt = prompts.splice(customPromptIndex, 1)[0];\n        prompts.unshift(customPrompt);\n      }\n      if (!this._showUserCustomPrompts()) {\n        prompts = prompts.filter(p => p.name !== \"custom_prompt\");\n      }\n      if (!this.args.data.canEditPost) {\n        prompts = prompts.filter(p => p.name !== \"proofread\");\n      }\n      return prompts;\n    }\n    get highlightedTextToggleIcon() {\n      if (this.showHighlightedText) {\n        return \"angle-double-left\";\n      } else {\n        return \"angle-double-right\";\n      }\n    }\n    get allowInsertFootnote() {\n      const siteSettings = this.siteSettings;\n      const canEditPost = this.args.data.canEditPost;\n      if (!siteSettings?.enable_markdown_footnotes || !siteSettings?.display_footnotes_inline || !canEditPost) {\n        return false;\n      }\n      return this.lastSelectedOption?.name === \"explain\";\n    }\n    _showUserCustomPrompts() {\n      return this.currentUser?.can_use_custom_prompts;\n    }\n    _sanitizeForFootnote(text) {\n      // Remove line breaks (line-breaks breaks the inline footnote display)\n      text = text.replace(/[\\r\\n]+/g, \" \");\n      // Remove headings (headings don't work in inline footnotes)\n      text = text.replace(/^(#+)\\s+/gm, \"\");\n      // Trim excess space\n      text = text.trim();\n      return (0, _text.sanitize)(text);\n    }\n    set progressChannel(value) {\n      if (this._progressChannel) {\n        this.unsubscribe();\n      }\n      this._progressChannel = value;\n      this.subscribe();\n    }\n    subscribe() {\n      this.messageBus.subscribe(this._progressChannel, this._updateResult, 0);\n    }\n    unsubscribe() {\n      if (!this._progressChannel) {\n        return;\n      }\n      this.messageBus.unsubscribe(this._progressChannel, this._updateResult);\n      this._progressChannel = null;\n    }\n    static {\n      dt7948.n(this.prototype, \"unsubscribe\", [_decorators.bind]);\n    }\n    async _updateResult(result) {\n      if ((0, _aiErrors.isAiCreditLimitError)(result)) {\n        this.loading = false;\n        this.menuState = this.MENU_STATES.triggers;\n        (0, _aiErrors.popupAiCreditLimitError)(result);\n        return;\n      }\n      this.streaming = !result.done;\n      await this.smoothStreamer.updateResult(result, \"result\");\n    }\n    static {\n      dt7948.n(this.prototype, \"_updateResult\", [_decorators.bind]);\n    }\n    toggleHighlightedTextPreview() {\n      this.showHighlightedText = !this.showHighlightedText;\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleHighlightedTextPreview\", [_object.action]);\n    }\n    async performAiSuggestion(option) {\n      this.menuState = this.MENU_STATES.loading;\n      this.lastSelectedOption = option;\n      const streamableOptions = [\"explain\", \"translate\", \"custom_prompt\"];\n      try {\n        if (streamableOptions.includes(option.name)) {\n          const streamedResult = await this._handleStreamedResult(option);\n          this.progressChannel = streamedResult.progress_channel;\n          return;\n        } else {\n          this._activeAiRequest = (0, _ajax.ajax)(\"/discourse-ai/ai-helper/suggest\", {\n            method: \"POST\",\n            data: {\n              mode: option.name,\n              text: this.args.data.quoteState.buffer,\n              custom_prompt: this.customPromptValue\n            }\n          });\n        }\n        this._activeAiRequest.then(({\n          suggestions\n        }) => {\n          this.suggestion = suggestions[0].trim();\n          if (option.name === \"proofread\") {\n            return this._handleProofreadOption();\n          }\n        }).finally(() => {\n          this.loading = false;\n          this.menuState = this.MENU_STATES.result;\n        });\n      } catch (error) {\n        if ((0, _aiErrors.isAiCreditLimitError)(error)) {\n          (0, _aiErrors.popupAiCreditLimitError)(error);\n        } else {\n          (0, _ajaxError.popupAjaxError)(error);\n        }\n        this.loading = false;\n        this.menuState = this.MENU_STATES.triggers;\n      }\n      return this._activeAiRequest;\n    }\n    static {\n      dt7948.n(this.prototype, \"performAiSuggestion\", [_object.action]);\n    }\n    _handleStreamedResult(option) {\n      this.menuState = this.MENU_STATES.result;\n      const menu = this.menu.getByIdentifier(\"post-text-selection-toolbar\");\n      if (menu) {\n        menu.options.placement = \"bottom\";\n      }\n      const fetchUrl = `/discourse-ai/ai-helper/stream_suggestion`;\n      this._activeAiRequest = (0, _ajax.ajax)(fetchUrl, {\n        method: \"POST\",\n        data: {\n          location: \"post\",\n          mode: option.name,\n          text: this.args.data.quoteState.buffer,\n          post_id: this.args.data.quoteState.postId,\n          custom_prompt: this.customPromptValue,\n          client_id: this.messageBus.clientId\n        }\n      });\n      return this._activeAiRequest;\n    }\n    _handleProofreadOption() {\n      this.showAiButtons = false;\n      if (this.site.desktopView) {\n        this.showFastEdit = true;\n        return;\n      } else {\n        return this.modal.show(_fastEdit2.default, {\n          model: {\n            initialValue: this.args.data.quoteState.buffer,\n            newValue: this.suggestion,\n            post: this.args.data.post,\n            close: this.closeFastEdit\n          }\n        });\n      }\n    }\n    cancelAiAction() {\n      if (this._activeAiRequest) {\n        this._activeAiRequest.abort();\n        this._activeAiRequest = null;\n        this.loading = false;\n        this.menuState = this.MENU_STATES.options;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"cancelAiAction\", [_object.action]);\n    }\n    copySuggestion() {\n      if (this.suggestion?.length > 0) {\n        (0, _utilities.clipboardCopy)(this.suggestion);\n        this.copyButtonIcon = \"check\";\n        this.copyButtonLabel = \"discourse_ai.ai_helper.post_options_menu.copied\";\n        setTimeout(() => {\n          this.copyButtonIcon = \"copy\";\n          this.copyButtonLabel = \"discourse_ai.ai_helper.post_options_menu.copy\";\n        }, 3500);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"copySuggestion\", [_object.action]);\n    }\n    closeMenu() {\n      // reset state and close\n      this.suggestion = \"\";\n      this.customPromptValue = \"\";\n      return this.args.close();\n    }\n    static {\n      dt7948.n(this.prototype, \"closeMenu\", [_object.action]);\n    }\n    async closeFastEdit() {\n      this.showFastEdit = false;\n      await this.args.data.hideToolbar();\n    }\n    static {\n      dt7948.n(this.prototype, \"closeFastEdit\", [_object.action]);\n    }\n    async insertFootnote() {\n      this.isSavingFootnote = true;\n      if (this.allowInsertFootnote) {\n        try {\n          const result = await (0, _ajax.ajax)(`/posts/${this.args.data.post.id}`);\n          const sanitizedSuggestion = this._sanitizeForFootnote(this.suggestion);\n          const credits = (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.post_options_menu.footnote_credits\");\n          const withFootnote = `${this.args.data.quoteState.buffer} ^[${sanitizedSuggestion} (${credits})]`;\n          const newRaw = result.raw.replace(this.args.data.quoteState.buffer, withFootnote);\n          await this.args.data.post.save({\n            raw: newRaw\n          });\n        } catch (error) {\n          if ((0, _aiErrors.isAiCreditLimitError)(error)) {\n            (0, _aiErrors.popupAiCreditLimitError)(error);\n          } else {\n            (0, _ajaxError.popupAjaxError)(error);\n          }\n        } finally {\n          this.isSavingFootnote = false;\n          await this.closeMenu();\n        }\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"insertFootnote\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if\n        (and this.site.mobileView (eq this.menuState this.MENU_STATES.options))\n      }}\n        <div class=\"ai-post-helper-menu__selected-text\">\n          {{@data.quoteState.buffer}}\n        </div>\n      {{/if}}\n      \n      {{#if this.showAiButtons}}\n        <div class=\"ai-post-helper\">\n          {{#if (eq this.menuState this.MENU_STATES.options)}}\n            <AiHelperOptionsList\n              @options={{this.helperOptions}}\n              @customPromptValue={{this.customPromptValue}}\n              @performAction={{this.performAiSuggestion}}\n              @shortcutVisible={{false}}\n            />\n          {{else if (eq this.menuState this.MENU_STATES.loading)}}\n            <AiHelperLoading @cancel={{this.cancelAiAction}} />\n          {{else if (eq this.menuState this.MENU_STATES.result)}}\n            <div\n              class=\"ai-post-helper__suggestion\"\n              {{willDestroy this.unsubscribe}}\n            >\n              {{#if this.suggestion}}\n                <div\n                  class={{concatClass\n                    (if this.smoothStreamer.isStreaming \"streaming\")\n                    \"streamable-content\"\n                    \"ai-post-helper__suggestion__text\"\n                  }}\n                  dir=\"auto\"\n                >\n                  <CookText\n                    @rawText={{this.smoothStreamer.renderedText}}\n                    class=\"cooked\"\n                  />\n                </div>\n                <div class=\"ai-post-helper__suggestion__buttons\">\n                  <DButton\n                    @icon=\"xmark\"\n                    @label=\"discourse_ai.ai_helper.post_options_menu.cancel\"\n                    @action={{this.cancelAiAction}}\n                    class=\"btn-flat ai-post-helper__suggestion__cancel\"\n                  />\n                  <DButton\n                    @icon={{this.copyButtonIcon}}\n                    @label={{this.copyButtonLabel}}\n                    @action={{this.copySuggestion}}\n                    @disabled={{this.streaming}}\n                    class=\"btn-flat ai-post-helper__suggestion__copy\"\n                  />\n                  {{#if this.allowInsertFootnote}}\n                    <DButton\n                      @icon=\"asterisk\"\n                      @label=\"discourse_ai.ai_helper.post_options_menu.insert_footnote\"\n                      @action={{this.insertFootnote}}\n                      @isLoading={{this.isSavingFootnote}}\n                      @disabled={{this.footnoteDisabled}}\n                      class=\"btn-flat ai-post-helper__suggestion__insert-footnote\"\n                      {{this.showFootnoteTooltip}}\n                    />\n                  {{/if}}\n                </div>\n              {{else}}\n                <AiHelperLoading @cancel={{this.cancelAiAction}} />\n              {{/if}}\n            </div>\n          {{/if}}\n        </div>\n      {{/if}}\n      \n      {{#if this.showFastEdit}}\n        <div class=\"ai-post-helper__fast-edit\">\n          <FastEdit\n            @initialValue={{@data.quoteState.buffer}}\n            @newValue={{this.suggestion}}\n            @post={{@data.post}}\n            @close={{this.closeFastEdit}}\n          />\n        </div>\n      {{/if}}\n      */\n      {\n        \"id\": \"SQK9A9cQ\",\n        \"block\": \"[[[41,[28,[32,0],[[30,0,[\\\"site\\\",\\\"mobileView\\\"]],[28,[32,1],[[30,0,[\\\"menuState\\\"]],[30,0,[\\\"MENU_STATES\\\",\\\"options\\\"]]],null]],null],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"ai-post-helper-menu__selected-text\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[30,1,[\\\"quoteState\\\",\\\"buffer\\\"]]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"showAiButtons\\\"]],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"ai-post-helper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[32,1],[[30,0,[\\\"menuState\\\"]],[30,0,[\\\"MENU_STATES\\\",\\\"options\\\"]]],null],[[[1,\\\"      \\\"],[8,[32,2],null,[[\\\"@options\\\",\\\"@customPromptValue\\\",\\\"@performAction\\\",\\\"@shortcutVisible\\\"],[[30,0,[\\\"helperOptions\\\"]],[30,0,[\\\"customPromptValue\\\"]],[30,0,[\\\"performAiSuggestion\\\"]],false]],null],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,1],[[30,0,[\\\"menuState\\\"]],[30,0,[\\\"MENU_STATES\\\",\\\"loading\\\"]]],null],[[[1,\\\"      \\\"],[8,[32,3],null,[[\\\"@cancel\\\"],[[30,0,[\\\"cancelAiAction\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,1],[[30,0,[\\\"menuState\\\"]],[30,0,[\\\"MENU_STATES\\\",\\\"result\\\"]]],null],[[[1,\\\"      \\\"],[11,0],[24,0,\\\"ai-post-helper__suggestion\\\"],[4,[32,4],[[30,0,[\\\"unsubscribe\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"suggestion\\\"]],[[[1,\\\"          \\\"],[10,0],[15,0,[28,[32,5],[[52,[30,0,[\\\"smoothStreamer\\\",\\\"isStreaming\\\"]],\\\"streaming\\\"],\\\"streamable-content\\\",\\\"ai-post-helper__suggestion__text\\\"],null]],[14,\\\"dir\\\",\\\"auto\\\"],[12],[1,\\\"\\\\n            \\\"],[8,[32,6],[[24,0,\\\"cooked\\\"]],[[\\\"@rawText\\\"],[[30,0,[\\\"smoothStreamer\\\",\\\"renderedText\\\"]]]],null],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"ai-post-helper__suggestion__buttons\\\"],[12],[1,\\\"\\\\n            \\\"],[8,[32,7],[[24,0,\\\"btn-flat ai-post-helper__suggestion__cancel\\\"]],[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\"],[\\\"xmark\\\",\\\"discourse_ai.ai_helper.post_options_menu.cancel\\\",[30,0,[\\\"cancelAiAction\\\"]]]],null],[1,\\\"\\\\n            \\\"],[8,[32,7],[[24,0,\\\"btn-flat ai-post-helper__suggestion__copy\\\"]],[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\",\\\"@disabled\\\"],[[30,0,[\\\"copyButtonIcon\\\"]],[30,0,[\\\"copyButtonLabel\\\"]],[30,0,[\\\"copySuggestion\\\"]],[30,0,[\\\"streaming\\\"]]]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"allowInsertFootnote\\\"]],[[[1,\\\"              \\\"],[8,[32,7],[[24,0,\\\"btn-flat ai-post-helper__suggestion__insert-footnote\\\"],[4,[30,0,[\\\"showFootnoteTooltip\\\"]],null,null]],[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\",\\\"@isLoading\\\",\\\"@disabled\\\"],[\\\"asterisk\\\",\\\"discourse_ai.ai_helper.post_options_menu.insert_footnote\\\",[30,0,[\\\"insertFootnote\\\"]],[30,0,[\\\"isSavingFootnote\\\"]],[30,0,[\\\"footnoteDisabled\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[8,[32,3],null,[[\\\"@cancel\\\"],[[30,0,[\\\"cancelAiAction\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"]],[]],null]],[]]]],[]]],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"showFastEdit\\\"]],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"ai-post-helper__fast-edit\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,8],null,[[\\\"@initialValue\\\",\\\"@newValue\\\",\\\"@post\\\",\\\"@close\\\"],[[30,1,[\\\"quoteState\\\",\\\"buffer\\\"]],[30,0,[\\\"suggestion\\\"]],[30,1,[\\\"post\\\"]],[30,0,[\\\"closeFastEdit\\\"]]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@data\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-post-helper-menu.js\",\n        \"scope\": () => [_truthHelpers.and, _truthHelpers.eq, _aiHelperOptionsList.default, _aiHelperLoading.default, _willDestroy.default, _concatClass.default, _cookText.default, _dButton.default, _fastEdit.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiPostHelperMenu;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-quota-duration-selector\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/modifier\", \"@ember/object\", \"discourse/select-kit/components/combo-box\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _modifier, _object, _comboBox, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const DURATION_PRESETS = [{\n    id: \"3600\",\n    seconds: 3600,\n    nameKey: \"discourse_ai.llms.quotas.durations.hour\"\n  }, {\n    id: \"21600\",\n    seconds: 21600,\n    nameKey: \"discourse_ai.llms.quotas.durations.six_hours\"\n  }, {\n    id: \"86400\",\n    seconds: 86400,\n    nameKey: \"discourse_ai.llms.quotas.durations.day\"\n  }, {\n    id: \"604800\",\n    seconds: 604800,\n    nameKey: \"discourse_ai.llms.quotas.durations.week\"\n  }, {\n    id: \"custom\",\n    nameKey: \"discourse_ai.llms.quotas.durations.custom\"\n  }];\n  class DurationSelector extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"selectedPresetId\", [_tracking.tracked], function () {\n        return \"86400\";\n      });\n    }\n    #selectedPresetId = (dt7948.i(this, \"selectedPresetId\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"customHours\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #customHours = (dt7948.i(this, \"customHours\"), void 0);\n    constructor() {\n      super(...arguments);\n      const seconds = this.args.value;\n      const preset = DURATION_PRESETS.find(p => p.seconds === seconds);\n      if (preset) {\n        this.selectedPresetId = preset.id;\n      } else {\n        this.selectedPresetId = \"custom\";\n        this.customHours = Math.round(seconds / 3600);\n      }\n    }\n    get presetOptions() {\n      return DURATION_PRESETS.map(preset => ({\n        id: preset.id,\n        name: (0, _discourseI18n.i18n)(preset.nameKey),\n        seconds: preset.seconds\n      }));\n    }\n    get isCustom() {\n      return this.selectedPresetId === \"custom\";\n    }\n    get currentDurationSeconds() {\n      if (this.isCustom) {\n        return this.customHours ? this.customHours * 3600 : 0;\n      } else {\n        return parseInt(this.selectedPresetId, 10);\n      }\n    }\n    onPresetChange(value) {\n      this.selectedPresetId = value;\n      this.updateValue();\n    }\n    static {\n      dt7948.n(this.prototype, \"onPresetChange\", [_object.action]);\n    }\n    onCustomHoursChange(event) {\n      this.customHours = parseInt(event.target.value, 10);\n      this.updateValue();\n    }\n    static {\n      dt7948.n(this.prototype, \"onCustomHoursChange\", [_object.action]);\n    }\n    updateValue() {\n      if (this.args.onChange) {\n        this.args.onChange(this.currentDurationSeconds);\n      }\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"duration-selector\">\n        <ComboBox\n          @content={{this.presetOptions}}\n          @value={{this.selectedPresetId}}\n          @onChange={{this.onPresetChange}}\n          class=\"duration-selector__preset\"\n        />\n      \n        {{#if this.isCustom}}\n          <div class=\"duration-selector__custom\">\n            <input\n              type=\"number\"\n              value={{this.customHours}}\n              class=\"duration-selector__hours-input\"\n              min=\"1\"\n              {{on \"input\" this.onCustomHoursChange}}\n            />\n            <span class=\"duration-selector__hours-label\">\n              {{i18n \"discourse_ai.llms.quotas.hours\"}}\n            </span>\n          </div>\n        {{/if}}\n      </div>\n      */\n      {\n        \"id\": \"VIaRZosV\",\n        \"block\": \"[[[10,0],[14,0,\\\"duration-selector\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],[[24,0,\\\"duration-selector__preset\\\"]],[[\\\"@content\\\",\\\"@value\\\",\\\"@onChange\\\"],[[30,0,[\\\"presetOptions\\\"]],[30,0,[\\\"selectedPresetId\\\"]],[30,0,[\\\"onPresetChange\\\"]]]],null],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"isCustom\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"duration-selector__custom\\\"],[12],[1,\\\"\\\\n      \\\"],[11,\\\"input\\\"],[16,2,[30,0,[\\\"customHours\\\"]]],[24,0,\\\"duration-selector__hours-input\\\"],[24,\\\"min\\\",\\\"1\\\"],[24,4,\\\"number\\\"],[4,[32,1],[\\\"input\\\",[30,0,[\\\"onCustomHoursChange\\\"]]],null],[12],[13],[1,\\\"\\\\n      \\\"],[10,1],[14,0,\\\"duration-selector__hours-label\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,2],[\\\"discourse_ai.llms.quotas.hours\\\"],null]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-quota-duration-selector.js\",\n        \"scope\": () => [_comboBox.default, _modifier.on, _discourseI18n.i18n],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = DurationSelector;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-regen-summaries-buttons\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/lib/ajax\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _service, _dButton, _ajax, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiRegenSummariesButtons extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"toasts\", [_service.service]);\n    }\n    #toasts = (dt7948.i(this, \"toasts\"), void 0);\n    get showGistOption() {\n      return this.currentUser.can_request_gists;\n    }\n    get topicIds() {\n      return this.args.topicIds;\n    }\n    get count() {\n      return this.topicIds.length;\n    }\n    get dataPayload() {\n      return this.count === 1 ? {\n        topic_id: this.topicIds[0]\n      } : {\n        topic_ids: this.topicIds\n      };\n    }\n    async regenerateGists() {\n      this.args.onLoadingChange?.(true);\n      try {\n        await (0, _ajax.ajax)(\"/discourse-ai/summarization/regen_gist\", {\n          type: \"PUT\",\n          data: this.dataPayload\n        });\n        this.toasts.success({\n          data: {\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.summarization.topic.regenerate_gists_success\", {\n              count: this.count\n            })\n          }\n        });\n        this.args.onSuccess?.();\n      } catch {\n        this.toasts.error({\n          data: {\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.summarization.topic.regenerate_gists_error\", {\n              count: this.count\n            })\n          }\n        });\n      } finally {\n        this.args.onLoadingChange?.(false);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"regenerateGists\", [_object.action]);\n    }\n    async regenerateSummaries() {\n      this.args.onLoadingChange?.(true);\n      try {\n        await (0, _ajax.ajax)(\"/discourse-ai/summarization/regen_summary\", {\n          type: \"PUT\",\n          data: this.dataPayload\n        });\n        this.toasts.success({\n          data: {\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.summarization.topic.regenerate_topic_summary_success\", {\n              count: this.count\n            })\n          }\n        });\n        this.args.onSuccess?.();\n      } catch {\n        this.toasts.error({\n          data: {\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.summarization.topic.regenerate_topic_summary_error\", {\n              count: this.count\n            })\n          }\n        });\n      } finally {\n        this.args.onLoadingChange?.(false);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"regenerateSummaries\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.showGistOption}}\n        <DButton\n          @label=\"discourse_ai.summarization.topic.regenerate_gists_option\"\n          @icon=\"arrows-rotate\"\n          @action={{this.regenerateGists}}\n          @disabled={{@disabled}}\n          class=\"btn-primary ai-regen-gists-btn\"\n        />\n      {{/if}}\n      <DButton\n        @label=\"discourse_ai.summarization.topic.regenerate_summaries_option\"\n        @icon=\"arrows-rotate\"\n        @action={{this.regenerateSummaries}}\n        @disabled={{@disabled}}\n        class=\"btn-primary ai-regen-summaries-btn\"\n      />\n      */\n      {\n        \"id\": \"JY9sYi9U\",\n        \"block\": \"[[[41,[30,0,[\\\"showGistOption\\\"]],[[[1,\\\"  \\\"],[8,[32,0],[[24,0,\\\"btn-primary ai-regen-gists-btn\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\",\\\"@disabled\\\"],[\\\"discourse_ai.summarization.topic.regenerate_gists_option\\\",\\\"arrows-rotate\\\",[30,0,[\\\"regenerateGists\\\"]],[30,1]]],null],[1,\\\"\\\\n\\\"]],[]],null],[8,[32,0],[[24,0,\\\"btn-primary ai-regen-summaries-btn\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\",\\\"@disabled\\\"],[\\\"discourse_ai.summarization.topic.regenerate_summaries_option\\\",\\\"arrows-rotate\\\",[30,0,[\\\"regenerateSummaries\\\"]],[30,1]]],null]],[\\\"@disabled\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-regen-summaries-buttons.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiRegenSummariesButtons;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-search-discoveries-tooltip\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/float-kit/components/d-tooltip\", \"discourse/helpers/d-icon\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _dButton, _dTooltip, _dIcon, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiSearchDiscoveriesTooltip extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"discobotDiscoveries\", [_service.service]);\n    }\n    #discobotDiscoveries = (dt7948.i(this, \"discobotDiscoveries\"), void 0);\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <span class=\"ai-search-discoveries-tooltip\">\n        <DTooltip @placement=\"top-end\" @interactive={{true}}>\n          <:trigger>\n            {{icon \"circle-info\"}}\n          </:trigger>\n          <:content>\n            <div class=\"ai-search-discoveries-tooltip__content\">\n              <div class=\"ai-search-discoveries-tooltip__header\">\n                {{i18n \"discourse_ai.discobot_discoveries.tooltip.header\"}}\n              </div>\n      \n              <div class=\"ai-search-discoveries-tooltip__description\">\n                {{#if this.discobotDiscoveries.modelUsed}}\n                  {{i18n\n                    \"discourse_ai.discobot_discoveries.tooltip.content\"\n                    model=this.discobotDiscoveries.modelUsed\n                  }}\n                {{/if}}\n              </div>\n      \n              <div class=\"ai-search-discoveries-tooltip__actions\">\n                <DButton\n                  class=\"btn-transparent --primary\"\n                  @label=\"discourse_ai.discobot_discoveries.tooltip.actions.info\"\n                  @href=\"https://meta.discourse.org/t/conversational-ai-search-coming-to-discourse-ai/355939\"\n                />\n                <DButton\n                  class=\"btn-transparent btn-danger\"\n                  @label=\"discourse_ai.discobot_discoveries.tooltip.actions.disable\"\n                  @action={{this.discobotDiscoveries.disableDiscoveries}}\n                />\n              </div>\n            </div>\n          </:content>\n        </DTooltip>\n      </span>\n      */\n      {\n        \"id\": \"ynELYb7p\",\n        \"block\": \"[[[10,1],[14,0,\\\"ai-search-discoveries-tooltip\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],null,[[\\\"@placement\\\",\\\"@interactive\\\"],[\\\"top-end\\\",true]],[[\\\"trigger\\\",\\\"content\\\"],[[[[1,\\\"\\\\n      \\\"],[1,[28,[32,1],[\\\"circle-info\\\"],null]],[1,\\\"\\\\n    \\\"]],[]],[[[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"ai-search-discoveries-tooltip__content\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"ai-search-discoveries-tooltip__header\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,2],[\\\"discourse_ai.discobot_discoveries.tooltip.header\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"ai-search-discoveries-tooltip__description\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"discobotDiscoveries\\\",\\\"modelUsed\\\"]],[[[1,\\\"            \\\"],[1,[28,[32,2],[\\\"discourse_ai.discobot_discoveries.tooltip.content\\\"],[[\\\"model\\\"],[[30,0,[\\\"discobotDiscoveries\\\",\\\"modelUsed\\\"]]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[10,0],[14,0,\\\"ai-search-discoveries-tooltip__actions\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[32,3],[[24,0,\\\"btn-transparent --primary\\\"]],[[\\\"@label\\\",\\\"@href\\\"],[\\\"discourse_ai.discobot_discoveries.tooltip.actions.info\\\",\\\"https://meta.discourse.org/t/conversational-ai-search-coming-to-discourse-ai/355939\\\"]],null],[1,\\\"\\\\n          \\\"],[8,[32,3],[[24,0,\\\"btn-transparent btn-danger\\\"]],[[\\\"@label\\\",\\\"@action\\\"],[\\\"discourse_ai.discobot_discoveries.tooltip.actions.disable\\\",[30,0,[\\\"discobotDiscoveries\\\",\\\"disableDiscoveries\\\"]]]],null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\"],[13]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-search-discoveries-tooltip.js\",\n        \"scope\": () => [_dTooltip.default, _dIcon.default, _discourseI18n.i18n, _dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiSearchDiscoveriesTooltip;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-search-discoveries\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/modifier\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/render-modifiers/modifiers/did-update\", \"@ember/render-modifiers/modifiers/will-destroy\", \"@ember/service\", \"discourse/components/cook-text\", \"discourse/components/d-button\", \"discourse/helpers/concat-class\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/decorators\", \"discourse/lib/intercept-click\", \"discourse/lib/url\", \"discourse/models/topic\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-blinking-animation\", \"discourse/plugins/discourse-ai/discourse/components/ai-indicator-wave\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _modifier, _object, _didInsert, _didUpdate, _willDestroy, _service, _cookText, _dButton, _concatClass, _ajax, _ajaxError, _decorators, _interceptClick, _url, _topic, _discourseI18n, _aiBlinkingAnimation, _aiIndicatorWave, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiSearchDiscoveries extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"search\", [_service.service]);\n    }\n    #search = (dt7948.i(this, \"search\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"messageBus\", [_service.service]);\n    }\n    #messageBus = (dt7948.i(this, \"messageBus\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"discobotDiscoveries\", [_service.service]);\n    }\n    #discobotDiscoveries = (dt7948.i(this, \"discobotDiscoveries\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"appEvents\", [_service.service]);\n    }\n    #appEvents = (dt7948.i(this, \"appEvents\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"composer\", [_service.service]);\n    }\n    #composer = (dt7948.i(this, \"composer\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loadingConversationTopic\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loadingConversationTopic = (dt7948.i(this, \"loadingConversationTopic\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"fullDiscoveryToggled\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #fullDiscoveryToggled = (dt7948.i(this, \"fullDiscoveryToggled\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"discoveryPreviewLength\", [_tracking.tracked], function () {\n        return this.args.discoveryPreviewLength || 150;\n      });\n    }\n    #discoveryPreviewLength = (dt7948.i(this, \"discoveryPreviewLength\"), void 0);\n    constructor() {\n      super(...arguments);\n      this.appEvents.on(\"full-page-search:trigger-search\", this, this.triggerDiscovery);\n    }\n    willDestroy() {\n      super.willDestroy(...arguments);\n      this.appEvents.off(\"full-page-search:trigger-search\", this, this.triggerDiscovery);\n    }\n    async _updateDiscovery(update) {\n      if (this.query === update.query) {\n        this.discobotDiscoveries.onDiscoveryUpdate(update);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"_updateDiscovery\", [_decorators.bind]);\n    }\n    unsubscribe() {\n      this.messageBus.unsubscribe(\"/discourse-ai/discoveries\", this._updateDiscovery);\n    }\n    static {\n      dt7948.n(this.prototype, \"unsubscribe\", [_decorators.bind]);\n    }\n    subscribe() {\n      this.messageBus.subscribe(\"/discourse-ai/discoveries\", this._updateDiscovery);\n    }\n    static {\n      dt7948.n(this.prototype, \"subscribe\", [_decorators.bind]);\n    }\n    get query() {\n      return this.args?.searchTerm || this.search.activeGlobalSearchTerm;\n    }\n    get toggleLabel() {\n      if (this.fullDiscoveryToggled) {\n        return \"discourse_ai.discobot_discoveries.collapse\";\n      } else {\n        return \"discourse_ai.discobot_discoveries.tell_me_more\";\n      }\n    }\n    get toggleIcon() {\n      if (this.fullDiscoveryToggled) {\n        return \"chevron-up\";\n      } else {\n        return \"\";\n      }\n    }\n    get canShowExpandtoggle() {\n      return !this.discobotDiscoveries.loadingDiscoveries && this.discobotDiscoveries.streamedText.length > this.discoveryPreviewLength;\n    }\n    get renderPreviewOnly() {\n      return !this.fullDiscoveryToggled && this.canShowExpandtoggle;\n    }\n    get canContinueConversation() {\n      const personas = this.currentUser?.ai_enabled_personas;\n      if (!personas) {\n        return false;\n      }\n      if (this.discobotDiscoveries.discoveryTimedOut) {\n        return false;\n      }\n      const discoverPersona = personas.find(persona => persona.id === parseInt(this.siteSettings?.ai_discover_persona, 10));\n      const discoverPersonaHasBot = discoverPersona?.username;\n      return this.discobotDiscoveries.discovery?.length > 0 && !this.discobotDiscoveries.isStreaming && discoverPersonaHasBot;\n    }\n    get continueConvoBtnLabel() {\n      if (this.loadingConversationTopic) {\n        return \"discourse_ai.discobot_discoveries.loading_convo\";\n      }\n      return \"discourse_ai.discobot_discoveries.continue_convo\";\n    }\n    async triggerDiscovery() {\n      this.discobotDiscoveries.triggerDiscovery(this.query);\n    }\n    static {\n      dt7948.n(this.prototype, \"triggerDiscovery\", [_object.action]);\n    }\n    toggleDiscovery() {\n      this.fullDiscoveryToggled = !this.fullDiscoveryToggled;\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleDiscovery\", [_object.action]);\n    }\n    handleDiscoveryClick(event) {\n      const target = event.target;\n      const link = target.closest(\"a\");\n      if (!link) {\n        return;\n      }\n      if ((0, _interceptClick.wantsNewWindow)(event)) {\n        return;\n      }\n      event.preventDefault();\n      _url.default.routeTo(link.href);\n      if (this.args.closeSearchMenu) {\n        this.args.closeSearchMenu();\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"handleDiscoveryClick\", [_object.action]);\n    }\n    async continueConversation() {\n      const data = {\n        query: this.query,\n        context: this.discobotDiscoveries.discovery\n      };\n      try {\n        this.loadingConversationTopic = true;\n        const continueRequest = await (0, _ajax.ajax)(`/discourse-ai/discoveries/continue-convo`, {\n          type: \"POST\",\n          data\n        });\n        const topicJSON = await _topic.default.find(continueRequest.topic_id, {});\n        const topic = _topic.default.create(topicJSON);\n        _url.default.routeTo(`/t/${continueRequest.topic_id}`, {\n          afterRouteComplete: () => {\n            if (this.args.closeSearchMenu) {\n              this.args.closeSearchMenu();\n            }\n            this.composer.focusComposer({\n              topic\n            });\n          }\n        });\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        this.loadingConversationTopic = false;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"continueConversation\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div\n        class=\"ai-search-discoveries\"\n        {{didInsert this.subscribe this.query}}\n        {{didUpdate this.subscribe this.query}}\n        {{didInsert this.triggerDiscovery this.query}}\n        {{willDestroy this.unsubscribe}}\n      >\n        <div class=\"ai-search-discoveries__completion\">\n          {{#if this.discobotDiscoveries.loadingDiscoveries}}\n            <AiBlinkingAnimation />\n          {{else if this.discobotDiscoveries.discoveryTimedOut}}\n            {{i18n \"discourse_ai.discobot_discoveries.timed_out\"}}\n          {{else}}\n            {{! template-lint-disable no-invalid-interactive }}\n            <article\n              class={{concatClass\n                \"ai-search-discoveries__discovery\"\n                (if this.renderPreviewOnly \"preview\")\n                (if this.discobotDiscoveries.isStreaming \"streaming\")\n                \"streamable-content\"\n              }}\n              {{on \"click\" this.handleDiscoveryClick}}\n            >\n              <CookText\n                @rawText={{this.discobotDiscoveries.streamedText}}\n                class=\"cooked\"\n              />\n            </article>\n      \n            {{#if this.canShowExpandtoggle}}\n              <DButton\n                class=\"btn-flat btn-text ai-search-discoveries__toggle\"\n                @label={{this.toggleLabel}}\n                @icon={{this.toggleIcon}}\n                @action={{this.toggleDiscovery}}\n              />\n            {{/if}}\n          {{/if}}\n        </div>\n      \n        {{#if this.canContinueConversation}}\n          <div class=\"ai-search-discoveries__continue-conversation\">\n            <DButton\n              @action={{this.continueConversation}}\n              @label={{this.continueConvoBtnLabel}}\n              class=\"btn-default btn-small\"\n            >\n              <AiIndicatorWave @loading={{this.loadingConversationTopic}} />\n            </DButton>\n          </div>\n        {{/if}}\n      </div>\n      */\n      {\n        \"id\": \"RskGwHvZ\",\n        \"block\": \"[[[11,0],[24,0,\\\"ai-search-discoveries\\\"],[4,[32,0],[[30,0,[\\\"subscribe\\\"]],[30,0,[\\\"query\\\"]]],null],[4,[32,1],[[30,0,[\\\"subscribe\\\"]],[30,0,[\\\"query\\\"]]],null],[4,[32,0],[[30,0,[\\\"triggerDiscovery\\\"]],[30,0,[\\\"query\\\"]]],null],[4,[32,2],[[30,0,[\\\"unsubscribe\\\"]]],null],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"ai-search-discoveries__completion\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"discobotDiscoveries\\\",\\\"loadingDiscoveries\\\"]],[[[1,\\\"      \\\"],[8,[32,3],null,null,null],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,0,[\\\"discobotDiscoveries\\\",\\\"discoveryTimedOut\\\"]],[[[1,\\\"      \\\"],[1,[28,[32,4],[\\\"discourse_ai.discobot_discoveries.timed_out\\\"],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[11,\\\"article\\\"],[16,0,[28,[32,5],[\\\"ai-search-discoveries__discovery\\\",[52,[30,0,[\\\"renderPreviewOnly\\\"]],\\\"preview\\\"],[52,[30,0,[\\\"discobotDiscoveries\\\",\\\"isStreaming\\\"]],\\\"streaming\\\"],\\\"streamable-content\\\"],null]],[4,[32,6],[\\\"click\\\",[30,0,[\\\"handleDiscoveryClick\\\"]]],null],[12],[1,\\\"\\\\n        \\\"],[8,[32,7],[[24,0,\\\"cooked\\\"]],[[\\\"@rawText\\\"],[[30,0,[\\\"discobotDiscoveries\\\",\\\"streamedText\\\"]]]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"canShowExpandtoggle\\\"]],[[[1,\\\"        \\\"],[8,[32,8],[[24,0,\\\"btn-flat btn-text ai-search-discoveries__toggle\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\"],[[30,0,[\\\"toggleLabel\\\"]],[30,0,[\\\"toggleIcon\\\"]],[30,0,[\\\"toggleDiscovery\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"]],[]]]],[]]],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"canContinueConversation\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"ai-search-discoveries__continue-conversation\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,8],[[24,0,\\\"btn-default btn-small\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"continueConversation\\\"]],[30,0,[\\\"continueConvoBtnLabel\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[32,9],null,[[\\\"@loading\\\"],[[30,0,[\\\"loadingConversationTopic\\\"]]]],null],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-search-discoveries.js\",\n        \"scope\": () => [_didInsert.default, _didUpdate.default, _willDestroy.default, _aiBlinkingAnimation.default, _discourseI18n.i18n, _concatClass.default, _modifier.on, _cookText.default, _dButton.default, _aiIndicatorWave.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiSearchDiscoveries;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-sentiment-horizontal-bar\", [\"exports\", \"@ember/helper\", \"@ember/template\", \"discourse/float-kit/components/d-tooltip\", \"discourse/truth-helpers\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _helper, _template, _dTooltip, _truthHelpers, _discourseI18n, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const AiSentimentHorizontalBar = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    {{#if (gt @score 0)}}\n    <DTooltip\n      class={{concat \"sentiment-horizontal-bar__\" @type}}\n      style={{htmlSafe (concat \"width: \" @width \"%\")}}\n    >\n      <:trigger>\n        <span class=\"sentiment-horizontal-bar__count\">\n          {{@score}}\n        </span>\n      </:trigger>\n      <:content>\n        {{i18n\n          (concat\n            \"discourse_ai.sentiments.sentiment_analysis.filter_types.\" @type\n          )\n        }}:\n        {{@score}}\n      </:content>\n    </DTooltip>\n  {{/if}}\n  */\n  {\n    \"id\": \"OKBATw4W\",\n    \"block\": \"[[[41,[28,[32,0],[[30,1],0],null],[[[1,\\\"  \\\"],[8,[32,1],[[16,0,[28,[32,2],[\\\"sentiment-horizontal-bar__\\\",[30,2]],null]],[16,5,[28,[32,3],[[28,[32,2],[\\\"width: \\\",[30,3],\\\"%\\\"],null]],null]]],null,[[\\\"trigger\\\",\\\"content\\\"],[[[[1,\\\"\\\\n      \\\"],[10,1],[14,0,\\\"sentiment-horizontal-bar__count\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[30,1]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"]],[]],[[[1,\\\"\\\\n      \\\"],[1,[28,[32,4],[[28,[32,2],[\\\"discourse_ai.sentiments.sentiment_analysis.filter_types.\\\",[30,2]],null]],null]],[1,\\\":\\\\n      \\\"],[1,[30,1]],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@score\\\",\\\"@type\\\",\\\"@width\\\"],[\\\"if\\\"]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-sentiment-horizontal-bar.js\",\n    \"scope\": () => [_truthHelpers.gt, _dTooltip.default, _helper.concat, _template.htmlSafe, _discourseI18n.i18n],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"ai-sentiment-horizontal-bar:AiSentimentHorizontalBar\"));\n  var _default = _exports.default = AiSentimentHorizontalBar;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-spam\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"@ember/routing\", \"@ember/service\", \"discourse/admin/components/admin-config-area-card\", \"discourse/components/d-button\", \"discourse/components/d-page-subheader\", \"discourse/components/d-stat-tiles\", \"discourse/components/d-toggle-switch\", \"discourse/float-kit/components/d-tooltip\", \"discourse/helpers/d-icon\", \"discourse/helpers/with-event-value\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/get-url\", \"discourse/select-kit/components/combo-box\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/modal/spam-test-modal\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _routing, _service, _adminConfigAreaCard, _dButton, _dPageSubheader, _dStatTiles, _dToggleSwitch, _dTooltip, _dIcon, _withEventValue, _ajax, _ajaxError, _getUrl, _comboBox, _discourseI18n, _spamTestModal, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiSpam extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"toasts\", [_service.service]);\n    }\n    #toasts = (dt7948.i(this, \"toasts\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"stats\", [_tracking.tracked], function () {\n        return {\n          scanned_count: 0,\n          spam_detected: 0,\n          false_positives: 0,\n          false_negatives: 0,\n          daily_data: []\n        };\n      });\n    }\n    #stats = (dt7948.i(this, \"stats\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isEnabled\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isEnabled = (dt7948.i(this, \"isEnabled\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedLLM\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #selectedLLM = (dt7948.i(this, \"selectedLLM\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedPersonaId\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #selectedPersonaId = (dt7948.i(this, \"selectedPersonaId\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"customInstructions\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #customInstructions = (dt7948.i(this, \"customInstructions\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"errors\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #errors = (dt7948.i(this, \"errors\"), void 0);\n    constructor() {\n      super(...arguments);\n      this.initializeFromModel();\n      if (this.args.model?.spam_scanning_user?.admin === false) {\n        this.errors.push({\n          message: (0, _discourseI18n.i18n)(\"discourse_ai.spam.errors.scan_not_admin.message\"),\n          button: {\n            label: (0, _discourseI18n.i18n)(\"discourse_ai.spam.errors.scan_not_admin.action\"),\n            action: this.fixScanUserNotAdmin\n          }\n        });\n      }\n    }\n    async fixScanUserNotAdmin() {\n      const spamScanningUser = this.args.model.spam_scanning_user;\n      if (!spamScanningUser || spamScanningUser.admin) {\n        return;\n      }\n      try {\n        const response = await (0, _ajax.ajax)(`/admin/plugins/discourse-ai/ai-spam/fix-errors`, {\n          type: \"POST\",\n          data: {\n            error: \"spam_scanner_not_admin\"\n          }\n        });\n        if (response.success) {\n          this.toasts.success({\n            data: {\n              message: (0, _discourseI18n.i18n)(\"discourse_ai.spam.errors.resolved\")\n            },\n            duration: \"short\"\n          });\n        }\n      } catch (error) {\n        (0, _ajaxError.popupAjaxError)(error);\n      } finally {\n        window.location.reload();\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"fixScanUserNotAdmin\", [_object.action]);\n    }\n    initializeFromModel() {\n      const model = this.args.model;\n      this.isEnabled = model.is_enabled;\n      if (model.llm_id) {\n        this.selectedLLM = model.llm_id;\n      } else {\n        if (this.availableLLMs.length) {\n          this.selectedLLM = this.availableLLMs[0].id;\n          this.autoSelectedLLM = true;\n        }\n      }\n      this.customInstructions = model.custom_instructions;\n      this.stats = model.stats;\n      this.selectedPersonaId = model.ai_persona_id;\n    }\n    static {\n      dt7948.n(this.prototype, \"initializeFromModel\", [_object.action]);\n    }\n    get availableLLMs() {\n      return this.args.model?.available_llms || [];\n    }\n    async toggleEnabled() {\n      this.isEnabled = !this.isEnabled;\n      const data = {\n        is_enabled: this.isEnabled\n      };\n      if (this.autoSelectedLLM) {\n        data.llm_model_id = this.llmId;\n      }\n      try {\n        const response = await (0, _ajax.ajax)(\"/admin/plugins/discourse-ai/ai-spam.json\", {\n          type: \"PUT\",\n          data\n        });\n        this.autoSelectedLLM = false;\n        this.isEnabled = response.is_enabled;\n      } catch (error) {\n        this.isEnabled = !this.isEnabled;\n        (0, _ajaxError.popupAjaxError)(error);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleEnabled\", [_object.action]);\n    }\n    get llmId() {\n      return this.selectedLLM;\n    }\n    async updateLLM(value) {\n      this.selectedLLM = value;\n    }\n    static {\n      dt7948.n(this.prototype, \"updateLLM\", [_object.action]);\n    }\n    async updatePersona(value) {\n      this.selectedPersonaId = value;\n    }\n    static {\n      dt7948.n(this.prototype, \"updatePersona\", [_object.action]);\n    }\n    async save() {\n      try {\n        await (0, _ajax.ajax)(\"/admin/plugins/discourse-ai/ai-spam.json\", {\n          type: \"PUT\",\n          data: {\n            llm_model_id: this.llmId,\n            custom_instructions: this.customInstructions,\n            ai_persona_id: this.selectedPersonaId\n          }\n        });\n        this.toasts.success({\n          data: {\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.spam.settings_saved\")\n          },\n          duration: \"short\"\n        });\n      } catch (error) {\n        (0, _ajaxError.popupAjaxError)(error);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"save\", [_object.action]);\n    }\n    showTestModal() {\n      this.modal.show(_spamTestModal.default, {\n        model: {\n          customInstructions: this.customInstructions,\n          llmId: this.llmId\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"showTestModal\", [_object.action]);\n    }\n    get metrics() {\n      const detected = {\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.spam.spam_detected\"),\n        value: this.stats.spam_detected\n      };\n      const falsePositives = {\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.spam.false_positives\"),\n        value: this.stats.false_positives,\n        tooltip: (0, _discourseI18n.i18n)(\"discourse_ai.spam.stat_tooltips.incorrectly_flagged\")\n      };\n      const falseNegatives = {\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.spam.false_negatives\"),\n        value: this.stats.false_negatives,\n        tooltip: (0, _discourseI18n.i18n)(\"discourse_ai.spam.stat_tooltips.missed_spam\")\n      };\n      if (this.args.model.flagging_username) {\n        detected.href = (0, _getUrl.default)(`/review?flagged_by=${this.args.model.flagging_username}&status=all&sort_order=created_at`);\n        falsePositives.href = (0, _getUrl.default)(`/review?flagged_by=${this.args.model.flagging_username}&status=rejected&sort_order=created_at`);\n        falseNegatives.href = (0, _getUrl.default)(`/review?status=approved&sort_order=created_at&additional_filters={\"ai_spam_false_negative\":true}&order=created&score_type=${this.args.model.spam_score_type}`);\n      }\n      return [{\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.spam.scanned_count\"),\n        value: this.stats.scanned_count\n      }, detected, falsePositives, falseNegatives];\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"ai-spam\">\n        <section class=\"ai-spam__settings\">\n          <div class=\"ai-spam__errors\">\n            {{#each this.errors as |e|}}\n              <div class=\"alert alert-error\">\n                {{icon \"triangle-exclamation\"}}\n                <p>{{e.message}}</p>\n                <DButton\n                  @action={{e.button.action}}\n                  @translatedLabel={{e.button.label}}\n                />\n              </div>\n            {{/each}}\n          </div>\n          <DPageSubheader\n            @titleLabel={{i18n \"discourse_ai.spam.title\"}}\n            @descriptionLabel={{i18n \"discourse_ai.spam.spam_description\"}}\n          />\n          <div class=\"control-group ai-spam__enabled\">\n            <DToggleSwitch\n              class=\"ai-spam__toggle\"\n              @state={{this.isEnabled}}\n              @label=\"discourse_ai.spam.enable\"\n              {{on \"click\" this.toggleEnabled}}\n            />\n            <DTooltip\n              @icon=\"circle-question\"\n              @content={{i18n \"discourse_ai.spam.spam_tip\"}}\n            />\n          </div>\n      \n          <div class=\"ai-spam__llm\">\n            <label class=\"ai-spam__llm-label\">{{i18n\n                \"discourse_ai.spam.select_llm\"\n              }}</label>\n            {{#if this.availableLLMs.length}}\n              <ComboBox\n                @value={{this.selectedLLM}}\n                @content={{this.availableLLMs}}\n                @onChange={{this.updateLLM}}\n                class=\"ai-spam__llm-selector\"\n              />\n            {{else}}\n              <span class=\"ai-spam__llm-placeholder\">\n                <LinkTo @route=\"adminPlugins.show.discourse-ai-llms.index\">\n                  {{i18n \"discourse_ai.spam.no_llms\"}}\n                </LinkTo>\n              </span>\n            {{/if}}\n          </div>\n      \n          <div class=\"ai-spam__persona\">\n            <label class=\"ai-spam__persona-label\">{{i18n\n                \"discourse_ai.spam.select_persona\"\n              }}</label>\n            <ComboBox\n              @value={{this.selectedPersonaId}}\n              @content={{@model.available_personas}}\n              @onChange={{this.updatePersona}}\n              class=\"ai-spam__persona-selector\"\n            />\n          </div>\n      \n          <div class=\"ai-spam__instructions\">\n            <label class=\"ai-spam__instructions-label\">\n              {{i18n \"discourse_ai.spam.custom_instructions\"}}\n              <DTooltip\n                @icon=\"circle-question\"\n                @content={{i18n \"discourse_ai.spam.custom_instructions_help\"}}\n              />\n            </label>\n            <textarea\n              class=\"ai-spam__instructions-input\"\n              placeholder={{i18n\n                \"discourse_ai.spam.custom_instructions_placeholder\"\n              }}\n              {{on \"input\" (withEventValue (fn (mut this.customInstructions)))}}\n            >{{this.customInstructions}}</textarea>\n            <DButton\n              @action={{this.save}}\n              @label=\"discourse_ai.spam.save_button\"\n              class=\"ai-spam__instructions-save btn-primary\"\n            />\n            <DButton\n              @action={{this.showTestModal}}\n              @label=\"discourse_ai.spam.test_button\"\n              class=\"btn-default\"\n            />\n          </div>\n        </section>\n      \n        <AdminConfigAreaCard\n          @heading=\"discourse_ai.spam.last_seven_days\"\n          class=\"ai-spam__stats\"\n        >\n          <:content>\n            <DStatTiles as |tiles|>\n              {{#each this.metrics as |metric|}}\n                <tiles.Tile\n                  @label={{metric.label}}\n                  @url={{metric.href}}\n                  @value={{metric.value}}\n                  @tooltip={{metric.tooltip}}\n                />\n              {{/each}}\n            </DStatTiles>\n          </:content>\n        </AdminConfigAreaCard>\n      </div>\n      */\n      {\n        \"id\": \"xylBCkJy\",\n        \"block\": \"[[[10,0],[14,0,\\\"ai-spam\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"section\\\"],[14,0,\\\"ai-spam__settings\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-spam__errors\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"errors\\\"]]],null]],null],null,[[[1,\\\"        \\\"],[10,0],[14,0,\\\"alert alert-error\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,0],[\\\"triangle-exclamation\\\"],null]],[1,\\\"\\\\n          \\\"],[10,2],[12],[1,[30,1,[\\\"message\\\"]]],[13],[1,\\\"\\\\n          \\\"],[8,[32,1],null,[[\\\"@action\\\",\\\"@translatedLabel\\\"],[[30,1,[\\\"button\\\",\\\"action\\\"]],[30,1,[\\\"button\\\",\\\"label\\\"]]]],null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[8,[32,2],null,[[\\\"@titleLabel\\\",\\\"@descriptionLabel\\\"],[[28,[32,3],[\\\"discourse_ai.spam.title\\\"],null],[28,[32,3],[\\\"discourse_ai.spam.spam_description\\\"],null]]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"control-group ai-spam__enabled\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,4],[[24,0,\\\"ai-spam__toggle\\\"],[4,[32,5],[\\\"click\\\",[30,0,[\\\"toggleEnabled\\\"]]],null]],[[\\\"@state\\\",\\\"@label\\\"],[[30,0,[\\\"isEnabled\\\"]],\\\"discourse_ai.spam.enable\\\"]],null],[1,\\\"\\\\n      \\\"],[8,[32,6],null,[[\\\"@icon\\\",\\\"@content\\\"],[\\\"circle-question\\\",[28,[32,3],[\\\"discourse_ai.spam.spam_tip\\\"],null]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"ai-spam__llm\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,0,\\\"ai-spam__llm-label\\\"],[12],[1,[28,[32,3],[\\\"discourse_ai.spam.select_llm\\\"],null]],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"availableLLMs\\\",\\\"length\\\"]],[[[1,\\\"        \\\"],[8,[32,7],[[24,0,\\\"ai-spam__llm-selector\\\"]],[[\\\"@value\\\",\\\"@content\\\",\\\"@onChange\\\"],[[30,0,[\\\"selectedLLM\\\"]],[30,0,[\\\"availableLLMs\\\"]],[30,0,[\\\"updateLLM\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"ai-spam__llm-placeholder\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[32,8],null,[[\\\"@route\\\"],[\\\"adminPlugins.show.discourse-ai-llms.index\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[1,[28,[32,3],[\\\"discourse_ai.spam.no_llms\\\"],null]],[1,\\\"\\\\n          \\\"]],[]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"ai-spam__persona\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,0,\\\"ai-spam__persona-label\\\"],[12],[1,[28,[32,3],[\\\"discourse_ai.spam.select_persona\\\"],null]],[13],[1,\\\"\\\\n      \\\"],[8,[32,7],[[24,0,\\\"ai-spam__persona-selector\\\"]],[[\\\"@value\\\",\\\"@content\\\",\\\"@onChange\\\"],[[30,0,[\\\"selectedPersonaId\\\"]],[30,2,[\\\"available_personas\\\"]],[30,0,[\\\"updatePersona\\\"]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"ai-spam__instructions\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[14,0,\\\"ai-spam__instructions-label\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,3],[\\\"discourse_ai.spam.custom_instructions\\\"],null]],[1,\\\"\\\\n        \\\"],[8,[32,6],null,[[\\\"@icon\\\",\\\"@content\\\"],[\\\"circle-question\\\",[28,[32,3],[\\\"discourse_ai.spam.custom_instructions_help\\\"],null]]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[11,\\\"textarea\\\"],[24,0,\\\"ai-spam__instructions-input\\\"],[16,\\\"placeholder\\\",[28,[32,3],[\\\"discourse_ai.spam.custom_instructions_placeholder\\\"],null]],[4,[32,5],[\\\"input\\\",[28,[32,9],[[28,[32,10],[[28,[31,3],[[30,0,[\\\"customInstructions\\\"]]],null]],null]],null]],null],[12],[1,[30,0,[\\\"customInstructions\\\"]]],[13],[1,\\\"\\\\n      \\\"],[8,[32,1],[[24,0,\\\"ai-spam__instructions-save btn-primary\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"save\\\"]],\\\"discourse_ai.spam.save_button\\\"]],null],[1,\\\"\\\\n      \\\"],[8,[32,1],[[24,0,\\\"btn-default\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"showTestModal\\\"]],\\\"discourse_ai.spam.test_button\\\"]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[8,[32,11],[[24,0,\\\"ai-spam__stats\\\"]],[[\\\"@heading\\\"],[\\\"discourse_ai.spam.last_seven_days\\\"]],[[\\\"content\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[32,12],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"metrics\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[8,[30,3,[\\\"Tile\\\"]],null,[[\\\"@label\\\",\\\"@url\\\",\\\"@value\\\",\\\"@tooltip\\\"],[[30,4,[\\\"label\\\"]],[30,4,[\\\"href\\\"]],[30,4,[\\\"value\\\"]],[30,4,[\\\"tooltip\\\"]]]],null],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"      \\\"]],[3]]]]],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\"],[13]],[\\\"e\\\",\\\"@model\\\",\\\"tiles\\\",\\\"metric\\\"],[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\",\\\"mut\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-spam.js\",\n        \"scope\": () => [_dIcon.default, _dButton.default, _dPageSubheader.default, _discourseI18n.i18n, _dToggleSwitch.default, _modifier.on, _dTooltip.default, _comboBox.default, _routing.LinkTo, _withEventValue.default, _helper.fn, _adminConfigAreaCard.default, _dStatTiles.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiSpam;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-split-topic-suggester\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/float-kit/components/d-menu\", \"discourse/helpers/category-badge\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/array-tools\", \"discourse/truth-helpers\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _service, _dButton, _dMenu, _categoryBadge, _ajax, _ajaxError, _arrayTools, _truthHelpers, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiSplitTopicSuggester extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"site\", [_service.service]);\n    }\n    #site = (dt7948.i(this, \"site\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"suggestions\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #suggestions = (dt7948.i(this, \"suggestions\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"icon\", [_tracking.tracked], function () {\n        return \"discourse-sparkles\";\n      });\n    }\n    #icon = (dt7948.i(this, \"icon\"), void 0);\n    SUGGESTION_TYPES = {\n      title: \"suggest_title\",\n      category: \"suggest_category\",\n      tag: \"suggest_tags\"\n    };\n    get input() {\n      return this.args.selectedPosts.map(item => item.cooked).join(\"\\n\");\n    }\n    get disabled() {\n      return this.loading || this.suggestions.length > 0;\n    }\n    loadSuggestions() {\n      if (this.loading || this.suggestions.length > 0) {\n        return;\n      }\n      this.loading = true;\n      (0, _ajax.ajax)(`/discourse-ai/ai-helper/${this.args.mode}`, {\n        method: \"POST\",\n        data: {\n          text: this.input\n        }\n      }).then(result => {\n        if (this.args.mode === this.SUGGESTION_TYPES.title) {\n          this.suggestions = result.suggestions;\n        } else if (this.args.mode === this.SUGGESTION_TYPES.category) {\n          const suggestionIds = result.assistant.map(s => s.id);\n          const suggestedCategories = this.site.categories.filter(category => suggestionIds.includes(category.id));\n          this.suggestions = suggestedCategories;\n        } else if (this.args.mode === this.SUGGESTION_TYPES.tag) {\n          this.suggestions = result.assistant.map(s => {\n            return {\n              name: s.name,\n              count: s.count\n            };\n          });\n        }\n      }).catch(_ajaxError.popupAjaxError).finally(() => {\n        this.loading = false;\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"loadSuggestions\", [_object.action]);\n    }\n    applySuggestion(suggestion, menu) {\n      if (!this.args.mode) {\n        return;\n      }\n      if (this.args.mode === this.SUGGESTION_TYPES.title) {\n        this.args.updateAction(suggestion);\n        return menu.close();\n      }\n      if (this.args.mode === this.SUGGESTION_TYPES.category) {\n        this.args.updateAction(suggestion.id);\n        return menu.close();\n      }\n      if (this.args.mode === this.SUGGESTION_TYPES.tag) {\n        if (this.args.currentValue) {\n          if (Array.isArray(this.args.currentValue)) {\n            const updatedTags = [...this.args.currentValue, suggestion];\n            this.args.updateAction((0, _arrayTools.uniqueItemsFromArray)(updatedTags));\n          } else {\n            const updatedTags = [this.args.currentValue, suggestion];\n            this.args.updateAction((0, _arrayTools.uniqueItemsFromArray)(updatedTags));\n          }\n        } else {\n          if (Array.isArray(suggestion)) {\n            this.args.updateAction([...suggestion]);\n          } else {\n            this.args.updateAction([suggestion]);\n          }\n        }\n        return menu.close();\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"applySuggestion\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.loading}}\n        {{!\n          Dynamically changing @icon of DMenu\n          causes it to rerender after load and\n          close the menu once data is loaded.\n          This workaround mimics an icon change of\n          the button by adding an overlapping\n          disabled button while loading}}\n        <DButton\n          class=\"ai-split-topic-loading-placeholder\"\n          @disabled={{true}}\n          @icon=\"spinner\"\n        />\n      {{/if}}\n      <DMenu\n        @icon=\"discourse-sparkles\"\n        @interactive={{true}}\n        @identifier=\"ai-split-topic-suggestion-menu\"\n        class=\"ai-split-topic-suggestion-button\"\n        data-suggestion-mode={{@mode}}\n        {{on \"click\" this.loadSuggestions}}\n        as |menu|\n      >\n        <ul class=\"ai-split-topic-suggestion__results\">\n          {{#unless this.loading}}\n            {{#each this.suggestions as |suggestion index|}}\n              {{#if (eq @mode \"suggest_category\")}}\n                <li\n                  data-name={{suggestion.name}}\n                  data-value={{suggestion.id}}\n                  class=\"ai-split-topic-suggestion__category-result\"\n                  role=\"button\"\n                  {{on \"click\" (fn this.applySuggestion suggestion menu)}}\n                >\n                  {{categoryBadge suggestion}}\n                  <span class=\"topic-count\">x\n                    {{suggestion.totalTopicCount}}</span>\n                </li>\n              {{else if (eq @mode \"suggest_tags\")}}\n                <li data-name={{suggestion.name}} data-value={{index}}>\n                  <DButton\n                    @translatedLabel={{suggestion.name}}\n                    @action={{fn this.applySuggestion suggestion.name menu}}\n                  >\n                    <span class=\"topic-count\">x{{suggestion.count}}</span>\n                  </DButton>\n                </li>\n              {{else}}\n                <li data-name={{suggestion}} data-value={{index}}>\n                  <DButton\n                    @translatedLabel={{suggestion}}\n                    @action={{fn this.applySuggestion suggestion menu}}\n                  />\n                </li>\n              {{/if}}\n            {{/each}}\n          {{/unless}}\n        </ul>\n      </DMenu>\n      */\n      {\n        \"id\": \"FJ/vCekw\",\n        \"block\": \"[[[41,[30,0,[\\\"loading\\\"]],[[[1,\\\"  \\\"],[8,[32,0],[[24,0,\\\"ai-split-topic-loading-placeholder\\\"]],[[\\\"@disabled\\\",\\\"@icon\\\"],[true,\\\"spinner\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[8,[32,1],[[24,0,\\\"ai-split-topic-suggestion-button\\\"],[16,\\\"data-suggestion-mode\\\",[30,1]],[4,[32,2],[\\\"click\\\",[30,0,[\\\"loadSuggestions\\\"]]],null]],[[\\\"@icon\\\",\\\"@interactive\\\",\\\"@identifier\\\"],[\\\"discourse-sparkles\\\",true,\\\"ai-split-topic-suggestion-menu\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[10,\\\"ul\\\"],[14,0,\\\"ai-split-topic-suggestion__results\\\"],[12],[1,\\\"\\\\n\\\"],[41,[51,[30,0,[\\\"loading\\\"]]],[[[42,[28,[31,3],[[28,[31,3],[[30,0,[\\\"suggestions\\\"]]],null]],null],null,[[[41,[28,[32,3],[[30,1],\\\"suggest_category\\\"],null],[[[1,\\\"          \\\"],[11,\\\"li\\\"],[16,\\\"data-name\\\",[30,3,[\\\"name\\\"]]],[16,\\\"data-value\\\",[30,3,[\\\"id\\\"]]],[24,0,\\\"ai-split-topic-suggestion__category-result\\\"],[24,\\\"role\\\",\\\"button\\\"],[4,[32,2],[\\\"click\\\",[28,[32,4],[[30,0,[\\\"applySuggestion\\\"]],[30,3],[30,2]],null]],null],[12],[1,\\\"\\\\n            \\\"],[1,[28,[32,5],[[30,3]],null]],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"topic-count\\\"],[12],[1,\\\"x\\\\n              \\\"],[1,[30,3,[\\\"totalTopicCount\\\"]]],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,3],[[30,1],\\\"suggest_tags\\\"],null],[[[1,\\\"          \\\"],[10,\\\"li\\\"],[15,\\\"data-name\\\",[30,3,[\\\"name\\\"]]],[15,\\\"data-value\\\",[30,4]],[12],[1,\\\"\\\\n            \\\"],[8,[32,0],null,[[\\\"@translatedLabel\\\",\\\"@action\\\"],[[30,3,[\\\"name\\\"]],[28,[32,4],[[30,0,[\\\"applySuggestion\\\"]],[30,3,[\\\"name\\\"]],[30,2]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n              \\\"],[10,1],[14,0,\\\"topic-count\\\"],[12],[1,\\\"x\\\"],[1,[30,3,[\\\"count\\\"]]],[13],[1,\\\"\\\\n            \\\"]],[]]]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[10,\\\"li\\\"],[15,\\\"data-name\\\",[30,3]],[15,\\\"data-value\\\",[30,4]],[12],[1,\\\"\\\\n            \\\"],[8,[32,0],null,[[\\\"@translatedLabel\\\",\\\"@action\\\"],[[30,3],[28,[32,4],[[30,0,[\\\"applySuggestion\\\"]],[30,3],[30,2]],null]]],null],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"]],[]]]],[]]]],[3,4]],null]],[]],null],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\"]],[2]]]]]],[\\\"@mode\\\",\\\"menu\\\",\\\"suggestion\\\",\\\"index\\\"],[\\\"if\\\",\\\"unless\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-split-topic-suggester.js\",\n        \"scope\": () => [_dButton.default, _dMenu.default, _modifier.on, _truthHelpers.eq, _helper.fn, _categoryBadge.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiSplitTopicSuggester;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-summary-skeleton\", [\"exports\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-blinking-animation\", \"discourse/plugins/discourse-ai/discourse/components/ai-indicator-wave\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _discourseI18n, _aiBlinkingAnimation, _aiIndicatorWave, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const AiSummarySkeleton = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"ai-summary__container\">\n    <AiBlinkingAnimation />\n  \n    <span>\n      <div class=\"ai-summary__generating-text\">\n        {{i18n \"summary.in_progress\"}}\n      </div>\n      <AiIndicatorWave @loading={{true}} />\n    </span>\n  </div>\n  */\n  {\n    \"id\": \"K0towwA6\",\n    \"block\": \"[[[10,0],[14,0,\\\"ai-summary__container\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],null,null,null],[1,\\\"\\\\n\\\\n  \\\"],[10,1],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-summary__generating-text\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[32,1],[\\\"summary.in_progress\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[8,[32,2],null,[[\\\"@loading\\\"],[true]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[],[]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-summary-skeleton.js\",\n    \"scope\": () => [_aiBlinkingAnimation.default, _discourseI18n.i18n, _aiIndicatorWave.default],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"ai-summary-skeleton:AiSummarySkeleton\"));\n  var _default = _exports.default = AiSummarySkeleton;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-tool-editor-form\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/service\", \"discourse/components/form\", \"discourse/lib/ajax-error\", \"discourse/lib/array-tools\", \"discourse/lib/get-url\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/utilities\", \"discourse/plugins/discourse-ai/discourse/components/modal/ai-tool-test-modal\", \"discourse/plugins/discourse-ai/discourse/components/rag-options-fk\", \"discourse/plugins/discourse-ai/discourse/components/rag-uploader\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _service, _form, _ajaxError, _arrayTools, _getUrl, _truthHelpers, _discourseI18n, _utilities, _aiToolTestModal, _ragOptionsFk, _ragUploader, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiToolEditorForm extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"dialog\", [_service.service]);\n    }\n    #dialog = (dt7948.i(this, \"dialog\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"toasts\", [_service.service]);\n    }\n    #toasts = (dt7948.i(this, \"toasts\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"uploadedFiles\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #uploadedFiles = (dt7948.i(this, \"uploadedFiles\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isSaving\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isSaving = (dt7948.i(this, \"isSaving\"), void 0);\n    PARAMETER_TYPES = [{\n      name: \"string\",\n      id: \"string\"\n    }, {\n      name: \"number\",\n      id: \"number\"\n    }, {\n      name: \"boolean\",\n      id: \"boolean\"\n    }, {\n      name: \"array\",\n      id: \"array\"\n    }];\n    get formData() {\n      const parameters = (this.args.editingModel.parameters ?? []).map(parameter => {\n        const mappedParameter = {\n          ...parameter\n        };\n        mappedParameter.isEnum = parameter.enum && parameter.enum.length > 0;\n        if (!mappedParameter.isEnum) {\n          delete mappedParameter.enum;\n        }\n        return mappedParameter;\n      });\n      // FormKit uses Immer proxies which cause issues when passed to upload handlers.\n      // Convert to plain objects to ensure compatibility.\n      const ragUploads = this.args.editingModel.rag_uploads || [];\n      const plainRagUploads = ragUploads.length > 0 ? (0, _utilities.toPlainObject)(ragUploads) : [];\n      return {\n        name: this.args.editingModel.name || \"\",\n        tool_name: this.args.editingModel.tool_name || \"\",\n        description: this.args.editingModel.description || \"\",\n        summary: this.args.editingModel.summary || \"\",\n        parameters,\n        script: this.args.editingModel.script || \"\",\n        rag_uploads: plainRagUploads\n      };\n    }\n    toggleIsEnum(value, {\n      name,\n      parentName,\n      set\n    }) {\n      if (value) {\n        set(`${parentName}.enum`, [\"\"]);\n      } else {\n        set(`${parentName}.enum`, []);\n      }\n      set(name, value);\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleIsEnum\", [_object.action]);\n    }\n    async save(data) {\n      this.isSaving = true;\n      // we injected a isEnum thing, we need to clean it up\n      const copiedData = (0, _utilities.toPlainObject)(data);\n      if (copiedData.parameters) {\n        copiedData.parameters.forEach(parameter => {\n          if (!parameter.isEnum) {\n            delete parameter.enum;\n          }\n          delete parameter.isEnum;\n        });\n      }\n      try {\n        await this.args.model.save(copiedData);\n        this.toasts.success({\n          data: {\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.tools.saved\")\n          },\n          duration: \"short\"\n        });\n        if (!this.args.tools.content.some(tool => tool.id === this.args.model.id)) {\n          this.args.tools.content.push(this.args.model);\n        }\n        await this.router.replaceWith(\"adminPlugins.show.discourse-ai-tools.edit\", this.args.model);\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        this.isSaving = false;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"save\", [_object.action]);\n    }\n    delete() {\n      return this.dialog.confirm({\n        message: (0, _discourseI18n.i18n)(\"discourse_ai.tools.confirm_delete\"),\n        didConfirm: async () => {\n          await this.args.model.destroyRecord();\n          (0, _arrayTools.removeValueFromArray)(this.args.tools.content, this.args.model);\n          this.router.transitionTo(\"adminPlugins.show.discourse-ai-tools.index\");\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"delete\", [_object.action]);\n    }\n    updateUploads(addItemToCollection, uploads) {\n      // FormKit uses Immer proxies which cause issues when passed to upload handlers.\n      // Convert to plain objects to ensure compatibility.\n      const plainUploads = (0, _utilities.toPlainObject)(uploads);\n      const uniqueUploads = plainUploads.filter(upload => !this.uploadedFiles.some(file => file.id === upload.id));\n      addItemToCollection(\"rag_uploads\", uniqueUploads);\n      this.uploadedFiles = [...this.uploadedFiles, ...uniqueUploads];\n    }\n    static {\n      dt7948.n(this.prototype, \"updateUploads\", [_object.action]);\n    }\n    removeUpload(form, upload) {\n      this.uploadedFiles = this.uploadedFiles.filter(file => file.id !== upload.id);\n      // FormKit uses Immer proxies which cause issues when passed to upload handlers.\n      // Convert to plain objects to ensure compatibility.\n      const plainUploads = this.uploadedFiles.length > 0 ? (0, _utilities.toPlainObject)(this.uploadedFiles) : [];\n      form.set(\"rag_uploads\", plainUploads);\n    }\n    static {\n      dt7948.n(this.prototype, \"removeUpload\", [_object.action]);\n    }\n    openTestModal() {\n      this.modal.show(_aiToolTestModal.default, {\n        model: {\n          tool: this.args.editingModel\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"openTestModal\", [_object.action]);\n    }\n    currentParameterSelection(data, index) {\n      return data.parameters[index].type;\n    }\n    get ragUploadsDescription() {\n      return this.siteSettings.rag_images_enabled ? (0, _discourseI18n.i18n)(\"discourse_ai.rag.uploads.description_with_images\") : (0, _discourseI18n.i18n)(\"discourse_ai.rag.uploads.description\");\n    }\n    exportTool() {\n      const exportUrl = `/admin/plugins/discourse-ai/ai-tools/${this.args.model.id}/export.json`;\n      window.location.href = (0, _getUrl.default)(exportUrl);\n    }\n    static {\n      dt7948.n(this.prototype, \"exportTool\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <Form\n        @onSubmit={{this.save}}\n        @data={{this.formData}}\n        class=\"ai-tool-editor\"\n        as |form data|\n      >\n        {{! NAME }}\n        <form.Field\n          @name=\"name\"\n          @title={{i18n \"discourse_ai.tools.name\"}}\n          @validation=\"required|length:1,100\"\n          @format=\"large\"\n          @tooltip={{i18n \"discourse_ai.tools.name_help\"}}\n          as |field|\n        >\n          <field.Input class=\"ai-tool-editor__name\" />\n        </form.Field>\n      \n        {{! TOOL NAME }}\n        <form.Field\n          @name=\"tool_name\"\n          @title={{i18n \"discourse_ai.tools.tool_name\"}}\n          @validation=\"required|length:1,100\"\n          @format=\"large\"\n          @tooltip={{i18n \"discourse_ai.tools.tool_name_help\"}}\n          as |field|\n        >\n          <field.Input class=\"ai-tool-editor__tool_name\" />\n        </form.Field>\n      \n        {{! DESCRIPTION }}\n        <form.Field\n          @name=\"description\"\n          @title={{i18n \"discourse_ai.tools.description\"}}\n          @validation=\"required|length:1,1000\"\n          @format=\"full\"\n          @tooltip={{i18n \"discourse_ai.tools.description_help\"}}\n          as |field|\n        >\n          <field.Textarea\n            @height={{60}}\n            class=\"ai-tool-editor__description\"\n            placeholder={{i18n \"discourse_ai.tools.description_help\"}}\n          />\n        </form.Field>\n      \n        {{! SUMMARY }}\n        <form.Field\n          @name=\"summary\"\n          @title={{i18n \"discourse_ai.tools.summary\"}}\n          @validation=\"required|length:1,255\"\n          @format=\"large\"\n          @tooltip={{i18n \"discourse_ai.tools.summary_help\"}}\n          as |field|\n        >\n          <field.Input class=\"ai-tool-editor__summary\" />\n        </form.Field>\n      \n        {{! PARAMETERS }}\n        <form.Collection @name=\"parameters\" as |collection index collectionData|>\n          <form.Container class=\"ai-tool-parameter\">\n            <form.Row as |row|>\n              <row.Col @size={{6}}>\n                <collection.Field\n                  @name=\"name\"\n                  @title={{i18n \"discourse_ai.tools.parameter_name\"}}\n                  @validation=\"required|length:1,100\"\n                  @format=\"full\"\n                  as |field|\n                >\n                  <field.Input />\n                </collection.Field>\n              </row.Col>\n      \n              <row.Col @size={{6}}>\n                <collection.Field\n                  @name=\"type\"\n                  @title={{i18n \"discourse_ai.tools.parameter_type\"}}\n                  @validation=\"required\"\n                  @format=\"full\"\n                  as |field|\n                >\n                  <field.Select as |select|>\n                    {{#each this.PARAMETER_TYPES as |type|}}\n                      <select.Option\n                        @value={{type.id}}\n                      >{{type.name}}</select.Option>\n                    {{/each}}\n                  </field.Select>\n                </collection.Field>\n              </row.Col>\n            </form.Row>\n      \n            <form.Row as |row|>\n              <row.Col @size={{12}}>\n                <collection.Field\n                  @name=\"description\"\n                  @title={{i18n \"discourse_ai.tools.parameter_description\"}}\n                  @validation=\"required|length:1,1000\"\n                  @format=\"full\"\n                  as |field|\n                >\n                  <field.Input class=\"ai-tool-editor__parameter-description\" />\n                </collection.Field>\n              </row.Col>\n            </form.Row>\n      \n            <form.Row as |row|>\n              <row.Col>\n                <collection.Field @name=\"required\" @title=\"Required\" as |field|>\n                  <field.Checkbox />\n                </collection.Field>\n              </row.Col>\n      \n              <row.Col>\n                <collection.Field\n                  @name=\"isEnum\"\n                  @title=\"Enum\"\n                  @onSet={{this.toggleIsEnum}}\n                  as |field|\n                >\n                  <field.Checkbox />\n                </collection.Field>\n              </row.Col>\n      \n              {{#if collectionData.isEnum}}\n                <row.Col @size={{8}}>\n                  <collection.Collection @name=\"enum\" as |child childIndex|>\n                    <form.Container class=\"ai-tool-parameter__enum-values\">\n                      <child.Field\n                        @title={{i18n \"discourse_ai.tools.enum_value\"}}\n                        @validation=\"required\"\n                        as |field|\n                      >\n                        <field.Input />\n      \n                        {{#if\n                          (and\n                            (gt collectionData.enum.length 1) (gt childIndex 0)\n                          )\n                        }}\n                          <form.Button\n                            class=\"btn-danger\"\n                            @icon=\"trash-can\"\n                            @action={{fn child.remove childIndex}}\n                          />\n                        {{/if}}\n                      </child.Field>\n                    </form.Container>\n                  </collection.Collection>\n                </row.Col>\n      \n                <row.Col @size={{8}}>\n                  <form.Button\n                    @icon=\"plus\"\n                    @label=\"discourse_ai.tools.add_enum_value\"\n                    @action={{fn\n                      form.addItemToCollection\n                      (concat \"parameters.\" index \".enum\")\n                      \"\"\n                    }}\n                  />\n                </row.Col>\n              {{/if}}\n            </form.Row>\n            <form.Row as |row|>\n              <row.Col class=\"ai-tool-parameter-actions\">\n                <form.Button\n                  @label=\"discourse_ai.tools.remove_parameter\"\n                  @icon=\"trash-can\"\n                  @action={{fn collection.remove index}}\n                  class=\"btn-danger\"\n                />\n              </row.Col>\n            </form.Row>\n          </form.Container>\n        </form.Collection>\n      \n        <form.Button\n          @icon=\"plus\"\n          @label=\"discourse_ai.tools.add_parameter\"\n          @action={{fn\n            form.addItemToCollection\n            \"parameters\"\n            (hash\n              name=\"\" type=\"string\" description=\"\" required=false isEnum=false\n            )\n          }}\n        />\n      \n        {{! SCRIPT }}\n        <form.Field\n          @name=\"script\"\n          @title={{i18n \"discourse_ai.tools.script\"}}\n          @validation=\"required|length:1,100000\"\n          @format=\"full\"\n          as |field|\n        >\n          <field.Code @lang=\"javascript\" @height={{600}} />\n        </form.Field>\n      \n        {{! UPLOADS }}\n        {{#if this.siteSettings.ai_embeddings_enabled}}\n          <form.Field\n            @name=\"rag_uploads\"\n            @title={{i18n \"discourse_ai.rag.uploads.title\"}}\n            @tooltip={{this.ragUploadsDescription}}\n            @format=\"full\"\n            as |field|\n          >\n            <field.Custom>\n              <RagUploader\n                @target={{@editingModel}}\n                @updateUploads={{fn this.updateUploads form.addItemToCollection}}\n                @onRemove={{fn this.removeUpload form}}\n                @allowImages={{@settings.rag_images_enabled}}\n              />\n              <RagOptionsFk\n                @form={{form}}\n                @data={{data}}\n                @llms={{@llms}}\n                @allowImages={{@settings.rag_images_enabled}}\n              />\n            </field.Custom>\n          </form.Field>\n        {{/if}}\n      \n        <form.Actions>\n          {{#unless @isNew}}\n            <form.Button\n              @label=\"discourse_ai.tools.test\"\n              @action={{this.openTestModal}}\n              class=\"ai-tool-editor__test-button\"\n            />\n            <form.Button\n              @label=\"discourse_ai.tools.export\"\n              @action={{this.exportTool}}\n              class=\"ai-tool-editor__export\"\n            />\n            <form.Button\n              @label=\"discourse_ai.tools.delete\"\n              @icon=\"trash-can\"\n              @action={{this.delete}}\n              class=\"btn-danger ai-tool-editor__delete\"\n            />\n          {{/unless}}\n      \n          <form.Submit\n            @label=\"discourse_ai.tools.save\"\n            class=\"ai-tool-editor__save\"\n          />\n        </form.Actions>\n      </Form>\n      */\n      {\n        \"id\": \"rRdwh2tu\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"ai-tool-editor\\\"]],[[\\\"@onSubmit\\\",\\\"@data\\\"],[[30,0,[\\\"save\\\"]],[30,0,[\\\"formData\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[1,\\\"  \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\",\\\"@tooltip\\\"],[\\\"name\\\",[28,[32,1],[\\\"discourse_ai.tools.name\\\"],null],\\\"required|length:1,100\\\",\\\"large\\\",[28,[32,1],[\\\"discourse_ai.tools.name_help\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"Input\\\"]],[[24,0,\\\"ai-tool-editor__name\\\"]],null,null],[1,\\\"\\\\n  \\\"]],[3]]]]],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"  \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\",\\\"@tooltip\\\"],[\\\"tool_name\\\",[28,[32,1],[\\\"discourse_ai.tools.tool_name\\\"],null],\\\"required|length:1,100\\\",\\\"large\\\",[28,[32,1],[\\\"discourse_ai.tools.tool_name_help\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,4,[\\\"Input\\\"]],[[24,0,\\\"ai-tool-editor__tool_name\\\"]],null,null],[1,\\\"\\\\n  \\\"]],[4]]]]],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"  \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\",\\\"@tooltip\\\"],[\\\"description\\\",[28,[32,1],[\\\"discourse_ai.tools.description\\\"],null],\\\"required|length:1,1000\\\",\\\"full\\\",[28,[32,1],[\\\"discourse_ai.tools.description_help\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,5,[\\\"Textarea\\\"]],[[24,0,\\\"ai-tool-editor__description\\\"],[16,\\\"placeholder\\\",[28,[32,1],[\\\"discourse_ai.tools.description_help\\\"],null]]],[[\\\"@height\\\"],[60]],null],[1,\\\"\\\\n  \\\"]],[5]]]]],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"  \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\",\\\"@tooltip\\\"],[\\\"summary\\\",[28,[32,1],[\\\"discourse_ai.tools.summary\\\"],null],\\\"required|length:1,255\\\",\\\"large\\\",[28,[32,1],[\\\"discourse_ai.tools.summary_help\\\"],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,6,[\\\"Input\\\"]],[[24,0,\\\"ai-tool-editor__summary\\\"]],null,null],[1,\\\"\\\\n  \\\"]],[6]]]]],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"  \\\"],[8,[30,1,[\\\"Collection\\\"]],null,[[\\\"@name\\\"],[\\\"parameters\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,1,[\\\"Container\\\"]],[[24,0,\\\"ai-tool-parameter\\\"]],null,[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,1,[\\\"Row\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,10,[\\\"Col\\\"]],null,[[\\\"@size\\\"],[6]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,7,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"name\\\",[28,[32,1],[\\\"discourse_ai.tools.parameter_name\\\"],null],\\\"required|length:1,100\\\",\\\"full\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,11,[\\\"Input\\\"]],null,null,null],[1,\\\"\\\\n          \\\"]],[11]]]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n\\\\n        \\\"],[8,[30,10,[\\\"Col\\\"]],null,[[\\\"@size\\\"],[6]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,7,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"type\\\",[28,[32,1],[\\\"discourse_ai.tools.parameter_type\\\"],null],\\\"required\\\",\\\"full\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,12,[\\\"Select\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"PARAMETER_TYPES\\\"]]],null]],null],null,[[[1,\\\"                \\\"],[8,[30,13,[\\\"Option\\\"]],null,[[\\\"@value\\\"],[[30,14,[\\\"id\\\"]]]],[[\\\"default\\\"],[[[[1,[30,14,[\\\"name\\\"]]]],[]]]]],[1,\\\"\\\\n\\\"]],[14]],null],[1,\\\"            \\\"]],[13]]]]],[1,\\\"\\\\n          \\\"]],[12]]]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n      \\\"]],[10]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,1,[\\\"Row\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,15,[\\\"Col\\\"]],null,[[\\\"@size\\\"],[12]],[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,7,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"description\\\",[28,[32,1],[\\\"discourse_ai.tools.parameter_description\\\"],null],\\\"required|length:1,1000\\\",\\\"full\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,16,[\\\"Input\\\"]],[[24,0,\\\"ai-tool-editor__parameter-description\\\"]],null,null],[1,\\\"\\\\n          \\\"]],[16]]]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n      \\\"]],[15]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,1,[\\\"Row\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,17,[\\\"Col\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,7,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\"],[\\\"required\\\",\\\"Required\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,18,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n          \\\"]],[18]]]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n\\\\n        \\\"],[8,[30,17,[\\\"Col\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,7,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@onSet\\\"],[\\\"isEnum\\\",\\\"Enum\\\",[30,0,[\\\"toggleIsEnum\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,19,[\\\"Checkbox\\\"]],null,null,null],[1,\\\"\\\\n          \\\"]],[19]]]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,9,[\\\"isEnum\\\"]],[[[1,\\\"          \\\"],[8,[30,17,[\\\"Col\\\"]],null,[[\\\"@size\\\"],[8]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,7,[\\\"Collection\\\"]],null,[[\\\"@name\\\"],[\\\"enum\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n              \\\"],[8,[30,1,[\\\"Container\\\"]],[[24,0,\\\"ai-tool-parameter__enum-values\\\"]],null,[[\\\"default\\\"],[[[[1,\\\"\\\\n                \\\"],[8,[30,20,[\\\"Field\\\"]],null,[[\\\"@title\\\",\\\"@validation\\\"],[[28,[32,1],[\\\"discourse_ai.tools.enum_value\\\"],null],\\\"required\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                  \\\"],[8,[30,22,[\\\"Input\\\"]],null,null,null],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[32,2],[[28,[32,3],[[30,9,[\\\"enum\\\",\\\"length\\\"]],1],null],[28,[32,3],[[30,21],0],null]],null],[[[1,\\\"                    \\\"],[8,[30,1,[\\\"Button\\\"]],[[24,0,\\\"btn-danger\\\"]],[[\\\"@icon\\\",\\\"@action\\\"],[\\\"trash-can\\\",[28,[32,4],[[30,20,[\\\"remove\\\"]],[30,21]],null]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                \\\"]],[22]]]]],[1,\\\"\\\\n              \\\"]],[]]]]],[1,\\\"\\\\n            \\\"]],[20,21]]]]],[1,\\\"\\\\n          \\\"]],[]]]]],[1,\\\"\\\\n\\\\n          \\\"],[8,[30,17,[\\\"Col\\\"]],null,[[\\\"@size\\\"],[8]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[8,[30,1,[\\\"Button\\\"]],null,[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\"],[\\\"plus\\\",\\\"discourse_ai.tools.add_enum_value\\\",[28,[32,4],[[30,1,[\\\"addItemToCollection\\\"]],[28,[32,5],[\\\"parameters.\\\",[30,8],\\\".enum\\\"],null],\\\"\\\"],null]]],null],[1,\\\"\\\\n          \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"      \\\"]],[17]]]]],[1,\\\"\\\\n      \\\"],[8,[30,1,[\\\"Row\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,23,[\\\"Col\\\"]],[[24,0,\\\"ai-tool-parameter-actions\\\"]],null,[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[30,1,[\\\"Button\\\"]],[[24,0,\\\"btn-danger\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\"],[\\\"discourse_ai.tools.remove_parameter\\\",\\\"trash-can\\\",[28,[32,4],[[30,7,[\\\"remove\\\"]],[30,8]],null]]],null],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n      \\\"]],[23]]]]],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n  \\\"]],[7,8,9]]]]],[1,\\\"\\\\n\\\\n  \\\"],[8,[30,1,[\\\"Button\\\"]],null,[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\"],[\\\"plus\\\",\\\"discourse_ai.tools.add_parameter\\\",[28,[32,4],[[30,1,[\\\"addItemToCollection\\\"]],\\\"parameters\\\",[28,[32,6],null,[[\\\"name\\\",\\\"type\\\",\\\"description\\\",\\\"required\\\",\\\"isEnum\\\"],[\\\"\\\",\\\"string\\\",\\\"\\\",false,false]]]],null]]],null],[1,\\\"\\\\n\\\\n\\\"],[1,\\\"  \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"script\\\",[28,[32,1],[\\\"discourse_ai.tools.script\\\"],null],\\\"required|length:1,100000\\\",\\\"full\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,24,[\\\"Code\\\"]],null,[[\\\"@lang\\\",\\\"@height\\\"],[\\\"javascript\\\",600]],null],[1,\\\"\\\\n  \\\"]],[24]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"siteSettings\\\",\\\"ai_embeddings_enabled\\\"]],[[[1,\\\"    \\\"],[8,[30,1,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"rag_uploads\\\",[28,[32,1],[\\\"discourse_ai.rag.uploads.title\\\"],null],[30,0,[\\\"ragUploadsDescription\\\"]],\\\"full\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,25,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[32,7],null,[[\\\"@target\\\",\\\"@updateUploads\\\",\\\"@onRemove\\\",\\\"@allowImages\\\"],[[30,26],[28,[32,4],[[30,0,[\\\"updateUploads\\\"]],[30,1,[\\\"addItemToCollection\\\"]]],null],[28,[32,4],[[30,0,[\\\"removeUpload\\\"]],[30,1]],null],[30,27,[\\\"rag_images_enabled\\\"]]]],null],[1,\\\"\\\\n        \\\"],[8,[32,8],null,[[\\\"@form\\\",\\\"@data\\\",\\\"@llms\\\",\\\"@allowImages\\\"],[[30,1],[30,2],[30,28],[30,27,[\\\"rag_images_enabled\\\"]]]],null],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n    \\\"]],[25]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n  \\\"],[8,[30,1,[\\\"Actions\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[51,[30,29]],[[[1,\\\"      \\\"],[8,[30,1,[\\\"Button\\\"]],[[24,0,\\\"ai-tool-editor__test-button\\\"]],[[\\\"@label\\\",\\\"@action\\\"],[\\\"discourse_ai.tools.test\\\",[30,0,[\\\"openTestModal\\\"]]]],null],[1,\\\"\\\\n      \\\"],[8,[30,1,[\\\"Button\\\"]],[[24,0,\\\"ai-tool-editor__export\\\"]],[[\\\"@label\\\",\\\"@action\\\"],[\\\"discourse_ai.tools.export\\\",[30,0,[\\\"exportTool\\\"]]]],null],[1,\\\"\\\\n      \\\"],[8,[30,1,[\\\"Button\\\"]],[[24,0,\\\"btn-danger ai-tool-editor__delete\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\"],[\\\"discourse_ai.tools.delete\\\",\\\"trash-can\\\",[30,0,[\\\"delete\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[8,[30,1,[\\\"Submit\\\"]],[[24,0,\\\"ai-tool-editor__save\\\"]],[[\\\"@label\\\"],[\\\"discourse_ai.tools.save\\\"]],null],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[1,2]]]]]],[\\\"form\\\",\\\"data\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"collection\\\",\\\"index\\\",\\\"collectionData\\\",\\\"row\\\",\\\"field\\\",\\\"field\\\",\\\"select\\\",\\\"type\\\",\\\"row\\\",\\\"field\\\",\\\"row\\\",\\\"field\\\",\\\"field\\\",\\\"child\\\",\\\"childIndex\\\",\\\"field\\\",\\\"row\\\",\\\"field\\\",\\\"field\\\",\\\"@editingModel\\\",\\\"@settings\\\",\\\"@llms\\\",\\\"@isNew\\\"],[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\",\\\"unless\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-tool-editor-form.js\",\n        \"scope\": () => [_form.default, _discourseI18n.i18n, _truthHelpers.and, _truthHelpers.gt, _helper.fn, _helper.concat, _helper.hash, _ragUploader.default, _ragOptionsFk.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiToolEditorForm;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-tool-editor\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/components/back-button\", \"discourse/plugins/discourse-ai/discourse/components/ai-tool-editor-form\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _backButton, _aiToolEditorForm, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiToolEditor extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"store\", [_service.service]);\n    }\n    #store = (dt7948.i(this, \"store\"), void 0);\n    get selectedPreset() {\n      if (!this.args.selectedPreset) {\n        return this.args.presets.find(item => item.preset_id === \"empty_tool\");\n      }\n      return this.args.presets.find(item => item.preset_id === this.args.selectedPreset);\n    }\n    get editingModel() {\n      if (this.args.model.isNew) {\n        return this.store.createRecord(\"ai-tool\", this.selectedPreset);\n      } else {\n        return this.args.model;\n      }\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <BackButton\n        @route=\"adminPlugins.show.discourse-ai-tools\"\n        @label=\"discourse_ai.tools.back\"\n      />\n      \n      <AiToolEditorForm\n        @model={{@model}}\n        @tools={{@tools}}\n        @editingModel={{this.editingModel}}\n        @isNew={{@model.isNew}}\n        @selectedPreset={{this.selectedPreset}}\n      />\n      */\n      {\n        \"id\": \"/pbB1vj2\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@route\\\",\\\"@label\\\"],[\\\"adminPlugins.show.discourse-ai-tools\\\",\\\"discourse_ai.tools.back\\\"]],null],[1,\\\"\\\\n\\\\n\\\"],[8,[32,1],null,[[\\\"@model\\\",\\\"@tools\\\",\\\"@editingModel\\\",\\\"@isNew\\\",\\\"@selectedPreset\\\"],[[30,1],[30,2],[30,0,[\\\"editingModel\\\"]],[30,1,[\\\"isNew\\\"]],[30,0,[\\\"selectedPreset\\\"]]]],null]],[\\\"@model\\\",\\\"@tools\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-tool-editor.js\",\n        \"scope\": () => [_backButton.default, _aiToolEditorForm.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiToolEditor;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-tool-list-editor\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"@ember/routing\", \"@ember/service\", \"discourse/admin/components/admin-config-area-empty-list\", \"discourse/components/d-breadcrumbs-item\", \"discourse/components/d-button\", \"discourse/components/d-page-subheader\", \"discourse/components/dropdown-menu\", \"discourse/float-kit/components/d-menu\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/array-tools\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/admin/models/ai-tool\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _routing, _service, _adminConfigAreaEmptyList, _dBreadcrumbsItem, _dButton, _dPageSubheader, _dropdownMenu, _dMenu, _ajax, _ajaxError, _arrayTools, _truthHelpers, _discourseI18n, _aiTool, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiToolListEditor extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"adminPluginNavManager\", [_service.service]);\n    }\n    #adminPluginNavManager = (dt7948.i(this, \"adminPluginNavManager\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"dialog\", [_service.service]);\n    }\n    #dialog = (dt7948.i(this, \"dialog\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"expandedCategory\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #expandedCategory = (dt7948.i(this, \"expandedCategory\"), void 0);\n    get dropdownPresets() {\n      return this.args.tools.resultSetMeta.presets.filter(preset => {\n        // Filter out individual image generation presets, keep only the category\n        return !preset.category || preset.is_category;\n      });\n    }\n    get categoryPresets() {\n      if (!this.expandedCategory) {\n        return [];\n      }\n      const presets = this.args.tools.resultSetMeta.presets.filter(preset => preset.category === this.expandedCategory && !preset.is_category);\n      // Separate \"Custom\" from others\n      const customPreset = presets.find(p => p.preset_id === \"image_generation_custom\");\n      const otherPresets = presets.filter(p => p.preset_id !== \"image_generation_custom\").sort((a, b) => a.provider.localeCompare(b.provider));\n      return {\n        otherPresets,\n        customPreset\n      };\n    }\n    get lastIndexOfPresets() {\n      return this.dropdownPresets.length - 1;\n    }\n    expandCategory(preset) {\n      this.expandedCategory = preset.category;\n    }\n    static {\n      dt7948.n(this.prototype, \"expandCategory\", [_object.action]);\n    }\n    collapseCategory() {\n      this.expandedCategory = null;\n    }\n    static {\n      dt7948.n(this.prototype, \"collapseCategory\", [_object.action]);\n    }\n    resetMenuState() {\n      this.expandedCategory = null;\n    }\n    static {\n      dt7948.n(this.prototype, \"resetMenuState\", [_object.action]);\n    }\n    routeToNewTool(preset) {\n      const queryParams = {\n        presetId: preset.preset_id\n      };\n      return this.router.transitionTo(\"adminPlugins.show.discourse-ai-tools.new\", {\n        queryParams\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"routeToNewTool\", [_object.action]);\n    }\n    importTool() {\n      // Create a hidden file input and click it\n      const fileInput = document.createElement(\"input\");\n      fileInput.type = \"file\";\n      fileInput.accept = \".json\";\n      fileInput.style.display = \"none\";\n      fileInput.onchange = event => this.handleFileSelect(event);\n      document.body.appendChild(fileInput);\n      fileInput.click();\n      document.body.removeChild(fileInput);\n    }\n    static {\n      dt7948.n(this.prototype, \"importTool\", [_object.action]);\n    }\n    handleFileSelect(event) {\n      const file = event.target.files[0];\n      if (!file) {\n        return;\n      }\n      const reader = new FileReader();\n      reader.onload = e => {\n        try {\n          const json = JSON.parse(e.target.result);\n          this.uploadTool(json.ai_tool);\n        } catch {\n          this.dialog.alert((0, _discourseI18n.i18n)(\"discourse_ai.tools.import_error_not_json\"));\n        }\n      };\n      reader.readAsText(file);\n    }\n    static {\n      dt7948.n(this.prototype, \"handleFileSelect\", [_object.action]);\n    }\n    uploadTool(toolData, force = false) {\n      let url = `/admin/plugins/discourse-ai/ai-tools/import.json`;\n      const payload = {\n        ai_tool: toolData\n      };\n      if (force) {\n        payload.force = true;\n      }\n      return (0, _ajax.ajax)(url, {\n        type: \"POST\",\n        data: JSON.stringify(payload),\n        contentType: \"application/json\"\n      }).then(result => {\n        let tool = _aiTool.default.create(result.ai_tool);\n        let existingTool = this.args.tools.content.find(item => item.id === tool.id);\n        if (existingTool) {\n          (0, _arrayTools.removeValueFromArray)(this.args.tools.content, existingTool);\n        }\n        this.args.tools.content.unshift(tool);\n      }).catch(error => {\n        if (error.jqXHR?.status === 409) {\n          this.dialog.confirm({\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.tools.import_error_conflict\", {\n              name: toolData.tool_name\n            }),\n            confirmButtonLabel: \"discourse_ai.tools.overwrite\",\n            didConfirm: () => this.uploadTool(toolData, true)\n          });\n        } else {\n          (0, _ajaxError.popupAjaxError)(error);\n        }\n      });\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DBreadcrumbsItem\n        @path=\"/admin/plugins/{{this.adminPluginNavManager.currentPlugin.name}}/ai-tools\"\n        @label={{i18n \"discourse_ai.tools.short_title\"}}\n      />\n      <section class=\"ai-tool-list-editor__current admin-detail pull-left\">\n        <DPageSubheader\n          @titleLabel={{i18n \"discourse_ai.tools.short_title\"}}\n          @learnMoreUrl=\"https://meta.discourse.org/t/ai-bot-custom-tools/314103\"\n          @descriptionLabel={{i18n \"discourse_ai.tools.subheader_description\"}}\n        >\n          <:actions>\n            <DButton\n              @translatedLabel={{i18n \"discourse_ai.tools.import\"}}\n              @icon=\"upload\"\n              class=\"btn btn-default btn-small ai-tool-list-editor__import-button\"\n              @action={{this.importTool}}\n            />\n            <DMenu\n              @triggerClass=\"btn-primary btn-small ai-tool-list-editor__new-button\"\n              @label={{i18n \"discourse_ai.tools.new\"}}\n              @icon=\"plus\"\n              @placement=\"bottom-end\"\n              @onClose={{this.resetMenuState}}\n            >\n              <:content>\n                <DropdownMenu as |dropdown|>\n                  {{#if this.expandedCategory}}\n                    <dropdown.item>\n                      <DButton\n                        @label=\"back_button\"\n                        @icon=\"chevron-left\"\n                        @action={{this.collapseCategory}}\n                        class=\"btn-transparent\"\n                      />\n                    </dropdown.item>\n                    <dropdown.divider />\n                    {{#each this.categoryPresets.otherPresets as |preset|}}\n                      <dropdown.item>\n                        <div\n                          role=\"button\"\n                          class=\"ai-tool-preset-item\"\n                          data-option={{preset.preset_id}}\n                          {{on \"click\" (fn this.routeToNewTool preset)}}\n                        >\n                          <span\n                            class=\"ai-tool-preset-provider\"\n                          >{{preset.provider}}</span>\n                          <span\n                            class=\"ai-tool-preset-model\"\n                          >{{preset.model_name}}</span>\n                        </div>\n                      </dropdown.item>\n                    {{/each}}\n      \n                    {{#if this.categoryPresets.customPreset}}\n                      <dropdown.divider />\n                      <dropdown.item>\n                        <DButton\n                          @translatedLabel={{this.categoryPresets.customPreset.preset_name}}\n                          @action={{fn\n                            this.routeToNewTool\n                            this.categoryPresets.customPreset\n                          }}\n                          class=\"btn-transparent\"\n                          data-option={{this.categoryPresets.customPreset.preset_id}}\n                        />\n                      </dropdown.item>\n                    {{/if}}\n                  {{else}}\n                    {{#each this.dropdownPresets as |preset index|}}\n                      {{#if (eq index this.lastIndexOfPresets)}}\n                        <dropdown.divider />\n                      {{/if}}\n      \n                      <dropdown.item>\n                        <DButton\n                          @translatedLabel={{preset.preset_name}}\n                          @action={{if\n                            preset.is_category\n                            (fn this.expandCategory preset)\n                            (fn this.routeToNewTool preset)\n                          }}\n                          class=\"btn-transparent\"\n                          data-option={{preset.preset_id}}\n                        />\n                      </dropdown.item>\n                    {{/each}}\n                  {{/if}}\n                </DropdownMenu>\n      \n              </:content>\n            </DMenu>\n          </:actions>\n        </DPageSubheader>\n      \n        {{#if @tools.content}}\n          <table class=\"d-admin-table ai-tool-list-editor\">\n            <thead>\n              <th>{{i18n \"discourse_ai.tools.name\"}}</th>\n              <th></th>\n            </thead>\n            <tbody>\n              {{#each @tools.content as |tool|}}\n                <tr\n                  data-tool-id={{tool.id}}\n                  class=\"ai-tool-list__row d-admin-row__content\"\n                >\n                  <td class=\"d-admin-row__overview\">\n                    <div class=\"ai-tool-list__name-with-description\">\n                      <div class=\"ai-tool-list__name\">\n                        <strong>\n                          {{tool.name}}\n                        </strong>\n                      </div>\n                      <div class=\"ai-tool-list__description\">\n                        {{tool.description}}\n                      </div>\n                    </div>\n                  </td>\n                  <td class=\"d-admin-row__controls\">\n                    <LinkTo\n                      @route=\"adminPlugins.show.discourse-ai-tools.edit\"\n                      @model={{tool}}\n                      class=\"btn btn-text btn-small\"\n                    >{{i18n \"discourse_ai.tools.edit\"}}</LinkTo>\n                  </td>\n                </tr>\n              {{/each}}\n            </tbody>\n          </table>\n        {{else}}\n          <AdminConfigAreaEmptyList\n            @ctaLabel=\"discourse_ai.tools.new\"\n            @ctaRoute=\"adminPlugins.show.discourse-ai-tools.new\"\n            @ctaClass=\"ai-tool-list-editor__empty-new-button\"\n            @emptyLabel=\"discourse_ai.tools.no_tools\"\n          />\n        {{/if}}\n      </section>\n      */\n      {\n        \"id\": \"QPp4hvzy\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@path\\\",\\\"@label\\\"],[[29,[\\\"/admin/plugins/\\\",[30,0,[\\\"adminPluginNavManager\\\",\\\"currentPlugin\\\",\\\"name\\\"]],\\\"/ai-tools\\\"]],[28,[32,1],[\\\"discourse_ai.tools.short_title\\\"],null]]],null],[1,\\\"\\\\n\\\"],[10,\\\"section\\\"],[14,0,\\\"ai-tool-list-editor__current admin-detail pull-left\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,2],null,[[\\\"@titleLabel\\\",\\\"@learnMoreUrl\\\",\\\"@descriptionLabel\\\"],[[28,[32,1],[\\\"discourse_ai.tools.short_title\\\"],null],\\\"https://meta.discourse.org/t/ai-bot-custom-tools/314103\\\",[28,[32,1],[\\\"discourse_ai.tools.subheader_description\\\"],null]]],[[\\\"actions\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[32,3],[[24,0,\\\"btn btn-default btn-small ai-tool-list-editor__import-button\\\"]],[[\\\"@translatedLabel\\\",\\\"@icon\\\",\\\"@action\\\"],[[28,[32,1],[\\\"discourse_ai.tools.import\\\"],null],\\\"upload\\\",[30,0,[\\\"importTool\\\"]]]],null],[1,\\\"\\\\n      \\\"],[8,[32,4],null,[[\\\"@triggerClass\\\",\\\"@label\\\",\\\"@icon\\\",\\\"@placement\\\",\\\"@onClose\\\"],[\\\"btn-primary btn-small ai-tool-list-editor__new-button\\\",[28,[32,1],[\\\"discourse_ai.tools.new\\\"],null],\\\"plus\\\",\\\"bottom-end\\\",[30,0,[\\\"resetMenuState\\\"]]]],[[\\\"content\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[32,5],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"expandedCategory\\\"]],[[[1,\\\"              \\\"],[8,[30,1,[\\\"item\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n                \\\"],[8,[32,3],[[24,0,\\\"btn-transparent\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\"],[\\\"back_button\\\",\\\"chevron-left\\\",[30,0,[\\\"collapseCategory\\\"]]]],null],[1,\\\"\\\\n              \\\"]],[]]]]],[1,\\\"\\\\n              \\\"],[8,[30,1,[\\\"divider\\\"]],null,null,null],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"categoryPresets\\\",\\\"otherPresets\\\"]]],null]],null],null,[[[1,\\\"                \\\"],[8,[30,1,[\\\"item\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n                  \\\"],[11,0],[24,\\\"role\\\",\\\"button\\\"],[24,0,\\\"ai-tool-preset-item\\\"],[16,\\\"data-option\\\",[30,2,[\\\"preset_id\\\"]]],[4,[32,6],[\\\"click\\\",[28,[32,7],[[30,0,[\\\"routeToNewTool\\\"]],[30,2]],null]],null],[12],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"ai-tool-preset-provider\\\"],[12],[1,[30,2,[\\\"provider\\\"]]],[13],[1,\\\"\\\\n                    \\\"],[10,1],[14,0,\\\"ai-tool-preset-model\\\"],[12],[1,[30,2,[\\\"model_name\\\"]]],[13],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"categoryPresets\\\",\\\"customPreset\\\"]],[[[1,\\\"                \\\"],[8,[30,1,[\\\"divider\\\"]],null,null,null],[1,\\\"\\\\n                \\\"],[8,[30,1,[\\\"item\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n                  \\\"],[8,[32,3],[[24,0,\\\"btn-transparent\\\"],[16,\\\"data-option\\\",[30,0,[\\\"categoryPresets\\\",\\\"customPreset\\\",\\\"preset_id\\\"]]]],[[\\\"@translatedLabel\\\",\\\"@action\\\"],[[30,0,[\\\"categoryPresets\\\",\\\"customPreset\\\",\\\"preset_name\\\"]],[28,[32,7],[[30,0,[\\\"routeToNewTool\\\"]],[30,0,[\\\"categoryPresets\\\",\\\"customPreset\\\"]]],null]]],null],[1,\\\"\\\\n                \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[]],[[[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"dropdownPresets\\\"]]],null]],null],null,[[[41,[28,[32,8],[[30,4],[30,0,[\\\"lastIndexOfPresets\\\"]]],null],[[[1,\\\"                  \\\"],[8,[30,1,[\\\"divider\\\"]],null,null,null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n                \\\"],[8,[30,1,[\\\"item\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n                  \\\"],[8,[32,3],[[24,0,\\\"btn-transparent\\\"],[16,\\\"data-option\\\",[30,3,[\\\"preset_id\\\"]]]],[[\\\"@translatedLabel\\\",\\\"@action\\\"],[[30,3,[\\\"preset_name\\\"]],[52,[30,3,[\\\"is_category\\\"]],[28,[32,7],[[30,0,[\\\"expandCategory\\\"]],[30,3]],null],[28,[32,7],[[30,0,[\\\"routeToNewTool\\\"]],[30,3]],null]]]],null],[1,\\\"\\\\n                \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[3,4]],null]],[]]],[1,\\\"          \\\"]],[1]]]]],[1,\\\"\\\\n\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,5,[\\\"content\\\"]],[[[1,\\\"    \\\"],[10,\\\"table\\\"],[14,0,\\\"d-admin-table ai-tool-list-editor\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.tools.name\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,\\\"th\\\"],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,5,[\\\"content\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[10,\\\"tr\\\"],[15,\\\"data-tool-id\\\",[30,6,[\\\"id\\\"]]],[14,0,\\\"ai-tool-list__row d-admin-row__content\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__overview\\\"],[12],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"ai-tool-list__name-with-description\\\"],[12],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"ai-tool-list__name\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"strong\\\"],[12],[1,\\\"\\\\n                    \\\"],[1,[30,6,[\\\"name\\\"]]],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"ai-tool-list__description\\\"],[12],[1,\\\"\\\\n                  \\\"],[1,[30,6,[\\\"description\\\"]]],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,\\\"td\\\"],[14,0,\\\"d-admin-row__controls\\\"],[12],[1,\\\"\\\\n              \\\"],[8,[32,9],[[24,0,\\\"btn btn-text btn-small\\\"]],[[\\\"@route\\\",\\\"@model\\\"],[\\\"adminPlugins.show.discourse-ai-tools.edit\\\",[30,6]]],[[\\\"default\\\"],[[[[1,[28,[32,1],[\\\"discourse_ai.tools.edit\\\"],null]]],[]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[6]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[8,[32,10],null,[[\\\"@ctaLabel\\\",\\\"@ctaRoute\\\",\\\"@ctaClass\\\",\\\"@emptyLabel\\\"],[\\\"discourse_ai.tools.new\\\",\\\"adminPlugins.show.discourse-ai-tools.new\\\",\\\"ai-tool-list-editor__empty-new-button\\\",\\\"discourse_ai.tools.no_tools\\\"]],null],[1,\\\"\\\\n\\\"]],[]]],[13]],[\\\"dropdown\\\",\\\"preset\\\",\\\"preset\\\",\\\"index\\\",\\\"@tools\\\",\\\"tool\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-tool-list-editor.js\",\n        \"scope\": () => [_dBreadcrumbsItem.default, _discourseI18n.i18n, _dPageSubheader.default, _dButton.default, _dMenu.default, _dropdownMenu.default, _modifier.on, _helper.fn, _truthHelpers.eq, _routing.LinkTo, _adminConfigAreaEmptyList.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiToolListEditor;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-tool-selector\", [\"exports\", \"@ember/helper\", \"discourse/select-kit/components/multi-select\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _helper, _multiSelect, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const AiToolSelector = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <MultiSelect\n    @value={{@value}}\n    @onChange={{@onChange}}\n    @content={{@content}}\n    @options={{hash filterable=true allowAny=false disabled=@disabled}}\n  />\n  */\n  {\n    \"id\": \"uMJM+uCW\",\n    \"block\": \"[[[8,[32,0],null,[[\\\"@value\\\",\\\"@onChange\\\",\\\"@content\\\",\\\"@options\\\"],[[30,1],[30,2],[30,3],[28,[32,1],null,[[\\\"filterable\\\",\\\"allowAny\\\",\\\"disabled\\\"],[true,false,[30,4]]]]]],null]],[\\\"@value\\\",\\\"@onChange\\\",\\\"@content\\\",\\\"@disabled\\\"],[]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-tool-selector.js\",\n    \"scope\": () => [_multiSelect.default, _helper.hash],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"ai-tool-selector:AiToolSelector\"));\n  var _default = _exports.default = AiToolSelector;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-topic-gist\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"@ember/template\", \"discourse/helpers/body-class\", \"discourse/plugins/discourse-ai/discourse/services/gists\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _template, _bodyClass, _gists3, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTopicGist extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"gists\", [_service.service]);\n    }\n    #gists = (dt7948.i(this, \"gists\"), void 0);\n    get shouldShow() {\n      if (!this.prefersTableAiLayout) {\n        return false;\n      }\n      return this.gists.showToggle || this.hasGist;\n    }\n    get prefersTableAiLayout() {\n      return this.gists.currentPreference === _gists3.TABLE_AI_LAYOUT;\n    }\n    get hasGist() {\n      return !!this.gist;\n    }\n    get gist() {\n      return this.args.topic.get(\"ai_topic_gist\");\n    }\n    get escapedExcerpt() {\n      return this.args.topic.get(\"escapedExcerpt\");\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.shouldShow}}\n        {{bodyClass \"topic-list-layout-table-ai\"}}\n        {{#if this.hasGist}}\n          <a href={{@topic.lastUnreadUrl}} class=\"excerpt\">\n            <div class=\"excerpt__contents\">{{this.gist}}</div>\n          </a>\n        {{else}}\n          {{#if this.escapedExcerpt}}\n            <a href={{@topic.lastUnreadUrl}} class=\"excerpt\">\n              <div class=\"excerpt__contents\">\n                {{htmlSafe this.escapedExcerpt}}\n              </div>\n            </a>\n          {{/if}}\n        {{/if}}\n      {{/if}}\n      */\n      {\n        \"id\": \"yzYTNUZI\",\n        \"block\": \"[[[41,[30,0,[\\\"shouldShow\\\"]],[[[1,\\\"  \\\"],[1,[28,[32,0],[\\\"topic-list-layout-table-ai\\\"],null]],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"hasGist\\\"]],[[[1,\\\"    \\\"],[10,3],[15,6,[30,1,[\\\"lastUnreadUrl\\\"]]],[14,0,\\\"excerpt\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"excerpt__contents\\\"],[12],[1,[30,0,[\\\"gist\\\"]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,0,[\\\"escapedExcerpt\\\"]],[[[1,\\\"      \\\"],[10,3],[15,6,[30,1,[\\\"lastUnreadUrl\\\"]]],[14,0,\\\"excerpt\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"excerpt__contents\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,1],[[30,0,[\\\"escapedExcerpt\\\"]]],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]]]],[]],null]],[\\\"@topic\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-topic-gist.js\",\n        \"scope\": () => [_bodyClass.default, _template.htmlSafe],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTopicGist;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-translations\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"@ember/service\", \"@ember/template\", \"discourse/admin/components/admin-config-area-card\", \"discourse/admin/components/chart\", \"discourse/components/d-button\", \"discourse/components/d-page-subheader\", \"discourse/components/d-toggle-switch\", \"discourse/helpers/d-icon\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/select-kit/components/multi-select\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _service, _template, _adminConfigAreaCard, _chart, _dButton, _dPageSubheader, _dToggleSwitch, _dIcon, _ajax, _ajaxError, _multiSelect, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTranslations extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"aiCredits\", [_service.service]);\n    }\n    #aiCredits = (dt7948.i(this, \"aiCredits\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"languageNameLookup\", [_service.service]);\n    }\n    #languageNameLookup = (dt7948.i(this, \"languageNameLookup\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"site\", [_service.service]);\n    }\n    #site = (dt7948.i(this, \"site\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"data\", [_tracking.tracked], function () {\n        return this.args.model?.translation_progress;\n      });\n    }\n    #data = (dt7948.i(this, \"data\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"done\", [_tracking.tracked], function () {\n        return this.args.model?.posts_with_detected_locale;\n      });\n    }\n    #done = (dt7948.i(this, \"done\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"total\", [_tracking.tracked], function () {\n        return this.args.model?.total;\n      });\n    }\n    #total = (dt7948.i(this, \"total\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"translationEnabled\", [_tracking.tracked], function () {\n        return this.args.model?.translation_enabled && !this.args.model?.no_locales_configured;\n      });\n    }\n    #translationEnabled = (dt7948.i(this, \"translationEnabled\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"enabled\", [_tracking.tracked], function () {\n        return this.args.model?.enabled;\n      });\n    }\n    #enabled = (dt7948.i(this, \"enabled\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedLocales\", [_tracking.tracked], function () {\n        return this.siteSettings.content_localization_supported_locales ? this.siteSettings.content_localization_supported_locales.split(\"|\") : [];\n      });\n    }\n    #selectedLocales = (dt7948.i(this, \"selectedLocales\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"originalLocales\", [_tracking.tracked], function () {\n        return this.siteSettings.content_localization_supported_locales ? this.siteSettings.content_localization_supported_locales.split(\"|\") : [];\n      });\n    }\n    #originalLocales = (dt7948.i(this, \"originalLocales\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isSavingLocales\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isSavingLocales = (dt7948.i(this, \"isSavingLocales\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isTogglingTranslation\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isTogglingTranslation = (dt7948.i(this, \"isTogglingTranslation\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"hourlyRate\", [_tracking.tracked], function () {\n        return this.args.model?.hourly_rate || 0;\n      });\n    }\n    #hourlyRate = (dt7948.i(this, \"hourlyRate\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"creditStatus\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #creditStatus = (dt7948.i(this, \"creditStatus\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"creditCheckComplete\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #creditCheckComplete = (dt7948.i(this, \"creditCheckComplete\"), void 0);\n    constructor() {\n      super(...arguments);\n      this._checkCredits();\n    }\n    async _checkCredits() {\n      try {\n        this.creditStatus = await this.aiCredits.getFeatureCreditStatus(\"locale_detector\");\n      } catch {\n        this.creditStatus = null;\n      }\n      this.creditCheckComplete = true;\n    }\n    get creditLimitReached() {\n      return this.creditStatus?.hard_limit_reached === true;\n    }\n    get creditLimitWarningMessage() {\n      if (!this.creditLimitReached) {\n        return null;\n      }\n      const resetTime = this.creditStatus?.reset_time_formatted || this.creditStatus?.reset_time_absolute;\n      if (resetTime) {\n        return (0, _template.htmlSafe)((0, _discourseI18n.i18n)(\"discourse_ai.translations.credit_limit_warning\", {\n          reset_time: resetTime\n        }));\n      }\n      return (0, _template.htmlSafe)((0, _discourseI18n.i18n)(\"discourse_ai.translations.credit_limit_warning_no_time\"));\n    }\n    get localesChanged() {\n      const current = [...this.selectedLocales].sort().join(\"|\");\n      const original = [...this.originalLocales].sort().join(\"|\");\n      return current !== original;\n    }\n    get showLocaleSelector() {\n      const noLocales = this.args.model?.no_locales_configured || this.originalLocales.length === 0;\n      return noLocales && !this.translationEnabled;\n    }\n    get showLocalizationSettingsButton() {\n      return this.enabled || !this.showLocaleSelector;\n    }\n    get isToggleDisabled() {\n      return this.isTogglingTranslation || this.args.model?.no_locales_configured && this.originalLocales.length === 0;\n    }\n    get availableLocales() {\n      const locales = this.siteSettings.available_locales;\n      if (!locales) {\n        return [];\n      }\n      return locales;\n    }\n    get settingsUrl() {\n      return this.router.urlFor(\"adminPlugins.show.discourse-ai-features.edit\", this.args.model.translation_id);\n    }\n    get descriptionTooltip() {\n      return (0, _discourseI18n.i18n)(\"discourse_ai.translations.stats.description_tooltip\", {\n        count: this.total\n      });\n    }\n    navigateToLocalizationSettings() {\n      this.router.transitionTo(\"adminConfig.localization.settings\", {\n        queryParams: {\n          filter: \"content_localization_supported_locales\"\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"navigateToLocalizationSettings\", [_object.action]);\n    }\n    updateSelectedLocales(locales) {\n      this.selectedLocales = locales;\n    }\n    static {\n      dt7948.n(this.prototype, \"updateSelectedLocales\", [_object.action]);\n    }\n    async saveLocales() {\n      this.isSavingLocales = true;\n      try {\n        // also enable content_localization_enabled when we're setting locales\n        if (this.selectedLocales.length > 0) {\n          await (0, _ajax.ajax)(\"/admin/site_settings/content_localization_enabled\", {\n            type: \"PUT\",\n            data: {\n              content_localization_enabled: true\n            }\n          });\n        }\n        await (0, _ajax.ajax)(\"/admin/site_settings/content_localization_supported_locales\", {\n          type: \"PUT\",\n          data: {\n            content_localization_supported_locales: this.selectedLocales.join(\"|\")\n          }\n        });\n        this.originalLocales = [...this.selectedLocales];\n        if (this.selectedLocales.length > 0) {\n          this.args.model.no_locales_configured = false;\n        }\n        if (this.translationEnabled) {\n          window.location.reload();\n        }\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        this.isSavingLocales = false;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"saveLocales\", [_object.action]);\n    }\n    cancelLocales() {\n      this.selectedLocales = [...this.originalLocales];\n    }\n    static {\n      dt7948.n(this.prototype, \"cancelLocales\", [_object.action]);\n    }\n    resetLocales() {\n      this.selectedLocales = [];\n    }\n    static {\n      dt7948.n(this.prototype, \"resetLocales\", [_object.action]);\n    }\n    async toggleTranslationEnabled() {\n      if (this.isTogglingTranslation) {\n        return;\n      }\n      if (!this.translationEnabled && this.originalLocales.length === 0) {\n        return;\n      }\n      this.isTogglingTranslation = true;\n      try {\n        if (!this.translationEnabled && this.originalLocales.length > 0) {\n          await (0, _ajax.ajax)(\"/admin/site_settings/content_localization_enabled\", {\n            type: \"PUT\",\n            data: {\n              content_localization_enabled: true\n            }\n          });\n        }\n        await (0, _ajax.ajax)(\"/admin/site_settings/ai_translation_enabled\", {\n          type: \"PUT\",\n          data: {\n            ai_translation_enabled: !this.translationEnabled\n          }\n        });\n        this.translationEnabled = !this.translationEnabled;\n        if (this.translationEnabled && !this.args.model.no_locales_configured) {\n          const response = await (0, _ajax.ajax)(\"/admin/plugins/discourse-ai/ai-translations\");\n          if (response.enabled) {\n            this.data = response.translation_progress;\n            this.total = response.total;\n            this.done = response.posts_with_detected_locale;\n            this.enabled = response.enabled;\n            this.hourlyRate = response.hourly_rate || 0;\n          }\n        } else {\n          this.enabled = false;\n        }\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        this.isTogglingTranslation = false;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleTranslationEnabled\", [_object.action]);\n    }\n    get chartRightPadding() {\n      const max = Math.max(...this.data.map(({\n        total\n      }) => total));\n      switch (true) {\n        case max >= 100000:\n          return 90;\n        case max >= 10000:\n          return 80;\n        case max >= 20:\n          return 70;\n        default:\n          return 50;\n      }\n    }\n    get descriptionKey() {\n      return this.done === this.total ? \"discourse_ai.translations.stats.complete_language_detection_description\" : \"discourse_ai.translations.stats.incomplete_language_detection_description\";\n    }\n    get backfillStatusMessage() {\n      if (this.args.model?.backfill_enabled && this.args.model?.backfill_max_age_days && this.hourlyRate > 0) {\n        const totalRemaining = this.data?.reduce((sum, {\n          total,\n          done\n        }) => sum + (total - done), 0);\n        if (totalRemaining && totalRemaining > 0) {\n          const hoursRemaining = totalRemaining / this.hourlyRate;\n          const cutoffDate = new Date();\n          cutoffDate.setDate(cutoffDate.getDate() - this.args.model.backfill_max_age_days);\n          const formattedDate = cutoffDate.toLocaleDateString(undefined, {\n            year: \"numeric\",\n            month: \"long\",\n            day: \"numeric\"\n          });\n          let timeKey;\n          if (hoursRemaining < 1) {\n            const minutes = Math.ceil(hoursRemaining * 60);\n            timeKey = (0, _discourseI18n.i18n)(\"discourse_ai.translations.stats.eta_minutes\", {\n              count: minutes\n            });\n          } else if (hoursRemaining < 24) {\n            const hours = Math.ceil(hoursRemaining);\n            timeKey = (0, _discourseI18n.i18n)(\"discourse_ai.translations.stats.eta_hours\", {\n              count: hours\n            });\n          } else {\n            const days = Math.ceil(hoursRemaining / 24);\n            timeKey = (0, _discourseI18n.i18n)(\"discourse_ai.translations.stats.eta_days\", {\n              count: days\n            });\n          }\n          return (0, _template.htmlSafe)((0, _discourseI18n.i18n)(\"discourse_ai.translations.stats.backfill_message\", {\n            date: formattedDate,\n            eta: timeKey,\n            settingsUrl: this.settingsUrl\n          }));\n        }\n      }\n      if (!this.args.model?.backfill_enabled) {\n        return (0, _discourseI18n.i18n)(\"discourse_ai.translations.stats.backfill_disabled\");\n      }\n      return null;\n    }\n    get chartColors() {\n      const styles = getComputedStyle(document.querySelector(\".ai-translations\"));\n      return {\n        progress: styles.getPropertyValue(\"--chart-progress-color\").trim(),\n        remaining: styles.getPropertyValue(\"--chart-remaining-color\").trim(),\n        text: styles.getPropertyValue(\"--chart-text-color\").trim(),\n        label: styles.getPropertyValue(\"--chart-label-color\").trim()\n      };\n    }\n    get chartConfig() {\n      if (!this.data?.length) {\n        return {};\n      }\n      const colors = this.chartColors;\n      const processedData = this.data.map(({\n        locale,\n        total,\n        done\n      }) => {\n        const rawPercentage = total > 0 ? done / total * 100 : 0;\n        const donePercentage = Math.trunc(rawPercentage).toString();\n        const localeName = this.languageNameLookup.getLanguageName(locale);\n        const languageNameForTooltip = localeName.split(\" (\")[0];\n        return {\n          locale: localeName,\n          done,\n          total,\n          donePercentage,\n          tooltip: [(0, _discourseI18n.i18n)(\"discourse_ai.translations.progress_chart.tooltip_translated\", {\n            done,\n            total,\n            language: languageNameForTooltip\n          })]\n        };\n      });\n      const chartData = {\n        labels: processedData.map(({\n          locale\n        }) => locale),\n        datasets: [{\n          tooltip: processedData.map(({\n            tooltip\n          }) => tooltip),\n          data: processedData.map(({\n            donePercentage\n          }) => donePercentage),\n          totalItems: processedData.map(({\n            total\n          }) => total),\n          backgroundColor: colors.progress,\n          barThickness: 30,\n          borderRadius: 4\n        }]\n      };\n      return {\n        type: \"bar\",\n        data: chartData,\n        plugins: [{\n          id: \"barTotalText\",\n          afterDraw: ({\n            ctx,\n            data,\n            scales\n          }) => {\n            ctx.save();\n            ctx.textBaseline = \"middle\";\n            ctx.fillStyle = colors.text;\n            const items = data.datasets[0].totalItems;\n            items.forEach((count, i) => {\n              ctx.fillText((0, _discourseI18n.i18n)(\"discourse_ai.translations.progress_chart.bar_done\", {\n                count\n              }), scales.x.getPixelForValue(100) + 10, scales.y.getPixelForValue(i));\n            });\n            ctx.canvas.parentElement.style.height = `${items.length * 50 + 40}px`;\n            ctx.restore();\n          }\n        }],\n        options: {\n          indexAxis: \"y\",\n          responsive: true,\n          maintainAspectRatio: false,\n          layout: {\n            padding: {\n              right: this.chartRightPadding\n            }\n          },\n          scales: {\n            x: {\n              beginAtZero: true,\n              max: 100,\n              grid: {\n                display: false\n              },\n              ticks: {\n                color: colors.text,\n                callback: percentage => (0, _discourseI18n.i18n)(\"discourse_ai.translations.progress_chart.data_label\", {\n                  percentage\n                })\n              }\n            },\n            y: {\n              grid: {\n                display: false\n              },\n              ticks: {\n                color: colors.text\n              }\n            }\n          },\n          plugins: {\n            legend: {\n              display: false\n            },\n            tooltip: {\n              displayColors: false,\n              callbacks: {\n                label: ({\n                  dataset: {\n                    tooltip\n                  },\n                  dataIndex\n                }) => tooltip[dataIndex]\n              }\n            },\n            datalabels: {\n              formatter: percentage => this.site.mobileView && percentage < 20 ? \"\" : (0, _discourseI18n.i18n)(\"discourse_ai.translations.progress_chart.data_label\", {\n                percentage\n              }),\n              color: colors.label\n            }\n          }\n        }\n      };\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"ai-translations admin-detail\">\n        <DPageSubheader\n          @titleLabel={{i18n \"discourse_ai.translations.title\"}}\n          @descriptionLabel={{i18n \"discourse_ai.translations.description\"}}\n          @learnMoreUrl=\"https://meta.discourse.org/t/-/370969\"\n        >\n          <:actions as |actions|>\n            {{#if this.enabled}}\n              <actions.Default\n                @label=\"discourse_ai.translations.admin_actions.translation_settings\"\n                @route=\"adminPlugins.show.discourse-ai-features.edit\"\n                @routeModels={{@model.translation_id}}\n                class=\"ai-translation-settings-button\"\n              />\n            {{/if}}\n            {{#if this.showLocalizationSettingsButton}}\n              <actions.Default\n                @label=\"discourse_ai.translations.admin_actions.localization_settings\"\n                @route=\"adminConfig.localization.settings\"\n                class=\"ai-localization-settings-button\"\n              />\n            {{/if}}\n          </:actions>\n        </DPageSubheader>\n      \n        {{#if this.creditLimitReached}}\n          <div class=\"alert alert-warning ai-translations__credit-warning\">\n            {{icon \"triangle-exclamation\"}}\n            <span>{{this.creditLimitWarningMessage}}</span>\n          </div>\n        {{/if}}\n      \n        {{#if this.showLocaleSelector}}\n          <div class=\"alert alert-info\">\n            <div class=\"settings\">\n              <div class=\"setting\">\n                <div class=\"setting-label\">\n                  <label>{{i18n\n                      \"discourse_ai.translations.supported_locales\"\n                    }}</label>\n                </div>\n                <div class=\"setting-value\">\n                  <div class=\"ai-translations__locale-input-row\">\n                    <MultiSelect\n                      @value={{this.selectedLocales}}\n                      @content={{this.availableLocales}}\n                      @nameProperty=\"name\"\n                      @valueProperty=\"value\"\n                      @onChange={{this.updateSelectedLocales}}\n                      @options={{hash allowAny=false}}\n                    />\n                    {{#if this.localesChanged}}\n                      <div class=\"setting-controls\">\n                        <DButton\n                          @action={{this.saveLocales}}\n                          @icon=\"check\"\n                          @isLoading={{this.isSavingLocales}}\n                          @ariaLabel=\"save\"\n                          class=\"ok setting-controls__ok\"\n                        />\n                        <DButton\n                          @action={{this.cancelLocales}}\n                          @icon=\"xmark\"\n                          @isLoading={{this.isSavingLocales}}\n                          @ariaLabel=\"cancel\"\n                          class=\"cancel setting-controls__cancel\"\n                        />\n                      </div>\n                    {{else if this.selectedLocales.length}}\n                      <DButton\n                        @action={{this.resetLocales}}\n                        @icon=\"arrow-rotate-left\"\n                        @label=\"admin.settings.reset\"\n                        class=\"undo setting-controls__undo\"\n                      />\n                    {{/if}}\n                  </div>\n                  <div class=\"desc\">{{i18n\n                      \"discourse_ai.translations.supported_locales_description\"\n                    }}</div>\n                </div>\n              </div>\n            </div>\n          </div>\n        {{/if}}\n      \n        <div class=\"ai-translations__toggle-container\">\n          <DToggleSwitch\n            @state={{this.translationEnabled}}\n            @label=\"discourse_ai.translations.admin_actions.enable_translations\"\n            disabled={{this.isToggleDisabled}}\n            {{on \"click\" this.toggleTranslationEnabled}}\n          />\n        </div>\n      \n        {{#if this.enabled}}\n          <AdminConfigAreaCard class=\"ai-translations__charts\">\n            <:header>\n              {{i18n \"discourse_ai.translations.progress_chart.title\"}}\n            </:header>\n            <:content>\n              <div class=\"ai-translations__stats-container\">\n                {{#if this.backfillStatusMessage}}\n                  <div class=\"ai-translations__stat-item\">\n                    <span class=\"ai-translations__stat-label\">\n                      {{this.backfillStatusMessage}}\n                    </span>\n                  </div>\n                {{/if}}\n              </div>\n              <div class=\"ai-translations__chart-container\">\n                <Chart\n                  @chartConfig={{this.chartConfig}}\n                  @loadChartDataLabelsPlugin={{true}}\n                  class=\"ai-translations__chart\"\n                />\n              </div>\n            </:content>\n          </AdminConfigAreaCard>\n      \n        {{/if}}\n      \n      </div>\n      */\n      {\n        \"id\": \"TxPNvbE3\",\n        \"block\": \"[[[10,0],[14,0,\\\"ai-translations admin-detail\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],null,[[\\\"@titleLabel\\\",\\\"@descriptionLabel\\\",\\\"@learnMoreUrl\\\"],[[28,[32,1],[\\\"discourse_ai.translations.title\\\"],null],[28,[32,1],[\\\"discourse_ai.translations.description\\\"],null],\\\"https://meta.discourse.org/t/-/370969\\\"]],[[\\\"actions\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"enabled\\\"]],[[[1,\\\"        \\\"],[8,[30,1,[\\\"Default\\\"]],[[24,0,\\\"ai-translation-settings-button\\\"]],[[\\\"@label\\\",\\\"@route\\\",\\\"@routeModels\\\"],[\\\"discourse_ai.translations.admin_actions.translation_settings\\\",\\\"adminPlugins.show.discourse-ai-features.edit\\\",[30,2,[\\\"translation_id\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null],[41,[30,0,[\\\"showLocalizationSettingsButton\\\"]],[[[1,\\\"        \\\"],[8,[30,1,[\\\"Default\\\"]],[[24,0,\\\"ai-localization-settings-button\\\"]],[[\\\"@label\\\",\\\"@route\\\"],[\\\"discourse_ai.translations.admin_actions.localization_settings\\\",\\\"adminConfig.localization.settings\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"]],[1]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"creditLimitReached\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"alert alert-warning ai-translations__credit-warning\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[32,2],[\\\"triangle-exclamation\\\"],null]],[1,\\\"\\\\n      \\\"],[10,1],[12],[1,[30,0,[\\\"creditLimitWarningMessage\\\"]]],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"showLocaleSelector\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"alert alert-info\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"settings\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"setting\\\"],[12],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"setting-label\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"label\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.translations.supported_locales\\\"],null]],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"setting-value\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"ai-translations__locale-input-row\\\"],[12],[1,\\\"\\\\n              \\\"],[8,[32,3],null,[[\\\"@value\\\",\\\"@content\\\",\\\"@nameProperty\\\",\\\"@valueProperty\\\",\\\"@onChange\\\",\\\"@options\\\"],[[30,0,[\\\"selectedLocales\\\"]],[30,0,[\\\"availableLocales\\\"]],\\\"name\\\",\\\"value\\\",[30,0,[\\\"updateSelectedLocales\\\"]],[28,[32,4],null,[[\\\"allowAny\\\"],[false]]]]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"localesChanged\\\"]],[[[1,\\\"                \\\"],[10,0],[14,0,\\\"setting-controls\\\"],[12],[1,\\\"\\\\n                  \\\"],[8,[32,5],[[24,0,\\\"ok setting-controls__ok\\\"]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@isLoading\\\",\\\"@ariaLabel\\\"],[[30,0,[\\\"saveLocales\\\"]],\\\"check\\\",[30,0,[\\\"isSavingLocales\\\"]],\\\"save\\\"]],null],[1,\\\"\\\\n                  \\\"],[8,[32,5],[[24,0,\\\"cancel setting-controls__cancel\\\"]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@isLoading\\\",\\\"@ariaLabel\\\"],[[30,0,[\\\"cancelLocales\\\"]],\\\"xmark\\\",[30,0,[\\\"isSavingLocales\\\"]],\\\"cancel\\\"]],null],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[30,0,[\\\"selectedLocales\\\",\\\"length\\\"]],[[[1,\\\"                \\\"],[8,[32,5],[[24,0,\\\"undo setting-controls__undo\\\"]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@label\\\"],[[30,0,[\\\"resetLocales\\\"]],\\\"arrow-rotate-left\\\",\\\"admin.settings.reset\\\"]],null],[1,\\\"\\\\n              \\\"]],[]],null]],[]]],[1,\\\"            \\\"],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"desc\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.translations.supported_locales_description\\\"],null]],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"ai-translations__toggle-container\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,6],[[16,\\\"disabled\\\",[30,0,[\\\"isToggleDisabled\\\"]]],[4,[32,7],[\\\"click\\\",[30,0,[\\\"toggleTranslationEnabled\\\"]]],null]],[[\\\"@state\\\",\\\"@label\\\"],[[30,0,[\\\"translationEnabled\\\"]],\\\"discourse_ai.translations.admin_actions.enable_translations\\\"]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"enabled\\\"]],[[[1,\\\"    \\\"],[8,[32,8],[[24,0,\\\"ai-translations__charts\\\"]],null,[[\\\"header\\\",\\\"content\\\"],[[[[1,\\\"\\\\n        \\\"],[1,[28,[32,1],[\\\"discourse_ai.translations.progress_chart.title\\\"],null]],[1,\\\"\\\\n      \\\"]],[]],[[[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"ai-translations__stats-container\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"backfillStatusMessage\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"ai-translations__stat-item\\\"],[12],[1,\\\"\\\\n              \\\"],[10,1],[14,0,\\\"ai-translations__stat-label\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[30,0,[\\\"backfillStatusMessage\\\"]]],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"ai-translations__chart-container\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[32,9],[[24,0,\\\"ai-translations__chart\\\"]],[[\\\"@chartConfig\\\",\\\"@loadChartDataLabelsPlugin\\\"],[[30,0,[\\\"chartConfig\\\"]],true]],null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[13]],[\\\"actions\\\",\\\"@model\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-translations.js\",\n        \"scope\": () => [_dPageSubheader.default, _discourseI18n.i18n, _dIcon.default, _multiSelect.default, _helper.hash, _dButton.default, _dToggleSwitch.default, _modifier.on, _adminConfigAreaCard.default, _chart.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTranslations;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/ai-usage\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/render-modifiers/modifiers/did-update\", \"@ember/routing\", \"@ember/service\", \"discourse/admin/components/admin-config-area-card\", \"discourse/admin/components/admin-config-area-empty-list\", \"discourse/admin/components/chart\", \"discourse/components/conditional-loading-spinner\", \"discourse/components/d-button\", \"discourse/components/d-page-subheader\", \"discourse/components/d-stat-tiles\", \"discourse/components/date-time-input-range\", \"discourse/float-kit/components/d-tooltip\", \"discourse/helpers/avatar\", \"discourse/helpers/concat-class\", \"discourse/helpers/d-icon\", \"discourse/lib/ajax\", \"discourse/lib/decorators\", \"discourse/lib/formatter\", \"discourse/select-kit/components/combo-box\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-credit-bar\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _didInsert, _didUpdate, _routing, _service, _adminConfigAreaCard, _adminConfigAreaEmptyList, _chart, _conditionalLoadingSpinner, _dButton, _dPageSubheader, _dStatTiles, _dateTimeInputRange, _dTooltip, _avatar, _concatClass, _dIcon, _ajax, _decorators, _formatter, _comboBox, _truthHelpers, _discourseI18n, _aiCreditBar, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiUsage extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"startDate\", [_tracking.tracked], function () {\n        return moment().subtract(30, \"days\").toDate();\n      });\n    }\n    #startDate = (dt7948.i(this, \"startDate\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"endDate\", [_tracking.tracked], function () {\n        return new Date();\n      });\n    }\n    #endDate = (dt7948.i(this, \"endDate\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"data\", [_tracking.tracked], function () {\n        return this.args.model;\n      });\n    }\n    #data = (dt7948.i(this, \"data\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedFeature\", [_tracking.tracked]);\n    }\n    #selectedFeature = (dt7948.i(this, \"selectedFeature\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedModel\", [_tracking.tracked]);\n    }\n    #selectedModel = (dt7948.i(this, \"selectedModel\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedPeriod\", [_tracking.tracked], function () {\n        return \"month\";\n      });\n    }\n    #selectedPeriod = (dt7948.i(this, \"selectedPeriod\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isCustomDateActive\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isCustomDateActive = (dt7948.i(this, \"isCustomDateActive\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loadingData\", [_tracking.tracked], function () {\n        return true;\n      });\n    }\n    #loadingData = (dt7948.i(this, \"loadingData\"), void 0);\n    constructor() {\n      super(...arguments);\n      this.fetchData();\n    }\n    async fetchData() {\n      const response = await (0, _ajax.ajax)(\"/admin/plugins/discourse-ai/ai-usage-report.json\", {\n        data: {\n          start_date: moment(this.startDate).format(\"YYYY-MM-DD\"),\n          end_date: moment(this.endDate).format(\"YYYY-MM-DD\"),\n          timezone: this.currentUser?.user_option?.timezone || moment.tz.guess(),\n          feature: this.selectedFeature,\n          model: this.selectedModel\n        }\n      });\n      this.data = response;\n      this.loadingData = false;\n    }\n    static {\n      dt7948.n(this.prototype, \"fetchData\", [_object.action]);\n    }\n    async onFilterChange() {\n      await this.fetchData();\n    }\n    static {\n      dt7948.n(this.prototype, \"onFilterChange\", [_object.action]);\n    }\n    onFeatureChanged(value) {\n      this.selectedFeature = value;\n      this.onFilterChange();\n    }\n    static {\n      dt7948.n(this.prototype, \"onFeatureChanged\", [_object.action]);\n    }\n    onModelChanged(value) {\n      this.selectedModel = value;\n      this.onFilterChange();\n    }\n    static {\n      dt7948.n(this.prototype, \"onModelChanged\", [_object.action]);\n    }\n    addCurrencyChar(element) {\n      element.querySelectorAll(\".d-stat-tile__label\").forEach(label => {\n        if (label.innerText.trim() === (0, _discourseI18n.i18n)(\"discourse_ai.usage.total_spending\")) {\n          const valueElement = label.closest(\".d-stat-tile\")?.querySelector(\".d-stat-tile__value\");\n          if (valueElement) {\n            valueElement.innerText = `$${valueElement.innerText}`;\n          }\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"addCurrencyChar\", [_object.action]);\n    }\n    takeUsers(start, end) {\n      return this.data.users.slice(start, end);\n    }\n    static {\n      dt7948.n(this.prototype, \"takeUsers\", [_decorators.bind]);\n    }\n    get userSplitPoint() {\n      if (!this.data?.users) {\n        return 0;\n      }\n      return Math.ceil(this.data.users.length / 2);\n    }\n    normalizeTimeSeriesData(data) {\n      if (!data?.length) {\n        return [];\n      }\n      const startDate = moment(this.startDate);\n      const endDate = moment(this.endDate);\n      const normalized = [];\n      let interval;\n      let format;\n      if (this.data.period === \"hour\") {\n        interval = \"hour\";\n        format = \"YYYY-MM-DD HH:00:00\";\n      } else if (this.data.period === \"day\") {\n        interval = \"day\";\n        format = \"YYYY-MM-DD\";\n      } else {\n        interval = \"month\";\n        format = \"YYYY-MM\";\n      }\n      const dataMap = new Map(data.map(d => [moment(d.period).format(format), d]));\n      for (let currentMoment = moment(startDate); currentMoment.isSameOrBefore(endDate); currentMoment.add(1, interval)) {\n        const dateKey = currentMoment.format(format);\n        const existingData = dataMap.get(dateKey);\n        normalized.push(existingData || {\n          period: currentMoment.format(),\n          total_tokens: 0,\n          total_cache_read_tokens: 0,\n          total_cache_write_tokens: 0,\n          total_request_tokens: 0,\n          total_response_tokens: 0\n        });\n      }\n      return normalized;\n    }\n    get metrics() {\n      return [{\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.total_requests\"),\n        value: this.data.summary.total_requests,\n        tooltip: (0, _discourseI18n.i18n)(\"discourse_ai.usage.stat_tooltips.total_requests\")\n      }, {\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.total_tokens\"),\n        value: this.data.summary.total_tokens,\n        tooltip: (0, _discourseI18n.i18n)(\"discourse_ai.usage.stat_tooltips.total_tokens\")\n      }, {\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.request_tokens\"),\n        value: this.data.summary.total_request_tokens,\n        tooltip: (0, _discourseI18n.i18n)(\"discourse_ai.usage.stat_tooltips.request_tokens\")\n      }, {\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.response_tokens\"),\n        value: this.data.summary.total_response_tokens,\n        tooltip: (0, _discourseI18n.i18n)(\"discourse_ai.usage.stat_tooltips.response_tokens\")\n      }, {\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.cache_read_tokens\"),\n        value: this.data.summary.total_cache_read_tokens,\n        tooltip: (0, _discourseI18n.i18n)(\"discourse_ai.usage.stat_tooltips.cache_read_tokens\")\n      }, {\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.cache_write_tokens\"),\n        value: this.data.summary.total_cache_write_tokens,\n        tooltip: (0, _discourseI18n.i18n)(\"discourse_ai.usage.stat_tooltips.cache_write_tokens\")\n      }, {\n        label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.total_spending\"),\n        value: this.data.summary.total_spending,\n        tooltip: (0, _discourseI18n.i18n)(\"discourse_ai.usage.stat_tooltips.total_spending\")\n      }];\n    }\n    get chartConfig() {\n      if (!this.data?.data) {\n        return;\n      }\n      const normalizedData = this.normalizeTimeSeriesData(this.data.data);\n      const chartEl = document.querySelector(\".ai-usage__chart\");\n      const computedStyle = getComputedStyle(chartEl);\n      const colors = {\n        response: computedStyle.getPropertyValue(\"--chart-response-color\").trim(),\n        request: computedStyle.getPropertyValue(\"--chart-request-color\").trim(),\n        cacheRead: computedStyle.getPropertyValue(\"--chart-cache-read-color\").trim(),\n        cacheWrite: computedStyle.getPropertyValue(\"--chart-cache-write-color\").trim()\n      };\n      return {\n        type: \"bar\",\n        data: {\n          labels: normalizedData.map(row => {\n            const date = moment(row.period);\n            if (this.data.period === \"hour\") {\n              return date.format(\"HH:00\");\n            } else if (this.data.period === \"day\") {\n              return date.format(\"DD-MMM\");\n            } else {\n              return date.format(\"MMM-YY\");\n            }\n          }),\n          datasets: [{\n            label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.response_tokens\"),\n            data: normalizedData.map(row => row.total_response_tokens),\n            backgroundColor: colors.response\n          }, {\n            label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.request_tokens\"),\n            data: normalizedData.map(row => row.total_request_tokens),\n            backgroundColor: colors.request\n          }, {\n            label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.cache_read_tokens\"),\n            data: normalizedData.map(row => row.total_cache_read_tokens),\n            backgroundColor: colors.cacheRead\n          }, {\n            label: (0, _discourseI18n.i18n)(\"discourse_ai.usage.cache_write_tokens\"),\n            data: normalizedData.map(row => row.total_cache_write_tokens),\n            backgroundColor: colors.cacheWrite\n          }]\n        },\n        options: {\n          responsive: true,\n          scales: {\n            x: {\n              stacked: true\n            },\n            y: {\n              stacked: true,\n              beginAtZero: true\n            }\n          }\n        }\n      };\n    }\n    get modelsWithCredits() {\n      return (this.data?.models || []).filter(m => m.credit_allocation);\n    }\n    get modelsWithoutCredits() {\n      return (this.data?.models || []).filter(m => !m.credit_allocation);\n    }\n    get featuresTotals() {\n      const features = this.data?.features || [];\n      let totalSpending = 0;\n      features.forEach(f => {\n        const costType = this.getFeatureCostType(f.feature_name);\n        if (costType === \"included\") {\n          // Don't add to total - included in plan\n        } else if (costType === \"mixed\") {\n          totalSpending += this.getCostOnlySpending(f.feature_name);\n        } else {\n          totalSpending += (f.input_spending || 0) + (f.cache_read_spending || 0) + (f.cache_write_spending || 0) + (f.output_spending || 0);\n        }\n      });\n      return {\n        usage_count: features.reduce((sum, f) => sum + (f.usage_count || 0), 0),\n        total_tokens: features.reduce((sum, f) => sum + (f.total_tokens || 0), 0),\n        total_spending: totalSpending\n      };\n    }\n    get modelsWithoutCreditsTotals() {\n      const models = this.modelsWithoutCredits || [];\n      return {\n        usage_count: models.reduce((sum, m) => sum + (m.usage_count || 0), 0),\n        total_tokens: models.reduce((sum, m) => sum + (m.total_tokens || 0), 0),\n        total_spending: models.reduce((sum, m) => sum + (m.input_spending || 0) + (m.cache_read_spending || 0) + (m.cache_write_spending || 0) + (m.output_spending || 0), 0)\n      };\n    }\n    get usersTotals() {\n      const users = this.data?.users || [];\n      return {\n        usage_count: users.reduce((sum, u) => sum + (u.usage_count || 0), 0),\n        total_tokens: users.reduce((sum, u) => sum + (u.total_tokens || 0), 0),\n        total_spending: users.reduce((sum, u) => sum + (u.input_spending || 0) + (u.cache_read_spending || 0) + (u.cache_write_spending || 0) + (u.output_spending || 0), 0)\n      };\n    }\n    formatSpending(value) {\n      return `$${(value || 0).toFixed(2)}`;\n    }\n    static {\n      dt7948.n(this.prototype, \"formatSpending\", [_decorators.bind]);\n    }\n    getFeatureCostType(featureName) {\n      const models = this.data?.feature_models?.[featureName] || [];\n      if (models.length === 0) {\n        return \"cost\";\n      }\n      const hasIncluded = models.some(m => m.credit_allocation);\n      const hasCost = models.some(m => !m.credit_allocation);\n      if (hasIncluded && !hasCost) {\n        return \"included\";\n      }\n      if (!hasIncluded && hasCost) {\n        return \"cost\";\n      }\n      return \"mixed\";\n    }\n    static {\n      dt7948.n(this.prototype, \"getFeatureCostType\", [_decorators.bind]);\n    }\n    getIncludedModelsForFeature(featureName) {\n      return (this.data?.feature_models?.[featureName] || []).filter(m => m.credit_allocation);\n    }\n    static {\n      dt7948.n(this.prototype, \"getIncludedModelsForFeature\", [_decorators.bind]);\n    }\n    getCostModelsForFeature(featureName) {\n      return (this.data?.feature_models?.[featureName] || []).filter(m => !m.credit_allocation);\n    }\n    static {\n      dt7948.n(this.prototype, \"getCostModelsForFeature\", [_decorators.bind]);\n    }\n    getCostOnlySpending(featureName) {\n      const costModels = this.getCostModelsForFeature(featureName);\n      return costModels.reduce((sum, m) => sum + (m.input_spending || 0) + (m.cache_read_spending || 0) + (m.cache_write_spending || 0) + (m.output_spending || 0), 0);\n    }\n    static {\n      dt7948.n(this.prototype, \"getCostOnlySpending\", [_decorators.bind]);\n    }\n    hasIncludedModelsForFeature(featureName) {\n      return this.getIncludedModelsForFeature(featureName).length > 0;\n    }\n    static {\n      dt7948.n(this.prototype, \"hasIncludedModelsForFeature\", [_decorators.bind]);\n    }\n    hasCostModelsForFeature(featureName) {\n      return this.getCostModelsForFeature(featureName).length > 0;\n    }\n    static {\n      dt7948.n(this.prototype, \"hasCostModelsForFeature\", [_decorators.bind]);\n    }\n    get availableFeatures() {\n      if (this._cachedFeatures) {\n        return this._cachedFeatures;\n      }\n      const features = this.data?.features;\n      if (features?.length) {\n        this._cachedFeatures = features.map(f => ({\n          id: f.feature_name,\n          name: f.feature_name\n        }));\n      }\n      return this._cachedFeatures || [];\n    }\n    get availableModels() {\n      if (this._cachedModels) {\n        return this._cachedModels;\n      }\n      const models = this.data?.models;\n      if (models?.length) {\n        this._cachedModels = models.map(m => ({\n          id: m.id,\n          name: m.llm\n        }));\n      }\n      return this._cachedModels || [];\n    }\n    get periodOptions() {\n      return [{\n        id: \"day\",\n        name: (0, _discourseI18n.i18n)(\"discourse_ai.usage.periods.last_day\")\n      }, {\n        id: \"week\",\n        name: (0, _discourseI18n.i18n)(\"discourse_ai.usage.periods.last_week\")\n      }, {\n        id: \"month\",\n        name: (0, _discourseI18n.i18n)(\"discourse_ai.usage.periods.last_month\")\n      }];\n    }\n    setPeriodDates(period) {\n      const now = moment();\n      switch (period) {\n        case \"day\":\n          this.startDate = now.clone().subtract(1, \"day\").toDate();\n          this.endDate = now.toDate();\n          break;\n        case \"week\":\n          this.startDate = now.clone().subtract(7, \"days\").toDate();\n          this.endDate = now.toDate();\n          break;\n        case \"month\":\n          this.startDate = now.clone().subtract(30, \"days\").toDate();\n          this.endDate = now.toDate();\n          break;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"setPeriodDates\", [_object.action]);\n    }\n    onPeriodSelect(period) {\n      this._cachedFeatures = null;\n      this._cachedModels = null;\n      this.selectedPeriod = period;\n      this.isCustomDateActive = false;\n      this.setPeriodDates(period);\n      this.fetchData();\n    }\n    static {\n      dt7948.n(this.prototype, \"onPeriodSelect\", [_object.action]);\n    }\n    onCustomDateClick() {\n      this.isCustomDateActive = !this.isCustomDateActive;\n      if (this.isCustomDateActive) {\n        this.selectedPeriod = null;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"onCustomDateClick\", [_object.action]);\n    }\n    onDateChange() {\n      this._cachedFeatures = null;\n      this._cachedModels = null;\n      this.isCustomDateActive = true;\n      this.selectedPeriod = null;\n      this.fetchData();\n    }\n    static {\n      dt7948.n(this.prototype, \"onDateChange\", [_object.action]);\n    }\n    onChangeDateRange({\n      from,\n      to\n    }) {\n      this._startDate = from;\n      this._endDate = to;\n    }\n    static {\n      dt7948.n(this.prototype, \"onChangeDateRange\", [_object.action]);\n    }\n    onRefreshDateRange() {\n      this._cachedFeatures = null;\n      this._cachedModels = null;\n      this.startDate = this._startDate;\n      this.endDate = this._endDate;\n      this.fetchData();\n      this._startDate = null;\n      this._endDate = null;\n    }\n    static {\n      dt7948.n(this.prototype, \"onRefreshDateRange\", [_object.action]);\n    }\n    get fromDate() {\n      return this._startDate || this.startDate;\n    }\n    get toDate() {\n      return this._endDate || this.endDate;\n    }\n    totalSpending(inputSpending, cacheReadSpending, cacheWriteSpending, outputSpending) {\n      const total = (inputSpending || 0) + (cacheReadSpending || 0) + (cacheWriteSpending || 0) + (outputSpending || 0);\n      return `$${total.toFixed(2)}`;\n    }\n    static {\n      dt7948.n(this.prototype, \"totalSpending\", [_decorators.bind]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"ai-usage admin-detail\">\n        <DPageSubheader\n          @titleLabel={{i18n \"discourse_ai.usage.short_title\"}}\n          @learnMoreUrl=\"https://meta.discourse.org/t/-/348677\"\n          @descriptionLabel={{i18n \"discourse_ai.usage.subheader_description\"}}\n        />\n        <div class=\"ai-usage__filters\">\n          <div class=\"ai-usage__filters-dates\">\n            <div class=\"ai-usage__period-buttons\">\n              {{#each this.periodOptions as |option|}}\n                <DButton\n                  class={{if\n                    (eq this.selectedPeriod option.id)\n                    \"btn-primary\"\n                    \"btn-default\"\n                  }}\n                  @action={{fn this.onPeriodSelect option.id}}\n                  @translatedLabel={{option.name}}\n                />\n              {{/each}}\n              <DButton\n                class={{if this.isCustomDateActive \"btn-primary\" \"btn-default\"}}\n                @action={{this.onCustomDateClick}}\n                @label=\"discourse_ai.usage.periods.custom\"\n              />\n            </div>\n      \n            {{#if this.isCustomDateActive}}\n              <div class=\"ai-usage__custom-date-pickers\">\n      \n                <DateTimeInputRange\n                  @from={{this.fromDate}}\n                  @to={{this.toDate}}\n                  @onChange={{this.onChangeDateRange}}\n                  @showFromTime={{false}}\n                  @showToTime={{false}}\n                />\n      \n                <DButton @action={{this.onRefreshDateRange}} @label=\"refresh\" />\n              </div>\n            {{/if}}\n          </div>\n      \n          <div class=\"ai-usage__filters-row\">\n            <ComboBox\n              @value={{this.selectedFeature}}\n              @content={{this.availableFeatures}}\n              @onChange={{this.onFeatureChanged}}\n              @options={{hash none=\"discourse_ai.usage.all_features\"}}\n              class=\"ai-usage__feature-selector\"\n            />\n      \n            <ComboBox\n              @value={{this.selectedModel}}\n              @content={{this.availableModels}}\n              @onChange={{this.onModelChanged}}\n              @options={{hash none=\"discourse_ai.usage.all_models\"}}\n              class=\"ai-usage__model-selector\"\n            />\n          </div>\n      \n          <ConditionalLoadingSpinner @condition={{this.loadingData}}>\n            <AdminConfigAreaCard\n              @heading=\"discourse_ai.usage.summary\"\n              class=\"ai-usage__summary\"\n            >\n              <:content>\n                <DStatTiles\n                  {{didInsert this.addCurrencyChar this.metrics}}\n                  {{didUpdate this.addCurrencyChar this.metrics}}\n                  as |tiles|\n                >\n      \n                  {{#each this.metrics as |metric|}}\n                    <tiles.Tile\n                      class=\"bar\"\n                      @label={{metric.label}}\n                      @href={{metric.href}}\n                      @value={{metric.value}}\n                      @tooltip={{metric.tooltip}}\n                    />\n                  {{/each}}\n                </DStatTiles>\n              </:content>\n            </AdminConfigAreaCard>\n      \n            <AdminConfigAreaCard\n              class=\"ai-usage__charts\"\n              @heading=\"discourse_ai.usage.tokens_over_time\"\n            >\n              <:content>\n                <div class=\"ai-usage__chart-container\">\n                  <Chart\n                    @chartConfig={{this.chartConfig}}\n                    class=\"ai-usage__chart\"\n                  />\n                </div>\n              </:content>\n            </AdminConfigAreaCard>\n      \n            <div class=\"ai-usage__breakdowns\">\n              <AdminConfigAreaCard\n                class=\"ai-usage__features\"\n                @heading=\"discourse_ai.usage.features_breakdown\"\n              >\n                <:content>\n                  {{#unless this.data.features.length}}\n                    <AdminConfigAreaEmptyList\n                      @emptyLabel=\"discourse_ai.usage.no_features\"\n                    />\n                  {{/unless}}\n      \n                  {{#if this.data.features.length}}\n                    <table class=\"ai-usage__features-table\">\n                      <thead>\n                        <tr>\n                          <th>{{i18n \"discourse_ai.usage.feature\"}}</th>\n                          <th>{{i18n \"discourse_ai.usage.usage_count\"}}</th>\n                          <th>{{i18n \"discourse_ai.usage.total_tokens\"}}</th>\n                          <th>{{i18n \"discourse_ai.usage.total_spending\"}}</th>\n                        </tr>\n                      </thead>\n                      <tbody>\n                        {{#each this.data.features as |feature|}}\n                          <tr class=\"ai-usage__features-row\">\n                            <td\n                              class=\"ai-usage__features-cell\"\n                            >{{feature.feature_name}}</td>\n                            <td\n                              class=\"ai-usage__features-cell\"\n                              title={{feature.usage_count}}\n                            >{{number feature.usage_count}}</td>\n                            <td\n                              class=\"ai-usage__features-cell\"\n                              title={{feature.total_tokens}}\n                            >{{number feature.total_tokens}}</td>\n                            <td class=\"ai-usage__features-cell\">\n                              {{#if\n                                (eq\n                                  (this.getFeatureCostType feature.feature_name)\n                                  \"included\"\n                                )\n                              }}\n                                <span class=\"ai-usage__included-label\">\n                                  {{i18n \"discourse_ai.usage.included_in_plan\"}}\n                                </span>\n                              {{else if\n                                (eq\n                                  (this.getFeatureCostType feature.feature_name)\n                                  \"cost\"\n                                )\n                              }}\n                                {{this.totalSpending\n                                  feature.input_spending\n                                  feature.cache_read_spending\n                                  feature.cache_write_spending\n                                  feature.output_spending\n                                }}\n                              {{else}}\n                                <span class=\"ai-usage__mixed-cost\">\n                                  {{this.formatSpending\n                                    (this.getCostOnlySpending\n                                      feature.feature_name\n                                    )\n                                  }}\n                                  <DTooltip\n                                    @identifier=\"ai-usage-feature-breakdown\"\n                                    @placement=\"top\"\n                                    @interactive={{true}}\n                                    @maxWidth={{600}}\n                                  >\n                                    <:trigger>\n                                      {{icon\n                                        \"circle-question\"\n                                        class=\"ai-usage__info-icon\"\n                                      }}\n                                    </:trigger>\n                                    <:content>\n                                      <div class=\"ai-usage__cost-breakdown\">\n                                        {{#if\n                                          (this.hasIncludedModelsForFeature\n                                            feature.feature_name\n                                          )\n                                        }}\n                                          <div\n                                            class=\"ai-usage__breakdown-section\"\n                                          >\n                                            <h4>{{i18n\n                                                \"discourse_ai.usage.included_models\"\n                                              }}</h4>\n                                            <table\n                                              class=\"ai-usage__breakdown-table\"\n                                            >\n                                              <thead>\n                                                <tr>\n                                                  <th>{{i18n\n                                                      \"discourse_ai.usage.model\"\n                                                    }}</th>\n                                                  <th>{{i18n\n                                                      \"discourse_ai.usage.usage_count\"\n                                                    }}</th>\n                                                  <th>{{i18n\n                                                      \"discourse_ai.usage.total_tokens\"\n                                                    }}</th>\n                                                  <th>{{i18n\n                                                      \"discourse_ai.usage.cost\"\n                                                    }}</th>\n                                                </tr>\n                                              </thead>\n                                              <tbody>\n                                                {{#each\n                                                  (this.getIncludedModelsForFeature\n                                                    feature.feature_name\n                                                  )\n                                                  as |model|\n                                                }}\n                                                  <tr>\n                                                    <td>{{model.llm}}</td>\n                                                    <td>{{number\n                                                        model.usage_count\n                                                      }}</td>\n                                                    <td>{{number\n                                                        model.total_tokens\n                                                      }}</td>\n                                                    <td>{{i18n\n                                                        \"discourse_ai.usage.included_in_plan\"\n                                                      }}</td>\n                                                  </tr>\n                                                {{/each}}\n                                              </tbody>\n                                            </table>\n                                          </div>\n                                        {{/if}}\n                                        {{#if\n                                          (this.hasCostModelsForFeature\n                                            feature.feature_name\n                                          )\n                                        }}\n                                          <div\n                                            class=\"ai-usage__breakdown-section\"\n                                          >\n                                            <h4>{{i18n\n                                                \"discourse_ai.usage.billed_models\"\n                                              }}</h4>\n                                            <table\n                                              class=\"ai-usage__breakdown-table\"\n                                            >\n                                              <thead>\n                                                <tr>\n                                                  <th>{{i18n\n                                                      \"discourse_ai.usage.model\"\n                                                    }}</th>\n                                                  <th>{{i18n\n                                                      \"discourse_ai.usage.usage_count\"\n                                                    }}</th>\n                                                  <th>{{i18n\n                                                      \"discourse_ai.usage.total_tokens\"\n                                                    }}</th>\n                                                  <th>{{i18n\n                                                      \"discourse_ai.usage.cost\"\n                                                    }}</th>\n                                                </tr>\n                                              </thead>\n                                              <tbody>\n                                                {{#each\n                                                  (this.getCostModelsForFeature\n                                                    feature.feature_name\n                                                  )\n                                                  as |model|\n                                                }}\n                                                  <tr>\n                                                    <td>{{model.llm}}</td>\n                                                    <td>{{number\n                                                        model.usage_count\n                                                      }}</td>\n                                                    <td>{{number\n                                                        model.total_tokens\n                                                      }}</td>\n                                                    <td>{{this.totalSpending\n                                                        model.input_spending\n                                                        model.cache_read_spending\n                                                        model.cache_write_spending\n                                                        model.output_spending\n                                                      }}</td>\n                                                  </tr>\n                                                {{/each}}\n                                              </tbody>\n                                            </table>\n                                          </div>\n                                        {{/if}}\n                                      </div>\n                                    </:content>\n                                  </DTooltip>\n                                </span>\n                              {{/if}}\n                            </td>\n                          </tr>\n                        {{/each}}\n                        <tr class=\"ai-usage__total-row\">\n                          <td>{{i18n \"discourse_ai.usage.total\"}}</td>\n                          <td title={{this.featuresTotals.usage_count}}>{{number\n                              this.featuresTotals.usage_count\n                            }}</td>\n                          <td title={{this.featuresTotals.total_tokens}}>{{number\n                              this.featuresTotals.total_tokens\n                            }}</td>\n                          <td>{{this.formatSpending\n                              this.featuresTotals.total_spending\n                            }}</td>\n                        </tr>\n                      </tbody>\n                    </table>\n                  {{/if}}\n                </:content>\n              </AdminConfigAreaCard>\n      \n              <AdminConfigAreaCard\n                class=\"ai-usage__models\"\n                @heading=\"discourse_ai.usage.models_breakdown\"\n              >\n                <:content>\n                  {{#unless this.data.models.length}}\n                    <AdminConfigAreaEmptyList\n                      @emptyLabel=\"discourse_ai.usage.no_models\"\n                    />\n                  {{/unless}}\n      \n                  {{#if this.modelsWithCredits.length}}\n                    <table class=\"ai-usage__models-table\">\n                      <thead>\n                        <tr>\n                          <th>{{i18n \"discourse_ai.usage.model\"}}</th>\n                          <th>{{i18n \"discourse_ai.usage.usage_count\"}}</th>\n                          <th>{{i18n \"discourse_ai.usage.total_tokens\"}}</th>\n                          <th>{{i18n \"discourse_ai.usage.credits_remaining\"}}</th>\n                        </tr>\n                      </thead>\n                      <tbody>\n                        {{#each this.modelsWithCredits as |model|}}\n                          <tr class=\"ai-usage__models-row\">\n                            <td class=\"ai-usage__models-cell\">{{model.llm}}</td>\n                            <td\n                              class=\"ai-usage__models-cell\"\n                              title={{model.usage_count}}\n                            >{{number model.usage_count}}</td>\n                            <td\n                              class=\"ai-usage__models-cell\"\n                              title={{model.total_tokens}}\n                            >{{number model.total_tokens}}</td>\n                            <td class=\"ai-usage__models-credit-bar\">\n                              <AiCreditBar\n                                @allocation={{model.credit_allocation}}\n                                @compact={{true}}\n                              />\n                            </td>\n                          </tr>\n                        {{/each}}\n                      </tbody>\n                    </table>\n                  {{/if}}\n      \n                  {{#if this.modelsWithoutCredits.length}}\n                    <table class=\"ai-usage__models-table\">\n                      <thead>\n                        <tr>\n                          <th>{{i18n \"discourse_ai.usage.model\"}}</th>\n                          <th>{{i18n \"discourse_ai.usage.usage_count\"}}</th>\n                          <th>{{i18n \"discourse_ai.usage.total_tokens\"}}</th>\n                          <th>{{i18n \"discourse_ai.usage.total_spending\"}}</th>\n                        </tr>\n                      </thead>\n                      <tbody>\n                        {{#each this.modelsWithoutCredits as |model|}}\n                          <tr class=\"ai-usage__models-row\">\n                            <td class=\"ai-usage__models-cell\">{{model.llm}}</td>\n                            <td\n                              class=\"ai-usage__models-cell\"\n                              title={{model.usage_count}}\n                            >{{number model.usage_count}}</td>\n                            <td\n                              class=\"ai-usage__models-cell\"\n                              title={{model.total_tokens}}\n                            >{{number model.total_tokens}}</td>\n                            <td>\n                              {{this.totalSpending\n                                model.input_spending\n                                model.cache_read_spending\n                                model.cache_write_spending\n                                model.output_spending\n                              }}\n                            </td>\n                          </tr>\n                        {{/each}}\n                        <tr class=\"ai-usage__total-row\">\n                          <td>{{i18n \"discourse_ai.usage.total\"}}</td>\n                          <td\n                            title={{this.modelsWithoutCreditsTotals.usage_count}}\n                          >{{number\n                              this.modelsWithoutCreditsTotals.usage_count\n                            }}</td>\n                          <td\n                            title={{this.modelsWithoutCreditsTotals.total_tokens}}\n                          >{{number\n                              this.modelsWithoutCreditsTotals.total_tokens\n                            }}</td>\n                          <td>{{this.formatSpending\n                              this.modelsWithoutCreditsTotals.total_spending\n                            }}</td>\n                        </tr>\n                      </tbody>\n                    </table>\n                  {{/if}}\n                </:content>\n              </AdminConfigAreaCard>\n      \n              <AdminConfigAreaCard\n                class=\"ai-usage__users\"\n                @heading=\"discourse_ai.usage.users_breakdown\"\n              >\n                <:content>\n                  {{#unless this.data.users.length}}\n                    <AdminConfigAreaEmptyList\n                      @emptyLabel=\"discourse_ai.usage.no_users\"\n                    />\n                  {{/unless}}\n      \n                  {{#if this.data.users.length}}\n                    <div\n                      class={{concatClass\n                        \"ai-usage__users-table-wrapper\"\n                        (if (gt this.data.users.length 24) \"-multi-column\")\n                      }}\n                    >\n                      <table class=\"ai-usage__users-table\">\n                        <thead>\n                          <tr>\n                            <th class=\"ai-usage__users-username\">{{i18n\n                                \"discourse_ai.usage.username\"\n                              }}</th>\n                            <th>{{i18n \"discourse_ai.usage.usage_count\"}}</th>\n                            <th>{{i18n \"discourse_ai.usage.total_tokens\"}}</th>\n                            <th>{{i18n \"discourse_ai.usage.total_spending\"}}</th>\n                          </tr>\n                        </thead>\n                        <tbody>\n                          {{#each\n                            (this.takeUsers 0 this.userSplitPoint)\n                            as |user|\n                          }}\n                            <tr class=\"ai-usage__users-row\">\n                              <td class=\"ai-usage__users-cell\">\n                                <div class=\"user-info\">\n                                  <LinkTo\n                                    @route=\"user\"\n                                    @model={{user.username}}\n                                    class=\"username\"\n                                  >\n                                    {{avatar user imageSize=\"tiny\"}}\n                                    {{user.username}}\n                                  </LinkTo>\n                                </div></td>\n                              <td\n                                class=\"ai-usage__users-cell\"\n                                title={{user.usage_count}}\n                              >{{number user.usage_count}}</td>\n                              <td\n                                class=\"ai-usage__users-cell\"\n                                title={{user.total_tokens}}\n                              >{{number user.total_tokens}}</td>\n                              <td>\n                                {{this.totalSpending\n                                  user.input_spending\n                                  user.cache_read_spending\n                                  user.cache_write_spending\n                                  user.output_spending\n                                }}\n                              </td>\n                            </tr>\n                          {{/each}}\n                          {{#unless (gt this.data.users.length 24)}}\n                            <tr class=\"ai-usage__total-row\">\n                              <td>{{i18n \"discourse_ai.usage.total\"}}</td>\n                              <td title={{this.usersTotals.usage_count}}>{{number\n                                  this.usersTotals.usage_count\n                                }}</td>\n                              <td title={{this.usersTotals.total_tokens}}>{{number\n                                  this.usersTotals.total_tokens\n                                }}</td>\n                              <td>{{this.formatSpending\n                                  this.usersTotals.total_spending\n                                }}</td>\n                            </tr>\n                          {{/unless}}\n                        </tbody>\n                      </table>\n      \n                      {{#if (gt this.data.users.length 24)}}\n                        <table class=\"ai-usage__users-table\">\n                          <thead>\n                            <tr>\n                              <th class=\"ai-usage__users-username\">{{i18n\n                                  \"discourse_ai.usage.username\"\n                                }}</th>\n                              <th>{{i18n \"discourse_ai.usage.usage_count\"}}</th>\n                              <th>{{i18n \"discourse_ai.usage.total_tokens\"}}</th>\n                              <th>{{i18n\n                                  \"discourse_ai.usage.total_spending\"\n                                }}</th>\n                            </tr>\n                          </thead>\n                          <tbody>\n                            {{#each\n                              (this.takeUsers this.userSplitPoint 50)\n                              as |user|\n                            }}\n                              <tr class=\"ai-usage__users-row\">\n                                <td class=\"ai-usage__users-cell\">\n                                  <div class=\"user-info\">\n                                    <LinkTo\n                                      @route=\"user\"\n                                      @model={{user.username}}\n                                      class=\"username\"\n                                    >\n                                      {{avatar user imageSize=\"tiny\"}}\n                                      {{user.username}}\n                                    </LinkTo>\n                                  </div></td>\n                                <td\n                                  class=\"ai-usage__users-cell\"\n                                  title={{user.usage_count}}\n                                >{{number user.usage_count}}</td>\n                                <td\n                                  class=\"ai-usage__users-cell\"\n                                  title={{user.total_tokens}}\n                                >{{number user.total_tokens}}</td>\n                                <td>\n                                  {{this.totalSpending\n                                    user.input_spending\n                                    user.cache_read_spending\n                                    user.cache_write_spending\n                                    user.output_spending\n                                  }}\n                                </td>\n                              </tr>\n                            {{/each}}\n                            <tr class=\"ai-usage__total-row\">\n                              <td>{{i18n \"discourse_ai.usage.total\"}}</td>\n                              <td title={{this.usersTotals.usage_count}}>{{number\n                                  this.usersTotals.usage_count\n                                }}</td>\n                              <td title={{this.usersTotals.total_tokens}}>{{number\n                                  this.usersTotals.total_tokens\n                                }}</td>\n                              <td>{{this.formatSpending\n                                  this.usersTotals.total_spending\n                                }}</td>\n                            </tr>\n                          </tbody>\n                        </table>\n                      {{/if}}\n                    </div>\n                  {{/if}}\n                </:content>\n              </AdminConfigAreaCard>\n            </div>\n          </ConditionalLoadingSpinner>\n        </div>\n      </div>\n      */\n      {\n        \"id\": \"KKmOec5/\",\n        \"block\": \"[[[10,0],[14,0,\\\"ai-usage admin-detail\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],null,[[\\\"@titleLabel\\\",\\\"@learnMoreUrl\\\",\\\"@descriptionLabel\\\"],[[28,[32,1],[\\\"discourse_ai.usage.short_title\\\"],null],\\\"https://meta.discourse.org/t/-/348677\\\",[28,[32,1],[\\\"discourse_ai.usage.subheader_description\\\"],null]]],null],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"ai-usage__filters\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-usage__filters-dates\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"ai-usage__period-buttons\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"periodOptions\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[8,[32,2],[[16,0,[52,[28,[32,3],[[30,0,[\\\"selectedPeriod\\\"]],[30,1,[\\\"id\\\"]]],null],\\\"btn-primary\\\",\\\"btn-default\\\"]]],[[\\\"@action\\\",\\\"@translatedLabel\\\"],[[28,[32,4],[[30,0,[\\\"onPeriodSelect\\\"]],[30,1,[\\\"id\\\"]]],null],[30,1,[\\\"name\\\"]]]],null],[1,\\\"\\\\n\\\"]],[1]],null],[1,\\\"        \\\"],[8,[32,2],[[16,0,[52,[30,0,[\\\"isCustomDateActive\\\"]],\\\"btn-primary\\\",\\\"btn-default\\\"]]],[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"onCustomDateClick\\\"]],\\\"discourse_ai.usage.periods.custom\\\"]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"isCustomDateActive\\\"]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"ai-usage__custom-date-pickers\\\"],[12],[1,\\\"\\\\n\\\\n          \\\"],[8,[32,5],null,[[\\\"@from\\\",\\\"@to\\\",\\\"@onChange\\\",\\\"@showFromTime\\\",\\\"@showToTime\\\"],[[30,0,[\\\"fromDate\\\"]],[30,0,[\\\"toDate\\\"]],[30,0,[\\\"onChangeDateRange\\\"]],false,false]],null],[1,\\\"\\\\n\\\\n          \\\"],[8,[32,2],null,[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"onRefreshDateRange\\\"]],\\\"refresh\\\"]],null],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"ai-usage__filters-row\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,6],[[24,0,\\\"ai-usage__feature-selector\\\"]],[[\\\"@value\\\",\\\"@content\\\",\\\"@onChange\\\",\\\"@options\\\"],[[30,0,[\\\"selectedFeature\\\"]],[30,0,[\\\"availableFeatures\\\"]],[30,0,[\\\"onFeatureChanged\\\"]],[28,[32,7],null,[[\\\"none\\\"],[\\\"discourse_ai.usage.all_features\\\"]]]]],null],[1,\\\"\\\\n\\\\n      \\\"],[8,[32,6],[[24,0,\\\"ai-usage__model-selector\\\"]],[[\\\"@value\\\",\\\"@content\\\",\\\"@onChange\\\",\\\"@options\\\"],[[30,0,[\\\"selectedModel\\\"]],[30,0,[\\\"availableModels\\\"]],[30,0,[\\\"onModelChanged\\\"]],[28,[32,7],null,[[\\\"none\\\"],[\\\"discourse_ai.usage.all_models\\\"]]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[8,[32,8],null,[[\\\"@condition\\\"],[[30,0,[\\\"loadingData\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[32,9],[[24,0,\\\"ai-usage__summary\\\"]],[[\\\"@heading\\\"],[\\\"discourse_ai.usage.summary\\\"]],[[\\\"content\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[32,10],[[4,[32,11],[[30,0,[\\\"addCurrencyChar\\\"]],[30,0,[\\\"metrics\\\"]]],null],[4,[32,12],[[30,0,[\\\"addCurrencyChar\\\"]],[30,0,[\\\"metrics\\\"]]],null]],null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"metrics\\\"]]],null]],null],null,[[[1,\\\"              \\\"],[8,[30,2,[\\\"Tile\\\"]],[[24,0,\\\"bar\\\"]],[[\\\"@label\\\",\\\"@href\\\",\\\"@value\\\",\\\"@tooltip\\\"],[[30,3,[\\\"label\\\"]],[30,3,[\\\"href\\\"]],[30,3,[\\\"value\\\"]],[30,3,[\\\"tooltip\\\"]]]],null],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"          \\\"]],[2]]]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[32,9],[[24,0,\\\"ai-usage__charts\\\"]],[[\\\"@heading\\\"],[\\\"discourse_ai.usage.tokens_over_time\\\"]],[[\\\"content\\\"],[[[[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"ai-usage__chart-container\\\"],[12],[1,\\\"\\\\n            \\\"],[8,[32,13],[[24,0,\\\"ai-usage__chart\\\"]],[[\\\"@chartConfig\\\"],[[30,0,[\\\"chartConfig\\\"]]]],null],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n\\\\n      \\\"],[10,0],[14,0,\\\"ai-usage__breakdowns\\\"],[12],[1,\\\"\\\\n        \\\"],[8,[32,9],[[24,0,\\\"ai-usage__features\\\"]],[[\\\"@heading\\\"],[\\\"discourse_ai.usage.features_breakdown\\\"]],[[\\\"content\\\"],[[[[1,\\\"\\\\n\\\"],[41,[51,[30,0,[\\\"data\\\",\\\"features\\\",\\\"length\\\"]]],[[[1,\\\"              \\\"],[8,[32,14],null,[[\\\"@emptyLabel\\\"],[\\\"discourse_ai.usage.no_features\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"data\\\",\\\"features\\\",\\\"length\\\"]],[[[1,\\\"              \\\"],[10,\\\"table\\\"],[14,0,\\\"ai-usage__features-table\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.feature\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.usage_count\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_tokens\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_spending\\\"],null]],[13],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"data\\\",\\\"features\\\"]]],null]],null],null,[[[1,\\\"                    \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-usage__features-row\\\"],[12],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__features-cell\\\"],[12],[1,[30,4,[\\\"feature_name\\\"]]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__features-cell\\\"],[15,\\\"title\\\",[30,4,[\\\"usage_count\\\"]]],[12],[1,[28,[32,15],[[30,4,[\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__features-cell\\\"],[15,\\\"title\\\",[30,4,[\\\"total_tokens\\\"]]],[12],[1,[28,[32,15],[[30,4,[\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__features-cell\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[32,3],[[28,[30,0,[\\\"getFeatureCostType\\\"]],[[30,4,[\\\"feature_name\\\"]]],null],\\\"included\\\"],null],[[[1,\\\"                          \\\"],[10,1],[14,0,\\\"ai-usage__included-label\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[32,1],[\\\"discourse_ai.usage.included_in_plan\\\"],null]],[1,\\\"\\\\n                          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,3],[[28,[30,0,[\\\"getFeatureCostType\\\"]],[[30,4,[\\\"feature_name\\\"]]],null],\\\"cost\\\"],null],[[[1,\\\"                          \\\"],[1,[28,[30,0,[\\\"totalSpending\\\"]],[[30,4,[\\\"input_spending\\\"]],[30,4,[\\\"cache_read_spending\\\"]],[30,4,[\\\"cache_write_spending\\\"]],[30,4,[\\\"output_spending\\\"]]],null]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"                          \\\"],[10,1],[14,0,\\\"ai-usage__mixed-cost\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[30,0,[\\\"formatSpending\\\"]],[[28,[30,0,[\\\"getCostOnlySpending\\\"]],[[30,4,[\\\"feature_name\\\"]]],null]],null]],[1,\\\"\\\\n                            \\\"],[8,[32,16],null,[[\\\"@identifier\\\",\\\"@placement\\\",\\\"@interactive\\\",\\\"@maxWidth\\\"],[\\\"ai-usage-feature-breakdown\\\",\\\"top\\\",true,600]],[[\\\"trigger\\\",\\\"content\\\"],[[[[1,\\\"\\\\n                                \\\"],[1,[28,[32,17],[\\\"circle-question\\\"],[[\\\"class\\\"],[\\\"ai-usage__info-icon\\\"]]]],[1,\\\"\\\\n                              \\\"]],[]],[[[1,\\\"\\\\n                                \\\"],[10,0],[14,0,\\\"ai-usage__cost-breakdown\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[30,0,[\\\"hasIncludedModelsForFeature\\\"]],[[30,4,[\\\"feature_name\\\"]]],null],[[[1,\\\"                                    \\\"],[10,0],[14,0,\\\"ai-usage__breakdown-section\\\"],[12],[1,\\\"\\\\n                                      \\\"],[10,\\\"h4\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.included_models\\\"],null]],[13],[1,\\\"\\\\n                                      \\\"],[10,\\\"table\\\"],[14,0,\\\"ai-usage__breakdown-table\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                                          \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.model\\\"],null]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.usage_count\\\"],null]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_tokens\\\"],null]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.cost\\\"],null]],[13],[1,\\\"\\\\n                                          \\\"],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[28,[30,0,[\\\"getIncludedModelsForFeature\\\"]],[[30,4,[\\\"feature_name\\\"]]],null]],null]],null],null,[[[1,\\\"                                            \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                                              \\\"],[10,\\\"td\\\"],[12],[1,[30,5,[\\\"llm\\\"]]],[13],[1,\\\"\\\\n                                              \\\"],[10,\\\"td\\\"],[12],[1,[28,[32,15],[[30,5,[\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                                              \\\"],[10,\\\"td\\\"],[12],[1,[28,[32,15],[[30,5,[\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                                              \\\"],[10,\\\"td\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.included_in_plan\\\"],null]],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n\\\"]],[5]],null],[1,\\\"                                        \\\"],[13],[1,\\\"\\\\n                                      \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[28,[30,0,[\\\"hasCostModelsForFeature\\\"]],[[30,4,[\\\"feature_name\\\"]]],null],[[[1,\\\"                                    \\\"],[10,0],[14,0,\\\"ai-usage__breakdown-section\\\"],[12],[1,\\\"\\\\n                                      \\\"],[10,\\\"h4\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.billed_models\\\"],null]],[13],[1,\\\"\\\\n                                      \\\"],[10,\\\"table\\\"],[14,0,\\\"ai-usage__breakdown-table\\\"],[12],[1,\\\"\\\\n                                        \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                                          \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                                            \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.model\\\"],null]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.usage_count\\\"],null]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_tokens\\\"],null]],[13],[1,\\\"\\\\n                                            \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.cost\\\"],null]],[13],[1,\\\"\\\\n                                          \\\"],[13],[1,\\\"\\\\n                                        \\\"],[13],[1,\\\"\\\\n                                        \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[28,[30,0,[\\\"getCostModelsForFeature\\\"]],[[30,4,[\\\"feature_name\\\"]]],null]],null]],null],null,[[[1,\\\"                                            \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                                              \\\"],[10,\\\"td\\\"],[12],[1,[30,6,[\\\"llm\\\"]]],[13],[1,\\\"\\\\n                                              \\\"],[10,\\\"td\\\"],[12],[1,[28,[32,15],[[30,6,[\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                                              \\\"],[10,\\\"td\\\"],[12],[1,[28,[32,15],[[30,6,[\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                                              \\\"],[10,\\\"td\\\"],[12],[1,[28,[30,0,[\\\"totalSpending\\\"]],[[30,6,[\\\"input_spending\\\"]],[30,6,[\\\"cache_read_spending\\\"]],[30,6,[\\\"cache_write_spending\\\"]],[30,6,[\\\"output_spending\\\"]]],null]],[13],[1,\\\"\\\\n                                            \\\"],[13],[1,\\\"\\\\n\\\"]],[6]],null],[1,\\\"                                        \\\"],[13],[1,\\\"\\\\n                                      \\\"],[13],[1,\\\"\\\\n                                    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                                \\\"],[13],[1,\\\"\\\\n                              \\\"]],[]]]]],[1,\\\"\\\\n                          \\\"],[13],[1,\\\"\\\\n                        \\\"]],[]]]],[]]],[1,\\\"                      \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[4]],null],[1,\\\"                  \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-usage__total-row\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"td\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"td\\\"],[15,\\\"title\\\",[30,0,[\\\"featuresTotals\\\",\\\"usage_count\\\"]]],[12],[1,[28,[32,15],[[30,0,[\\\"featuresTotals\\\",\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"td\\\"],[15,\\\"title\\\",[30,0,[\\\"featuresTotals\\\",\\\"total_tokens\\\"]]],[12],[1,[28,[32,15],[[30,0,[\\\"featuresTotals\\\",\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"td\\\"],[12],[1,[28,[30,0,[\\\"formatSpending\\\"]],[[30,0,[\\\"featuresTotals\\\",\\\"total_spending\\\"]]],null]],[13],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"          \\\"]],[]]]]],[1,\\\"\\\\n\\\\n        \\\"],[8,[32,9],[[24,0,\\\"ai-usage__models\\\"]],[[\\\"@heading\\\"],[\\\"discourse_ai.usage.models_breakdown\\\"]],[[\\\"content\\\"],[[[[1,\\\"\\\\n\\\"],[41,[51,[30,0,[\\\"data\\\",\\\"models\\\",\\\"length\\\"]]],[[[1,\\\"              \\\"],[8,[32,14],null,[[\\\"@emptyLabel\\\"],[\\\"discourse_ai.usage.no_models\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"modelsWithCredits\\\",\\\"length\\\"]],[[[1,\\\"              \\\"],[10,\\\"table\\\"],[14,0,\\\"ai-usage__models-table\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.model\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.usage_count\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_tokens\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.credits_remaining\\\"],null]],[13],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"modelsWithCredits\\\"]]],null]],null],null,[[[1,\\\"                    \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-usage__models-row\\\"],[12],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__models-cell\\\"],[12],[1,[30,7,[\\\"llm\\\"]]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__models-cell\\\"],[15,\\\"title\\\",[30,7,[\\\"usage_count\\\"]]],[12],[1,[28,[32,15],[[30,7,[\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__models-cell\\\"],[15,\\\"title\\\",[30,7,[\\\"total_tokens\\\"]]],[12],[1,[28,[32,15],[[30,7,[\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__models-credit-bar\\\"],[12],[1,\\\"\\\\n                        \\\"],[8,[32,18],null,[[\\\"@allocation\\\",\\\"@compact\\\"],[[30,7,[\\\"credit_allocation\\\"]],true]],null],[1,\\\"\\\\n                      \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[7]],null],[1,\\\"                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"modelsWithoutCredits\\\",\\\"length\\\"]],[[[1,\\\"              \\\"],[10,\\\"table\\\"],[14,0,\\\"ai-usage__models-table\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.model\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.usage_count\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_tokens\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_spending\\\"],null]],[13],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n                \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"modelsWithoutCredits\\\"]]],null]],null],null,[[[1,\\\"                    \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-usage__models-row\\\"],[12],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__models-cell\\\"],[12],[1,[30,8,[\\\"llm\\\"]]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__models-cell\\\"],[15,\\\"title\\\",[30,8,[\\\"usage_count\\\"]]],[12],[1,[28,[32,15],[[30,8,[\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__models-cell\\\"],[15,\\\"title\\\",[30,8,[\\\"total_tokens\\\"]]],[12],[1,[28,[32,15],[[30,8,[\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n                        \\\"],[1,[28,[30,0,[\\\"totalSpending\\\"]],[[30,8,[\\\"input_spending\\\"]],[30,8,[\\\"cache_read_spending\\\"]],[30,8,[\\\"cache_write_spending\\\"]],[30,8,[\\\"output_spending\\\"]]],null]],[1,\\\"\\\\n                      \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n\\\"]],[8]],null],[1,\\\"                  \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-usage__total-row\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"td\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"td\\\"],[15,\\\"title\\\",[30,0,[\\\"modelsWithoutCreditsTotals\\\",\\\"usage_count\\\"]]],[12],[1,[28,[32,15],[[30,0,[\\\"modelsWithoutCreditsTotals\\\",\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"td\\\"],[15,\\\"title\\\",[30,0,[\\\"modelsWithoutCreditsTotals\\\",\\\"total_tokens\\\"]]],[12],[1,[28,[32,15],[[30,0,[\\\"modelsWithoutCreditsTotals\\\",\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"td\\\"],[12],[1,[28,[30,0,[\\\"formatSpending\\\"]],[[30,0,[\\\"modelsWithoutCreditsTotals\\\",\\\"total_spending\\\"]]],null]],[13],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"          \\\"]],[]]]]],[1,\\\"\\\\n\\\\n        \\\"],[8,[32,9],[[24,0,\\\"ai-usage__users\\\"]],[[\\\"@heading\\\"],[\\\"discourse_ai.usage.users_breakdown\\\"]],[[\\\"content\\\"],[[[[1,\\\"\\\\n\\\"],[41,[51,[30,0,[\\\"data\\\",\\\"users\\\",\\\"length\\\"]]],[[[1,\\\"              \\\"],[8,[32,14],null,[[\\\"@emptyLabel\\\"],[\\\"discourse_ai.usage.no_users\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"data\\\",\\\"users\\\",\\\"length\\\"]],[[[1,\\\"              \\\"],[10,0],[15,0,[28,[32,19],[\\\"ai-usage__users-table-wrapper\\\",[52,[28,[32,20],[[30,0,[\\\"data\\\",\\\"users\\\",\\\"length\\\"]],24],null],\\\"-multi-column\\\"]],null]],[12],[1,\\\"\\\\n                \\\"],[10,\\\"table\\\"],[14,0,\\\"ai-usage__users-table\\\"],[12],[1,\\\"\\\\n                  \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                      \\\"],[10,\\\"th\\\"],[14,0,\\\"ai-usage__users-username\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.username\\\"],null]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.usage_count\\\"],null]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_tokens\\\"],null]],[13],[1,\\\"\\\\n                      \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_spending\\\"],null]],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n                  \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[28,[30,0,[\\\"takeUsers\\\"]],[0,[30,0,[\\\"userSplitPoint\\\"]]],null]],null]],null],null,[[[1,\\\"                      \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-usage__users-row\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__users-cell\\\"],[12],[1,\\\"\\\\n                          \\\"],[10,0],[14,0,\\\"user-info\\\"],[12],[1,\\\"\\\\n                            \\\"],[8,[32,21],[[24,0,\\\"username\\\"]],[[\\\"@route\\\",\\\"@model\\\"],[\\\"user\\\",[30,9,[\\\"username\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                              \\\"],[1,[28,[32,22],[[30,9]],[[\\\"imageSize\\\"],[\\\"tiny\\\"]]]],[1,\\\"\\\\n                              \\\"],[1,[30,9,[\\\"username\\\"]]],[1,\\\"\\\\n                            \\\"]],[]]]]],[1,\\\"\\\\n                          \\\"],[13],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__users-cell\\\"],[15,\\\"title\\\",[30,9,[\\\"usage_count\\\"]]],[12],[1,[28,[32,15],[[30,9,[\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__users-cell\\\"],[15,\\\"title\\\",[30,9,[\\\"total_tokens\\\"]]],[12],[1,[28,[32,15],[[30,9,[\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n                          \\\"],[1,[28,[30,0,[\\\"totalSpending\\\"]],[[30,9,[\\\"input_spending\\\"]],[30,9,[\\\"cache_read_spending\\\"]],[30,9,[\\\"cache_write_spending\\\"]],[30,9,[\\\"output_spending\\\"]]],null]],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n                      \\\"],[13],[1,\\\"\\\\n\\\"]],[9]],null],[41,[51,[28,[32,20],[[30,0,[\\\"data\\\",\\\"users\\\",\\\"length\\\"]],24],null]],[[[1,\\\"                      \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-usage__total-row\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[15,\\\"title\\\",[30,0,[\\\"usersTotals\\\",\\\"usage_count\\\"]]],[12],[1,[28,[32,15],[[30,0,[\\\"usersTotals\\\",\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[15,\\\"title\\\",[30,0,[\\\"usersTotals\\\",\\\"total_tokens\\\"]]],[12],[1,[28,[32,15],[[30,0,[\\\"usersTotals\\\",\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[12],[1,[28,[30,0,[\\\"formatSpending\\\"]],[[30,0,[\\\"usersTotals\\\",\\\"total_spending\\\"]]],null]],[13],[1,\\\"\\\\n                      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"                  \\\"],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[28,[32,20],[[30,0,[\\\"data\\\",\\\"users\\\",\\\"length\\\"]],24],null],[[[1,\\\"                  \\\"],[10,\\\"table\\\"],[14,0,\\\"ai-usage__users-table\\\"],[12],[1,\\\"\\\\n                    \\\"],[10,\\\"thead\\\"],[12],[1,\\\"\\\\n                      \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"th\\\"],[14,0,\\\"ai-usage__users-username\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.username\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.usage_count\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_tokens\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"th\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total_spending\\\"],null]],[13],[1,\\\"\\\\n                      \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                    \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[28,[30,0,[\\\"takeUsers\\\"]],[[30,0,[\\\"userSplitPoint\\\"]],50],null]],null]],null],null,[[[1,\\\"                        \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-usage__users-row\\\"],[12],[1,\\\"\\\\n                          \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__users-cell\\\"],[12],[1,\\\"\\\\n                            \\\"],[10,0],[14,0,\\\"user-info\\\"],[12],[1,\\\"\\\\n                              \\\"],[8,[32,21],[[24,0,\\\"username\\\"]],[[\\\"@route\\\",\\\"@model\\\"],[\\\"user\\\",[30,10,[\\\"username\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                                \\\"],[1,[28,[32,22],[[30,10]],[[\\\"imageSize\\\"],[\\\"tiny\\\"]]]],[1,\\\"\\\\n                                \\\"],[1,[30,10,[\\\"username\\\"]]],[1,\\\"\\\\n                              \\\"]],[]]]]],[1,\\\"\\\\n                            \\\"],[13],[13],[1,\\\"\\\\n                          \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__users-cell\\\"],[15,\\\"title\\\",[30,10,[\\\"usage_count\\\"]]],[12],[1,[28,[32,15],[[30,10,[\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                          \\\"],[10,\\\"td\\\"],[14,0,\\\"ai-usage__users-cell\\\"],[15,\\\"title\\\",[30,10,[\\\"total_tokens\\\"]]],[12],[1,[28,[32,15],[[30,10,[\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                          \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n                            \\\"],[1,[28,[30,0,[\\\"totalSpending\\\"]],[[30,10,[\\\"input_spending\\\"]],[30,10,[\\\"cache_read_spending\\\"]],[30,10,[\\\"cache_write_spending\\\"]],[30,10,[\\\"output_spending\\\"]]],null]],[1,\\\"\\\\n                          \\\"],[13],[1,\\\"\\\\n                        \\\"],[13],[1,\\\"\\\\n\\\"]],[10]],null],[1,\\\"                      \\\"],[10,\\\"tr\\\"],[14,0,\\\"ai-usage__total-row\\\"],[12],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.usage.total\\\"],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[15,\\\"title\\\",[30,0,[\\\"usersTotals\\\",\\\"usage_count\\\"]]],[12],[1,[28,[32,15],[[30,0,[\\\"usersTotals\\\",\\\"usage_count\\\"]]],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[15,\\\"title\\\",[30,0,[\\\"usersTotals\\\",\\\"total_tokens\\\"]]],[12],[1,[28,[32,15],[[30,0,[\\\"usersTotals\\\",\\\"total_tokens\\\"]]],null]],[13],[1,\\\"\\\\n                        \\\"],[10,\\\"td\\\"],[12],[1,[28,[30,0,[\\\"formatSpending\\\"]],[[30,0,[\\\"usersTotals\\\",\\\"total_spending\\\"]]],null]],[13],[1,\\\"\\\\n                      \\\"],[13],[1,\\\"\\\\n                    \\\"],[13],[1,\\\"\\\\n                  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"              \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"          \\\"]],[]]]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"option\\\",\\\"tiles\\\",\\\"metric\\\",\\\"feature\\\",\\\"model\\\",\\\"model\\\",\\\"model\\\",\\\"model\\\",\\\"user\\\",\\\"user\\\"],[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\",\\\"unless\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/ai-usage.js\",\n        \"scope\": () => [_dPageSubheader.default, _discourseI18n.i18n, _dButton.default, _truthHelpers.eq, _helper.fn, _dateTimeInputRange.default, _comboBox.default, _helper.hash, _conditionalLoadingSpinner.default, _adminConfigAreaCard.default, _dStatTiles.default, _didInsert.default, _didUpdate.default, _chart.default, _adminConfigAreaEmptyList.default, _formatter.number, _dTooltip.default, _dIcon.default, _aiCreditBar.default, _concatClass.default, _truthHelpers.gt, _routing.LinkTo, _avatar.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiUsage;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/bulk-actions/ai-regen-summaries\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-regen-summaries-buttons\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _discourseI18n, _aiRegenSummariesButtons, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class BulkActionsAiRegenSummaries extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    get topicIds() {\n      return this.args.topics.map(t => t.id);\n    }\n    handleLoadingChange(isLoading) {\n      this.loading = isLoading;\n    }\n    static {\n      dt7948.n(this.prototype, \"handleLoadingChange\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"ai-bulk-regen-summaries\">\n        <p class=\"ai-bulk-regen-summaries__description\">\n          {{i18n \"discourse_ai.summarization.topic.bulk_regen_description\"}}\n        </p>\n        <div class=\"ai-bulk-regen-summaries__buttons\">\n          <AiRegenSummariesButtons\n            @topicIds={{this.topicIds}}\n            @disabled={{this.loading}}\n            @onLoadingChange={{this.handleLoadingChange}}\n            @onSuccess={{@afterBulkAction}}\n          />\n        </div>\n      </div>\n      */\n      {\n        \"id\": \"ANd4wlmR\",\n        \"block\": \"[[[10,0],[14,0,\\\"ai-bulk-regen-summaries\\\"],[12],[1,\\\"\\\\n  \\\"],[10,2],[14,0,\\\"ai-bulk-regen-summaries__description\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[32,0],[\\\"discourse_ai.summarization.topic.bulk_regen_description\\\"],null]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"ai-bulk-regen-summaries__buttons\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,1],null,[[\\\"@topicIds\\\",\\\"@disabled\\\",\\\"@onLoadingChange\\\",\\\"@onSuccess\\\"],[[30,0,[\\\"topicIds\\\"]],[30,0,[\\\"loading\\\"]],[30,0,[\\\"handleLoadingChange\\\"]],[30,1]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@afterBulkAction\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/bulk-actions/ai-regen-summaries.js\",\n        \"scope\": () => [_discourseI18n.i18n, _aiRegenSummariesButtons.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = BulkActionsAiRegenSummaries;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/doughnut-chart\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"discourse/admin/components/chart\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _chart, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class DoughnutChart extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"canvasSize\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #canvasSize = (dt7948.i(this, \"canvasSize\"), void 0);\n    get config() {\n      const totalScore = this.args.totalScore || \"\";\n      return {\n        type: \"doughnut\",\n        data: {\n          labels: this.args.labels,\n          datasets: [{\n            data: this.args.data,\n            backgroundColor: this.args.colors,\n            cutout: \"50%\",\n            radius: 100\n          }]\n        },\n        options: {\n          responsive: true,\n          maintainAspectRatio: false,\n          plugins: {\n            legend: {\n              display: this.args.displayLegend || false,\n              position: \"bottom\"\n            }\n          }\n        },\n        plugins: [{\n          id: \"centerText\",\n          afterDraw: function (chart) {\n            const cssVarColor = getComputedStyle(document.documentElement).getPropertyValue(\"--primary-high\") || \"#000\";\n            const cssFontSize = getComputedStyle(document.documentElement).getPropertyValue(\"--font-up-4\") || \"1.3em\";\n            const cssFontFamily = getComputedStyle(document.documentElement).getPropertyValue(\"--font-family\") || \"sans-serif\";\n            const {\n              ctx,\n              chartArea\n            } = chart;\n            const centerX = (chartArea.left + chartArea.right) / 2;\n            const centerY = (chartArea.top + chartArea.bottom) / 2;\n            ctx.restore();\n            ctx.textAlign = \"center\";\n            ctx.textBaseline = \"middle\";\n            ctx.fillStyle = cssVarColor.trim();\n            ctx.font = `bold ${cssFontSize.trim()} ${cssFontFamily.trim()}`;\n            ctx.fillText(totalScore, centerX, centerY);\n            ctx.save();\n          }\n        }, {\n          // Custom plugin to draw labels inside the doughnut chart\n          id: \"doughnutLabels\",\n          afterDraw(chart) {\n            const ctx = chart.ctx;\n            const dataset = chart.data.datasets[0];\n            const meta = chart.getDatasetMeta(0);\n            const cssFontSize = getComputedStyle(document.documentElement).getPropertyValue(\"--font-down-2\") || \"1.3em\";\n            const cssFontFamily = getComputedStyle(document.documentElement).getPropertyValue(\"--font-family\") || \"sans-serif\";\n            ctx.font = `${cssFontSize.trim()} ${cssFontFamily.trim()}`;\n            ctx.fillStyle = \"#fafafa\";\n            ctx.textAlign = \"center\";\n            ctx.textBaseline = \"middle\";\n            meta.data.forEach((element, index) => {\n              const {\n                x,\n                y\n              } = element.tooltipPosition();\n              const value = dataset.data[index];\n              const nonZeroCount = dataset.data.filter(v => v > 0).length;\n              if (value === 0 || nonZeroCount === 1) {\n                return;\n              }\n              ctx.fillText(value, x, y);\n            });\n          }\n        }]\n      };\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.config}}\n        <h3 class=\"doughnut-chart-title\">{{@doughnutTitle}}</h3>\n        <Chart @chartConfig={{this.config}} class=\"admin-report-doughnut\" />\n      {{/if}}\n      */\n      {\n        \"id\": \"qOBX3J/5\",\n        \"block\": \"[[[41,[30,0,[\\\"config\\\"]],[[[1,\\\"  \\\"],[10,\\\"h3\\\"],[14,0,\\\"doughnut-chart-title\\\"],[12],[1,[30,1]],[13],[1,\\\"\\\\n  \\\"],[8,[32,0],[[24,0,\\\"admin-report-doughnut\\\"]],[[\\\"@chartConfig\\\"],[[30,0,[\\\"config\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@doughnutTitle\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/doughnut-chart.js\",\n        \"scope\": () => [_chart.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = DoughnutChart;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/ai-llm-quota-modal\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-modal\", \"discourse/components/form\", \"discourse/lib/constants\", \"discourse/select-kit/components/group-chooser\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-quota-duration-selector\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _service, _dModal, _form, _constants, _groupChooser, _discourseI18n, _aiQuotaDurationSelector, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiLlmQuotaModal extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"site\", [_service.service]);\n    }\n    #site = (dt7948.i(this, \"site\"), void 0);\n    save(data) {\n      const quota = {\n        ...data\n      };\n      quota.group_name = this.site.groups.find(item => item.id === data.group_id)?.name;\n      quota.llm_model_id = this.args.model.id;\n      this.args.model.addItemToCollection(quota);\n      this.args.closeModal();\n      if (this.args.model.onSave) {\n        this.args.model.onSave();\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"save\", [_object.action]);\n    }\n    get availableGroups() {\n      const existingQuotaGroupIds = this.args.model.llm.llm_quotas.map(q => q.group_id) || [];\n      return this.site.groups.filter(group => !existingQuotaGroupIds.includes(group.id) && group.id !== _constants.AUTO_GROUPS.everyone.id);\n    }\n    get quota() {\n      return {\n        group_id: null,\n        llm_model_id: null,\n        max_tokens: null,\n        max_usages: null,\n        duration_seconds: moment.duration(1, \"day\").asSeconds()\n      };\n    }\n    static {\n      dt7948.n(this.prototype, \"quota\", [_tracking.cached]);\n    }\n    setGroupId(field, groups) {\n      field.set(groups[0]);\n    }\n    static {\n      dt7948.n(this.prototype, \"setGroupId\", [_object.action]);\n    }\n    validateForm(data, {\n      addError,\n      removeError\n    }) {\n      if (!data.max_tokens && !data.max_usages) {\n        addError(\"max_tokens\", {\n          title: (0, _discourseI18n.i18n)(\"discourse_ai.llms.quotas.max_tokens\"),\n          message: (0, _discourseI18n.i18n)(\"discourse_ai.llms.quotas.max_tokens_required\")\n        });\n        addError(\"max_usages\", {\n          title: (0, _discourseI18n.i18n)(\"discourse_ai.llms.quotas.max_usages\"),\n          message: (0, _discourseI18n.i18n)(\"discourse_ai.llms.quotas.max_usages_required\")\n        });\n      } else {\n        removeError(\"max_tokens\");\n        removeError(\"max_usages\");\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"validateForm\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        @title={{i18n \"discourse_ai.llms.quotas.add_title\"}}\n        @closeModal={{@closeModal}}\n        class=\"ai-llm-quota-modal\"\n      >\n        <:body>\n          <Form\n            @validate={{this.validateForm}}\n            @onSubmit={{this.save}}\n            @data={{this.quota}}\n            as |form data|\n          >\n            <form.Field\n              @name=\"group_id\"\n              @title={{i18n \"discourse_ai.llms.quotas.group\"}}\n              @validation=\"required\"\n              @format=\"large\"\n              as |field|\n            >\n              <field.Custom>\n                <GroupChooser\n                  @value={{data.group_id}}\n                  @content={{this.availableGroups}}\n                  @onChange={{fn this.setGroupId field}}\n                  @options={{hash maximum=1}}\n                />\n              </field.Custom>\n            </form.Field>\n      \n            <form.Field\n              @name=\"max_tokens\"\n              @title={{i18n \"discourse_ai.llms.quotas.max_tokens\"}}\n              @tooltip={{i18n \"discourse_ai.llms.quotas.max_tokens_help\"}}\n              @format=\"large\"\n              as |field|\n            >\n              <field.Input @type=\"number\" min=\"1\" />\n            </form.Field>\n      \n            <form.Field\n              @name=\"max_usages\"\n              @title={{i18n \"discourse_ai.llms.quotas.max_usages\"}}\n              @tooltip={{i18n \"discourse_ai.llms.quotas.max_usages_help\"}}\n              @format=\"large\"\n              as |field|\n            >\n              <field.Input @type=\"number\" min=\"1\" />\n            </form.Field>\n      \n            <form.Field\n              @name=\"duration_seconds\"\n              @title={{i18n \"discourse_ai.llms.quotas.duration\"}}\n              @validation=\"required\"\n              @format=\"large\"\n              as |field|\n            >\n              <field.Custom>\n                <DurationSelector\n                  @value={{data.duration_seconds}}\n                  @onChange={{field.set}}\n                />\n              </field.Custom>\n            </form.Field>\n      \n            <form.Submit\n              @label=\"discourse_ai.llms.quotas.add\"\n              class=\"btn-primary\"\n            />\n          </Form>\n        </:body>\n      </DModal>\n      */\n      {\n        \"id\": \"PQF4AQB9\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"ai-llm-quota-modal\\\"]],[[\\\"@title\\\",\\\"@closeModal\\\"],[[28,[32,1],[\\\"discourse_ai.llms.quotas.add_title\\\"],null],[30,1]]],[[\\\"body\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[32,2],null,[[\\\"@validate\\\",\\\"@onSubmit\\\",\\\"@data\\\"],[[30,0,[\\\"validateForm\\\"]],[30,0,[\\\"save\\\"]],[30,0,[\\\"quota\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"group_id\\\",[28,[32,1],[\\\"discourse_ai.llms.quotas.group\\\"],null],\\\"required\\\",\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,4,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[32,3],null,[[\\\"@value\\\",\\\"@content\\\",\\\"@onChange\\\",\\\"@options\\\"],[[30,3,[\\\"group_id\\\"]],[30,0,[\\\"availableGroups\\\"]],[28,[32,4],[[30,0,[\\\"setGroupId\\\"]],[30,4]],null],[28,[32,5],null,[[\\\"maximum\\\"],[1]]]]],null],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n      \\\"]],[4]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"max_tokens\\\",[28,[32,1],[\\\"discourse_ai.llms.quotas.max_tokens\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.quotas.max_tokens_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,5,[\\\"Input\\\"]],[[24,\\\"min\\\",\\\"1\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n      \\\"]],[5]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"max_usages\\\",[28,[32,1],[\\\"discourse_ai.llms.quotas.max_usages\\\"],null],[28,[32,1],[\\\"discourse_ai.llms.quotas.max_usages_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,6,[\\\"Input\\\"]],[[24,\\\"min\\\",\\\"1\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n      \\\"]],[6]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@validation\\\",\\\"@format\\\"],[\\\"duration_seconds\\\",[28,[32,1],[\\\"discourse_ai.llms.quotas.duration\\\"],null],\\\"required\\\",\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[30,7,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n          \\\"],[8,[32,6],null,[[\\\"@value\\\",\\\"@onChange\\\"],[[30,3,[\\\"duration_seconds\\\"]],[30,7,[\\\"set\\\"]]]],null],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n      \\\"]],[7]]]]],[1,\\\"\\\\n\\\\n      \\\"],[8,[30,2,[\\\"Submit\\\"]],[[24,0,\\\"btn-primary\\\"]],[[\\\"@label\\\"],[\\\"discourse_ai.llms.quotas.add\\\"]],null],[1,\\\"\\\\n    \\\"]],[2,3]]]]],[1,\\\"\\\\n  \\\"]],[]]]]]],[\\\"@closeModal\\\",\\\"form\\\",\\\"data\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\",\\\"field\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/ai-llm-quota-modal.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _form.default, _groupChooser.default, _helper.fn, _helper.hash, _aiQuotaDurationSelector.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiLlmQuotaModal;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/ai-persona-response-format-editor\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"discourse/components/modal/json-schema-editor\", \"discourse/lib/formatter\", \"discourse/truth-helpers\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _jsonSchemaEditor, _formatter, _truthHelpers, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiPersonaResponseFormatEditor extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"showJsonEditorModal\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #showJsonEditorModal = (dt7948.i(this, \"showJsonEditorModal\"), void 0);\n    jsonSchema = {\n      type: \"array\",\n      uniqueItems: true,\n      title: (0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.response_format.modal.root_title\"),\n      items: {\n        type: \"object\",\n        title: (0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.response_format.modal.key_title\"),\n        properties: {\n          key: {\n            type: \"string\"\n          },\n          type: {\n            type: \"string\",\n            enum: [\"string\", \"integer\", \"boolean\", \"array\"]\n          },\n          array_type: {\n            type: \"string\",\n            enum: [\"string\", \"integer\", \"boolean\"],\n            options: {\n              dependencies: {\n                type: \"array\"\n              }\n            }\n          }\n        },\n        required: [\"key\", \"type\"]\n      }\n    };\n    get editorTitle() {\n      return (0, _discourseI18n.i18n)(\"discourse_ai.ai_persona.response_format.title\");\n    }\n    get responseFormatAsJSON() {\n      return JSON.stringify(this.args.data.response_format);\n    }\n    get displayJSON() {\n      const toDisplay = {};\n      this.args.data.response_format.forEach(keyDesc => {\n        if (keyDesc.type === \"array\") {\n          toDisplay[keyDesc.key] = `[${keyDesc.array_type}]`;\n        } else {\n          toDisplay[keyDesc.key] = keyDesc.type;\n        }\n      });\n      return (0, _formatter.prettyJSON)(toDisplay);\n    }\n    openModal() {\n      this.showJsonEditorModal = true;\n    }\n    static {\n      dt7948.n(this.prototype, \"openModal\", [_object.action]);\n    }\n    closeModal() {\n      this.showJsonEditorModal = false;\n    }\n    static {\n      dt7948.n(this.prototype, \"closeModal\", [_object.action]);\n    }\n    updateResponseFormat(form, value) {\n      form.set(\"response_format\", JSON.parse(value));\n    }\n    static {\n      dt7948.n(this.prototype, \"updateResponseFormat\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <@form.Container @title={{this.editorTitle}} @format=\"large\">\n        <div class=\"ai-persona-editor__response-format\">\n          {{#if (gt @data.response_format.length 0)}}\n            <pre class=\"ai-persona-editor__response-format-pre\">\n              <code>{{this.displayJSON}}</code>\n            </pre>\n          {{else}}\n            <div class=\"ai-persona-editor__response-format-none\">\n              {{i18n \"discourse_ai.ai_persona.response_format.no_format\"}}\n            </div>\n          {{/if}}\n      \n          <@form.Button\n            @action={{this.openModal}}\n            @label=\"discourse_ai.ai_persona.response_format.open_modal\"\n            @disabled={{@data.system}}\n          />\n        </div>\n      </@form.Container>\n      \n      {{#if this.showJsonEditorModal}}\n        <ModalJsonSchemaEditor\n          @model={{hash\n            value=this.responseFormatAsJSON\n            updateValue=(fn this.updateResponseFormat @form)\n            settingName=this.editorTitle\n            jsonSchema=this.jsonSchema\n          }}\n          @closeModal={{this.closeModal}}\n        />\n      {{/if}}\n      */\n      {\n        \"id\": \"Uh9kqWJX\",\n        \"block\": \"[[[8,[30,1,[\\\"Container\\\"]],null,[[\\\"@title\\\",\\\"@format\\\"],[[30,0,[\\\"editorTitle\\\"]],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"ai-persona-editor__response-format\\\"],[12],[1,\\\"\\\\n\\\"],[41,[28,[32,0],[[30,2,[\\\"response_format\\\",\\\"length\\\"]],0],null],[[[1,\\\"      \\\"],[10,\\\"pre\\\"],[14,0,\\\"ai-persona-editor__response-format-pre\\\"],[12],[1,\\\"        \\\"],[10,\\\"code\\\"],[12],[1,[30,0,[\\\"displayJSON\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"ai-persona-editor__response-format-none\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,1],[\\\"discourse_ai.ai_persona.response_format.no_format\\\"],null]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n    \\\"],[8,[30,1,[\\\"Button\\\"]],null,[[\\\"@action\\\",\\\"@label\\\",\\\"@disabled\\\"],[[30,0,[\\\"openModal\\\"]],\\\"discourse_ai.ai_persona.response_format.open_modal\\\",[30,2,[\\\"system\\\"]]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"showJsonEditorModal\\\"]],[[[1,\\\"  \\\"],[8,[32,2],null,[[\\\"@model\\\",\\\"@closeModal\\\"],[[28,[32,3],null,[[\\\"value\\\",\\\"updateValue\\\",\\\"settingName\\\",\\\"jsonSchema\\\"],[[30,0,[\\\"responseFormatAsJSON\\\"]],[28,[32,4],[[30,0,[\\\"updateResponseFormat\\\"]],[30,1]],null],[30,0,[\\\"editorTitle\\\"]],[30,0,[\\\"jsonSchema\\\"]]]]],[30,0,[\\\"closeModal\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@form\\\",\\\"@data\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/ai-persona-response-format-editor.js\",\n        \"scope\": () => [_truthHelpers.gt, _discourseI18n.i18n, _jsonSchemaEditor.default, _helper.hash, _helper.fn],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiPersonaResponseFormatEditor;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/ai-regen-summaries-modal\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"discourse/components/d-modal\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-regen-summaries-buttons\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _dModal, _discourseI18n, _aiRegenSummariesButtons, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiRegenSummariesModal extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    get topicIds() {\n      return [this.args.model.topic.id];\n    }\n    handleLoadingChange(isLoading) {\n      this.loading = isLoading;\n    }\n    static {\n      dt7948.n(this.prototype, \"handleLoadingChange\", [_object.action]);\n    }\n    handleSuccess() {\n      this.args.closeModal();\n    }\n    static {\n      dt7948.n(this.prototype, \"handleSuccess\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        @title={{i18n \"discourse_ai.summarization.topic.regenerate_ai_summaries\"}}\n        @closeModal={{@closeModal}}\n        class=\"ai-regen-summaries-modal\"\n      >\n        <:body>\n          <p class=\"ai-regen-summaries-modal__description\">\n            {{i18n \"discourse_ai.summarization.topic.regen_modal_description\"}}\n          </p>\n          <div class=\"ai-regen-summaries-modal__buttons\">\n            <AiRegenSummariesButtons\n              @topicIds={{this.topicIds}}\n              @disabled={{this.loading}}\n              @onLoadingChange={{this.handleLoadingChange}}\n              @onSuccess={{this.handleSuccess}}\n            />\n          </div>\n        </:body>\n      </DModal>\n      */\n      {\n        \"id\": \"MsDQC+h8\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"ai-regen-summaries-modal\\\"]],[[\\\"@title\\\",\\\"@closeModal\\\"],[[28,[32,1],[\\\"discourse_ai.summarization.topic.regenerate_ai_summaries\\\"],null],[30,1]]],[[\\\"body\\\"],[[[[1,\\\"\\\\n    \\\"],[10,2],[14,0,\\\"ai-regen-summaries-modal__description\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[32,1],[\\\"discourse_ai.summarization.topic.regen_modal_description\\\"],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-regen-summaries-modal__buttons\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,2],null,[[\\\"@topicIds\\\",\\\"@disabled\\\",\\\"@onLoadingChange\\\",\\\"@onSuccess\\\"],[[30,0,[\\\"topicIds\\\"]],[30,0,[\\\"loading\\\"]],[30,0,[\\\"handleLoadingChange\\\"]],[30,0,[\\\"handleSuccess\\\"]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]]]]]],[\\\"@closeModal\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/ai-regen-summaries-modal.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _aiRegenSummariesButtons.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiRegenSummariesModal;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/ai-summary-modal\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/render-modifiers/modifiers/did-update\", \"@ember/render-modifiers/modifiers/will-destroy\", \"@ember/service\", \"discourse/components/cook-text\", \"discourse/components/d-button\", \"discourse/components/d-modal\", \"discourse/float-kit/components/d-tooltip\", \"discourse/helpers/concat-class\", \"discourse/helpers/d-icon\", \"discourse/helpers/html-class\", \"discourse/lib/ajax\", \"discourse/lib/decorators\", \"discourse/lib/formatter\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-summary-skeleton\", \"discourse/plugins/discourse-ai/discourse/lib/ai-errors\", \"discourse/plugins/discourse-ai/discourse/lib/smooth-streamer\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _didInsert, _didUpdate, _willDestroy, _service, _cookText, _dButton, _dModal, _dTooltip, _concatClass, _dIcon, _htmlClass, _ajax, _decorators, _formatter, _truthHelpers, _discourseI18n, _aiSummarySkeleton, _aiErrors, _smoothStreamer3, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiSummaryModal extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"messageBus\", [_service.service]);\n    }\n    #messageBus = (dt7948.i(this, \"messageBus\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"text\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #text = (dt7948.i(this, \"text\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"summarizedOn\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #summarizedOn = (dt7948.i(this, \"summarizedOn\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"summarizedBy\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #summarizedBy = (dt7948.i(this, \"summarizedBy\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"newPostsSinceSummary\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #newPostsSinceSummary = (dt7948.i(this, \"newPostsSinceSummary\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"outdated\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #outdated = (dt7948.i(this, \"outdated\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"canRegenerate\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #canRegenerate = (dt7948.i(this, \"canRegenerate\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentIndex\", [_tracking.tracked], function () {\n        return 0;\n      });\n    }\n    #currentIndex = (dt7948.i(this, \"currentIndex\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"smoothStreamer\", [_tracking.tracked], function () {\n        return new _smoothStreamer3.default(() => this.text, newValue => this.text = newValue);\n      });\n    }\n    #smoothStreamer = (dt7948.i(this, \"smoothStreamer\"), void 0);\n    get outdatedSummaryWarningText() {\n      let outdatedText = (0, _discourseI18n.i18n)(\"summary.outdated\");\n      if (!this.topRepliesSummaryEnabled && this.newPostsSinceSummary > 0) {\n        outdatedText += \" \";\n        outdatedText += (0, _discourseI18n.i18n)(\"summary.outdated_posts\", {\n          count: this.newPostsSinceSummary\n        });\n      }\n      return outdatedText;\n    }\n    resetSummary() {\n      this.smoothStreamer.resetStreaming();\n      this.currentIndex = 0;\n      this.text = \"\";\n      this.summarizedOn = null;\n      this.summarizedBy = null;\n      this.newPostsSinceSummary = null;\n      this.outdated = false;\n      this.canRegenerate = false;\n      this.loading = false;\n      this._channel = null;\n    }\n    get topRepliesSummaryEnabled() {\n      return this.args.model.postStream.summary;\n    }\n    get topicId() {\n      return this.args.model.topic.id;\n    }\n    get baseSummarizationURL() {\n      return `/discourse-ai/summarization/t/${this.topicId}`;\n    }\n    subscribe() {\n      const channel = `/discourse-ai/summaries/topic/${this.args.model.topic.id}`;\n      this._channel = channel;\n      this.messageBus.subscribe(channel, this._updateSummary);\n    }\n    static {\n      dt7948.n(this.prototype, \"subscribe\", [_decorators.bind]);\n    }\n    unsubscribe() {\n      this.messageBus.unsubscribe(\"/discourse-ai/summaries/topic/*\", this._updateSummary);\n      this.resetSummary();\n    }\n    static {\n      dt7948.n(this.prototype, \"unsubscribe\", [_decorators.bind]);\n    }\n    generateSummary() {\n      let fetchURL = this.baseSummarizationURL;\n      if (this.currentUser) {\n        fetchURL += `?stream=true`;\n      }\n      return this._requestSummary(fetchURL);\n    }\n    static {\n      dt7948.n(this.prototype, \"generateSummary\", [_object.action]);\n    }\n    regenerateSummary() {\n      let fetchURL = this.baseSummarizationURL;\n      if (this.currentUser) {\n        fetchURL += `?stream=true`;\n        if (this.canRegenerate) {\n          fetchURL += \"&skip_age_check=true\";\n        }\n      }\n      // ensure summary is reset before requesting a new one:\n      this.resetSummary();\n      return this._requestSummary(fetchURL);\n    }\n    static {\n      dt7948.n(this.prototype, \"regenerateSummary\", [_object.action]);\n    }\n    _requestSummary(url) {\n      if (this.loading || this.text && !this.canRegenerate) {\n        return;\n      }\n      this.loading = true;\n      this.summarizedOn = null;\n      return (0, _ajax.ajax)(url).then(data => {\n        if (data?.ai_topic_summary?.summarized_text) {\n          data.done = true;\n          this._updateSummary(data);\n        }\n      }).catch(error => {\n        this.loading = false;\n        if ((0, _aiErrors.isAiCreditLimitError)(error)) {\n          (0, _aiErrors.popupAiCreditLimitError)(error);\n        } else {\n          throw error;\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"_requestSummary\", [_object.action]);\n    }\n    async _updateSummary(update) {\n      if ((0, _aiErrors.isAiCreditLimitError)(update)) {\n        this.loading = false;\n        (0, _aiErrors.popupAiCreditLimitError)(update);\n        this.unsubscribe();\n        return;\n      }\n      const topicSummary = {\n        done: update.done,\n        raw: update.ai_topic_summary?.summarized_text,\n        ...update.ai_topic_summary\n      };\n      this.loading = false;\n      this.smoothStreamer.updateResult(topicSummary, \"raw\");\n      if (update.done) {\n        this.summarizedOn = (0, _formatter.shortDateNoYear)(moment(topicSummary.updated_at, \"YYYY-MM-DD HH:mm:ss Z\"));\n        this.summarizedBy = topicSummary.algorithm;\n        this.newPostsSinceSummary = topicSummary.new_posts_since_summary;\n        this.outdated = topicSummary.outdated;\n        this.canRegenerate = topicSummary.outdated && topicSummary.can_regenerate;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"_updateSummary\", [_decorators.bind]);\n    }\n    onRegisterApi(api) {\n      this.dMenu = api;\n    }\n    static {\n      dt7948.n(this.prototype, \"onRegisterApi\", [_object.action]);\n    }\n    handleClose() {\n      this.modal.triggerElement = null; // prevent refocus of trigger, which changes scroll position\n      this.args.closeModal();\n    }\n    static {\n      dt7948.n(this.prototype, \"handleClose\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        @title={{i18n \"discourse_ai.summarization.topic.title\"}}\n        @closeModal={{this.handleClose}}\n        @bodyClass=\"ai-summary-modal__body\"\n        class=\"ai-summary-modal\"\n        {{didInsert this.subscribe @model.topic.id}}\n        {{didUpdate this.subscribe @model.topic.id}}\n        {{willDestroy this.unsubscribe}}\n        @hideFooter={{not this.summarizedOn}}\n      >\n        <:body>\n          {{htmlClass \"scrollable-modal\"}}\n          <div class=\"ai-summary-container\" {{didInsert this.generateSummary}}>\n            <article\n              class={{concatClass\n                \"ai-summary-box\"\n                \"streamable-content\"\n                (if this.smoothStreamer.isStreaming \"streaming\")\n              }}\n            >\n              {{#if this.loading}}\n                <AiSummarySkeleton />\n              {{else}}\n                <div class=\"generated-summary cooked\">\n                  <CookText @rawText={{this.smoothStreamer.renderedText}} />\n                </div>\n              {{/if}}\n            </article>\n          </div>\n        </:body>\n        <:footer>\n          <p class=\"summarized-on\">\n            {{i18n \"summary.summarized_on\" date=this.summarizedOn}}\n            <DTooltip @placements={{array \"top-end\"}}>\n              <:trigger>\n                {{icon \"circle-info\"}}\n              </:trigger>\n              <:content>\n                {{i18n \"summary.model_used\" model=this.summarizedBy}}\n              </:content>\n            </DTooltip>\n          </p>\n          {{#if this.outdated}}\n            <p class=\"summary-outdated\">{{this.outdatedSummaryWarningText}}</p>\n          {{/if}}\n          {{#if this.canRegenerate}}\n            <DButton\n              @label=\"summary.buttons.regenerate\"\n              @title=\"summary.buttons.regenerate\"\n              @action={{this.regenerateSummary}}\n              @icon=\"arrows-rotate\"\n            />\n          {{/if}}\n        </:footer>\n      </DModal>\n      */\n      {\n        \"id\": \"qHadtlSr\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"ai-summary-modal\\\"],[4,[32,3],[[30,0,[\\\"subscribe\\\"]],[30,1,[\\\"topic\\\",\\\"id\\\"]]],null],[4,[32,4],[[30,0,[\\\"subscribe\\\"]],[30,1,[\\\"topic\\\",\\\"id\\\"]]],null],[4,[32,5],[[30,0,[\\\"unsubscribe\\\"]]],null]],[[\\\"@title\\\",\\\"@closeModal\\\",\\\"@bodyClass\\\",\\\"@hideFooter\\\"],[[28,[32,1],[\\\"discourse_ai.summarization.topic.title\\\"],null],[30,0,[\\\"handleClose\\\"]],\\\"ai-summary-modal__body\\\",[28,[32,2],[[30,0,[\\\"summarizedOn\\\"]]],null]]],[[\\\"body\\\",\\\"footer\\\"],[[[[1,\\\"\\\\n    \\\"],[1,[28,[32,6],[\\\"scrollable-modal\\\"],null]],[1,\\\"\\\\n    \\\"],[11,0],[24,0,\\\"ai-summary-container\\\"],[4,[32,3],[[30,0,[\\\"generateSummary\\\"]]],null],[12],[1,\\\"\\\\n      \\\"],[10,\\\"article\\\"],[15,0,[28,[32,7],[\\\"ai-summary-box\\\",\\\"streamable-content\\\",[52,[30,0,[\\\"smoothStreamer\\\",\\\"isStreaming\\\"]],\\\"streaming\\\"]],null]],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"loading\\\"]],[[[1,\\\"          \\\"],[8,[32,8],null,null,null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"generated-summary cooked\\\"],[12],[1,\\\"\\\\n            \\\"],[8,[32,9],null,[[\\\"@rawText\\\"],[[30,0,[\\\"smoothStreamer\\\",\\\"renderedText\\\"]]]],null],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]],[[[1,\\\"\\\\n    \\\"],[10,2],[14,0,\\\"summarized-on\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[32,1],[\\\"summary.summarized_on\\\"],[[\\\"date\\\"],[[30,0,[\\\"summarizedOn\\\"]]]]]],[1,\\\"\\\\n      \\\"],[8,[32,10],null,[[\\\"@placements\\\"],[[28,[32,11],[\\\"top-end\\\"],null]]],[[\\\"trigger\\\",\\\"content\\\"],[[[[1,\\\"\\\\n          \\\"],[1,[28,[32,12],[\\\"circle-info\\\"],null]],[1,\\\"\\\\n        \\\"]],[]],[[[1,\\\"\\\\n          \\\"],[1,[28,[32,1],[\\\"summary.model_used\\\"],[[\\\"model\\\"],[[30,0,[\\\"summarizedBy\\\"]]]]]],[1,\\\"\\\\n        \\\"]],[]]]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"outdated\\\"]],[[[1,\\\"      \\\"],[10,2],[14,0,\\\"summary-outdated\\\"],[12],[1,[30,0,[\\\"outdatedSummaryWarningText\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[30,0,[\\\"canRegenerate\\\"]],[[[1,\\\"      \\\"],[8,[32,13],null,[[\\\"@label\\\",\\\"@title\\\",\\\"@action\\\",\\\"@icon\\\"],[\\\"summary.buttons.regenerate\\\",\\\"summary.buttons.regenerate\\\",[30,0,[\\\"regenerateSummary\\\"]],\\\"arrows-rotate\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[]]]]]],[\\\"@model\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/ai-summary-modal.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _truthHelpers.not, _didInsert.default, _didUpdate.default, _willDestroy.default, _htmlClass.default, _concatClass.default, _aiSummarySkeleton.default, _cookText.default, _dTooltip.default, _helper.array, _dIcon.default, _dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiSummaryModal;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/ai-tool-test-modal\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"discourse/components/d-button\", \"discourse/components/d-modal\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/utilities\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _dButton, _dModal, _ajax, _ajaxError, _discourseI18n, _utilities, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiToolTestModal extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"testResult\", [_tracking.tracked]);\n    }\n    #testResult = (dt7948.i(this, \"testResult\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isLoading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isLoading = (dt7948.i(this, \"isLoading\"), void 0);\n    parameterValues = {};\n    updateParameter(name, event) {\n      this.parameterValues[name] = event.target.value;\n    }\n    static {\n      dt7948.n(this.prototype, \"updateParameter\", [_object.action]);\n    }\n    async runTest() {\n      this.isLoading = true;\n      try {\n        const response = await (0, _ajax.ajax)(`/admin/plugins/discourse-ai/ai-tools/${this.args.model.tool.id}/test.json`, {\n          type: \"POST\",\n          data: JSON.stringify({\n            ai_tool: this.args.model.tool,\n            parameters: this.parameterValues\n          }),\n          contentType: \"application/json\"\n        });\n        this.testResult = (0, _utilities.jsonToHtml)(response.output);\n      } catch (error) {\n        (0, _ajaxError.popupAjaxError)(error);\n      } finally {\n        this.isLoading = false;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"runTest\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        @title={{i18n \"discourse_ai.tools.test_modal.title\"}}\n        @closeModal={{@closeModal}}\n        @bodyClass=\"ai-tool-test-modal__body\"\n        class=\"ai-tool-test-modal\"\n      >\n        <:body>\n          {{#each @model.tool.parameters as |param|}}\n            <div class=\"control-group\">\n              <label>{{param.name}}</label>\n              <input\n                {{on \"input\" (fn this.updateParameter param.name)}}\n                name={{param.name}}\n                type=\"text\"\n              />\n            </div>\n          {{/each}}\n      \n          {{#if this.testResult}}\n            <div class=\"ai-tool-test-modal__test-result\">\n              <h3>{{i18n \"discourse_ai.tools.test_modal.result\"}}</h3>\n              <div>{{this.testResult}}</div>\n            </div>\n          {{/if}}\n        </:body>\n      \n        <:footer>\n          <DButton\n            @action={{this.runTest}}\n            @label=\"discourse_ai.tools.test_modal.run\"\n            @disabled={{this.isLoading}}\n            class=\"btn-primary ai-tool-test-modal__run-button\"\n          />\n        </:footer>\n      </DModal>\n      */\n      {\n        \"id\": \"+Mfmkghi\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"ai-tool-test-modal\\\"]],[[\\\"@title\\\",\\\"@closeModal\\\",\\\"@bodyClass\\\"],[[28,[32,1],[\\\"discourse_ai.tools.test_modal.title\\\"],null],[30,1],\\\"ai-tool-test-modal__body\\\"]],[[\\\"body\\\",\\\"footer\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,2,[\\\"tool\\\",\\\"parameters\\\"]]],null]],null],null,[[[1,\\\"      \\\"],[10,0],[14,0,\\\"control-group\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"label\\\"],[12],[1,[30,3,[\\\"name\\\"]]],[13],[1,\\\"\\\\n        \\\"],[11,\\\"input\\\"],[16,3,[30,3,[\\\"name\\\"]]],[24,4,\\\"text\\\"],[4,[32,2],[\\\"input\\\",[28,[32,3],[[30,0,[\\\"updateParameter\\\"]],[30,3,[\\\"name\\\"]]],null]],null],[12],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"testResult\\\"]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"ai-tool-test-modal__test-result\\\"],[12],[1,\\\"\\\\n        \\\"],[10,\\\"h3\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.tools.test_modal.result\\\"],null]],[13],[1,\\\"\\\\n        \\\"],[10,0],[12],[1,[30,0,[\\\"testResult\\\"]]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[]],[[[1,\\\"\\\\n    \\\"],[8,[32,4],[[24,0,\\\"btn-primary ai-tool-test-modal__run-button\\\"]],[[\\\"@action\\\",\\\"@label\\\",\\\"@disabled\\\"],[[30,0,[\\\"runTest\\\"]],\\\"discourse_ai.tools.test_modal.run\\\",[30,0,[\\\"isLoading\\\"]]]],null],[1,\\\"\\\\n  \\\"]],[]]]]]],[\\\"@closeModal\\\",\\\"@model\\\",\\\"param\\\"],[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/ai-tool-test-modal.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _modifier.on, _helper.fn, _dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiToolTestModal;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/chat-modal-channel-summary\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"discourse/components/conditional-loading-section\", \"discourse/components/d-modal\", \"discourse/components/d-modal-cancel\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/select-kit/components/combo-box\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/ai-errors\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _conditionalLoadingSection, _dModal, _dModalCancel, _ajax, _ajaxError, _comboBox, _discourseI18n, _aiErrors, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class ChatModalChannelSummary extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"sinceHours\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #sinceHours = (dt7948.i(this, \"sinceHours\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"summary\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #summary = (dt7948.i(this, \"summary\"), void 0);\n    availableSummaries = {};\n    sinceOptions = [1, 3, 6, 12, 24, 72, 168].map(hours => {\n      return {\n        name: (0, _discourseI18n.i18n)(\"discourse_ai.summarization.chat.since\", {\n          count: hours\n        }),\n        value: hours\n      };\n    });\n    get channelId() {\n      return this.args.model.channelId;\n    }\n    summarize(since) {\n      this.sinceHours = since;\n      this.loading = true;\n      if (this.availableSummaries[since]) {\n        this.summary = this.availableSummaries[since];\n        this.loading = false;\n        return;\n      }\n      return (0, _ajax.ajax)(`/discourse-ai/summarization/channels/${this.channelId}.json`, {\n        type: \"GET\",\n        data: {\n          since\n        }\n      }).then(data => {\n        this.availableSummaries[this.sinceHours] = data.summary;\n        this.summary = this.availableSummaries[this.sinceHours];\n      }).catch(error => {\n        if ((0, _aiErrors.isAiCreditLimitError)(error)) {\n          (0, _aiErrors.popupAiCreditLimitError)(error);\n        } else {\n          (0, _ajaxError.popupAjaxError)(error);\n        }\n      }).finally(() => this.loading = false);\n    }\n    static {\n      dt7948.n(this.prototype, \"summarize\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        @closeModal={{@closeModal}}\n        class=\"chat-modal-channel-summary\"\n        @title={{i18n \"discourse_ai.summarization.chat.title\"}}\n      >\n        <:body>\n          <span>{{i18n \"discourse_ai.summarization.chat.description\"}}</span>\n          <ComboBox\n            @value={{this.sinceHours}}\n            @content={{this.sinceOptions}}\n            @onChange={{this.summarize}}\n            @valueProperty=\"value\"\n            class=\"summarization-since\"\n          />\n          <ConditionalLoadingSection @isLoading={{this.loading}}>\n            <p class=\"summary-area\">{{this.summary}}</p>\n          </ConditionalLoadingSection>\n        </:body>\n        <:footer>\n          <DModalCancel @close={{@closeModal}} />\n        </:footer>\n      </DModal>\n      */\n      {\n        \"id\": \"iCojcwcX\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"chat-modal-channel-summary\\\"]],[[\\\"@closeModal\\\",\\\"@title\\\"],[[30,1],[28,[32,1],[\\\"discourse_ai.summarization.chat.title\\\"],null]]],[[\\\"body\\\",\\\"footer\\\"],[[[[1,\\\"\\\\n    \\\"],[10,1],[12],[1,[28,[32,1],[\\\"discourse_ai.summarization.chat.description\\\"],null]],[13],[1,\\\"\\\\n    \\\"],[8,[32,2],[[24,0,\\\"summarization-since\\\"]],[[\\\"@value\\\",\\\"@content\\\",\\\"@onChange\\\",\\\"@valueProperty\\\"],[[30,0,[\\\"sinceHours\\\"]],[30,0,[\\\"sinceOptions\\\"]],[30,0,[\\\"summarize\\\"]],\\\"value\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[32,3],null,[[\\\"@isLoading\\\"],[[30,0,[\\\"loading\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[10,2],[14,0,\\\"summary-area\\\"],[12],[1,[30,0,[\\\"summary\\\"]]],[13],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n  \\\"]],[]],[[[1,\\\"\\\\n    \\\"],[8,[32,4],null,[[\\\"@close\\\"],[[30,1]]],null],[1,\\\"\\\\n  \\\"]],[]]]]]],[\\\"@closeModal\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/chat-modal-channel-summary.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _comboBox.default, _conditionalLoadingSection.default, _dModalCancel.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = ChatModalChannelSummary;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/debug-ai-modal\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/modifier\", \"@ember/object\", \"@ember/runloop\", \"@ember/template\", \"discourse/components/d-button\", \"discourse/components/d-modal\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/later\", \"discourse/lib/utilities\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/utilities\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _modifier, _object, _runloop, _template, _dButton, _dModal, _ajax, _ajaxError, _later, _utilities, _discourseI18n, _utilities2, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class DebugAiModal extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"info\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #info = (dt7948.i(this, \"info\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"justCopiedText\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #justCopiedText = (dt7948.i(this, \"justCopiedText\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"activeTab\", [_tracking.tracked], function () {\n        return \"request\";\n      });\n    }\n    #activeTab = (dt7948.i(this, \"activeTab\"), void 0);\n    constructor() {\n      super(...arguments);\n      (0, _runloop.next)(() => {\n        this.loadApiRequestInfo();\n      });\n    }\n    get htmlContext() {\n      if (!this.info) {\n        return \"\";\n      }\n      let parsed;\n      try {\n        if (this.activeTab === \"request\") {\n          parsed = JSON.parse(this.info.raw_request_payload);\n        } else {\n          return this.formattedResponse(this.info.raw_response_payload);\n        }\n      } catch {\n        return this.info.raw_request_payload;\n      }\n      return (0, _utilities2.jsonToHtml)(parsed);\n    }\n    formattedResponse(response) {\n      // we need to replace the new lines with <br> to make it look good\n      const split = response.split(\"\\n\");\n      const safe = split.map(line => (0, _utilities.escapeExpression)(line)).join(\"<br>\");\n      return (0, _template.htmlSafe)(safe);\n    }\n    copyRequest() {\n      this.copy(this.info.raw_request_payload);\n    }\n    static {\n      dt7948.n(this.prototype, \"copyRequest\", [_object.action]);\n    }\n    copyResponse() {\n      this.copy(this.info.raw_response_payload);\n    }\n    static {\n      dt7948.n(this.prototype, \"copyResponse\", [_object.action]);\n    }\n    async loadLog(logId) {\n      try {\n        await (0, _ajax.ajax)(`/discourse-ai/ai-bot/show-debug-info/${logId}.json`).then(result => {\n          this.info = result;\n        });\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      }\n    }\n    prevLog() {\n      this.loadLog(this.info.prev_log_id);\n    }\n    static {\n      dt7948.n(this.prototype, \"prevLog\", [_object.action]);\n    }\n    nextLog() {\n      this.loadLog(this.info.next_log_id);\n    }\n    static {\n      dt7948.n(this.prototype, \"nextLog\", [_object.action]);\n    }\n    copy(text) {\n      (0, _utilities.clipboardCopy)(text);\n      this.justCopiedText = (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.conversation_shared\");\n      (0, _later.default)(() => {\n        this.justCopiedText = \"\";\n      }, 2000);\n    }\n    loadApiRequestInfo() {\n      (0, _ajax.ajax)(`/discourse-ai/ai-bot/post/${this.args.model.id}/show-debug-info.json`).then(result => {\n        this.info = result;\n      }).catch(e => {\n        (0, _ajaxError.popupAjaxError)(e);\n      });\n    }\n    get requestActive() {\n      return this.activeTab === \"request\" ? \"active\" : \"\";\n    }\n    get responseActive() {\n      return this.activeTab === \"response\" ? \"active\" : \"\";\n    }\n    requestClicked(e) {\n      this.activeTab = \"request\";\n      e.preventDefault();\n    }\n    static {\n      dt7948.n(this.prototype, \"requestClicked\", [_object.action]);\n    }\n    responseClicked(e) {\n      this.activeTab = \"response\";\n      e.preventDefault();\n    }\n    static {\n      dt7948.n(this.prototype, \"responseClicked\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        class=\"ai-debug-modal\"\n        @title={{i18n \"discourse_ai.ai_bot.debug_ai_modal.title\"}}\n        @closeModal={{@closeModal}}\n      >\n        <:body>\n          <ul class=\"nav nav-pills ai-debug-modal__nav\">\n            <li><a\n                href=\"\"\n                class={{this.requestActive}}\n                {{on \"click\" this.requestClicked}}\n              >{{i18n \"discourse_ai.ai_bot.debug_ai_modal.request\"}}</a></li>\n            <li><a\n                href=\"\"\n                class={{this.responseActive}}\n                {{on \"click\" this.responseClicked}}\n              >{{i18n \"discourse_ai.ai_bot.debug_ai_modal.response\"}}</a></li>\n          </ul>\n          <div class=\"ai-debug-modal__tokens\">\n            <span class=\"ai-debug-modal__tokens__count\">\n              {{i18n \"discourse_ai.ai_bot.debug_ai_modal.request_tokens\"}}\n              {{this.info.request_tokens}}\n            </span>\n            <span class=\"ai-debug-modal__tokens__count\">\n              {{i18n \"discourse_ai.ai_bot.debug_ai_modal.response_tokens\"}}\n              {{this.info.response_tokens}}\n            </span>\n            {{#if this.info.cache_read_tokens}}\n              <span class=\"ai-debug-modal__tokens__count\">\n                {{i18n \"discourse_ai.ai_bot.debug_ai_modal.cache_read_tokens\"}}\n                {{this.info.cache_read_tokens}}\n              </span>\n            {{/if}}\n            {{#if this.info.cache_write_tokens}}\n              <span class=\"ai-debug-modal__tokens__count\">\n                {{i18n \"discourse_ai.ai_bot.debug_ai_modal.cache_write_tokens\"}}\n                {{this.info.cache_write_tokens}}\n              </span>\n            {{/if}}\n          </div>\n          <div class=\"debug-ai-modal__preview\">\n            {{this.htmlContext}}\n          </div>\n        </:body>\n      \n        <:footer>\n          <DButton\n            class=\"btn confirm\"\n            @icon=\"copy\"\n            @action={{this.copyRequest}}\n            @label=\"discourse_ai.ai_bot.debug_ai_modal.copy_request\"\n          />\n          <DButton\n            class=\"btn confirm\"\n            @icon=\"copy\"\n            @action={{this.copyResponse}}\n            @label=\"discourse_ai.ai_bot.debug_ai_modal.copy_response\"\n          />\n          {{#if this.info.prev_log_id}}\n            <DButton\n              class=\"btn\"\n              @icon=\"angles-left\"\n              @action={{this.prevLog}}\n              @label=\"discourse_ai.ai_bot.debug_ai_modal.previous_log\"\n            />\n          {{/if}}\n          {{#if this.info.next_log_id}}\n            <DButton\n              class=\"btn\"\n              @icon=\"angles-right\"\n              @action={{this.nextLog}}\n              @label=\"discourse_ai.ai_bot.debug_ai_modal.next_log\"\n            />\n          {{/if}}\n          <span class=\"ai-debut-modal__just-copied\">{{this.justCopiedText}}</span>\n        </:footer>\n      </DModal>\n      */\n      {\n        \"id\": \"CcroiDBn\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"ai-debug-modal\\\"]],[[\\\"@title\\\",\\\"@closeModal\\\"],[[28,[32,1],[\\\"discourse_ai.ai_bot.debug_ai_modal.title\\\"],null],[30,1]]],[[\\\"body\\\",\\\"footer\\\"],[[[[1,\\\"\\\\n    \\\"],[10,\\\"ul\\\"],[14,0,\\\"nav nav-pills ai-debug-modal__nav\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"li\\\"],[12],[11,3],[24,6,\\\"\\\"],[16,0,[30,0,[\\\"requestActive\\\"]]],[4,[32,2],[\\\"click\\\",[30,0,[\\\"requestClicked\\\"]]],null],[12],[1,[28,[32,1],[\\\"discourse_ai.ai_bot.debug_ai_modal.request\\\"],null]],[13],[13],[1,\\\"\\\\n      \\\"],[10,\\\"li\\\"],[12],[11,3],[24,6,\\\"\\\"],[16,0,[30,0,[\\\"responseActive\\\"]]],[4,[32,2],[\\\"click\\\",[30,0,[\\\"responseClicked\\\"]]],null],[12],[1,[28,[32,1],[\\\"discourse_ai.ai_bot.debug_ai_modal.response\\\"],null]],[13],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-debug-modal__tokens\\\"],[12],[1,\\\"\\\\n      \\\"],[10,1],[14,0,\\\"ai-debug-modal__tokens__count\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,1],[\\\"discourse_ai.ai_bot.debug_ai_modal.request_tokens\\\"],null]],[1,\\\"\\\\n        \\\"],[1,[30,0,[\\\"info\\\",\\\"request_tokens\\\"]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n      \\\"],[10,1],[14,0,\\\"ai-debug-modal__tokens__count\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,1],[\\\"discourse_ai.ai_bot.debug_ai_modal.response_tokens\\\"],null]],[1,\\\"\\\\n        \\\"],[1,[30,0,[\\\"info\\\",\\\"response_tokens\\\"]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"info\\\",\\\"cache_read_tokens\\\"]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"ai-debug-modal__tokens__count\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,1],[\\\"discourse_ai.ai_bot.debug_ai_modal.cache_read_tokens\\\"],null]],[1,\\\"\\\\n          \\\"],[1,[30,0,[\\\"info\\\",\\\"cache_read_tokens\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[41,[30,0,[\\\"info\\\",\\\"cache_write_tokens\\\"]],[[[1,\\\"        \\\"],[10,1],[14,0,\\\"ai-debug-modal__tokens__count\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,1],[\\\"discourse_ai.ai_bot.debug_ai_modal.cache_write_tokens\\\"],null]],[1,\\\"\\\\n          \\\"],[1,[30,0,[\\\"info\\\",\\\"cache_write_tokens\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"debug-ai-modal__preview\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[30,0,[\\\"htmlContext\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]],[[[1,\\\"\\\\n    \\\"],[8,[32,3],[[24,0,\\\"btn confirm\\\"]],[[\\\"@icon\\\",\\\"@action\\\",\\\"@label\\\"],[\\\"copy\\\",[30,0,[\\\"copyRequest\\\"]],\\\"discourse_ai.ai_bot.debug_ai_modal.copy_request\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[32,3],[[24,0,\\\"btn confirm\\\"]],[[\\\"@icon\\\",\\\"@action\\\",\\\"@label\\\"],[\\\"copy\\\",[30,0,[\\\"copyResponse\\\"]],\\\"discourse_ai.ai_bot.debug_ai_modal.copy_response\\\"]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"info\\\",\\\"prev_log_id\\\"]],[[[1,\\\"      \\\"],[8,[32,3],[[24,0,\\\"btn\\\"]],[[\\\"@icon\\\",\\\"@action\\\",\\\"@label\\\"],[\\\"angles-left\\\",[30,0,[\\\"prevLog\\\"]],\\\"discourse_ai.ai_bot.debug_ai_modal.previous_log\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[41,[30,0,[\\\"info\\\",\\\"next_log_id\\\"]],[[[1,\\\"      \\\"],[8,[32,3],[[24,0,\\\"btn\\\"]],[[\\\"@icon\\\",\\\"@action\\\",\\\"@label\\\"],[\\\"angles-right\\\",[30,0,[\\\"nextLog\\\"]],\\\"discourse_ai.ai_bot.debug_ai_modal.next_log\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"],[10,1],[14,0,\\\"ai-debut-modal__just-copied\\\"],[12],[1,[30,0,[\\\"justCopiedText\\\"]]],[13],[1,\\\"\\\\n  \\\"]],[]]]]]],[\\\"@closeModal\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/debug-ai-modal.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _modifier.on, _dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = DebugAiModal;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/diff-modal\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-update\", \"@ember/render-modifiers/modifiers/will-destroy\", \"@ember/service\", \"@ember/template\", \"discourse/components/cook-text\", \"discourse/components/d-button\", \"discourse/components/d-modal\", \"discourse/helpers/concat-class\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/decorators\", \"discourse/lib/utilities\", \"discourse/truth-helpers\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/ai-errors\", \"discourse/plugins/discourse-ai/discourse/lib/diff-streamer\", \"discourse/plugins/discourse-ai/discourse/lib/smooth-streamer\", \"discourse/plugins/discourse-ai/discourse/components/ai-indicator-wave\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _didUpdate, _willDestroy, _service, _template, _cookText, _dButton, _dModal, _concatClass, _ajax, _ajaxError, _decorators, _utilities, _truthHelpers, _discourseI18n, _aiErrors, _diffStreamer3, _smoothStreamer3, _aiIndicatorWave, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class ModalDiffModal extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"messageBus\", [_service.service]);\n    }\n    #messageBus = (dt7948.i(this, \"messageBus\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"finalResult\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #finalResult = (dt7948.i(this, \"finalResult\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"escapedSelectedText\", [_tracking.tracked], function () {\n        return (0, _utilities.escapeExpression)(this.args.model.selectedText);\n      });\n    }\n    #escapedSelectedText = (dt7948.i(this, \"escapedSelectedText\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"diffStreamer\", [_tracking.tracked], function () {\n        return new _diffStreamer3.default(this.args.model.selectedText);\n      });\n    }\n    #diffStreamer = (dt7948.i(this, \"diffStreamer\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"suggestion\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #suggestion = (dt7948.i(this, \"suggestion\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"smoothStreamer\", [_tracking.tracked], function () {\n        return new _smoothStreamer3.default(() => this.suggestion, newValue => this.suggestion = newValue);\n      });\n    }\n    #smoothStreamer = (dt7948.i(this, \"smoothStreamer\"), void 0);\n    constructor() {\n      super(...arguments);\n      this.suggestChanges();\n    }\n    get diffResult() {\n      if (this.loading) {\n        return this.escapedSelectedText;\n      }\n      if (this.diffStreamer.diff?.length > 0) {\n        return this.diffStreamer.diff;\n      }\n      // Prevents flash by showing the\n      // original text when the diff is empty\n      return this.escapedSelectedText;\n    }\n    get smoothStreamerResult() {\n      if (this.loading) {\n        return this.escapedSelectedText;\n      }\n      return this.smoothStreamer.renderedText;\n    }\n    get isStreaming() {\n      // diffStreamer stops Streaming when it is finished with a chunk, looking at isDone is safe\n      // it starts off not done\n      if (this.args.model.showResultAsDiff) {\n        return !this.diffStreamer.isDone;\n      }\n      return this.smoothStreamer.isStreaming;\n    }\n    get primaryBtnLabel() {\n      return this.loading ? (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.context_menu.loading\") : (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.context_menu.confirm\");\n    }\n    get primaryBtnDisabled() {\n      return this.loading || this.isStreaming;\n    }\n    set progressChannel(value) {\n      if (this._progressChannel) {\n        this.messageBus.unsubscribe(this._progressChannel, this.updateResult);\n      }\n      this._progressChannel = value;\n      this.subscribe();\n    }\n    subscribe() {\n      // we have 1 channel per operation so we can safely subscribe at head\n      this.messageBus.subscribe(this._progressChannel, this.updateResult, 0);\n    }\n    cleanup() {\n      // stop all callbacks so it does not end up streaming pointlessly\n      this.#resetState();\n      if (this._progressChannel) {\n        this.messageBus.unsubscribe(this._progressChannel, this.updateResult);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"cleanup\", [_decorators.bind]);\n    }\n    updateResult(result) {\n      if ((0, _aiErrors.isAiCreditLimitError)(result)) {\n        this.loading = false;\n        this.cleanupAndClose();\n        (0, _aiErrors.popupAiCreditLimitError)(result);\n        return;\n      }\n      this.loading = false;\n      if (result.done) {\n        this.finalResult = result.result;\n        this.loading = false;\n      }\n      if (this.args.model.showResultAsDiff) {\n        this.diffStreamer.updateResult(result, \"result\");\n      } else {\n        this.smoothStreamer.updateResult(result, \"result\");\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"updateResult\", [_object.action]);\n    }\n    async suggestChanges() {\n      this.#resetState();\n      try {\n        this.loading = true;\n        const result = await (0, _ajax.ajax)(\"/discourse-ai/ai-helper/stream_suggestion\", {\n          method: \"POST\",\n          data: {\n            location: \"composer\",\n            mode: this.args.model.mode,\n            text: this.args.model.selectedText,\n            custom_prompt: this.args.model.customPromptValue,\n            force_default_locale: true,\n            client_id: this.messageBus.clientId\n          }\n        });\n        this.progressChannel = result.progress_channel;\n      } catch (e) {\n        if ((0, _aiErrors.isAiCreditLimitError)(e)) {\n          this.cleanupAndClose();\n          (0, _aiErrors.popupAiCreditLimitError)(e);\n        } else {\n          (0, _ajaxError.popupAjaxError)(e);\n        }\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"suggestChanges\", [_object.action]);\n    }\n    triggerConfirmChanges() {\n      this.args.closeModal();\n      if (this.suggestion) {\n        this.args.model.toolbarEvent.replaceText(this.args.model.selectedText, this.suggestion);\n      }\n      const finalResult = this.finalResult?.length > 0 ? this.finalResult : this.diffStreamer.suggestion;\n      if (this.args.model.showResultAsDiff && finalResult) {\n        this.args.model.toolbarEvent.replaceText(this.args.model.selectedText, finalResult);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"triggerConfirmChanges\", [_object.action]);\n    }\n    cleanupAndClose() {\n      this.cleanup();\n      this.#resetState();\n      this.loading = false;\n      this.args.closeModal();\n    }\n    static {\n      dt7948.n(this.prototype, \"cleanupAndClose\", [_object.action]);\n    }\n    focusConfirmBtn(element) {\n      if (!this.primaryBtnDisabled) {\n        element.focus();\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"focusConfirmBtn\", [_object.action]);\n    }\n    #resetState() {\n      this.suggestion = \"\";\n      this.finalResult = \"\";\n      this.smoothStreamer.resetStreaming();\n      this.diffStreamer.reset();\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        class=\"composer-ai-helper-modal\"\n        @title={{i18n \"discourse_ai.ai_helper.context_menu.changes\"}}\n        @closeModal={{this.cleanupAndClose}}\n      >\n        <:body>\n          <div {{willDestroy this.cleanup}} class=\"text-preview\">\n            <div\n              class={{concatClass\n                \"composer-ai-helper-modal__suggestion\"\n                \"streamable-content\"\n                (if this.isStreaming \"streaming\")\n                (if @model.showResultAsDiff \"inline-diff\")\n                (if this.diffStreamer.isThinking \"thinking\")\n                (if this.loading \"composer-ai-helper-modal__loading\")\n              }}\n            >\n              {{~#if @model.showResultAsDiff~}}\n                <span class=\"diff-inner\">{{htmlSafe this.diffResult}}</span>\n              {{else}}\n                {{#if (or this.loading this.smoothStreamer.isStreaming)}}\n                  <CookText\n                    @rawText={{this.smoothStreamerResult}}\n                    class=\"cooked\"\n                  />\n                {{else}}\n                  <div class=\"composer-ai-helper-modal__old-value\">\n                    {{~this.escapedSelectedText~}}\n                  </div>\n                  <div class=\"composer-ai-helper-modal__new-value\">\n                    <CookText\n                      @rawText={{this.smoothStreamerResult}}\n                      class=\"cooked\"\n                    />\n                  </div>\n                {{/if}}\n              {{/if}}\n            </div>\n          </div>\n        </:body>\n      \n        <:footer>\n          <DButton\n            class=\"btn-primary confirm\"\n            @disabled={{this.primaryBtnDisabled}}\n            @action={{this.triggerConfirmChanges}}\n            @translatedLabel={{this.primaryBtnLabel}}\n            {{didUpdate this.focusConfirmBtn this.isStreaming}}\n          >\n            {{#if this.loading}}\n              <AiIndicatorWave @loading={{this.loading}} />\n            {{/if}}\n          </DButton>\n          <DButton\n            class=\"btn-flat discard\"\n            @action={{this.cleanupAndClose}}\n            @label=\"discourse_ai.ai_helper.context_menu.discard\"\n          />\n          <DButton\n            class=\"regenerate\"\n            @icon=\"arrows-rotate\"\n            @action={{this.suggestChanges}}\n            @label=\"discourse_ai.ai_helper.context_menu.regen\"\n          />\n        </:footer>\n      </DModal>\n      */\n      {\n        \"id\": \"gejGP+fR\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"composer-ai-helper-modal\\\"]],[[\\\"@title\\\",\\\"@closeModal\\\"],[[28,[32,1],[\\\"discourse_ai.ai_helper.context_menu.changes\\\"],null],[30,0,[\\\"cleanupAndClose\\\"]]]],[[\\\"body\\\",\\\"footer\\\"],[[[[1,\\\"\\\\n    \\\"],[11,0],[24,0,\\\"text-preview\\\"],[4,[32,2],[[30,0,[\\\"cleanup\\\"]]],null],[12],[1,\\\"\\\\n      \\\"],[10,0],[15,0,[28,[32,3],[\\\"composer-ai-helper-modal__suggestion\\\",\\\"streamable-content\\\",[52,[30,0,[\\\"isStreaming\\\"]],\\\"streaming\\\"],[52,[30,1,[\\\"showResultAsDiff\\\"]],\\\"inline-diff\\\"],[52,[30,0,[\\\"diffStreamer\\\",\\\"isThinking\\\"]],\\\"thinking\\\"],[52,[30,0,[\\\"loading\\\"]],\\\"composer-ai-helper-modal__loading\\\"]],null]],[12],[41,[30,1,[\\\"showResultAsDiff\\\"]],[[[10,1],[14,0,\\\"diff-inner\\\"],[12],[1,[28,[32,4],[[30,0,[\\\"diffResult\\\"]]],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[41,[28,[32,5],[[30,0,[\\\"loading\\\"]],[30,0,[\\\"smoothStreamer\\\",\\\"isStreaming\\\"]]],null],[[[1,\\\"            \\\"],[8,[32,6],[[24,0,\\\"cooked\\\"]],[[\\\"@rawText\\\"],[[30,0,[\\\"smoothStreamerResult\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"composer-ai-helper-modal__old-value\\\"],[12],[1,[30,0,[\\\"escapedSelectedText\\\"]]],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"composer-ai-helper-modal__new-value\\\"],[12],[1,\\\"\\\\n              \\\"],[8,[32,6],[[24,0,\\\"cooked\\\"]],[[\\\"@rawText\\\"],[[30,0,[\\\"smoothStreamerResult\\\"]]]],null],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]]],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]],[[[1,\\\"\\\\n    \\\"],[8,[32,7],[[24,0,\\\"btn-primary confirm\\\"],[4,[32,8],[[30,0,[\\\"focusConfirmBtn\\\"]],[30,0,[\\\"isStreaming\\\"]]],null]],[[\\\"@disabled\\\",\\\"@action\\\",\\\"@translatedLabel\\\"],[[30,0,[\\\"primaryBtnDisabled\\\"]],[30,0,[\\\"triggerConfirmChanges\\\"]],[30,0,[\\\"primaryBtnLabel\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"loading\\\"]],[[[1,\\\"        \\\"],[8,[32,9],null,[[\\\"@loading\\\"],[[30,0,[\\\"loading\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"]],[]]]]],[1,\\\"\\\\n    \\\"],[8,[32,7],[[24,0,\\\"btn-flat discard\\\"]],[[\\\"@action\\\",\\\"@label\\\"],[[30,0,[\\\"cleanupAndClose\\\"]],\\\"discourse_ai.ai_helper.context_menu.discard\\\"]],null],[1,\\\"\\\\n    \\\"],[8,[32,7],[[24,0,\\\"regenerate\\\"]],[[\\\"@icon\\\",\\\"@action\\\",\\\"@label\\\"],[\\\"arrows-rotate\\\",[30,0,[\\\"suggestChanges\\\"]],\\\"discourse_ai.ai_helper.context_menu.regen\\\"]],null],[1,\\\"\\\\n  \\\"]],[]]]]]],[\\\"@model\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/diff-modal.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _willDestroy.default, _concatClass.default, _template.htmlSafe, _truthHelpers.or, _cookText.default, _dButton.default, _didUpdate.default, _aiIndicatorWave.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = ModalDiffModal;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/share-full-topic-modal\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/modifier\", \"@ember/object\", \"@ember/service\", \"@ember/template\", \"discourse/components/d-button\", \"discourse/components/d-modal\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/get-url\", \"discourse/lib/utilities\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _modifier, _object, _service, _template, _dButton, _dModal, _ajax, _ajaxError, _getUrl, _utilities, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class ShareModal extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"toasts\", [_service.service]);\n    }\n    #toasts = (dt7948.i(this, \"toasts\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"shareKey\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #shareKey = (dt7948.i(this, \"shareKey\"), void 0);\n    constructor() {\n      super(...arguments);\n      this.shareKey = this.args.model.share_key;\n    }\n    get htmlContext() {\n      let context = [];\n      this.args.model.context.forEach(post => {\n        context.push(`<p><b>${post.username}:</b></p>`);\n        context.push(post.cooked);\n      });\n      return (0, _template.htmlSafe)(context.join(\"\\n\"));\n    }\n    async generateShareURL() {\n      try {\n        const response = await (0, _ajax.ajax)(\"/discourse-ai/ai-bot/shared-ai-conversations\", {\n          type: \"POST\",\n          data: {\n            topic_id: this.args.model.topic_id\n          }\n        });\n        const url = (0, _getUrl.getAbsoluteURL)(`/discourse-ai/ai-bot/shared-ai-conversations/${response.share_key}`);\n        this.shareKey = response.share_key;\n        return new Blob([url], {\n          type: \"text/plain\"\n        });\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n        return;\n      }\n    }\n    get primaryLabel() {\n      return this.shareKey ? \"discourse_ai.ai_bot.share_full_topic_modal.update\" : \"discourse_ai.ai_bot.share_full_topic_modal.share\";\n    }\n    async deleteLink() {\n      try {\n        await (0, _ajax.ajax)(`/discourse-ai/ai-bot/shared-ai-conversations/${this.shareKey}.json`, {\n          type: \"DELETE\"\n        });\n        this.shareKey = null;\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"deleteLink\", [_object.action]);\n    }\n    async share() {\n      await (0, _utilities.clipboardCopyAsync)(this.generateShareURL.bind(this));\n      this.toasts.success({\n        duration: \"short\",\n        data: {\n          message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.conversation_shared\")\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"share\", [_object.action]);\n    }\n    async maybeCopyEmbed(event) {\n      if (!event.target.classList.contains(\"copy-embed\")) {\n        return true;\n      }\n      event.stopPropagation();\n      event.preventDefault();\n      let version = \"\";\n      if (event.target.dataset.artifactVersion) {\n        version = `data-ai-artifact-version=\"${event.target.dataset.artifactVersion}\"`;\n      }\n      const artifactEmbed = `<div class=\"ai-artifact\" ${version} data-ai-artifact-id=\"${event.target.dataset.artifactId}\"></div>`;\n      const promise = new Promise(resolve => {\n        resolve(artifactEmbed);\n      });\n      await (0, _utilities.clipboardCopyAsync)(() => promise);\n      this.toasts.success({\n        duration: \"short\",\n        data: {\n          message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.embed_copied\")\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"maybeCopyEmbed\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        class=\"ai-share-full-topic-modal\"\n        @title={{i18n \"discourse_ai.ai_bot.share_full_topic_modal.title\"}}\n        @closeModal={{@closeModal}}\n      >\n        <:body>\n          {{! template-lint-disable no-invalid-interactive }}\n          <div\n            class=\"ai-share-full-topic-modal__body\"\n            {{on \"click\" this.maybeCopyEmbed}}\n          >\n            {{this.htmlContext}}\n          </div>\n          {{! template-lint-enable}}\n        </:body>\n      \n        <:footer>\n          <DButton\n            class=\"btn-primary confirm\"\n            @icon=\"copy\"\n            @action={{this.share}}\n            @label={{this.primaryLabel}}\n          />\n          {{#if this.shareKey}}\n            <DButton\n              class=\"btn-danger\"\n              @icon=\"far-trash-can\"\n              @action={{this.deleteLink}}\n              @label=\"discourse_ai.ai_bot.share_full_topic_modal.delete\"\n            />\n          {{/if}}\n        </:footer>\n      </DModal>\n      */\n      {\n        \"id\": \"frDL5ty7\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"ai-share-full-topic-modal\\\"]],[[\\\"@title\\\",\\\"@closeModal\\\"],[[28,[32,1],[\\\"discourse_ai.ai_bot.share_full_topic_modal.title\\\"],null],[30,1]]],[[\\\"body\\\",\\\"footer\\\"],[[[[1,\\\"\\\\n\\\"],[1,\\\"    \\\"],[11,0],[24,0,\\\"ai-share-full-topic-modal__body\\\"],[4,[32,2],[\\\"click\\\",[30,0,[\\\"maybeCopyEmbed\\\"]]],null],[12],[1,\\\"\\\\n      \\\"],[1,[30,0,[\\\"htmlContext\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"],[1,\\\"  \\\"]],[]],[[[1,\\\"\\\\n    \\\"],[8,[32,3],[[24,0,\\\"btn-primary confirm\\\"]],[[\\\"@icon\\\",\\\"@action\\\",\\\"@label\\\"],[\\\"copy\\\",[30,0,[\\\"share\\\"]],[30,0,[\\\"primaryLabel\\\"]]]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"shareKey\\\"]],[[[1,\\\"      \\\"],[8,[32,3],[[24,0,\\\"btn-danger\\\"]],[[\\\"@icon\\\",\\\"@action\\\",\\\"@label\\\"],[\\\"far-trash-can\\\",[30,0,[\\\"deleteLink\\\"]],\\\"discourse_ai.ai_bot.share_full_topic_modal.delete\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[]]]]]],[\\\"@closeModal\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/share-full-topic-modal.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _modifier.on, _dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = ShareModal;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/share-modal\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/component\", \"@ember/modifier\", \"@ember/object\", \"@ember/service\", \"@ember/template\", \"discourse/components/d-button\", \"discourse/components/d-modal\", \"discourse/lib/later\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/ai-bot-helper\", \"discourse/plugins/discourse-ai/discourse/lib/copy-conversation\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _component2, _modifier, _object, _service, _template, _dButton, _dModal, _later, _discourseI18n, _aiBotHelper, _copyConversation, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class ShareModal extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"contextValue\", [_tracking.tracked], function () {\n        return 1;\n      });\n    }\n    #contextValue = (dt7948.i(this, \"contextValue\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"htmlContext\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #htmlContext = (dt7948.i(this, \"htmlContext\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"maxContext\", [_tracking.tracked], function () {\n        return 0;\n      });\n    }\n    #maxContext = (dt7948.i(this, \"maxContext\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"allPosts\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #allPosts = (dt7948.i(this, \"allPosts\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"justCopiedText\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #justCopiedText = (dt7948.i(this, \"justCopiedText\"), void 0);\n    constructor() {\n      super(...arguments);\n      const postStream = this.args.model.topic.get(\"postStream\");\n      let postNumbers = [];\n      // simpler to understand than Array.from\n      for (let i = 1; i <= this.args.model.post_number; i++) {\n        postNumbers.push(i);\n      }\n      this.allPosts = postNumbers.map(postNumber => {\n        let postId = postStream.findPostIdForPostNumber(postNumber);\n        if (postId) {\n          return postStream.findLoadedPost(postId);\n        }\n      }).filter(post => post);\n      this.maxContext = this.allPosts.length / 2;\n      this.contextValue = 1;\n      this.updateHtmlContext();\n    }\n    updateHtmlContext() {\n      let context = [];\n      const start = this.allPosts.length - this.contextValue * 2;\n      for (let i = start; i < this.allPosts.length; i++) {\n        const post = this.allPosts[i];\n        context.push(`<p><b>${post.username}:</b></p>`);\n        context.push(post.cooked);\n      }\n      this.htmlContext = (0, _template.htmlSafe)(context.join(\"\\n\"));\n    }\n    static {\n      dt7948.n(this.prototype, \"updateHtmlContext\", [_object.action]);\n    }\n    async copyContext() {\n      const from = this.allPosts[this.allPosts.length - this.contextValue * 2].post_number;\n      const to = this.args.model.post_number;\n      await (0, _copyConversation.default)(this.args.model.topic, from, to);\n      this.justCopiedText = (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.conversation_shared\");\n      (0, _later.default)(() => {\n        this.justCopiedText = \"\";\n      }, 2000);\n    }\n    static {\n      dt7948.n(this.prototype, \"copyContext\", [_object.action]);\n    }\n    shareConversationModal(event) {\n      event?.preventDefault();\n      this.args.closeModal();\n      (0, _aiBotHelper.showShareConversationModal)(this.modal, this.args.model.topic_id);\n      return false;\n    }\n    static {\n      dt7948.n(this.prototype, \"shareConversationModal\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        class=\"ai-share-modal\"\n        @title={{i18n \"discourse_ai.ai_bot.share_modal.title\"}}\n        @closeModal={{@closeModal}}\n      >\n        <:body>\n          <div class=\"ai-share-modal__preview\">\n            {{this.htmlContext}}\n          </div>\n        </:body>\n      \n        <:footer>\n          <div class=\"ai-share-modal__slider\">\n            <Input\n              @type=\"range\"\n              min=\"1\"\n              max={{this.maxContext}}\n              @value={{this.contextValue}}\n              {{on \"change\" this.updateHtmlContext}}\n            />\n            <div class=\"ai-share-modal__context\">\n              {{i18n \"discourse_ai.ai_bot.share_modal.context\"}}\n              {{this.contextValue}}\n            </div>\n          </div>\n          <DButton\n            class=\"btn-primary confirm\"\n            @icon=\"copy\"\n            @action={{this.copyContext}}\n            @label=\"discourse_ai.ai_bot.share_modal.copy\"\n          />\n          <span class=\"ai-share-modal__just-copied\">{{this.justCopiedText}}</span>\n          {{#if this.currentUser.can_share_ai_bot_conversations}}\n            <a href {{on \"click\" this.shareConversationModal}}>\n              <span class=\"ai-share-modal__share-tip\">\n                {{i18n \"discourse_ai.ai_bot.share_modal.share_tip\"}}\n              </span>\n            </a>\n          {{/if}}\n        </:footer>\n      </DModal>\n      */\n      {\n        \"id\": \"lEjTT0/V\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"ai-share-modal\\\"]],[[\\\"@title\\\",\\\"@closeModal\\\"],[[28,[32,1],[\\\"discourse_ai.ai_bot.share_modal.title\\\"],null],[30,1]]],[[\\\"body\\\",\\\"footer\\\"],[[[[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-share-modal__preview\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[30,0,[\\\"htmlContext\\\"]]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"]],[]],[[[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"ai-share-modal__slider\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,2],[[24,\\\"min\\\",\\\"1\\\"],[16,\\\"max\\\",[30,0,[\\\"maxContext\\\"]]],[4,[32,3],[\\\"change\\\",[30,0,[\\\"updateHtmlContext\\\"]]],null]],[[\\\"@type\\\",\\\"@value\\\"],[\\\"range\\\",[30,0,[\\\"contextValue\\\"]]]],null],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"ai-share-modal__context\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,1],[\\\"discourse_ai.ai_bot.share_modal.context\\\"],null]],[1,\\\"\\\\n        \\\"],[1,[30,0,[\\\"contextValue\\\"]]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n    \\\"],[8,[32,4],[[24,0,\\\"btn-primary confirm\\\"]],[[\\\"@icon\\\",\\\"@action\\\",\\\"@label\\\"],[\\\"copy\\\",[30,0,[\\\"copyContext\\\"]],\\\"discourse_ai.ai_bot.share_modal.copy\\\"]],null],[1,\\\"\\\\n    \\\"],[10,1],[14,0,\\\"ai-share-modal__just-copied\\\"],[12],[1,[30,0,[\\\"justCopiedText\\\"]]],[13],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"currentUser\\\",\\\"can_share_ai_bot_conversations\\\"]],[[[1,\\\"      \\\"],[11,3],[24,6,\\\"\\\"],[4,[32,3],[\\\"click\\\",[30,0,[\\\"shareConversationModal\\\"]]],null],[12],[1,\\\"\\\\n        \\\"],[10,1],[14,0,\\\"ai-share-modal__share-tip\\\"],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,1],[\\\"discourse_ai.ai_bot.share_modal.share_tip\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[]]]]]],[\\\"@closeModal\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/share-modal.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _component2.Input, _modifier.on, _dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = ShareModal;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/spam-test-modal\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"discourse/components/d-button\", \"discourse/components/d-modal\", \"discourse/helpers/with-event-value\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-indicator-wave\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _dButton, _dModal, _withEventValue, _ajax, _ajaxError, _discourseI18n, _aiIndicatorWave, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class SpamTestModal extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"testResult\", [_tracking.tracked]);\n    }\n    #testResult = (dt7948.i(this, \"testResult\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isLoading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isLoading = (dt7948.i(this, \"isLoading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"postUrl\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #postUrl = (dt7948.i(this, \"postUrl\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isSpam\", [_tracking.tracked]);\n    }\n    #isSpam = (dt7948.i(this, \"isSpam\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"reason\", [_tracking.tracked]);\n    }\n    #reason = (dt7948.i(this, \"reason\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"llmName\", [_tracking.tracked]);\n    }\n    #llmName = (dt7948.i(this, \"llmName\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"systemPrompt\", [_tracking.tracked]);\n    }\n    #systemPrompt = (dt7948.i(this, \"systemPrompt\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"sentMessage\", [_tracking.tracked]);\n    }\n    #sentMessage = (dt7948.i(this, \"sentMessage\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"scanHistory\", [_tracking.tracked]);\n    }\n    #scanHistory = (dt7948.i(this, \"scanHistory\"), void 0);\n    async runTest() {\n      this.isLoading = true;\n      try {\n        const response = await (0, _ajax.ajax)(`/admin/plugins/discourse-ai/ai-spam/test.json`, {\n          type: \"POST\",\n          data: {\n            post_url: this.postUrl,\n            custom_instructions: this.args.model.customInstructions,\n            llm_id: this.args.model.llmId\n          }\n        });\n        this.isSpam = response.is_spam;\n        this.testResult = response.is_spam ? (0, _discourseI18n.i18n)(\"discourse_ai.spam.test_modal.spam\") : (0, _discourseI18n.i18n)(\"discourse_ai.spam.test_modal.not_spam\");\n        this.reason = response.reason;\n        this.llmName = response.llm_name;\n        this.systemPrompt = response.system_prompt;\n        this.sentMessage = response.sent_message;\n        this.scanHistory = response.scan_history;\n      } catch (error) {\n        (0, _ajaxError.popupAjaxError)(error);\n      } finally {\n        this.isLoading = false;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"runTest\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        @title={{i18n \"discourse_ai.spam.test_modal.title\"}}\n        @closeModal={{@closeModal}}\n        @bodyClass=\"spam-test-modal__body\"\n        class=\"spam-test-modal\"\n      >\n        <:body>\n          <div class=\"control-group\">\n            <label>{{i18n \"discourse_ai.spam.test_modal.post_url_label\"}}</label>\n            <input\n              {{on \"input\" (withEventValue (fn (mut this.postUrl)))}}\n              type=\"text\"\n              placeholder={{i18n\n                \"discourse_ai.spam.test_modal.post_url_placeholder\"\n              }}\n            />\n          </div>\n      \n          {{#if this.testResult}}\n            <div class=\"spam-test-modal__results\">\n              <div\n                class=\"spam-test-modal__verdict\n                  {{if this.isSpam 'is-spam' 'not-spam'}}\"\n              >\n                {{this.testResult}}\n              </div>\n      \n              {{#if this.reason}}\n                <div\n                  class=\"spam-test-modal__info-box spam-test-modal__info-box--reason\"\n                >\n                  <h4 class=\"spam-test-modal__info-box-title\">{{i18n\n                      \"discourse_ai.spam.test_modal.reason\"\n                    }}</h4>\n                  <div class=\"spam-test-modal__info-box-content\">\n                    <p>{{this.reason}}</p>\n                  </div>\n                </div>\n              {{/if}}\n      \n              <div class=\"spam-test-modal__info-grid\">\n                {{#if this.llmName}}\n                  <div\n                    class=\"spam-test-modal__info-box spam-test-modal__info-box--llm\"\n                  >\n                    <h4 class=\"spam-test-modal__info-box-title\">{{i18n\n                        \"discourse_ai.spam.test_modal.llm\"\n                      }}</h4>\n                    <div class=\"spam-test-modal__info-box-content\">\n                      {{this.llmName}}\n                    </div>\n                  </div>\n                {{/if}}\n      \n                {{#if this.scanHistory}}\n                  <div\n                    class=\"spam-test-modal__info-box spam-test-modal__info-box--history\"\n                  >\n                    <h4 class=\"spam-test-modal__info-box-title\">{{i18n\n                        \"discourse_ai.spam.test_modal.scan_history\"\n                      }}</h4>\n                    <div class=\"spam-test-modal__info-box-content\">\n                      <pre>{{this.scanHistory}}</pre>\n                    </div>\n                  </div>\n                {{/if}}\n              </div>\n      \n              {{#if this.sentMessage}}\n                <div\n                  class=\"spam-test-modal__info-box spam-test-modal__info-box--message\"\n                >\n                  <h4 class=\"spam-test-modal__info-box-title\">{{i18n\n                      \"discourse_ai.spam.test_modal.sent_message\"\n                    }}</h4>\n                  <div class=\"spam-test-modal__info-box-content\">\n                    <pre>{{this.sentMessage}}</pre>\n                  </div>\n                </div>\n              {{/if}}\n      \n              {{#if this.systemPrompt}}\n                <div\n                  class=\"spam-test-modal__info-box spam-test-modal__info-box--prompt\"\n                >\n                  <h4 class=\"spam-test-modal__info-box-title\">{{i18n\n                      \"discourse_ai.spam.test_modal.system_prompt\"\n                    }}</h4>\n                  <div class=\"spam-test-modal__info-box-content\">\n                    <pre>{{this.systemPrompt}}</pre>\n                  </div>\n                </div>\n              {{/if}}\n            </div>\n          {{/if}}\n        </:body>\n      \n        <:footer>\n          <DButton\n            @action={{this.runTest}}\n            @label=\"discourse_ai.spam.test_modal.run\"\n            @disabled={{this.isLoading}}\n            class=\"btn-primary spam-test-modal__run-button\"\n          >\n            <AiIndicatorWave @loading={{this.isLoading}} />\n          </DButton>\n        </:footer>\n      </DModal>\n      */\n      {\n        \"id\": \"U8BdmtaA\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"spam-test-modal\\\"]],[[\\\"@title\\\",\\\"@closeModal\\\",\\\"@bodyClass\\\"],[[28,[32,1],[\\\"discourse_ai.spam.test_modal.title\\\"],null],[30,1],\\\"spam-test-modal__body\\\"]],[[\\\"body\\\",\\\"footer\\\"],[[[[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"control-group\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"label\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.spam.test_modal.post_url_label\\\"],null]],[13],[1,\\\"\\\\n      \\\"],[11,\\\"input\\\"],[16,\\\"placeholder\\\",[28,[32,1],[\\\"discourse_ai.spam.test_modal.post_url_placeholder\\\"],null]],[24,4,\\\"text\\\"],[4,[32,2],[\\\"input\\\",[28,[32,3],[[28,[32,4],[[28,[31,0],[[30,0,[\\\"postUrl\\\"]]],null]],null]],null]],null],[12],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"testResult\\\"]],[[[1,\\\"      \\\"],[10,0],[14,0,\\\"spam-test-modal__results\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[15,0,[29,[\\\"spam-test-modal__verdict\\\\n            \\\",[52,[30,0,[\\\"isSpam\\\"]],\\\"is-spam\\\",\\\"not-spam\\\"]]]],[12],[1,\\\"\\\\n          \\\"],[1,[30,0,[\\\"testResult\\\"]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"reason\\\"]],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"spam-test-modal__info-box spam-test-modal__info-box--reason\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"h4\\\"],[14,0,\\\"spam-test-modal__info-box-title\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.spam.test_modal.reason\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"spam-test-modal__info-box-content\\\"],[12],[1,\\\"\\\\n              \\\"],[10,2],[12],[1,[30,0,[\\\"reason\\\"]]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"spam-test-modal__info-grid\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"llmName\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"spam-test-modal__info-box spam-test-modal__info-box--llm\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"h4\\\"],[14,0,\\\"spam-test-modal__info-box-title\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.spam.test_modal.llm\\\"],null]],[13],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"spam-test-modal__info-box-content\\\"],[12],[1,\\\"\\\\n                \\\"],[1,[30,0,[\\\"llmName\\\"]]],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"scanHistory\\\"]],[[[1,\\\"            \\\"],[10,0],[14,0,\\\"spam-test-modal__info-box spam-test-modal__info-box--history\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"h4\\\"],[14,0,\\\"spam-test-modal__info-box-title\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.spam.test_modal.scan_history\\\"],null]],[13],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"spam-test-modal__info-box-content\\\"],[12],[1,\\\"\\\\n                \\\"],[10,\\\"pre\\\"],[12],[1,[30,0,[\\\"scanHistory\\\"]]],[13],[1,\\\"\\\\n              \\\"],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"        \\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"sentMessage\\\"]],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"spam-test-modal__info-box spam-test-modal__info-box--message\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"h4\\\"],[14,0,\\\"spam-test-modal__info-box-title\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.spam.test_modal.sent_message\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"spam-test-modal__info-box-content\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"pre\\\"],[12],[1,[30,0,[\\\"sentMessage\\\"]]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"systemPrompt\\\"]],[[[1,\\\"          \\\"],[10,0],[14,0,\\\"spam-test-modal__info-box spam-test-modal__info-box--prompt\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"h4\\\"],[14,0,\\\"spam-test-modal__info-box-title\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.spam.test_modal.system_prompt\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"spam-test-modal__info-box-content\\\"],[12],[1,\\\"\\\\n              \\\"],[10,\\\"pre\\\"],[12],[1,[30,0,[\\\"systemPrompt\\\"]]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"]],[]],[[[1,\\\"\\\\n    \\\"],[8,[32,5],[[24,0,\\\"btn-primary spam-test-modal__run-button\\\"]],[[\\\"@action\\\",\\\"@label\\\",\\\"@disabled\\\"],[[30,0,[\\\"runTest\\\"]],\\\"discourse_ai.spam.test_modal.run\\\",[30,0,[\\\"isLoading\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[32,6],null,[[\\\"@loading\\\"],[[30,0,[\\\"isLoading\\\"]]]],null],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n  \\\"]],[]]]]]],[\\\"@closeModal\\\"],[\\\"mut\\\",\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/spam-test-modal.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _modifier.on, _withEventValue.default, _helper.fn, _dButton.default, _aiIndicatorWave.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = SpamTestModal;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/modal/thumbnail-suggestions\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"discourse/components/conditional-loading-spinner\", \"discourse/components/d-button\", \"discourse/components/d-modal\", \"discourse/components/d-modal-cancel\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/ai-errors\", \"discourse/plugins/discourse-ai/discourse/components/thumbnail-suggestion-item\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _conditionalLoadingSpinner, _dButton, _dModal, _dModalCancel, _ajax, _ajaxError, _discourseI18n, _aiErrors, _thumbnailSuggestionItem, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class ThumbnailSuggestions extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectedImages\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #selectedImages = (dt7948.i(this, \"selectedImages\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"thumbnails\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #thumbnails = (dt7948.i(this, \"thumbnails\"), void 0);\n    constructor() {\n      super(...arguments);\n      this.findThumbnails();\n    }\n    get isDisabled() {\n      return this.selectedImages.length === 0;\n    }\n    async findThumbnails() {\n      this.loading = true;\n      try {\n        const thumbnails = await (0, _ajax.ajax)(\"/discourse-ai/ai-helper/suggest\", {\n          method: \"POST\",\n          data: {\n            mode: this.args.model.mode,\n            text: this.args.model.selectedText,\n            force_default_locale: true\n          }\n        });\n        this.thumbnails = thumbnails.thumbnails;\n      } catch (error) {\n        if ((0, _aiErrors.isAiCreditLimitError)(error)) {\n          this.args.closeModal();\n          (0, _aiErrors.popupAiCreditLimitError)(error);\n        } else {\n          (0, _ajaxError.popupAjaxError)(error);\n        }\n      } finally {\n        this.loading = false;\n      }\n    }\n    addSelection(selection) {\n      const thumbnailMarkdown = `![${selection.original_filename}|${selection.width}x${selection.height}](${selection.short_url})`;\n      this.selectedImages = [...this.selectedImages, thumbnailMarkdown];\n    }\n    static {\n      dt7948.n(this.prototype, \"addSelection\", [_object.action]);\n    }\n    removeSelection(selection) {\n      const thumbnailMarkdown = `![${selection.original_filename}|${selection.width}x${selection.height}](${selection.short_url})`;\n      this.selectedImages = this.selectedImages.filter(thumbnail => {\n        if (thumbnail !== thumbnailMarkdown) {\n          return thumbnail;\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"removeSelection\", [_object.action]);\n    }\n    appendSelectedImages() {\n      const imageMarkdown = \"\\n\\n\" + this.selectedImages.join(\"\\n\");\n      const dEditorInput = document.querySelector(\".d-editor-input\");\n      dEditorInput.setSelectionRange(dEditorInput.value.length, dEditorInput.value.length);\n      dEditorInput.focus();\n      document.execCommand(\"insertText\", false, imageMarkdown);\n      this.args.closeModal();\n    }\n    static {\n      dt7948.n(this.prototype, \"appendSelectedImages\", [_object.action]);\n    }\n    regenerateThumbnails() {\n      this.selectedImages = [];\n      this.thumbnails = null;\n      this.findThumbnails();\n    }\n    static {\n      dt7948.n(this.prototype, \"regenerateThumbnails\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DModal\n        class=\"thumbnail-suggestions-modal\"\n        @title={{i18n \"discourse_ai.ai_helper.thumbnail_suggestions.title\"}}\n        @closeModal={{@closeModal}}\n      >\n        <:body>\n          <ConditionalLoadingSpinner @condition={{this.loading}}>\n            <div class=\"ai-thumbnail-suggestions\">\n              {{#each this.thumbnails as |thumbnail|}}\n                <ThumbnailSuggestionItem\n                  @thumbnail={{thumbnail}}\n                  @addSelection={{this.addSelection}}\n                  @removeSelection={{this.removeSelection}}\n                />\n              {{/each}}\n            </div>\n          </ConditionalLoadingSpinner>\n        </:body>\n      \n        <:footer>\n          <DButton\n            @action={{this.appendSelectedImages}}\n            @label=\"save\"\n            @disabled={{this.isDisabled}}\n            class=\"btn-primary create\"\n          />\n          <DModalCancel @close={{@closeModal}} />\n          <DButton\n            @action={{this.regenerateThumbnails}}\n            @icon=\"arrows-rotate\"\n            @label=\"discourse_ai.ai_helper.thumbnail_suggestions.try_again\"\n            @disabled={{this.loading}}\n            class=\"regenerate\"\n          />\n        </:footer>\n      </DModal>\n      */\n      {\n        \"id\": \"JBtnWdta\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"thumbnail-suggestions-modal\\\"]],[[\\\"@title\\\",\\\"@closeModal\\\"],[[28,[32,1],[\\\"discourse_ai.ai_helper.thumbnail_suggestions.title\\\"],null],[30,1]]],[[\\\"body\\\",\\\"footer\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[32,2],null,[[\\\"@condition\\\"],[[30,0,[\\\"loading\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"ai-thumbnail-suggestions\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"thumbnails\\\"]]],null]],null],null,[[[1,\\\"          \\\"],[8,[32,3],null,[[\\\"@thumbnail\\\",\\\"@addSelection\\\",\\\"@removeSelection\\\"],[[30,2],[30,0,[\\\"addSelection\\\"]],[30,0,[\\\"removeSelection\\\"]]]],null],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"      \\\"],[13],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n  \\\"]],[]],[[[1,\\\"\\\\n    \\\"],[8,[32,4],[[24,0,\\\"btn-primary create\\\"]],[[\\\"@action\\\",\\\"@label\\\",\\\"@disabled\\\"],[[30,0,[\\\"appendSelectedImages\\\"]],\\\"save\\\",[30,0,[\\\"isDisabled\\\"]]]],null],[1,\\\"\\\\n    \\\"],[8,[32,5],null,[[\\\"@close\\\"],[[30,1]]],null],[1,\\\"\\\\n    \\\"],[8,[32,4],[[24,0,\\\"regenerate\\\"]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@label\\\",\\\"@disabled\\\"],[[30,0,[\\\"regenerateThumbnails\\\"]],\\\"arrows-rotate\\\",\\\"discourse_ai.ai_helper.thumbnail_suggestions.try_again\\\",[30,0,[\\\"loading\\\"]]]],null],[1,\\\"\\\\n  \\\"]],[]]]]]],[\\\"@closeModal\\\",\\\"thumbnail\\\"],[\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/modal/thumbnail-suggestions.js\",\n        \"scope\": () => [_dModal.default, _discourseI18n.i18n, _conditionalLoadingSpinner.default, _thumbnailSuggestionItem.default, _dButton.default, _dModalCancel.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = ThumbnailSuggestions;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/model-accuracies\", [\"exports\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _discourseI18n, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const ModelAccuracies = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    {{#if @accuracies}}\n    <table class=\"reviewable-scores\">\n      <tbody>\n        {{#each-in @accuracies as |model acc|}}\n          <tr>\n            <td colspan=\"4\">{{i18n \"discourse_ai.reviewables.model_used\"}}</td>\n            <td colspan=\"3\">{{model}}</td>\n            <td colspan=\"4\">{{i18n \"discourse_ai.reviewables.accuracy\"}}</td>\n            <td colspan=\"3\">{{acc}}%</td>\n          </tr>\n        {{/each-in}}\n      </tbody>\n    </table>\n  {{/if}}\n  */\n  {\n    \"id\": \"UFeJQqNH\",\n    \"block\": \"[[[41,[30,1],[[[1,\\\"  \\\"],[10,\\\"table\\\"],[14,0,\\\"reviewable-scores\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[30,1]],null],null,[[[1,\\\"        \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"td\\\"],[14,\\\"colspan\\\",\\\"4\\\"],[12],[1,[28,[32,0],[\\\"discourse_ai.reviewables.model_used\\\"],null]],[13],[1,\\\"\\\\n          \\\"],[10,\\\"td\\\"],[14,\\\"colspan\\\",\\\"3\\\"],[12],[1,[30,3]],[13],[1,\\\"\\\\n          \\\"],[10,\\\"td\\\"],[14,\\\"colspan\\\",\\\"4\\\"],[12],[1,[28,[32,0],[\\\"discourse_ai.reviewables.accuracy\\\"],null]],[13],[1,\\\"\\\\n          \\\"],[10,\\\"td\\\"],[14,\\\"colspan\\\",\\\"3\\\"],[12],[1,[30,2]],[1,\\\"%\\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[2,3]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@accuracies\\\",\\\"acc\\\",\\\"model\\\"],[\\\"if\\\",\\\"each\\\",\\\"-each-in\\\"]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/model-accuracies.js\",\n    \"scope\": () => [_discourseI18n.i18n],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"model-accuracies:ModelAccuracies\"));\n  var _default = _exports.default = ModelAccuracies;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/post-menu/ai-cancel-streaming-button\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"discourse/components/d-button\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _dButton, _ajax, _ajaxError, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiCancelStreamingButton extends _component.default {\n    async cancelStreaming() {\n      const post = this.args.post;\n      try {\n        await (0, _ajax.ajax)(`/discourse-ai/ai-bot/post/${post.id}/stop-streaming`, {\n          type: \"POST\"\n        });\n        document.querySelector(`#post_${post.post_number}`).classList.remove(\"streaming\");\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"cancelStreaming\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DButton\n        class=\"post-action-menu__ai-cancel-streaming cancel-streaming\"\n        ...attributes\n        @action={{this.cancelStreaming}}\n        @icon=\"pause\"\n        @title=\"discourse_ai.ai_bot.cancel_streaming\"\n      />\n      */\n      {\n        \"id\": \"Ojb3h+Ni\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"post-action-menu__ai-cancel-streaming cancel-streaming\\\"],[17,1]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@title\\\"],[[30,0,[\\\"cancelStreaming\\\"]],\\\"pause\\\",\\\"discourse_ai.ai_bot.cancel_streaming\\\"]],null]],[\\\"&attrs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/post-menu/ai-cancel-streaming-button.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiCancelStreamingButton;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/post-menu/ai-debug-button\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/plugins/discourse-ai/discourse/lib/ai-bot-helper\", \"discourse/plugins/discourse-ai/discourse/components/modal/debug-ai-modal\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _service, _dButton, _aiBotHelper, _debugAiModal, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiDebugButton extends _component.default {\n    static shouldRender(args) {\n      return (0, _aiBotHelper.isPostFromAiBot)(args.post, args.state.currentUser);\n    }\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    debugAiResponse() {\n      this.modal.show(_debugAiModal.default, {\n        model: this.args.post\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"debugAiResponse\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DButton\n        class=\"post-action-menu__debug-ai\"\n        ...attributes\n        @action={{this.debugAiResponse}}\n        @icon=\"info\"\n        @title=\"discourse_ai.ai_bot.debug_ai\"\n      />\n      */\n      {\n        \"id\": \"OKy13k7U\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"post-action-menu__debug-ai\\\"],[17,1]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@title\\\"],[[30,0,[\\\"debugAiResponse\\\"]],\\\"info\\\",\\\"discourse_ai.ai_bot.debug_ai\\\"]],null]],[\\\"&attrs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/post-menu/ai-debug-button.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiDebugButton;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/post-menu/ai-retry-streaming-button\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"discourse/components/d-button\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _dButton, _ajax, _ajaxError, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * @component AiRetryStreamingButton\n   * @argument post\n   */class AiRetryStreamingButton extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"retrying\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #retrying = (dt7948.i(this, \"retrying\"), void 0);\n    /**\n    * Tracks whether a retry request is currently in-flight.\n    *\n    * @type {boolean}\n    */\n    /**\n    * Sends a request to retry streaming the current AI response.\n    *\n    * @returns {Promise<void>}\n    */\n    async retry() {\n      if (this.retrying) {\n        return;\n      }\n      this.retrying = true;\n      try {\n        await (0, _ajax.ajax)(`/discourse-ai/ai-bot/post/${this.args.post.id}/retry`, {\n          type: \"POST\"\n        });\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      } finally {\n        this.retrying = false;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"retry\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DButton\n        class=\"post-action-menu__ai-retry-streaming ai-retry-streaming\"\n        ...attributes\n        @action={{this.retry}}\n        @icon={{if this.retrying \"spinner\" \"arrow-rotate-right\"}}\n        @title=\"discourse_ai.ai_bot.try_again\"\n        @disabled={{this.retrying}}\n      />\n      */\n      {\n        \"id\": \"/ULKgb6H\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"post-action-menu__ai-retry-streaming ai-retry-streaming\\\"],[17,1]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@title\\\",\\\"@disabled\\\"],[[30,0,[\\\"retry\\\"]],[52,[30,0,[\\\"retrying\\\"]],\\\"spinner\\\",\\\"arrow-rotate-right\\\"],\\\"discourse_ai.ai_bot.try_again\\\",[30,0,[\\\"retrying\\\"]]]],null]],[\\\"&attrs\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/post-menu/ai-retry-streaming-button.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiRetryStreamingButton;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/post-menu/ai-share-button\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/plugins/discourse-ai/discourse/lib/ai-bot-helper\", \"discourse/plugins/discourse-ai/discourse/lib/copy-conversation\", \"discourse/plugins/discourse-ai/discourse/components/modal/share-modal\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _service, _dButton, _aiBotHelper, _copyConversation, _shareModal, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const AUTO_COPY_THRESHOLD = 4;\n  class AiDebugButton extends _component.default {\n    static shouldRender(args) {\n      return (0, _aiBotHelper.isPostFromAiBot)(args.post, args.state.currentUser);\n    }\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    async shareAiResponse() {\n      const post = this.args.post;\n      if (post.post_number <= AUTO_COPY_THRESHOLD) {\n        await (0, _copyConversation.default)(post.topic, 1, post.post_number);\n        this.args.showFeedback(\"discourse_ai.ai_bot.conversation_shared\");\n      } else {\n        this.modal.show(_shareModal.default, {\n          model: post\n        });\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"shareAiResponse\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <DButton\n        class=\"post-action-menu__share-ai\"\n        ...attributes\n        @action={{this.shareAiResponse}}\n        @icon=\"far-copy\"\n        @title=\"discourse_ai.ai_bot.share\"\n      />\n      */\n      {\n        \"id\": \"91QN/QYI\",\n        \"block\": \"[[[8,[32,0],[[24,0,\\\"post-action-menu__share-ai\\\"],[17,1]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@title\\\"],[[30,0,[\\\"shareAiResponse\\\"]],\\\"far-copy\\\",\\\"discourse_ai.ai_bot.share\\\"]],null]],[\\\"&attrs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/post-menu/ai-share-button.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiDebugButton;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/post/ai-persona-flair\", [\"exports\", \"@glimmer/component\", \"discourse/plugins/discourse-ai/discourse/lib/ai-bot-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _aiBotHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiPersonaFlair extends _component.default {\n    static shouldRender(args) {\n      return (0, _aiBotHelper.isGPTBot)(args.post.user);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <span class=\"persona-flair\">\n        {{@outletArgs.post.topic.ai_persona_name}}\n      </span>\n      */\n      {\n        \"id\": \"50uzhI5k\",\n        \"block\": \"[[[10,1],[14,0,\\\"persona-flair\\\"],[12],[1,\\\"\\\\n  \\\"],[1,[30,1,[\\\"post\\\",\\\"topic\\\",\\\"ai_persona_name\\\"]]],[1,\\\"\\\\n\\\"],[13]],[\\\"@outletArgs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/post/ai-persona-flair.js\",\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiPersonaFlair;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/post/meta-data/ai-cancel-streaming\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"discourse/components/d-button\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _dButton, _ajax, _ajaxError, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * @component AiCancelStreaming\n   * @argument post\n   */class AiCancelStreaming extends _component.default {\n    async cancelStreaming() {\n      const post = this.args.post;\n      try {\n        await (0, _ajax.ajax)(`/discourse-ai/ai-bot/post/${post.id}/stop-streaming`, {\n          type: \"POST\"\n        });\n        document.querySelector(`#post_${post.post_number}`).classList.remove(\"streaming\");\n      } catch (e) {\n        (0, _ajaxError.popupAjaxError)(e);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"cancelStreaming\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"post-info ai-cancel-streaming-container\">\n        <DButton\n          class=\"btn-transparent ai-cancel-streaming\"\n          @action={{this.cancelStreaming}}\n          @icon=\"pause\"\n          @label=\"discourse_ai.ai_bot.cancel_streaming\"\n        />\n      </div>\n      */\n      {\n        \"id\": \"3+a10o8X\",\n        \"block\": \"[[[10,0],[14,0,\\\"post-info ai-cancel-streaming-container\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],[[24,0,\\\"btn-transparent ai-cancel-streaming\\\"]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@label\\\"],[[30,0,[\\\"cancelStreaming\\\"]],\\\"pause\\\",\\\"discourse_ai.ai_bot.cancel_streaming\\\"]],null],[1,\\\"\\\\n\\\"],[13]],[],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/post/meta-data/ai-cancel-streaming.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiCancelStreaming;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/rag-options-fk\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/modifier\", \"@ember/object\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-llm-selector\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _modifier, _object, _discourseI18n, _aiLlmSelector, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class RagOptionsFk extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"showIndexingOptions\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #showIndexingOptions = (dt7948.i(this, \"showIndexingOptions\"), void 0);\n    toggleIndexingOptions(event) {\n      this.showIndexingOptions = !this.showIndexingOptions;\n      event.preventDefault();\n      event.stopPropagation();\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleIndexingOptions\", [_object.action]);\n    }\n    get indexingOptionsText() {\n      return this.showIndexingOptions ? (0, _discourseI18n.i18n)(\"discourse_ai.rag.options.hide_indexing_options\") : (0, _discourseI18n.i18n)(\"discourse_ai.rag.options.show_indexing_options\");\n    }\n    get visionLlms() {\n      return this.args.llms.filter(llm => llm.vision_enabled);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if @data.rag_uploads}}\n        <a\n          href=\"#\"\n          class=\"rag-options__indexing-options\"\n          {{on \"click\" this.toggleIndexingOptions}}\n        >{{this.indexingOptionsText}}</a>\n      {{/if}}\n      \n      {{#if this.showIndexingOptions}}\n        <@form.Field\n          @name=\"rag_chunk_tokens\"\n          @title={{i18n \"discourse_ai.rag.options.rag_chunk_tokens\"}}\n          @tooltip={{i18n \"discourse_ai.rag.options.rag_chunk_tokens_help\"}}\n          @format=\"large\"\n          as |field|\n        >\n          <field.Input @type=\"number\" step=\"any\" lang=\"en\" />\n        </@form.Field>\n      \n        <@form.Field\n          @name=\"rag_chunk_overlap_tokens\"\n          @title={{i18n \"discourse_ai.rag.options.rag_chunk_tokens\"}}\n          @tooltip={{i18n\n            \"discourse_ai.rag.options.rag_chunk_overlap_tokens_help\"\n          }}\n          @format=\"large\"\n          as |field|\n        >\n          <field.Input @type=\"number\" step=\"any\" lang=\"en\" />\n        </@form.Field>\n      \n        {{#if @allowImages}}\n          <@form.Field\n            @name=\"rag_llm_model_id\"\n            @title={{i18n \"discourse_ai.rag.options.rag_llm_model\"}}\n            @tooltip={{i18n \"discourse_ai.rag.options.rag_llm_model_help\"}}\n            @format=\"large\"\n            as |field|\n          >\n            <field.Custom>\n              <AiLlmSelector\n                @value={{field.value}}\n                @llms={{this.visionLlms}}\n                @onChange={{field.set}}\n                @class=\"ai-persona-editor__llms\"\n              />\n            </field.Custom>\n          </@form.Field>\n        {{/if}}\n        {{yield}}\n      {{/if}}\n      */\n      {\n        \"id\": \"L07sbWgr\",\n        \"block\": \"[[[41,[30,1,[\\\"rag_uploads\\\"]],[[[1,\\\"  \\\"],[11,3],[24,6,\\\"#\\\"],[24,0,\\\"rag-options__indexing-options\\\"],[4,[32,0],[\\\"click\\\",[30,0,[\\\"toggleIndexingOptions\\\"]]],null],[12],[1,[30,0,[\\\"indexingOptionsText\\\"]]],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"showIndexingOptions\\\"]],[[[1,\\\"  \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"rag_chunk_tokens\\\",[28,[32,1],[\\\"discourse_ai.rag.options.rag_chunk_tokens\\\"],null],[28,[32,1],[\\\"discourse_ai.rag.options.rag_chunk_tokens_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,3,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n  \\\"]],[3]]]]],[1,\\\"\\\\n\\\\n  \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"rag_chunk_overlap_tokens\\\",[28,[32,1],[\\\"discourse_ai.rag.options.rag_chunk_tokens\\\"],null],[28,[32,1],[\\\"discourse_ai.rag.options.rag_chunk_overlap_tokens_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[8,[30,4,[\\\"Input\\\"]],[[24,\\\"step\\\",\\\"any\\\"],[24,\\\"lang\\\",\\\"en\\\"]],[[\\\"@type\\\"],[\\\"number\\\"]],null],[1,\\\"\\\\n  \\\"]],[4]]]]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,5],[[[1,\\\"    \\\"],[8,[30,2,[\\\"Field\\\"]],null,[[\\\"@name\\\",\\\"@title\\\",\\\"@tooltip\\\",\\\"@format\\\"],[\\\"rag_llm_model_id\\\",[28,[32,1],[\\\"discourse_ai.rag.options.rag_llm_model\\\"],null],[28,[32,1],[\\\"discourse_ai.rag.options.rag_llm_model_help\\\"],null],\\\"large\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[30,6,[\\\"Custom\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[32,2],null,[[\\\"@value\\\",\\\"@llms\\\",\\\"@onChange\\\",\\\"@class\\\"],[[30,6,[\\\"value\\\"]],[30,0,[\\\"visionLlms\\\"]],[30,6,[\\\"set\\\"]],\\\"ai-persona-editor__llms\\\"]],null],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n    \\\"]],[6]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"],[18,7,null],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@data\\\",\\\"@form\\\",\\\"field\\\",\\\"field\\\",\\\"@allowImages\\\",\\\"field\\\",\\\"&default\\\"],[\\\"if\\\",\\\"yield\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/rag-options-fk.js\",\n        \"scope\": () => [_modifier.on, _discourseI18n.i18n, _aiLlmSelector.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = RagOptionsFk;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/rag-upload-progress\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/service\", \"discourse/helpers/d-icon\", \"discourse/lib/decorators\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _didInsert, _service, _dIcon, _decorators, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class RagUploadProgress extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"messageBus\", [_service.service]);\n    }\n    #messageBus = (dt7948.i(this, \"messageBus\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"updatedProgress\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #updatedProgress = (dt7948.i(this, \"updatedProgress\"), void 0);\n    willDestroy() {\n      super.willDestroy(...arguments);\n      this.messageBus.unsubscribe(`/discourse-ai/rag/${this.args.upload.id}`);\n    }\n    trackProgress() {\n      this.messageBus.subscribe(`/discourse-ai/rag/${this.args.upload.id}`, this.onIndexingUpdate);\n    }\n    static {\n      dt7948.n(this.prototype, \"trackProgress\", [_object.action]);\n    }\n    onIndexingUpdate(data) {\n      // Order not guaranteed. Discard old updates.\n      if (!this.updatedProgress || this.updatedProgress.left === 0 || this.updatedProgress.left > data.left || data.total === data.indexed) {\n        this.updatedProgress = data;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"onIndexingUpdate\", [_decorators.bind]);\n    }\n    get calculateProgress() {\n      if (this.progress.total === 0) {\n        return 0;\n      }\n      return Math.ceil(this.progress.indexed * 100 / this.progress.total);\n    }\n    get fullyIndexed() {\n      return this.progress && this.progress.total !== 0 && this.progress.left === 0;\n    }\n    get progress() {\n      if (this.updatedProgress) {\n        return this.updatedProgress;\n      } else if (this.args.ragIndexingStatuses) {\n        return this.args.ragIndexingStatuses[this.args.upload.id];\n      } else {\n        return [];\n      }\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <td class=\"rag-uploader__upload-status\" {{didInsert this.trackProgress}}>\n        {{#if this.progress}}\n          {{#if this.fullyIndexed}}\n            <span class=\"indexed\">\n              {{icon \"check\"}}\n              {{i18n \"discourse_ai.rag.uploads.indexed\"}}\n            </span>\n          {{else}}\n            <span class=\"indexing\">\n              {{icon \"robot\"}}\n              {{i18n \"discourse_ai.rag.uploads.indexing\"}}\n              {{this.calculateProgress}}%\n            </span>\n          {{/if}}\n        {{else}}\n          <span class=\"uploaded\">{{i18n\n              \"discourse_ai.rag.uploads.uploaded\"\n            }}</span>\n        {{/if}}\n      </td>\n      */\n      {\n        \"id\": \"jn4kfYzg\",\n        \"block\": \"[[[11,\\\"td\\\"],[24,0,\\\"rag-uploader__upload-status\\\"],[4,[32,0],[[30,0,[\\\"trackProgress\\\"]]],null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"progress\\\"]],[[[41,[30,0,[\\\"fullyIndexed\\\"]],[[[1,\\\"      \\\"],[10,1],[14,0,\\\"indexed\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,1],[\\\"check\\\"],null]],[1,\\\"\\\\n        \\\"],[1,[28,[32,2],[\\\"discourse_ai.rag.uploads.indexed\\\"],null]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[10,1],[14,0,\\\"indexing\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,1],[\\\"robot\\\"],null]],[1,\\\"\\\\n        \\\"],[1,[28,[32,2],[\\\"discourse_ai.rag.uploads.indexing\\\"],null]],[1,\\\"\\\\n        \\\"],[1,[30,0,[\\\"calculateProgress\\\"]]],[1,\\\"%\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]]]],[]],[[[1,\\\"    \\\"],[10,1],[14,0,\\\"uploaded\\\"],[12],[1,[28,[32,2],[\\\"discourse_ai.rag.uploads.uploaded\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[13]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/rag-upload-progress.js\",\n        \"scope\": () => [_didInsert.default, _dIcon.default, _discourseI18n.i18n],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = RagUploadProgress;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/rag-uploader\", [\"exports\", \"@glimmer/tracking\", \"@ember/component\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"@ember/owner\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/helpers/d-icon\", \"discourse/lib/ajax\", \"discourse/lib/array-tools\", \"discourse/lib/debounce\", \"discourse/lib/tracked-tools\", \"discourse/lib/uppy/uppy-upload\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/rag-upload-progress\", \"@ember/template-factory\"], function (_exports, _tracking, _component, _helper, _modifier, _object, _owner, _didInsert, _service, _dButton, _dIcon, _ajax, _arrayTools, _debounce, _trackedTools, _uppyUpload, _discourseI18n, _ragUploadProgress, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /* eslint-disable ember/no-classic-components */\n\n  class RagUploader extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"appEvents\", [_service.service]);\n    }\n    #appEvents = (dt7948.i(this, \"appEvents\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"term\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #term = (dt7948.i(this, \"term\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"filteredUploads\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #filteredUploads = (dt7948.i(this, \"filteredUploads\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"ragIndexingStatuses\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #ragIndexingStatuses = (dt7948.i(this, \"ragIndexingStatuses\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"ragUploads\", [_trackedTools.trackedArray], function () {\n        return null;\n      });\n    }\n    #ragUploads = (dt7948.i(this, \"ragUploads\"), void 0);\n    uppyUpload = new _uppyUpload.default((0, _owner.getOwner)(this), {\n      id: \"discourse-ai-rag-uploader\",\n      maxFiles: 20,\n      type: \"discourse_ai_rag_upload\",\n      uploadUrl: \"/admin/plugins/discourse-ai/rag-document-fragments/files/upload\",\n      preventDirectS3Uploads: true,\n      uploadDone: uploadedFile => {\n        const newUpload = uploadedFile.upload;\n        newUpload.status = \"uploaded\";\n        newUpload.statusText = (0, _discourseI18n.i18n)(\"discourse_ai.rag.uploads.uploaded\");\n        this.ragUploads.push(newUpload);\n        this.debouncedSearch();\n      }\n    });\n    willDestroy() {\n      super.willDestroy(...arguments);\n      this.appEvents.off(`upload-mixin:${this.uppyUpload.config}:all-uploads-complete`, this, \"_updateTargetWithUploads\");\n    }\n    didReceiveAttrs() {\n      super.didReceiveAttrs(...arguments);\n      if (this.uppyUpload.inProgressUploads?.length > 0) {\n        this.uppyUpload.cancelAllUploads();\n      }\n      this.ragUploads = this.target?.rag_uploads?.slice() || [];\n      this.filteredUploads = this.ragUploads;\n      const targetName = this.targetName || this.target?.constructor?.name;\n      if (this.ragUploads?.length && this.target?.id) {\n        (0, _ajax.ajax)(`/admin/plugins/discourse-ai/rag-document-fragments/files/status.json?target_type=${targetName}&target_id=${this.target.id}`).then(statuses => {\n          this.set(\"ragIndexingStatuses\", statuses);\n        });\n      }\n      this.appEvents.on(`upload-mixin:${this.uppyUpload.config.id}:all-uploads-complete`, this, \"_updateTargetWithUploads\");\n    }\n    _updateTargetWithUploads() {\n      this.updateUploads(this.ragUploads);\n    }\n    get acceptedFileTypes() {\n      if (this.args?.allowImages) {\n        return \".txt,.md,.png,.jpg,.jpeg\";\n      } else {\n        return \".txt,.md,.pdf\";\n      }\n    }\n    submitFiles() {\n      this.uppyUpload.openPicker();\n    }\n    static {\n      dt7948.n(this.prototype, \"submitFiles\", [_object.action]);\n    }\n    cancelUploading(upload) {\n      this.uppyUpload.cancelSingleUpload({\n        fileId: upload.id\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"cancelUploading\", [_object.action]);\n    }\n    search() {\n      if (this.term) {\n        this.filteredUploads = this.ragUploads.filter(u => {\n          return u.original_filename.toUpperCase().indexOf(this.term.toUpperCase()) > -1;\n        });\n      } else {\n        this.filteredUploads = this.ragUploads;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"search\", [_object.action]);\n    }\n    debouncedSearch() {\n      (0, _debounce.default)(this, this.search, 100);\n    }\n    static {\n      dt7948.n(this.prototype, \"debouncedSearch\", [_object.action]);\n    }\n    removeUpload(upload) {\n      (0, _arrayTools.removeValueFromArray)(this.ragUploads, upload);\n      this.onRemove(upload);\n      this.debouncedSearch();\n    }\n    static {\n      dt7948.n(this.prototype, \"removeUpload\", [_object.action]);\n    }\n    static {\n      (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"rag-uploader\">\n        {{#if @allowImages}}\n          <p>{{i18n \"discourse_ai.rag.uploads.description_with_images\"}}</p>\n        {{else}}\n          <p>{{i18n \"discourse_ai.rag.uploads.description\"}}</p>\n        {{/if}}\n      \n        {{#if this.ragUploads}}\n          <div class=\"rag-uploader__search-input-container\">\n            <div class=\"rag-uploader__search-input\">\n              {{icon\n                \"magnifying-glass\"\n                class=\"rag-uploader__search-input__search-icon\"\n              }}\n              <Input\n                class=\"rag-uploader__search-input__input\"\n                placeholder={{i18n \"discourse_ai.rag.uploads.filter\"}}\n                @value={{this.term}}\n                {{on \"keyup\" this.debouncedSearch}}\n              />\n            </div>\n          </div>\n        {{/if}}\n      \n        <table class=\"rag-uploader__uploads-list\">\n          <tbody>\n            {{#each this.filteredUploads as |upload|}}\n              <tr>\n                <td>\n                  <span class=\"rag-uploader__rag-file-icon\">{{icon \"file\"}}</span>\n                  {{upload.original_filename}}\n                </td>\n                <RagUploadProgress\n                  @upload={{upload}}\n                  @ragIndexingStatuses={{this.ragIndexingStatuses}}\n                />\n                <td class=\"rag-uploader__remove-file\">\n                  <DButton\n                    @icon=\"xmark\"\n                    @title=\"discourse_ai.rag.uploads.remove\"\n                    @action={{fn this.removeUpload upload}}\n                    class=\"btn-flat\"\n                  />\n                </td>\n              </tr>\n            {{/each}}\n            {{#each this.uppyUpload.inProgressUploads as |upload|}}\n              <tr>\n                <td><span class=\"rag-uploader__rag-file-icon\">{{icon\n                      \"file\"\n                    }}</span>\n                  {{upload.original_filename}}</td>\n                <td class=\"rag-uploader__upload-status\">\n                  <div class=\"spinner small\"></div>\n                  <span>{{i18n \"discourse_ai.rag.uploads.uploading\"}}\n                    {{upload.uploadProgress}}%</span>\n                </td>\n                <td class=\"rag-uploader__remove-file\">\n                  <DButton\n                    @icon=\"xmark\"\n                    @title=\"discourse_ai.rag.uploads.remove\"\n                    @action={{fn this.cancelUploading upload}}\n                    class=\"btn-flat\"\n                  />\n                </td>\n              </tr>\n            {{/each}}\n          </tbody>\n        </table>\n      \n        <input\n          {{didInsert this.uppyUpload.setup}}\n          class=\"hidden-upload-field\"\n          disabled={{this.uploading}}\n          type=\"file\"\n          multiple=\"multiple\"\n          accept={{this.acceptedFileTypes}}\n        />\n        <DButton\n          @label=\"discourse_ai.rag.uploads.button\"\n          @icon=\"plus\"\n          @title=\"discourse_ai.rag.uploads.button\"\n          @action={{this.submitFiles}}\n          class=\"btn-default\"\n        />\n      </div>\n      */\n      {\n        \"id\": \"uibFy2+r\",\n        \"block\": \"[[[10,0],[14,0,\\\"rag-uploader\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1],[[[1,\\\"    \\\"],[10,2],[12],[1,[28,[32,0],[\\\"discourse_ai.rag.uploads.description_with_images\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"    \\\"],[10,2],[12],[1,[28,[32,0],[\\\"discourse_ai.rag.uploads.description\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"ragUploads\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"rag-uploader__search-input-container\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"rag-uploader__search-input\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,1],[\\\"magnifying-glass\\\"],[[\\\"class\\\"],[\\\"rag-uploader__search-input__search-icon\\\"]]]],[1,\\\"\\\\n        \\\"],[8,[32,2],[[24,0,\\\"rag-uploader__search-input__input\\\"],[16,\\\"placeholder\\\",[28,[32,0],[\\\"discourse_ai.rag.uploads.filter\\\"],null]],[4,[32,3],[\\\"keyup\\\",[30,0,[\\\"debouncedSearch\\\"]]],null]],[[\\\"@value\\\"],[[30,0,[\\\"term\\\"]]]],null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n  \\\"],[10,\\\"table\\\"],[14,0,\\\"rag-uploader__uploads-list\\\"],[12],[1,\\\"\\\\n    \\\"],[10,\\\"tbody\\\"],[12],[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"filteredUploads\\\"]]],null]],null],null,[[[1,\\\"        \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"td\\\"],[12],[1,\\\"\\\\n            \\\"],[10,1],[14,0,\\\"rag-uploader__rag-file-icon\\\"],[12],[1,[28,[32,1],[\\\"file\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[1,[30,2,[\\\"original_filename\\\"]]],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[8,[32,4],null,[[\\\"@upload\\\",\\\"@ragIndexingStatuses\\\"],[[30,2],[30,0,[\\\"ragIndexingStatuses\\\"]]]],null],[1,\\\"\\\\n          \\\"],[10,\\\"td\\\"],[14,0,\\\"rag-uploader__remove-file\\\"],[12],[1,\\\"\\\\n            \\\"],[8,[32,5],[[24,0,\\\"btn-flat\\\"]],[[\\\"@icon\\\",\\\"@title\\\",\\\"@action\\\"],[\\\"xmark\\\",\\\"discourse_ai.rag.uploads.remove\\\",[28,[32,6],[[30,0,[\\\"removeUpload\\\"]],[30,2]],null]]],null],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[2]],null],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"uppyUpload\\\",\\\"inProgressUploads\\\"]]],null]],null],null,[[[1,\\\"        \\\"],[10,\\\"tr\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"td\\\"],[12],[10,1],[14,0,\\\"rag-uploader__rag-file-icon\\\"],[12],[1,[28,[32,1],[\\\"file\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[1,[30,3,[\\\"original_filename\\\"]]],[13],[1,\\\"\\\\n          \\\"],[10,\\\"td\\\"],[14,0,\\\"rag-uploader__upload-status\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"spinner small\\\"],[12],[13],[1,\\\"\\\\n            \\\"],[10,1],[12],[1,[28,[32,0],[\\\"discourse_ai.rag.uploads.uploading\\\"],null]],[1,\\\"\\\\n              \\\"],[1,[30,3,[\\\"uploadProgress\\\"]]],[1,\\\"%\\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n          \\\"],[10,\\\"td\\\"],[14,0,\\\"rag-uploader__remove-file\\\"],[12],[1,\\\"\\\\n            \\\"],[8,[32,5],[[24,0,\\\"btn-flat\\\"]],[[\\\"@icon\\\",\\\"@title\\\",\\\"@action\\\"],[\\\"xmark\\\",\\\"discourse_ai.rag.uploads.remove\\\",[28,[32,6],[[30,0,[\\\"cancelUploading\\\"]],[30,3]],null]]],null],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[3]],null],[1,\\\"    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[11,\\\"input\\\"],[24,0,\\\"hidden-upload-field\\\"],[16,\\\"disabled\\\",[30,0,[\\\"uploading\\\"]]],[24,\\\"multiple\\\",\\\"multiple\\\"],[16,\\\"accept\\\",[30,0,[\\\"acceptedFileTypes\\\"]]],[24,4,\\\"file\\\"],[4,[32,7],[[30,0,[\\\"uppyUpload\\\",\\\"setup\\\"]]],null],[12],[13],[1,\\\"\\\\n  \\\"],[8,[32,5],[[24,0,\\\"btn-default\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@title\\\",\\\"@action\\\"],[\\\"discourse_ai.rag.uploads.button\\\",\\\"plus\\\",\\\"discourse_ai.rag.uploads.button\\\",[30,0,[\\\"submitFiles\\\"]]]],null],[1,\\\"\\\\n\\\"],[13]],[\\\"@allowImages\\\",\\\"upload\\\",\\\"upload\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/rag-uploader.js\",\n        \"scope\": () => [_discourseI18n.i18n, _dIcon.default, _component.Input, _modifier.on, _ragUploadProgress.default, _dButton.default, _helper.fn, _didInsert.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = RagUploader;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/reviewable-ai-chat-message\", [\"exports\", \"@glimmer/component\", \"@ember/helper\", \"@ember/routing\", \"@ember/template\", \"discourse/components/reviewable-created-by\", \"discourse/components/reviewable-post-header\", \"discourse/truth-helpers\", \"discourse/plugins/chat/discourse/components/chat-channel-title\", \"discourse/plugins/chat/discourse/models/chat-channel\", \"discourse/plugins/discourse-ai/discourse/components/model-accuracies\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _helper, _routing, _template, _reviewableCreatedBy, _reviewablePostHeader, _truthHelpers, _chatChannelTitle, _chatChannel, _modelAccuracies, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class ReviewableAiChatMessage extends _component.default {\n    get chatChannel() {\n      if (!this.args.reviewable.chat_channel) {\n        return;\n      }\n      return _chatChannel.default.create(this.args.reviewable.chat_channel);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.chatChannel}}\n        <div class=\"flagged-post-header\">\n          <LinkTo\n            @route=\"chat.channel.near-message\"\n            @models={{array\n              this.chatChannel.slugifiedTitle\n              this.chatChannel.id\n              @reviewable.target_id\n            }}\n          >\n            <ChatChannelTitle @channel={{this.chatChannel}} />\n          </LinkTo>\n        </div>\n      {{/if}}\n      \n      <div class=\"post-contents-wrapper\">\n        <ReviewableCreatedBy\n          @user={{@reviewable.target_created_by}}\n          @tagName=\"\"\n        />\n        <div class=\"post-contents\">\n          <ReviewablePostHeader\n            @reviewable={{@reviewable}}\n            @createdBy={{@reviewable.target_created_by}}\n            @tagName=\"\"\n          />\n      \n          <div class=\"post-body\">\n            {{htmlSafe\n              (or @reviewable.payload.message_cooked @reviewable.cooked)\n            }}\n          </div>\n      \n          {{yield}}\n      \n          <ModelAccuracies @accuracies={{@reviewable.payload.accuracies}} />\n        </div>\n      </div>\n      */\n      {\n        \"id\": \"BPi31M7d\",\n        \"block\": \"[[[41,[30,0,[\\\"chatChannel\\\"]],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"flagged-post-header\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,0],null,[[\\\"@route\\\",\\\"@models\\\"],[\\\"chat.channel.near-message\\\",[28,[32,1],[[30,0,[\\\"chatChannel\\\",\\\"slugifiedTitle\\\"]],[30,0,[\\\"chatChannel\\\",\\\"id\\\"]],[30,1,[\\\"target_id\\\"]]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[32,2],null,[[\\\"@channel\\\"],[[30,0,[\\\"chatChannel\\\"]]]],null],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n\\\"],[10,0],[14,0,\\\"post-contents-wrapper\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,3],null,[[\\\"@user\\\",\\\"@tagName\\\"],[[30,1,[\\\"target_created_by\\\"]],\\\"\\\"]],null],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"post-contents\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,4],null,[[\\\"@reviewable\\\",\\\"@createdBy\\\",\\\"@tagName\\\"],[[30,1],[30,1,[\\\"target_created_by\\\"]],\\\"\\\"]],null],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"post-body\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[32,5],[[28,[32,6],[[30,1,[\\\"payload\\\",\\\"message_cooked\\\"]],[30,1,[\\\"cooked\\\"]]],null]],null]],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[18,2,null],[1,\\\"\\\\n\\\\n    \\\"],[8,[32,7],null,[[\\\"@accuracies\\\"],[[30,1,[\\\"payload\\\",\\\"accuracies\\\"]]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@reviewable\\\",\\\"&default\\\"],[\\\"if\\\",\\\"yield\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/reviewable-ai-chat-message.js\",\n        \"scope\": () => [_routing.LinkTo, _helper.array, _chatChannelTitle.default, _reviewableCreatedBy.default, _reviewablePostHeader.default, _template.htmlSafe, _truthHelpers.or, _modelAccuracies.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = ReviewableAiChatMessage;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/reviewable-ai-post\", [\"exports\", \"@ember/template\", \"discourse/components/reviewable-created-by\", \"discourse/components/reviewable-post-edits\", \"discourse/components/reviewable-post-header\", \"discourse/components/reviewable-topic-link\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/model-accuracies\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _template, _reviewableCreatedBy, _reviewablePostEdits, _reviewablePostHeader, _reviewableTopicLink, _discourseI18n, _modelAccuracies, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const ReviewableAiPost = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"flagged-post-header\">\n    <ReviewableTopicLink @reviewable={{@reviewable}} @tagName=\"\" />\n    <ReviewablePostEdits @reviewable={{@reviewable}} @tagName=\"\" />\n  </div>\n  \n  <div class=\"post-contents-wrapper\">\n    <ReviewableCreatedBy @user={{@reviewable.target_created_by}} @tagName=\"\" />\n    <div class=\"post-contents\">\n      <ReviewablePostHeader\n        @reviewable={{@reviewable}}\n        @createdBy={{@reviewable.target_created_by}}\n        @tagName=\"\"\n      />\n      <div class=\"post-body\">\n        {{#if @reviewable.blank_post}}\n          <p>{{i18n \"review.deleted_post\"}}</p>\n        {{else}}\n          {{htmlSafe @reviewable.cooked}}\n        {{/if}}\n      </div>\n  \n      {{yield}}\n  \n      <ModelAccuracies @accuracies={{@reviewable.payload.accuracies}} />\n    </div>\n  </div>\n  */\n  {\n    \"id\": \"mwhdAutd\",\n    \"block\": \"[[[10,0],[14,0,\\\"flagged-post-header\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],null,[[\\\"@reviewable\\\",\\\"@tagName\\\"],[[30,1],\\\"\\\"]],null],[1,\\\"\\\\n  \\\"],[8,[32,1],null,[[\\\"@reviewable\\\",\\\"@tagName\\\"],[[30,1],\\\"\\\"]],null],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"post-contents-wrapper\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,2],null,[[\\\"@user\\\",\\\"@tagName\\\"],[[30,1,[\\\"target_created_by\\\"]],\\\"\\\"]],null],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"post-contents\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,3],null,[[\\\"@reviewable\\\",\\\"@createdBy\\\",\\\"@tagName\\\"],[[30,1],[30,1,[\\\"target_created_by\\\"]],\\\"\\\"]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"post-body\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,1,[\\\"blank_post\\\"]],[[[1,\\\"        \\\"],[10,2],[12],[1,[28,[32,4],[\\\"review.deleted_post\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"        \\\"],[1,[28,[32,5],[[30,1,[\\\"cooked\\\"]]],null]],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"    \\\"],[13],[1,\\\"\\\\n\\\\n    \\\"],[18,2,null],[1,\\\"\\\\n\\\\n    \\\"],[8,[32,6],null,[[\\\"@accuracies\\\"],[[30,1,[\\\"payload\\\",\\\"accuracies\\\"]]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@reviewable\\\",\\\"&default\\\"],[\\\"if\\\",\\\"yield\\\"]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/reviewable-ai-post.js\",\n    \"scope\": () => [_reviewableTopicLink.default, _reviewablePostEdits.default, _reviewableCreatedBy.default, _reviewablePostHeader.default, _discourseI18n.i18n, _template.htmlSafe, _modelAccuracies.default],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"reviewable-ai-post:ReviewableAiPost\"));\n  var _default = _exports.default = ReviewableAiPost;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/reviewable-refresh/ai-chat-message\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/routing\", \"discourse/components/reviewable-refresh/created-by\", \"discourse/components/reviewable-refresh/topic-link\", \"discourse/lib/highlight-watched-words\", \"discourse-i18n\", \"discourse/plugins/chat/discourse/components/channel-title\", \"discourse/plugins/chat/discourse/models/chat-channel\", \"discourse/plugins/discourse-ai/discourse/components/model-accuracies\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _routing, _createdBy, _topicLink, _highlightWatchedWords, _discourseI18n, _channelTitle, _chatChannel, _modelAccuracies, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class ReviewableRefreshAiChatMessage extends _component.default {\n    get channel() {\n      if (!this.args.reviewable.chat_channel) {\n        return;\n      }\n      return _chatChannel.default.create(this.args.reviewable.chat_channel);\n    }\n    static {\n      dt7948.n(this.prototype, \"channel\", [_tracking.cached]);\n    }\n    get messageCooked() {\n      return this.args.reviewable.payload?.message_cooked || this.args.reviewable.cooked;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"review-item__meta-content\">\n        <div class=\"review-item__meta-label\">{{i18n\n            \"chat.reviewable.message_in_channel\"\n          }}</div>\n      \n        <div class=\"review-item__meta-topic-title\">\n          {{#if this.channel}}\n            <LinkTo\n              @route=\"chat.channel.near-message\"\n              @models={{array\n                this.channel.slugifiedTitle\n                this.channel.id\n                @reviewable.target_id\n              }}\n            >\n              <ChannelTitle @channel={{this.channel}} />\n            </LinkTo>\n          {{else}}\n            <ReviewableTopicLink @reviewable={{@reviewable}} @tagName=\"\" />\n          {{/if}}\n        </div>\n      \n        <div class=\"review-item__meta-label\">{{i18n \"review.review_user\"}}</div>\n      \n        <div class=\"review-item__meta-flagged-user\">\n          <ReviewableCreatedBy @user={{@reviewable.target_created_by}} />\n        </div>\n      </div>\n      \n      <div class=\"review-item__post\">\n        <div class=\"review-item__post-content-wrapper\">\n          <div class=\"review-item__post-content\">\n            {{highlightWatchedWords this.messageCooked @reviewable}}\n      \n            {{#if @reviewable.payload.transcript_topic_id}}\n              <div class=\"transcript\">\n                <LinkTo\n                  @route=\"topic\"\n                  @models={{array \"-\" @reviewable.payload.transcript_topic_id}}\n                  class=\"btn btn-default btn-small\"\n                >\n                  {{i18n \"review.transcript.view\"}}\n                </LinkTo>\n              </div>\n            {{/if}}\n      \n            <ModelAccuracies @accuracies={{@reviewable.payload.accuracies}} />\n      \n            {{yield}}\n          </div>\n        </div>\n      </div>\n      */\n      {\n        \"id\": \"sDFs/Kr6\",\n        \"block\": \"[[[10,0],[14,0,\\\"review-item__meta-content\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"review-item__meta-label\\\"],[12],[1,[28,[32,0],[\\\"chat.reviewable.message_in_channel\\\"],null]],[13],[1,\\\"\\\\n\\\\n  \\\"],[10,0],[14,0,\\\"review-item__meta-topic-title\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"channel\\\"]],[[[1,\\\"      \\\"],[8,[32,1],null,[[\\\"@route\\\",\\\"@models\\\"],[\\\"chat.channel.near-message\\\",[28,[32,2],[[30,0,[\\\"channel\\\",\\\"slugifiedTitle\\\"]],[30,0,[\\\"channel\\\",\\\"id\\\"]],[30,1,[\\\"target_id\\\"]]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n        \\\"],[8,[32,3],null,[[\\\"@channel\\\"],[[30,0,[\\\"channel\\\"]]]],null],[1,\\\"\\\\n      \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],[[[1,\\\"      \\\"],[8,[32,4],null,[[\\\"@reviewable\\\",\\\"@tagName\\\"],[[30,1],\\\"\\\"]],null],[1,\\\"\\\\n\\\"]],[]]],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[10,0],[14,0,\\\"review-item__meta-label\\\"],[12],[1,[28,[32,0],[\\\"review.review_user\\\"],null]],[13],[1,\\\"\\\\n\\\\n  \\\"],[10,0],[14,0,\\\"review-item__meta-flagged-user\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,5],null,[[\\\"@user\\\"],[[30,1,[\\\"target_created_by\\\"]]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"review-item__post\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"review-item__post-content-wrapper\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"review-item__post-content\\\"],[12],[1,\\\"\\\\n      \\\"],[1,[28,[32,6],[[30,0,[\\\"messageCooked\\\"]],[30,1]],null]],[1,\\\"\\\\n\\\\n\\\"],[41,[30,1,[\\\"payload\\\",\\\"transcript_topic_id\\\"]],[[[1,\\\"        \\\"],[10,0],[14,0,\\\"transcript\\\"],[12],[1,\\\"\\\\n          \\\"],[8,[32,1],[[24,0,\\\"btn btn-default btn-small\\\"]],[[\\\"@route\\\",\\\"@models\\\"],[\\\"topic\\\",[28,[32,2],[\\\"-\\\",[30,1,[\\\"payload\\\",\\\"transcript_topic_id\\\"]]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n            \\\"],[1,[28,[32,0],[\\\"review.transcript.view\\\"],null]],[1,\\\"\\\\n          \\\"]],[]]]]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n      \\\"],[8,[32,7],null,[[\\\"@accuracies\\\"],[[30,1,[\\\"payload\\\",\\\"accuracies\\\"]]]],null],[1,\\\"\\\\n\\\\n      \\\"],[18,2,null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@reviewable\\\",\\\"&default\\\"],[\\\"if\\\",\\\"yield\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/reviewable-refresh/ai-chat-message.js\",\n        \"scope\": () => [_discourseI18n.i18n, _routing.LinkTo, _helper.array, _channelTitle.default, _topicLink.default, _createdBy.default, _highlightWatchedWords.default, _modelAccuracies.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = ReviewableRefreshAiChatMessage;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/reviewable-refresh/ai-post\", [\"exports\", \"discourse/components/reviewable-refresh/post\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/model-accuracies\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _post, _discourseI18n, _modelAccuracies, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <ReviewablePost\n    @reviewable={{@reviewable}}\n    @userLabel={{i18n \"review.flagged_user\"}}\n    @pluginOutletName=\"after-reviewable-ai-post-body\"\n  >\n    <ModelAccuracies @accuracies={{@reviewable.payload.accuracies}} />\n  </ReviewablePost>\n  */\n  {\n    \"id\": \"n8PGo6bS\",\n    \"block\": \"[[[8,[32,0],null,[[\\\"@reviewable\\\",\\\"@userLabel\\\",\\\"@pluginOutletName\\\"],[[30,1],[28,[32,1],[\\\"review.flagged_user\\\"],null],\\\"after-reviewable-ai-post-body\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[32,2],null,[[\\\"@accuracies\\\"],[[30,1,[\\\"payload\\\",\\\"accuracies\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]]]]]],[\\\"@reviewable\\\"],[]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/reviewable-refresh/ai-post.js\",\n    \"scope\": () => [_post.default, _discourseI18n.i18n, _modelAccuracies.default],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"ai-post\"));\n});","define(\"discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-category-suggester\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/components/dropdown-menu\", \"discourse/float-kit/components/d-menu\", \"discourse/helpers/category-badge\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/ai-helper-suggestions\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _service, _dButton, _dropdownMenu, _dMenu, _categoryBadge, _ajax, _ajaxError, _discourseI18n, _aiHelperSuggestions, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiCategorySuggester extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"suggestions\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #suggestions = (dt7948.i(this, \"suggestions\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"untriggers\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #untriggers = (dt7948.i(this, \"untriggers\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"triggerIcon\", [_tracking.tracked], function () {\n        return \"discourse-sparkles\";\n      });\n    }\n    #triggerIcon = (dt7948.i(this, \"triggerIcon\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"content\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #content = (dt7948.i(this, \"content\"), void 0);\n    get showSuggestionButton() {\n      const composerFields = document.querySelector(\".composer-fields\");\n      this.content = this.args.composer?.reply;\n      const showTrigger = this.content?.length > _aiHelperSuggestions.MIN_CHARACTER_COUNT || this.args.topicState === \"edit\";\n      if (composerFields) {\n        if (showTrigger) {\n          composerFields.classList.add(\"showing-ai-suggestions\");\n        } else {\n          composerFields.classList.remove(\"showing-ai-suggestions\");\n        }\n      }\n      return this.siteSettings.ai_embeddings_enabled && showTrigger;\n    }\n    get showDropdown() {\n      if (this.suggestions?.length <= 0) {\n        this.dMenu.close();\n      }\n      return !this.loading && this.suggestions?.length > 0;\n    }\n    async loadSuggestions() {\n      if (this.suggestions && this.suggestions?.length > 0 && !this.dMenu.expanded) {\n        return this.suggestions;\n      }\n      this.loading = true;\n      this.triggerIcon = \"spinner\";\n      const data = {};\n      if (this.content) {\n        data.text = this.content;\n      } else {\n        data.topic_id = this.args.buffered.content.id;\n      }\n      try {\n        const {\n          assistant\n        } = await (0, _ajax.ajax)(\"/discourse-ai/ai-helper/suggest_category\", {\n          method: \"POST\",\n          data\n        });\n        this.suggestions = assistant;\n        if (this.suggestions?.length <= 0) {\n          (0, _aiHelperSuggestions.showSuggestionsError)(this, this.loadSuggestions.bind(this));\n          return;\n        }\n      } catch (error) {\n        (0, _ajaxError.popupAjaxError)(error);\n      } finally {\n        this.loading = false;\n        this.triggerIcon = \"rotate\";\n      }\n      return this.suggestions;\n    }\n    static {\n      dt7948.n(this.prototype, \"loadSuggestions\", [_object.action]);\n    }\n    applySuggestion(suggestion) {\n      const composer = this.args.composer;\n      const buffered = this.args.buffered;\n      if (composer) {\n        composer.set(\"categoryId\", suggestion.id);\n        composer.get(\"categoryId\");\n      }\n      if (buffered) {\n        this.args.buffered.set(\"category_id\", suggestion.id);\n      }\n      return this.dMenu.close();\n    }\n    static {\n      dt7948.n(this.prototype, \"applySuggestion\", [_object.action]);\n    }\n    onRegisterApi(api) {\n      this.dMenu = api;\n    }\n    static {\n      dt7948.n(this.prototype, \"onRegisterApi\", [_object.action]);\n    }\n    onClose() {\n      if (this.suggestions?.length > 0) {\n        // If all suggestions have been used,\n        // re-triggering when no suggestions present\n        // will cause computation issues with\n        // setting the icon, so we prevent it\n        this.triggerIcon = \"discourse-sparkles\";\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"onClose\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.showSuggestionButton}}\n        <DMenu\n          @title={{i18n \"discourse_ai.ai_helper.suggest\"}}\n          @icon={{this.triggerIcon}}\n          @identifier=\"ai-category-suggester\"\n          @onClose={{this.onClose}}\n          @triggerClass=\"btn-transparent suggestion-button suggest-category-button {{if\n            this.loading\n            'is-loading'\n          }}\"\n          @contentClass=\"ai-suggestions-menu\"\n          @onRegisterApi={{this.onRegisterApi}}\n          @modalForMobile={{true}}\n          @untriggers={{this.untriggers}}\n          {{on \"click\" this.loadSuggestions}}\n        >\n          <:content>\n            {{#if this.showDropdown}}\n              <DropdownMenu as |dropdown|>\n                {{#each this.suggestions as |suggestion index|}}\n                  <dropdown.item>\n                    <DButton\n                      class=\"category-row\"\n                      data-name={{suggestion.name}}\n                      data-value={{index}}\n                      title={{suggestion.name}}\n                      @action={{fn this.applySuggestion suggestion}}\n                    >\n                      <div class=\"category-status\">\n                        {{categoryBadge suggestion}}\n                        <span class=\"topic-count\">x\n                          {{suggestion.topicCount}}</span>\n                      </div>\n                    </DButton>\n                  </dropdown.item>\n                {{/each}}\n              </DropdownMenu>\n            {{/if}}\n          </:content>\n        </DMenu>\n      {{/if}}\n      */\n      {\n        \"id\": \"yLzINjUf\",\n        \"block\": \"[[[41,[30,0,[\\\"showSuggestionButton\\\"]],[[[1,\\\"  \\\"],[8,[32,0],[[4,[32,2],[\\\"click\\\",[30,0,[\\\"loadSuggestions\\\"]]],null]],[[\\\"@title\\\",\\\"@icon\\\",\\\"@identifier\\\",\\\"@onClose\\\",\\\"@triggerClass\\\",\\\"@contentClass\\\",\\\"@onRegisterApi\\\",\\\"@modalForMobile\\\",\\\"@untriggers\\\"],[[28,[32,1],[\\\"discourse_ai.ai_helper.suggest\\\"],null],[30,0,[\\\"triggerIcon\\\"]],\\\"ai-category-suggester\\\",[30,0,[\\\"onClose\\\"]],[29,[\\\"btn-transparent suggestion-button suggest-category-button \\\",[52,[30,0,[\\\"loading\\\"]],\\\"is-loading\\\"]]],\\\"ai-suggestions-menu\\\",[30,0,[\\\"onRegisterApi\\\"]],true,[30,0,[\\\"untriggers\\\"]]]],[[\\\"content\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"showDropdown\\\"]],[[[1,\\\"        \\\"],[8,[32,3],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"suggestions\\\"]]],null]],null],null,[[[1,\\\"            \\\"],[8,[30,1,[\\\"item\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n              \\\"],[8,[32,4],[[24,0,\\\"category-row\\\"],[16,\\\"data-name\\\",[30,2,[\\\"name\\\"]]],[16,\\\"data-value\\\",[30,3]],[16,\\\"title\\\",[30,2,[\\\"name\\\"]]]],[[\\\"@action\\\"],[[28,[32,5],[[30,0,[\\\"applySuggestion\\\"]],[30,2]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                \\\"],[10,0],[14,0,\\\"category-status\\\"],[12],[1,\\\"\\\\n                  \\\"],[1,[28,[32,6],[[30,2]],null]],[1,\\\"\\\\n                  \\\"],[10,1],[14,0,\\\"topic-count\\\"],[12],[1,\\\"x\\\\n                    \\\"],[1,[30,2,[\\\"topicCount\\\"]]],[13],[1,\\\"\\\\n                \\\"],[13],[1,\\\"\\\\n              \\\"]],[]]]]],[1,\\\"\\\\n            \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[2,3]],null],[1,\\\"        \\\"]],[1]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"dropdown\\\",\\\"suggestion\\\",\\\"index\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-category-suggester.js\",\n        \"scope\": () => [_dMenu.default, _discourseI18n.i18n, _modifier.on, _dropdownMenu.default, _dButton.default, _helper.fn, _categoryBadge.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiCategorySuggester;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-tag-suggester\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/components/dropdown-menu\", \"discourse/float-kit/components/d-menu\", \"discourse/helpers/discourse-tag\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/ai-helper-suggestions\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _service, _dButton, _dropdownMenu, _dMenu, _discourseTag, _ajax, _ajaxError, _discourseI18n, _aiHelperSuggestions, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTagSuggester extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"toasts\", [_service.service]);\n    }\n    #toasts = (dt7948.i(this, \"toasts\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"composer\", [_service.service]);\n    }\n    #composer = (dt7948.i(this, \"composer\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"suggestions\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #suggestions = (dt7948.i(this, \"suggestions\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"untriggers\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #untriggers = (dt7948.i(this, \"untriggers\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"triggerIcon\", [_tracking.tracked], function () {\n        return \"discourse-sparkles\";\n      });\n    }\n    #triggerIcon = (dt7948.i(this, \"triggerIcon\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"content\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #content = (dt7948.i(this, \"content\"), void 0);\n    get showSuggestionButton() {\n      if (this.composer.disableTagsChooser) {\n        return false;\n      }\n      const composerFields = document.querySelector(\".composer-fields\");\n      this.content = this.args.composer?.reply;\n      const showTrigger = this.content?.length > _aiHelperSuggestions.MIN_CHARACTER_COUNT || this.args.topicState === \"edit\";\n      if (composerFields) {\n        if (showTrigger) {\n          composerFields.classList.add(\"showing-ai-suggestions\");\n        } else {\n          composerFields.classList.remove(\"showing-ai-suggestions\");\n        }\n      }\n      return this.siteSettings.ai_embeddings_enabled && showTrigger;\n    }\n    get showDropdown() {\n      if (this.suggestions?.length <= 0) {\n        this.dMenu.close();\n      }\n      return !this.loading && this.suggestions?.length > 0;\n    }\n    async loadSuggestions() {\n      if (this.suggestions && this.suggestions?.length > 0 && !this.dMenu.expanded) {\n        return this.suggestions;\n      }\n      this.loading = true;\n      this.triggerIcon = \"spinner\";\n      const data = {};\n      if (this.content) {\n        data.text = this.content;\n      } else {\n        data.topic_id = this.args.buffered.content.id;\n      }\n      try {\n        const {\n          assistant\n        } = await (0, _ajax.ajax)(\"/discourse-ai/ai-helper/suggest_tags\", {\n          method: \"POST\",\n          data\n        });\n        this.suggestions = assistant;\n        const model = this.args.composer ? this.args.composer : this.args.buffered;\n        if (this.#tagSelectorHasValues()) {\n          this.suggestions = this.suggestions.filter(s => !model.get(\"tags\").includes(s.name));\n        }\n        if (this.suggestions?.length <= 0) {\n          (0, _aiHelperSuggestions.showSuggestionsError)(this, this.loadSuggestions.bind(this));\n          return;\n        }\n      } catch (error) {\n        (0, _ajaxError.popupAjaxError)(error);\n      } finally {\n        this.loading = false;\n        this.triggerIcon = \"rotate\";\n      }\n      return this.suggestions;\n    }\n    static {\n      dt7948.n(this.prototype, \"loadSuggestions\", [_object.action]);\n    }\n    #tagSelectorHasValues() {\n      const model = this.args.composer ? this.args.composer : this.args.buffered;\n      return model.get(\"tags\") && model.get(\"tags\").length > 0;\n    }\n    #removedAppliedTag(suggestion) {\n      return this.suggestions = this.suggestions.filter(s => s.id !== suggestion.id);\n    }\n    applySuggestion(suggestion) {\n      const maxTags = this.siteSettings.max_tags_per_topic;\n      const model = this.args.composer ? this.args.composer : this.args.buffered;\n      if (!model) {\n        return;\n      }\n      const tags = model.get(\"tags\");\n      if (!tags) {\n        model.set(\"tags\", [suggestion.name]);\n        this.#removedAppliedTag(suggestion);\n        return;\n      }\n      if (tags?.length >= maxTags) {\n        return this.toasts.error({\n          class: \"ai-suggestion-error\",\n          duration: \"short\",\n          data: {\n            message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.suggest_errors.too_many_tags\", {\n              count: maxTags\n            })\n          }\n        });\n      }\n      tags.push(suggestion.name);\n      model.set(\"tags\", [...tags]);\n      suggestion.disabled = true;\n      this.#removedAppliedTag(suggestion);\n    }\n    static {\n      dt7948.n(this.prototype, \"applySuggestion\", [_object.action]);\n    }\n    onRegisterApi(api) {\n      this.dMenu = api;\n    }\n    static {\n      dt7948.n(this.prototype, \"onRegisterApi\", [_object.action]);\n    }\n    onClose() {\n      if (this.suggestions?.length > 0) {\n        // If all suggestions have been used,\n        // re-triggering when no suggestions present\n        // will cause computation issues with\n        // setting the icon, so we prevent it\n        this.triggerIcon = \"discourse-sparkles\";\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"onClose\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.showSuggestionButton}}\n        <DMenu\n          @title={{i18n \"discourse_ai.ai_helper.suggest\"}}\n          @icon={{this.triggerIcon}}\n          @identifier=\"ai-tag-suggester\"\n          @onClose={{this.onClose}}\n          @triggerClass=\"btn-transparent suggestion-button suggest-tags-button {{if\n            this.loading\n            'is-loading'\n          }}\"\n          @contentClass=\"ai-suggestions-menu\"\n          @onRegisterApi={{this.onRegisterApi}}\n          @modalForMobile={{true}}\n          @untriggers={{this.untriggers}}\n          {{on \"click\" this.loadSuggestions}}\n        >\n          <:content>\n            {{#if this.showDropdown}}\n              <DropdownMenu as |dropdown|>\n                {{#each this.suggestions as |suggestion index|}}\n                  <dropdown.item>\n                    <DButton\n                      class=\"tag-row\"\n                      data-name={{suggestion.name}}\n                      data-value={{index}}\n                      title={{suggestion.name}}\n                      @translatedLabel={{suggestion.name}}\n                      @disabled={{this.isDisabled suggestion}}\n                      @action={{fn this.applySuggestion suggestion}}\n                    >\n                      {{discourseTag\n                        suggestion.name\n                        count=suggestion.count\n                        noHref=true\n                      }}\n                    </DButton>\n                  </dropdown.item>\n                {{/each}}\n              </DropdownMenu>\n            {{/if}}\n          </:content>\n        </DMenu>\n      {{/if}}\n      */\n      {\n        \"id\": \"5c5AXT4y\",\n        \"block\": \"[[[41,[30,0,[\\\"showSuggestionButton\\\"]],[[[1,\\\"  \\\"],[8,[32,0],[[4,[32,2],[\\\"click\\\",[30,0,[\\\"loadSuggestions\\\"]]],null]],[[\\\"@title\\\",\\\"@icon\\\",\\\"@identifier\\\",\\\"@onClose\\\",\\\"@triggerClass\\\",\\\"@contentClass\\\",\\\"@onRegisterApi\\\",\\\"@modalForMobile\\\",\\\"@untriggers\\\"],[[28,[32,1],[\\\"discourse_ai.ai_helper.suggest\\\"],null],[30,0,[\\\"triggerIcon\\\"]],\\\"ai-tag-suggester\\\",[30,0,[\\\"onClose\\\"]],[29,[\\\"btn-transparent suggestion-button suggest-tags-button \\\",[52,[30,0,[\\\"loading\\\"]],\\\"is-loading\\\"]]],\\\"ai-suggestions-menu\\\",[30,0,[\\\"onRegisterApi\\\"]],true,[30,0,[\\\"untriggers\\\"]]]],[[\\\"content\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"showDropdown\\\"]],[[[1,\\\"        \\\"],[8,[32,3],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"suggestions\\\"]]],null]],null],null,[[[1,\\\"            \\\"],[8,[30,1,[\\\"item\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n              \\\"],[8,[32,4],[[24,0,\\\"tag-row\\\"],[16,\\\"data-name\\\",[30,2,[\\\"name\\\"]]],[16,\\\"data-value\\\",[30,3]],[16,\\\"title\\\",[30,2,[\\\"name\\\"]]]],[[\\\"@translatedLabel\\\",\\\"@disabled\\\",\\\"@action\\\"],[[30,2,[\\\"name\\\"]],[28,[30,0,[\\\"isDisabled\\\"]],[[30,2]],null],[28,[32,5],[[30,0,[\\\"applySuggestion\\\"]],[30,2]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                \\\"],[1,[28,[32,6],[[30,2,[\\\"name\\\"]]],[[\\\"count\\\",\\\"noHref\\\"],[[30,2,[\\\"count\\\"]],true]]]],[1,\\\"\\\\n              \\\"]],[]]]]],[1,\\\"\\\\n            \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[2,3]],null],[1,\\\"        \\\"]],[1]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"dropdown\\\",\\\"suggestion\\\",\\\"index\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-tag-suggester.js\",\n        \"scope\": () => [_dMenu.default, _discourseI18n.i18n, _modifier.on, _dropdownMenu.default, _dButton.default, _helper.fn, _discourseTag.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTagSuggester;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-title-suggester\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/modifier\", \"@ember/object\", \"discourse/components/d-button\", \"discourse/components/dropdown-menu\", \"discourse/float-kit/components/d-menu\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/ai-errors\", \"discourse/plugins/discourse-ai/discourse/lib/ai-helper-suggestions\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _modifier, _object, _dButton, _dropdownMenu, _dMenu, _ajax, _ajaxError, _discourseI18n, _aiErrors, _aiHelperSuggestions, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTitleSuggester extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"suggestions\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #suggestions = (dt7948.i(this, \"suggestions\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"untriggers\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #untriggers = (dt7948.i(this, \"untriggers\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"triggerIcon\", [_tracking.tracked], function () {\n        return \"discourse-sparkles\";\n      });\n    }\n    #triggerIcon = (dt7948.i(this, \"triggerIcon\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"content\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #content = (dt7948.i(this, \"content\"), void 0);\n    get showSuggestionButton() {\n      const composerFields = document.querySelector(\".composer-fields\");\n      const editTopicTitleField = document.querySelector(\".edit-topic-title\");\n      this.content = this.args.composer?.reply;\n      const showTrigger = this.content?.length > _aiHelperSuggestions.MIN_CHARACTER_COUNT || this.args.topicState === \"edit\";\n      if (composerFields) {\n        if (showTrigger) {\n          composerFields.classList.add(\"showing-ai-suggestions\");\n        } else {\n          composerFields.classList.remove(\"showing-ai-suggestions\");\n        }\n      }\n      if (editTopicTitleField) {\n        if (showTrigger) {\n          editTopicTitleField.classList.add(\"showing-ai-suggestions\");\n        } else {\n          editTopicTitleField.classList.remove(\"showing-ai-suggestions\");\n        }\n      }\n      return showTrigger;\n    }\n    get showDropdown() {\n      if (this.suggestions?.length <= 0) {\n        this.dMenu.close();\n      }\n      return !this.loading && this.suggestions?.length > 0;\n    }\n    async loadSuggestions() {\n      if (this.suggestions && this.suggestions?.length > 0 && !this.dMenu.expanded) {\n        return this.suggestions;\n      }\n      this.loading = true;\n      this.triggerIcon = \"spinner\";\n      const data = {};\n      if (this.content) {\n        data.text = this.content;\n      } else {\n        data.topic_id = this.args.buffered.content.id;\n      }\n      try {\n        const {\n          suggestions\n        } = await (0, _ajax.ajax)(\"/discourse-ai/ai-helper/suggest_title\", {\n          method: \"POST\",\n          data\n        });\n        this.suggestions = suggestions;\n        if (this.suggestions?.length <= 0) {\n          (0, _aiHelperSuggestions.showSuggestionsError)(this, this.loadSuggestions.bind(this));\n          return;\n        }\n      } catch (error) {\n        if ((0, _aiErrors.isAiCreditLimitError)(error)) {\n          (0, _aiErrors.popupAiCreditLimitError)(error);\n        } else {\n          (0, _ajaxError.popupAjaxError)(error);\n        }\n      } finally {\n        this.loading = false;\n        this.triggerIcon = \"rotate\";\n      }\n      return this.suggestions;\n    }\n    static {\n      dt7948.n(this.prototype, \"loadSuggestions\", [_object.action]);\n    }\n    applySuggestion(suggestion) {\n      const model = this.args.composer ? this.args.composer : this.args.buffered;\n      if (!model) {\n        return;\n      }\n      model.set(\"title\", suggestion);\n      this.dMenu.close();\n    }\n    static {\n      dt7948.n(this.prototype, \"applySuggestion\", [_object.action]);\n    }\n    onRegisterApi(api) {\n      this.dMenu = api;\n    }\n    static {\n      dt7948.n(this.prototype, \"onRegisterApi\", [_object.action]);\n    }\n    onClose() {\n      if (this.suggestions?.length > 0) {\n        // If all suggestions have been used,\n        // re-triggering when no suggestions present\n        // will cause computation issues with\n        // setting the icon, so we prevent it\n        this.triggerIcon = \"discourse-sparkles\";\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"onClose\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.showSuggestionButton}}\n        <DMenu\n          @title={{i18n \"discourse_ai.ai_helper.suggest\"}}\n          @icon={{this.triggerIcon}}\n          @identifier=\"ai-title-suggester\"\n          @onClose={{this.onClose}}\n          @triggerClass=\"btn-transparent suggestion-button suggest-titles-button {{if\n            this.loading\n            'is-loading'\n          }}\"\n          @contentClass=\"ai-suggestions-menu\"\n          @onRegisterApi={{this.onRegisterApi}}\n          @modalForMobile={{true}}\n          @untriggers={{this.untriggers}}\n          {{on \"click\" this.loadSuggestions}}\n        >\n          <:content>\n            {{#if this.showDropdown}}\n              <DropdownMenu as |dropdown|>\n                {{#each this.suggestions as |suggestion index|}}\n                  <dropdown.item>\n                    <DButton\n                      data-name={{suggestion}}\n                      data-value={{index}}\n                      title={{suggestion}}\n                      @action={{fn this.applySuggestion suggestion}}\n                    >\n                      {{suggestion}}\n                    </DButton>\n                  </dropdown.item>\n                {{/each}}\n              </DropdownMenu>\n            {{/if}}\n          </:content>\n        </DMenu>\n      {{/if}}\n      */\n      {\n        \"id\": \"TesrEIgX\",\n        \"block\": \"[[[41,[30,0,[\\\"showSuggestionButton\\\"]],[[[1,\\\"  \\\"],[8,[32,0],[[4,[32,2],[\\\"click\\\",[30,0,[\\\"loadSuggestions\\\"]]],null]],[[\\\"@title\\\",\\\"@icon\\\",\\\"@identifier\\\",\\\"@onClose\\\",\\\"@triggerClass\\\",\\\"@contentClass\\\",\\\"@onRegisterApi\\\",\\\"@modalForMobile\\\",\\\"@untriggers\\\"],[[28,[32,1],[\\\"discourse_ai.ai_helper.suggest\\\"],null],[30,0,[\\\"triggerIcon\\\"]],\\\"ai-title-suggester\\\",[30,0,[\\\"onClose\\\"]],[29,[\\\"btn-transparent suggestion-button suggest-titles-button \\\",[52,[30,0,[\\\"loading\\\"]],\\\"is-loading\\\"]]],\\\"ai-suggestions-menu\\\",[30,0,[\\\"onRegisterApi\\\"]],true,[30,0,[\\\"untriggers\\\"]]]],[[\\\"content\\\"],[[[[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"showDropdown\\\"]],[[[1,\\\"        \\\"],[8,[32,3],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n\\\"],[42,[28,[31,2],[[28,[31,2],[[30,0,[\\\"suggestions\\\"]]],null]],null],null,[[[1,\\\"            \\\"],[8,[30,1,[\\\"item\\\"]],null,null,[[\\\"default\\\"],[[[[1,\\\"\\\\n              \\\"],[8,[32,4],[[16,\\\"data-name\\\",[30,2]],[16,\\\"data-value\\\",[30,3]],[16,\\\"title\\\",[30,2]]],[[\\\"@action\\\"],[[28,[32,5],[[30,0,[\\\"applySuggestion\\\"]],[30,2]],null]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                \\\"],[1,[30,2]],[1,\\\"\\\\n              \\\"]],[]]]]],[1,\\\"\\\\n            \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[2,3]],null],[1,\\\"        \\\"]],[1]]]]],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"    \\\"]],[]]]]],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"dropdown\\\",\\\"suggestion\\\",\\\"index\\\"],[\\\"if\\\",\\\"each\\\",\\\"-track-array\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-title-suggester.js\",\n        \"scope\": () => [_dMenu.default, _discourseI18n.i18n, _modifier.on, _dropdownMenu.default, _dButton.default, _helper.fn],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTitleSuggester;\n});","define(\"discourse/plugins/discourse-ai/discourse/components/thumbnail-suggestion-item\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/helper\", \"@ember/object\", \"discourse/components/d-button\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _helper, _object, _dButton, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class ThumbnailSuggestionItem extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"selected\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #selected = (dt7948.i(this, \"selected\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectIcon\", [_tracking.tracked], function () {\n        return \"far-circle\";\n      });\n    }\n    #selectIcon = (dt7948.i(this, \"selectIcon\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"selectLabel\", [_tracking.tracked], function () {\n        return \"discourse_ai.ai_helper.thumbnail_suggestions.select\";\n      });\n    }\n    #selectLabel = (dt7948.i(this, \"selectLabel\"), void 0);\n    toggleSelection(thumbnail) {\n      if (this.selected) {\n        this.selectIcon = \"far-circle\";\n        this.selectLabel = \"discourse_ai.ai_helper.thumbnail_suggestions.select\";\n        this.selected = false;\n        return this.args.removeSelection(thumbnail);\n      }\n      this.selectIcon = \"circle-check\";\n      this.selectLabel = \"discourse_ai.ai_helper.thumbnail_suggestions.selected\";\n      this.selected = true;\n      return this.args.addSelection(thumbnail);\n    }\n    static {\n      dt7948.n(this.prototype, \"toggleSelection\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"ai-thumbnail-suggestions__item\">\n        <DButton\n          @icon={{this.selectIcon}}\n          @label={{this.selectLabel}}\n          @action={{fn this.toggleSelection @thumbnail}}\n          class={{if this.selected \"btn-primary\"}}\n        />\n        <img\n          src={{@thumbnail.url}}\n          loading=\"lazy\"\n          width={{@thumbnail.thumbnail_width}}\n          height={{@thumbnail.thumbnail_height}}\n        />\n      </div>\n      */\n      {\n        \"id\": \"/mhv1HM7\",\n        \"block\": \"[[[10,0],[14,0,\\\"ai-thumbnail-suggestions__item\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],[[16,0,[52,[30,0,[\\\"selected\\\"]],\\\"btn-primary\\\"]]],[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\"],[[30,0,[\\\"selectIcon\\\"]],[30,0,[\\\"selectLabel\\\"]],[28,[32,1],[[30,0,[\\\"toggleSelection\\\"]],[30,1]],null]]],null],[1,\\\"\\\\n  \\\"],[10,\\\"img\\\"],[15,\\\"src\\\",[30,1,[\\\"url\\\"]]],[14,\\\"loading\\\",\\\"lazy\\\"],[15,\\\"width\\\",[30,1,[\\\"thumbnail_width\\\"]]],[15,\\\"height\\\",[30,1,[\\\"thumbnail_height\\\"]]],[12],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@thumbnail\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/components/thumbnail-suggestion-item.js\",\n        \"scope\": () => [_dButton.default, _helper.fn],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = ThumbnailSuggestionItem;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/admin-dashboard-tabs-after/admin-sentiment-dashbboard\", [\"exports\", \"@glimmer/component\", \"@ember/routing\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _routing, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AISentimentDashboard extends _component.default {\n    static shouldRender(args, context) {\n      return context.siteSettings.ai_sentiment_enabled;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <li class=\"navigation-item sentiment\">\n        <LinkTo @route=\"admin.dashboardSentiment\" class=\"navigation-link\">\n          {{i18n \"discourse_ai.sentiments.dashboard.title\"}}\n        </LinkTo>\n      </li>\n      */\n      {\n        \"id\": \"BfdHvLdH\",\n        \"block\": \"[[[10,\\\"li\\\"],[14,0,\\\"navigation-item sentiment\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],[[24,0,\\\"navigation-link\\\"]],[[\\\"@route\\\"],[\\\"admin.dashboardSentiment\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n    \\\"],[1,[28,[32,1],[\\\"discourse_ai.sentiments.dashboard.title\\\"],null]],[1,\\\"\\\\n  \\\"]],[]]]]],[1,\\\"\\\\n\\\"],[13]],[],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/admin-dashboard-tabs-after/admin-sentiment-dashbboard.js\",\n        \"scope\": () => [_routing.LinkTo, _discourseI18n.i18n],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AISentimentDashboard;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/after-composer-category-input/ai-category-suggestion\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-category-suggester\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _aiCategorySuggester, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiCategorySuggestion extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showComposerAiHelper)(args?.composer, context.siteSettings, context.currentUser, \"suggestions\");\n    }\n    static {\n      dt7948.g(this.prototype, \"composer\", [_service.service]);\n    }\n    #composer = (dt7948.i(this, \"composer\"), void 0);\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#unless this.composer.disableCategoryChooser}}\n        <AiCategorySuggester\n          @composer={{@outletArgs.composer}}\n          @topicState=\"new\"\n        />\n      {{/unless}}\n      */\n      {\n        \"id\": \"AhK0qmuI\",\n        \"block\": \"[[[41,[51,[30,0,[\\\"composer\\\",\\\"disableCategoryChooser\\\"]]],[[[1,\\\"  \\\"],[8,[32,0],null,[[\\\"@composer\\\",\\\"@topicState\\\"],[[30,1,[\\\"composer\\\"]],\\\"new\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@outletArgs\\\"],[\\\"unless\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/after-composer-category-input/ai-category-suggestion.js\",\n        \"scope\": () => [_aiCategorySuggester.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiCategorySuggestion;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/after-composer-tag-input/ai-tag-suggestion\", [\"exports\", \"@glimmer/component\", \"discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-tag-suggester\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _aiTagSuggester, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTagSuggestion extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showComposerAiHelper)(args?.composer, context.siteSettings, context.currentUser, \"suggestions\");\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <AiTagSuggester @composer={{@outletArgs.composer}} @topicState=\"new\" />\n      */\n      {\n        \"id\": \"pJjxVih5\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@composer\\\",\\\"@topicState\\\"],[[30,1,[\\\"composer\\\"]],\\\"new\\\"]],null]],[\\\"@outletArgs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/after-composer-tag-input/ai-tag-suggestion.js\",\n        \"scope\": () => [_aiTagSuggester.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTagSuggestion;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/after-composer-title-input/ai-title-suggestion\", [\"exports\", \"@glimmer/component\", \"discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-title-suggester\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _aiTitleSuggester, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTitleSuggestion extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showComposerAiHelper)(args?.composer, context.siteSettings, context.currentUser, \"suggestions\");\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#unless @outletArgs.composer.disableTitleInput}}\n        <AiTitleSuggester @composer={{@outletArgs.composer}} @topicState=\"new\" />\n      {{/unless}}\n      */\n      {\n        \"id\": \"Fqb9w+kH\",\n        \"block\": \"[[[41,[51,[30,1,[\\\"composer\\\",\\\"disableTitleInput\\\"]]],[[[1,\\\"  \\\"],[8,[32,0],null,[[\\\"@composer\\\",\\\"@topicState\\\"],[[30,1,[\\\"composer\\\"]],\\\"new\\\"]],null],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@outletArgs\\\"],[\\\"unless\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/after-composer-title-input/ai-title-suggestion.js\",\n        \"scope\": () => [_aiTitleSuggester.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTitleSuggestion;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/after-d-editor/composer-open\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"@ember/service\", \"discourse/helpers/body-class\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _service, _bodyClass, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class _default extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    get composerModel() {\n      return this.args?.outletArgs?.composer;\n    }\n    get renderChatWarning() {\n      return this.siteSettings.ai_bot_enable_chat_warning;\n    }\n    get aiBotClasses() {\n      if (this.composerModel?.title === (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.default_pm_prefix\")) {\n        return \"ai-bot-chat\";\n      } else {\n        return \"ai-bot-pm\";\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"aiBotClasses\", [(0, _object.computed)(\"composerModel.targetRecipients\", \"composerModel.title\")]);\n    }\n    get isAiBotChat() {\n      if (this.composerModel && this.composerModel.targetRecipients && this.currentUser.ai_enabled_chat_bots) {\n        let recipients = this.composerModel.targetRecipients.split(\",\");\n        return this.currentUser.ai_enabled_chat_bots.some(bot => recipients.some(username => username === bot.username));\n      }\n      return false;\n    }\n    static {\n      dt7948.n(this.prototype, \"isAiBotChat\", [(0, _object.computed)(\"composerModel.targetRecipients\")]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.isAiBotChat}}\n        {{bodyClass this.aiBotClasses}}\n        {{#if this.renderChatWarning}}\n          <div class=\"ai-bot-chat-warning\">{{i18n\n              \"discourse_ai.ai_bot.pm_warning\"\n            }}</div>\n        {{/if}}\n      {{/if}}\n      */\n      {\n        \"id\": \"StGO2Pno\",\n        \"block\": \"[[[41,[30,0,[\\\"isAiBotChat\\\"]],[[[1,\\\"  \\\"],[1,[28,[32,0],[[30,0,[\\\"aiBotClasses\\\"]]],null]],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"renderChatWarning\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"ai-bot-chat-warning\\\"],[12],[1,[28,[32,1],[\\\"discourse_ai.ai_bot.pm_warning\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/after-d-editor/composer-open.js\",\n        \"scope\": () => [_bodyClass.default, _discourseI18n.i18n],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = _default;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/after-filter-navigation-menu/filter-gist-toggle\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/plugins/discourse-ai/discourse/components/ai-gist-toggle\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _aiGistToggle, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class FilterGistToggle extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"topicThumbnails\", [_service.service]);\n    }\n    #topicThumbnails = (dt7948.i(this, \"topicThumbnails\"), void 0);\n    get shouldShow() {\n      return !this.topicThumbnails?.enabledForRoute;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.shouldShow}}\n        <AiGistToggle />\n      {{/if}}\n      */\n      {\n        \"id\": \"vwk4+HCd\",\n        \"block\": \"[[[41,[30,0,[\\\"shouldShow\\\"]],[[[1,\\\"  \\\"],[8,[32,0],null,null,null],[1,\\\"\\\\n\\\"]],[]],null]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/after-filter-navigation-menu/filter-gist-toggle.js\",\n        \"scope\": () => [_aiGistToggle.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = FilterGistToggle;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/after-search-result-entry/search-result-decoration\", [\"exports\", \"discourse/helpers/d-icon\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _dIcon, _discourseI18n, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const SearchResultDecoration = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <div\n    class=\"ai-result__icon\"\n    title={{i18n \"discourse_ai.embeddings.ai_generated_result\"}}\n  >\n    {{icon \"discourse-sparkles\"}}\n  </div>\n  */\n  {\n    \"id\": \"aVMs0Lzw\",\n    \"block\": \"[[[10,0],[14,0,\\\"ai-result__icon\\\"],[15,\\\"title\\\",[28,[32,0],[\\\"discourse_ai.embeddings.ai_generated_result\\\"],null]],[12],[1,\\\"\\\\n  \\\"],[1,[28,[32,1],[\\\"discourse-sparkles\\\"],null]],[1,\\\"\\\\n\\\"],[13]],[],[]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/after-search-result-entry/search-result-decoration.js\",\n    \"scope\": () => [_discourseI18n.i18n, _dIcon.default],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"search-result-decoration:SearchResultDecoration\"));\n  var _default = _exports.default = SearchResultDecoration;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/before-create-topic-button/topic-list-gist-toggle\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/plugins/discourse-ai/discourse/components/ai-gist-toggle\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _aiGistToggle, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTopicGist extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"topicThumbnails\", [_service.service]);\n    }\n    #topicThumbnails = (dt7948.i(this, \"topicThumbnails\"), void 0);\n    get shouldShow() {\n      return !this.topicThumbnails?.enabledForRoute;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.shouldShow}}\n        <AiGistToggle />\n      {{/if}}\n      */\n      {\n        \"id\": \"EVnj2EUi\",\n        \"block\": \"[[[41,[30,0,[\\\"shouldShow\\\"]],[[[1,\\\"  \\\"],[8,[32,0],null,null,null],[1,\\\"\\\\n\\\"]],[]],null]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/before-create-topic-button/topic-list-gist-toggle.js\",\n        \"scope\": () => [_aiGistToggle.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTopicGist;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/composer-fields/persona-llm-selector\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"discourse/plugins/discourse-ai/discourse/components/ai-persona-llm-selector\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _aiPersonaLlmSelector, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function isBotMessage(composer, currentUser) {\n    if (composer && composer.targetRecipients && currentUser.ai_enabled_chat_bots) {\n      const recipients = composer.targetRecipients.split(\",\");\n      return currentUser.ai_enabled_chat_bots.filter(bot => bot.username).some(bot => recipients.some(username => username === bot.username));\n    }\n    return false;\n  }\n  class BotSelector extends _component.default {\n    static shouldRender(args, {\n      currentUser\n    }) {\n      return currentUser?.ai_enabled_personas && isBotMessage(args.model, currentUser);\n    }\n    setPersonaIdOnComposer(id) {\n      this.args.outletArgs.model.metaData = {\n        ai_persona_id: id\n      };\n    }\n    static {\n      dt7948.n(this.prototype, \"setPersonaIdOnComposer\", [_object.action]);\n    }\n    setTargetRecipientsOnComposer(username) {\n      this.args.outletArgs.model.set(\"targetRecipients\", username);\n    }\n    static {\n      dt7948.n(this.prototype, \"setTargetRecipientsOnComposer\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <AiPersonaLlmSelector\n        @setPersonaId={{this.setPersonaIdOnComposer}}\n        @setTargetRecipient={{this.setTargetRecipientsOnComposer}}\n      />\n      */\n      {\n        \"id\": \"be8wq0bv\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@setPersonaId\\\",\\\"@setTargetRecipient\\\"],[[30,0,[\\\"setPersonaIdOnComposer\\\"]],[30,0,[\\\"setTargetRecipientsOnComposer\\\"]]]],null]],[],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/composer-fields/persona-llm-selector.js\",\n        \"scope\": () => [_aiPersonaLlmSelector.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = BotSelector;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/edit-topic-category__after/ai-category-suggestion\", [\"exports\", \"@glimmer/component\", \"discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-category-suggester\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _aiCategorySuggester, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiCategorySuggestion extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showComposerAiHelper)(args?.composer, context.siteSettings, context.currentUser, \"suggestions\");\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <AiCategorySuggester\n        @buffered={{@outletArgs.buffered}}\n        @topicState=\"edit\"\n      />\n      */\n      {\n        \"id\": \"6K752EBC\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@buffered\\\",\\\"@topicState\\\"],[[30,1,[\\\"buffered\\\"]],\\\"edit\\\"]],null]],[\\\"@outletArgs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/edit-topic-category__after/ai-category-suggestion.js\",\n        \"scope\": () => [_aiCategorySuggester.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiCategorySuggestion;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/edit-topic-tags__after/ai-tag-suggestion\", [\"exports\", \"@glimmer/component\", \"discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-tag-suggester\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _aiTagSuggester, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiCategorySuggestion extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showComposerAiHelper)(args?.composer, context.siteSettings, context.currentUser, \"suggestions\");\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <AiTagSuggester @buffered={{@outletArgs.buffered}} @topicState=\"edit\" />\n      */\n      {\n        \"id\": \"mP/k5rTG\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@buffered\\\",\\\"@topicState\\\"],[[30,1,[\\\"buffered\\\"]],\\\"edit\\\"]],null]],[\\\"@outletArgs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/edit-topic-tags__after/ai-tag-suggestion.js\",\n        \"scope\": () => [_aiTagSuggester.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiCategorySuggestion;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/edit-topic-title__after/ai-title-suggestion\", [\"exports\", \"@glimmer/component\", \"discourse/plugins/discourse-ai/discourse/components/suggestion-menus/ai-title-suggester\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _aiTitleSuggester, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTitleSuggestion extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showComposerAiHelper)(args?.composer, context.siteSettings, context.currentUser, \"suggestions\");\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <AiTitleSuggester @buffered={{@outletArgs.buffered}} @topicState=\"edit\" />\n      */\n      {\n        \"id\": \"dp30qeW4\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@buffered\\\",\\\"@topicState\\\"],[[30,1,[\\\"buffered\\\"]],\\\"edit\\\"]],null]],[\\\"@outletArgs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/edit-topic-title__after/ai-title-suggestion.js\",\n        \"scope\": () => [_aiTitleSuggester.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTitleSuggestion;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/editor-preview/ai-image-caption-container\", [\"exports\", \"@glimmer/component\", \"@ember/modifier\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/render-modifiers/modifiers/did-update\", \"@ember/render-modifiers/modifiers/will-destroy\", \"@ember/service\", \"discourse/components/conditional-loading-spinner\", \"discourse/components/d-button\", \"discourse/components/d-textarea\", \"discourse/helpers/d-icon\", \"discourse/modifiers/auto-focus\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _modifier, _object, _didInsert, _didUpdate, _willDestroy, _service, _conditionalLoadingSpinner, _dButton, _dTextarea, _dIcon, _autoFocus, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiImageCaptionContainer extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"imageCaptionPopup\", [_service.service]);\n    }\n    #imageCaptionPopup = (dt7948.i(this, \"imageCaptionPopup\"), void 0);\n    updateCaption(event) {\n      event.preventDefault();\n      this.imageCaptionPopup.newCaption = event.target.value;\n    }\n    static {\n      dt7948.n(this.prototype, \"updateCaption\", [_object.action]);\n    }\n    saveCaption() {\n      this.imageCaptionPopup.updateCaption();\n      this.hidePopup();\n    }\n    static {\n      dt7948.n(this.prototype, \"saveCaption\", [_object.action]);\n    }\n    resizeTextarea(target) {\n      const style = window.getComputedStyle(target);\n      // scrollbars will show based on scrollHeight alone\n      // so we need to consider borders too\n      const borderTopWidth = parseInt(style.borderTopWidth, 10);\n      const borderBottomWidth = parseInt(style.borderBottomWidth, 10);\n      target.scrollTop = 0;\n      target.style.height = `${target.scrollHeight + borderTopWidth + borderBottomWidth}px`;\n    }\n    static {\n      dt7948.n(this.prototype, \"resizeTextarea\", [_object.action]);\n    }\n    hidePopup() {\n      this.imageCaptionPopup.showPopup = false;\n      if (this.imageCaptionPopup._request) {\n        this.imageCaptionPopup._request.abort();\n        this.imageCaptionPopup._request = null;\n        this.imageCaptionPopup.toggleLoadingState(false);\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"hidePopup\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.imageCaptionPopup.showPopup}}\n        <div\n          class=\"composer-popup education-message ai-caption-popup\"\n          {{willDestroy this.hidePopup}}\n        >\n          <ConditionalLoadingSpinner\n            @condition={{this.imageCaptionPopup.loading}}\n          >\n            <DTextarea\n              {{didInsert this.resizeTextarea}}\n              {{didUpdate this.resizeTextarea this.imageCaptionPopup.newCaption}}\n              @value={{this.imageCaptionPopup.newCaption}}\n              {{on \"change\" this.updateCaption}}\n              {{autoFocus}}\n            />\n          </ConditionalLoadingSpinner>\n      \n          <div class=\"actions\">\n            <DButton\n              class=\"btn-primary\"\n              @label=\"discourse_ai.ai_helper.image_caption.save_caption\"\n              @icon=\"check\"\n              @action={{this.saveCaption}}\n            />\n            <DButton\n              class=\"btn-flat cancel-request\"\n              @label=\"cancel\"\n              @action={{this.hidePopup}}\n            />\n      \n            <span class=\"credits\">\n              {{icon \"discourse-sparkles\"}}\n              <span>{{i18n \"discourse_ai.ai_helper.image_caption.credits\"}}</span>\n            </span>\n          </div>\n        </div>\n      {{/if}}\n      */\n      {\n        \"id\": \"/HjRMS2I\",\n        \"block\": \"[[[41,[30,0,[\\\"imageCaptionPopup\\\",\\\"showPopup\\\"]],[[[1,\\\"  \\\"],[11,0],[24,0,\\\"composer-popup education-message ai-caption-popup\\\"],[4,[32,0],[[30,0,[\\\"hidePopup\\\"]]],null],[12],[1,\\\"\\\\n    \\\"],[8,[32,1],null,[[\\\"@condition\\\"],[[30,0,[\\\"imageCaptionPopup\\\",\\\"loading\\\"]]]],[[\\\"default\\\"],[[[[1,\\\"\\\\n      \\\"],[8,[32,2],[[4,[32,3],[[30,0,[\\\"resizeTextarea\\\"]]],null],[4,[32,4],[[30,0,[\\\"resizeTextarea\\\"]],[30,0,[\\\"imageCaptionPopup\\\",\\\"newCaption\\\"]]],null],[4,[32,5],[\\\"change\\\",[30,0,[\\\"updateCaption\\\"]]],null],[4,[32,6],null,null]],[[\\\"@value\\\"],[[30,0,[\\\"imageCaptionPopup\\\",\\\"newCaption\\\"]]]],null],[1,\\\"\\\\n    \\\"]],[]]]]],[1,\\\"\\\\n\\\\n    \\\"],[10,0],[14,0,\\\"actions\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,7],[[24,0,\\\"btn-primary\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\"],[\\\"discourse_ai.ai_helper.image_caption.save_caption\\\",\\\"check\\\",[30,0,[\\\"saveCaption\\\"]]]],null],[1,\\\"\\\\n      \\\"],[8,[32,7],[[24,0,\\\"btn-flat cancel-request\\\"]],[[\\\"@label\\\",\\\"@action\\\"],[\\\"cancel\\\",[30,0,[\\\"hidePopup\\\"]]]],null],[1,\\\"\\\\n\\\\n      \\\"],[10,1],[14,0,\\\"credits\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,8],[\\\"discourse-sparkles\\\"],null]],[1,\\\"\\\\n        \\\"],[10,1],[12],[1,[28,[32,9],[\\\"discourse_ai.ai_helper.image_caption.credits\\\"],null]],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/editor-preview/ai-image-caption-container.js\",\n        \"scope\": () => [_willDestroy.default, _conditionalLoadingSpinner.default, _dTextarea.default, _didInsert.default, _didUpdate.default, _modifier.on, _autoFocus.default, _dButton.default, _dIcon.default, _discourseI18n.i18n],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiImageCaptionContainer;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/fast-edit-footer-after/ai-edit-suggestion-button\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _service, _dButton, _ajax, _ajaxError, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiEditSuggestionButton extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showPostAIHelper)(args, context);\n    }\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"suggestion\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #suggestion = (dt7948.i(this, \"suggestion\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"_activeAIRequest\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #_activeAIRequest = (dt7948.i(this, \"_activeAIRequest\"), void 0);\n    get disabled() {\n      return this.loading || this.suggestion?.length > 0;\n    }\n    get mode() {\n      return this.currentUser?.ai_helper_prompts.find(prompt => prompt.name === \"proofread\");\n    }\n    suggest() {\n      this.loading = true;\n      this._activeAIRequest = (0, _ajax.ajax)(\"/discourse-ai/ai-helper/suggest\", {\n        method: \"POST\",\n        data: {\n          mode: this.mode.name,\n          text: this.args.outletArgs.initialValue,\n          custom_prompt: \"\"\n        }\n      });\n      this._activeAIRequest.then(({\n        suggestions\n      }) => {\n        this.suggestion = suggestions[0].trim();\n        this.args.outletArgs.updateValue(this.suggestion);\n      }).catch(_ajaxError.popupAjaxError).finally(() => {\n        this.loading = false;\n      });\n      return this._activeAIRequest;\n    }\n    static {\n      dt7948.n(this.prototype, \"suggest\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#unless @outletArgs.newValue}}\n        <DButton\n          class=\"btn-default btn-small btn-ai-suggest-edit\"\n          @action={{this.suggest}}\n          @icon=\"discourse-sparkles\"\n          @label=\"discourse_ai.ai_helper.fast_edit.suggest_button\"\n          @isLoading={{this.loading}}\n          @disabled={{this.disabled}}\n        />\n      {{/unless}}\n      */\n      {\n        \"id\": \"MJK3tH02\",\n        \"block\": \"[[[41,[51,[30,1,[\\\"newValue\\\"]]],[[[1,\\\"  \\\"],[8,[32,0],[[24,0,\\\"btn-default btn-small btn-ai-suggest-edit\\\"]],[[\\\"@action\\\",\\\"@icon\\\",\\\"@label\\\",\\\"@isLoading\\\",\\\"@disabled\\\"],[[30,0,[\\\"suggest\\\"]],\\\"discourse-sparkles\\\",\\\"discourse_ai.ai_helper.fast_edit.suggest_button\\\",[30,0,[\\\"loading\\\"]],[30,0,[\\\"disabled\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@outletArgs\\\"],[\\\"unless\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/fast-edit-footer-after/ai-edit-suggestion-button.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiEditSuggestionButton;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/full-page-search-below-search-header/ai-full-page-discobot-discoveries\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/service\", \"discourse/helpers/body-class\", \"discourse/helpers/d-icon\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-search-discoveries\", \"discourse/plugins/discourse-ai/discourse/components/ai-search-discoveries-tooltip\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _service, _bodyClass, _dIcon, _discourseI18n, _aiSearchDiscoveries, _aiSearchDiscoveriesTooltip, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiFullPageDiscobotDiscoveries extends _component.default {\n    static shouldRender(args, {\n      siteSettings,\n      currentUser\n    }) {\n      return siteSettings.ai_discover_enabled && siteSettings.ai_discover_persona && currentUser?.can_use_ai_discover_persona && currentUser?.user_option?.ai_search_discoveries;\n    }\n    static {\n      dt7948.g(this.prototype, \"aiCredits\", [_service.service]);\n    }\n    #aiCredits = (dt7948.i(this, \"aiCredits\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"capabilities\", [_service.service]);\n    }\n    #capabilities = (dt7948.i(this, \"capabilities\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"discobotDiscoveries\", [_service.service]);\n    }\n    #discobotDiscoveries = (dt7948.i(this, \"discobotDiscoveries\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"creditsAvailable\", [_tracking.tracked], function () {\n        return true;\n      });\n    }\n    #creditsAvailable = (dt7948.i(this, \"creditsAvailable\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"creditCheckComplete\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #creditCheckComplete = (dt7948.i(this, \"creditCheckComplete\"), void 0);\n    constructor() {\n      super(...arguments);\n      this.#checkCredits();\n    }\n    async #checkCredits() {\n      try {\n        this.creditsAvailable = await this.aiCredits.isFeatureCreditAvailable(\"discoveries\");\n      } catch {\n        this.creditsAvailable = true;\n      }\n      this.creditCheckComplete = true;\n    }\n    get shouldShow() {\n      return this.creditCheckComplete && this.creditsAvailable;\n    }\n    get previewLength() {\n      if (!this.capabilities.viewport.md) {\n        return 50;\n      } else {\n        return 10000;\n      }\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.shouldShow}}\n        {{bodyClass \"has-discoveries\"}}\n        <div class=\"ai-search-discoveries__discoveries-wrapper\">\n          {{#if this.discobotDiscoveries.showDiscoveryTitle}}\n            <h3\n              class=\"ai-search-discoveries__discoveries-title full-page-discoveries\"\n            >\n              <span>\n                {{icon \"discobot\"}}\n                {{i18n \"discourse_ai.discobot_discoveries.main_title\"}}\n              </span>\n              <AiSearchDiscoveriesTooltip />\n            </h3>\n          {{/if}}\n      \n          <div class=\"full-page-discoveries\">\n            <AiSearchDiscoveries\n              @discoveryPreviewLength={{this.previewLength}}\n              @searchTerm={{@outletArgs.search}}\n            />\n          </div>\n        </div>\n      {{/if}}\n      */\n      {\n        \"id\": \"2b/o8rY5\",\n        \"block\": \"[[[41,[30,0,[\\\"shouldShow\\\"]],[[[1,\\\"  \\\"],[1,[28,[32,0],[\\\"has-discoveries\\\"],null]],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"ai-search-discoveries__discoveries-wrapper\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"discobotDiscoveries\\\",\\\"showDiscoveryTitle\\\"]],[[[1,\\\"      \\\"],[10,\\\"h3\\\"],[14,0,\\\"ai-search-discoveries__discoveries-title full-page-discoveries\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,1],[\\\"discobot\\\"],null]],[1,\\\"\\\\n          \\\"],[1,[28,[32,2],[\\\"discourse_ai.discobot_discoveries.main_title\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[8,[32,3],null,null,null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"full-page-discoveries\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,4],null,[[\\\"@discoveryPreviewLength\\\",\\\"@searchTerm\\\"],[[30,0,[\\\"previewLength\\\"]],[30,1,[\\\"search\\\"]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@outletArgs\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/full-page-search-below-search-header/ai-full-page-discobot-discoveries.js\",\n        \"scope\": () => [_bodyClass.default, _dIcon.default, _discourseI18n.i18n, _aiSearchDiscoveriesTooltip.default, _aiSearchDiscoveries.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiFullPageDiscobotDiscoveries;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/full-page-search-below-search-header/ai-full-page-search\", [\"exports\", \"@glimmer/component\", \"discourse/plugins/discourse-ai/discourse/components/ai-full-page-search\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _aiFullPageSearch, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiFullPageSearchConnector extends _component.default {\n    static shouldRender(args, {\n      siteSettings\n    }) {\n      return siteSettings.ai_embeddings_semantic_search_enabled;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <AiFullPageSearch\n        @sortOrder={{@outletArgs.sortOrder}}\n        @searchTerm={{@outletArgs.search}}\n        @searchType={{@outletArgs.type}}\n        @addSearchResults={{@outletArgs.addSearchResults}}\n        @model={{@outletArgs.model}}\n      />\n      */\n      {\n        \"id\": \"PV53lMMT\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@sortOrder\\\",\\\"@searchTerm\\\",\\\"@searchType\\\",\\\"@addSearchResults\\\",\\\"@model\\\"],[[30,1,[\\\"sortOrder\\\"]],[30,1,[\\\"search\\\"]],[30,1,[\\\"type\\\"]],[30,1,[\\\"addSearchResults\\\"]],[30,1,[\\\"model\\\"]]]],null]],[\\\"@outletArgs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/full-page-search-below-search-header/ai-full-page-search.js\",\n        \"scope\": () => [_aiFullPageSearch.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiFullPageSearchConnector;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/post-menu-translations-dropdown/ai-post-menu-translation-extras\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _service, _dButton, _ajax, _ajaxError, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiPostMenuTranslationExtras extends _component.default {\n    static shouldRender(args, {\n      siteSettings,\n      currentUser\n    }) {\n      return siteSettings.discourse_ai_enabled && siteSettings.ai_translation_enabled && currentUser.can_localize_content;\n    }\n    static {\n      dt7948.g(this.prototype, \"dialog\", [_service.service]);\n    }\n    #dialog = (dt7948.i(this, \"dialog\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"toasts\", [_service.service]);\n    }\n    #toasts = (dt7948.i(this, \"toasts\"), void 0);\n    async #translate() {\n      try {\n        await (0, _ajax.ajax)(`/discourse-ai/translate/posts/${this.args.post.id}`, {\n          type: \"POST\"\n        });\n      } catch (error) {\n        (0, _ajaxError.popupAjaxError)(error);\n      }\n    }\n    translate() {\n      const confirmMessage = (0, _discourseI18n.i18n)(\"discourse_ai.translations.translations_menu.translate.confirm\");\n      return this.dialog.yesNoConfirm({\n        message: confirmMessage,\n        didConfirm: async () => {\n          try {\n            await this.#translate();\n            this.toasts.success({\n              duration: \"short\",\n              data: {\n                message: (0, _discourseI18n.i18n)(\"discourse_ai.translations.translations_menu.translate.success\")\n              }\n            });\n          } catch (e) {\n            (0, _ajaxError.popupAjaxError)(e);\n          }\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"translate\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <@dropdown.item class=\"update-translations-menu__translate\">\n        <DButton\n          class=\"post-action-menu__translate-translation\"\n          @label=\"discourse_ai.translations.translations_menu.translate.label\"\n          @icon=\"arrows-rotate\"\n          @action={{this.translate}}\n          @title=\"discourse_ai.translations.translations_menu.translate.title\"\n        />\n      </@dropdown.item>\n      {{yield}}\n      */\n      {\n        \"id\": \"5AWgKm7T\",\n        \"block\": \"[[[8,[30,1,[\\\"item\\\"]],[[24,0,\\\"update-translations-menu__translate\\\"]],null,[[\\\"default\\\"],[[[[1,\\\"\\\\n  \\\"],[8,[32,0],[[24,0,\\\"post-action-menu__translate-translation\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\",\\\"@title\\\"],[\\\"discourse_ai.translations.translations_menu.translate.label\\\",\\\"arrows-rotate\\\",[30,0,[\\\"translate\\\"]],\\\"discourse_ai.translations.translations_menu.translate.title\\\"]],null],[1,\\\"\\\\n\\\"]],[]]]]],[1,\\\"\\\\n\\\"],[18,2,null]],[\\\"@dropdown\\\",\\\"&default\\\"],[\\\"yield\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/post-menu-translations-dropdown/ai-post-menu-translation-extras.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiPostMenuTranslationExtras;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/post-text-buttons/ai-post-helper-trigger\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/lib/utilities\", \"discourse/plugins/discourse-ai/discourse/components/ai-post-helper-menu\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _service, _dButton, _utilities, _aiPostHelperMenu, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiPostHelperTrigger extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showPostAIHelper)(args, context);\n    }\n    static {\n      dt7948.g(this.prototype, \"menu\", [_service.service]);\n    }\n    #menu = (dt7948.i(this, \"menu\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"postHighlighted\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #postHighlighted = (dt7948.i(this, \"postHighlighted\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentMenu\", [_tracking.tracked], function () {\n        return this.menu.getByIdentifier(\"post-text-selection-toolbar\");\n      });\n    }\n    #currentMenu = (dt7948.i(this, \"currentMenu\"), void 0);\n    // capture the state at the moment the toolbar is rendered\n    // so we ensure change of state (selection change for example)\n    // is not impacting the menu data\n    menuData = {\n      ...this.args.outletArgs.data,\n      quoteState: {\n        buffer: this.args.outletArgs.data.quoteState.buffer,\n        opts: this.args.outletArgs.data.quoteState.opts,\n        postId: this.args.outletArgs.data.quoteState.postId\n      },\n      post: this.args.outletArgs.post,\n      selectedRange: (0, _utilities.selectedRange)()\n    };\n    highlightSelectedText() {\n      const postId = this.args.outletArgs.data.quoteState.postId;\n      const postElement = document.querySelector(`article[data-post-id='${postId}'] .cooked`);\n      if (!postElement) {\n        return;\n      }\n      const range = this.menuData.selectedRange;\n      // Split start/end text nodes at their range boundary\n      if (range.startContainer.nodeType === Node.TEXT_NODE && range.startOffset > 0) {\n        const newStartNode = range.startContainer.splitText(range.startOffset);\n        range.setStart(newStartNode, 0);\n      }\n      if (range.endContainer.nodeType === Node.TEXT_NODE && range.endOffset < range.endContainer.length) {\n        range.endContainer.splitText(range.endOffset);\n      }\n      // Create a Walker to traverse text nodes within range\n      const walker = document.createTreeWalker(range.commonAncestorContainer, NodeFilter.SHOW_TEXT, {\n        acceptNode: node => range.intersectsNode(node) ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT\n      });\n      const textNodes = [];\n      if (walker.currentNode?.nodeType === Node.TEXT_NODE) {\n        textNodes.push(walker.currentNode);\n      } else {\n        while (walker.nextNode()) {\n          textNodes.push(walker.currentNode);\n        }\n      }\n      for (let textNode of textNodes) {\n        const highlight = document.createElement(\"span\");\n        highlight.classList.add(\"ai-helper-highlighted-selection\");\n        // Replace textNode with highlighted clone\n        const clone = textNode.cloneNode(true);\n        highlight.appendChild(clone);\n        textNode.parentNode.replaceChild(highlight, textNode);\n      }\n      window.getSelection().removeAllRanges();\n      this.postHighlighted = true;\n    }\n    removeHighlightedText() {\n      if (!this.postHighlighted) {\n        return;\n      }\n      const highlightedSpans = document.querySelectorAll(\"span.ai-helper-highlighted-selection\");\n      highlightedSpans.forEach(span => {\n        const textNode = document.createTextNode(span.textContent);\n        span.parentNode.replaceChild(textNode, span);\n      });\n      this.postHighlighted = false;\n    }\n    async showAiPostHelperMenu() {\n      await this.currentMenu.close();\n      await this.menu.show(this.currentMenu.trigger, {\n        identifier: \"ai-post-helper-menu\",\n        component: _aiPostHelperMenu.default,\n        interactive: true,\n        trapTab: false,\n        closeOnScroll: false,\n        modalForMobile: true,\n        data: this.menuData,\n        placement: \"top-start\",\n        fallbackPlacements: [\"bottom-start\"],\n        updateOnScroll: false,\n        onClose: () => {\n          this.removeHighlightedText();\n        }\n      });\n      await this.currentMenu.destroy();\n      this.highlightSelectedText();\n    }\n    static {\n      dt7948.n(this.prototype, \"showAiPostHelperMenu\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{yield}}\n      \n      <div class=\"ai-post-helper\">\n        <DButton\n          @icon=\"discourse-sparkles\"\n          @title=\"discourse_ai.ai_helper.post_options_menu.title\"\n          @label=\"discourse_ai.ai_helper.post_options_menu.trigger\"\n          @action={{this.showAiPostHelperMenu}}\n          class=\"btn-flat ai-post-helper__trigger\"\n        />\n      </div>\n      */\n      {\n        \"id\": \"+glzcLdu\",\n        \"block\": \"[[[18,1,null],[1,\\\"\\\\n\\\\n\\\"],[10,0],[14,0,\\\"ai-post-helper\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],[[24,0,\\\"btn-flat ai-post-helper__trigger\\\"]],[[\\\"@icon\\\",\\\"@title\\\",\\\"@label\\\",\\\"@action\\\"],[\\\"discourse-sparkles\\\",\\\"discourse_ai.ai_helper.post_options_menu.title\\\",\\\"discourse_ai.ai_helper.post_options_menu.trigger\\\",[30,0,[\\\"showAiPostHelperMenu\\\"]]]],null],[1,\\\"\\\\n\\\"],[13]],[\\\"&default\\\"],[\\\"yield\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/post-text-buttons/ai-post-helper-trigger.js\",\n        \"scope\": () => [_dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiPostHelperTrigger;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/search-menu-before-advanced-search/ai-quick-search-loader\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/helpers/loading-spinner\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _loadingSpinner, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiQuickSearchLoader extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"quickSearch\", [_service.service]);\n    }\n    #quickSearch = (dt7948.i(this, \"quickSearch\"), void 0);\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.quickSearch.loading}}\n        <div class=\"ai-quick-search-spinner\">\n          {{loadingSpinner}}\n        </div>\n      {{/if}}\n      */\n      {\n        \"id\": \"IlYtsFR5\",\n        \"block\": \"[[[41,[30,0,[\\\"quickSearch\\\",\\\"loading\\\"]],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"ai-quick-search-spinner\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[32,0]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/search-menu-before-advanced-search/ai-quick-search-loader.js\",\n        \"scope\": () => [_loadingSpinner.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiQuickSearchLoader;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/search-menu-results-bottom/ai-quick-search\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-update\", \"@ember/service\", \"ember-modifier\", \"discourse/components/search-menu\", \"discourse/helpers/loading-spinner\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/search\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _didUpdate, _service, _emberModifier, _searchMenu, _loadingSpinner, _ajax, _ajaxError, _search3, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const MAX_RESULTS_FOR_ADDING_AI = 3;\n  class AiQuickSearch extends _component.default {\n    static shouldRender(args, {\n      siteSettings\n    }) {\n      return siteSettings.ai_embeddings_semantic_quick_search_enabled;\n    }\n    static {\n      dt7948.g(this.prototype, \"search\", [_service.service]);\n    }\n    #search = (dt7948.i(this, \"search\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"hasAiResults\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #hasAiResults = (dt7948.i(this, \"hasAiResults\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"searchingWithAi\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #searchingWithAi = (dt7948.i(this, \"searchingWithAi\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"lastSearchTerm\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #lastSearchTerm = (dt7948.i(this, \"lastSearchTerm\"), void 0);\n    markAiResults = (0, _emberModifier.modifier)(() => {\n      if (!this.hasAiResults) {\n        return;\n      }\n      const resultsContainer = document.querySelector(\".search-menu .results\");\n      if (resultsContainer) {\n        resultsContainer.classList.add(\"has-ai-search-results\");\n      }\n      const resultTypes = this.search.results?.resultTypes || [];\n      resultTypes.forEach(resultType => {\n        resultType.results?.forEach(result => {\n          if (result.aiGenerated) {\n            const topicId = result.topic?.id || result.topic_id;\n            if (topicId) {\n              const listItem = document.querySelector(`.search-menu .list .item [data-topic-id=\"${topicId}\"]`)?.closest(\".item\");\n              if (listItem) {\n                listItem.classList.add(\"ai-search-result\");\n              }\n            }\n          }\n        });\n      });\n    });\n    get totalResults() {\n      const resultTypes = this.search.results?.resultTypes || [];\n      return resultTypes.reduce((sum, type) => sum + (type.results?.length || 0), 0);\n    }\n    get hasModifiers() {\n      const term = this.search.activeGlobalSearchTerm || \"\";\n      return _searchMenu.MODIFIER_REGEXP.test(term);\n    }\n    get shouldAddAiResults() {\n      const searchingForTopics = this.args.outletArgs?.searchTopics;\n      const hasSearched = this.search.results !== undefined;\n      return !this.hasAiResults && !this.searchingWithAi && searchingForTopics && hasSearched && (0, _search3.isValidSearchTerm)(this.search.activeGlobalSearchTerm, this.siteSettings) && this.totalResults <= MAX_RESULTS_FOR_ADDING_AI && !this.hasModifiers && !this.search.inTopicContext;\n    }\n    onSearchTermChange() {\n      this.hasAiResults = false;\n      this.searchingWithAi = false;\n      this.lastSearchTerm = null;\n      const resultsContainer = document.querySelector(\".search-menu .results\");\n      if (resultsContainer) {\n        resultsContainer.classList.remove(\"has-ai-search-results\");\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"onSearchTermChange\", [_object.action]);\n    }\n    async checkAndAddAiResults() {\n      const currentTerm = this.search.activeGlobalSearchTerm;\n      if (this.lastSearchTerm === currentTerm) {\n        return;\n      }\n      if (this.shouldAddAiResults) {\n        this.lastSearchTerm = currentTerm;\n        await this.performAiSearch();\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"checkAndAddAiResults\", [_object.action]);\n    }\n    async performAiSearch() {\n      this.searchingWithAi = true;\n      if (this.totalResults === 0) {\n        this.search.noResults = false;\n      }\n      try {\n        const results = await (0, _ajax.ajax)(\"/discourse-ai/embeddings/quick-search\", {\n          data: {\n            q: this.search.activeGlobalSearchTerm\n          }\n        });\n        const searchResults = await (0, _search3.translateResults)(results);\n        if (searchResults?.posts?.length > 0) {\n          searchResults.posts.forEach(post => {\n            post.aiGenerated = true;\n          });\n          this.appendResults(searchResults);\n          this.hasAiResults = true;\n        } else {\n          this.search.noResults = true;\n        }\n      } catch (error) {\n        (0, _ajaxError.popupAjaxError)(error);\n        if (this.totalResults === 0) {\n          this.search.noResults = true;\n        }\n      } finally {\n        this.searchingWithAi = false;\n      }\n    }\n    #removeExistingAiResults() {\n      if (!this.search.results) {\n        return;\n      }\n      if (this.search.results.posts) {\n        this.search.results.posts = this.search.results.posts.filter(post => !post.aiGenerated);\n      }\n      const resultTypes = this.search.results.resultTypes || [];\n      resultTypes.forEach(resultType => {\n        if (resultType.results) {\n          resultType.results = resultType.results.filter(result => !result.aiGenerated);\n        }\n      });\n    }\n    #getExistingTopicIds() {\n      const existingTopicIds = new Set();\n      const resultTypes = this.search.results?.resultTypes || [];\n      resultTypes.forEach(resultType => {\n        resultType.results?.forEach(result => {\n          const topicId = result.topic?.id || result.topic_id;\n          if (topicId) {\n            existingTopicIds.add(topicId);\n          }\n        });\n      });\n      return existingTopicIds;\n    }\n    appendResults(aiResults) {\n      if (!this.search.results) {\n        this.search.results = {};\n      }\n      this.#removeExistingAiResults();\n      const existingTopicIds = this.#getExistingTopicIds();\n      const uniqueAiPosts = aiResults.posts.filter(post => {\n        const topicId = post.topic?.id || post.topic_id;\n        return !existingTopicIds.has(topicId);\n      });\n      if (uniqueAiPosts.length === 0) {\n        return;\n      }\n      this.search.results.posts = [...(this.search.results.posts || []), ...uniqueAiPosts];\n      const resultTypes = this.search.results.resultTypes || [];\n      const topicResultType = resultTypes.find(rt => rt.type === \"topic\");\n      if (topicResultType) {\n        topicResultType.results = [...topicResultType.results, ...uniqueAiPosts];\n      } else {\n        resultTypes.push({\n          results: uniqueAiPosts,\n          componentName: \"search-result-topic\",\n          type: \"topic\",\n          more: false\n        });\n      }\n      this.search.results.resultTypes = resultTypes;\n      this.search.results = {\n        ...this.search.results\n      };\n      this.search.noResults = false;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div\n        {{didUpdate this.onSearchTermChange this.search.activeGlobalSearchTerm}}\n        {{didUpdate this.checkAndAddAiResults this.totalResults}}\n        {{this.markAiResults}}\n      >\n        {{#if this.searchingWithAi}}\n          <div class=\"ai-quick-search-loading\">\n            <div class=\"ai-quick-search-loading__content\">\n              {{loadingSpinner}}\n            </div>\n          </div>\n        {{/if}}\n      </div>\n      */\n      {\n        \"id\": \"DjY7DVsJ\",\n        \"block\": \"[[[11,0],[4,[32,0],[[30,0,[\\\"onSearchTermChange\\\"]],[30,0,[\\\"search\\\",\\\"activeGlobalSearchTerm\\\"]]],null],[4,[32,0],[[30,0,[\\\"checkAndAddAiResults\\\"]],[30,0,[\\\"totalResults\\\"]]],null],[4,[30,0,[\\\"markAiResults\\\"]],null,null],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"searchingWithAi\\\"]],[[[1,\\\"    \\\"],[10,0],[14,0,\\\"ai-quick-search-loading\\\"],[12],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"ai-quick-search-loading__content\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[32,1]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[13]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/search-menu-results-bottom/ai-quick-search.js\",\n        \"scope\": () => [_didUpdate.default, _loadingSpinner.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiQuickSearch;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/search-menu-results-top/ai-discobot-discoveries\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/service\", \"discourse/helpers/d-icon\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-search-discoveries\", \"discourse/plugins/discourse-ai/discourse/components/ai-search-discoveries-tooltip\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _service, _dIcon, _discourseI18n, _aiSearchDiscoveries, _aiSearchDiscoveriesTooltip, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiDiscobotDiscoveries extends _component.default {\n    static shouldRender(args, {\n      siteSettings,\n      currentUser\n    }) {\n      return siteSettings.ai_discover_enabled && siteSettings.ai_discover_persona && currentUser?.can_use_ai_discover_persona && currentUser?.user_option?.ai_search_discoveries;\n    }\n    static {\n      dt7948.g(this.prototype, \"aiCredits\", [_service.service]);\n    }\n    #aiCredits = (dt7948.i(this, \"aiCredits\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"discobotDiscoveries\", [_service.service]);\n    }\n    #discobotDiscoveries = (dt7948.i(this, \"discobotDiscoveries\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"search\", [_service.service]);\n    }\n    #search = (dt7948.i(this, \"search\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"creditsAvailable\", [_tracking.tracked], function () {\n        return true;\n      });\n    }\n    #creditsAvailable = (dt7948.i(this, \"creditsAvailable\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"creditCheckComplete\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #creditCheckComplete = (dt7948.i(this, \"creditCheckComplete\"), void 0);\n    constructor() {\n      super(...arguments);\n      this._checkCredits();\n    }\n    async _checkCredits() {\n      try {\n        this.creditsAvailable = await this.aiCredits.isFeatureCreditAvailable(\"discoveries\");\n      } catch {\n        this.creditsAvailable = true;\n      }\n      this.creditCheckComplete = true;\n    }\n    get shouldShow() {\n      return this.creditCheckComplete && this.creditsAvailable;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.shouldShow}}\n        <div class=\"ai-discobot-discoveries\">\n          {{#if this.discobotDiscoveries.showDiscoveryTitle}}\n            <h3 class=\"ai-search-discoveries__discoveries-title\">\n              <span>\n                {{icon \"discobot\"}}\n                {{i18n \"discourse_ai.discobot_discoveries.main_title\"}}\n              </span>\n      \n              <AiSearchDiscoveriesTooltip />\n            </h3>\n          {{/if}}\n      \n          <AiSearchDiscoveries\n            @searchTerm={{@outletArgs.searchTerm}}\n            @discoveryPreviewLength={{50}}\n            @closeSearchMenu={{@outletArgs.closeSearchMenu}}\n          />\n      \n          {{#if this.search.results.topics.length}}\n            <h3 class=\"ai-search-discoveries__regular-results-title\">\n              {{icon \"bars-staggered\"}}\n              {{i18n \"discourse_ai.discobot_discoveries.regular_results\"}}\n            </h3>\n          {{/if}}\n        </div>\n      {{/if}}\n      */\n      {\n        \"id\": \"U+X2eByY\",\n        \"block\": \"[[[41,[30,0,[\\\"shouldShow\\\"]],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"ai-discobot-discoveries\\\"],[12],[1,\\\"\\\\n\\\"],[41,[30,0,[\\\"discobotDiscoveries\\\",\\\"showDiscoveryTitle\\\"]],[[[1,\\\"      \\\"],[10,\\\"h3\\\"],[14,0,\\\"ai-search-discoveries__discoveries-title\\\"],[12],[1,\\\"\\\\n        \\\"],[10,1],[12],[1,\\\"\\\\n          \\\"],[1,[28,[32,0],[\\\"discobot\\\"],null]],[1,\\\"\\\\n          \\\"],[1,[28,[32,1],[\\\"discourse_ai.discobot_discoveries.main_title\\\"],null]],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n\\\\n        \\\"],[8,[32,2],null,null,null],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"\\\\n    \\\"],[8,[32,3],null,[[\\\"@searchTerm\\\",\\\"@discoveryPreviewLength\\\",\\\"@closeSearchMenu\\\"],[[30,1,[\\\"searchTerm\\\"]],50,[30,1,[\\\"closeSearchMenu\\\"]]]],null],[1,\\\"\\\\n\\\\n\\\"],[41,[30,0,[\\\"search\\\",\\\"results\\\",\\\"topics\\\",\\\"length\\\"]],[[[1,\\\"      \\\"],[10,\\\"h3\\\"],[14,0,\\\"ai-search-discoveries__regular-results-title\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,0],[\\\"bars-staggered\\\"],null]],[1,\\\"\\\\n        \\\"],[1,[28,[32,1],[\\\"discourse_ai.discobot_discoveries.regular_results\\\"],null]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null],[1,\\\"  \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@outletArgs\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/search-menu-results-top/ai-discobot-discoveries.js\",\n        \"scope\": () => [_dIcon.default, _discourseI18n.i18n, _aiSearchDiscoveriesTooltip.default, _aiSearchDiscoveries.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiDiscobotDiscoveries;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/search-menu-results-top/ai-quick-search-info\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/lib/search\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _search3, _discourseI18n, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiQuickSearchInfo extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"search\", [_service.service]);\n    }\n    #search = (dt7948.i(this, \"search\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"quickSearch\", [_service.service]);\n    }\n    #quickSearch = (dt7948.i(this, \"quickSearch\"), void 0);\n    get termTooShort() {\n      // We check the validity again here because the input may have changed\n      // since the last time we checked, so we may want to stop showing the error\n      const validity = !(0, _search3.isValidSearchTerm)(this.search.activeGlobalSearchTerm, this.siteSettings);\n      return validity && this.quickSearch.invalidTerm && this.search.activeGlobalSearchTerm?.length > 0;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.termTooShort}}\n        <div class=\"no-results\">{{i18n \"search.too_short\"}}</div>\n      {{/if}}\n      */\n      {\n        \"id\": \"8A8XYNxM\",\n        \"block\": \"[[[41,[30,0,[\\\"termTooShort\\\"]],[[[1,\\\"  \\\"],[10,0],[14,0,\\\"no-results\\\"],[12],[1,[28,[32,0],[\\\"search.too_short\\\"],null]],[13],[1,\\\"\\\\n\\\"]],[]],null]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/search-menu-results-top/ai-quick-search-info.js\",\n        \"scope\": () => [_discourseI18n.i18n],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiQuickSearchInfo;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/split-new-topic-category-after/ai-category-suggestion\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/plugins/discourse-ai/discourse/components/ai-split-topic-suggester\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _aiSplitTopicSuggester, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiCategorySuggestion extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showPostAIHelper)(args, context);\n    }\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.siteSettings.ai_embeddings_enabled}}\n        <AiSplitTopicSuggester\n          @selectedPosts={{@outletArgs.selectedPosts}}\n          @mode=\"suggest_category\"\n          @updateAction={{@outletArgs.updateCategoryId}}\n        />\n      {{/if}}\n      */\n      {\n        \"id\": \"6pKA3AuT\",\n        \"block\": \"[[[41,[30,0,[\\\"siteSettings\\\",\\\"ai_embeddings_enabled\\\"]],[[[1,\\\"  \\\"],[8,[32,0],null,[[\\\"@selectedPosts\\\",\\\"@mode\\\",\\\"@updateAction\\\"],[[30,1,[\\\"selectedPosts\\\"]],\\\"suggest_category\\\",[30,1,[\\\"updateCategoryId\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@outletArgs\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/split-new-topic-category-after/ai-category-suggestion.js\",\n        \"scope\": () => [_aiSplitTopicSuggester.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiCategorySuggestion;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/split-new-topic-tag-after/ai-tag-suggestion\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/plugins/discourse-ai/discourse/components/ai-split-topic-suggester\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _aiSplitTopicSuggester, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTagSuggestion extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showPostAIHelper)(args, context);\n    }\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.siteSettings.ai_embeddings_enabled}}\n        <AiSplitTopicSuggester\n          @selectedPosts={{@outletArgs.selectedPosts}}\n          @mode=\"suggest_tags\"\n          @updateAction={{@outletArgs.updateTags}}\n          @currentValue={{@outletArgs.tags}}\n        />\n      {{/if}}\n      */\n      {\n        \"id\": \"r4+ScahE\",\n        \"block\": \"[[[41,[30,0,[\\\"siteSettings\\\",\\\"ai_embeddings_enabled\\\"]],[[[1,\\\"  \\\"],[8,[32,0],null,[[\\\"@selectedPosts\\\",\\\"@mode\\\",\\\"@updateAction\\\",\\\"@currentValue\\\"],[[30,1,[\\\"selectedPosts\\\"]],\\\"suggest_tags\\\",[30,1,[\\\"updateTags\\\"]],[30,1,[\\\"tags\\\"]]]],null],[1,\\\"\\\\n\\\"]],[]],null]],[\\\"@outletArgs\\\"],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/split-new-topic-tag-after/ai-tag-suggestion.js\",\n        \"scope\": () => [_aiSplitTopicSuggester.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTagSuggestion;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/split-new-topic-title-after/ai-title-suggestion\", [\"exports\", \"@glimmer/component\", \"discourse/plugins/discourse-ai/discourse/components/ai-split-topic-suggester\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _aiSplitTopicSuggester, _showAiHelper, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTitleSuggestion extends _component.default {\n    static shouldRender(args, context) {\n      return (0, _showAiHelper.showPostAIHelper)(args, context);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <AiSplitTopicSuggester\n        @selectedPosts={{@outletArgs.selectedPosts}}\n        @mode=\"suggest_title\"\n        @updateAction={{@outletArgs.updateTopicName}}\n      />\n      */\n      {\n        \"id\": \"1bYoKdrW\",\n        \"block\": \"[[[8,[32,0],null,[[\\\"@selectedPosts\\\",\\\"@mode\\\",\\\"@updateAction\\\"],[[30,1,[\\\"selectedPosts\\\"]],\\\"suggest_title\\\",[30,1,[\\\"updateTopicName\\\"]]]],null]],[\\\"@outletArgs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/split-new-topic-title-after/ai-title-suggestion.js\",\n        \"scope\": () => [_aiSplitTopicSuggester.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTitleSuggestion;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/topic-map-expanded-after/ai-summary-trigger\", [\"exports\", \"@glimmer/component\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/render-modifiers/modifiers/did-insert\", \"@ember/render-modifiers/modifiers/did-update\", \"@ember/service\", \"@ember/template\", \"ember-modifier\", \"discourse/components/d-button\", \"discourse/plugins/discourse-ai/discourse/components/modal/ai-summary-modal\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _tracking, _object, _didInsert, _didUpdate, _service, _template, _emberModifier, _dButton, _aiSummaryModal, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiSummaryTrigger extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"aiCredits\", [_service.service]);\n    }\n    #aiCredits = (dt7948.i(this, \"aiCredits\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"tooltip\", [_service.service]);\n    }\n    #tooltip = (dt7948.i(this, \"tooltip\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"creditStatus\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #creditStatus = (dt7948.i(this, \"creditStatus\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"creditCheckComplete\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #creditCheckComplete = (dt7948.i(this, \"creditCheckComplete\"), void 0);\n    creditLimitTooltipModifier = (0, _emberModifier.modifier)(element => {\n      if (!this.isDisabled) {\n        return;\n      }\n      const instance = this.tooltip.register(element, {\n        identifier: \"ai-credit-limit-tooltip\",\n        content: (0, _template.htmlSafe)(this.aiCredits.getCreditLimitMessage(this.creditStatus)),\n        placement: \"top\",\n        triggers: \"hover\",\n        interactive: true\n      });\n      return () => instance.destroy();\n    });\n    get isAiConversation() {\n      return this.args.outletArgs.topic.is_bot_pm;\n    }\n    get hasCachedSummary() {\n      return this.args.outletArgs.topic.has_cached_summary;\n    }\n    get isDisabled() {\n      if (this.hasCachedSummary) {\n        return false;\n      }\n      if (!this.creditCheckComplete) {\n        return false;\n      }\n      return this.creditStatus?.hard_limit_reached === true;\n    }\n    async checkCredits() {\n      this.creditStatus = null;\n      this.creditCheckComplete = false;\n      if (!this.currentUser) {\n        this.creditCheckComplete = true;\n        return;\n      }\n      try {\n        this.creditStatus = await this.aiCredits.getFeatureCreditStatus(\"topic_summaries\");\n      } catch {\n        this.creditStatus = null;\n      } finally {\n        this.creditCheckComplete = true;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"checkCredits\", [_object.action]);\n    }\n    openAiSummaryModal() {\n      if (this.isDisabled) {\n        return;\n      }\n      this.modal.show(_aiSummaryModal.default, {\n        model: {\n          topic: this.args.outletArgs.topic,\n          postStream: this.args.outletArgs.postStream\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"openAiSummaryModal\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#unless this.isAiConversation}}\n        {{#if @outletArgs.topic.summarizable}}\n          <section\n            class=\"topic-map__additional-contents toggle-summary\"\n            {{didInsert this.checkCredits}}\n            {{didUpdate this.checkCredits @outletArgs.topic.id}}\n            {{this.creditLimitTooltipModifier}}\n          >\n            <DButton\n              @label=\"summary.buttons.generate\"\n              @icon=\"discourse-sparkles\"\n              @action={{this.openAiSummaryModal}}\n              @disabled={{this.isDisabled}}\n              class=\"btn-default ai-summarization-button\"\n            />\n          </section>\n        {{/if}}\n      {{/unless}}\n      */\n      {\n        \"id\": \"4O6eWOm1\",\n        \"block\": \"[[[41,[51,[30,0,[\\\"isAiConversation\\\"]]],[[[41,[30,1,[\\\"topic\\\",\\\"summarizable\\\"]],[[[1,\\\"    \\\"],[11,\\\"section\\\"],[24,0,\\\"topic-map__additional-contents toggle-summary\\\"],[4,[32,0],[[30,0,[\\\"checkCredits\\\"]]],null],[4,[32,1],[[30,0,[\\\"checkCredits\\\"]],[30,1,[\\\"topic\\\",\\\"id\\\"]]],null],[4,[30,0,[\\\"creditLimitTooltipModifier\\\"]],null,null],[12],[1,\\\"\\\\n      \\\"],[8,[32,2],[[24,0,\\\"btn-default ai-summarization-button\\\"]],[[\\\"@label\\\",\\\"@icon\\\",\\\"@action\\\",\\\"@disabled\\\"],[\\\"summary.buttons.generate\\\",\\\"discourse-sparkles\\\",[30,0,[\\\"openAiSummaryModal\\\"]],[30,0,[\\\"isDisabled\\\"]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n\\\"]],[]],null]],[]],null]],[\\\"@outletArgs\\\"],[\\\"unless\\\",\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/topic-map-expanded-after/ai-summary-trigger.js\",\n        \"scope\": () => [_didInsert.default, _didUpdate.default, _dButton.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiSummaryTrigger;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/topic-map-participants-after/ai-conversation-invite\", [\"exports\", \"@glimmer/component\", \"@ember/object\", \"@ember/service\", \"discourse/components/d-button\", \"discourse/components/header/topic/participant\", \"discourse/components/modal/add-pm-participants\", \"discourse/truth-helpers\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _object, _service, _dButton, _participant, _addPmParticipants, _truthHelpers, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiConversationInvite extends _component.default {\n    static shouldRender(args) {\n      return args.topic.is_bot_pm;\n    }\n    static {\n      dt7948.g(this.prototype, \"modal\", [_service.service]);\n    }\n    #modal = (dt7948.i(this, \"modal\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"header\", [_service.service]);\n    }\n    #header = (dt7948.i(this, \"header\"), void 0);\n    get participants() {\n      const participants = [...(this.header.topicInfo.details?.allowed_users ?? []), ...(this.header.topicInfo.details?.allowed_groups ?? [])];\n      return participants;\n    }\n    showInvite() {\n      this.modal.show(_addPmParticipants.default, {\n        model: {\n          title: \"discourse_ai.ai_bot.invite_ai_conversation.title\",\n          inviteModel: this.args.outletArgs.topic\n        }\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"showInvite\", [_object.action]);\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <div class=\"ai-conversation__participants\">\n        <DButton\n          @icon=\"user-plus\"\n          @label=\"discourse_ai.ai_bot.invite_ai_conversation.button\"\n          @action={{this.showInvite}}\n          class=\"btn-default ai-conversations__invite-button\"\n        />\n        {{#each this.participants as |participant|}}\n          <Participant\n            @user={{participant}}\n            @type={{if participant.username \"user\" \"group\"}}\n            @username={{or participant.username participant.name}}\n            @avatarSize=\"medium\"\n          />\n        {{/each}}\n      </div>\n      */\n      {\n        \"id\": \"AS7AnLI2\",\n        \"block\": \"[[[10,0],[14,0,\\\"ai-conversation__participants\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],[[24,0,\\\"btn-default ai-conversations__invite-button\\\"]],[[\\\"@icon\\\",\\\"@label\\\",\\\"@action\\\"],[\\\"user-plus\\\",\\\"discourse_ai.ai_bot.invite_ai_conversation.button\\\",[30,0,[\\\"showInvite\\\"]]]],null],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,0,[\\\"participants\\\"]]],null]],null],null,[[[1,\\\"    \\\"],[8,[32,1],null,[[\\\"@user\\\",\\\"@type\\\",\\\"@username\\\",\\\"@avatarSize\\\"],[[30,1],[52,[30,1,[\\\"username\\\"]],\\\"user\\\",\\\"group\\\"],[28,[32,2],[[30,1,[\\\"username\\\"]],[30,1,[\\\"name\\\"]]],null],\\\"medium\\\"]],null],[1,\\\"\\\\n\\\"]],[1]],null],[13]],[\\\"participant\\\"],[\\\"each\\\",\\\"-track-array\\\",\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/topic-map-participants-after/ai-conversation-invite.js\",\n        \"scope\": () => [_dButton.default, _participant.default, _truthHelpers.or],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiConversationInvite;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/user-messages-controls-bottom/pm-list-gist-toggle\", [\"exports\", \"@glimmer/component\", \"@ember/service\", \"discourse/plugins/discourse-ai/discourse/components/ai-gist-toggle\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _service, _aiGistToggle, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTopicGist extends _component.default {\n    static {\n      dt7948.g(this.prototype, \"topicThumbnails\", [_service.service]);\n    }\n    #topicThumbnails = (dt7948.i(this, \"topicThumbnails\"), void 0);\n    get shouldShow() {\n      return !this.topicThumbnails?.enabledForRoute;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        {{#if this.shouldShow}}\n        <AiGistToggle />\n      {{/if}}\n      */\n      {\n        \"id\": \"rMYGMZb1\",\n        \"block\": \"[[[41,[30,0,[\\\"shouldShow\\\"]],[[[1,\\\"  \\\"],[8,[32,0],null,null,null],[1,\\\"\\\\n\\\"]],[]],null]],[],[\\\"if\\\"]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/user-messages-controls-bottom/pm-list-gist-toggle.js\",\n        \"scope\": () => [_aiGistToggle.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiTopicGist;\n});","define(\"discourse/plugins/discourse-ai/discourse/connectors/user-preferences-interface/ai-search-discoveries\", [\"exports\", \"@glimmer/component\", \"discourse/components/preference-checkbox\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _preferenceCheckbox, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiSearchDiscoveries extends _component.default {\n    static shouldRender(args, context) {\n      const {\n        siteSettings,\n        currentUser\n      } = context;\n      return siteSettings.discourse_ai_enabled && siteSettings.ai_discover_enabled && siteSettings.ai_discover_persona && currentUser?.can_use_ai_discover_persona;\n    }\n    static {\n      (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n      /*\n        <fieldset class=\"control-group ai-preferences\">\n        <PreferenceCheckbox\n          @labelKey=\"discourse_ai.discobot_discoveries.user_setting\"\n          @checked={{@outletArgs.model.user_option.ai_search_discoveries}}\n          data-setting-name=\"ai-search-discoveries\"\n          class=\"pref-ai-search-discoveries\"\n        />\n      </fieldset>\n      */\n      {\n        \"id\": \"CJ/I+4z7\",\n        \"block\": \"[[[10,\\\"fieldset\\\"],[14,0,\\\"control-group ai-preferences\\\"],[12],[1,\\\"\\\\n  \\\"],[8,[32,0],[[24,\\\"data-setting-name\\\",\\\"ai-search-discoveries\\\"],[24,0,\\\"pref-ai-search-discoveries\\\"]],[[\\\"@labelKey\\\",\\\"@checked\\\"],[\\\"discourse_ai.discobot_discoveries.user_setting\\\",[30,1,[\\\"model\\\",\\\"user_option\\\",\\\"ai_search_discoveries\\\"]]]],null],[1,\\\"\\\\n\\\"],[13]],[\\\"@outletArgs\\\"],[]]\",\n        \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/connectors/user-preferences-interface/ai-search-discoveries.js\",\n        \"scope\": () => [_preferenceCheckbox.default],\n        \"isStrictMode\": true\n      }), this);\n    }\n  }\n  _exports.default = AiSearchDiscoveries;\n});","define(\"discourse/plugins/discourse-ai/discourse/controllers/admin/dashboard-sentiment\", [\"exports\", \"@ember/object\", \"discourse/admin/controllers/admin-dashboard-tab\"], function (_exports, _object, _adminDashboardTab) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AdminDashboardSentiment extends _adminDashboardTab.default {\n    get filters() {\n      return {\n        startDate: this.startDate,\n        endDate: this.endDate\n      };\n    }\n    static {\n      dt7948.n(this.prototype, \"filters\", [(0, _object.computed)(\"startDate\", \"endDate\")]);\n    }\n    get emotionFilters() {\n      return {\n        startDate: moment().subtract(2, \"month\").format(\"YYYY-MM-DD\"),\n        endDate: moment().format(\"YYYY-MM-DD\")\n      };\n    }\n    get emotions() {\n      const emotions = [\"admiration\", \"amusement\", \"anger\", \"annoyance\", \"approval\", \"caring\", \"confusion\", \"curiosity\", \"desire\", \"disappointment\", \"disapproval\", \"disgust\", \"embarrassment\", \"excitement\", \"fear\", \"gratitude\", \"grief\", \"joy\", \"love\", \"nervousness\", \"neutral\", \"optimism\", \"pride\", \"realization\", \"relief\", \"remorse\", \"sadness\", \"surprise\"];\n      return emotions;\n    }\n  }\n  _exports.default = AdminDashboardSentiment;\n});","define(\"discourse/plugins/discourse-ai/discourse/controllers/discourse-ai-bot-conversations\", [\"exports\", \"@glimmer/tracking\", \"@ember/controller\"], function (_exports, _tracking, _controller) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class DiscourseAiBotConversations extends _controller.default {\n    static {\n      dt7948.g(this.prototype, \"llm\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #llm = (dt7948.i(this, \"llm\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"persona\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #persona = (dt7948.i(this, \"persona\"), void 0);\n    queryParams = [\"llm\", \"persona\"];\n  }\n  _exports.default = DiscourseAiBotConversations;\n});","define(\"discourse/plugins/discourse-ai/discourse/discourse-ai-bot-dashboard-route-map\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _default;\n  function _default() {\n    this.route(\"discourse-ai-bot-conversations\", {\n      path: \"/discourse-ai/ai-bot/conversations\"\n    });\n  }\n});","define(\"discourse/plugins/discourse-ai/discourse/discourse-ai-shared-conversation-show-route-map\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _default;\n  function _default() {\n    this.route(\"discourse-ai-shared-conversation-show\", {\n      path: \"/discourse-ai/ai-bot/shared-ai-conversations/:share_key\"\n    });\n  }\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/add-ai-bot-to-community-section\", [\"exports\", \"discourse/lib/plugin-api\", \"discourse-i18n\"], function (_exports, _pluginApi, _discourseI18n) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = {\n    name: \"add-ai-bot-to-community-section\",\n    initialize(container) {\n      const siteSettings = container.lookup(\"service:site-settings\");\n      const currentUser = container.lookup(\"service:current-user\");\n      if (!currentUser || !siteSettings.ai_bot_add_to_community_section || !currentUser.ai_enabled_chat_bots?.length) {\n        return;\n      }\n      const availableBots = currentUser.ai_enabled_chat_bots.filter(bot => !bot.is_persona || bot.has_default_llm);\n      if (availableBots.length === 0) {\n        return;\n      }\n      (0, _pluginApi.withPluginApi)(api => {\n        api.addCommunitySectionLink(baseSectionLink => {\n          return class AiBotSectionLink extends baseSectionLink {\n            name = \"ai-bot\";\n            route = \"discourse-ai-bot-conversations\";\n            text = (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.shortcut_link\");\n            title = (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.shortcut_title\");\n            defaultPrefixValue = \"robot\";\n          };\n        });\n      });\n    }\n  };\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/admin-plugin-configuration-nav\", [\"exports\", \"discourse/lib/plugin-api\"], function (_exports, _pluginApi) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const PLUGIN_ID = \"discourse-ai\";\n  var _default = _exports.default = {\n    name: \"discourse-ai-admin-plugin-configuration-nav\",\n    initialize(container) {\n      const currentUser = container.lookup(\"service:current-user\");\n      if (!currentUser || !currentUser.admin) {\n        return;\n      }\n      (0, _pluginApi.withPluginApi)(api => {\n        api.setAdminPluginIcon(PLUGIN_ID, \"discourse-sparkles\");\n        api.addAdminPluginConfigurationNav(PLUGIN_ID, [{\n          label: \"discourse_ai.features.short_title\",\n          route: \"adminPlugins.show.discourse-ai-features\",\n          description: \"discourse_ai.features.description\"\n        }, {\n          label: \"discourse_ai.usage.short_title\",\n          route: \"adminPlugins.show.discourse-ai-usage\",\n          description: \"discourse_ai.usage.subheader_description\"\n        }, {\n          label: \"discourse_ai.llms.short_title\",\n          route: \"adminPlugins.show.discourse-ai-llms\",\n          description: \"discourse_ai.llms.preconfigured.description\"\n        }, {\n          label: \"discourse_ai.ai_persona.short_title\",\n          route: \"adminPlugins.show.discourse-ai-personas\",\n          description: \"discourse_ai.ai_persona.persona_description\"\n        }, {\n          label: \"discourse_ai.embeddings.short_title\",\n          route: \"adminPlugins.show.discourse-ai-embeddings\",\n          description: \"discourse_ai.embeddings.description\"\n        }, {\n          label: \"discourse_ai.tools.short_title\",\n          route: \"adminPlugins.show.discourse-ai-tools\",\n          description: \"discourse_ai.tools.subheader_description\"\n        }, {\n          label: \"discourse_ai.spam.short_title\",\n          route: \"adminPlugins.show.discourse-ai-spam\",\n          description: \"discourse_ai.spam.spam_description\"\n        }, {\n          label: \"discourse_ai.translations.title\",\n          route: \"adminPlugins.show.discourse-ai-translations\",\n          description: \"discourse_ai.translations.description\"\n        }]);\n      });\n    }\n  };\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/admin-reports\", [\"exports\", \"discourse/lib/plugin-api\", \"discourse/lib/utilities\", \"discourse/plugins/discourse-ai/discourse/components/admin-report-emotion\"], function (_exports, _pluginApi, _utilities, _adminReportEmotion) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = {\n    name: \"discourse-ai-admin-reports\",\n    initialize(container) {\n      const currentUser = container.lookup(\"service:current-user\");\n      if (!currentUser || !currentUser.staff) {\n        return;\n      }\n      const AdminReportSentimentAnalysis = (0, _utilities.optionalRequire)(\"discourse/plugins/discourse-ai/discourse/components/admin-report-sentiment-analysis\");\n      (0, _pluginApi.withPluginApi)(api => {\n        api.registerReportModeComponent(\"emotion\", _adminReportEmotion.default);\n        api.registerReportModeComponent(\"sentiment_analysis\", AdminReportSentimentAnalysis);\n        api.registerValueTransformer(\"admin-reports-show-query-params\", ({\n          value\n        }) => {\n          return [...value, \"selectedChart\"];\n        });\n      });\n    }\n  };\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-artifacts\", [\"exports\", \"discourse/lib/plugin-api\", \"discourse/plugins/discourse-ai/discourse/components/ai-artifact\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _pluginApi, _aiArtifact, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function initializeAiArtifacts(api) {\n    api.decorateCookedElement((element, helper) => {\n      if (!helper.renderGlimmer) {\n        return;\n      }\n      [...element.querySelectorAll(\"div.ai-artifact\")].forEach(artifactElement => {\n        const artifactId = artifactElement.getAttribute(\"data-ai-artifact-id\");\n        const artifactVersion = artifactElement.getAttribute(\"data-ai-artifact-version\");\n        const artifactHeight = artifactElement.getAttribute(\"data-ai-artifact-height\");\n        const autorun = artifactElement.getAttribute(\"data-ai-artifact-autorun\") || artifactElement.hasAttribute(\"data-ai-artifact-autorun\");\n        const seamless = artifactElement.getAttribute(\"data-ai-artifact-seamless\") || artifactElement.hasAttribute(\"data-ai-artifact-seamless\");\n        const dataAttributes = {};\n        for (const attr of artifactElement.attributes) {\n          if (attr.name.startsWith(\"data-\") && attr.name !== \"data-ai-artifact-id\" && attr.name !== \"data-ai-artifact-version\" && attr.name !== \"data-ai-artifact-height\" && attr.name !== \"data-ai-artifact-autorun\" && attr.name !== \"data-ai-artifact-seamless\") {\n            dataAttributes[attr.name] = attr.value;\n          }\n        }\n        helper.renderGlimmer(artifactElement, (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n        /*\n          <AiArtifact\n          @artifactId={{artifactId}}\n          @artifactVersion={{artifactVersion}}\n          @artifactHeight={{artifactHeight}}\n          @autorun={{autorun}}\n          @seamless={{seamless}}\n          @dataAttributes={{dataAttributes}}\n        />\n        */\n        {\n          \"id\": \"utVXp9xh\",\n          \"block\": \"[[[8,[32,0],null,[[\\\"@artifactId\\\",\\\"@artifactVersion\\\",\\\"@artifactHeight\\\",\\\"@autorun\\\",\\\"@seamless\\\",\\\"@dataAttributes\\\"],[[32,1],[32,2],[32,3],[32,4],[32,5],[32,6]]],null]],[],[]]\",\n          \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/initializers/ai-artifacts.js\",\n          \"scope\": () => [_aiArtifact.default, artifactId, artifactVersion, artifactHeight, autorun, seamless, dataAttributes],\n          \"isStrictMode\": true\n        }), (0, _templateOnly.default)(undefined, undefined)));\n      });\n    }, {\n      id: \"ai-artifact\",\n      onlyStream: true\n    });\n  }\n  var _default = _exports.default = {\n    name: \"ai-artifact\",\n    initialize() {\n      (0, _pluginApi.withPluginApi)(initializeAiArtifacts);\n    }\n  };\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-bot-replies\", [\"exports\", \"discourse/lib/plugin-api\", \"discourse/plugins/discourse-ai/discourse/components/ai-bot-header-icon\", \"discourse/plugins/discourse-ai/discourse/components/post/ai-persona-flair\", \"discourse/plugins/discourse-ai/discourse/components/post/meta-data/ai-cancel-streaming\", \"discourse/plugins/discourse-ai/discourse/components/post-menu/ai-cancel-streaming-button\", \"discourse/plugins/discourse-ai/discourse/components/post-menu/ai-debug-button\", \"discourse/plugins/discourse-ai/discourse/components/post-menu/ai-retry-streaming-button\", \"discourse/plugins/discourse-ai/discourse/components/post-menu/ai-share-button\", \"discourse/plugins/discourse-ai/discourse/lib/ai-bot-helper\", \"discourse/plugins/discourse-ai/discourse/lib/ai-streamer/progress-handlers\"], function (_exports, _pluginApi, _aiBotHeaderIcon, _aiPersonaFlair, _aiCancelStreaming, _aiCancelStreamingButton, _aiDebugButton, _aiRetryStreamingButton, _aiShareButton, _aiBotHelper, _progressHandlers) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  let allowDebug = false;\n  function attachHeaderIcon(api) {\n    api.headerIcons.add(\"ai\", _aiBotHeaderIcon.default);\n  }\n  function initializeAIBotReplies(api) {\n    initializePauseButton(api);\n    api.modifyClass(\"controller:topic\", {\n      pluginId: \"discourse-ai\",\n      onAIBotStreamedReply: function (data) {\n        (0, _progressHandlers.streamPostText)(this.model.postStream, data);\n      },\n      subscribe: function () {\n        this._super();\n        if (this.model.isPrivateMessage && this.model.details.allowed_users && this.model.details.allowed_users.filter(_aiBotHelper.isGPTBot).length >= 1) {\n          // -3 is not obvious, but the implementation in message bus is -2 (last + new), -3 (last 2 + new)\n          this.messageBus.subscribe(`discourse-ai/ai-bot/topic/${this.model.id}`, this.onAIBotStreamedReply.bind(this), -3);\n        }\n      },\n      unsubscribe: function () {\n        // we may have infected post stream so lets clean it up\n        (0, _progressHandlers.cleanupStreamingData)(this.model.postStream);\n        this.messageBus.unsubscribe(\"discourse-ai/ai-bot/topic/*\");\n        this._super();\n      }\n    });\n  }\n  function initializePersonaDecorator(api) {\n    api.renderAfterWrapperOutlet(\"post-meta-data-poster-name\", _aiPersonaFlair.default);\n  }\n  function initializePauseButton(api) {\n    // Add cancel streaming button to post-menu (bottom of post) - hidden by CSS, kept for compatibility\n    api.registerValueTransformer(\"post-menu-buttons\", ({\n      value: dag,\n      context: {\n        post,\n        firstButtonKey\n      }\n    }) => {\n      if ((0, _aiBotHelper.isGPTBot)(post.user)) {\n        dag.add(\"ai-cancel-gpt\", _aiCancelStreamingButton.default, {\n          before: firstButtonKey,\n          after: [\"ai-share\", \"ai-debug\"]\n        });\n      }\n    });\n\n    // Add cancel streaming to post-infos (top of post, where date is shown)\n    api.registerValueTransformer(\"post-meta-data-infos\", ({\n      value: dag,\n      context: {\n        post,\n        metaDataInfoKeys\n      }\n    }) => {\n      if ((0, _aiBotHelper.isGPTBot)(post.user)) {\n        dag.add(\"ai-cancel-streaming\", _aiCancelStreaming.default, {\n          before: metaDataInfoKeys.DATE\n        });\n      }\n    });\n  }\n  function initializeRetryButton(api) {\n    api.registerValueTransformer(\"post-menu-buttons\", ({\n      value: dag,\n      context: {\n        post,\n        firstButtonKey\n      }\n    }) => {\n      if ((0, _aiBotHelper.isGPTBot)(post.user)) {\n        dag.add(\"ai-retry\", _aiRetryStreamingButton.default, {\n          before: firstButtonKey,\n          after: [\"ai-cancel-gpt\", \"ai-share\", \"ai-debug\"]\n        });\n      }\n    });\n  }\n  function initializeDebugButton(api) {\n    const currentUser = api.getCurrentUser();\n    if (!currentUser || !currentUser.ai_enabled_chat_bots || !allowDebug) {\n      return;\n    }\n    api.registerValueTransformer(\"post-menu-buttons\", ({\n      value: dag,\n      context: {\n        post,\n        firstButtonKey\n      }\n    }) => {\n      if (post.topic?.archetype === \"private_message\") {\n        dag.add(\"ai-debug\", _aiDebugButton.default, {\n          before: firstButtonKey,\n          after: \"ai-share\"\n        });\n      }\n    });\n  }\n  function initializeShareButton(api) {\n    const currentUser = api.getCurrentUser();\n    if (!currentUser || !currentUser.ai_enabled_chat_bots) {\n      return;\n    }\n    api.registerValueTransformer(\"post-menu-buttons\", ({\n      value: dag,\n      context: {\n        post,\n        firstButtonKey\n      }\n    }) => {\n      if (post.topic?.archetype === \"private_message\") {\n        dag.add(\"ai-share\", _aiShareButton.default, {\n          before: firstButtonKey\n        });\n      }\n    });\n  }\n  function initializeShareTopicButton(api) {\n    const modal = api.container.lookup(\"service:modal\");\n    const currentUser = api.container.lookup(\"service:current-user\");\n    api.registerTopicFooterButton({\n      id: \"share-ai-conversation\",\n      icon: \"share-nodes\",\n      label: \"discourse_ai.ai_bot.share_ai_conversation.name\",\n      title: \"discourse_ai.ai_bot.share_ai_conversation.title\",\n      action() {\n        (0, _aiBotHelper.showShareConversationModal)(modal, this.topic.id);\n      },\n      classNames: [\"share-ai-conversation-button\"],\n      dependentKeys: [\"topic.ai_persona_name\"],\n      displayed() {\n        return currentUser?.can_share_ai_bot_conversations && this.topic.ai_persona_name;\n      }\n    });\n  }\n  var _default = _exports.default = {\n    name: \"discourse-ai-bot-replies\",\n    initialize(container) {\n      const user = container.lookup(\"service:current-user\");\n      if (user?.ai_enabled_chat_bots) {\n        allowDebug = user.can_debug_ai_bot_conversations;\n        (0, _pluginApi.withPluginApi)(api => {\n          attachHeaderIcon(api);\n          initializeAIBotReplies(api);\n          initializePersonaDecorator(api);\n          initializeDebugButton(api, container);\n          initializeShareButton(api, container);\n          initializeShareTopicButton(api, container);\n          initializeRetryButton(api);\n        });\n      }\n    }\n  };\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-chat-summarization\", [\"exports\", \"discourse/lib/api\", \"discourse/plugins/discourse-ai/discourse/components/modal/chat-modal-channel-summary\"], function (_exports, _api, _chatModalChannelSummary) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _api.apiInitializer)(api => {\n    const siteSettings = api.container.lookup(\"service:site-settings\");\n    const currentUser = api.getCurrentUser();\n    const chatService = api.container.lookup(\"service:chat\");\n    const modal = api.container.lookup(\"service:modal\");\n    const canSummarize = currentUser && currentUser.can_summarize;\n    if (!siteSettings.chat_enabled || !chatService?.userCanChat || !canSummarize) {\n      return;\n    }\n    api.registerChatComposerButton({\n      translatedLabel: \"discourse_ai.summarization.chat.title\",\n      id: \"channel-summary\",\n      icon: \"discourse-sparkles\",\n      position: \"dropdown\",\n      action: () => {\n        modal.show(_chatModalChannelSummary.default, {\n          model: {\n            channelId: chatService.activeChannel?.id\n          }\n        });\n      }\n    });\n  });\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-conversations-sidebar\", [\"exports\", \"discourse/lib/plugin-api\", \"discourse/plugins/discourse-ai/discourse/components/ai-bot-sidebar-new-conversation\", \"discourse/plugins/discourse-ai/discourse/services/ai-conversations-sidebar-manager\"], function (_exports, _pluginApi, _aiBotSidebarNewConversation, _aiConversationsSidebarManager) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = {\n    name: \"ai-conversations-sidebar\",\n    initialize() {\n      (0, _pluginApi.withPluginApi)(api => {\n        const currentUser = api.container.lookup(\"service:current-user\");\n        if (!currentUser) {\n          return;\n        }\n        const aiConversationsSidebarManager = api.container.lookup(\"service:ai-conversations-sidebar-manager\");\n        aiConversationsSidebarManager.api = api;\n        api.addSidebarPanel(BaseCustomSidebarPanel => class AiConversationsSidebarPanel extends BaseCustomSidebarPanel {\n          key = _aiConversationsSidebarManager.AI_CONVERSATIONS_PANEL;\n          hidden = true;\n          displayHeader = false; // this would add a misplaced back to forum button\n          expandActiveSection = true;\n        });\n        api.renderInOutlet(\"before-sidebar-sections\", _aiBotSidebarNewConversation.default);\n        const setSidebarPanel = transition => {\n          if (transition?.to?.name === \"discourse-ai-bot-conversations\") {\n            return aiConversationsSidebarManager.forceCustomSidebar();\n          }\n          const topic = api.container.lookup(\"controller:topic\").model;\n          // if the topic is not a private message, not created by the current user,\n          // or doesn't have a bot response, we don't need to override sidebar\n          if (topic?.archetype === \"private_message\" && topic.user_id === currentUser.id && topic.is_bot_pm) {\n            return aiConversationsSidebarManager.forceCustomSidebar();\n          }\n          aiConversationsSidebarManager.stopForcingCustomSidebar();\n        };\n        api.container.lookup(\"service:router\").on(\"routeDidChange\", setSidebarPanel);\n      });\n    }\n  };\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-gist-connector\", [\"exports\", \"@glimmer/component\", \"discourse/lib/api\", \"discourse/plugins/discourse-ai/discourse/components/ai-topic-gist\", \"discourse/plugins/discourse-ai/discourse/components/bulk-actions/ai-regen-summaries\", \"discourse/plugins/discourse-ai/discourse/components/modal/ai-regen-summaries-modal\", \"@ember/component\", \"@ember/template-factory\"], function (_exports, _component, _api, _aiTopicGist, _aiRegenSummaries, _aiRegenSummariesModal, _component2, _templateFactory) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _api.apiInitializer)(api => {\n    const settings = api.container.lookup(\"service:site-settings\");\n    const currentUser = api.getCurrentUser();\n    const MAX_ALLOWED_REGEN = 30;\n    api.addBulkActionButton({\n      label: \"discourse_ai.summarization.topic.regenerate_ai_summaries\",\n      icon: \"arrows-rotate\",\n      class: \"btn-default\",\n      visible: ({\n        topics,\n        siteSettings,\n        currentUser: user\n      }) => {\n        if (topics?.length > MAX_ALLOWED_REGEN) {\n          return false;\n        }\n        return siteSettings.discourse_ai_enabled && siteSettings.ai_summarization_enabled && user.staff;\n      },\n      action({\n        setComponent,\n        topics,\n        afterBulkAction\n      }) {\n        setComponent(_aiRegenSummaries.default, {\n          topics,\n          afterBulkAction\n        });\n      },\n      actionType: \"setComponent\"\n    });\n    if (settings.discourse_ai_enabled && settings.ai_summarization_enabled) {\n      const OUTLETS = {\n        mobile: \"topic-list-main-link-bottom\",\n        desktop: \"topic-list-topic-cell-link-bottom-line__before\"\n      };\n      function isGistEnabledRoute(routeName) {\n        if (routeName?.startsWith(\"discovery.\")) {\n          return true;\n        }\n        if (routeName?.startsWith(\"filter\")) {\n          return true;\n        }\n        if (routeName?.startsWith(\"userPrivateMessages\")) {\n          return true;\n        }\n        if (routeName?.startsWith(\"topic.\")) {\n          return true;\n        }\n        if (routeName?.startsWith(\"tag.\")) {\n          return true;\n        }\n        if (routeName?.startsWith(\"tags.\")) {\n          return true;\n        }\n        return false;\n      }\n      function renderGistInOutlet(outletName, shouldRenderFn) {\n        api.renderInOutlet(outletName, class extends _component.default {\n          static shouldRender(args, context, owner) {\n            if (!shouldRenderFn(context)) {\n              return false;\n            }\n            const router = owner.lookup(\"service:router\");\n            return isGistEnabledRoute(router.currentRouteName);\n          }\n          static {\n            (0, _component2.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n            /*\n              <AiTopicGist @topic={{@topic}} />\n            */\n            {\n              \"id\": \"+FXY+VrG\",\n              \"block\": \"[[[8,[32,0],null,[[\\\"@topic\\\"],[[30,1]]],null]],[\\\"@topic\\\"],[]]\",\n              \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/initializers/ai-gist-connector.js\",\n              \"scope\": () => [_aiTopicGist.default],\n              \"isStrictMode\": true\n            }), this);\n          }\n        });\n      }\n      renderGistInOutlet(OUTLETS.mobile, context => context.site.mobileView);\n      renderGistInOutlet(OUTLETS.desktop, context => context.site.desktopView);\n      api.addTopicAdminMenuButton(topic => {\n        if (!currentUser?.staff) {\n          return;\n        }\n        const modal = api.container.lookup(\"service:modal\");\n        return {\n          action: () => {\n            modal.show(_aiRegenSummariesModal.default, {\n              model: {\n                topic\n              }\n            });\n          },\n          icon: \"arrows-rotate\",\n          className: \"regenerate-ai-summaries-button\",\n          label: \"discourse_ai.summarization.topic.regenerate_ai_summaries\"\n        };\n      });\n    }\n  });\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-gist-topic-list-class\", [\"exports\", \"discourse/lib/api\"], function (_exports, _api) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _api.apiInitializer)(api => {\n    const gistService = api.container.lookup(\"service:gists\");\n    api.registerValueTransformer(\"topic-list-item-class\", ({\n      value,\n      context\n    }) => {\n      const shouldShow = gistService.currentPreference === \"table-ai\" && gistService.showToggle;\n      if (context.topic.get(\"ai_topic_gist\") && shouldShow) {\n        value.push(\"excerpt-expanded\");\n      }\n      return value;\n    });\n  });\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-helper\", [\"exports\", \"discourse/lib/plugin-api\", \"discourse/lib/wait-for-keyboard\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-composer-helper-menu\", \"discourse/plugins/discourse-ai/discourse/components/modal/diff-modal\", \"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\"], function (_exports, _pluginApi, _waitForKeyboard, _discourseI18n, _aiComposerHelperMenu, _diffModal, _showAiHelper) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function initializeAiHelperTrigger(api) {\n    api.onToolbarCreate(toolbar => {\n      const currentUser = api.getCurrentUser();\n      const modal = api.container.lookup(\"service:modal\");\n      const selectedText = toolbarEvent => {\n        const composerContent = toolbarEvent.getText();\n        const selected = toolbarEvent.selected.value;\n        if (selected && selected.length > 0) {\n          return selected;\n        }\n        if (composerContent && composerContent.length > 0) {\n          return composerContent;\n        }\n      };\n      toolbar.addButton({\n        id: \"ai-helper-trigger\",\n        group: \"extras\",\n        icon: \"discourse-sparkles\",\n        title: \"discourse_ai.ai_helper.context_menu.trigger\",\n        preventFocus: true,\n        hideShortcutInTitle: true,\n        shortcut: \"ALT+P\",\n        shortcutAction: toolbarEvent => {\n          if (toolbarEvent.getText().length === 0) {\n            const toasts = api.container.lookup(\"service:toasts\");\n            return toasts.error({\n              class: \"ai-proofread-error-toast\",\n              duration: \"short\",\n              data: {\n                message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.no_content_error\")\n              }\n            });\n          }\n          const mode = currentUser?.ai_helper_prompts.find(p => p.name === \"proofread\").name;\n          modal.show(_diffModal.default, {\n            model: {\n              mode,\n              selectedText: selectedText(toolbarEvent),\n              toolbarEvent,\n              showResultAsDiff: true\n            }\n          });\n        },\n        condition: () => (0, _showAiHelper.showComposerAiHelper)(api.container.lookup(\"service:composer\").model, api.container.lookup(\"service:site-settings\"), currentUser, \"context_menu\"),\n        sendAction: async event => {\n          const capabilities = api.container.lookup(\"service:capabilities\");\n          const site = api.container.lookup(\"service:site\");\n          await (0, _waitForKeyboard.waitForClosedKeyboard)(capabilities, site);\n          const menu = api.container.lookup(\"service:menu\");\n          menu.show(document.querySelector(\".ai-helper-trigger\"), {\n            identifier: \"ai-composer-helper-menu\",\n            component: _aiComposerHelperMenu.default,\n            modalForMobile: true,\n            interactive: true,\n            data: {\n              toolbarEvent: event,\n              selectedText: selectedText(event)\n            }\n          });\n        }\n      });\n    });\n  }\n  var _default = _exports.default = {\n    name: \"discourse-ai-helper\",\n    initialize() {\n      (0, _pluginApi.withPluginApi)(api => {\n        initializeAiHelperTrigger(api);\n      });\n    }\n  };\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-image-caption\", [\"exports\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/api\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/lib/ai-errors\"], function (_exports, _ajax, _ajaxError, _api, _discourseI18n, _aiErrors) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  function isAiCaptionableImage(uploadUrl) {\n    if (!uploadUrl) {\n      return false;\n    }\n    return /\\.(png|jpe?g|gif|webp)$/i.test(uploadUrl);\n  }\n  var _default = _exports.default = (0, _api.apiInitializer)(api => {\n    const buttonAttrs = {\n      label: (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.image_caption.button_label\"),\n      icon: \"discourse-sparkles\",\n      class: \"generate-caption\"\n    };\n    const settings = api.container.lookup(\"service:site-settings\");\n    const currentUser = api.getCurrentUser();\n    if (!settings.ai_helper_enabled_features.includes(\"image_caption\") || !currentUser?.can_use_assistant) {\n      return;\n    }\n    api.addComposerImageWrapperButton(buttonAttrs.label, buttonAttrs.class, buttonAttrs.icon, event => {\n      const imageCaptionPopup = api.container.lookup(\"service:imageCaptionPopup\");\n      imageCaptionPopup.popupTrigger = event.target;\n      if (imageCaptionPopup.popupTrigger.classList.contains(\"generate-caption\")) {\n        const buttonWrapper = event.target.closest(\".button-wrapper\");\n        const imageIndex = parseInt(buttonWrapper.getAttribute(\"data-image-index\"), 10);\n        const imageSrc = event.target.closest(\".image-wrapper\").querySelector(\"img\").getAttribute(\"src\");\n        imageCaptionPopup.toggleLoadingState(true);\n        const site = api.container.lookup(\"service:site\");\n        if (!site.mobileView) {\n          imageCaptionPopup.showPopup = !imageCaptionPopup.showPopup;\n        }\n        imageCaptionPopup._request = (0, _ajax.ajax)(`/discourse-ai/ai-helper/caption_image`, {\n          method: \"POST\",\n          data: {\n            image_url: imageSrc,\n            image_url_type: \"long_url\"\n          }\n        });\n        imageCaptionPopup._request.then(({\n          caption\n        }) => {\n          imageCaptionPopup.imageSrc = imageSrc;\n          imageCaptionPopup.imageIndex = imageIndex;\n          imageCaptionPopup.newCaption = caption;\n          if (site.mobileView) {\n            // Auto-saves caption on mobile view\n            imageCaptionPopup.updateCaption();\n          }\n        }).catch(error => {\n          if ((0, _aiErrors.isAiCreditLimitError)(error)) {\n            (0, _aiErrors.popupAiCreditLimitError)(error);\n          } else {\n            (0, _ajaxError.popupAjaxError)(error);\n          }\n        }).finally(() => {\n          imageCaptionPopup.toggleLoadingState(false);\n        });\n      }\n    }, isAiCaptionableImage);\n  });\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-search-discoveries\", [\"exports\", \"discourse/lib/api\"], function (_exports, _api) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _api.apiInitializer)(api => {\n    const currentUser = api.getCurrentUser();\n    const settings = api.container.lookup(\"service:site-settings\");\n    if (!settings.ai_discover_enabled || !currentUser?.can_use_ai_discover_persona) {\n      return;\n    }\n    api.addSaveableUserOption(\"ai_search_discoveries\", {\n      page: \"interface\"\n    });\n    const discobotDiscoveries = api.container.lookup(\"service:discobot-discoveries\");\n    api.addSearchMenuOnKeyDownCallback((searchMenu, event) => {\n      if (!searchMenu) {\n        return;\n      }\n      const query = searchMenu.search.activeGlobalSearchTerm;\n\n      // We only trigger discover when searching on all topics.\n      if (searchMenu.search?.searchContext?.type || discobotDiscoveries.lastQuery === query) {\n        return true;\n      }\n      if (event.key === \"Enter\" && query?.length > 0) {\n        discobotDiscoveries.triggerDiscovery(query);\n      }\n      return true;\n    });\n    const search = api.container.lookup(\"service:search\");\n    api.addSearchMenuAssistantSelectCallback(args => {\n      if (args.updatedTerm === discobotDiscoveries.lastQuery && discobotDiscoveries.discovery) {\n        return true;\n      }\n\n      // We only trigger discover when searching on all topics.\n      if (search?.searchContext?.type) {\n        return true;\n      }\n      if (args.updatedTerm) {\n        discobotDiscoveries.triggerDiscovery(args.updatedTerm);\n      }\n      return true;\n    });\n  });\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-semantic-search\", [\"exports\", \"discourse/lib/api\"], function (_exports, _api) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _api.apiInitializer)(api => {\n    api.modifyClass(\"component:search-result-entry\", {\n      pluginId: \"discourse-ai\",\n      classNameBindings: [\"bulkSelectEnabled\", \"post.generatedByAi:ai-result\"]\n    });\n  });\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-sentiment-admin-nav\", [\"exports\", \"discourse/lib/api\"], function (_exports, _api) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _api.apiInitializer)(api => {\n    const currentUser = api.getCurrentUser();\n    if (!currentUser || !currentUser.staff || !currentUser.can_see_sentiment_reports) {\n      return;\n    }\n    api.addAdminSidebarSectionLink(\"reports\", {\n      name: \"sentiment_overview\",\n      route: \"admin.dashboardSentiment\",\n      label: \"discourse_ai.sentiments.sidebar.overview\",\n      icon: \"chart-column\",\n      moderator: true\n    });\n    api.addAdminSidebarSectionLink(\"reports\", {\n      name: \"sentiment_analysis\",\n      route: \"adminReports.show\",\n      routeModels: [\"sentiment_analysis\"],\n      label: \"discourse_ai.sentiments.sidebar.analysis\",\n      icon: \"chart-pie\",\n      moderator: true\n    });\n  });\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/ai-translation-topic-admin\", [\"exports\", \"discourse/lib/ajax\", \"discourse/lib/api\", \"discourse-i18n\"], function (_exports, _ajax, _api, _discourseI18n) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * Initializer that adds a topic admin menu button for scheduling translations\n   * of untranslated posts in a topic.\n   *\n   * @module ai-translation-topic-admin\n   */\n  var _default = _exports.default = (0, _api.apiInitializer)(api => {\n    const settings = api.container.lookup(\"service:site-settings\");\n    if (!settings.discourse_ai_enabled || !settings.ai_translation_enabled) {\n      return;\n    }\n    api.addTopicAdminMenuButton(topic => {\n      const currentUser = api.getCurrentUser();\n      if (!currentUser) {\n        return;\n      }\n      const allowedGroups = settings.content_localization_allowed_groups.split(\"|\").map(id => parseInt(id, 10));\n      const userGroupIds = currentUser.groups.map(g => g.id);\n      const hasPermission = allowedGroups.some(groupId => userGroupIds.includes(groupId));\n      if (!hasPermission) {\n        return;\n      }\n      return {\n        action: async () => {\n          const toasts = api.container.lookup(\"service:toasts\");\n          try {\n            const result = await (0, _ajax.ajax)(`/discourse-ai/translate/topics/${topic.id}`, {\n              type: \"POST\"\n            });\n            toasts.success({\n              duration: \"long\",\n              data: {\n                message: (0, _discourseI18n.i18n)(\"discourse_ai.translation.schedule_topic_success\", {\n                  count: result.scheduled_posts\n                })\n              }\n            });\n          } catch (error) {\n            const errorMessage = error.jqXHR?.responseJSON?.errors?.[0] || (0, _discourseI18n.i18n)(\"discourse_ai.translation.schedule_topic_error\");\n            toasts.error({\n              duration: \"long\",\n              data: {\n                message: errorMessage\n              }\n            });\n          }\n        },\n        icon: \"language\",\n        className: \"schedule-topic-translations-button\",\n        label: \"discourse_ai.features.translation.schedule_untranslated\"\n      };\n    });\n  });\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/related-topics\", [\"exports\", \"@glimmer/tracking\", \"discourse/components/basic-topic-list\", \"discourse/helpers/d-icon\", \"discourse/lib/plugin-api\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _tracking, _basicTopicList, _dIcon, _pluginApi, _discourseI18n, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const RelatedTopics = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <div\n    role=\"complementary\"\n    aria-labelledby=\"related-topics-title\"\n    id=\"related-topics\"\n    class=\"more-topics__list\"\n  >\n    <h3 id=\"related-topics-title\" class=\"more-topics__list-title\">\n      {{icon \"discourse-sparkles\"}}{{i18n \"discourse_ai.related_topics.title\"}}\n    </h3>\n    <div class=\"topics\">\n      <BasicTopicList @topics={{@topic.relatedTopics}} />\n    </div>\n  </div>\n  */\n  {\n    \"id\": \"VYbJm81O\",\n    \"block\": \"[[[10,0],[14,\\\"role\\\",\\\"complementary\\\"],[14,\\\"aria-labelledby\\\",\\\"related-topics-title\\\"],[14,1,\\\"related-topics\\\"],[14,0,\\\"more-topics__list\\\"],[12],[1,\\\"\\\\n  \\\"],[10,\\\"h3\\\"],[14,1,\\\"related-topics-title\\\"],[14,0,\\\"more-topics__list-title\\\"],[12],[1,\\\"\\\\n    \\\"],[1,[28,[32,0],[\\\"discourse-sparkles\\\"],null]],[1,[28,[32,1],[\\\"discourse_ai.related_topics.title\\\"],null]],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"topics\\\"],[12],[1,\\\"\\\\n    \\\"],[8,[32,2],null,[[\\\"@topics\\\"],[[30,1,[\\\"relatedTopics\\\"]]]],null],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@topic\\\"],[]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/initializers/related-topics.js\",\n    \"scope\": () => [_dIcon.default, _discourseI18n.i18n, _basicTopicList.default],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"related-topics:RelatedTopics\"));\n  var _default = _exports.default = {\n    name: \"discourse-ai-related-topics\",\n    initialize(container) {\n      const settings = container.lookup(\"service:site-settings\");\n      if (!settings.ai_embeddings_enabled || !settings.ai_embeddings_semantic_related_topics_enabled) {\n        return;\n      }\n      (0, _pluginApi.withPluginApi)(api => {\n        api.registerMoreTopicsTab({\n          id: \"related-topics\",\n          name: (0, _discourseI18n.i18n)(\"discourse_ai.related_topics.pill\"),\n          icon: \"discourse-sparkles\",\n          component: RelatedTopics,\n          condition: ({\n            topic\n          }) => topic.relatedTopics?.length\n        });\n        api.modifyClass(\"model:topic\", Superclass => class extends Superclass {\n          static {\n            dt7948.g(this.prototype, \"_relatedTopicsRecords\", [_tracking.tracked], function () {\n              return null;\n            });\n          }\n          #_relatedTopicsRecords = (dt7948.i(this, \"_relatedTopicsRecords\"), void 0);\n          // Only updates if we have data - preserves cache when scrolling.\n          set related_topics(value) {\n            if (value?.length) {\n              this._relatedTopicsRecords = value.map(topic => this.store.createRecord(\"topic\", topic));\n            }\n          }\n          get relatedTopics() {\n            return this._relatedTopicsRecords;\n          }\n        });\n        api.modifyClass(\"model:post-stream\", Superclass => class extends Superclass {\n          _setSuggestedTopics(result) {\n            super._setSuggestedTopics(...arguments);\n            if (result.related_topics) {\n              this.topic.related_topics = result.related_topics;\n            }\n          }\n        });\n      });\n    }\n  };\n});","define(\"discourse/plugins/discourse-ai/discourse/initializers/translation\", [\"exports\", \"discourse/lib/api\", \"discourse/lib/cookie\"], function (_exports, _api, _cookie) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _api.apiInitializer)(api => {\n    const settings = api.container.lookup(\"service:site-settings\");\n    if (!settings.discourse_ai_enabled || !settings.ai_translation_enabled) {\n      return;\n    }\n    api.registerCustomPostMessageCallback(\"localized\", (topicController, data) => {\n      if (!(0, _cookie.default)(\"content-localization-show-original\")) {\n        const postStream = topicController.get(\"model.postStream\");\n        postStream.triggerChangedPost(data.id, data.updated_at);\n      }\n    });\n  });\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/ai-bot-helper\", [\"exports\", \"discourse/lib/ajax\", \"discourse/lib/ajax-error\", \"discourse/lib/get-owner\", \"discourse/plugins/discourse-ai/discourse/components/modal/share-full-topic-modal\"], function (_exports, _ajax, _ajaxError, _getOwner, _shareFullTopicModal) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.getBotType = getBotType;\n  _exports.isGPTBot = isGPTBot;\n  _exports.isPostFromAiBot = isPostFromAiBot;\n  _exports.showShareConversationModal = showShareConversationModal;\n  const MAX_PERSONA_USER_ID = -1200;\n  let enabledChatBotMap = null;\n  function ensureBotMap() {\n    if (!enabledChatBotMap) {\n      const currentUser = (0, _getOwner.getOwnerWithFallback)(this).lookup(\"service:current-user\");\n      enabledChatBotMap = {};\n      currentUser?.ai_enabled_chat_bots?.forEach(bot => {\n        enabledChatBotMap[bot.id] = bot;\n      });\n    }\n  }\n  function isGPTBot(user) {\n    if (!user) {\n      return;\n    }\n    ensureBotMap();\n    return !!enabledChatBotMap[user.id];\n  }\n  function getBotType(user) {\n    if (!user) {\n      return;\n    }\n    ensureBotMap();\n    const bot = enabledChatBotMap[user.id];\n    if (!bot) {\n      return;\n    }\n    return bot.is_persona ? \"persona\" : \"llm\";\n  }\n  function isPostFromAiBot(post, currentUser) {\n    return post.user_id <= MAX_PERSONA_USER_ID || !!currentUser?.ai_enabled_chat_bots?.some(bot => post.username === bot.username);\n  }\n  function showShareConversationModal(modal, topicId) {\n    (0, _ajax.ajax)(`/discourse-ai/ai-bot/shared-ai-conversations/preview/${topicId}.json`).then(payload => {\n      modal.show(_shareFullTopicModal.default, {\n        model: payload\n      });\n    }).catch(_ajaxError.popupAjaxError);\n  }\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/ai-errors\", [\"exports\", \"@ember/template\", \"discourse/lib/get-owner\", \"discourse-i18n\"], function (_exports, _template, _getOwner, _discourseI18n) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.getAiCreditLimitMessage = getAiCreditLimitMessage;\n  _exports.isAiCreditLimitError = isAiCreditLimitError;\n  _exports.popupAiCreditLimitError = popupAiCreditLimitError;\n  /**\n   * Check if an error/payload is an AI credit limit error.\n   * Works with both AJAX errors and MessageBus payloads.\n   *\n   * @param {Object} errorOrPayload - AJAX error object or MessageBus payload\n   * @returns {boolean} - True if this is a credit limit error\n   */\n  function isAiCreditLimitError(errorOrPayload) {\n    if (!errorOrPayload) {\n      return false;\n    }\n\n    // AJAX error format:\n    if (errorOrPayload.jqXHR?.responseJSON?.error === \"credit_limit_exceeded\") {\n      return true;\n    }\n\n    // MessageBus payload format:\n    if (errorOrPayload.error_type === \"credit_limit_exceeded\") {\n      return true;\n    }\n\n    // Direct error object:\n    if (errorOrPayload.error === \"credit_limit_exceeded\") {\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * Get localized credit limit message based on user role and reset time.\n   * Returns a raw string - wrap with htmlSafe() if needed for templates.\n   *\n   * @param {Object} options - Message options\n   * @param {string} [options.resetTime] - When credits will reset (human-readable)\n   * @param {boolean} [options.isAdmin] - Whether the current user is an admin\n   * @returns {string} - Localized credit limit message\n   */\n  function getAiCreditLimitMessage({\n    resetTime,\n    isAdmin\n  } = {}) {\n    const userType = isAdmin ? \"admin\" : \"user\";\n    if (resetTime && resetTime.length > 0) {\n      return (0, _discourseI18n.i18n)(`discourse_ai.errors.credit_limit_dialog.message_${userType}`, {\n        reset_time: resetTime\n      });\n    }\n    return (0, _discourseI18n.i18n)(`discourse_ai.errors.credit_limit_dialog.message_without_time_${userType}`);\n  }\n\n  /**\n   * Show credit limit dialog to user.\n   * Similar to popupAjaxError but specialized for AI credit limits.\n   *\n   * @param {Object} errorOrPayload - AJAX error or MessageBus payload\n   */\n  function popupAiCreditLimitError(errorOrPayload) {\n    const dialog = (0, _getOwner.getOwnerWithFallback)(this).lookup(\"service:dialog\");\n    const currentUser = (0, _getOwner.getOwnerWithFallback)(this).lookup(\"service:current-user\");\n    const details = errorOrPayload.jqXHR?.responseJSON?.details || errorOrPayload.details || {};\n    const resetTime = details?.reset_time_absolute || details?.reset_time_relative || details?.reset_time;\n    const message = getAiCreditLimitMessage({\n      resetTime,\n      isAdmin: currentUser?.admin\n    });\n    dialog.alert({\n      title: (0, _discourseI18n.i18n)(\"discourse_ai.errors.credit_limit_dialog.title\"),\n      message: (0, _template.htmlSafe)(message)\n    });\n  }\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/ai-feature-setting-groups\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.AI_FEATURE_SETTING_GROUPS = void 0;\n  _exports.getSettingGroupsForFeature = getSettingGroupsForFeature;\n  const AI_FEATURE_SETTING_GROUPS = _exports.AI_FEATURE_SETTING_GROUPS = {\n    ai_helper: [{\n      key: \"access_permissions\",\n      titleKey: \"discourse_ai.features.ai_helper.setting_groups.access_permissions\",\n      settings: [\"ai_helper_enabled\", \"composer_ai_helper_allowed_groups\", \"post_ai_helper_allowed_groups\", \"ai_helper_allowed_in_pm\"]\n    }, {\n      key: \"enabled_features\",\n      titleKey: \"discourse_ai.features.ai_helper.setting_groups.enabled_features\",\n      settings: [\"ai_helper_enabled_features\"]\n    }, {\n      key: \"automation\",\n      titleKey: \"discourse_ai.features.ai_helper.setting_groups.automation\",\n      settings: [\"ai_helper_automatic_chat_thread_title\", \"ai_helper_automatic_chat_thread_title_delay\"]\n    }, {\n      key: \"personas\",\n      titleKey: \"discourse_ai.features.ai_helper.setting_groups.personas\",\n      settings: [\"ai_helper_proofreader_persona\", \"ai_helper_title_suggestions_persona\", \"ai_helper_explain_persona\", \"ai_helper_post_illustrator_persona\", \"ai_helper_smart_dates_persona\", \"ai_helper_translator_persona\", \"ai_helper_markdown_tables_persona\", \"ai_helper_custom_prompt_persona\", \"ai_helper_image_caption_persona\"]\n    }],\n    embeddings: [{\n      key: \"model_settings\",\n      titleKey: \"discourse_ai.features.embeddings.setting_groups.model_settings\",\n      settings: [\"ai_embeddings_enabled\", \"ai_embeddings_selected_model\", \"ai_embeddings_generate_for_pms\"]\n    }, {\n      key: \"related_topics\",\n      titleKey: \"discourse_ai.features.embeddings.setting_groups.related_topics\",\n      settings: [\"ai_embeddings_semantic_related_topics_enabled\", \"ai_embeddings_semantic_related_topics\", \"ai_embeddings_semantic_related_include_closed_topics\", \"ai_embeddings_semantic_related_age_penalty\", \"ai_embeddings_semantic_related_age_time_scale\"]\n    }, {\n      key: \"semantic_search\",\n      titleKey: \"discourse_ai.features.embeddings.setting_groups.semantic_search\",\n      settings: [\"ai_embeddings_semantic_search_enabled\", \"ai_embeddings_semantic_search_use_hyde\", \"ai_embeddings_semantic_quick_search_enabled\", \"ai_embeddings_semantic_search_hyde_persona\"]\n    }],\n    bot: [{\n      key: \"settings\",\n      titleKey: \"discourse_ai.features.bot.setting_groups.settings\",\n      settings: [\"ai_bot_enabled\", \"ai_bot_enabled_llms\", \"ai_bot_enable_chat_warning\"]\n    }, {\n      key: \"access_control\",\n      titleKey: \"discourse_ai.features.bot.setting_groups.access_control\",\n      settings: [\"ai_bot_debugging_allowed_groups\", \"ai_bot_allowed_groups\", \"ai_bot_public_sharing_allowed_groups\"]\n    }, {\n      key: \"ui_settings\",\n      titleKey: \"discourse_ai.features.bot.setting_groups.ui_settings\",\n      settings: [\"ai_bot_add_to_header\", \"ai_bot_add_to_community_section\"]\n    }, {\n      key: \"integrations\",\n      titleKey: \"discourse_ai.features.bot.setting_groups.integrations\",\n      settings: [\"ai_bot_github_access_token\"]\n    }],\n    summarization: [{\n      key: \"settings\",\n      titleKey: \"discourse_ai.features.summarization.setting_groups.settings\",\n      settings: [\"ai_summarization_enabled\", \"ai_summarization_persona\", \"ai_pm_summarization_allowed_groups\"]\n    }, {\n      key: \"gists\",\n      titleKey: \"discourse_ai.features.summarization.setting_groups.gists\",\n      settings: [\"ai_summary_gists_enabled\", \"ai_summary_gists_persona\"]\n    }, {\n      key: \"backfill\",\n      titleKey: \"discourse_ai.features.summarization.setting_groups.backfill\",\n      settings: [\"ai_summary_backfill_topic_max_age_days\", \"ai_summary_backfill_maximum_topics_per_hour\", \"ai_summary_backfill_minimum_word_count\"]\n    }],\n    search: [{\n      key: \"settings\",\n      titleKey: \"discourse_ai.features.search.setting_groups.settings\",\n      settings: [\"ai_discover_enabled\", \"ai_discover_persona\"]\n    }],\n    translation: [{\n      key: \"settings\",\n      titleKey: \"discourse_ai.features.translation.setting_groups.settings\",\n      settings: [\"ai_translation_enabled\"]\n    }, {\n      key: \"personas\",\n      titleKey: \"discourse_ai.features.translation.setting_groups.personas\",\n      settings: [\"ai_translation_locale_detector_persona\", \"ai_translation_post_raw_translator_persona\", \"ai_translation_topic_title_translator_persona\", \"ai_translation_short_text_translator_persona\"]\n    }, {\n      key: \"backfill_and_limits\",\n      titleKey: \"discourse_ai.features.translation.setting_groups.backfill_and_limits\",\n      settings: [\"ai_translation_backfill_hourly_rate\", \"ai_translation_backfill_limit_to_public_content\", \"ai_translation_max_post_length\", \"ai_translation_backfill_max_age_days\", \"ai_translation_max_tokens_multiplier\", \"ai_translation_verbose_logs\"]\n    }],\n    discord: [{\n      key: \"settings\",\n      titleKey: \"discourse_ai.features.discord.setting_groups.settings\",\n      settings: [\"ai_discord_search_enabled\", \"ai_discord_search_mode\", \"ai_discord_search_persona\"]\n    }, {\n      key: \"discord_configuration\",\n      titleKey: \"discourse_ai.features.discord.setting_groups.discord_configuration\",\n      settings: [\"ai_discord_app_id\", \"ai_discord_app_public_key\", \"ai_discord_allowed_guilds\"]\n    }],\n    inference: [{\n      key: \"settings\",\n      titleKey: \"discourse_ai.features.inference.setting_groups.settings\",\n      settings: [\"inferred_concepts_enabled\"]\n    }, {\n      key: \"topic_criteria\",\n      titleKey: \"discourse_ai.features.inference.setting_groups.topic_criteria\",\n      settings: [\"inferred_concepts_background_match\", \"inferred_concepts_daily_topics_limit\", \"inferred_concepts_min_posts\", \"inferred_concepts_min_likes\", \"inferred_concepts_min_views\", \"inferred_concepts_lookback_days\"]\n    }, {\n      key: \"post_criteria\",\n      titleKey: \"discourse_ai.features.inference.setting_groups.post_criteria\",\n      settings: [\"inferred_concepts_daily_posts_limit\", \"inferred_concepts_post_min_likes\"]\n    }, {\n      key: \"personas\",\n      titleKey: \"discourse_ai.features.inference.setting_groups.personas\",\n      settings: [\"inferred_concepts_generate_persona\", \"inferred_concepts_match_persona\", \"inferred_concepts_deduplicate_persona\"]\n    }]\n  };\n  function getSettingGroupsForFeature(moduleName) {\n    return AI_FEATURE_SETTING_GROUPS[moduleName] || [];\n  }\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/ai-helper-suggestions\", [\"exports\", \"@ember/owner\", \"@ember/runloop\", \"discourse-i18n\"], function (_exports, _owner, _runloop, _discourseI18n) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.MIN_CHARACTER_COUNT = void 0;\n  _exports.showSuggestionsError = showSuggestionsError;\n  const MIN_CHARACTER_COUNT = _exports.MIN_CHARACTER_COUNT = 40;\n  function showSuggestionsError(context, reloadFn) {\n    const toasts = (0, _owner.getOwner)(context).lookup(\"service:toasts\");\n    toasts.error({\n      class: \"ai-suggestion-error\",\n      duration: \"long\",\n      showProgressBar: true,\n      data: {\n        message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.suggest_errors.no_suggestions\"),\n        actions: [{\n          label: (0, _discourseI18n.i18n)(\"discourse_ai.ai_helper.context_menu.regen\"),\n          icon: \"rotate\",\n          class: \"btn btn-small\",\n          action: async toast => {\n            toast.close();\n            await reloadFn();\n            if (context.dMenu?.show && context.suggestions?.length > 0) {\n              (0, _runloop.later)(() => context.dMenu.show(), 50);\n            }\n          }\n        }]\n      }\n    });\n  }\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/ai-streamer/progress-handlers\", [\"exports\", \"@ember/runloop\", \"discourse/plugins/discourse-ai/discourse/lib/ai-streamer/updaters/post-updater\"], function (_exports, _runloop, _postUpdater) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.MIN_LETTERS_PER_INTERVAL = void 0;\n  _exports.addProgressDecoration = addProgressDecoration;\n  _exports.applyProgress = applyProgress;\n  _exports.cleanupStreamingData = cleanupStreamingData;\n  _exports.default = streamUpdaterText;\n  _exports.streamPostText = streamPostText;\n  const PROGRESS_INTERVAL = 40;\n  const GIVE_UP_INTERVAL = 600000; // 10 minutes which is our max thinking time for now\n  const MIN_LETTERS_PER_INTERVAL = _exports.MIN_LETTERS_PER_INTERVAL = 6;\n  const MAX_FLUSH_TIME = 800;\n  let progressTimer = null;\n\n  /**\n   * Finds the last non-empty child element or text node of a given DOM element.\n   * Iterates backward through the element's child nodes and skips over empty text nodes.\n   *\n   * @param {HTMLElement} element - The DOM element to inspect.\n   * @returns {Node} - The last non-empty child node or null if none found.\n   */\n  function lastNonEmptyChild(element) {\n    let lastChild = element.lastChild;\n    while (lastChild && lastChild.nodeType === Node.TEXT_NODE && !/\\S/.test(lastChild.textContent)) {\n      lastChild = lastChild.previousSibling;\n    }\n    return lastChild;\n  }\n  function inProgressThinkingNode(element) {\n    const elem = element.querySelector(\".ai-thinking:last-child\");\n    if (elem) {\n      // if the next element after this is either empty text or nothing is it in progress\n      let next = elem.nextSibling;\n      while (next && next.nodeType === Node.TEXT_NODE && !/\\S/.test(next.textContent)) {\n        next = next.nextSibling;\n      }\n      if (!next) {\n        return elem;\n      }\n    }\n    return null;\n  }\n\n  /**\n   * Adds a progress dot (a span element with a \"progress-dot\" class) at the end of the\n   * last non-empty block within a given DOM element. This is used to visually indicate\n   * progress while content is being streamed.\n   *\n   * @param {HTMLElement} element - The DOM element to which the progress dot will be added.\n   */\n  function addProgressDecoration(element) {\n    const thinkingNode = inProgressThinkingNode(element);\n    if (thinkingNode) {\n      thinkingNode.classList.add(\"in-progress\");\n    }\n    let lastBlock = element;\n    while (true) {\n      let lastChild = lastNonEmptyChild(lastBlock);\n      if (!lastChild) {\n        break;\n      }\n      if (lastChild.nodeType === Node.ELEMENT_NODE) {\n        lastBlock = lastChild;\n      } else {\n        break;\n      }\n    }\n    const dotElement = document.createElement(\"span\");\n    dotElement.classList.add(\"progress-dot\");\n    lastBlock.appendChild(dotElement);\n  }\n\n  /**\n   * Applies progress to a streaming operation, updating the raw and cooked text,\n   * handling progress dots, and stopping streaming when complete.\n   *\n   * @param {Object} status - The current streaming status object.\n   * @param {Object} updater - An instance of a stream updater (e.g., PostUpdater or SummaryUpdater).\n   * @returns {Promise<boolean>} - Resolves to true if streaming is complete, otherwise false.\n   */\n  async function applyProgress(status, updater) {\n    status.startTime = status.startTime || Date.now();\n    if (Date.now() - status.startTime > GIVE_UP_INTERVAL) {\n      updater.streaming = false;\n      return true;\n    }\n    if (!updater.element) {\n      // wait till later\n      return false;\n    }\n    const oldRaw = updater.raw;\n    if (status.raw === oldRaw && !status.done) {\n      const hasProgressDot = updater.element.querySelector(\".progress-dot\");\n      if (hasProgressDot) {\n        return false;\n      }\n    }\n    if (status.raw !== undefined) {\n      let newRaw = status.raw;\n      if (!status.done) {\n        // rush update if we have a </details> tag (function call)\n        if (oldRaw.length === 0 && newRaw.indexOf(\"</details>\") !== -1) {\n          newRaw = status.raw;\n        } else {\n          const diff = newRaw.length - oldRaw.length;\n\n          // progress interval is 40ms\n          // by default we add 6 letters per interval\n          // but ... we want to be done in MAX_FLUSH_TIME\n          let letters = Math.floor(diff / (MAX_FLUSH_TIME / PROGRESS_INTERVAL));\n          if (letters < MIN_LETTERS_PER_INTERVAL) {\n            letters = MIN_LETTERS_PER_INTERVAL;\n          }\n          newRaw = status.raw.substring(0, oldRaw.length + letters);\n        }\n      }\n      await updater.setRaw(newRaw, status.done);\n    }\n    if (status.done) {\n      if (status.cooked) {\n        await updater.setCooked(status.cooked, true);\n      }\n      updater.streaming = false;\n    }\n    return status.done;\n  }\n\n  /**\n   * Handles progress updates for a post stream by applying the streaming status of\n   * each post and updating its content accordingly. This function ensures that progress\n   * is tracked and handled for multiple posts simultaneously.\n   *\n   * @param {Object} postStream - The post stream object containing the posts to be updated.\n   * @returns {Promise<boolean>} - Resolves to true if polling should continue, otherwise false.\n   */\n  async function handleProgress(postStream) {\n    const status = postStream.aiStreamingStatus;\n    if (!status) {\n      return false;\n    }\n    let keepPolling = false;\n    const promises = Object.keys(status).map(async postId => {\n      let postStatus = status[postId];\n      const postUpdater = new _postUpdater.default(postStream, postStatus.post_id);\n      const done = await applyProgress(postStatus, postUpdater);\n      if (done) {\n        delete status[postId];\n      } else {\n        keepPolling = true;\n      }\n    });\n    await Promise.all(promises);\n    return keepPolling;\n  }\n\n  /**\n   * Ensures that progress for a post stream is being updated. It starts a progress timer\n   * if one is not already active, and continues polling for progress updates at regular intervals.\n   *\n   * @param {Object} postStream - The post stream object containing the posts to be updated.\n   */\n  function ensureProgress(postStream) {\n    if (!progressTimer) {\n      progressTimer = (0, _runloop.later)(async () => {\n        const keepPolling = await handleProgress(postStream);\n        progressTimer = null;\n        if (keepPolling) {\n          ensureProgress(postStream);\n        }\n      }, PROGRESS_INTERVAL);\n    }\n  }\n\n  /**\n   * Streams the raw text for a post by tracking its status and applying progress updates.\n   * If streaming is already in progress, this function ensures it continues to update the content.\n   *\n   * @param {Object} postStream - The post stream object containing the post to be updated.\n   * @param {Object} data - The data object containing raw and cooked content of the post.\n   */\n  function streamPostText(postStream, data) {\n    if (data.noop) {\n      return;\n    }\n    let status = postStream.aiStreamingStatus = postStream.aiStreamingStatus || {};\n    status[data.post_id] = data;\n    ensureProgress(postStream);\n  }\n  function cleanupStreamingData(postStream) {\n    postStream.aiStreamingStatus = undefined;\n  }\n\n  /**\n   * A generalized function to handle streaming of content using any specified updater class.\n   * It applies progress updates to the content (raw and cooked) based on the given data.\n   * Use this function to stream content for Glimmer components.\n   *\n   * @param {Function} updaterClass - The updater class to be used for streaming (e.g., PostUpdater, SummaryUpdater).\n   * @param {Object} data - The data object containing the content to be streamed.\n   * @param {Object} context - Additional context required for the updater (typically the context of the Ember component).\n   */\n  function streamUpdaterText(updaterClass, data, context) {\n    const updaterInstance = new updaterClass(data, context);\n    if (!progressTimer) {\n      progressTimer = (0, _runloop.later)(async () => {\n        await applyProgress(data, updaterInstance);\n        progressTimer = null;\n        if (!data.done) {\n          await applyProgress(data, updaterInstance);\n        }\n      }, PROGRESS_INTERVAL);\n    }\n  }\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/ai-streamer/updaters/post-updater\", [\"exports\", \"discourse/lib/load-morphlex\", \"discourse/lib/plugin-api\", \"discourse/lib/text\", \"discourse/plugins/discourse-ai/discourse/lib/ai-streamer/progress-handlers\", \"discourse/plugins/discourse-ai/discourse/lib/ai-streamer/updaters/stream-updater\"], function (_exports, _loadMorphlex, _pluginApi, _text, _progressHandlers, _streamUpdater) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class PostUpdater extends _streamUpdater.default {\n    morphingOptions = {\n      beforeAttributeUpdated: (element, attributeName) => {\n        return !(element.tagName === \"DETAILS\" && attributeName === \"open\");\n      }\n    };\n    constructor(postStream, postId) {\n      super();\n      this.postStream = postStream;\n      this.postId = postId;\n      this.post = postStream.findLoadedPost(postId);\n      const topicId = postStream.topic.id;\n      if (this.post) {\n        this.postElement = document.querySelector(`.topic-area[data-topic-id=\"${topicId}\"] #post_${this.post.post_number}`);\n      }\n    }\n    get element() {\n      return this.postElement;\n    }\n    set streaming(value) {\n      if (this.postElement) {\n        if (value) {\n          this.postElement.classList.add(\"streaming\");\n        } else {\n          this.postElement.classList.remove(\"streaming\");\n        }\n      }\n    }\n    async setRaw(value, done) {\n      this.post.set(\"raw\", value);\n      const cooked = await (0, _text.cook)(value);\n\n      // resets animation\n      this.element.classList.remove(\"streaming\");\n      void this.element.offsetWidth;\n      this.element.classList.add(\"streaming\");\n      const cookedElement = document.createElement(\"div\");\n      cookedElement.innerHTML = cooked;\n      if (!done) {\n        (0, _progressHandlers.addProgressDecoration)(cookedElement);\n      }\n      await this.setCooked(cookedElement.innerHTML, done);\n    }\n    async setCooked(value, done) {\n      if (!this.postElement) {\n        return;\n      }\n      (0, _pluginApi.withPluginApi)(api => api.preventCloak(this.postId));\n      (await (0, _loadMorphlex.default)()).morphInner(this.postElement.querySelector(\".cooked\"), `<div>${value}</div>`, this.morphingOptions);\n      if (done) {\n        this.post.set(\"cooked\", value);\n        (0, _pluginApi.withPluginApi)(api => api.preventCloak(this.postId, false));\n      }\n    }\n    get raw() {\n      return this.post.get(\"raw\") || \"\";\n    }\n  }\n  _exports.default = PostUpdater;\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/ai-streamer/updaters/stream-updater\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * Interface needed to implement for a streaming updater\n   */\n  class StreamUpdater {\n    set streaming(value) {\n      throw \"not implemented\";\n    }\n    async setCooked() {\n      throw \"not implemented\";\n    }\n    async setRaw() {\n      throw \"not implemented\";\n    }\n    get element() {\n      throw \"not implemented\";\n    }\n    get raw() {\n      throw \"not implemented\";\n    }\n  }\n  _exports.default = StreamUpdater;\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/ai-topic-summary\", [\"exports\", \"@glimmer/tracking\", \"discourse/lib/ajax\", \"discourse/lib/formatter\", \"discourse/lib/text\", \"discourse/plugins/discourse-ai/discourse/lib/ai-errors\"], function (_exports, _tracking, _ajax, _formatter, _text3, _aiErrors) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiTopicSummary {\n    static {\n      dt7948.g(this.prototype, \"text\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #text = (dt7948.i(this, \"text\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"summarizedOn\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #summarizedOn = (dt7948.i(this, \"summarizedOn\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"summarizedBy\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #summarizedBy = (dt7948.i(this, \"summarizedBy\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"newPostsSinceSummary\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #newPostsSinceSummary = (dt7948.i(this, \"newPostsSinceSummary\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"outdated\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #outdated = (dt7948.i(this, \"outdated\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"canRegenerate\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #canRegenerate = (dt7948.i(this, \"canRegenerate\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"regenerated\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #regenerated = (dt7948.i(this, \"regenerated\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"showSummaryBox\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #showSummaryBox = (dt7948.i(this, \"showSummaryBox\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"canCollapseSummary\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #canCollapseSummary = (dt7948.i(this, \"canCollapseSummary\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loadingSummary\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loadingSummary = (dt7948.i(this, \"loadingSummary\"), void 0);\n    processUpdate(update) {\n      const topicSummary = update.ai_topic_summary;\n      return (0, _text3.cook)(topicSummary.summarized_text).then(cooked => {\n        this.text = cooked;\n        this.loading = false;\n      }).then(() => {\n        if (update.done) {\n          this.summarizedOn = (0, _formatter.shortDateNoYear)(topicSummary.summarized_on);\n          this.summarizedBy = topicSummary.algorithm;\n          this.newPostsSinceSummary = topicSummary.new_posts_since_summary;\n          this.outdated = topicSummary.outdated;\n          this.newPostsSinceSummary = topicSummary.new_posts_since_summary;\n          this.canRegenerate = topicSummary.outdated && topicSummary.can_regenerate;\n        }\n      });\n    }\n    collapse() {\n      this.showSummaryBox = false;\n      this.canCollapseSummary = false;\n    }\n    generateSummary(currentUser, topicId) {\n      this.showSummaryBox = true;\n      if (this.text && !this.canRegenerate) {\n        this.canCollapseSummary = false;\n        return;\n      }\n      let fetchURL = `/discourse-ai/summarization/t/${topicId}?`;\n      if (currentUser) {\n        fetchURL += `stream=true`;\n        if (this.canRegenerate) {\n          fetchURL += \"&skip_age_check=true\";\n        }\n      }\n      this.loading = true;\n      return (0, _ajax.ajax)(fetchURL).then(data => {\n        if (!currentUser) {\n          data.done = true;\n          this.processUpdate(data);\n        }\n      }).catch(error => {\n        this.loading = false;\n        if ((0, _aiErrors.isAiCreditLimitError)(error)) {\n          (0, _aiErrors.popupAiCreditLimitError)(error);\n        } else {\n          throw error;\n        }\n      });\n    }\n  }\n  _exports.default = AiTopicSummary;\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/copy-conversation\", [\"exports\", \"discourse/lib/ajax\", \"discourse/lib/utilities\", \"discourse-i18n\"], function (_exports, _ajax, _utilities, _discourseI18n) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _default;\n  async function _default(topic, fromPostNumber, toPostNumber) {\n    await (0, _utilities.clipboardCopyAsync)(async () => {\n      const text = await generateClipboard(topic, fromPostNumber, toPostNumber);\n      return new Blob([text], {\n        type: \"text/plain\"\n      });\n    });\n  }\n  async function generateClipboard(topic, fromPostNumber, toPostNumber) {\n    const stream = topic.get(\"postStream\");\n    let postNumbers = [];\n    // simpler to understand than Array.from\n    for (let i = fromPostNumber; i <= toPostNumber; i++) {\n      postNumbers.push(i);\n    }\n    const postIds = postNumbers.map(postNumber => {\n      return stream.findPostIdForPostNumber(postNumber);\n    });\n\n    // we need raw to construct so post stream will not help\n\n    const url = `/t/${topic.id}/posts.json`;\n    const data = {\n      post_ids: postIds,\n      include_raw: true\n    };\n    const response = await (0, _ajax.ajax)(url, {\n      data\n    });\n    let buffer = [];\n    buffer.push(\"<details class='ai-quote'>\");\n    buffer.push(\"<summary>\");\n    buffer.push(`<span>${topic.title}</span>`);\n    buffer.push(`<span title='${(0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.ai_title\")}'>${(0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.ai_label\")}</span>`);\n    buffer.push(\"</summary>\");\n    response.post_stream.posts.forEach(post => {\n      buffer.push(\"\");\n      buffer.push(`**${post.username}:**`);\n      buffer.push(\"\");\n      buffer.push(post.raw);\n    });\n    buffer.push(\"</details>\");\n    const text = buffer.join(\"\\n\");\n    return text;\n  }\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/diff-streamer\", [\"exports\", \"@glimmer/tracking\", \"@ember/runloop\", \"discourse/lib/load-js-diff\", \"discourse/lib/utilities\"], function (_exports, _tracking, _runloop, _loadJsDiff, _utilities) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const DEFAULT_CHAR_TYPING_DELAY = 10;\n  const STREAMING_DIFF_TRUNCATE_THRESHOLD = 0.1;\n  const STREAMING_DIFF_TRUNCATE_BUFFER = 10;\n  const RUSH_MAX_TICKS = 10; // ≤ 10 visual diff refreshes\n  const RUSH_TICK_INTERVAL = 100; // 100 ms between them → ≤ 1 s total\n  class DiffStreamer {\n    static {\n      dt7948.g(this.prototype, \"isStreaming\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isStreaming = (dt7948.i(this, \"isStreaming\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"words\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #words = (dt7948.i(this, \"words\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"lastResultText\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #lastResultText = (dt7948.i(this, \"lastResultText\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"diff\", [_tracking.tracked], function () {\n        return this.selectedText;\n      });\n    }\n    #diff = (dt7948.i(this, \"diff\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"suggestion\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #suggestion = (dt7948.i(this, \"suggestion\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isDone\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isDone = (dt7948.i(this, \"isDone\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isThinking\", [_tracking.tracked], function () {\n        return true;\n      });\n    }\n    #isThinking = (dt7948.i(this, \"isThinking\"), void 0);\n    typingTimer = null;\n    currentWordIndex = 0;\n    currentCharIndex = 0;\n    jsDiff = null;\n    bufferedToken = null;\n    rushMode = false;\n    rushBatchSize = 1;\n    rushTicksLeft = 0;\n    receivedFinalUpdate = false;\n    /**\n    * Initializes the DiffStreamer with initial text and typing delay.\n    * @param {string} selectedText - The original text to diff against.\n    * @param {number} typingDelay - (Optional) character typing delay in ms.\n    */\n    constructor(selectedText, typingDelay) {\n      this.selectedText = selectedText;\n      this.typingDelay = typingDelay || DEFAULT_CHAR_TYPING_DELAY;\n      this.loadJSDiff();\n    }\n    /**\n    * Loads the jsDiff library asynchronously.\n    */\n    async loadJSDiff() {\n      this.jsDiff = await (0, _loadJsDiff.default)();\n    }\n    /**\n    * Main entry point for streaming updates from the backend.\n    * Handles both incremental and final updates.\n    * @param {object} result - The result object containing the new text and status\n    * @param {string} newTextKey - The key in result that holds the new text value (e.g. if the JSON is { text: \"Hello\", done: false }, newTextKey would be \"text\")\n    */\n    async updateResult(result, newTextKey) {\n      if (this.receivedFinalUpdate) {\n        return;\n      }\n      if (!this.jsDiff) {\n        await this.loadJSDiff();\n      }\n      this.isThinking = false;\n      const newText = result[newTextKey];\n      const gotDoneFlag = !!result?.done;\n      if (gotDoneFlag) {\n        this.receivedFinalUpdate = true;\n        if (this.typingTimer) {\n          (0, _runloop.cancel)(this.typingTimer);\n          this.typingTimer = null;\n        }\n        // flush buffered token so everything is renderable\n        if (this.bufferedToken) {\n          this.words.push(this.bufferedToken);\n          this.bufferedToken = null;\n        }\n        // tokenise whatever tail we haven’t processed yet\n        const tail = newText.slice(this.lastResultText.length);\n        if (tail.length) {\n          this.words.push(...this.#tokenize(tail));\n        }\n        const charsLeft = newText.length - this.suggestion.length;\n        if (charsLeft <= 0) {\n          this.suggestion = newText;\n          this.diff = this.#formatDiffWithTags(this.jsDiff.diffWordsWithSpace(this.selectedText, newText), false);\n          this.isStreaming = false;\n          this.isDone = true;\n          return;\n        }\n        this.rushBatchSize = Math.ceil(charsLeft / RUSH_MAX_TICKS);\n        this.rushTicksLeft = RUSH_MAX_TICKS;\n        this.rushMode = true;\n        this.isStreaming = true;\n        this.lastResultText = newText;\n        this.#streamNextChar();\n        return;\n      }\n      const delta = newText.slice(this.lastResultText.length);\n      if (!delta) {\n        this.lastResultText = newText;\n        return;\n      }\n      // combine any previous buffered token with new delta and retokenize\n      const combined = (this.bufferedToken || \"\") + delta;\n      const tokens = this.#tokenize(combined);\n      this.bufferedToken = tokens.pop() || null;\n      if (tokens.length) {\n        this.words.push(...tokens);\n      }\n      this.isStreaming = true;\n      if (!this.typingTimer) {\n        this.#streamNextChar();\n      }\n      this.lastResultText = newText;\n    }\n    /**\n    * Resets the streamer's internal state to allow reuse.\n    */\n    reset() {\n      this.diff = \"\";\n      this.suggestion = \"\";\n      this.lastResultText = \"\";\n      this.words = [];\n      this.currentWordIndex = 0;\n      this.currentCharIndex = 0;\n      this.bufferedToken = null;\n      this.isStreaming = false;\n      this.isDone = false;\n      this.receivedFinalUpdate = false;\n      this.isThinking = true;\n      this.rushMode = false;\n      this.rushBatchSize = 1;\n      this.rushTicksLeft = 0;\n      if (this.typingTimer) {\n        (0, _runloop.cancel)(this.typingTimer);\n        this.typingTimer = null;\n      }\n    }\n    /**\n    * Computes a truncated diff during streaming to avoid excessive churn.\n    * @param {string} original - The original text.\n    * @param {string} suggestion - The partially streamed suggestion.\n    * @returns {Array} Array of diff parts with `.added`, `.removed`, and `.value`.\n    */\n    streamingDiff(original, suggestion) {\n      const max = Math.floor(suggestion.length + suggestion.length * STREAMING_DIFF_TRUNCATE_THRESHOLD + STREAMING_DIFF_TRUNCATE_BUFFER);\n      const head = original.slice(0, max);\n      const tail = original.slice(max);\n      const output = this.jsDiff.diffWordsWithSpace(head, suggestion);\n      if (tail.length) {\n        let last = output.at(-1);\n        let secondLast = output.at(-2);\n        if (last.added && secondLast?.removed) {\n          output.splice(-2, 2, last, secondLast);\n          last = secondLast;\n        }\n        if (!last.removed) {\n          last = {\n            added: false,\n            removed: true,\n            value: \"\"\n          };\n          output.push(last);\n        }\n        last.value += tail;\n      }\n      return output;\n    }\n    /**\n    * Internal loop that emits the next character(s) to simulate typing.\n    * Works in both normal and rush mode.\n    */\n    #streamNextChar() {\n      if (!this.isStreaming) {\n        return;\n      }\n      const limit = this.rushMode ? this.rushBatchSize : 1;\n      let emitted = 0;\n      while (emitted < limit && this.currentWordIndex < this.words.length) {\n        const token = this.words[this.currentWordIndex];\n        this.suggestion += token.charAt(this.currentCharIndex);\n        this.currentCharIndex++;\n        emitted++;\n        if (this.currentCharIndex >= token.length) {\n          this.currentWordIndex++;\n          this.currentCharIndex = 0;\n        }\n      }\n      let refresh = false;\n      if (this.rushMode) {\n        if (this.rushTicksLeft > 0) {\n          this.rushTicksLeft--;\n          refresh = true;\n        }\n      } else {\n        refresh = this.currentCharIndex === 0;\n      }\n      if (refresh || this.currentWordIndex >= this.words.length) {\n        const useStreaming = this.currentWordIndex < this.words.length || this.rushMode;\n        this.diff = this.#formatDiffWithTags(useStreaming ? this.streamingDiff(this.selectedText, this.suggestion) : this.jsDiff.diffWordsWithSpace(this.selectedText, this.suggestion), !this.rushMode);\n      }\n      const doneStreaming = this.currentWordIndex >= this.words.length;\n      if (doneStreaming) {\n        this.isStreaming = false;\n        this.rushMode = false;\n        this.typingTimer = null;\n        if (this.receivedFinalUpdate) {\n          this.isDone = true;\n        }\n      } else {\n        const delay = this.rushMode ? RUSH_TICK_INTERVAL : this.typingDelay;\n        this.typingTimer = (0, _runloop.later)(this, this.#streamNextChar, delay);\n      }\n    }\n    /**\n    * Splits a string into tokens, preserving whitespace as separate entries.\n    * @param {string} text - The input string.\n    * @returns {Array} Array of tokens.\n    */\n    #tokenize(text) {\n      return text.split(/(?<=\\S)(?=\\s)/);\n    }\n    /**\n    * Wraps a chunk of text in appropriate HTML tags based on its diff type.\n    * @param {string} text - The text chunk.\n    * @param {string} type - The type: 'added', 'removed', or 'unchanged'.\n    * @returns {string} HTML string.\n    */\n    #wrapChunk(text, type) {\n      if (type === \"added\") {\n        return `<ins>${text}</ins>`;\n      }\n      if (type === \"removed\") {\n        return /^\\s+$/.test(text) ? \"\" : `<del>${text}</del>`;\n      }\n      return `<span>${text}</span>`;\n    }\n    /**\n    * Converts a diff array into a string of HTML with highlight markup.\n    * @param {Array} diffArray - The array from a diff function.\n    * @param {boolean} highlightLastWord - Whether to highlight the last non-removed word.\n    * @returns {string} HTML representation of the diff.\n    */\n    #formatDiffWithTags(diffArray, highlightLastWord = true) {\n      const words = [];\n      diffArray.forEach(part => (part.value.match(/\\S+|\\s+/g) || []).forEach(tok => words.push({\n        text: tok,\n        type: part.added ? \"added\" : part.removed ? \"removed\" : \"unchanged\"\n      })));\n      let lastIndex = -1;\n      if (highlightLastWord) {\n        for (let i = words.length - 1; i >= 0; i--) {\n          if (words[i].type !== \"removed\" && /\\S/.test(words[i].text)) {\n            lastIndex = i;\n            break;\n          }\n        }\n      }\n      const output = [];\n      for (let i = 0; i <= lastIndex; i++) {\n        let {\n          text,\n          type\n        } = words[i];\n        text = (0, _utilities.escapeExpression)(text);\n        if (/^\\s+$/.test(text)) {\n          output.push(text);\n          continue;\n        }\n        let chunk = this.#wrapChunk(text, type);\n        if (highlightLastWord && i === lastIndex) {\n          chunk = `<mark class=\"highlight\">${chunk}</mark>`;\n        }\n        output.push(chunk);\n      }\n      for (let i = lastIndex + 1; i < words.length;) {\n        const type = words[i].type;\n        let buf = \"\";\n        while (i < words.length && words[i].type === type) {\n          buf += words[i++].text;\n        }\n        output.push(this.#wrapChunk((0, _utilities.escapeExpression)(buf), type));\n      }\n      return output.join(\"\");\n    }\n  }\n  _exports.default = DiffStreamer;\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/show-ai-helper\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.showComposerAiHelper = showComposerAiHelper;\n  _exports.showPostAIHelper = showPostAIHelper;\n  function showComposerAiHelper(composerModel, siteSettings, currentUser, featureType) {\n    const enableHelper = _helperEnabled(siteSettings);\n    const enableAssistant = currentUser.can_use_assistant;\n    const canShowInPM = siteSettings.ai_helper_allowed_in_pm;\n    const enableFeature = siteSettings.ai_helper_enabled_features.includes(featureType);\n    if (composerModel?.privateMessage) {\n      return enableHelper && enableAssistant && canShowInPM && enableFeature;\n    }\n    return enableHelper && enableAssistant && enableFeature;\n  }\n  function showPostAIHelper(outletArgs, context) {\n    return _helperEnabled(context.siteSettings) && context.currentUser?.can_use_assistant_in_post;\n  }\n  function _helperEnabled(siteSettings) {\n    return siteSettings.discourse_ai_enabled && siteSettings.ai_helper_enabled;\n  }\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/smooth-streamer\", [\"exports\", \"@glimmer/tracking\", \"@ember/runloop\"], function (_exports, _tracking, _runloop) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const DEFAULT_TYPING_DELAY = 15;\n  /**\n   * SmoothStreamer provides a typing animation effect for streamed text updates.\n   */\n  class SmoothStreamer {\n    static {\n      dt7948.g(this.prototype, \"isStreaming\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #isStreaming = (dt7948.i(this, \"isStreaming\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"streamedText\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #streamedText = (dt7948.i(this, \"streamedText\"), void 0);\n    typingTimer = null;\n    streamedTextLength = 0;\n    /**\n    * @param {() => string} getRealtimeText - Function to retrieve the latest realtime text\n    * @param {(value: string) => void} setRealtimeText - Function to update the realtime text\n    * @param {number} [typingDelay] - Delay (in ms) between each character reveal\n    */\n    constructor(getRealtimeText, setRealtimeText, typingDelay) {\n      this.getRealtimeText = getRealtimeText;\n      this.setRealtimeText = setRealtimeText;\n      this.typingDelay = typingDelay || DEFAULT_TYPING_DELAY;\n    }\n    /**\n    * Retrieves the appropriate text: either the animated stream or the full realtime text.\n    * @returns {string}\n    */\n    get renderedText() {\n      return this.isStreaming ? this.streamedText : this.realtimeText;\n    }\n    /**\n    * Retrieves the current realtime text.\n    * @returns {string}\n    */\n    get realtimeText() {\n      return this.getRealtimeText();\n    }\n    /**\n    * Updates the realtime text.\n    * @param {string} value - The new text value\n    */\n    set realtimeText(value) {\n      this.setRealtimeText(value);\n    }\n    /**\n    * Resets the streaming state, clearing all animation progress.\n    */\n    resetStreaming() {\n      this.#cancelTypingTimer();\n      this.isStreaming = false;\n      this.streamedText = \"\";\n      this.streamedTextLength = 0;\n    }\n    /**\n    * Processes an update result (typically from MessageBus)\n    * either completing the stream or continuing animation.\n    * @param {object} result - The result object containing the new text and status\n    * @param {string} newTextKey - The key in result that holds the new text value (e.g. if the JSON is { text: \"Hello\", done: false }, newTextKey would be \"text\")\n    */\n    async updateResult(result, newTextKey) {\n      const newText = result[newTextKey];\n      if (result?.done) {\n        this.streamedText = newText;\n        this.realtimeText = newText;\n        this.isStreaming = false;\n        // Clear pending animations\n        this.#cancelTypingTimer();\n      } else if (newText.length > this.realtimeText.length) {\n        this.realtimeText = newText;\n        this.isStreaming = true;\n        await this.#onTextUpdate();\n      }\n    }\n    /**\n    * Types out the next character in the streaming text.\n    * Private method.\n    */\n    #typeCharacter() {\n      if (this.streamedTextLength < this.realtimeText.length) {\n        this.streamedText += this.realtimeText.charAt(this.streamedTextLength);\n        this.streamedTextLength++;\n        this.typingTimer = (0, _runloop.later)(this, this.#typeCharacter, this.typingDelay);\n      } else {\n        this.typingTimer = null;\n      }\n    }\n    /**\n    * Handles text updates and restarts the typing animation.\n    * Private method.\n    */\n    #onTextUpdate() {\n      this.#cancelTypingTimer();\n      this.#typeCharacter();\n    }\n    /**\n    * Cancels any pending typing animation.\n    * Private method.\n    */\n    #cancelTypingTimer() {\n      if (this.typingTimer) {\n        (0, _runloop.cancel)(this.typingTimer);\n      }\n    }\n  }\n  _exports.default = SmoothStreamer;\n});","define(\"discourse/plugins/discourse-ai/discourse/lib/utilities\", [\"exports\", \"@ember/template\", \"discourse/lib/utilities\"], function (_exports, _template, _utilities) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.jsonToHtml = jsonToHtml;\n  _exports.toPlainObject = toPlainObject;\n  /**\n   * Converts Immer proxy objects to plain JavaScript objects.\n   * FormKit uses Immer proxies which can cause issues when passed to certain handlers\n   * (like upload handlers). This function creates a deep clone without proxy wrappers.\n   *\n   * @param {any} obj - The object to convert (can be null/undefined)\n   * @returns {any} A plain JavaScript object without proxy wrappers\n   */\n  function toPlainObject(obj) {\n    if (!obj) {\n      return obj;\n    }\n    return JSON.parse(JSON.stringify(obj));\n  }\n  function jsonToHtml(json) {\n    if (json === null) {\n      return \"null\";\n    }\n    if (typeof json !== \"object\") {\n      return (0, _utilities.escapeExpression)(json);\n    }\n    let html = \"<ul>\";\n    for (let [key, value] of Object.entries(json)) {\n      html += \"<li>\";\n      key = (0, _utilities.escapeExpression)(key);\n      if (typeof value === \"object\" && Array.isArray(value)) {\n        html += `<strong>${key}:</strong> ${jsonToHtml(value)}`;\n      } else if (typeof value === \"object\") {\n        html += `<strong>${key}:</strong> <ul><li>${jsonToHtml(value)}</li></ul>`;\n      } else {\n        if (typeof value === \"string\") {\n          value = (0, _utilities.escapeExpression)(value).replace(/\\n/g, \"<br>\");\n        }\n        html += `<strong>${key}:</strong> ${value}`;\n      }\n      html += \"</li>\";\n    }\n    html += \"</ul>\";\n    return (0, _template.htmlSafe)(html);\n  }\n});","define(\"discourse/plugins/discourse-ai/discourse/routes/discourse-ai-bot-conversations\", [\"exports\", \"@ember/service\", \"discourse/routes/discourse\"], function (_exports, _service, _discourse) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class DiscourseAiBotConversationsRoute extends _discourse.default {\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    beforeModel(transition) {\n      if (!this.currentUser) {\n        transition.send(\"showLogin\");\n      }\n    }\n  }\n  _exports.default = DiscourseAiBotConversationsRoute;\n});","define(\"discourse/plugins/discourse-ai/discourse/routes/discourse-ai-shared-conversation-show\", [\"exports\", \"@ember/service\", \"discourse/routes/discourse\"], function (_exports, _service, _discourse) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class DiscourseAiSharedConversationShowRoute extends _discourse.default {\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    beforeModel(transition) {\n      if (this.currentUser?.user_option?.external_links_in_new_tab) {\n        window.open(transition.intent.url, \"_blank\");\n      } else {\n        this.redirect(transition.intent.url);\n      }\n      transition.abort();\n    }\n    redirect(url) {\n      window.location = url;\n    }\n  }\n  _exports.default = DiscourseAiSharedConversationShowRoute;\n});","define(\"discourse/plugins/discourse-ai/discourse/services/ai-bot-conversations-hidden-submit\", [\"exports\", \"@ember/object\", \"@ember/runloop\", \"@ember/service\", \"@ember-compat/tracked-built-ins\", \"discourse/lib/ajax\", \"discourse/lib/uploads\", \"discourse-i18n\"], function (_exports, _object, _runloop, _service, _trackedBuiltIns, _ajax, _uploads, _discourseI18n) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class AiBotConversationsHiddenSubmit extends _service.default {\n    static {\n      dt7948.g(this.prototype, \"appEvents\", [_service.service]);\n    }\n    #appEvents = (dt7948.i(this, \"appEvents\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"composer\", [_service.service]);\n    }\n    #composer = (dt7948.i(this, \"composer\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"dialog\", [_service.service]);\n    }\n    #dialog = (dt7948.i(this, \"dialog\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"siteSettings\", [_service.service]);\n    }\n    #siteSettings = (dt7948.i(this, \"siteSettings\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loading\", [_trackedBuiltIns.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    personaId;\n    targetUsername;\n    inputValue = \"\";\n    focusInput() {\n      this.composer.destroyDraft();\n      this.composer.close();\n      (0, _runloop.next)(() => {\n        document.getElementById(\"ai-bot-conversations-input\").focus();\n      });\n    }\n    static {\n      dt7948.n(this.prototype, \"focusInput\", [_object.action]);\n    }\n    async submitToBot(uploadData) {\n      if (this.inputValue.length < this.siteSettings.min_personal_message_post_length) {\n        return this.dialog.alert({\n          message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.conversations.min_input_length_message\", {\n            count: this.siteSettings.min_personal_message_post_length\n          }),\n          didConfirm: () => this.focusInput(),\n          didCancel: () => this.focusInput()\n        });\n      }\n\n      // Don't submit if there are still uploads in progress\n      if (uploadData.inProgressUploadsCount > 0) {\n        return this.dialog.alert({\n          message: (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.conversations.uploads_in_progress\")\n        });\n      }\n      this.loading = true;\n      const title = (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.default_pm_prefix\");\n\n      // Prepare the raw content with any uploads appended\n      let rawContent = this.inputValue;\n\n      // Append upload markdown if we have uploads\n      if (uploadData.uploads && uploadData.uploads.length > 0) {\n        rawContent += \"\\n\\n\";\n        uploadData.uploads.forEach(upload => {\n          const uploadMarkdown = (0, _uploads.getUploadMarkdown)(upload);\n          rawContent += uploadMarkdown + \"\\n\";\n        });\n      }\n      try {\n        const response = await (0, _ajax.ajax)(\"/posts.json\", {\n          method: \"POST\",\n          data: {\n            raw: rawContent,\n            title,\n            archetype: \"private_message\",\n            target_recipients: this.targetUsername,\n            meta_data: {\n              ai_persona_id: this.personaId\n            }\n          }\n        });\n\n        // Reset uploads after successful submission\n        this.inputValue = \"\";\n        this.appEvents.trigger(\"discourse-ai:bot-pm-created\", {\n          id: response.topic_id,\n          slug: response.topic_slug,\n          title\n        });\n        this.router.transitionTo(response.post_url);\n      } finally {\n        this.loading = false;\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"submitToBot\", [_object.action]);\n    }\n  }\n  _exports.default = AiBotConversationsHiddenSubmit;\n});","define(\"discourse/plugins/discourse-ai/discourse/services/ai-conversations-sidebar-manager\", [\"exports\", \"@glimmer/tracking\", \"@ember/runloop\", \"@ember/service\", \"@ember/template\", \"@ember-compat/tracked-built-ins\", \"discourse/lib/ajax\", \"discourse/lib/debounce\", \"discourse/lib/formatter\", \"discourse/lib/sidebar/panels\", \"discourse/lib/utilities\", \"discourse-i18n\", \"discourse/plugins/discourse-ai/discourse/components/ai-bot-sidebar-empty-state\"], function (_exports, _tracking, _runloop, _service, _template, _trackedBuiltIns, _ajax, _debounce, _formatter, _panels, _utilities, _discourseI18n, _aiBotSidebarEmptyState) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _exports.AI_CONVERSATIONS_PANEL = void 0;\n  const AI_CONVERSATIONS_PANEL = _exports.AI_CONVERSATIONS_PANEL = \"ai-conversations\";\n  const SCROLL_BUFFER = 100;\n  const DEBOUNCE = 100;\n  const TITLE_CHANNEL = `/discourse-ai/ai-bot/topic-titles`;\n  class AiConversationsSidebarManager extends _service.default {\n    static {\n      dt7948.g(this.prototype, \"appEvents\", [_service.service]);\n    }\n    #appEvents = (dt7948.i(this, \"appEvents\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"sidebarState\", [_service.service]);\n    }\n    #sidebarState = (dt7948.i(this, \"sidebarState\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"messageBus\", [_service.service]);\n    }\n    #messageBus = (dt7948.i(this, \"messageBus\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"routeHistory\", [_service.service]);\n    }\n    #routeHistory = (dt7948.i(this, \"routeHistory\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"topics\", [_tracking.tracked], function () {\n        return [];\n      });\n    }\n    #topics = (dt7948.i(this, \"topics\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"sections\", [_tracking.tracked], function () {\n        return new _trackedBuiltIns.TrackedArray();\n      });\n    }\n    #sections = (dt7948.i(this, \"sections\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"isLoading\", [_tracking.tracked], function () {\n        return true;\n      });\n    }\n    #isLoading = (dt7948.i(this, \"isLoading\"), void 0);\n    api = null;\n    isFetching = false;\n    page = 0;\n    hasMore = true;\n    _registered = new Set();\n    _hasScrollListener = false;\n    _scrollElement = null;\n    _didInit = false;\n    _debouncedScrollHandler = () => {\n      (0, _debounce.default)(this, () => {\n        const element = this._scrollElement;\n        if (!element) {\n          return;\n        }\n        const {\n          scrollTop,\n          scrollHeight,\n          clientHeight\n        } = element;\n        if (scrollHeight - scrollTop - clientHeight - SCROLL_BUFFER < 100 && !this.isFetching && this.hasMore) {\n          this.fetchMessages();\n        }\n      }, DEBOUNCE);\n    };\n    constructor() {\n      super(...arguments);\n      this.appEvents.on(\"discourse-ai:bot-pm-created\", this, this._handleNewBotPM);\n      this.appEvents.on(\"discourse-ai:conversations-sidebar-updated\", this, this._attachScrollListener);\n      this._watchForTitleUpdates();\n    }\n    willDestroy() {\n      super.willDestroy(...arguments);\n      this.appEvents.off(\"discourse-ai:bot-pm-created\", this, this._handleNewBotPM);\n      this.appEvents.off(\"discourse-ai:conversations-sidebar-updated\", this, this._attachScrollListener);\n      this.messageBus.unsubscribe(TITLE_CHANNEL);\n    }\n    addEmptyStateClass() {\n      document.body.classList.toggle(\"has-empty-ai-conversations-sidebar\", !this.topics.length);\n    }\n    forceCustomSidebar() {\n      document.body.classList.add(\"has-ai-conversations-sidebar\");\n      if (!this.sidebarState.isForcingSidebar) {\n        this.appEvents.trigger(\"discourse-ai:force-conversations-sidebar\");\n      }\n      this.sidebarState.isForcingSidebar = true;\n\n      // calling this before fetching data\n      // helps avoid flash of main sidebar mode\n      this.sidebarState.setPanel(AI_CONVERSATIONS_PANEL);\n      this.sidebarState.setSeparatedMode();\n      this.sidebarState.hideSwitchPanelButtons();\n\n      // don't render sidebar multiple times\n      if (this._didInit) {\n        this.addEmptyStateClass();\n        return true;\n      }\n      this._didInit = true;\n      this.fetchMessages().then(() => {\n        this.sidebarState.setPanel(AI_CONVERSATIONS_PANEL);\n        this.addEmptyStateClass();\n      });\n      return true;\n    }\n    _attachScrollListener() {\n      const sections = document.querySelector(\".sidebar-sections.ai-conversations-panel\");\n      this._scrollElement = sections;\n      if (this._hasScrollListener || !this._scrollElement) {\n        return;\n      }\n      sections.addEventListener(\"scroll\", this._debouncedScrollHandler);\n      this._hasScrollListener = true;\n    }\n    _removeScrollListener() {\n      if (this._hasScrollListener) {\n        this._scrollElement.removeEventListener(\"scroll\", this._debouncedScrollHandler);\n        this._hasScrollListener = false;\n        this._scrollElement = null;\n      }\n    }\n    stopForcingCustomSidebar() {\n      document.body.classList.remove(\"has-ai-conversations-sidebar\");\n      document.body.classList.remove(\"has-empty-ai-conversations-sidebar\");\n\n      // Only reset if no other route has claimed the sidebar in its activate() hook\n      const isStillAiPanel = this.sidebarState.currentPanel?.key === AI_CONVERSATIONS_PANEL;\n      if (this.sidebarState.isForcingSidebar && isStillAiPanel) {\n        this.sidebarState.setPanel(_panels.MAIN_PANEL);\n        this.sidebarState.isForcingSidebar = false;\n        this.appEvents.trigger(\"discourse-ai:stop-forcing-conversations-sidebar\");\n      }\n      this._removeScrollListener();\n    }\n    get lastKnownAppURL() {\n      const lastForumUrl = this.routeHistory.history.find(url => {\n        return !url.startsWith(\"/discourse-ai\");\n      });\n      return lastForumUrl || this.router.urlFor(`discovery.${(0, _utilities.defaultHomepage)()}`);\n    }\n    async fetchMessages() {\n      if (this.isFetching || !this.hasMore) {\n        return;\n      }\n      const isFirstPage = this.page === 0;\n      this.isFetching = true;\n      try {\n        let {\n          conversations,\n          meta\n        } = await (0, _ajax.ajax)(\"/discourse-ai/ai-bot/conversations.json\", {\n          data: {\n            page: this.page,\n            per_page: 40\n          }\n        });\n        if (isFirstPage) {\n          this.topics = conversations;\n        } else {\n          this.topics = [...this.topics, ...conversations];\n          // force rerender when fetching more messages\n          this.sidebarState.setPanel(AI_CONVERSATIONS_PANEL);\n        }\n        this.page += 1;\n        this.hasMore = meta.has_more;\n        this._rebuildSections();\n      } finally {\n        this.isFetching = false;\n        this.isLoading = false;\n      }\n    }\n    _handleNewBotPM(topic) {\n      this.topics = [topic, ...this.topics];\n      this._rebuildSections();\n    }\n    _watchForTitleUpdates() {\n      this.messageBus.subscribe(TITLE_CHANNEL, payload => {\n        this._applyTitleUpdate(payload.topic_id, payload.title);\n      });\n    }\n    _applyTitleUpdate(topicId, newTitle) {\n      this.topics = this.topics.map(t => t.id === topicId ? {\n        ...t,\n        title: newTitle\n      } : t);\n      this._rebuildSections();\n    }\n\n    // organize by date and create a section for each date group\n    _rebuildSections() {\n      const now = Date.now();\n      const fresh = [];\n      const todaySection = {\n        name: \"today\",\n        title: (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.conversations.today\"),\n        links: new _trackedBuiltIns.TrackedArray()\n      };\n      fresh.push(todaySection);\n      this.topics.forEach(t => {\n        const postedAtMs = new Date(t.last_posted_at || now).valueOf();\n        const diffDays = Math.floor((now - postedAtMs) / 86400000);\n        let dateGroup;\n        if (diffDays <= 1) {\n          dateGroup = \"today\";\n        } else if (diffDays <= 7) {\n          dateGroup = \"last-7-days\";\n        } else if (diffDays <= 30) {\n          dateGroup = \"last-30-days\";\n        } else {\n          const d = new Date(postedAtMs);\n          const key = `${d.getFullYear()}-${d.getMonth()}`;\n          dateGroup = key;\n        }\n        let sec;\n        if (dateGroup === \"today\") {\n          sec = todaySection;\n        } else {\n          sec = fresh.find(s => s.name === dateGroup);\n        }\n        if (!sec) {\n          let title;\n          switch (dateGroup) {\n            case \"last-7-days\":\n              title = (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.conversations.last_7_days\");\n              break;\n            case \"last-30-days\":\n              title = (0, _discourseI18n.i18n)(\"discourse_ai.ai_bot.conversations.last_30_days\");\n              break;\n            default:\n              title = (0, _formatter.autoUpdatingRelativeAge)(new Date(t.last_posted_at));\n          }\n          sec = {\n            name: dateGroup,\n            title,\n            links: new _trackedBuiltIns.TrackedArray()\n          };\n          fresh.push(sec);\n        }\n        sec.links.push({\n          key: t.id,\n          route: \"topic.fromParamsNear\",\n          models: [t.slug, t.id, t.last_read_post_number || 0],\n          title: t.title,\n          text: t.title,\n          classNames: `ai-conversation-${t.id}`\n        });\n      });\n      this.sections = new _trackedBuiltIns.TrackedArray(fresh);\n\n      // register each new section once\n      for (let sec of fresh) {\n        if (this._registered.has(sec.name)) {\n          continue;\n        }\n        this._registered.add(sec.name);\n        this.api.addSidebarSection(BaseCustomSidebarSection => {\n          return class extends BaseCustomSidebarSection {\n            static {\n              dt7948.g(this.prototype, \"manager\", [(0, _service.service)(\"ai-conversations-sidebar-manager\")]);\n            }\n            #manager = (dt7948.i(this, \"manager\"), void 0);\n            static {\n              dt7948.g(this.prototype, \"events\", [(0, _service.service)(\"appEvents\")]);\n            }\n            #events = (dt7948.i(this, \"events\"), void 0);\n            constructor() {\n              super(...arguments);\n              (0, _runloop.scheduleOnce)(\"afterRender\", this, this.triggerEvent);\n            }\n            triggerEvent() {\n              this.events.trigger(\"discourse-ai:conversations-sidebar-updated\");\n            }\n            get name() {\n              return sec.name;\n            }\n            get title() {\n              return sec.title;\n            }\n            get text() {\n              return (0, _template.htmlSafe)(sec.title);\n            }\n            get links() {\n              return this.manager.sections.find(s => s.name === sec.name)?.links || [];\n            }\n            get emptyStateComponent() {\n              if (!this.manager.isLoading && this.links.length === 0) {\n                return _aiBotSidebarEmptyState.default;\n              }\n            }\n          };\n        }, AI_CONVERSATIONS_PANEL);\n      }\n    }\n  }\n  _exports.default = AiConversationsSidebarManager;\n});","define(\"discourse/plugins/discourse-ai/discourse/services/ai-credits\", [\"exports\", \"@ember/service\", \"discourse/lib/ajax\", \"discourse/plugins/discourse-ai/discourse/lib/ai-errors\"], function (_exports, _service, _ajax, _aiErrors) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  /**\n   * Service for checking AI credit status across features.\n   * Caching is handled server-side via Discourse.cache and HTTP cache headers.\n   *\n   * @class AiCreditsService\n   */\n  class AiCredits extends _service.default {\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0);\n    // Only used for deduplicating concurrent in-flight requests\n    #pendingRequests = new Map();\n\n    /**\n     * Check credit status for specific persona IDs.\n     *\n     * @param {number[]} personaIds - Array of persona IDs to check\n     * @returns {Promise<Object>} - Credit status keyed by persona_id\n     */\n    async checkPersonaCredits(personaIds) {\n      const result = await this.#fetchStatus({\n        persona_ids: personaIds\n      });\n      return result.personas || {};\n    }\n\n    /**\n     * Check credit status for specific features.\n     *\n     * @param {string[]} featureNames - Array of feature names\n     * @returns {Promise<Object>} - Credit status keyed by feature name\n     */\n    async checkFeatureCredits(featureNames) {\n      const result = await this.#fetchStatus({\n        features: featureNames\n      });\n      return result.features || {};\n    }\n\n    /**\n     * Check if a specific persona has credits available.\n     *\n     * @param {number} personaId - The persona ID to check\n     * @returns {Promise<boolean>} - True if credits are available\n     */\n    async isPersonaCreditAvailable(personaId) {\n      const result = await this.checkPersonaCredits([personaId]);\n      const status = result[personaId];\n      return status?.credit_status?.available ?? true;\n    }\n\n    /**\n     * Check if a specific feature has credits available.\n     *\n     * @param {string} featureName - The feature name to check\n     * @returns {Promise<boolean>} - True if credits are available\n     */\n    async isFeatureCreditAvailable(featureName) {\n      const result = await this.checkFeatureCredits([featureName]);\n      const status = result[featureName];\n      return status?.credit_status?.available ?? true;\n    }\n\n    /**\n     * Get detailed credit status for a persona.\n     *\n     * @param {number} personaId - The persona ID\n     * @returns {Promise<Object|null>} - Full credit status object or null\n     */\n    async getPersonaCreditStatus(personaId) {\n      const result = await this.checkPersonaCredits([personaId]);\n      return result[personaId]?.credit_status || null;\n    }\n\n    /**\n     * Get detailed credit status for a feature.\n     *\n     * @param {string} featureName - The feature name\n     * @returns {Promise<Object|null>} - Full credit status object or null\n     */\n    async getFeatureCreditStatus(featureName) {\n      const result = await this.checkFeatureCredits([featureName]);\n      return result[featureName]?.credit_status || null;\n    }\n\n    /**\n     * Check credit status for specific LLM model IDs.\n     *\n     * @param {number[]} llmModelIds - Array of LLM model IDs to check\n     * @returns {Promise<Object>} - Credit status keyed by llm_model_id\n     */\n    async checkLlmModelCredits(llmModelIds) {\n      const result = await this.#fetchStatus({\n        llm_model_ids: llmModelIds\n      });\n      return result.llm_models || {};\n    }\n\n    /**\n     * Get detailed credit status for an LLM model.\n     *\n     * @param {number} llmModelId - The LLM model ID\n     * @returns {Promise<Object|null>} - Full credit status object or null\n     */\n    async getLlmModelCreditStatus(llmModelId) {\n      const result = await this.checkLlmModelCredits([llmModelId]);\n      return result[llmModelId]?.credit_status || null;\n    }\n\n    /**\n     * Get error message for credit limit based on user type.\n     * Returns a raw string - wrap with htmlSafe() if needed for templates.\n     *\n     * @param {Object} creditStatus - Credit status object with reset times\n     * @returns {string} - Localized error message\n     */\n    getCreditLimitMessage(creditStatus) {\n      const resetTime = creditStatus?.reset_time_formatted || creditStatus?.reset_time_absolute;\n      return (0, _aiErrors.getAiCreditLimitMessage)({\n        resetTime,\n        isAdmin: this.currentUser?.admin\n      });\n    }\n\n    /**\n     * Fetches credit status from the API with request deduplication.\n     * Automatically cleans up pending requests when complete or on error.\n     * Caching is handled server-side via Discourse.cache and HTTP cache headers.\n     *\n     * @private\n     * @param {Object} params - Request parameters\n     * @param {number[]} [params.persona_ids] - Array of persona IDs to check\n     * @param {string[]} [params.features] - Array of feature names to check\n     * @param {number[]} [params.llm_model_ids] - Array of LLM model IDs to check\n     * @returns {Promise<Object>} Promise resolving to credit status object\n     */\n    async #fetchStatus(params) {\n      const cacheKey = JSON.stringify(params);\n\n      // Deduplicate concurrent in-flight requests\n      if (this.#pendingRequests.has(cacheKey)) {\n        return this.#pendingRequests.get(cacheKey);\n      }\n      const request = (0, _ajax.ajax)(\"/discourse-ai/credits/status\", {\n        type: \"GET\",\n        data: params\n      }).then(result => {\n        this.#pendingRequests.delete(cacheKey);\n        return result;\n      }).catch(error => {\n        this.#pendingRequests.delete(cacheKey);\n        throw error;\n      });\n      this.#pendingRequests.set(cacheKey, request);\n      return request;\n    }\n  }\n  _exports.default = AiCredits;\n});","define(\"discourse/plugins/discourse-ai/discourse/services/discobot-discoveries\", [\"exports\", \"@glimmer/tracking\", \"@ember/object\", \"@ember/runloop\", \"@ember/service\", \"discourse/lib/ajax\", \"discourse/plugins/discourse-ai/discourse/lib/smooth-streamer\"], function (_exports, _tracking, _object, _runloop, _service, _ajax, _smoothStreamer3) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  const DISCOVERY_TIMEOUT_MS = 20000;\n  class DiscobotDiscoveries extends _service.default {\n    static {\n      dt7948.g(this.prototype, \"currentUser\", [_service.service]);\n    }\n    #currentUser = (dt7948.i(this, \"currentUser\"), void 0); // We use this to retain state after search menu gets closed.\n    // Similar to discourse/discourse#25504\n    static {\n      dt7948.g(this.prototype, \"discovery\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #discovery = (dt7948.i(this, \"discovery\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"lastQuery\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #lastQuery = (dt7948.i(this, \"lastQuery\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"discoveryTimedOut\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #discoveryTimedOut = (dt7948.i(this, \"discoveryTimedOut\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"modelUsed\", [_tracking.tracked], function () {\n        return \"\";\n      });\n    }\n    #modelUsed = (dt7948.i(this, \"modelUsed\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loadingDiscoveries\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loadingDiscoveries = (dt7948.i(this, \"loadingDiscoveries\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"smoothStreamer\", [_tracking.tracked], function () {\n        return new _smoothStreamer3.default(() => this.discovery, newValue => this.discovery = newValue);\n      });\n    }\n    #smoothStreamer = (dt7948.i(this, \"smoothStreamer\"), void 0);\n    discoveryTimeout = null;\n    async onDiscoveryUpdate(update) {\n      if (this.discoveryTimeout) {\n        (0, _runloop.cancel)(this.discoveryTimeout);\n      }\n      if (!this.discovery) {\n        this.discovery = \"\";\n      }\n      this.modelUsed = update.model_used;\n      this.loadingDiscoveries = false;\n      this.smoothStreamer.updateResult(update, \"ai_discover_reply\");\n    }\n    resetDiscovery() {\n      this.loadingDiscoveries = false;\n      this.discovery = \"\";\n      this.discoveryTimedOut = false;\n      this.modelUsed = \"\";\n      this.smoothStreamer.resetStreaming();\n    }\n    get showDiscoveryTitle() {\n      return this.discovery.length > 0 || this.loadingDiscoveries || this.discoveryTimedOut;\n    }\n    get isStreaming() {\n      return this.smoothStreamer.isStreaming;\n    }\n    get streamedText() {\n      return this.smoothStreamer?.renderedText;\n    }\n    async disableDiscoveries() {\n      this.currentUser.user_option.ai_search_discoveries = false;\n      await this.currentUser.save([\"ai_search_discoveries\"]);\n      location.reload();\n    }\n    static {\n      dt7948.n(this.prototype, \"disableDiscoveries\", [_object.action]);\n    }\n    async triggerDiscovery(query) {\n      if (this.lastQuery === query) {\n        return;\n      }\n      this.resetDiscovery();\n      if (query?.length === 0) {\n        return;\n      }\n      this.loadingDiscoveries = true;\n      this.discoveryTimeout = (0, _runloop.later)(this, this.timeoutDiscovery, DISCOVERY_TIMEOUT_MS);\n      try {\n        this.lastQuery = query;\n        await (0, _ajax.ajax)(\"/discourse-ai/discoveries/reply\", {\n          data: {\n            query\n          }\n        });\n      } catch {\n        this.timeoutDiscovery();\n      }\n    }\n    static {\n      dt7948.n(this.prototype, \"triggerDiscovery\", [_object.action]);\n    }\n    timeoutDiscovery() {\n      if (this.discovery?.length > 0) {\n        return;\n      }\n      this.loadingDiscoveries = false;\n      this.discovery = \"\";\n      this.discoveryTimedOut = true;\n    }\n  }\n  _exports.default = DiscobotDiscoveries;\n});","define(\"discourse/plugins/discourse-ai/discourse/services/gists\", [\"exports\", \"@glimmer/tracking\", \"@ember/service\"], function (_exports, _tracking, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = _exports.TABLE_LAYOUT = _exports.TABLE_AI_LAYOUT = void 0;\n  const TOPIC_LIST_LAYOUT_KEY = \"topicListLayout\";\n  const DEPRECATED_PM_TOPIC_LIST_LAYOUT_KEY = \"pmTopicListLayout\";\n  const TABLE_LAYOUT = _exports.TABLE_LAYOUT = \"table\";\n  const TABLE_AI_LAYOUT = _exports.TABLE_AI_LAYOUT = \"table-ai\";\n  class Gists extends _service.default {\n    static {\n      dt7948.g(this.prototype, \"router\", [_service.service]);\n    }\n    #router = (dt7948.i(this, \"router\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"preference\", [_tracking.tracked], function () {\n        return this.#loadPreference();\n      });\n    }\n    #preference = (dt7948.i(this, \"preference\"), void 0);\n    #loadPreference() {\n      // Migrate from old PM-specific key if it exists and main key doesn't\n      const oldPmPreference = localStorage.getItem(DEPRECATED_PM_TOPIC_LIST_LAYOUT_KEY);\n      const currentPreference = localStorage.getItem(TOPIC_LIST_LAYOUT_KEY);\n      if (oldPmPreference && !currentPreference) {\n        // Migrate the PM preference to the unified key\n        localStorage.setItem(TOPIC_LIST_LAYOUT_KEY, oldPmPreference);\n        localStorage.removeItem(DEPRECATED_PM_TOPIC_LIST_LAYOUT_KEY);\n        return oldPmPreference;\n      } else if (oldPmPreference) {\n        // Just clean up the old key if main key exists\n        localStorage.removeItem(DEPRECATED_PM_TOPIC_LIST_LAYOUT_KEY);\n      }\n      return currentPreference;\n    }\n    get routerAttributes() {\n      return this.router.currentRoute.attributes;\n    }\n    get topics() {\n      // covers discovery, filter, and pm routes\n      const listTopics = this.routerAttributes?.list?.topics;\n      if (listTopics) {\n        return listTopics;\n      }\n      const directTopics = this.routerAttributes?.topics;\n      if (directTopics) {\n        return directTopics;\n      }\n      const topic = this.routerAttributes?.topic;\n      if (!topic) {\n        return null;\n      }\n      const relatedTopics = topic.relatedTopics;\n      if (relatedTopics?.length) {\n        return relatedTopics;\n      }\n      const suggestedTopics = topic.suggestedTopics;\n      if (suggestedTopics?.length) {\n        return suggestedTopics;\n      }\n      return null;\n    }\n    get showToggle() {\n      return this.topics?.some(topic => topic.ai_topic_gist);\n    }\n    get currentPreference() {\n      return this.preference;\n    }\n    setPreference(value) {\n      this.preference = value;\n      localStorage.setItem(TOPIC_LIST_LAYOUT_KEY, value);\n    }\n  }\n  _exports.default = Gists;\n});","define(\"discourse/plugins/discourse-ai/discourse/services/image-caption-popup\", [\"exports\", \"@glimmer/tracking\", \"@ember/service\", \"discourse/lib/uploads\"], function (_exports, _tracking, _service, _uploads) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class ImageCaptionPopup extends _service.default {\n    static {\n      dt7948.g(this.prototype, \"composer\", [_service.service]);\n    }\n    #composer = (dt7948.i(this, \"composer\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"appEvents\", [_service.service]);\n    }\n    #appEvents = (dt7948.i(this, \"appEvents\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"showPopup\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #showPopup = (dt7948.i(this, \"showPopup\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"imageIndex\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #imageIndex = (dt7948.i(this, \"imageIndex\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"imageSrc\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #imageSrc = (dt7948.i(this, \"imageSrc\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"newCaption\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #newCaption = (dt7948.i(this, \"newCaption\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"popupTrigger\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #popupTrigger = (dt7948.i(this, \"popupTrigger\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"_request\", [_tracking.tracked], function () {\n        return null;\n      });\n    }\n    #_request = (dt7948.i(this, \"_request\"), void 0);\n    updateCaption() {\n      const matchingPlaceholder = this.composer.model.reply.match(_uploads.IMAGE_MARKDOWN_REGEX);\n      if (matchingPlaceholder) {\n        const match = matchingPlaceholder[this.imageIndex];\n        const replacement = match.replace(_uploads.IMAGE_MARKDOWN_REGEX, `![${this.newCaption}|$2$3$4]($5)`);\n        if (match) {\n          this.appEvents.trigger(\"composer:replace-text\", match, replacement);\n        }\n      }\n    }\n    toggleLoadingState(loading) {\n      if (loading) {\n        this.popupTrigger?.classList.add(\"disabled\");\n        return this.loading = true;\n      }\n      this.popupTrigger?.classList.remove(\"disabled\");\n      return this.loading = false;\n    }\n  }\n  _exports.default = ImageCaptionPopup;\n});","define(\"discourse/plugins/discourse-ai/discourse/services/quick-search\", [\"exports\", \"@glimmer/tracking\", \"@ember/service\"], function (_exports, _tracking, _service) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  class QuickSearch extends _service.default {\n    static {\n      dt7948.g(this.prototype, \"loading\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #loading = (dt7948.i(this, \"loading\"), void 0);\n    static {\n      dt7948.g(this.prototype, \"invalidTerm\", [_tracking.tracked], function () {\n        return false;\n      });\n    }\n    #invalidTerm = (dt7948.i(this, \"invalidTerm\"), void 0);\n  }\n  _exports.default = QuickSearch;\n});","define(\"discourse/plugins/discourse-ai/discourse/templates/admin/dashboard-sentiment\", [\"exports\", \"@ember/routing\", \"discourse/admin/components/admin-report\", \"discourse/admin/components/dashboard-period-selector\", \"discourse/float-kit/components/d-tooltip\", \"discourse/helpers/d-icon\", \"discourse-i18n\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _routing, _adminReport, _dashboardPeriodSelector, _dTooltip, _dIcon, _discourseI18n, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <div class=\"sentiment section\">\n    <div class=\"period-section\">\n      <div class=\"section-title\">\n        <h2 id=\"sentiment-heading\">\n          {{i18n \"discourse_ai.sentiments.dashboard.title\"}}\n        </h2>\n  \n        <DashboardPeriodSelector\n          @period={{@controller.period}}\n          @setPeriod={{@controller.setPeriod}}\n          @startDate={{@controller.startDate}}\n          @endDate={{@controller.endDate}}\n          @setCustomDateRange={{@controller.setCustomDateRange}}\n        />\n      </div>\n    </div>\n  \n    <div class=\"section-body\">\n      <div class=\"charts\">\n        <AdminReport\n          @dataSourceName=\"overall_sentiment\"\n          @filters={{@controller.filters}}\n          @showHeader={{true}}\n        />\n        <div class=\"admin-report activity-metrics\">\n          <div class=\"header\">\n            <ul class=\"breadcrumb\">\n              <li class=\"item report\">\n                <LinkTo @route=\"adminReports\" class=\"report-url\">\n                  {{i18n \"admin.dashboard.emotion.title\"}}\n                </LinkTo>\n                <DTooltip @interactive=\"true\">\n                  <:trigger>\n                    {{icon \"circle-question\"}}\n                  </:trigger>\n                  <:content>\n                    <span>{{i18n \"admin.dashboard.emotion.description\"}}</span>\n                  </:content>\n                </DTooltip>\n              </li>\n            </ul>\n          </div>\n          <div class=\"report-body\">\n            <div class=\"counters-list\">\n              <div class=\"counters-header\">\n                <div class=\"counters-cell\"></div>\n                <div class=\"counters-cell\">{{i18n\n                    \"admin.dashboard.reports.today\"\n                  }}</div>\n                <div class=\"counters-cell\">{{i18n\n                    \"admin.dashboard.reports.yesterday\"\n                  }}</div>\n                <div class=\"counters-cell\">{{i18n\n                    \"admin.dashboard.reports.last_7_days\"\n                  }}</div>\n                <div class=\"counters-cell\">{{i18n\n                    \"admin.dashboard.reports.last_30_days\"\n                  }}</div>\n              </div>\n              {{#each @controller.emotions as |metric|}}\n                <AdminReport\n                  @showHeader={{false}}\n                  @filters={{@controller.emotionFilters}}\n                  @forcedModes=\"emotion\"\n                  @dataSourceName=\"emotion_{{metric}}\"\n                />\n              {{/each}}\n            </div>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n  */\n  {\n    \"id\": \"thTG8SJ+\",\n    \"block\": \"[[[10,0],[14,0,\\\"sentiment section\\\"],[12],[1,\\\"\\\\n  \\\"],[10,0],[14,0,\\\"period-section\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"section-title\\\"],[12],[1,\\\"\\\\n      \\\"],[10,\\\"h2\\\"],[14,1,\\\"sentiment-heading\\\"],[12],[1,\\\"\\\\n        \\\"],[1,[28,[32,0],[\\\"discourse_ai.sentiments.dashboard.title\\\"],null]],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n\\\\n      \\\"],[8,[32,1],null,[[\\\"@period\\\",\\\"@setPeriod\\\",\\\"@startDate\\\",\\\"@endDate\\\",\\\"@setCustomDateRange\\\"],[[30,1,[\\\"period\\\"]],[30,1,[\\\"setPeriod\\\"]],[30,1,[\\\"startDate\\\"]],[30,1,[\\\"endDate\\\"]],[30,1,[\\\"setCustomDateRange\\\"]]]],null],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\\n  \\\"],[10,0],[14,0,\\\"section-body\\\"],[12],[1,\\\"\\\\n    \\\"],[10,0],[14,0,\\\"charts\\\"],[12],[1,\\\"\\\\n      \\\"],[8,[32,2],null,[[\\\"@dataSourceName\\\",\\\"@filters\\\",\\\"@showHeader\\\"],[\\\"overall_sentiment\\\",[30,1,[\\\"filters\\\"]],true]],null],[1,\\\"\\\\n      \\\"],[10,0],[14,0,\\\"admin-report activity-metrics\\\"],[12],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"header\\\"],[12],[1,\\\"\\\\n          \\\"],[10,\\\"ul\\\"],[14,0,\\\"breadcrumb\\\"],[12],[1,\\\"\\\\n            \\\"],[10,\\\"li\\\"],[14,0,\\\"item report\\\"],[12],[1,\\\"\\\\n              \\\"],[8,[32,3],[[24,0,\\\"report-url\\\"]],[[\\\"@route\\\"],[\\\"adminReports\\\"]],[[\\\"default\\\"],[[[[1,\\\"\\\\n                \\\"],[1,[28,[32,0],[\\\"admin.dashboard.emotion.title\\\"],null]],[1,\\\"\\\\n              \\\"]],[]]]]],[1,\\\"\\\\n              \\\"],[8,[32,4],null,[[\\\"@interactive\\\"],[\\\"true\\\"]],[[\\\"trigger\\\",\\\"content\\\"],[[[[1,\\\"\\\\n                  \\\"],[1,[28,[32,5],[\\\"circle-question\\\"],null]],[1,\\\"\\\\n                \\\"]],[]],[[[1,\\\"\\\\n                  \\\"],[10,1],[12],[1,[28,[32,0],[\\\"admin.dashboard.emotion.description\\\"],null]],[13],[1,\\\"\\\\n                \\\"]],[]]]]],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n        \\\"],[10,0],[14,0,\\\"report-body\\\"],[12],[1,\\\"\\\\n          \\\"],[10,0],[14,0,\\\"counters-list\\\"],[12],[1,\\\"\\\\n            \\\"],[10,0],[14,0,\\\"counters-header\\\"],[12],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"counters-cell\\\"],[12],[13],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"counters-cell\\\"],[12],[1,[28,[32,0],[\\\"admin.dashboard.reports.today\\\"],null]],[13],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"counters-cell\\\"],[12],[1,[28,[32,0],[\\\"admin.dashboard.reports.yesterday\\\"],null]],[13],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"counters-cell\\\"],[12],[1,[28,[32,0],[\\\"admin.dashboard.reports.last_7_days\\\"],null]],[13],[1,\\\"\\\\n              \\\"],[10,0],[14,0,\\\"counters-cell\\\"],[12],[1,[28,[32,0],[\\\"admin.dashboard.reports.last_30_days\\\"],null]],[13],[1,\\\"\\\\n            \\\"],[13],[1,\\\"\\\\n\\\"],[42,[28,[31,1],[[28,[31,1],[[30,1,[\\\"emotions\\\"]]],null]],null],null,[[[1,\\\"              \\\"],[8,[32,2],null,[[\\\"@showHeader\\\",\\\"@filters\\\",\\\"@forcedModes\\\",\\\"@dataSourceName\\\"],[false,[30,1,[\\\"emotionFilters\\\"]],\\\"emotion\\\",[29,[\\\"emotion_\\\",[30,2]]]]],null],[1,\\\"\\\\n\\\"]],[2]],null],[1,\\\"          \\\"],[13],[1,\\\"\\\\n        \\\"],[13],[1,\\\"\\\\n      \\\"],[13],[1,\\\"\\\\n    \\\"],[13],[1,\\\"\\\\n  \\\"],[13],[1,\\\"\\\\n\\\"],[13]],[\\\"@controller\\\",\\\"metric\\\"],[\\\"each\\\",\\\"-track-array\\\"]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/templates/admin/dashboard-sentiment.js\",\n    \"scope\": () => [_discourseI18n.i18n, _dashboardPeriodSelector.default, _adminReport.default, _routing.LinkTo, _dTooltip.default, _dIcon.default],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"dashboard-sentiment\"));\n});","define(\"discourse/plugins/discourse-ai/discourse/templates/discourse-ai-bot-conversations\", [\"exports\", \"discourse/plugins/discourse-ai/discourse/components/ai-bot-conversations\", \"@ember/component\", \"@ember/template-factory\", \"@ember/component/template-only\"], function (_exports, _aiBotConversations, _component, _templateFactory, _templateOnly) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.default = void 0;\n  var _default = _exports.default = (0, _component.setComponentTemplate)((0, _templateFactory.createTemplateFactory)(\n  /*\n    <AiBotConversations @controller={{@controller}} />\n  */\n  {\n    \"id\": \"D6ihxKXz\",\n    \"block\": \"[[[8,[32,0],null,[[\\\"@controller\\\"],[[30,1]]],null]],[\\\"@controller\\\"],[]]\",\n    \"moduleName\": \"/var/www/discourse/frontend/discourse/discourse/plugins/discourse-ai/discourse/templates/discourse-ai-bot-conversations.js\",\n    \"scope\": () => [_aiBotConversations.default],\n    \"isStrictMode\": true\n  }), (0, _templateOnly.default)(undefined, \"discourse-ai-bot-conversations\"));\n});","define(\"discourse/plugins/discourse-ai/lib/discourse-markdown/ai-tags\", [\"exports\"], function (_exports) {\n  \"use strict\";\n\n  Object.defineProperty(_exports, \"__esModule\", {\n    value: true\n  });\n  _exports.setup = setup;\n  function setup(helper) {\n    helper.allowList([\"details[class=ai-quote]\", \"details[class=ai-thinking]\"]);\n    helper.allowList([\"div[class=ai-artifact]\", \"div[data-ai-artifact-id]\", \"div[data-ai-artifact-version]\", \"div[data-ai-artifact-autorun]\", \"div[data-ai-artifact-height]\", \"div[data-ai-artifact-width]\"]);\n  }\n});"],"mappings":"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","ignoreList":[]}