UNPKG

jodit-pro

Version:

PRO Version of Jodit Editor

1,152 lines (1,046 loc) 466 kB
/*! * jodit-pro - PRO Version of Jodit Editor * Author: Chupurnov Valerii <chupurnov@gmail.com> * Version: v4.9.27 * Url: https://xdsoft.net/jodit/pro/ * License(s): SEE LICENSE IN LICENSE.md */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else { var a = factory(); for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i]; } })(self, function() { return (self["webpackChunkjodit_pro"] = self["webpackChunkjodit_pro"] || []).push([[830],{ /***/ 473: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ handleBackToList: function() { return /* binding */ handleBackToList; }, /* harmony export */ handleConversationSearch: function() { return /* binding */ handleConversationSearch; }, /* harmony export */ handleConversationSelect: function() { return /* binding */ handleConversationSelect; }, /* harmony export */ handleToolApproval: function() { return /* binding */ handleToolApproval; }, /* harmony export */ handleToolDenial: function() { return /* binding */ handleToolDenial; } /* harmony export */ }); /* harmony import */ var _swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(77688); /* harmony import */ var _swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56075); /* harmony import */ var _swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11886); /* harmony import */ var _tool_execution__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(79078); /* harmony import */ var jodit_esm_core_constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(82758); // import { setToolCallDenied } from './tool-execution'; /** * Handle tool call approval */ function handleToolApproval(toolCallId, scope, stateManager, permissionManager, storage) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { // Find the pending tool call const pendingToolCalls = stateManager.getPendingToolCalls(); const toolCall = pendingToolCalls.find((tc)=>tc.id === toolCallId); if (!toolCall) { console.error('Tool call not found:', toolCallId); return null; } // Grant permission using tool name (not id) const permission = permissionManager.grantPermission(toolCall.name, scope); const conversation = stateManager.getCurrentConversation(); if (conversation) { conversation.permissions.push(permission); yield storage.save(conversation); } // Remove from pending stateManager.removePendingToolCall(toolCallId); return (0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__._)({}, toolCall), { status: 'approved' }); })(); } /** * Handle tool call denial */ function handleToolDenial(jodit, toolCallId, stateManager, storage) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { // Find the pending tool call const pendingToolCalls = stateManager.getPendingToolCalls(); const toolCall = pendingToolCalls.find((tc)=>tc.id === toolCallId); if (!toolCall) { return; } let conversation = stateManager.getCurrentConversation(); if (!conversation) { return; } const messagIndex = conversation.messages.findIndex((msg)=>{ var _msg_toolCalls; return (_msg_toolCalls = msg.toolCalls) === null || _msg_toolCalls === void 0 ? void 0 : _msg_toolCalls.find((tc)=>tc.id === toolCallId); }); if (messagIndex === -1) { return; } const message = conversation.messages[messagIndex]; // Update tool call with denial result const toolCallDenied = (0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__._)({}, toolCall), { result: { error: 'Tool call denied by user.' }, status: 'denied' }); const newMessage = (0,_tool_execution__WEBPACK_IMPORTED_MODULE_3__.updateToolCallInMessage)(message, toolCallDenied); const messages = [ ...conversation.messages ]; messages[messagIndex] = newMessage; conversation = (0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__._)({}, conversation), { messages, updated: Date.now() }); // Save conversation and update UI stateManager.setCurrentConversation(conversation); yield storage.save(conversation); // Emit event for UI to show denied state jodit.e.fire('toolCallDenied.ai-assistant-pro', toolCall); // Remove from pending stateManager.removePendingToolCall(toolCallId); })(); } /** * Handle conversation selection */ function handleConversationSelect(conversationId, storage, stateManager) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { try { stateManager.setLoading(true); const conv = yield storage.get(conversationId); if (!conv) { throw new Error('Conversation not found: ' + conversationId); } stateManager.setCurrentConversation((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__._)({}, conv)); } catch (error) { if (!jodit_esm_core_constants__WEBPACK_IMPORTED_MODULE_4__.IS_PROD) { console.warn(error); } } finally{ stateManager.setLoading(false); } })(); } /** * Handle back to conversation list */ function handleBackToList(storage, stateManager) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { stateManager.setView('conversationList'); try { stateManager.setLoading(true); const conversations = yield storage.list().catch(()=>[]); stateManager.setConversations(conversations); } finally{ stateManager.setLoading(false); } })(); } /** * Handle conversation search */ function handleConversationSearch(query, storage, stateManager) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { stateManager.setLoading(true); try { // Search in storage (includes title and message content) const conversations = yield storage.list(query || undefined); // Update state stateManager.setConversations(conversations); // Update view stateManager.setView('conversationList'); } finally{ // Clear loading state stateManager.setLoading(false); } })(); } /***/ }), /***/ 2020: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var _swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(56075); /* harmony import */ var _swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11886); /* harmony import */ var _definition__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(96675); /* harmony import */ var _executor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(3091); /* harmony default export */ __webpack_exports__["default"] = ((0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__._)({}, _definition__WEBPACK_IMPORTED_MODULE_2__), { execute: _executor__WEBPACK_IMPORTED_MODULE_3__.execute })); /***/ }), /***/ 3091: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ execute: function() { return /* binding */ execute; } /* harmony export */ }); /* harmony import */ var _swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(77688); /* harmony import */ var _core_abort_utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(6689); /* harmony import */ var _core_arg_utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(49459); /* harmony import */ var _core_block_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(44526); /* harmony import */ var jodit_esm_core_dom__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(22732); /** * Replace a specific block in the document by its index or CSS selector */ function execute(jodit, args, signal) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { const { index, selector } = args; const html = (0,_core_arg_utils__WEBPACK_IMPORTED_MODULE_2__.requireString)(args, 'html'); (0,_core_abort_utils__WEBPACK_IMPORTED_MODULE_1__.throwIfAborted)(signal); // Validate that either index or selector is provided, but not both if (index === undefined && !selector || index !== undefined && selector) { throw new Error('Either index or selector must be provided, but not both'); } const { element: targetBlock, identifier: identifierMessage } = (0,_core_block_utils__WEBPACK_IMPORTED_MODULE_3__.resolveBlock)(jodit, { selector, index, requireExactlyOne: true }); try { var // Replace the block _targetBlock_parentNode; // Create new element from HTML const tempDiv = jodit.createInside.div(); tempDiv.innerHTML = html; const newBlock = tempDiv.firstChild; if (!newBlock || !jodit_esm_core_dom__WEBPACK_IMPORTED_MODULE_4__.Dom.isElement(newBlock)) { throw new Error('Invalid HTML: must contain at least one element'); } (_targetBlock_parentNode = targetBlock.parentNode) === null || _targetBlock_parentNode === void 0 ? void 0 : _targetBlock_parentNode.replaceChild(newBlock, targetBlock); jodit.synchronizeValues(); return { success: true, message: `Block ${identifierMessage} replaced successfully` }; } catch (error) { throw new Error(`Failed to replace block ${identifierMessage}: ${error.message}`); } })(); } /***/ }), /***/ 5618: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var _swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(56075); /* harmony import */ var _swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11886); /* harmony import */ var _definition__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(93809); /* harmony import */ var _executor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(28157); /* harmony default export */ __webpack_exports__["default"] = ((0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__._)({}, _definition__WEBPACK_IMPORTED_MODULE_2__), { execute: _executor__WEBPACK_IMPORTED_MODULE_3__.execute })); /***/ }), /***/ 6689: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ throwIfAborted: function() { return /* binding */ throwIfAborted; } /* harmony export */ }); /* harmony import */ var jodit_esm_core_helpers_utils_error_errors_abort_error__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(93661); /** * Throw AbortError if signal is already aborted. */ function throwIfAborted(signal) { if (signal.aborted) { throw (0,jodit_esm_core_helpers_utils_error_errors_abort_error__WEBPACK_IMPORTED_MODULE_0__.abort)(); } } /***/ }), /***/ 11886: /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ _: function() { return /* binding */ _object_spread_props; } /* harmony export */ }); function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function(sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _object_spread_props(target, source) { source = source != null ? source : {}; if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); else { ownKeys(Object(source)).forEach(function(key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } /***/ }), /***/ 12570: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var _swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(56075); /* harmony import */ var _swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11886); /* harmony import */ var _definition__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(62553); /* harmony import */ var _executor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(56293); /* harmony default export */ __webpack_exports__["default"] = ((0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__._)({}, _definition__WEBPACK_IMPORTED_MODULE_2__), { execute: _executor__WEBPACK_IMPORTED_MODULE_3__.execute })); /***/ }), /***/ 15927: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getCurrentSelectionContext: function() { return /* binding */ getCurrentSelectionContext; } /* harmony export */ }); /** * Add current selection to context */ function getCurrentSelectionContext(jodit) { if (jodit.s.isCollapsed()) { return null; } const html = jodit.s.html; const range = jodit.s.range; return { html, rangeInfo: { startContainer: range.startContainer.nodeName, startOffset: range.startOffset, endContainer: range.endContainer.nodeName, endOffset: range.endOffset } }; } /***/ }), /***/ 16015: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ UIDialogSettings: function() { return /* binding */ UIDialogSettings; } /* harmony export */ }); /* harmony import */ var _swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(77688); /* harmony import */ var _swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82749); /* harmony import */ var _swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56075); /* harmony import */ var _swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(11886); /* harmony import */ var _swc_helpers_ts_decorate__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(31635); /* harmony import */ var jodit_esm_core_decorators__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(65478); /* harmony import */ var jodit_esm_core_ui__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(67510); /* harmony import */ var jodit_esm_core_ui_form_inputs_select_select__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(12234); /* harmony import */ var jodit_pro_core_ui_form_range_range__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(62357); class UIDialogSettings extends jodit_esm_core_ui__WEBPACK_IMPORTED_MODULE_6__.UIElement { className() { return 'UIDialogSettings'; } setParentView(view) { var _this_modelSelect, _this_temperatureInput; (_this_modelSelect = this.modelSelect) === null || _this_modelSelect === void 0 ? void 0 : _this_modelSelect.setParentView(view); (_this_temperatureInput = this.temperatureInput) === null || _this_temperatureInput === void 0 ? void 0 : _this_temperatureInput.setParentView(view); return super.setParentView(view); } /** * Build settings fields */ build() { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { const fieldsContainer = this.container; const currentOptions = this.getConversation().options || {}; // Model selector if (this.options.dialogSettings.models && this.options.dialogSettings.models.length > 0) { var _ref, _currentOptions_model; const models = this.parseModels(this.options.dialogSettings.models); const currentModel = (_ref = (_currentOptions_model = currentOptions.model) !== null && _currentOptions_model !== void 0 ? _currentOptions_model : this.state.defaultModel) !== null && _ref !== void 0 ? _ref : models[0].value; this.modelSelect = new jodit_esm_core_ui_form_inputs_select_select__WEBPACK_IMPORTED_MODULE_7__.UISelect(this.j, { label: 'Model', name: 'model', value: currentModel, options: models, onChange: this.onModelChange.bind(this) }); fieldsContainer.appendChild(this.modelSelect.container); } // Temperature slider if (this.options.dialogSettings.temperature) { var _ref1, _currentOptions_temperature; this.temperatureInput = new jodit_pro_core_ui_form_range_range__WEBPACK_IMPORTED_MODULE_8__.UIRange(this.j, { label: 'Temperature', name: 'temperature', min: this.options.dialogSettings.temperature.min, max: this.options.dialogSettings.temperature.max, value: (_ref1 = (_currentOptions_temperature = currentOptions.temperature) !== null && _currentOptions_temperature !== void 0 ? _currentOptions_temperature : this.state.defaultTemperature) !== null && _ref1 !== void 0 ? _ref1 : 0.5, onChange: this.onTemperatureChange.bind(this) }); // Set step attribute directly on the input element const inputElement = this.temperatureInput.nativeInput; if (inputElement) { var _this_options_dialogSettings_temperature_step; inputElement.setAttribute('step', String((_this_options_dialogSettings_temperature_step = this.options.dialogSettings.temperature.step) !== null && _this_options_dialogSettings_temperature_step !== void 0 ? _this_options_dialogSettings_temperature_step : 0.1)); } fieldsContainer.appendChild(this.temperatureInput.container); } }).call(this); } /** * Parse models from config (supports both formats) */ parseModels(models) { if (models.length === 0) { return []; } // Check if it's array of objects with title/value if (typeof models[0] === 'object' && 'title' in models[0]) { return models.map((m)=>({ text: m.title, value: m.value })); } // It's array of strings return models.map((m)=>({ text: m, value: m })); } /** * Handle model change */ onModelChange() { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { if (!this.modelSelect) return; const newModel = this.modelSelect.value; this.updateConversation({ options: (0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_3__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_2__._)({}, this.getConversation().options), { model: newModel }) }); this.state.defaultModel = newModel; }).call(this); } /** * Handle temperature change */ onTemperatureChange() { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { if (!this.temperatureInput) return; const newTemp = parseFloat(this.temperatureInput.value); this.updateConversation({ options: (0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_3__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_2__._)({}, this.getConversation().options), { temperature: newTemp }) }); this.state.defaultTemperature = newTemp; }).call(this); } onDefaultModelChange() { if (this.modelSelect && this.state.defaultModel) { this.modelSelect.value = this.state.defaultModel; } } onDefaultTemperatureChange() { if (this.temperatureInput && this.state.defaultTemperature !== undefined) { this.temperatureInput.value = String(this.state.defaultTemperature); } } destruct() { var _this_modelSelect; (_this_modelSelect = this.modelSelect) === null || _this_modelSelect === void 0 ? void 0 : _this_modelSelect.destruct(); super.destruct(); } constructor(jodit, getConversation, updateConversation, state, options){ super(jodit), (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_1__._)(this, "getConversation", void 0), (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_1__._)(this, "updateConversation", void 0), (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_1__._)(this, "state", void 0), (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_1__._)(this, "options", void 0), (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_1__._)(this, "modelSelect", void 0), (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_1__._)(this, "temperatureInput", void 0), this.getConversation = getConversation, this.updateConversation = updateConversation, this.state = state, this.options = options, this.modelSelect = null, this.temperatureInput = null; this.build(); } } (0,_swc_helpers_ts_decorate__WEBPACK_IMPORTED_MODULE_4__.__decorate)([ (0,jodit_esm_core_decorators__WEBPACK_IMPORTED_MODULE_5__.watch)('state.defaultModel') ], UIDialogSettings.prototype, "onDefaultModelChange", null); (0,_swc_helpers_ts_decorate__WEBPACK_IMPORTED_MODULE_4__.__decorate)([ (0,jodit_esm_core_decorators__WEBPACK_IMPORTED_MODULE_5__.watch)('state.defaultTemperature') ], UIDialogSettings.prototype, "onDefaultTemperatureChange", null); UIDialogSettings = (0,_swc_helpers_ts_decorate__WEBPACK_IMPORTED_MODULE_4__.__decorate)([ jodit_esm_core_decorators__WEBPACK_IMPORTED_MODULE_5__.component ], UIDialogSettings); /***/ }), /***/ 16745: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony import */ var _swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(56075); /* harmony import */ var _swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(11886); /* harmony import */ var _definition__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56732); /* harmony import */ var _executor__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(39592); /* harmony default export */ __webpack_exports__["default"] = ((0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_1__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_0__._)({}, _definition__WEBPACK_IMPORTED_MODULE_2__), { execute: _executor__WEBPACK_IMPORTED_MODULE_3__.execute })); /***/ }), /***/ 18549: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ UIFlightPosition: function() { return /* binding */ UIFlightPosition; } /* harmony export */ }); /* harmony import */ var jodit_esm_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2748); /*! * Jodit Editor PRO (https://xdsoft.net/jodit/) * See LICENSE.md in the project root for license information. * Copyright (c) 2013-2026 Valerii Chupurnov. All rights reserved. https://xdsoft.net/jodit/pro/ */ const flightStates = new WeakMap(); /** * Flight Position Trait * * Provides smart positioning for a panel relative to an anchor element: * - Panel is always position: fixed * - Width matches anchor element width * - Horizontal position matches anchor element * - Vertical position: stays at viewport bottom OR just below anchor (whichever is higher) * * Similar to TinyMCE AI Assistant positioning behavior. */ class UIFlightPosition { /** * Install flight positioning on an element * @param element - The UI element to position * @param anchor - The anchor element (usually editor container) to track * @param options - Configuration options */ static install(element, anchor, options = {}) { // Remove existing installation if any this.remove(element); const { panelHeight = 250, containerClassName, toolbarSelector = '.jodit-toolbar__box', gap = 16 } = options; // Create container for the panel const container = element.j.c.div('jodit-flight-position'); if (containerClassName) { container.classList.add(containerClassName); } container.style.setProperty('--flight-panel-height', `${panelHeight}px`); // Append panel to container container.appendChild(element.container); // Append container to body document.body.appendChild(container); const stateOptions = { toolbarSelector, gap }; // Create scroll/resize handler const onScroll = ()=>{ this.updatePosition(container, anchor, stateOptions); }; // Create ResizeObserver for anchor size changes const resizeObserver = new ResizeObserver(onScroll); resizeObserver.observe(anchor); // Listen to scroll and resize events window.addEventListener('scroll', onScroll, { passive: true }); window.addEventListener('resize', onScroll, { passive: true }); // Store state const state = { container, anchor, onScroll, resizeObserver, options: stateOptions }; flightStates.set(element, state); // Initial position this.updatePosition(container, anchor, stateOptions); } /** * Update container position based on anchor element * * Positioning logic: * 1. If editor is small and panel doesn't fit → top at toolbar bottom * 2. If fits and editor bottom visible → bottom at editor bottom - gap * 3. If editor bottom not visible → bottom at viewport bottom - gap */ static updatePosition(container, anchor, options) { const { toolbarSelector, gap } = options; const anchorRect = anchor.getBoundingClientRect(); const viewportHeight = window.innerHeight; const panelHeight = container.offsetHeight || 250; // Calculate horizontal position (match anchor) container.style.left = `${anchorRect.left}px`; container.style.width = `${anchorRect.width}px`; // Find toolbar to get its bottom position const toolbar = anchor.querySelector(toolbarSelector); const toolbarBottom = toolbar ? toolbar.getBoundingClientRect().bottom : anchorRect.top; // Available space between toolbar bottom and editor bottom const availableSpace = anchorRect.bottom - toolbarBottom; // Check if panel fits in available space const panelFits = panelHeight <= availableSpace; // Check if editor bottom is visible in viewport const editorBottomVisible = anchorRect.bottom <= viewportHeight; if (!panelFits) { // Case 1: Editor is small and panel doesn't fit // Position panel top at toolbar bottom container.style.bottom = 'auto'; container.style.top = `${toolbarBottom}px`; } else if (editorBottomVisible) { // Case 2: Panel fits and editor bottom is visible // Position panel bottom at editor bottom - gap container.style.top = 'auto'; container.style.bottom = `${viewportHeight - anchorRect.bottom + gap}px`; } else { // Case 3: Editor bottom is not visible (scrolled below viewport) // Position panel bottom at viewport bottom - gap container.style.top = 'auto'; container.style.bottom = `${gap}px`; } } /** * Remove flight positioning from an element */ static remove(element) { const state = flightStates.get(element); if (state) { // Remove event listeners window.removeEventListener('scroll', state.onScroll); window.removeEventListener('resize', state.onScroll); // Disconnect observer state.resizeObserver.disconnect(); // Move panel out of container before removing if (element.container.parentNode === state.container) { var _state_container_parentNode; (_state_container_parentNode = state.container.parentNode) === null || _state_container_parentNode === void 0 ? void 0 : _state_container_parentNode.insertBefore(element.container, state.container); } // Remove container jodit_esm_core_dom_dom__WEBPACK_IMPORTED_MODULE_0__.Dom.safeRemove(state.container); // Remove state flightStates.delete(element); } } /** * Check if element has flight positioning installed */ static isInstalled(element) { return flightStates.has(element); } /** * Update panel height */ static setPanelHeight(element, height) { const state = flightStates.get(element); if (state) { state.container.style.setProperty('--flight-panel-height', `${height}px`); } } /** * Force position recalculation */ static refresh(element) { const state = flightStates.get(element); if (state) { this.updatePosition(state.container, state.anchor, state.options); } } } /***/ }), /***/ 19127: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ execute: function() { return /* binding */ execute; } /* harmony export */ }); /* harmony import */ var _swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(77688); /* harmony import */ var _swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56075); /* harmony import */ var _swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11886); /* harmony import */ var _core_abort_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(6689); /* harmony import */ var _core_block_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(44526); /** * Apply or remove inline formatting to the current selection or specific block */ function execute(jodit, args, signal) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { const { element, attributes, remove, blockIndex, selector } = args; (0,_core_abort_utils__WEBPACK_IMPORTED_MODULE_3__.throwIfAborted)(signal); if (!element && !attributes) { throw new Error('Either "element" or "attributes" must be provided'); } jodit.s.restore(); // If blockIndex or selector is provided, select that block first if (blockIndex !== undefined || selector) { const { element } = (0,_core_block_utils__WEBPACK_IMPORTED_MODULE_4__.resolveBlock)(jodit, { selector, index: blockIndex }); jodit.s.select(element); } if (jodit.s.isCollapsed()) { throw new Error('No selection found. Please select text to format'); } try { const styleOptions = {}; if (element) { styleOptions.element = element; } if (attributes) { styleOptions.attributes = attributes; } // Use commitStyle to apply or remove formatting if (remove) { // To remove styling, we need to pass the same style with a special flag // or use applyStyle with opposite action jodit.s.commitStyle((0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__._)({}, styleOptions), { mode: 'remove' })); } else { jodit.s.commitStyle(styleOptions); } // Synchronize the editor value jodit.synchronizeValues(); return { success: true, message: remove ? 'Formatting removed successfully' : 'Formatting applied successfully' }; } catch (error) { throw new Error(`Failed to ${remove ? 'remove' : 'apply'} formatting: ${error.message}`); } })(); } /***/ }), /***/ 21020: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ PermissionManager: function() { return /* binding */ PermissionManager; } /* harmony export */ }); /* harmony import */ var _swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(82749); /* harmony import */ var _swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(56075); /* harmony import */ var _swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(11886); /** * Permission Manager - handles tool execution permissions */ class PermissionManager { /** * Check if tool requires permission */ requiresPermission(toolName) { const { autoApproveTools, alwaysDenyTools } = this.jodit.o.aiAssistantPro; // Always deny takes precedence if (alwaysDenyTools.includes(toolName)) { return true; // Will be denied anyway } // Auto-approve tools don't need permission dialog if (autoApproveTools.includes(toolName)) { return false; } // Check tool definition const tool = this.toolRegistry.getTool(toolName); if (tool) { return tool.requiresPermission; } // Default to requiring permission for unknown tools return true; } /** * Check if tool is auto-denied */ isAutoDenied(toolName) { const { alwaysDenyTools } = this.jodit.o.aiAssistantPro; return alwaysDenyTools.includes(toolName); } /** * Check if tool is auto-approved */ isAutoApproved(toolName) { const { autoApproveTools } = this.jodit.o.aiAssistantPro; return autoApproveTools.includes(toolName); } /** * Check if permission is already granted * @param toolName - Tool name * @param conversationPermissions - Permissions from current conversation * @returns Permission if granted, null otherwise */ checkPermission(toolName, conversationPermissions) { // Check if auto-approved if (this.isAutoApproved(toolName)) { return { toolName, granted: true, grantedAt: Date.now(), scope: 'once' }; } // Check if auto-denied if (this.isAutoDenied(toolName)) { return null; } // Check permanent permissions const permanent = this.permanentPermissions.get(toolName); if (permanent && permanent.granted) { return permanent; } // Check conversation permissions const conversationPerm = conversationPermissions.find((p)=>p.toolName === toolName && p.granted); if (conversationPerm) { return conversationPerm; } return null; } /** * Grant permission for a tool */ grantPermission(toolName, scope) { const permission = { toolName, granted: true, grantedAt: Date.now(), scope }; // Save permanent permissions if (scope === 'forever') { this.permanentPermissions.set(toolName, permission); this.savePermanentPermissions(); } return permission; } /** * Deny permission for a tool */ denyPermission(toolName) { return { toolName, granted: false, grantedAt: Date.now(), scope: 'once' }; } /** * Filter tool calls based on permissions * Returns array of [approved, needsPermission] */ filterToolCalls(toolCalls, conversationPermissions) { const approved = []; const needsPermission = []; const denied = []; for (const toolCall of toolCalls){ // Check if denied if (this.isAutoDenied(toolCall.name)) { denied.push((0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__._)({}, toolCall), { status: 'denied' })); continue; } // Check if approved if (this.isAutoApproved(toolCall.name)) { approved.push((0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__._)({}, toolCall), { status: 'approved' })); continue; } // Check existing permission const permission = this.checkPermission(toolCall.name, conversationPermissions); if (permission && permission.granted) { approved.push((0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__._)({}, toolCall), { status: 'approved' })); } else if (this.requiresPermission(toolCall.name)) { this.jodit.e.fire('permissionRequested.ai-assistant-pro', toolCall.name); needsPermission.push((0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__._)({}, toolCall), { status: 'pending' })); } else { // No permission required approved.push((0,_swc_helpers_object_spread_props__WEBPACK_IMPORTED_MODULE_2__._)((0,_swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_1__._)({}, toolCall), { status: 'approved' })); } } return { approved, needsPermission, denied }; } /** * Clear conversation-specific permissions */ clearConversationPermissions(conversationId) { // Conversation permissions are stored in the conversation object itself // This method is called when a conversation is deleted // Nothing needs to be done here as the conversation is already being deleted // This is a placeholder for future implementation if needed } /** * Load permanent permissions from localStorage */ loadPermanentPermissions() { try { const data = localStorage.getItem(this.PERMANENT_PERMISSIONS_KEY); if (data) { const permissions = JSON.parse(data); permissions.forEach((perm)=>{ if (perm.scope === 'forever' && perm.granted) { this.permanentPermissions.set(perm.toolName, perm); } }); } } catch (error) { console.error('Failed to load permanent permissions:', error); } } /** * Save permanent permissions to localStorage */ savePermanentPermissions() { try { const permissions = Array.from(this.permanentPermissions.values()); localStorage.setItem(this.PERMANENT_PERMISSIONS_KEY, JSON.stringify(permissions)); } catch (error) { console.error('Failed to save permanent permissions:', error); } } /** * Clear all permanent permissions */ clearPermanentPermissions() { this.permanentPermissions.clear(); localStorage.removeItem(this.PERMANENT_PERMISSIONS_KEY); } /** * Get all permanent permissions */ getPermanentPermissions() { return Array.from(this.permanentPermissions.values()); } /** * Revoke permanent permission */ revokePermanentPermission(toolName) { this.permanentPermissions.delete(toolName); this.savePermanentPermissions(); } /** * Destroy manager */ destruct() { this.permanentPermissions.clear(); } constructor(jodit, toolRegistry){ (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_0__._)(this, "jodit", void 0); (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_0__._)(this, "toolRegistry", void 0); // Permanent permissions (scope: 'forever') (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_0__._)(this, "permanentPermissions", void 0); // Storage key for permanent permissions (0,_swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_0__._)(this, "PERMANENT_PERMISSIONS_KEY", void 0); this.jodit = jodit; this.toolRegistry = toolRegistry; this.permanentPermissions = new Map(); this.PERMANENT_PERMISSIONS_KEY = 'jodit-permissions.ai-assistant-pro'; this.loadPermanentPermissions(); } } /***/ }), /***/ 21064: /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { "use strict"; /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ WebStorageConversationStorage: function() { return /* binding */ WebStorageConversationStorage; }, /* harmony export */ createStorageProvider: function() { return /* binding */ createStorageProvider; }, /* harmony export */ generateConversationId: function() { return /* binding */ generateConversationId; }, /* harmony export */ generateMessageId: function() { return /* binding */ generateMessageId; } /* harmony export */ }); /* unused harmony export generateToolCallId */ /* harmony import */ var _swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(77688); /* harmony import */ var _swc_helpers_define_property__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(82749); /* harmony import */ var _swc_helpers_object_spread__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(56075); /* harmony import */ var jodit_esm_core_storage_async_storage__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(97333); /** * Unified web storage implementation using Jodit's storage providers * Supports localStorage, sessionStorage, and memory storage */ class WebStorageConversationStorage { close() { return this.storage.close(); } /** * Get storage key for a conversation ID */ getConversationKey(id) { return `conv:${id}`; } /** * Get all conversation IDs from storage */ getAllKeys() { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { // Since Jodit's storage doesn't provide a way to list keys, // we store a special index key const indexKey = '__conversation_index__'; const index = yield this.storage.get(indexKey); if (index && Array.isArray(index)) { return index; } return []; }).call(this); } /** * Update conversation index */ updateIndex(conversationIds) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { const indexKey = '__conversation_index__'; yield this.storage.set(indexKey, conversationIds); }).call(this); } /** * Add conversation ID to index */ addToIndex(conversationId) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { const index = yield this.getAllKeys(); if (!index.includes(conversationId)) { index.push(conversationId); yield this.updateIndex(index); } }).call(this); } /** * Remove conversation ID from index */ removeFromIndex(conversationId) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { const index = yield this.getAllKeys(); const updated = index.filter((id)=>id !== conversationId); yield this.updateIndex(updated); }).call(this); } /** * List all conversations * @param query - Optional search query to filter conversations by title and message content */ list(query) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { try { const keys = yield this.getAllKeys(); const conversations = []; const lowerQuery = query === null || query === void 0 ? void 0 : query.toLowerCase().trim(); for (const id of keys){ var _conversation_title; const conversation = yield this.get(id); if (!conversation) { continue; } // If query is provided, filter by title and message content if (lowerQuery) { var _conversation_title1; const titleMatches = (_conversation_title1 = conversation.title) === null || _conversation_title1 === void 0 ? void 0 : _conversation_title1.toLowerCase().includes(lowerQuery); // Search in message content const messageMatches = !titleMatches && conversation.messages.some((msg)=>msg.content.toLowerCase().includes(lowerQuery)); // Skip if no matches if (!titleMatches && !messageMatches) { continue; } } conversations.push({ id: conversation.id, title: (_conversation_title = conversation.title) !== null && _conversation_title !== void 0 ? _conversation_title : '', created: conversation.created, updated: conversation.updated, messageCount: conversation.messages.length }); } // Sort by updated timestamp (newest first) conversations.sort((a, b)=>b.updated - a.updated); return conversations; } catch (error) { console.error('Failed to list conversations:', error); return []; } }).call(this); } /** * Get a specific conversation by ID */ get(id) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { try { const key = this.getConversationKey(id); const conversation = yield this.storage.get(key); return conversation || null; } catch (error) { console.error(`Failed to get conversation ${id}:`, error); return null; } }).call(this); } /** * Save or update a conversation */ save(conversation) { return (0,_swc_helpers_async_to_generator__WEBPACK_IMPORTED_MODULE_0__._)(function*() { try { if (conversation.messages.length === 0) { throw new Error('Conversation must have at least one message.'); } // Check if we need to evict old conversations const keys = yield this.getAllKeys(); if (keys.length >= this.maxConversations && !keys.includes(conversation.id)) { yield this.evictOldest(); } // Save conversation const key = this.getConversationKey(conversation.id); yield this.storage.set(key, conversation); // Add to index