jodit-pro
Version:
PRO Version of Jodit Editor
1,152 lines (1,046 loc) • 466 kB
JavaScript
/*!
* 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