فهرست منبع

Ticket #5654 - AI agents improvements. Remove old automators, helpers, providers.

AntonLV 1 ماه پیش
والد
کامیت
e0b00b5907
41فایلهای تغییر یافته به همراه23 افزوده شده و 4184 حذف شده
  1. 0 40
      agents.php
  2. 2 303
      inc/classes/BxDolAI.php
  3. 0 151
      inc/classes/BxDolAIModel.php
  4. 0 150
      inc/classes/BxDolAIModelGpt35.php
  5. 0 521
      inc/classes/BxDolAIModelGpt40.php
  6. 0 142
      inc/classes/BxDolAIProvider.php
  7. 0 133
      inc/classes/BxDolAIProviderShopifyAdmin.php
  8. 0 505
      inc/classes/BxDolAIQuery.php
  9. 0 12
      inc/classes/BxDolAlerts.php
  10. 0 0
      install/sql/system.sql
  11. 1 93
      modules/boonex/english/data/langs/system/en.xml
  12. 1 93
      modules/boonex/russian/data/langs/system/ru.xml
  13. 1 1
      studio/agents.php
  14. 3 13
      studio/classes/BxDolStudioAgents.php
  15. 0 6
      studio/classes/BxDolStudioAgentsAgents.php
  16. 0 28
      studio/classes/BxDolStudioAgentsAutomators.php
  17. 0 201
      studio/classes/BxDolStudioAgentsAutomatorsCmts.php
  18. 0 83
      studio/classes/BxDolStudioAgentsCmts.php
  19. 0 28
      studio/classes/BxDolStudioAgentsHelpers.php
  20. 6 4
      studio/classes/BxDolStudioAgentsInstruments.php
  21. 0 30
      studio/classes/BxDolStudioAgentsProviders.php
  22. 2 2
      studio/classes/BxDolStudioGridAgents.php
  23. 0 19
      studio/template/agents_automator_form.html
  24. 0 11
      studio/template/agents_automator_form_assistants.html
  25. 0 11
      studio/template/agents_automator_form_helpers.html
  26. 0 11
      studio/template/agents_automator_form_providers.html
  27. 0 26
      studio/template/agents_automator_info.html
  28. 0 10
      studio/template/agents_comment_content.html
  29. 3 157
      studio/template/scripts/BxBaseStudioAgents.php
  30. 0 790
      studio/template/scripts/BxBaseStudioAgentsAutomators.php
  31. 0 243
      studio/template/scripts/BxBaseStudioAgentsHelpers.php
  32. 1 1
      studio/template/scripts/BxBaseStudioAgentsLogs.php
  33. 1 1
      studio/template/scripts/BxBaseStudioAgentsModels.php
  34. 0 291
      studio/template/scripts/BxBaseStudioAgentsProviders.php
  35. 1 1
      studio/template/scripts/BxBaseStudioAgentsVectorStoreData.php
  36. 1 1
      studio/template/scripts/BxBaseStudioGridAgents.php
  37. 0 19
      studio/template/scripts_templ/BxTemplStudioAgentsAutomators.php
  38. 0 19
      studio/template/scripts_templ/BxTemplStudioAgentsHelpers.php
  39. 0 19
      studio/template/scripts_templ/BxTemplStudioAgentsProviders.php
  40. 0 5
      template/agents_comment_actions_automator.html
  41. 0 10
      template/agents_comment_content.html

+ 0 - 40
agents.php

@@ -1,40 +0,0 @@
-<?php
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaCore UNA Core
- * @{
- */
-
-require_once('./inc/header.inc.php');
-require_once(BX_DIRECTORY_PATH_INC . "utils.inc.php");
-
-bx_import('BxDolLanguages');
-
-$sTool = bx_process_input(bx_get('t'));
-
-/**
- * Work with Providers
- */
-if(($iProviderId = bx_get('p')) !== false) {
-    $iProviderId = bx_process_input($iProviderId, BX_DATA_INT);
-    if(!$iProviderId)
-        exit;
-
-    $oProvider = BxDolAIProvider::getObjectInstance($iProviderId);
-    if(!$oProvider)
-        exit;
-
-    if(($sAction = bx_get('a')) !== false) {
-        $sAction = 'processAction' . bx_gen_method_name(bx_process_input($sAction));
-        if(method_exists($oProvider, $sAction))
-            $oProvider->$sAction();
-    }
-    else {
-        $mixedResponce = $oProvider->call('products/7433953116300.json', ['fields' => 'id,title,handle,body_html,tags,variants'], 'get');
-        print_r($mixedResponce);
-    }
-}
-
-/** @} */

+ 2 - 303
inc/classes/BxDolAI.php

@@ -23,8 +23,6 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
     
     protected $_aExcludeAlertUnits;
 
-    protected $_sCmtsAutomators;
-
     protected $_bWriteLog;
 
     protected $_aChatContext;
@@ -44,8 +42,6 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
             'system', 'module_template_method_call'
         ];
 
-        $this->_sCmtsAutomators = 'sys_agents_automators';
-
         $this->_bWriteLog = true;
 
         $this->_aChatContext = null;
@@ -158,7 +154,7 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
         if(isset($aParams['capabilities']))
             $aParamsDb['capabilities'] = $aParams['capabilities'];
 
-        return $aModel = $this->_oDb->getModelsBy($aParamsDb);
+        return $this->_oDb->getModelsBy($aParamsDb);
     }
 
     public function getModel($iId)
@@ -170,147 +166,6 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
         return $aModel;
     }
 
-    public function getModelObject($iId)
-    {
-        if(!$iId)
-            $iId = $this->getDefaultModel();
-        if(!$iId)
-            return false;
-
-        return BxDolAIModel::getObjectInstance($iId);
-    }
-    
-    public function getProviderObject($iId)
-    {
-        if(!$iId)
-            return false;
-
-        return BxDolAIProvider::getObjectInstance($iId);
-    }   
-
-    public function getHelperById($iId)
-    {
-        return $this->_oDb->getHelpersBy(['sample' => 'id', 'id' => $iId]);
-    }
-    
-    public function getHelperByName($sName)
-    {
-        return $this->_oDb->getHelpersBy(['sample' => 'name', 'name' => $sName]);
-    }
-
-    public function getAutomator($iId, $bFullInfo = false)
-    {
-        $aAutomator = $this->_oDb->getAutomatorsBy(['sample' => 'id' . ($bFullInfo ? '_full' : ''), 'id' => $iId]);
-        if(!empty($aAutomator['params']))
-            $aAutomator['params'] = json_decode($aAutomator['params'], true);
-        if($bFullInfo && !empty($aAutomator['model_params']))
-            $aAutomator['model_params'] = json_decode($aAutomator['model_params'], true);
-
-        return $aAutomator;
-    }
-
-    public function getAutomatorInstruction($sType, $mixedParams = false)
-    {
-        $mixedResult = '';
-
-        switch($sType) {
-            case 'profile':
-                $mixedResult = "\n ProfileId for system actions = " . $mixedParams;
-                break;
-
-            case 'providers':
-                $aProviders = $this->_oDb->getProvidersBy(['sample' => 'ids', 'ids' => $mixedParams]);
-                if(!empty($aProviders) && is_array($aProviders)) {
-                    $mixedResult = "\n Proividers list = [";
-                    foreach($aProviders as $aProvider)
-                        $mixedResult .= "\n {'ProviderName' => '" . $aProvider['name'] . "',  'ProviderType' => '" . $aProvider['type_name'] . "'}";
-                    $mixedResult .= "\n ]";
-                }
-                break;
-
-            case 'helpers':
-                $aHelpers = $this->_oDb->getHelpersBy(['sample' => 'ids', 'ids' => $mixedParams]);
-                if(!empty($aHelpers) && is_array($aHelpers)) {
-                    $mixedResult = "\n Helpers list = [";
-                    foreach($aHelpers as $aHelper)
-                        $mixedResult .= "\n {'" . $aHelper['name'] . "', 'HelperDescription' => '" . $aHelper['description'] . "'}";
-                    $mixedResult .= "\n ]";
-                }
-                break;
-
-            case 'assistants':
-                $aAssistants = $this->_oDb->getAssistantsBy(['sample' => 'ids', 'ids' => $mixedParams]);
-                if(!empty($aAssistants) && is_array($aAssistants)) {
-                    $mixedResult = "\n Assistants list = [";
-                    foreach($aAssistants as $aAssistant)
-                        $mixedResult .= "\n {'" . $aAssistant['name'] . "', 'AssistantDescription' => '" . $aAssistant['description'] . "'}";
-                    $mixedResult .= "\n ]";
-                }
-                break;
-        }
-
-        return $mixedResult;
-    }
-
-    public function getAutomatorCmts()
-    {
-        return $this->_sCmtsAutomators;
-    }
-
-    public function getAutomatorCmtsObject($iId, $oTemplate = false)
-    {
-        $oCmts = BxDolCmts::getObjectInstance($this->_sCmtsAutomators, (int)$iId, true, $oTemplate);
-        if(!$oCmts || !$oCmts->isEnabled())
-            return false;
-
-        return $oCmts;
-    }
-
-    public function hasAutomators($sType, $bActive = null)
-    {
-        $aParams = [
-            'sample' => 'type', 
-            'type' => $sType
-        ];
-        if($bActive !== null)
-            $aParams['active'] = $bActive;
-
-        return ($aAutomators = $this->_oDb->getAutomatorsBy($aParams)) && is_array($aAutomators);
-    }
-
-    public function getAutomatorsEvent($sUnit, $sAction)
-    {
-        if(in_array($sUnit, $this->_aExcludeAlertUnits))
-            return [];
-
-        return $this->_oDb->getAutomatorsBy([
-            'sample' => 'events', 
-            'alert_unit' => $sUnit,
-            'alert_action' => $sAction,
-            'active' => true
-        ]);
-    }
-
-    public function getAutomatorsScheduler()
-    {
-        $aAutomators = $this->_oDb->getAutomatorsBy(['sample' => 'schedulers', 'active' => true]);
-        foreach($aAutomators as &$aAutomator)
-            if(!empty($aAutomator['params']))
-                $aAutomator['params'] = json_decode($aAutomator['params'], true);
-
-        return $aAutomators;
-    }
-
-    public function getAutomatorsWebhook($iProviderId)
-    {
-        $aAutomators = $this->_oDb->getAutomatorsBy(['sample' => 'webhooks', 'provider_id' => $iProviderId, 'active' => true]);
-        foreach($aAutomators as &$aAutomator)
-            if(!empty($aAutomator['params']))
-                $aAutomator['params'] = json_decode($aAutomator['params'], true);
-
-        return $aAutomators;
-    }
-
     public function callAgent($sType, $aAgent, $mixedParams = [])
     {
         if ($mixedParams)
@@ -1617,41 +1472,6 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
         return $this->_oDb->getAgentByTriggerWebhookKey($sKey);
     }
 
-    public function callAutomator($sType, $aParams = [])
-    {
-        $sMethod = '_callAutomator' . bx_gen_method_name($sType);
-        if(!method_exists($this, $sMethod))
-            return false;
-
-        return $this->$sMethod($aParams);
-    }
-
-    protected function _callAutomatorEvent($aParams = [])
-    {
-        if(!isset($aParams['automator'], $aParams['alert']) || !is_a($aParams['alert'], 'BxDolAlerts'))
-            return false;
-        
-        $oAlert = &$aParams['alert'];
-
-        $this->evalCode($aParams['automator'], ['alert' => $oAlert]);
-    }
-
-    protected function _callAutomatorScheduler($aParams = [])
-    {
-        if(!isset($aParams['automator']))
-            return false;
-        
-        $this->evalCode($aParams['automator']);
-    }
-
-    protected function _callAutomatorWebhook($aParams = [])
-    {
-        if(!isset($aParams['automator']))
-            return false;
-
-        $this->evalCode($aParams['automator']);
-    }
-
     public function evalCode($aAutomator, $aParams = [])
     {
         try {
@@ -1721,125 +1541,4 @@ class BxDolAI extends BxDolFactory implements iBxDolSingleton
 
         eval($sCode);
     }
-}
-
-class BxDolAIMessage
-{
-    /**
-     * @var string - message Type with following values: hb, ai 
-     */
-    protected $_sType;
-    
-    /**
-     * @var mixed - an array of message parts (text, image_url) or a string.
-     */
-    protected $_mixedContent;
-    
-    /**
-     * @var array - an array of of files attached to the message.
-     */
-    protected $_aAttachments;
-
-    public function __construct($sType)
-    {
-        $this->_sType = $sType;
-    }
-
-    public function isAi()
-    {
-        return $this->_sType == 'ai';
-    }
-
-    public function getContent()
-    {
-        return $this->_mixedContent;
-    }
-
-    public function getAttachments()
-    {
-        return $this->_aAttachments;
-    }
-}
-
-class BxDolAIMessageString extends BxDolAIMessage
-{
-    public function __construct($sType, $sContent)
-    {
-        parent::__construct($sType);
-
-        $this->_mixedContent = is_string($sContent) ? $sContent : '';
-    }
-}
-
-class BxDolAIMessageArray extends BxDolAIMessage
-{
-    public function __construct($sType, $aContent = '')
-    {
-        parent::__construct($sType);
-
-        $this->_mixedContent = is_array($aContent) ? $aContent : [];
-    }
-
-    public function addText($sText)
-    {
-        $this->_mixedContent[] = [
-            'type' => 'text',
-            'text' => $sText
-        ];
-    }
-
-    public function addImageUrl($sUrl, $sDetail = 'high')
-    {
-        $this->_mixedContent[] = [
-            'type' => 'image_url',
-            'image_url' => [
-                'url' => $sUrl,
-                'detail' => $sDetail
-            ]
-        ];
-    }
-
-    public function addAttachments($mixedAttachments, $mixedTools = false)
-    {
-        if(!is_array($mixedAttachments))
-            $mixedAttachments = [$mixedAttachments];
-
-        if(!$mixedTools)
-            $mixedTools = [['type' => 'file_search']];
-
-        foreach($mixedAttachments as $sAttachment)
-            $this->_aAttachments[] = [
-                'file_id' => $sAttachment,
-                'tools' => $mixedTools
-            ];
-    }
-}
-
-class BxDolAIMessages
-{
-    /**
-     * @var array - an array of items (messages)
-     */
-    protected $_aItems;
-
-    public function __construct($aItems = [])
-    {
-        $this->_aItems = !empty($aItems) && is_array($aItems) ? $aItems : [];
-    }
-
-    public function add($sType, $mixedMessage)
-    {
-        $sClass = 'BxDolAIMessage' . (is_string($mixedMessage) ? 'String' : 'Array');
-        $this->_aItems[] = new $sClass($sType, $mixedMessage);
-    }
-
-    public function getAll()
-    {
-        return $this->_aItems;
-    }
-
-    public function getLast()
-    {
-        return end($this->_aItems);
-    }
-}
+}

+ 0 - 151
inc/classes/BxDolAIModel.php

@@ -1,151 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaCore UNA Core
- * @{
- */
-
-class BxDolAIModel extends BxDol
-{
-    protected $_oDb;
-    protected $_iId;
-    protected $_sName;
-    protected $_sCaption;
-    protected $_sKey;
-    protected $_aParams;
-
-    protected $_mixedError;
-    protected $_bError;
-
-    public function __construct($aModel)
-    {
-        parent::__construct();
-
-        if(empty($aModel) || !is_array($aModel) || strcmp($aModel['name'], $this->_sName) != 0)
-            $this->_log("Unexpected value provided for the credentials");
-
-        $this->_oDb = new BxDolAIQuery();
-
-        $this->_iId = (int)$aModel['id'];
-        $this->_sName = $aModel['name'];
-        $this->_sCaption = _t($aModel['title']);
-        $this->_sKey = !empty($aModel['key']) ? $aModel['key'] : BxDolAI::getDefaultApiKey();
-        $this->_aParams = !empty($aModel['params']) ? json_decode($aModel['params'], true) : [];
-
-        $this->_mixedError = null;
-        $this->_bError = false;
-    }
-
-    /**
-     * Get model object instance by model name
-     * @param $sName model name
-     * @return object instance or false on error
-     */
-    public static function getObjectInstance($iId)
-    {
-        $sPrefix = 'BxDolAIModel!';
-
-        if(isset($GLOBALS['bxDolClasses'][$sPrefix . $iId]))
-            return $GLOBALS['bxDolClasses'][$sPrefix . $iId];
-
-        $aModel = BxDolAIQuery::getModelObject($iId);
-        if(!$aModel || !is_array($aModel))
-            return false;
-
-        $sClass = 'BxDolAIModel';
-        if(!empty($aModel['class_name'])) {
-            $sClass = $aModel['class_name'];
-            if(!empty($aModel['class_file']))
-                require_once(BX_DIRECTORY_PATH_ROOT . $aModel['class_file']);
-        }
-
-        $o = new $sClass($aModel);
-        return ($GLOBALS['bxDolClasses'][$sPrefix . $iId] = $o);
-    }
-    
-    public function getParams()
-    {
-        return $this->_aParams;
-    }
-
-    public function setParams($aParams)
-    {
-        if(empty($aParams) || !is_array($aParams))
-            return;
-
-        $this->_aParams = array_merge($this->_aParams, $aParams);
-    }
-
-    public function isError()
-    {
-        return $this->_bError;
-    }
-
-    public function getError()
-    {
-        return $this->_bError ? $this->_mixedError : false;
-    }
-
-    public function getErrorMessage()
-    {
-        if(!$this->_bError)
-            return false;
-
-        if(is_string($this->_mixedError))
-            return $this->_mixedError;
-
-        if(is_array($this->_mixedError) && !empty($this->_mixedError['message']))
-            return $this->_mixedError['message'];
-
-        return _t('_sys_agents_err_failed');
-    }
-
-    public function setError($mixedError)
-    {
-        if(empty($mixedError))
-            return false;
-
-        $this->_mixedError = $mixedError;
-        $this->_bError = true;
-
-        return true;
-    }
-
-    public function resetError()
-    {
-        $this->_mixedError = null;
-        $this->_bError = false;
-    }
-
-    public function getResponseInit($sType, $aMessage, $aParams = [])
-    {
-        // Should be overwritten to get init call response.
-    }
-
-    public function getResponse($sType, $aMessage, $aParams = [])
-    {
-        // Should be overwritten to get call response.
-    }
-
-    /**
-     * Internal methods.
-     */
-    protected function _log($mixedError, $bUseLog = true)
-    {
-        if(!$bUseLog) {
-            $sMessage = 'Error occurred';
-            if(is_string($mixedError))
-                $sMessage = $mixedError;
-            else if(is_array($mixedError) && isset($mixedError['message']))
-                $sMessage = $mixedError['message'];
-
-            throw new Exception($sMessage);
-        }
-        else
-            BxDolAI::getInstance()->log($mixedError, 'Models');
-
-        return false;
-    }    
-}

+ 0 - 150
inc/classes/BxDolAIModelGpt35.php

@@ -1,150 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaCore UNA Core
- * @{
- */
-
-class BxDolAIModelGpt35 extends BxDolAIModel
-{
-    public static $NAME = 'gpt-3.5-turbo';
-
-    protected $_sEndpoint;
-    protected $_sPathInst;
-
-    public function __construct($aModel)
-    {
-        $this->_sName = self::$NAME;
-
-        parent::__construct($aModel);
-
-        $this->_sEndpoint = "https://api.openai.com/v1/chat/completions";
-        $this->_sPathInst = BX_DIRECTORY_PATH_ROOT . 'ai/instructions/';
-    }
-
-    public function getResponseText($sPrompt, $sMessage)
-    {
-        $aMessages = [
-            ['role' => 'system', 'content' => $sPrompt],
-            ['role' => 'user', 'content' => $sMessage]
-        ];
-
-        $sResponse = $this->call($aMessages);
-        if($sResponse == 'false')
-            return false;
-        
-        return $sResponse;
-    }
-    
-    public function getResponseInit($sType, $oMessage, $aParams = [])
-    {
-        if(!is_a($oMessage, 'BxDolAIMessage'))
-            return false;
-
-        $aMessages = [
-            ['role' => 'system', 'content' => $this->_getInstructions($sType . '_init')],
-            ['role' => 'user', 'content' => $oMessage->getContent()]
-        ];
-
-        $sResponse = $this->call($aMessages);
-        if($sResponse == 'false')
-            return false;
-
-        $mixedResult = [];
-        switch($sType) {
-            case BX_DOL_AI_AUTOMATOR_EVENT:
-                $aResponse = json_decode($sResponse, true);
-
-                $mixedResult = [
-                    'alert_unit' => $aResponse['alert_unit'],
-                    'alert_action' => $aResponse['alert_action'],
-                    'params' => [
-                        'trigger' => $aResponse['trigger']
-                    ]
-                ];
-                break;
-
-            case BX_DOL_AI_AUTOMATOR_SCHEDULER:
-                $mixedResult = [
-                    'params' => [
-                        'scheduler_time' => $sResponse
-                    ]
-                ];
-                break;
-
-            case BX_DOL_AI_AUTOMATOR_WEBHOOK:
-                break;
-        }
-        
-
-        return $mixedResult;
-    }
-
-    public function getResponse($sType, $mixedMessage, $aParams = [])
-    {
-        $bMessage = is_a($mixedMessage, 'BxDolAIMessageString');
-        $bMessages = is_a($mixedMessage, 'BxDolAIMessages');
-        if(!$bMessage && !$bMessages)
-            return false;
-
-        $aCall = [
-            ['role' => 'system', 'content' => $this->_getInstructions($sType, true)]
-        ];
-
-        if($bMessages && ($aMessages = $mixedMessage->getAll()))
-            foreach($aMessages as $oMessage)
-                $aCall[] = [
-                    'role' => $oMessage->isAi() ? 'assistant' : 'user',
-                    'content' => $oMessage->getContent() . (!$oMessage->isAi() ? ' return only function, without explanation or false if you havn`t enougth data' : '')
-                ];
-        else if($bMessage)
-            $aCall[] = [
-                'role' => $oMessage->isAi() ? 'assistant' : 'user', 
-                'content' => $mixedMessage->getContent()
-            ];
-
-        $sResponse = $this->call($aCall);
-        if($sResponse == 'false')
-            return false;
-
-        return $sResponse;
-    }
-
-    public function call($aMessages, $aParams = [])
-    {
-        $aData = [
-            'model' => $this->_sName,
-            'messages' => $aMessages
-        ];
-
-        if(!empty($this->_aParams['call']) && is_array($this->_aParams['call']))
-            $aData = array_merge($aData, $this->_aParams['call']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $sResponse = bx_file_get_contents($this->_sEndpoint, $aData, "post-json", [
-            "Authorization: Bearer " . $this->_sKey, 
-            'Content-Type: application/json', 
-            'OpenAI-Beta: assistants=v1'
-        ]);
-
-        $aResponse = json_decode($sResponse, true);
-        if(isset($aResponse['error'])) {
-            $this->_log($aResponse['error']);
-            return 'false';
-        }
-
-        return trim(str_replace(['```json', '```php', '```'], '', $aResponse['choices'][0]['message']['content']));
-    }
-
-    protected function _getInstructions($sType, $bIncludeCommon = false)
-    {
-        $sResult = file_get_contents($this->_sPathInst . $sType . '.html');
-        if($bIncludeCommon)
-            $sResult .= file_get_contents($this->_sPathInst. 'common.html');
-
-        return $sResult;
-    }
-}

+ 0 - 521
inc/classes/BxDolAIModelGpt40.php

@@ -1,521 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaCore UNA Core
- * @{
- */
-
-class BxDolAIModelGpt40 extends BxDolAIModel
-{
-    public static $NAME = 'gpt-4o';
-
-    protected $_sEndpoint;
-    protected $_sEndpointRuns;
-    protected $_sEndpointRunsCheck;
-    protected $_sEndpointMessages;
-
-    protected $_sEndpointAssistants;
-    protected $_sEndpointAssistantsModify;
-    protected $_sEndpointAssistantsDelete;
-
-    protected $_sEndpointFiles;
-    protected $_sEndpointFilesRetrieve;
-    protected $_sEndpointFilesRetrieveContent;
-    protected $_sEndpointFilesDelete;
-
-    protected $_sEndpointVectorStores;
-    protected $_sEndpointVectorStoresDelete;
-
-    protected $_sEndpointVectorStoresFiles;
-    protected $_sEndpointVectorStoresFilesRetrieve;
-    protected $_sEndpointVectorStoresFilesDelete;   
-
-    protected $_sEndpointChat;
-
-    public function __construct($aModel)
-    {
-        $this->_sName = self::$NAME;
-
-        parent::__construct($aModel);
-
-        $this->_sEndpoint = 'https://api.openai.com/v1/threads';
-        $this->_sEndpointRuns = $this->_sEndpoint . '/%s/runs';
-        $this->_sEndpointRunsCheck = $this->_sEndpoint . '/%s/runs/%s';
-        $this->_sEndpointMessages = $this->_sEndpoint . '/%s/messages';
-
-        $this->_sEndpointAssistants = 'https://api.openai.com/v1/assistants';
-        $this->_sEndpointAssistantsModify = $this->_sEndpointAssistants . '/%s';
-        $this->_sEndpointAssistantsDelete = $this->_sEndpointAssistants . '/%s';
-
-        $this->_sEndpointFiles = 'https://api.openai.com/v1/files';
-        $this->_sEndpointFilesRetrieve = $this->_sEndpointFiles . '/%s';
-        $this->_sEndpointFilesRetrieveContent = $this->_sEndpointFiles . '/%s/content';
-        $this->_sEndpointFilesDelete = $this->_sEndpointFilesRetrieve;
-
-        $this->_sEndpointVectorStores = 'https://api.openai.com/v1/vector_stores';
-        $this->_sEndpointVectorStoresDelete = $this->_sEndpointVectorStores . '/%s';
-
-        $this->_sEndpointVectorStoresFiles = $this->_sEndpointVectorStores . '/%s/files';
-        $this->_sEndpointVectorStoresFilesRetrieve = $this->_sEndpointVectorStoresFiles . '/%s';
-        $this->_sEndpointVectorStoresFilesDelete = $this->_sEndpointVectorStoresFiles . '/%s';
-
-        $this->_sEndpointChat = 'https://api.openai.com/v1/chat/completions';
-    }
-    
-    public function getResponseText($sPrompt, $sMessage)
-    {
-        $aMessages = [
-            ['role' => 'system', 'content' => $sPrompt],
-            ['role' => 'user', 'content' => $sMessage]
-        ];
-
-        $sResponse = $this->callChat($aMessages);
-        if($sResponse == 'false')
-            return false;
-        
-        return $sResponse;
-    }
-
-    public function getResponseInit($sType, $oMessage, $aParams = [])
-    {
-        if(!is_a($oMessage, 'BxDolAIMessage'))
-            return false;
-
-        $aResponse = $this->call(['messages' => [['role' => 'user', 'content' => $oMessage->getContent(), 'attachments' => $oMessage->getAttachments()]]]);
-        if(!isset($aResponse['id'], $aResponse['object']) || $aResponse['object'] != 'thread')
-            return false;
-
-        $sThreadId = $aResponse['id'];
-        $sAssistantId = isset($aParams['assistant_id']) ? $aParams['assistant_id'] : $this->_getAssistantId($sType . '_init');
-
-        if(!$this->callRuns($sThreadId, ['assistant_id' => $sAssistantId]))
-            return false;
-
-        $sResponse = $this->getMessages($sThreadId);
-
-        $mixedResult = [];
-        switch($sType) {
-            case BX_DOL_AI_AUTOMATOR_EVENT:
-                $aResponse = json_decode($sResponse, true);
-
-                $mixedResult = [
-                    'alert_unit' => $aResponse['alert_unit'],
-                    'alert_action' => $aResponse['alert_action'],
-                    'params' => [
-                        'thread_id' => $sThreadId,
-                        'trigger' => $aResponse['trigger']
-                    ]
-                ];
-                break;
-
-            case BX_DOL_AI_AUTOMATOR_SCHEDULER:
-                $mixedResult = [
-                    'params' => [
-                        'thread_id' => $sThreadId,
-                        'scheduler_time' => $sResponse
-                    ]
-                ];
-                break;
-
-            case BX_DOL_AI_AUTOMATOR_WEBHOOK:
-            case BX_DOL_AI_ASSISTANT:
-                $mixedResult = [
-                    'params' => [
-                        'thread_id' => $sThreadId,
-                    ]
-                ];
-                break;
-        }
-
-        return $mixedResult;
-    }
-
-    public function getResponse($sType, $mixedMessage, $aParams = [])
-    {
-        $bMessages = false;
-        if(!(is_a($mixedMessage, 'BxDolAIMessage')) && !($bMessages = is_a($mixedMessage, 'BxDolAIMessages')))
-            return false;
-
-        if(empty($aParams['thread_id']))
-            return false;
-
-        if($bMessages)
-            $mixedMessage = $mixedMessage->getLast();
-
-        $sThreadId = $aParams['thread_id'];
-        if($mixedMessage->isAi() || !$this->callMessages($sThreadId, ['role' => 'user', 'content' => $mixedMessage->getContent(), 'attachments' => $mixedMessage->getAttachments()]))
-            return false;
-
-        $aResponse = $this->callRuns($sThreadId, [
-            'assistant_id' => isset($aParams['assistant_id']) ? $aParams['assistant_id'] : $this->_getAssistantId($sType)
-        ]);
-
-        if(!$aResponse || (isset($aResponse['status']) && $aResponse['status'] != 'completed')) {
-            if(!empty($aResponse['last_error']) && is_array($aResponse['last_error']))
-                return $aResponse['last_error']['message'];
-
-            return false;
-        }
-
-        return $this->getMessages($sThreadId);
-    }
-
-    public function getAssistant($aParams = [])
-    {
-        $aResponseVs = $this->callVectorStores(['name' => $aParams['name']]);
-        if($aResponseVs === false)
-            return false;
-        
-        $sVectorStoreId = $aResponseVs['id'];
-
-        $aResponseAsst = $this->callAssistants([
-            'model' => $this->_sName, 
-            'name' => $aParams['name'], 
-            'instructions' => $aParams['prompt'], 
-            'tools' => [
-                ['type' => 'file_search']
-            ],
-            'tool_resources' => [
-                'file_search' => [
-                    'vector_store_ids' => [$sVectorStoreId]
-                ]
-            ]
-        ]);
-        if($aResponseAsst === false)
-            return false;
-        
-        $sAssistantId = $aResponseAsst['id'];
-
-        return [
-            'vector_store_id' => $sVectorStoreId,
-            'assistant_id' => $sAssistantId
-        ];
-    }
-
-    public function editAssistant($sId, $aParams = [])
-    {
-        $aResponseAsst = $this->callAssistantsModify($sId, [
-            'name' => $aParams['name'], 
-            'instructions' => $aParams['prompt']
-        ]);
-
-        return $aResponseAsst !== false;
-    }
-
-    public function call($aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call']) && is_array($this->_aParams['call']))
-            $aData = array_merge($aData, $this->_aParams['call']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        return $this->_call($this->_sEndpoint, $aData);
-        
-    }
-
-    public function callRuns($sThreadId, $aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_runs']) && is_array($this->_aParams['call_runs']))
-            $aData = array_merge($aData, $this->_aParams['call_runs']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $aResponse = $this->_call(sprintf($this->_sEndpointRuns, $sThreadId), $aData);
-        if($aResponse !== false && isset($aResponse['id'])) {
-            $sRunId = $aResponse['id'];
-
-            while(in_array($aResponse['status'], ['queued', 'in_progress'])) {
-                sleep(1);
-
-                $aResponse = $this->_call(sprintf($this->_sEndpointRunsCheck, $sThreadId, $sRunId), [], 'get');
-            }
-        }
-
-        return $aResponse;
-    }
-
-    public function callMessages($sThreadId, $aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_messages']) && is_array($this->_aParams['call_messages']))
-            $aData = array_merge($aData, $this->_aParams['call_messages']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $mixedResponse = $this->_call(sprintf($this->_sEndpointMessages, $sThreadId), $aData);
-        if($mixedResponse !== false)
-            $mixedResponse = $mixedResponse['content'][0]['text']['value'];
-
-        return $mixedResponse;
-    }
-
-    /**
-     * Create a vector store.
-     * 
-     * @param type $aParams - should have 'name'
-     * @return boolean
-     */
-    public function callVectorStores($aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_vs']) && is_array($this->_aParams['call_vs']))
-            $aData = array_merge($aData, $this->_aParams['call_vs']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $mixedResponse = $this->_call($this->_sEndpointVectorStores, $aData);
-        if(empty($mixedResponse) || !is_array($mixedResponse) || $mixedResponse['object'] != 'vector_store')
-            return false;
-
-        return $mixedResponse;
-    }
-    
-    public function callVectorStoresDelete($sVectorStoreId, $aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_vs_delete']) && is_array($this->_aParams['call_vs_delete']))
-            $aData = array_merge($aData, $this->_aParams['call_vs_delete']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $mixedResponse = $this->_call(sprintf($this->_sEndpointVectorStoresDelete, $sVectorStoreId), [], 'DELETE');
-        if(empty($mixedResponse) || !is_array($mixedResponse) || !$mixedResponse['deleted'])
-            return false;
-
-        return $mixedResponse;
-    }
-
-    /**
-     * Create a vector store file by attaching a File to a vector store.
-     * 
-     * @param type $sVectorStoreId
-     * @param type $aParams - should have 'file_id'
-     * @return boolean
-     */
-    public function callVectorStoresFiles($sVectorStoreId, $aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_vs_files']) && is_array($this->_aParams['call_vs_files']))
-            $aData = array_merge($aData, $this->_aParams['call_vs_files']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $mixedResponse = $this->_call(sprintf($this->_sEndpointVectorStoresFiles, $sVectorStoreId), $aData);
-        if(empty($mixedResponse) || !is_array($mixedResponse) || $mixedResponse['object'] != 'vector_store.file')
-            return false;
-
-        return $mixedResponse;
-    }
-    
-    public function callVectorStoresFilesList($sVectorStoreId, $aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_vs_flist']) && is_array($this->_aParams['call_vs_flist']))
-            $aData = array_merge($aData, $this->_aParams['call_vs_flist']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $mixedResponse = $this->_call(sprintf($this->_sEndpointVectorStoresFiles, $sVectorStoreId), $aData, 'get');
-        if(empty($mixedResponse) || !is_array($mixedResponse) || $mixedResponse['object'] != 'list')
-            return false;
-
-        return $mixedResponse['data'];
-    }
-
-    public function callVectorStoresFilesRetrieveFile($sVectorStoreId, $sFileId)
-    {
-        return $this->_call(sprintf($this->_sEndpointVectorStoresFilesRetrieve, $sVectorStoreId, $sFileId), [], 'get');
-    }
-    
-    public function callVectorStoresFilesDelete($sVectorStoreId, $sFileId, $aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_vs_files_retrieve']) && is_array($this->_aParams['call_vs_files_retrieve']))
-            $aData = array_merge($aData, $this->_aParams['call_vs_files_retrieve']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        return $this->_call(sprintf($this->_sEndpointVectorStoresFilesDelete, $sVectorStoreId, $sFileId), [], 'DELETE');
-    }
-
-    public function callAssistants($aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_assts']) && is_array($this->_aParams['call_assts']))
-            $aData = array_merge($aData, $this->_aParams['call_assts']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $mixedResponse = $this->_call($this->_sEndpointAssistants, $aData);
-        if(empty($mixedResponse) || !is_array($mixedResponse) || $mixedResponse['object'] != 'assistant')
-            return false;
-
-        return $mixedResponse;
-    }
-
-    public function callAssistantsModify($sAsstId, $aParams = [])
-    {
-        $aData = [];
-        if(($sKey = 'call_assts_modify') && !empty($this->_aParams[$sKey]) && is_array($this->_aParams[$sKey]))
-            $aData = array_merge($aData, $this->_aParams[$sKey]);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $mixedResponse = $this->_call(sprintf($this->_sEndpointAssistantsModify, $sAsstId), $aData);
-        if(empty($mixedResponse) || !is_array($mixedResponse) || $mixedResponse['object'] != 'assistant')
-            return false;
-
-        return $mixedResponse;
-    }
-
-    public function callAssistantsDelete($sAsstId, $aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_assts_delete']) && is_array($this->_aParams['call_assts_delete']))
-            $aData = array_merge($aData, $this->_aParams['call_assts_delete']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $mixedResponse = $this->_call(sprintf($this->_sEndpointAssistantsDelete, $sAsstId), $aData, 'DELETE');
-        if(empty($mixedResponse) || !is_array($mixedResponse) || !$mixedResponse['deleted'])
-            return false;
-
-        return $mixedResponse;
-    }
-
-    public function callFiles($aFile, $aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_files']) && is_array($this->_aParams['call_files']))
-            $aData = array_merge($aData, $this->_aParams['call_files']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        if(empty($aData['purpose']))
-            $aData['purpose'] = 'assistants';
-
-        $sName = !empty($aFile['name']) ? $aFile['name'] : 'file_' . time() . '.txt';
-        $sMime = !empty($aFile['mime']) ? $aFile['mime'] : 'text/plain';
-        $aData['file'] = new CURLStringFile($aFile['content'], $sName, $sMime);
-
-        $mixedResponse = $this->_callFiles($this->_sEndpointFiles, $aData);
-        if(empty($mixedResponse) || !is_array($mixedResponse) || $mixedResponse['object'] != 'file')
-            return false;
-
-        return $mixedResponse;
-    }
-
-    public function callFilesRetrieve($sFileId)
-    {
-        $mixedResponse = $this->_callFiles(sprintf($this->_sEndpointFilesRetrieve, $sFileId), [], 'get');
-        if(empty($mixedResponse) || !is_array($mixedResponse) || $mixedResponse['object'] != 'file')
-            return false;
-
-        return $mixedResponse;
-    }
-
-    public function callFilesRetrieveContent($sFileId)
-    {
-        return bx_file_get_contents(sprintf($this->_sEndpointFilesRetrieveContent, $sFileId), [], 'get', [
-            "Authorization: Bearer " . $this->_sKey
-        ]);
-    }
-
-    public function callFilesDelete($sFileId, $aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['call_files_delete']) && is_array($this->_aParams['call_files_delete']))
-            $aData = array_merge($aData, $this->_aParams['call_files_delete']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $mixedResponse = $this->_callFiles(sprintf($this->_sEndpointFilesDelete, $sFileId), $aData, 'DELETE');
-        if(empty($mixedResponse) || !is_array($mixedResponse) || $mixedResponse['object'] != 'file')
-            return false;
-
-        return $mixedResponse;
-    }
-
-    public function callChat($aMessages, $aParams = [])
-    {
-        $aData = [
-            'model' => $this->_sName,
-            'messages' => $aMessages
-        ];
-
-        if(!empty($this->_aParams['call']) && is_array($this->_aParams['call']))
-            $aData = array_merge($aData, $this->_aParams['call']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $sResponse = bx_file_get_contents($this->_sEndpointChat, $aData, 'post-json', [
-            'Authorization: Bearer ' . $this->_sKey, 
-            'OpenAI-Beta: assistants=v1'
-        ]);
-
-        $aResponse = json_decode($sResponse, true);
-        if(isset($aResponse['error'])) {
-            $this->_log($aResponse['error']);
-            return 'false';
-        }
-
-        return trim(str_replace(['```json', '```php', '```'], '', $aResponse['choices'][0]['message']['content']));
-    }
-
-    public function getMessages($sThreadId, $aParams = [])
-    {
-        $aData = [];
-        if(!empty($this->_aParams['get_messages']) && is_array($this->_aParams['get_messages']))
-            $aData = array_merge($aData, $this->_aParams['get_messages']);
-        if(!empty($aParams) && is_array($aParams))
-            $aData = array_merge($aData, $aParams);
-
-        $mixedResponse = $this->_call(sprintf($this->_sEndpointMessages, $sThreadId), $aData, "get");
-        if($mixedResponse !== false)
-            $mixedResponse = trim(str_replace(['```json', '```php', '```'], '', $mixedResponse['data'][0]['content'][0]['text']['value']));
-
-        return $mixedResponse;
-    }
-
-    protected function _call($sEndpoint, $aData, $sMethod = 'post-json')
-    {
-        $sResponse = bx_file_get_contents($sEndpoint, $aData, $sMethod, array_merge([
-            'Authorization: Bearer ' . $this->_sKey, 
-            'OpenAI-Beta: assistants=v2'
-        ], ($sMethod != 'post-json' ? ['Content-Type: application/json'] : [])));
-
-        $aResponse = json_decode($sResponse, true);
-        if(isset($aResponse['error'])) {
-            $this->setError($aResponse['error']);
-
-            $this->_log(['endpoint' => $sEndpoint, 'method' => $sMethod, 'error' => $aResponse['error']]);
-            return false;
-        }
-
-        return $aResponse;
-    }
-
-    protected function _callFiles($sEndpoint, $aData, $sMethod = "post-raw")
-    {
-        $sResponse = bx_file_get_contents($sEndpoint, $aData, $sMethod, [
-            "Authorization: Bearer " . $this->_sKey
-        ]);
-
-        $aResponse = json_decode($sResponse, true);
-        if(isset($aResponse['error'])) {
-            $this->_log($aResponse['error']);
-            return false;
-        }
-
-        return $aResponse;
-    }
-
-    protected function _getAssistantId($sType)
-    {
-        return isset($this->_aParams['assistants'][$sType]) ? $this->_aParams['assistants'][$sType] : '';
-    }
-}

+ 0 - 142
inc/classes/BxDolAIProvider.php

@@ -1,142 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaCore UNA Core
- * @{
- */
-
-class BxDolAIProvider extends BxDol
-{
-    protected $_oDb;
-    protected $_iId;
-    protected $_sProviderName;
-    protected $_sName;
-    protected $_sPrefix;
-    protected $_aOptions;
-
-    public function __construct($aProvider)
-    {
-        parent::__construct();
-
-        if(empty($aProvider) || !is_array($aProvider) || strcmp($aProvider['type']['name'], $this->_sProviderName) != 0)
-            $this->_log("Unexpected value provided for the credentials");
-
-        $this->_oDb = new BxDolAIQuery();
-
-        $this->_iId = (int)$aProvider['id'];
-        $this->_sProviderName = $aProvider['type']['name'];
-        $this->_sName = _t($aProvider['name']);
-        $this->_sPrefix = $aProvider['type']['option_prefix'];
-
-        $this->_aOptions = [];
-        if(!empty($aProvider['options']) && is_array($aProvider['options']))
-            $this->initOptions($aProvider['options']);
-    }
-
-    /**
-     * Get provider object instance by provider unique name
-     * @param $sName provider unique name
-     * @return object instance or false on error
-     */
-    public static function getObjectInstanceByName($sName)
-    {
-        $iId = BxDolAIQuery::getProviderIdByName($sName);
-        if(!$iId)
-            return false;
-
-        return self::getObjectInstance($iId);
-    }
-
-    /**
-     * Get provider object instance by provider ID
-     * @param $iId provider ID
-     * @return object instance or false on error
-     */
-    public static function getObjectInstance($iId)
-    {
-        $sPrefix = 'BxDolAIProvider!';
-
-        if(isset($GLOBALS['bxDolClasses'][$sPrefix . $iId]))
-            return $GLOBALS['bxDolClasses'][$sPrefix . $iId];
-
-        $aProvider = BxDolAIQuery::getProviderObject($iId);
-        if(!$aProvider || !is_array($aProvider))
-            return false;
-
-        $sClass = 'BxDolAIProvider';
-        if(!empty($aProvider['type']['class_name'])) {
-            $sClass = $aProvider['type']['class_name'];
-            if(!empty($aProvider['type']['class_file']))
-                require_once(BX_DIRECTORY_PATH_ROOT . $aProvider['type']['class_file']);
-        }
-
-        $o = new $sClass($aProvider);
-        return ($GLOBALS['bxDolClasses'][$sPrefix . $iId] = $o);
-    }
-
-    public function initOptions($aOptions)
-    {
-    	$this->_aOptions = $aOptions;
-    }
-
-    public function getInfo()
-    {
-        $aInfo = $this->_oDb->getProvidersBy(['sample' => 'id', 'id' => $this->_iId]);
-        $aInfo['options'] = $this->getOptions();
-
-        return $aInfo;
-    }
-
-    public function getOptions()
-    {
-        $aOptions = $this->_oDb->getProvidersBy(['sample' => 'options_by_id', 'id' => $this->_iId]);
-        foreach($aOptions as &$aOption)
-            $aOption['value'] = $this->getOption($aOption['name']);
-
-        return $aOptions;
-    }
-
-    public function getOption($sName)
-    {
-        $sCustomMethod = 'getOption' . bx_gen_method_name(str_replace($this->_sPrefix, '', $sName));
-        if(method_exists($this, $sCustomMethod))
-             return $this->$sCustomMethod();
-        
-    	if(substr($sName, 0, strlen($this->_sPrefix)) != $this->_sPrefix)
-            $sName = $this->_sPrefix . $sName;
-
-        return isset($this->_aOptions[$sName]) ? $this->_aOptions[$sName]['value'] : '';
-    }
-
-    public function processActionWebhook()
-    {
-        // Should be overwritten to process webhooks.
-    }
-
-    public function call($sRequest, $aParams, $sMethod = 'post-json', $aHeaders = [])
-    {
-        // Should be overwritten to process calls.
-    }
-
-    /**
-     * Internal methods.
-     */
-    protected function _log($mixedError, $bUseLog = true)
-    {
-        if(!$bUseLog) {
-            $sMessage = 'Error occurred';
-            if(is_string($mixedError))
-                $sMessage = $mixedError;
-            else if(is_array($mixedError) && isset($mixedError['message']))
-                $sMessage = $mixedError['message'];
-
-            throw new Exception($sMessage);
-        }
-        else
-            BxDolAI::getInstance()->log($mixedError, 'Providers');
-
-        return false;
-    }    
-}

+ 0 - 133
inc/classes/BxDolAIProviderShopifyAdmin.php

@@ -1,133 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaCore UNA Core
- * @{
- */
-
-/*
- * Login for Owner/Collaborator account:
- * https://admin.shopify.com/store/your_shop/
- * 
- * Integration:
- * 0. Custom apps creation guide (for a shop Owner/Collaborator, not a Partner):
- * https://help.shopify.com/en/manual/apps/app-types/custom-apps
- * 
- * 1. Make authenticated requests to the REST Admin API:
- * https://shopify.dev/docs/apps/auth/admin-app-access-tokens
- * 
- * 2. REST Admin API reference:
- * https://shopify.dev/docs/api/admin-rest
- * 
- * 3. REST Admin API -> Product
- * https://shopify.dev/docs/api/admin-rest/2023-10/resources/product
- * 
- * 4. REST Admin API -> Order
- * https://shopify.dev/docs/api/admin-rest/2023-10/resources/order
- * 
- */
-class BxDolAIProviderShopifyAdmin extends BxDolAIProvider
-{
-    public static $PROVIDER_NAME = 'shopify_admin';
-
-    protected $_sShopDomain;
-    protected $_sAccessToken;
-
-    protected $_sEndpoint;
-    protected $_sStorefront;
-
-    public function __construct($aProvider)
-    {
-        $this->_sProviderName = self::$PROVIDER_NAME;
-
-        parent::__construct($aProvider);
-
-        $this->_sShopDomain = $this->getOption('shop_domain');
-        $this->_sAccessToken = $this->getOption('access_token');
-
-        $this->_sEndpoint = "https://{$this->_sShopDomain}/admin/api/2023-10/";
-        $this->_sStorefront = "https://{$this->_sShopDomain}/";
-    }
-
-    public function getEntry($sId)
-    {
-        $sProduct = $this->call('products/' . $sId . '.json', [
-            'fields' => 'id,title,handle,body_html,tags,variants',
-        ], 'get');
-        
-        if(empty($sProduct))
-            return [];
-
-        $aProduct = json_decode($sProduct, true);
-        if(empty($aProduct) || !is_array($aProduct) || empty($aProduct['product']))
-            return [];
-
-        return $aProduct['product'];
-    }
-
-    public function getOptionWebhookUrl()
-    {
-        return bx_append_url_params(BX_DOL_URL_ROOT . 'agents.php', [
-            'p' => $this->_iId,
-            'a' => 'webhook'
-        ]);
-    }
-
-    public function processActionWebhook()
-    {
-        $sData = @file_get_contents('php://input');
-
-        $this->_log(json_decode($sData, true));
-
-        $sHmacHeader = isset($_SERVER['HTTP_X_SHOPIFY_HMAC_SHA256']) ? $_SERVER['HTTP_X_SHOPIFY_HMAC_SHA256'] : '';
-        if(!$this->_verifyWebhook($sData, $sHmacHeader)) {
-            http_response_code(401);
-            return;
-        }
-
-        $oAi = BxDolAI::getInstance();
-
-        $aAutomators = $oAi->getAutomatorsWebhook($this->_iId);
-        foreach($aAutomators as $aAutomator)
-            $oAi->callAutomator(BX_DOL_AI_AUTOMATOR_WEBHOOK, [
-                'automator' => $aAutomator
-            ]);
-
-        http_response_code(200);
-    }
-
-    public function call($sRequest, $aParams, $sMethod = 'post-json', $aHeaders = [])
-    {
-        $aHeaders[] = 'Content-Type: application/json';
-        if(!empty($this->_sAccessToken))
-            $aHeaders[] = 'X-Shopify-Access-Token: ' . $this->_sAccessToken;
-        else
-            $aHeaders[] = 'Authorization: Basic ' . base64_encode($this->_sApiKey . ':' . $this->_sApiSecretKey);
-
-        $sResponse = bx_file_get_contents($this->_sEndpoint . $sRequest, $aParams, $sMethod, $aHeaders);
-        if(empty($sResponse))
-            return false;
-        
-        $aResponse = json_decode($sResponse, true);
-        if(empty($aResponse) || !is_array($aResponse))
-            return false;
-
-        return $aResponse;
-    }
-
-    /**
-     * Internal methods.
-     */    
-    protected function _dateI2S($iTimestamp)
-    {
-        return date("Y-m-d", $iTimestamp);
-    }
-
-    protected function _verifyWebhook($sData, $sHmacHeader)
-    {
-        $sHmacCalc = base64_encode(hash_hmac('sha256', $sData, $this->getOption('secret_key'), true));
-        return hash_equals($sHmacCalc, $sHmacHeader);
-    }
-}

+ 0 - 505
inc/classes/BxDolAIQuery.php

@@ -45,43 +45,6 @@ class BxDolAIQuery extends BxDolDb
         return self::_getObject($iId, 'sys_agents_tools');
     }
 
-    static public function getProviderObject(int $iId)
-    {
-        $oDb = BxDolDb::getInstance();
-
-        $aProvider = $oDb->getRow("SELECT * FROM `sys_agents_providers` WHERE `id` = :id", ['id' => $iId]);
-        if(!$aProvider || !is_array($aProvider))
-            return false;
-
-        // get type
-        $aProviderType = $oDb->getRow("SELECT * FROM `sys_agents_provider_types` WHERE `id` = :id", ['id' => $aProvider['type_id']]);
-        if(!$aProviderType || !is_array($aProviderType))
-            return false;
-
-        $aProvider['type'] = $aProviderType;
-
-        // get options
-        $sQuery = "SELECT
-               `tpo`.`name` AS `name`,
-               `tpv`.`value` AS `value`
-            FROM `sys_agents_provider_options` AS `tpo`
-            LEFT JOIN `sys_agents_providers_values` AS `tpv` ON `tpo`.`id` = `tpv`.`option_id` AND `tpv`.`provider_id` = :provider_id
-            WHERE 1 ORDER BY `tpo`.`order`";
-
-        $aProvider['options'] = $oDb->getAllWithKey($sQuery, 'name', [
-            'provider_id' => $iId
-        ]);
-
-        return $aProvider;
-    }
-
-    static public function getProviderIdByName($sName)
-    {
-        return (int)BxDolDb::getInstance()->getOne("SELECT `id` FROM `sys_agents_providers` WHERE `name`=:name LIMIT 1", [
-            'name' => $sName
-        ]);
-    }
-    
     static public function getAssistantObject($iId)
     {
         $oDb = BxDolDb::getInstance();
@@ -148,474 +111,6 @@ class BxDolAIQuery extends BxDolDb
         return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
     }
 
-    public function getAutomatorsBy($aParams = [], $bFromCache = true)
-    {
-        $aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
-        $sSelectClause = "`taa`.*";
-    	$sPostfix = $sJoinClause = $sWhereClause = "";
-
-        switch($aParams['sample']) {
-            case 'id':
-            	$aMethod['name'] = 'getRow';
-            	$aMethod['params'][1] = [
-                    'id' => $aParams['id']
-                ];
-
-                $sWhereClause .= " AND `taa`.`id`=:id";
-                break;
-
-            case 'id_full':
-            	$aMethod['name'] = 'getRow';
-            	$aMethod['params'][1] = [
-                    'id' => $aParams['id']
-                ];
-
-                $sSelectClause .= ", `tam`.`name` AS `model_name`, `tam`.`title` AS `model_title`, `tam`.`key` AS `model_key`, `tam`.`params` AS `model_params`";
-                $sJoinClause .= " LEFT JOIN `sys_agents_models` AS `tam` ON `taa`.`model_id`=`tam`.`id`";
-                $sWhereClause .= " AND `taa`.`id`=:id";
-                break;
-
-            case 'type':
-                $sPostfix .= '_' . $aParams['type'];
-
-                $aMethod['params'][1] = [
-                    'type' => $aParams['type']
-                ];
-
-                $sWhereClause .= " AND `taa`.`type`=:type";
-
-                if(isset($aParams['active'])) {
-                    $iActive = (int)$aParams['active'];
-                    $sPostfix .= '_' . (!$iActive ? 'in' : '') . 'active';
-
-                    $aMethod['params'][1]['active'] = $iActive;
-                    $sWhereClause .= " AND `taa`.`active`=:active";
-                }
-                break;
-
-            case 'events':
-                $aBindings = [
-                    'type' => BX_DOL_AI_AUTOMATOR_EVENT,
-                    'alert_unit' => $aParams['alert_unit'],
-                    'alert_action' => $aParams['alert_action']
-                ];
-                $sPostfix .= '_' . implode('_', $aBindings);
-
-                $aMethod['params'][1] = $aBindings;
-                $sWhereClause .= " AND `taa`.`type`=:type AND `taa`.`alert_unit`=:alert_unit AND `taa`.`alert_action`=:alert_action";
-
-                if(isset($aParams['active'])) {
-                    $iActive = (int)$aParams['active'];
-                    $sPostfix .= '_' . (!$iActive ? 'in' : '') . 'active';
-
-                    $aMethod['params'][1]['active'] = $iActive;
-                    $sWhereClause .= " AND `taa`.`active`=:active";
-                }
-                break;
-
-            case 'schedulers':
-                $aMethod['params'][1] = [
-                    'type' => BX_DOL_AI_AUTOMATOR_SCHEDULER,
-                ];
-
-                $sWhereClause .= " AND `taa`.`type`=:type";
-
-                if(isset($aParams['active'])) {
-                    $aMethod['params'][1]['active'] = (int)$aParams['active'];
-
-                    $sWhereClause .= " AND `taa`.`active`=:active";
-                }
-                break;
-
-            case 'webhooks':
-                $aMethod['params'][1] = [
-                    'type' => BX_DOL_AI_AUTOMATOR_WEBHOOK,
-                ];
-
-                $sWhereClause .= " AND `taa`.`type`=:type";
-
-                if(isset($aParams['provider_id'])) {
-                    $aMethod['params'][1]['provider_id'] = (int)$aParams['provider_id'];
-
-                    $sJoinClause = "INNER JOIN `sys_agents_automators_providers` AS `tap` ON `taa`.`id`=`tap`.`automator_id`";
-                    $sWhereClause .= " AND `tap`.`provider_id`=:provider_id";
-                }
-
-                if(isset($aParams['active'])) {
-                    $aMethod['params'][1]['active'] = (int)$aParams['active'];
-
-                    $sWhereClause .= " AND `taa`.`active`=:active";
-                }
-                break;
-
-            case 'providers_by_id_pairs':
-                $aMethod['name'] = 'getPairs';
-                $aMethod['params'][1] = 'id';
-                $aMethod['params'][2] = 'provider_id';
-                $aMethod['params'][3] = [
-                    'id' => $aParams['id']
-                ];
-
-                $sSelectClause = "`taap`.`id`, `taap`.`provider_id`";
-                $sJoinClause = "INNER JOIN `sys_agents_automators_providers` AS `taap` ON `taa`.`id`=`taap`.`automator_id`";
-                $sWhereClause = " AND `taa`.`id`=:id";
-                break;
-            
-            case 'helpers_by_id_pairs':
-                $aMethod['name'] = 'getPairs';
-                $aMethod['params'][1] = 'id';
-                $aMethod['params'][2] = 'helper_id';
-                $aMethod['params'][3] = [
-                    'id' => $aParams['id']
-                ];
-
-                $sSelectClause = "`taah`.`id`, `taah`.`helper_id`";
-                $sJoinClause = "INNER JOIN `sys_agents_automators_helpers` AS `taah` ON `taa`.`id`=`taah`.`automator_id`";
-                $sWhereClause = " AND `taa`.`id`=:id";
-                break;
-            
-            case 'assistants_by_id_pairs':
-                $aMethod['name'] = 'getPairs';
-                $aMethod['params'][1] = 'id';
-                $aMethod['params'][2] = 'assistant_id';
-                $aMethod['params'][3] = [
-                    'id' => $aParams['id']
-                ];
-
-                $sSelectClause = "`taaa`.`id`, `taaa`.`assistant_id`";
-                $sJoinClause = "INNER JOIN `sys_agents_automators_assistants` AS `taaa` ON `taa`.`id`=`taaa`.`automator_id`";
-                $sWhereClause = " AND `taa`.`id`=:id";
-                break;
-        }
-
-        $aMethod['params'][0] = "SELECT " . $sSelectClause . "
-            FROM `sys_agents_automators` AS `taa` " . $sJoinClause . "
-            WHERE 1" . $sWhereClause;
-
-        if(!$bFromCache || empty($sPostfix))
-            return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
-
-        return call_user_func_array([$this, 'fromMemory'], array_merge(['sys_automators' . $sPostfix, $aMethod['name']], $aMethod['params']));
-    }
-
-    public function updateAutomators($aSetClause, $aWhereClause)
-    {
-        if(empty($aSetClause) || empty($aWhereClause))
-            return false;
-
-        return (int)$this->query("UPDATE `sys_agents_automators` SET " . $this->arrayToSQL($aSetClause) . " WHERE " . $this->arrayToSQL($aWhereClause)) > 0;
-    }
-
-    public function insertAutomatorProvider($aParamsSet)
-    {
-        if(empty($aParamsSet))
-            return false;
-
-        return (int)$this->query("INSERT INTO `sys_agents_automators_providers` SET " . $this->arrayToSQL($aParamsSet)) > 0 ? (int)$this->lastId() : false;
-    }
-
-    public function updateAutomatorProvider($aParamsSet, $aParamsWhere)
-    {
-        if(empty($aParamsSet) || empty($aParamsWhere))
-            return false;
-
-        return $this->query("UPDATE `sys_agents_automators_providers` SET " . $this->arrayToSQL($aParamsSet) . " WHERE " . $this->arrayToSQL($aParamsWhere, " AND "));
-    }
-
-    public function deleteAutomatorProviders($aParamsWhere)
-    {
-        if(empty($aParamsWhere))
-            return false;
-
-        return (int)$this->query("DELETE FROM `sys_agents_automators_providers` WHERE " . $this->arrayToSQL($aParamsWhere)) > 0;
-    }
-    
-    public function deleteAutomatorProvidersById($mixedId)
-    {
-        if(!is_array($mixedId))
-            $mixedId = [$mixedId];
-
-        return (int)$this->query("DELETE FROM `sys_agents_automators_providers` WHERE `id` IN (" . $this->implode_escape($mixedId) . ")") > 0;
-    }
-
-    public function insertAutomatorHelper($aParamsSet)
-    {
-        if(empty($aParamsSet))
-            return false;
-
-        return (int)$this->query("INSERT INTO `sys_agents_automators_helpers` SET " . $this->arrayToSQL($aParamsSet)) > 0 ? (int)$this->lastId() : false;
-    }
-
-    public function updateAutomatorHelper($aParamsSet, $aParamsWhere)
-    {
-        if(empty($aParamsSet) || empty($aParamsWhere))
-            return false;
-
-        return $this->query("UPDATE `sys_agents_automators_helpers` SET " . $this->arrayToSQL($aParamsSet) . " WHERE " . $this->arrayToSQL($aParamsWhere, " AND "));
-    }
-
-    public function deleteAutomatorHelpers($aParamsWhere)
-    {
-        if(empty($aParamsWhere))
-            return false;
-
-        return (int)$this->query("DELETE FROM `sys_agents_automators_helpers` WHERE " . $this->arrayToSQL($aParamsWhere)) > 0;
-    }
-
-    public function deleteAutomatorHelpersById($mixedId)
-    {
-        if(!is_array($mixedId))
-            $mixedId = [$mixedId];
-
-        return (int)$this->query("DELETE FROM `sys_agents_automators_helpers` WHERE `id` IN (" . $this->implode_escape($mixedId) . ")") > 0;
-    }
-
-    public function insertAutomatorAssistant($aParamsSet)
-    {
-        if(empty($aParamsSet))
-            return false;
-
-        return (int)$this->query("INSERT INTO `sys_agents_automators_assistants` SET " . $this->arrayToSQL($aParamsSet)) > 0 ? (int)$this->lastId() : false;
-    }
-
-    public function updateAutomatorAssistant($aParamsSet, $aParamsWhere)
-    {
-        if(empty($aParamsSet) || empty($aParamsWhere))
-            return false;
-
-        return $this->query("UPDATE `sys_agents_automators_assistants` SET " . $this->arrayToSQL($aParamsSet) . " WHERE " . $this->arrayToSQL($aParamsWhere, " AND "));
-    }
-
-    public function deleteAutomatorAssistants($aParamsWhere)
-    {
-        if(empty($aParamsWhere))
-            return false;
-
-        return (int)$this->query("DELETE FROM `sys_agents_automators_assistants` WHERE " . $this->arrayToSQL($aParamsWhere)) > 0;
-    }
-    
-    public function deleteAutomatorAssistantsById($mixedId)
-    {
-        if(!is_array($mixedId))
-            $mixedId = [$mixedId];
-
-        return (int)$this->query("DELETE FROM `sys_agents_automators_assistants` WHERE `id` IN (" . $this->implode_escape($mixedId) . ")") > 0;
-    }
-
-    public function getProviderTypesBy($aParams = [])
-    {
-        $aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
-    	$sWhereClause = "";
-
-        switch($aParams['sample']) {
-            case 'id':
-            	$aMethod['name'] = 'getRow';
-            	$aMethod['params'][1] = [
-                    'id' => $aParams['id']
-                ];
-
-                $sWhereClause .= " AND `id`=:id";
-                break;
-
-            case 'name':
-            	$aMethod['name'] = 'getRow';
-            	$aMethod['params'][1] = [
-                    'name' => $aParams['name']
-                ];
-
-                $sWhereClause .= " AND `name`=:name";
-                break;
-
-            case 'all_pairs':
-                $aMethod['name'] = 'getPairs';
-                $aMethod['params'][1] = 'id';
-                $aMethod['params'][2] = 'title';
-
-                if(isset($aParams['active'])) {
-                    $aMethod['params'][3] = [
-                        'active' => $aParams['active']
-                    ];
-
-                    $sWhereClause = " AND `active`=:active";
-                }
-                break;
-        }
-
-        $aMethod['params'][0] = "SELECT * 
-            FROM `sys_agents_provider_types`
-            WHERE 1" . $sWhereClause;
-
-        return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
-    }
-
-    public function getProviderOptionsBy($aParams = [])
-    {
-        $aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
-    	$sWhereClause = "";
-
-        switch($aParams['sample']) {
-            case 'id':
-            	$aMethod['name'] = 'getRow';
-            	$aMethod['params'][1] = [
-                    'id' => $aParams['id']
-                ];
-
-                $sWhereClause .= " AND `id`=:id";
-                break;
-
-            case 'provider_type_id':
-            	$aMethod['params'][1] = [
-                    'provider_type_id' => $aParams['provider_type_id']
-                ];
-
-                $sWhereClause .= " AND `provider_type_id`=:provider_type_id";
-                break;
-        }
-
-        $aMethod['params'][0] = "SELECT * 
-            FROM `sys_agents_provider_options`
-            WHERE 1" . $sWhereClause;
-
-        return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
-    }
-
-    public function getProvidersBy($aParams = [])
-    {
-    	$aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
-
-    	$sSelectClause = "`tp`.*";
-    	$sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
-        switch($aParams['sample']) {
-            case 'id':
-            	$aMethod['name'] = 'getRow';
-            	$aMethod['params'][1] = [
-                    'id' => $aParams['id']
-                ];
-
-                $sWhereClause = " AND `tp`.`id`=:id";
-                break;
-
-            case 'ids':
-                $sSelectClause .= ", `tpt`.`name` AS `type_name`";
-                $sJoinClause = "INNER JOIN `sys_agents_provider_types` AS `tpt` ON `tp`.`type_id`=`tpt`.`id`";
-                $sWhereClause = " AND `tp`.`id` IN (" . $this->implode_escape($aParams['ids']) . ")";
-                break;
-                 
-            case 'options_by_id':
-                $aMethod['params'][1] = [
-                    'id' => $aParams['id']
-                ];
-
-                $sSelectClause = "`tpo`.`id`, `tpo`.`name`, `tpo`.`type`, `tpo`.`title`, `tpo`.`description`, `tpv`.`value`";
-                $sJoinClause = "LEFT JOIN `sys_agents_provider_options` AS `tpo` ON `tp`.`type_id`=`tpo`.`provider_type_id` LEFT JOIN `sys_agents_providers_values` AS `tpv` ON `tp`.`id`=`tpv`.`provider_id` AND `tpo`.`id`=`tpv`.`option_id`";
-                $sWhereClause = " AND `tp`.`id`=:id";
-                break;
-            
-            case 'all_pairs':
-                $aMethod['name'] = 'getPairs';
-                $aMethod['params'][1] = 'id';
-                $aMethod['params'][2] = 'name';
-
-                if(isset($aParams['active'])) {
-                    $aMethod['params'][3] = [
-                        'active' => $aParams['active']
-                    ];
-
-                    $sWhereClause = " AND `tp`.`active`=:active";
-                }
-                break;
-        }
-
-        $sOrderClause = !empty($sOrderClause) ? "ORDER BY " . $sOrderClause : $sOrderClause;
-        $sLimitClause = !empty($sLimitClause) ? "LIMIT " . $sLimitClause : $sLimitClause;
-
-        $aMethod['params'][0] = "SELECT
-                " . $sSelectClause . "
-            FROM `sys_agents_providers` AS `tp` " . $sJoinClause . "
-            WHERE 1" . $sWhereClause . " " . $sGroupClause . " " . $sOrderClause . " " . $sLimitClause;
-
-        return call_user_func_array(array($this, $aMethod['name']), $aMethod['params']);
-    }
-
-    public function insertProviderValue($aParamsSet)
-    {
-        if(empty($aParamsSet) || !is_array($aParamsSet) || !isset($aParamsSet['value']))
-            return false;
-
-        return (int)$this->query("INSERT INTO `sys_agents_providers_values` SET " . $this->arrayToSQL($aParamsSet) . " ON DUPLICATE KEY UPDATE `value`=:value", [
-            'value' => $aParamsSet['value']
-        ]) > 0 ? (int)$this->lastId() : false;
-    }
-
-    public function updateProviderValue($aParamsSet, $aParamsWhere)
-    {
-        if(empty($aParamsSet))
-            return false;
-
-        $sWhereClause = "1";
-        if(!empty($aParamsWhere) && is_array($aParamsWhere))
-            $sWhereClause = $this->arrayToSQL($aParamsWhere, ' AND ');
-
-        return $this->query("UPDATE `sys_agents_providers_values` SET " . $this->arrayToSQL($aParamsSet) . " WHERE " . $sWhereClause) !== false;
-    }
-
-    public function deleteProviderValues($aParamsWhere)
-    {
-        if(empty($aParamsWhere))
-            return false;
-
-        return (int)$this->query("DELETE FROM `sys_agents_providers_values` WHERE " . $this->arrayToSQL($aParamsWhere, ' AND ')) > 0;
-    }
-    
-    public function getHelpersBy($aParams = [])
-    {
-        $aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
-        $sSelectClause = "`th`.*";
-    	$sJoinClause = $sWhereClause = "";
-
-        switch($aParams['sample']) {
-            case 'id':
-            	$aMethod['name'] = 'getRow';
-            	$aMethod['params'][1] = [
-                    'id' => $aParams['id']
-                ];
-
-                $sWhereClause .= " AND `th`.`id`=:id";
-                break;
-            case 'name':
-            	$aMethod['name'] = 'getRow';
-            	$aMethod['params'][1] = [
-                    'name' => $aParams['name']
-                ];
-
-                $sWhereClause .= " AND `th`.`name`=:name";
-                break;
-            case 'ids':
-                $sWhereClause = " AND `th`.`id` IN (" . $this->implode_escape($aParams['ids']) . ")";
-                break;
-
-            case 'all_pairs':
-                $aMethod['name'] = 'getPairs';
-                $aMethod['params'][1] = 'id';
-                $aMethod['params'][2] = 'name';
-
-                if(isset($aParams['active'])) {
-                    $aMethod['params'][3] = [
-                        'active' => $aParams['active']
-                    ];
-
-                    $sWhereClause = " AND `th`.`active`=:active";
-                }
-                break;
-        }
-
-        $aMethod['params'][0] = "SELECT " . $sSelectClause . "
-            FROM `sys_agents_helpers` AS `th` " . $sJoinClause . "
-            WHERE 1" . $sWhereClause;
-
-        return call_user_func_array([$this, $aMethod['name']], $aMethod['params']);
-    }
-
     public function getVectorStores (): mixed
     {
         $sQuery = "SELECT `id`, `title` FROM `sys_agents_vector_store` WHERE `active` = 1 ORDER BY `title` ASC";

+ 0 - 12
inc/classes/BxDolAlerts.php

@@ -187,18 +187,6 @@ class BxDolAlerts extends BxDol
                 }
             }
         }
-
-        // call automators
-        $oAi = BxDolAI::getInstance();
-        if($oAi->hasAutomators(BX_DOL_AI_AUTOMATOR_EVENT, true)) {
-            $aAutomators = $oAi->getAutomatorsEvent($this->sUnit, $this->sAction);
-            foreach($aAutomators as $aAutomator) {
-                $oAi->callAutomator(BX_DOL_AI_AUTOMATOR_EVENT, [
-                    'automator' => $aAutomator,
-                    'alert' => $this
-                ]);
-            }
-        }        
     }
 
     /**

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 0 - 0
install/sql/system.sql


+ 1 - 93
modules/boonex/english/data/langs/system/en.xml

@@ -2297,19 +2297,6 @@
     <string name="_sys_agents_json_field_err"><![CDATA[Invalid JSON format.]]></string>
     <string name="_sys_agents_unauthorized"><![CDATA[You are not allowed to interact with this agent.]]></string>
     <string name="_sys_agents_agent_not_found"><![CDATA[Agent was not found or is inactive.]]></string>
-    <string name="_sys_agents_automators_txt_active"><![CDATA[Active]]></string>
-    <string name="_sys_agents_automators_txt_name"><![CDATA[Name]]></string>
-    <string name="_sys_agents_automators_txt_type"><![CDATA[Type]]></string>
-    <string name="_sys_agents_automators_txt_alert_unit"><![CDATA[Unit]]></string>
-    <string name="_sys_agents_automators_txt_alert_action"><![CDATA[Action]]></string>
-    <string name="_sys_agents_automators_txt_scheduler_time"><![CDATA[Time]]></string>
-    <string name="_sys_agents_automators_txt_model_id"><![CDATA[Model]]></string>
-    <string name="_sys_agents_automators_txt_profile_id"><![CDATA[Profile]]></string>
-    <string name="_sys_agents_automators_txt_message_id"><![CDATA[Prompt]]></string>
-    <string name="_sys_agents_automators_txt_messages"><![CDATA[Messages]]></string>
-    <string name="_sys_agents_automators_txt_code"><![CDATA[Code]]></string>
-    <string name="_sys_agents_automators_txt_added"><![CDATA[Added]]></string>
-    <string name="_sys_agents_automators_txt_status"><![CDATA[Status]]></string>
     <string name="_sys_agents_agents_txt_name"><![CDATA[Name]]></string>
     <string name="_sys_agents_agents_txt_model"><![CDATA[Model]]></string>
     <string name="_sys_agents_agents_txt_trigger"><![CDATA[Trigger]]></string>
@@ -2326,10 +2313,6 @@
 
     <string name="_Run"><![CDATA[Run]]></string>
 
-    <string name="_sys_agents_automators_btn_add"><![CDATA[Add]]></string>
-    <string name="_sys_agents_automators_btn_tune"><![CDATA[Tune]]></string>
-    <string name="_sys_agents_automators_btn_approve"><![CDATA[Approve]]></string>
-    <string name="_sys_agents_automators_popup_add"><![CDATA[Add automator]]></string>
     <string name="_sys_agents_count_today"><![CDATA[{0} calls today]]></string>
     <string name="_sys_agents_count_per_req"><![CDATA[{0} calls per request]]></string>
     <string name="_sys_agents_field_async"><![CDATA[Delayed execution]]></string>
@@ -2339,16 +2322,10 @@
     <string name="_sys_agents_field_name_info"><![CDATA[Uniq agent name]]></string>
     <string name="_sys_agents_field_model_id"><![CDATA[Model]]></string>
     <string name="_sys_agents_field_model_id_info"><![CDATA[AI model to use for this agent.]]></string>
-    <string name="_sys_agents_automators_field_profile_id"><![CDATA[Profile]]></string>
-    <string name="_sys_agents_automators_field_profile_id_inf"><![CDATA[Leave empty to use default.]]></string>
     <string name="_sys_agents_field_profile_id"><![CDATA[Profile]]></string>
     <string name="_sys_agents_field_profile_id_inf"><![CDATA[AI agent will perform actions under this profile]]></string>
     <string name="_sys_agents_field_acl_levels"><![CDATA[Who can interact]]></string>
     <string name="_sys_agents_field_acl_levels_info"><![CDATA[Membership levels that may chat with this agent, use it in messenger, or fill form fields with it. Leave empty for Nobody. Studio operators can always use the agent to debug. Unauthenticated allows guests.]]></string>
-    <string name="_sys_agents_automators_field_type"><![CDATA[Type]]></string>
-    <string name="_sys_agents_automators_field_type_event"><![CDATA[Event]]></string>
-    <string name="_sys_agents_automators_field_type_scheduler"><![CDATA[Scheduler]]></string>
-    <string name="_sys_agents_automators_field_type_webhook"><![CDATA[Webhook]]></string>
     <string name="_sys_agents_field_trigger"><![CDATA[Trigger]]></string>
     <string name="_sys_agents_field_trigger_info"><![CDATA[Trigger which will initiate agent to run. Alert — system event notification. Scheduler — time-based scheduled execution. Webhook — external HTTP trigger. Manual — user-initiated run. Agent — triggered by another agent. Message — triggered by chat message. Form field — compose form field value.]]></string>
     <string name="_sys_agents_field_trigger_alert"><![CDATA[Alert]]></string>
@@ -2417,68 +2394,10 @@
     <string name="_sys_agents_tools_field_params_info"><![CDATA[Parameters for configuring the tool, specific to each tool]]></string>
     <string name="_sys_agents_field_chat_history_context"><![CDATA[Chat history context window]]></string>
     <string name="_sys_agents_field_chat_history_context_info"><![CDATA[Automatically cut the conversation history based on the size of the context window, set to '0' to disable chat history]]></string>
-    <string name="_sys_agents_automators_field_providers"><![CDATA[Providers]]></string>
-    <string name="_sys_agents_automators_field_providers_add"><![CDATA[Add]]></string>
-    <string name="_sys_agents_automators_field_helpers"><![CDATA[Helpers]]></string>
-    <string name="_sys_agents_automators_field_helpers_add"><![CDATA[Add]]></string>
-    <string name="_sys_agents_automators_field_assistants"><![CDATA[Assistants]]></string>
-    <string name="_sys_agents_automators_field_assistants_add"><![CDATA[Add]]></string>
-    <string name="_sys_agents_automators_field_message"><![CDATA[Prompt]]></string>
-    <string name="_sys_agents_automators_field_message_err"><![CDATA[Prompt is essential. Please type something here.]]></string>
-    <string name="_sys_agents_automators_field_status_auto"><![CDATA[Auto]]></string>
-    <string name="_sys_agents_automators_field_status_manual"><![CDATA[Manual]]></string>
-    <string name="_sys_agents_automators_field_status_ready"><![CDATA[Ready]]></string>
-    <string name="_sys_agents_automators_err_event_not_found"><![CDATA[Event isn't found, please rephrase your prompt.]]></string>
-    <string name="_sys_agents_automators_err_cannot_get_code"><![CDATA[Can't generate code, please rephrase your prompt.]]></string>
-    <string name="_sys_agents_automators_txt_eval_response"><![CDATA[Response:<br />]]></string>
-    <string name="_sys_agents_providers_txt_active"><![CDATA[Active]]></string>
-    <string name="_sys_agents_providers_txt_provider_name"><![CDATA[Name]]></string>
-    <string name="_sys_agents_providers_txt_provider_type"><![CDATA[Type]]></string>
-    <string name="_sys_agents_providers_txt_added"><![CDATA[Added]]></string>
-    <string name="_sys_agents_providers_btn_add"><![CDATA[Add Provider]]></string>
-    <string name="_sys_agents_providers_btn_info"><![CDATA[Info]]></string>
-    <string name="_sys_agents_providers_btn_edit"><![CDATA[Edit]]></string>
-    <string name="_sys_agents_providers_btn_delete"><![CDATA[Delete]]></string>
-    <string name="_sys_agents_providers_popup_add"><![CDATA[Add provider]]></string>
-    <string name="_sys_agents_providers_popup_edit"><![CDATA[Edit provider]]></string>
-    <string name="_sys_agents_providers_popup_view"><![CDATA[View provider]]></string>
-    <string name="_sys_agents_providers_field_type_id"><![CDATA[Type]]></string>
-    <string name="_sys_agents_providers_field_type_id_err"><![CDATA[Type is essential. Please select a value.]]></string>
-    <string name="_sys_agents_providers_field_name"><![CDATA[Name]]></string>        
-    <string name="_sys_agents_pvd_cpt_shopify_admin"><![CDATA[Shopify (Admin API)]]></string>
-    <string name="_sys_agents_pvd_opt_cpt_active"><![CDATA[Active]]></string>
-    <string name="_sys_agents_pvd_opt_dsc_active"><![CDATA[Activate(Deactivate) source]]></string>
-    <string name="_sys_agents_pvd_opt_cpt_shop_domain"><![CDATA[Shop domain]]></string>
-    <string name="_sys_agents_pvd_opt_dsc_shop_domain"><![CDATA[]]></string>
-    <string name="_sys_agents_pvd_opt_cpt_access_token"><![CDATA[Access token]]></string>
-    <string name="_sys_agents_pvd_opt_dsc_access_token"><![CDATA[]]></string>
-    <string name="_sys_agents_pvd_opt_cpt_secret_key"><![CDATA[Secret key]]></string>
-    <string name="_sys_agents_pvd_opt_dsc_secret_key"><![CDATA[]]></string>
-    <string name="_sys_agents_pvd_opt_cpt_webhook_url"><![CDATA[Webhook URL]]></string>
-    <string name="_sys_agents_pvd_opt_dsc_webhook_url"><![CDATA[]]></string>
-    <string name="_sys_agents_helpers_txt_active"><![CDATA[Active]]></string>
-    <string name="_sys_agents_helpers_txt_name"><![CDATA[Name]]></string>
-    <string name="_sys_agents_helpers_txt_model_id"><![CDATA[Model]]></string>
-    <string name="_sys_agents_helpers_txt_profile_id"><![CDATA[Profile]]></string>
-    <string name="_sys_agents_helpers_txt_prompt"><![CDATA[Prompt]]></string>
-    <string name="_sys_agents_helpers_txt_added"><![CDATA[Added]]></string>
-    <string name="_sys_agents_helpers_btn_add"><![CDATA[Add Helper]]></string>
-    <string name="_sys_agents_helpers_btn_tune"><![CDATA[Tune]]></string>
-    <string name="_sys_agents_helpers_field_name"><![CDATA[Name]]></string>
-    <string name="_sys_agents_helpers_field_model_id"><![CDATA[Model]]></string>
-    <string name="_sys_agents_helpers_field_profile_id"><![CDATA[Profile]]></string>
-    <string name="_sys_agents_helpers_field_profile_id_inf"><![CDATA[Leave empty to use default.]]></string>
-    <string name="_sys_agents_helpers_field_description"><![CDATA[Description]]></string>
-    <string name="_sys_agents_helpers_field_prompt"><![CDATA[Prompt]]></string>
-    <string name="_sys_agents_helpers_field_prompt_err"><![CDATA[Prompt is essential. Please type something here.]]></string>
-    <string name="_sys_agents_helpers_field_message"><![CDATA[Message]]></string>
-    <string name="_sys_agents_helpers_field_message_err"><![CDATA[Message is essential. Please type something here.]]></string>
-    <string name="_sys_agents_helpers_field_result"><![CDATA[Result]]></string>
-    <string name="_sys_agents_helpers_popup_add"><![CDATA[Add helper]]></string>
-    <string name="_sys_agents_helpers_popup_edit"><![CDATA[Edit helper]]></string>
     <string name="_sys_agents_models_txt_active"><![CDATA[Active]]></string>
     <string name="_sys_agents_models_txt_name"><![CDATA[Name]]></string>
     <string name="_sys_agents_models_txt_title"><![CDATA[Title]]></string>
+    <string name="_sys_agents_models_txt_type"><![CDATA[Type]]></string>
     <string name="_sys_agents_models_txt_key"><![CDATA[API Key]]></string>
     <string name="_sys_agents_models_txt_params"><![CDATA[Parameters]]></string>
     <string name="_sys_agents_models_txt_added"><![CDATA[Added]]></string>
@@ -2945,17 +2864,6 @@ If it is not enabled then please consider implementing this optimization, since
         <string name="_sys_form_account_input_publish"><![CDATA[Create new account]]></string>
         <string name="_sys_form_account_input_caption_system_picture"><![CDATA[Account Picture]]></string>
         <string name="_sys_form_account_input_picture"><![CDATA[Upload an account picture]]></string>
-        <string name="_sys_form_agents_comment"><![CDATA[Agents: Message]]></string>
-        <string name="_sys_form_display_agents_comment_post"><![CDATA[Agents: Message Send]]></string>
-        <string name="_sys_form_agents_comment_input_caption_system_action"><![CDATA[Action]]></string>
-        <string name="_sys_form_agents_comment_input_caption_system_cmt_image"><![CDATA[Image]]></string>
-	<string name="_sys_form_agents_comment_input_caption_system_cmt_parent_id"><![CDATA[Parent ID]]></string>
-	<string name="_sys_form_agents_comment_input_caption_system_cmt_submit"><![CDATA[Send]]></string>
-        <string name="_sys_form_agents_comment_input_caption_cmt_submit"><![CDATA[Send]]></string>
-	<string name="_sys_form_agents_comment_input_caption_system_cmt_text"><![CDATA[Text]]></string>
-        <string name="_sys_form_agents_comment_input_caption_cmt_text_error"><![CDATA[Empty message isn't allowed. Write something to send to assistant.]]></string>
-        <string name="_sys_form_agents_comment_input_caption_system_id"><![CDATA[Object ID]]></string>
-        <string name="_sys_form_agents_comment_input_caption_system_sys"><![CDATA[Object Type]]></string>
 	<string name="_sys_form_checkbox_value_off"><![CDATA[No]]></string>
 	<string name="_sys_form_checkbox_value_on"><![CDATA[Yes]]></string>
         <string name="_sys_form_input_caption_author"><![CDATA[Author]]></string>

+ 1 - 93
modules/boonex/russian/data/langs/system/ru.xml

@@ -2271,19 +2271,6 @@
         <string name="_sys_agents_json_field_err"><![CDATA[Неверный формат JSON.]]></string>
         <string name="_sys_agents_unauthorized"><![CDATA[Вам не разрешено взаимодействовать с этим агентом.]]></string>
         <string name="_sys_agents_agent_not_found"><![CDATA[Агент не найден или неактивен.]]></string>
-        <string name="_sys_agents_automators_txt_active"><![CDATA[Активный]]></string>
-        <string name="_sys_agents_automators_txt_name"><![CDATA[Название]]></string>
-        <string name="_sys_agents_automators_txt_type"><![CDATA[Тип]]></string>
-        <string name="_sys_agents_automators_txt_alert_unit"><![CDATA[Тип события]]></string>
-        <string name="_sys_agents_automators_txt_alert_action"><![CDATA[Alert - действие события]]></string>
-        <string name="_sys_agents_automators_txt_scheduler_time"><![CDATA[Время для планировщика]]></string>
-        <string name="_sys_agents_automators_txt_model_id"><![CDATA[Модель]]></string>
-        <string name="_sys_agents_automators_txt_profile_id"><![CDATA[Профиль]]></string>
-        <string name="_sys_agents_automators_txt_message_id"><![CDATA[Инструкции]]></string>
-        <string name="_sys_agents_automators_txt_messages"><![CDATA[Сообщения]]></string>
-        <string name="_sys_agents_automators_txt_code"><![CDATA[Код]]></string>
-        <string name="_sys_agents_automators_txt_added"><![CDATA[Добавлено]]></string>
-        <string name="_sys_agents_automators_txt_status"><![CDATA[Статус]]></string>
         <string name="_sys_agents_agents_txt_name"><![CDATA[Название]]></string>
         <string name="_sys_agents_agents_txt_model"><![CDATA[Модель]]></string>
         <string name="_sys_agents_agents_txt_trigger"><![CDATA[Триггер]]></string>
@@ -2300,10 +2287,6 @@
 
         <string name="_Run"><![CDATA[Запустить]]></string>
 
-        <string name="_sys_agents_automators_btn_add"><![CDATA[Добавить]]></string>
-        <string name="_sys_agents_automators_btn_tune"><![CDATA[Настройка]]></string>
-        <string name="_sys_agents_automators_btn_approve"><![CDATA[Одобрить]]></string>
-        <string name="_sys_agents_automators_popup_add"><![CDATA[Добавить автоматизатор]]></string>
         <string name="_sys_agents_count_today"><![CDATA[{0} вызовов сегодня]]></string>
         <string name="_sys_agents_count_per_req"><![CDATA[{0} вызовов на запрос]]></string>
         <string name="_sys_agents_popup_edit"><![CDATA[Редактировать автоматизатор]]></string>
@@ -2311,16 +2294,10 @@
         <string name="_sys_agents_field_async_inf"><![CDATA[Запустить агента позже, чтобы не блокировать/замедлять выполнение основного кода. Не применяется для 'manual' и 'scheduler'. Для 'alert' — переопределение значений не сработает. Для 'messenger' — сообщения не появятся автоматически.]]></string>
         <string name="_sys_agents_field_model_id"><![CDATA[Модель]]></string>
         <string name="_sys_agents_field_model_id_info"><![CDATA[Модель для использования этим агентом.]]></string>
-        <string name="_sys_agents_automators_field_profile_id"><![CDATA[Профиль]]></string>
-        <string name="_sys_agents_automators_field_profile_id_inf"><![CDATA[Оставьте пустым, чтобы использовать значение по умолчанию.]]></string>
         <string name="_sys_agents_field_profile_id"><![CDATA[Профиль]]></string>
         <string name="_sys_agents_field_profile_id_inf"><![CDATA[Профайл, от имени которого ИИ агент выполняет действия.]]></string>
         <string name="_sys_agents_field_acl_levels"><![CDATA[Кто может взаимодействовать]]></string>
         <string name="_sys_agents_field_acl_levels_info"><![CDATA[Уровни членства, которые могут общаться с этим агентом, писать ему в мессенджере или заполнять поля форм с его помощью. Оставьте пустым — никто. Операторы Studio всегда могут использовать агента для отладки. «Неаутентифицированный» разрешает гостям.]]></string>
-        <string name="_sys_agents_automators_field_type"><![CDATA[Тип]]></string>
-        <string name="_sys_agents_automators_field_type_event"><![CDATA[Событие]]></string>
-        <string name="_sys_agents_automators_field_type_scheduler"><![CDATA[Планировщик]]></string>
-        <string name="_sys_agents_automators_field_type_webhook"><![CDATA[Вебхук]]></string>
         <string name="_sys_agents_field_trigger"><![CDATA[Триггер]]></string>
         <string name="_sys_agents_field_trigger_info"><![CDATA[Триггер, который запускает агента. Alert — системное событие. Scheduler — запуск по расписанию. Webhook — HTTP внешний вызов. Manual — ручной запуск. Agent — запуск другим агентом. Message — сообщение пользователя.]]></string>
         <string name="_sys_agents_field_trigger_alert"><![CDATA[Сигнал]]></string>
@@ -2390,68 +2367,10 @@
         <string name="_sys_agents_tools_field_params_info"><![CDATA[Параметры для конфигурации этого инструмента, свои для каждого инструмента]]></string>
         <string name="_sys_agents_field_chat_history_context"><![CDATA[Размер контекста истории чата]]></string>
         <string name="_sys_agents_field_chat_history_context_info"><![CDATA[Автоматически обрезать историю диалога на основе размера контекста, 0 - отключить историю чата]]></string>
-        <string name="_sys_agents_automators_field_providers"><![CDATA[Поставщики]]></string>
-        <string name="_sys_agents_automators_field_providers_add"><![CDATA[Добавить]]></string>
-        <string name="_sys_agents_automators_field_helpers"><![CDATA[Помощники]]></string>
-        <string name="_sys_agents_automators_field_helpers_add"><![CDATA[Добавить]]></string>
-        <string name="_sys_agents_automators_field_assistants"><![CDATA[Ассистенты]]></string>
-        <string name="_sys_agents_automators_field_assistants_add"><![CDATA[Добавить]]></string>
-        <string name="_sys_agents_automators_field_message"><![CDATA[Инструкции]]></string>
-        <string name="_sys_agents_automators_field_message_err"><![CDATA[Инструкции имеют важное значение. Пожалуйста, напишите что-нибудь здесь.]]></string>
-        <string name="_sys_agents_automators_field_status_auto"><![CDATA[Авто]]></string>
-        <string name="_sys_agents_automators_field_status_manual"><![CDATA[Ручной]]></string>
-        <string name="_sys_agents_automators_field_status_ready"><![CDATA[Готовый]]></string>
-        <string name="_sys_agents_automators_err_event_not_found"><![CDATA[Событие не найдено. Перефразируйте запрос.]]></string>
-        <string name="_sys_agents_automators_err_cannot_get_code"><![CDATA[Невозможно сгенерировать код. Перефразируйте запрос.]]></string>
-        <string name="_sys_agents_automators_txt_eval_response"><![CDATA[Ответ:<br />]]></string>
-        <string name="_sys_agents_providers_txt_active"><![CDATA[Активный]]></string>
-        <string name="_sys_agents_providers_txt_provider_name"><![CDATA[Название]]></string>
-        <string name="_sys_agents_providers_txt_provider_type"><![CDATA[Тип]]></string>
-        <string name="_sys_agents_providers_txt_added"><![CDATA[Добавлено]]></string>
-        <string name="_sys_agents_providers_btn_add"><![CDATA[Добавить]]></string>
-        <string name="_sys_agents_providers_btn_info"><![CDATA[Инфо]]></string>
-        <string name="_sys_agents_providers_btn_edit"><![CDATA[Редактировать]]></string>
-        <string name="_sys_agents_providers_btn_delete"><![CDATA[Удалить]]></string>
-        <string name="_sys_agents_providers_popup_add"><![CDATA[Добавить поставщика]]></string>
-        <string name="_sys_agents_providers_popup_edit"><![CDATA[Редактировать поставщика]]></string>
-        <string name="_sys_agents_providers_popup_view"><![CDATA[Посмотреть поставщика]]></string>
-        <string name="_sys_agents_providers_field_type_id"><![CDATA[Тип]]></string>
-        <string name="_sys_agents_providers_field_type_id_err"><![CDATA[Тип имеет важное значение. Пожалуйста, выберите значение.]]></string>
-        <string name="_sys_agents_providers_field_name"><![CDATA[Название]]></string>
-        <string name="_sys_agents_pvd_cpt_shopify_admin"><![CDATA[Shopify (Admin API)]]></string>
-        <string name="_sys_agents_pvd_opt_cpt_active"><![CDATA[Активировать]]></string>
-        <string name="_sys_agents_pvd_opt_dsc_active"><![CDATA[Активировать(деактивировать) источник.]]></string>
-        <string name="_sys_agents_pvd_opt_cpt_shop_domain"><![CDATA[Домен магазина]]></string>
-        <string name="_sys_agents_pvd_opt_dsc_shop_domain"><![CDATA[]]></string>
-        <string name="_sys_agents_pvd_opt_cpt_access_token"><![CDATA[Токен доступа]]></string>
-        <string name="_sys_agents_pvd_opt_dsc_access_token"><![CDATA[]]></string>
-        <string name="_sys_agents_pvd_opt_cpt_secret_key"><![CDATA[Секретный ключ]]></string>
-        <string name="_sys_agents_pvd_opt_dsc_secret_key"><![CDATA[]]></string>
-        <string name="_sys_agents_pvd_opt_cpt_webhook_url"><![CDATA[URL вебхука]]></string>
-        <string name="_sys_agents_pvd_opt_dsc_webhook_url"><![CDATA[]]></string>
-        <string name="_sys_agents_helpers_txt_active"><![CDATA[Активный]]></string>
-        <string name="_sys_agents_helpers_txt_name"><![CDATA[Название]]></string>
-        <string name="_sys_agents_helpers_txt_model_id"><![CDATA[Модель]]></string>
-        <string name="_sys_agents_helpers_txt_profile_id"><![CDATA[Профиль]]></string>
-        <string name="_sys_agents_helpers_txt_prompt"><![CDATA[Инструкции]]></string>
-        <string name="_sys_agents_helpers_txt_added"><![CDATA[Добавлено]]></string>
-        <string name="_sys_agents_helpers_btn_add"><![CDATA[Добавить помощника]]></string>
-        <string name="_sys_agents_helpers_btn_tune"><![CDATA[Настройка]]></string>
-        <string name="_sys_agents_helpers_field_name"><![CDATA[Название]]></string>
-        <string name="_sys_agents_helpers_field_model_id"><![CDATA[Модель]]></string>
-        <string name="_sys_agents_helpers_field_profile_id"><![CDATA[Профиль]]></string>
-        <string name="_sys_agents_helpers_field_profile_id_inf"><![CDATA[Оставьте пустым, чтобы использовать значение по умолчанию.]]></string>
-        <string name="_sys_agents_helpers_field_description"><![CDATA[Описание]]></string>
-        <string name="_sys_agents_helpers_field_prompt"><![CDATA[Инструкции]]></string>
-        <string name="_sys_agents_helpers_field_prompt_err"><![CDATA[Инструкции имеют важное значение. Пожалуйста, напишите что-нибудь здесь.]]></string>
-        <string name="_sys_agents_helpers_field_message"><![CDATA[Cообщение]]></string>
-        <string name="_sys_agents_helpers_field_message_err"><![CDATA[Cообщение имеет важное значение. Пожалуйста, напишите что-нибудь здесь.]]></string>
-        <string name="_sys_agents_helpers_field_result"><![CDATA[Результат]]></string>
-        <string name="_sys_agents_helpers_popup_add"><![CDATA[Добавить помощника]]></string>
-        <string name="_sys_agents_helpers_popup_edit"><![CDATA[Редактировать помощника]]></string>
         <string name="_sys_agents_models_txt_active"><![CDATA[Активный]]></string>
         <string name="_sys_agents_models_txt_name"><![CDATA[Имя]]></string>
         <string name="_sys_agents_models_txt_title"><![CDATA[Название]]></string>
+        <string name="_sys_agents_models_txt_type"><![CDATA[Тип]]></string>
         <string name="_sys_agents_models_txt_key"><![CDATA[Ключ API]]></string>
         <string name="_sys_agents_models_txt_params"><![CDATA[Параметры]]></string>
         <string name="_sys_agents_models_txt_added"><![CDATA[Добавлено]]></string>
@@ -2920,17 +2839,6 @@
         <string name="_sys_form_account_input_publish"><![CDATA[Создать новую учетную запись]]></string>
         <string name="_sys_form_account_input_caption_system_picture"><![CDATA[Изображение аккаунта]]></string>
         <string name="_sys_form_account_input_picture"><![CDATA[Загрузить изображение аккаунта]]></string>
-        <string name="_sys_form_agents_comment"><![CDATA[Агенты: Сообщение]]></string>
-        <string name="_sys_form_display_agents_comment_post"><![CDATA[Агенты: Отправить сообщение]]></string>
-        <string name="_sys_form_agents_comment_input_caption_system_action"><![CDATA[Действие]]></string>
-        <string name="_sys_form_agents_comment_input_caption_system_cmt_image"><![CDATA[Изображение]]></string>
-	<string name="_sys_form_agents_comment_input_caption_system_cmt_parent_id"><![CDATA[Родительский ID]]></string>
-	<string name="_sys_form_agents_comment_input_caption_system_cmt_submit"><![CDATA[Отправить]]></string>
-        <string name="_sys_form_agents_comment_input_caption_cmt_submit"><![CDATA[Отправить]]></string>
-	<string name="_sys_form_agents_comment_input_caption_system_cmt_text"><![CDATA[Текст]]></string>
-        <string name="_sys_form_agents_comment_input_caption_cmt_text_error"><![CDATA[Пустое сообщение не допускается. Напишите что-нибудь для отправки помощнику.]]></string>
-        <string name="_sys_form_agents_comment_input_caption_system_id"><![CDATA[ID объекта]]></string>
-        <string name="_sys_form_agents_comment_input_caption_system_sys"><![CDATA[Тип объекта]]></string>
 	<string name="_sys_form_checkbox_value_off"><![CDATA[Нет]]></string>
 	<string name="_sys_form_checkbox_value_on"><![CDATA[Да]]></string>
         <string name="_sys_form_input_caption_author"><![CDATA[Автор]]></string>

+ 1 - 1
studio/agents.php

@@ -17,7 +17,7 @@ bx_import('BxDolLanguages');
 bx_require_authentication(true);
 
 $sPage = bx_get('page');
-$sPage = $sPage !== false ? bx_process_input($sPage) : 'agents';
+$sPage = $sPage !== false ? bx_process_input($sPage) : '';
 
 $oPage = new BxTemplStudioAgents($sPage);
 BxDolStudioTemplate::getInstance()->displayPage($oPage);

+ 3 - 13
studio/classes/BxDolStudioAgents.php

@@ -7,22 +7,12 @@
  * @{
  */
 
-define('BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS', 'settings');
-define('BX_DOL_STUDIO_AGENTS_TYPE_ASSISTANTS', 'assistants');
-
+define('BX_DOL_STUDIO_AGENTS_TYPE_AGENTS', 'agents');
 define('BX_DOL_STUDIO_AGENTS_TYPE_AI_PROVIDERS', 'ai_providers');
 define('BX_DOL_STUDIO_AGENTS_TYPE_TOOLS', 'tools');
 define('BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE', 'vector_store');
-define('BX_DOL_STUDIO_AGENTS_TYPE_AGENTS', 'agents');
-
-/*
- * Isn't used for now. Most probably they will be removed.
- */
-define('BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS', 'automators');
-define('BX_DOL_STUDIO_AGENTS_TYPE_PROVIDERS', 'providers');
-define('BX_DOL_STUDIO_AGENTS_TYPE_HELPERS', 'helpers');
-
-define('BX_DOL_STUDIO_AGENTS_TYPE_DEFAULT', BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS);
+define('BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS', 'settings');
+define('BX_DOL_STUDIO_AGENTS_TYPE_DEFAULT', BX_DOL_STUDIO_AGENTS_TYPE_AGENTS);
 
 class BxDolStudioAgents extends BxTemplStudioWidget
 {

+ 0 - 6
studio/classes/BxDolStudioAgentsAgents.php

@@ -9,18 +9,12 @@
 
 class BxDolStudioAgentsAgents extends BxTemplStudioGridAgents
 {
-    protected $_oDb;
-
     protected $_iProfileIdAi;
 
     public function __construct ($aOptions, $oTemplate = false)
     {
         parent::__construct ($aOptions, $oTemplate);
 
-        $this->_sDefaultSortingOrder = 'DESC';
-
-        $this->_oDb = new BxDolStudioAgentsQuery();
-
         $this->_iProfileIdAi = BxDolAI::getInstance()->getProfileId();
     }
 }

+ 0 - 28
studio/classes/BxDolStudioAgentsAutomators.php

@@ -1,28 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaStudio UNA Studio
- * @{
- */
-
-class BxDolStudioAgentsAutomators extends BxTemplStudioGridAgents
-{
-    protected $_oDb;
-
-    protected $_iProfileIdAi;
-
-    public function __construct ($aOptions, $oTemplate = false)
-    {
-        parent::__construct ($aOptions, $oTemplate);
-
-        $this->_sDefaultSortingOrder = 'DESC';
-
-        $this->_oDb = new BxDolStudioAgentsQuery();
-
-        $this->_iProfileIdAi = BxDolAI::getInstance()->getProfileId();
-    }
-}
-
-/** @} */

+ 0 - 201
studio/classes/BxDolStudioAgentsAutomatorsCmts.php

@@ -1,201 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaStudio UNA Studio
- * @{
- */
-
-class BxDolStudioAgentsAutomatorsCmts extends BxDolStudioAgentsCmts
-{
-    protected $_sUrlPageAgents;
-
-    public function __construct($sSystem, $iId, $iInit = true, $oTemplate = false)
-    {
-        parent::__construct($sSystem, $iId, $iInit, $oTemplate);
-
-        $this->_sUrlPageAgents = BX_DOL_URL_STUDIO . 'agents.php?page=automators';
-    }
-    
-    public function actionApproveCode()
-    {
-        if(!$this->isEnabled())
-            return echoJson([]);
-
-        $iCmt = bx_process_input(bx_get('Cmt'), BX_DATA_INT);
-        $aCmt = $this->getCommentRow($iCmt);
-        if(empty($aCmt) || !is_array($aCmt))
-            return echoJson([]);
-        
-        $iObjId = (int)$this->getId();
-        
-        $aAutomator = $this->_oAI->getAutomator($iObjId, true);
-        $aAutomator['code'] = $aCmt['cmt_text'];
-
-        $aParams = [];
-        if($aAutomator['type'] == BX_DOL_AI_AUTOMATOR_EVENT)
-            $aParams['alert'] = new BxDolAlerts('test', 'test', 0);
-
-        if(($sResult = $this->_oAI->emulCode($aAutomator, $aParams)) != '')
-            return echoJson(['msg' => _t('_sys_agents_automators_txt_eval_response') . $sResult]);
-
-        if(!$this->_oQueryAgents->updateAutomators(['code' => $aCmt['cmt_text'], 'status' => 'ready'], ['id' => (int)$this->getId()]))
-            return echoJson([]);
-
-        return echoJson(['redirect' => $this->_sUrlPageAgents]);
-    }
-
-    public function getPageJsObject()
-    {
-        return 'oBxDolStudioPageAgents';
-    }
-
-    public function getCommentsBlock($aBp = [], $aDp = [])
-    {
-        $aComments = parent::getCommentsBlock($aBp, ['in_designbox' => false]);
-        if(empty($aComments['content']))
-            return MsgBox(_t('_error occured'));
-
-        $aAutomator = $this->_oQueryAgents->getAutomatorsBy(['sample' => 'id', 'id' => (int)$this->getId()]);
-        if(empty($aAutomator) || !is_array($aAutomator))
-            return MsgBox(_t('_error occured'));
-
-        $aTmplVarsEvent = [];
-        $bTmplVarsEvent = $aAutomator['type'] == 'event';
-        if($bTmplVarsEvent)
-            $aTmplVarsEvent = [
-                'unit' => $aAutomator['alert_unit'],
-                'action' => $aAutomator['alert_action']
-            ];
-        
-        $aTmplVarsScheduler = [];
-        $bTmplVarsScheduler = $aAutomator['type'] == 'scheduler';
-        if($bTmplVarsScheduler) {
-            $aParams = [];
-            if(!empty($aAutomator['params']))
-                $aParams = json_decode($aAutomator['params'], true);
-
-            $aTmplVarsScheduler = [
-                'time' => $aParams['scheduler_time'],
-            ];
-        }
-
-        $sAutomator = $this->_oTemplate->parseHtmlByName('agents_automator_info.html', [
-            'type' => _t('_sys_agents_automators_field_type_' . $aAutomator['type']),
-            'bx_if:show_event' => [
-                'condition' => $bTmplVarsEvent,
-                'content' => $aTmplVarsEvent
-            ],
-            'bx_if:show_scheduler' => [
-                'condition' => $bTmplVarsScheduler,
-                'content' => $aTmplVarsScheduler
-            ],
-            'code' => $aAutomator['code']
-        ]);
-
-        return [
-            $sAutomator,
-            $aComments['content']
-        ];
-    }
-
-    public function getComment($mixedCmt, $aBp = [], $aDp = [])
-    {
-        return parent::getComment($mixedCmt, $aBp, array_merge($aDp, ['class_comment' => $this->_sStylePrefix . '-agents']));
-    }
-    
-    public function getFormBoxPost($aBp = [], $aDp = [])
-    {
-        $aComments = $this->_oQuery->getCommentsBy(['type' => 'latest', 'object_id' => (int)$this->getId(), 'start' => 0, 'per_page' => 1]);
-        if(!empty($aComments) && is_array($aComments)) {
-            $aLast = current($aComments);
-            if($aLast['cmt_author_id'] != $this->_iProfileIdAi)
-                return '';
-        }
-
-        return parent::getFormBoxPost($aBp, $aDp);
-    }
-
-    public function isAttachImageEnabled()
-    {
-        return false;
-    }
-
-    public function addAuto($aValues)
-    {
-        $this->_bAuto = true;
-        $mixedResult = $this->add($aValues);
-
-        $this->_bAuto = false;
-        return $mixedResult;
-    }
-
-    public function onPostAfter($iCmtId, $aDp = [])
-    {
-        $mixedResult = parent::onPostAfter($iCmtId, $aDp);
-        if($this->_bAuto || $mixedResult === false) 
-            return $mixedResult;
-
-        $iObjId = (int)$this->getId();
-        $aAutomator = $this->_oAI->getAutomator($iObjId, true);
-
-        $aComments = $this->_oQuery->getCommentsBy(['type' => 'object_id', 'object_id' => $iObjId]);
-        if($aAutomator['type'] == BX_DOL_AI_AUTOMATOR_EVENT && !empty($aAutomator['params']['trigger']))
-            $aComments[0]['cmt_text'] .= $aAutomator['params']['trigger'];
-
-        $oMessages = new BxDolAIMessages();
-        foreach($aComments as $aComment)
-            $oMessages->add((int)$aComment['cmt_author_id'] == $this->_iProfileIdAi ? 'ai' : 'hb', $aComment['cmt_text']);
-
-        $oAIModel = $this->_oAI->getModelObject($aAutomator['model_id']);
-        if(($sResponse = $oAIModel->getResponse($aAutomator['type'], $oMessages, $aAutomator['params'])) !== false) {
-            $mixedResultAuto = $this->addAuto([
-                'cmt_author_id' => $this->_iProfileIdAi,
-                'cmt_parent_id' => 0,
-                'cmt_text' => $sResponse
-            ]);
-
-            if($mixedResultAuto !== false)
-                $mixedResult['id'] .= ',' . $mixedResultAuto['id'];
-        }
-
-        return $mixedResult;
-    }
-
-    protected function _getActionsBox(&$aCmt, $aBp = [], $aDp = [])
-    {
-        if((int)$aCmt['cmt_author_id'] != $this->_iProfileIdAi)
-            return parent::_getActionsBox($aCmt, $aBp, array_merge($aDp, ['view_only' => true]));
-
-        return $this->_oTemplate->parseHtmlByName('agents_comment_actions_automator.html', [
-            'js_object' => $this->getPageJsObject(),
-            'id' => $aCmt['cmt_id']
-        ]);
-    }
-
-    protected function _getTmplVarsText($aCmt)
-    {
-        $aResult = parent::_getTmplVarsText($aCmt);
-
-        if((int)$aCmt['cmt_author_id'] == $this->_iProfileIdAi)
-            $aResult['text'] = '<pre>' . $aResult['text'] . '</pre>';
-
-        return $aResult;
-    }
-    
-    protected function _getForm($sAction, $iId, $aDp = [])
-    {
-        $aResult = parent::_getForm($sAction, $iId, $aDp);
-
-        $aResult->aInputs['cmt_text']['db']['pass'] = 'xss';
-        return $aResult;
-    }
-    
-    protected function _prepareTextForOutput($s, $iCmtId = 0)
-    {
-        return nl2br(parent::_prepareTextForOutput($s, $iCmtId));
-    }
-}
-
-/** @} */

+ 0 - 83
studio/classes/BxDolStudioAgentsCmts.php

@@ -1,83 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaStudio UNA Studio
- * @{
- */
-
-class BxDolStudioAgentsCmts extends BxTemplCmts
-{
-    protected $_oQueryAgents;
-
-    protected $_oAI;
-    protected $_iProfileIdAi;
-
-    protected $_bAuto;
-
-    public function __construct($sSystem, $iId, $iInit = true, $oTemplate = false)
-    {
-        parent::__construct($sSystem, $iId, $iInit, $oTemplate);
-
-        if ($oTemplate)
-            $this->_oTemplate = $oTemplate;
-        else
-            $this->_oTemplate = BxDolStudioTemplate::getInstance();
-
-        $this->_sFormObject = 'sys_agents_comment';
-        $this->_sFormDisplayPost = 'sys_agents_comment_post';
-        $this->_sFormDisplayEdit = 'sys_agents_comment_edit';
-        
-        $this->_sTmplNameItemContent = 'agents_comment_content.html';
-        $this->_bLiveUpdates = false;
-
-        $this->_oQueryAgents = new BxDolStudioAgentsQuery();
-
-        $this->_oAI = BxDolAI::getInstance();
-        $this->_iProfileIdAi = $this->_oAI->getProfileId();
-
-        $this->_bAuto = false;
-    }
-
-    public function actionGetCmt ()
-    {
-        if(!$this->isEnabled())
-            return echoJson([]);
-
-        if($this->isViewAllowed() !== CHECK_ACTION_RESULT_ALLOWED)
-            return echoJson([]);
-
-        $mixedCmtId = bx_process_input(bx_get('Cmt'));
-        $sCmtBrowse = ($sCmtBrowse = bx_get('CmtBrowse')) !== false ? bx_process_input($sCmtBrowse, BX_DATA_TEXT) : '';
-        $sCmtDisplay = ($sCmtDisplay = bx_get('CmtDisplay')) !== false ? bx_process_input($sCmtDisplay, BX_DATA_TEXT) : '';
-
-        $aCmtIds = strpos($mixedCmtId, ',') !== false ? explode(',', $mixedCmtId) : [$mixedCmtId];
-
-        $sContent = '';
-        foreach($aCmtIds as $iCmtId)
-            $sContent .= $this->getComment((int)$iCmtId, ['type' => $sCmtBrowse], ['type' => $sCmtDisplay, 'dynamic_mode' => true]);
-
-        $aCmt = $this->getCommentRow((int)reset($aCmtIds));
-        echoJson([
-            'parent_id' => $aCmt['cmt_parent_id'],
-            'vparent_id' => $aCmt['cmt_parent_id'],
-            'content' => $sContent
-        ]);
-    }
-
-    protected function _getCountersBox(&$aCmt, $aBp = [], $aDp = [])
-    {
-        return '';
-    }
-
-    protected function _getFormBox($sType, $aBp, $aDp)
-    {
-        return parent::_getFormBox($sType, $aBp, array_merge($aDp, [
-            'min_post_form' => false, 
-            'class_body' => $this->_sStylePrefix . '-body-agents'
-        ]));
-    }
-}
-
-/** @} */

+ 0 - 28
studio/classes/BxDolStudioAgentsHelpers.php

@@ -1,28 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaStudio UNA Studio
- * @{
- */
-
-class BxDolStudioAgentsHelpers extends BxTemplStudioGridAgents
-{
-    protected $_oDb;
-
-    protected $_iProfileIdAi;
-
-    public function __construct ($aOptions, $oTemplate = false)
-    {
-        parent::__construct ($aOptions, $oTemplate);
-
-        $this->_sDefaultSortingOrder = 'DESC';
-
-        $this->_oDb = new BxDolStudioAgentsQuery();
-
-        $this->_iProfileIdAi = BxDolAI::getInstance()->getProfileId();
-    }
-}
-
-/** @} */

+ 6 - 4
studio/classes/BxDolStudioAgentsInstruments.php

@@ -9,16 +9,13 @@
 
 class BxDolStudioAgentsInstruments extends BxTemplStudioGridAgents
 {
-    protected $_oDb;
     protected $_sFieldName;
 
     public function __construct ($aOptions, $oTemplate = false)
     {
         parent::__construct ($aOptions, $oTemplate);
 
-        $this->_sDefaultSortingOrder = 'DESC';
         $this->_sFieldName = 'name';
-        $this->_oDb = new BxDolStudioAgentsQuery();
     }
 
     public function getPageJsObject()
@@ -83,7 +80,12 @@ class BxDolStudioAgentsInstruments extends BxTemplStudioGridAgents
 
         return $aForm;
     }
-    
+
+    protected function _getForm($sAction = '', $aData = [])
+    {
+        return [];
+    }
+
     protected function _getActionDelete ($sType, $sKey, $a, $isSmall = false, $isDisabled = false, $aRow = array())
     {
         if ($sType == 'single' && $aRow['duplicate'] == 0)

+ 0 - 30
studio/classes/BxDolStudioAgentsProviders.php

@@ -1,30 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaStudio UNA Studio
- * @{
- */
-
-require_once(BX_DOL_DIR_STUDIO_INC . 'utils.inc.php');
-
-class BxDolStudioAgentsProviders extends BxTemplStudioGridAgents
-{
-    protected $_oDb;
-
-    protected $_iProfileIdAi;
-
-    public function __construct ($aOptions, $oTemplate = false)
-    {
-        parent::__construct ($aOptions, $oTemplate);
-
-        $this->_sDefaultSortingOrder = 'DESC';
-
-        $this->_oDb = new BxDolStudioAgentsQuery();
-
-        $this->_iProfileIdAi = BxDolAI::getInstance()->getProfileId();
-    }
-}
-
-/** @} */

+ 2 - 2
studio/classes/BxDolStudioAgentsGrid.php → studio/classes/BxDolStudioGridAgents.php

@@ -7,7 +7,7 @@
  * @{
  */
 
-class BxDolStudioAgentsGrid extends BxTemplStudioGridAgents
+class BxDolStudioGridAgents extends BxTemplStudioGrid
 {
     protected $_oDb;
 
@@ -21,4 +21,4 @@ class BxDolStudioAgentsGrid extends BxTemplStudioGridAgents
     }
 }
 
-/** @} */
+/** @} */

+ 0 - 19
studio/template/agents_automator_form.html

@@ -1,19 +0,0 @@
-<div class="bx-agents-automator-form">
-    <div class="bx-agents-automator-form-cnt">
-        __form__
-        <script language="javascript">
-            $(document).ready(function () {
-                $("#__form_id__").ajaxForm({ 
-                    dataType: "json",
-                    beforeSubmit: function (formData, jqForm, options) {
-                        bx_loading($("#__form_id__"), true);
-                    },
-                    success: function (data) {
-                        $(".bx-popup-applied:visible").dolPopupHide();
-                        glGrids.__object__.processJson(data, '__action__');
-                    }
-                });
-            });
-        </script>
-    </div>
-</div>

+ 0 - 11
studio/template/agents_automator_form_assistants.html

@@ -1,11 +0,0 @@
-<div class="bx-form-input-assistants">
-    <bx_repeat:assistants>
-        <div class="bx-form-input-assistant bx-def-padding-thd-topbottom">
-            <div class="bx-form-input-assistant-cell bx-fi-ac-txt">__input_select__</div>
-            <div class="bx-form-input-assistant-cell bx-fi-ac-btn bx-def-padding-sec-left">
-                <a class="bx-btn" href="javascript:void(0)" onclick="javascript:__js_object__.assistantDelete(this)"><bx_image_auto:times /></a>
-            </div>
-        </div>
-    </bx_repeat:assistants>
-    <div class="bx-form-input-assistant-add">__btn_add__</div>
-</div>

+ 0 - 11
studio/template/agents_automator_form_helpers.html

@@ -1,11 +0,0 @@
-<div class="bx-form-input-helpers">
-    <bx_repeat:helpers>
-        <div class="bx-form-input-helper bx-def-padding-thd-topbottom">
-            <div class="bx-form-input-helper-cell bx-fi-hc-txt">__input_select__</div>
-            <div class="bx-form-input-helper-cell bx-fi-hc-btn bx-def-padding-sec-left">
-                <a class="bx-btn" href="javascript:void(0)" onclick="javascript:__js_object__.helperDelete(this)"><bx_image_auto:times /></a>
-            </div>
-        </div>
-    </bx_repeat:helpers>
-    <div class="bx-form-input-helper-add">__btn_add__</div>
-</div>

+ 0 - 11
studio/template/agents_automator_form_providers.html

@@ -1,11 +0,0 @@
-<div class="bx-form-input-providers">
-    <bx_repeat:providers>
-        <div class="bx-form-input-provider bx-def-padding-thd-topbottom">
-            <div class="bx-form-input-provider-cell bx-fi-pc-txt">__input_select__</div>
-            <div class="bx-form-input-provider-cell bx-fi-pc-btn bx-def-padding-sec-left">
-                <a class="bx-btn" href="javascript:void(0)" onclick="javascript:__js_object__.providerDelete(this)"><bx_image_auto:times /></a>
-            </div>
-        </div>
-    </bx_repeat:providers>
-    <div class="bx-form-input-provider-add">__btn_add__</div>
-</div>

+ 0 - 26
studio/template/agents_automator_info.html

@@ -1,26 +0,0 @@
-<div>
-    <div class="flex gap-2">
-        <div class="w-20 font-semibold"><bx_text:_sys_agents_automators_txt_type /></div>
-        <div>__type__</div>
-    </div>
-    <bx_if:show_event>
-        <div class="flex gap-2">
-            <div class="w-20 font-semibold"><bx_text:_sys_agents_automators_txt_alert_unit /></div>
-            <div>__unit__</div>
-        </div>
-        <div class="flex gap-2">
-            <div class="w-20 font-semibold"><bx_text:_sys_agents_automators_txt_alert_action /></div>
-            <div>__action__</div>
-        </div>
-    </bx_if:show_event>
-    <bx_if:show_scheduler>
-        <div class="flex gap-2">
-            <div class="w-20 font-semibold"><bx_text:_sys_agents_automators_txt_scheduler_time /></div>
-            <div>__time__</div>
-        </div>
-    </bx_if:show_scheduler>
-    <div class="flex gap-2">
-        <div class="w-20 font-semibold"><bx_text:_sys_agents_automators_txt_code /></div>
-        <div class="bx-def-vanilla-html bx-def-vh-sm flex-1 max-w-none"><pre>__code__</pre></div>
-    </div>
-</div>

+ 0 - 10
studio/template/agents_comment_content.html

@@ -1,10 +0,0 @@
-<div class="__style_prefix__-body bx-def-vanilla-html bx-def-vh-sm relative mt-2 max-w-none text-clip">
-    __text__
-    <div class="__style_prefix__-body-overflow bx-def-color-bg-box-overflow absolute bottom-0 w-full h-1/5"></div>
-</div>
-<bx_if:show_attached>
-    <div class="__style_prefix__-attached bx-clearfix -mx-1 -mb-1">__attached__</div>
-</bx_if:show_attached>
-<bx_if:show_counters>
-    <div class="__style_prefix__-counters -mx-1 mt-1">__counters__</div>
-</bx_if:show_counters>

+ 3 - 157
studio/template/scripts/BxBaseStudioAgents.php

@@ -38,32 +38,14 @@ class BxBaseStudioAgents extends BxDolStudioAgents
             BX_DOL_STUDIO_AGENTS_TYPE_AI_PROVIDERS => ['icon' => 'mi-agt-providers.svg'],
             BX_DOL_STUDIO_AGENTS_TYPE_TOOLS => ['icon' => 'mi-agt-tools.svg'],
             BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE => ['icon' => 'mi-agt-vector-store.svg'],
-            BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS => ['icon' => 'mi-agt-settings.svg'],
-
-            /*
-             * Hidden for now. Most probably they will be removed.
-             * 
-            BX_DOL_STUDIO_AGENTS_TYPE_PROVIDERS => ['icon' => 'mi-agt-providers.svg'],
-            BX_DOL_STUDIO_AGENTS_TYPE_HELPERS => ['icon' => 'mi-agt-helpers.svg'],
-            BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS => ['icon' => 'mi-agt-automators.svg'],
-             */
+            BX_DOL_STUDIO_AGENTS_TYPE_SETTINGS => ['icon' => 'mi-agt-settings.svg']
         ];
 
         $this->aGridObjects = [
+            BX_DOL_STUDIO_AGENTS_TYPE_AGENTS => 'sys_studio_agents_agents',
             BX_DOL_STUDIO_AGENTS_TYPE_AI_PROVIDERS => 'sys_studio_agents_models',
-            BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE => 'sys_studio_agents_vector_store',
             BX_DOL_STUDIO_AGENTS_TYPE_TOOLS => 'sys_studio_agents_tools',
-
-            BX_DOL_STUDIO_AGENTS_TYPE_AGENTS => 'sys_studio_agents_agents',
-
-            /*
-             * Hidden for now. Most probably they will be removed.
-             * 
-            BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS => 'sys_studio_agents_automators',
-            BX_DOL_STUDIO_AGENTS_TYPE_PROVIDERS => 'sys_studio_agents_providers',
-            BX_DOL_STUDIO_AGENTS_TYPE_HELPERS => 'sys_studio_agents_helpers',
-             * 
-             */
+            BX_DOL_STUDIO_AGENTS_TYPE_VECTOR_STORE => 'sys_studio_agents_vector_store',
         ];
 
         $this->sSessionKeyAgentsView = 'bx_std_agents_view';
@@ -81,8 +63,6 @@ class BxBaseStudioAgents extends BxDolStudioAgents
 
     public function getPageMenu($aMenu = [], $aMarkers = [])
     {
-        $sJsObject = $this->getPageJsObject();
-
         $aMenu = [];
         foreach($this->aMenuItems as $sMenuItem => $aItem)
             $aMenu[] = [
@@ -325,78 +305,6 @@ class BxBaseStudioAgents extends BxDolStudioAgents
         return $this->getGrid($this->aGridObjects[BX_DOL_STUDIO_AGENTS_TYPE_AGENTS]);
     }
 
-    /*
-     * Isn't used for now. Most probably they will be removed.
-     * 
-    protected function getAutomators()
-    {
-        $oTemplate = BxDolStudioTemplate::getInstance();
-
-        $this->aPageJsOptions['sPageUrl'] .= 'automators';
-
-        if(($iId = bx_get('id')) !== false) {
-            if(($oCmts = BxDolAI::getInstance()->getAutomatorCmtsObject($iId, $oTemplate)) !== false) {
-                $this->aPageJsOptions = array_merge($this->aPageJsOptions, [
-                    'sPageUrl' => $this->sSubpageUrl . 'automators&id=' . $iId,
-                    'sActionUrlCmts' => bx_append_url_params(BX_DOL_URL_ROOT . 'cmts.php', [
-                        'sys' => $oCmts->getSystemName(),
-                        'id' => $iId
-                    ])
-                ]);
-
-                return $oCmts->getCommentsBlock();
-            }
-            else
-                return MsgBox(_t('_error occured'));
-        }
-
-        return $this->getGrid($this->aGridObjects[BX_DOL_STUDIO_AGENTS_TYPE_AUTOMATORS]);
-    }
-    
-    protected function getHelpers()
-    {
-        $oTemplate = BxDolStudioTemplate::getInstance();
-        
-        $this->aPageJsOptions['sPageUrl'] .= 'helpers';
-
-        if(($iId = bx_get('id')) !== false) {
-            $this->aPageJsOptions = array_merge($this->aPageJsOptions, [
-                'sPageUrl' => $this->sSubpageUrl . 'helpers&id=' . $iId,
-            ]);
-            
-            $aHelper = BxDolAI::getInstance()->getHelperById($iId);
-
-            $aForm = $this->_getHelpersForm('tune', $aHelper);
-            $oForm = new BxTemplFormView($aForm);
-            $oForm->initChecker();
-
-            if($oForm->isSubmittedAndValid()) {
-                if($oForm->update($iId) !== false) {
-                    $sMessage = $oForm->getCleanValue('message');
-                    $oForm->aInputs['result']['value'] = BxDolAI::callHelper($iId, $sMessage);
-                }
-            }
-
-            return $oForm->getCode();
-        }
-
-        return $this->getGrid($this->aGridObjects[BX_DOL_STUDIO_AGENTS_TYPE_HELPERS]);
-    }
-
-    protected function getProviders()
-    {
-        $this->aPageJsOptions = array_merge($this->aPageJsOptions, [
-            'sPageUrl' => $this->sSubpageUrl . 'providers',
-            'sActionUrlGrid' => bx_append_url_params(BX_DOL_URL_ROOT . 'grid.php', [
-                'o' => 'sys_studio_agents_providers'
-            ])
-        ]);
-
-        return $this->getGrid($this->aGridObjects[BX_DOL_STUDIO_AGENTS_TYPE_PROVIDERS]);
-    }
-     * 
-     */
-
     protected function getGrid($sObjectName, $bObject = false)
     {
         $oGrid = BxDolGrid::getObjectInstance($sObjectName);
@@ -405,69 +313,7 @@ class BxBaseStudioAgents extends BxDolStudioAgents
 
         return $bObject ? $oGrid : $oGrid->getCode();
     }
-    
-    protected function _getHelpersForm($sAction, $aHelper = [])
-    {
-        $aForm = array(
-            'form_attrs' => array(
-                'id' => 'bx_std_agents_helpers_' . $sAction,
-                'action' => $this->aPageJsOptions['sPageUrl'],
-                'method' => 'post',
-            ),
-            'params' => array (
-                'db' => array(
-                    'table' => 'sys_agents_helpers',
-                    'key' => 'id',
-                    'submit_name' => 'do_submit',
-                ),
-            ),
-            'inputs' => [
-                'prompt' => [
-                    'type' => 'textarea',
-                    'name' => 'prompt',
-                    'caption' => _t('_sys_agents_helpers_field_prompt'),
-                    'value' => isset($aHelper['prompt']) ? $aHelper['prompt'] : '',
-                    'required' => '1',
-                    'checker' => [
-                        'func' => 'Avail',
-                        'params' => [],
-                        'error' => _t('_sys_agents_helpers_field_prompt_err'),
-                    ],
-                    'db' => [
-                        'pass' => 'Xss',
-                    ]
-                ],
-                'message' => [
-                    'type' => 'textarea',
-                    'name' => 'message',
-                    'caption' => _t('_sys_agents_helpers_field_message'),
-                    'value' => '',
-                    'required' => '1',
-                    'checker' => [
-                        'func' => 'Avail',
-                        'params' => [],
-                        'error' => _t('_sys_agents_helpers_field_message_err'),
-                    ],
-                ],
-                'result' => [
-                    'type' => 'textarea',
-                    'name' => 'result',
-                    'caption' => _t('_sys_agents_helpers_field_result'),
-                    'value' => '',
-                    'attrs' => [
-                        'disabled' => 'disabled'
-                    ]
-                ],
-                'submit' => [
-                    'type' => 'submit',
-                    'name' => 'do_submit',
-                    'value' => _t('_sys_submit'),
-                ],
-            ],
-        );
 
-        return $aForm;
-    }
 }
 
 /** @} */

+ 0 - 790
studio/template/scripts/BxBaseStudioAgentsAutomators.php

@@ -1,790 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaView UNA Studio Representation classes
- * @ingroup     UnaStudio
- * @{
- */
-
-class BxBaseStudioAgentsAutomators extends BxDolStudioAgentsAutomators
-{
-    protected $_sUrlPage;
-    protected $_sFieldName;
-
-    public function __construct ($aOptions, $oTemplate = false)
-    {
-        parent::__construct ($aOptions, $oTemplate);
-
-        $this->_sUrlPage = BX_DOL_URL_STUDIO . 'agents.php?page=automators';
-
-        $this->_sFieldName = 'name';
-    }
-
-    public function getPageJsObject()
-    {
-        return 'oBxDolStudioPageAgents';
-    }
-
-    public function performActionAdd()
-    {
-        $sAction = 'add';
-
-        $oTemplate = BxDolStudioTemplate::getInstance();
-        $oAI = BxDolAI::getInstance();
-
-        $aForm = $this->_getForm($sAction);
-        $oForm = new BxTemplFormView($aForm);
-        $oForm->initChecker();
-
-        if($oForm->isSubmittedAndValid()) {
-            $aValsToAdd = [
-                'added' => time()
-            ];
-
-            $sName = $oForm->getCleanValue($this->_sFieldName);
-            $sName = $this->_getAutomatorName($sName);
-            BxDolForm::setSubmittedValue($this->_sFieldName, $sName, $oForm->aFormAttrs['method']);
-
-            $iProfileId = $oForm->getCleanValue('profile_id');
-            if(empty($iProfileId)) {
-                $iProfileId = (int)getParam('sys_agents_profile');
-                if(empty($iProfileId))
-                    $iProfileId = current(bx_srv('system', 'get_options_agents_profile', [false], 'TemplServices'))['key'];
-
-                $aValsToAdd['profile_id'] = $iProfileId;
-            }
-
-            $sSchedulerTime = $oForm->getCleanValue('scheduler_time');
-            if(!empty($sSchedulerTime))
-                $aValsToAdd['params'] = json_encode(['scheduler_time' => $sSchedulerTime]);
-  
-            $iModel = $oForm->getCleanValue('model_id');
-            $sType = $oForm->getCleanValue('type');
-            $aProviders = $oForm->getCleanValue('providers');
-            $bProviders = !empty($aProviders) && is_array($aProviders);
-            $aHelpers = $oForm->getCleanValue('helpers');
-            $bHelpers = !empty($aHelpers) && is_array($aHelpers);
-            $aAssistants = $oForm->getCleanValue('assistants');
-            $bAssistants = !empty($aAssistants) && is_array($aAssistants);
-            $sMessage = $oForm->getCleanValue('message');
-            $bMessage = !empty($sMessage);
-            $sMessageAdd = '';
-            $sMessageResponse = '';
-
-            $oAIModel = $oAI->getModelObject($iModel);
-
-            $sInstructions = $oAI->getAutomatorInstruction('profile', $iProfileId);
-            if($bProviders)
-                $sInstructions .= $oAI->getAutomatorInstruction('providers', $aProviders);
-            if($bHelpers)
-                $sInstructions .= $oAI->getAutomatorInstruction('helpers', $aHelpers);
-            if($bAssistants)
-                $sInstructions .= $oAI->getAutomatorInstruction('assistants', $aAssistants);
-
-            $bIsValid = true;
-            $aResponseInit = [];
-            switch($sType) {
-                case BX_DOL_AI_AUTOMATOR_EVENT:
-                    if(($oMessage = new BxDolAIMessageString('hb', $sMessage)) && ($aResponseInit = $oAIModel->getResponseInit($sType, $oMessage)) !== false) {
-                        $oAIModel->setParams($aResponseInit['params']);
-
-                        $sMessageAdd = $aResponseInit['params']['trigger'];
-
-                        $aValsToAdd = array_merge($aValsToAdd, $aResponseInit);
-                        if(!empty($aValsToAdd['params']) && is_array($aValsToAdd['params']))
-                            $aValsToAdd['params'] = json_encode($aValsToAdd['params']);
-                    }
-                    else {
-                        $oForm->aInputs['message']['error'] = _t('_sys_agents_automators_err_event_not_found');
-                        $bIsValid = false;
-                    }
-                    break;
-
-                case BX_DOL_AI_AUTOMATOR_SCHEDULER:
-                case BX_DOL_AI_AUTOMATOR_WEBHOOK:
-                    if(($oMessage = new BxDolAIMessageString('hb', $sMessage)) && ($aResponseInit = $oAIModel->getResponseInit($sType, $oMessage)) !== false) {
-                        $oAIModel->setParams($aResponseInit['params']);
-
-                        $aValsToAdd = array_merge($aValsToAdd, $aResponseInit);
-                        if(!empty($aValsToAdd['params']) && is_array($aValsToAdd['params']))
-                            $aValsToAdd['params'] = json_encode($aValsToAdd['params']);
-                    }
-                    else {
-                        $oForm->aInputs['message']['error'] = _t('_sys_agents_automators_err_event_not_found');
-                        $bIsValid = false;
-                    }
-                    break;
-            }
-
-            if($bIsValid) {
-                if(($oMessage = new BxDolAIMessageString('hb', $sMessage . $sInstructions . $sMessageAdd)) && ($sResponse = $oAIModel->getResponse($sType, $oMessage, $oAIModel->getParams())) !== false) {
-                    $sMessageResponse = $sResponse;
-                }
-                else {
-                    $oForm->aInputs['message']['error'] = _t('_sys_agents_automators_err_cannot_get_code');
-                    $bIsValid = false;
-                }
-            }
-
-            if($bIsValid) {
-                if(($iId = $oForm->insert($aValsToAdd)) !== false) {
-                    if($bProviders)
-                        foreach($aProviders as $iProviderId)
-                            $this->_oDb->insertAutomatorProvider([
-                                'automator_id' => $iId, 
-                                'provider_id' => $iProviderId
-                            ]);
-
-                    if($bHelpers)
-                        foreach($aHelpers as $iHelperId)
-                            $this->_oDb->insertAutomatorHelper([
-                                'automator_id' => $iId, 
-                                'helper_id' => $iHelperId
-                            ]);
-
-                    if($bAssistants)
-                        foreach($aAssistants as $iAssistantId)
-                            $this->_oDb->insertAutomatorAssistant([
-                                'automator_id' => $iId, 
-                                'assistant_id' => $iAssistantId
-                            ]);
-
-                    if(($oCmts = BxDolAI::getInstance()->getAutomatorCmtsObject($iId, $oTemplate)) !== null) {
-                        if($bMessage) {
-                            $iProfileId = bx_get_logged_profile_id();
-
-                            $aResult = $oCmts->addAuto([
-                                'cmt_author_id' => $iProfileId,
-                                'cmt_parent_id' => 0,
-                                'cmt_text' => $sMessage
-                            ]);
-
-                            if(!empty($aResult['id']))
-                                $this->_oDb->updateAutomators(['message_id' => $aResult['id']], ['id' => $iId]);
-
-                            sleep(1);
-                            $oCmts->addAuto([
-                                'cmt_author_id' => $iProfileId,
-                                'cmt_parent_id' => 0,
-                                'cmt_text' => $sInstructions
-                            ]);
-                        }
-
-                        if($sMessageResponse) {
-                            sleep(1);
-                            $oCmts->addAuto([
-                                'cmt_author_id' => $this->_iProfileIdAi,
-                                'cmt_parent_id' => 0,
-                                'cmt_text' => $sMessageResponse
-                            ]);
-                        }
-                    }
-
-                    $aRes = ['grid' => $this->getCode(false), 'blink' => $iId];
-                }
-                else
-                    $aRes = ['msg' => _t('_sys_txt_error_occured')];
-
-                return echoJson($aRes);
-            }
-        }
-
-        $sFormId = $oForm->getId();
-        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup', _t('_sys_agents_automators_popup_add'), $this->_oTemplate->parseHtmlByName('agents_automator_form.html', [
-            'form_id' => $sFormId,
-            'form' => $oForm->getCode(true),
-            'object' => $this->_sObject,
-            'action' => $sAction
-        ]));
-
-        return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
-    }
-
-    public function performActionEdit()
-    {
-        $sAction = 'edit';
-
-        $oTemplate = BxDolStudioTemplate::getInstance();
-        $oAI = BxDolAI::getInstance();
-
-        $iId = $this->_getId();
-        $aAutomator = $oAI->getAutomator($iId);
-        $aAutomator['providers'] = $this->_oDb->getAutomatorsBy(['sample' => 'providers_by_id_pairs', 'id' => $iId]);
-        $aAutomator['helpers'] = $this->_oDb->getAutomatorsBy(['sample' => 'helpers_by_id_pairs', 'id' => $iId]);
-
-        $aForm = $this->_getFormEdit($sAction, $aAutomator);
-        $oForm = new BxTemplFormView($aForm);
-        $oForm->initChecker();
-
-        if($oForm->isSubmittedAndValid()) {
-            $aValsToAdd = [];
-
-            $sName = $oForm->getCleanValue($this->_sFieldName);
-            if($aAutomator[$this->_sFieldName] != $sName) {
-                $sName = $this->_getAutomatorName($sName);
-                BxDolForm::setSubmittedValue($this->_sFieldName, $sName, $oForm->aFormAttrs['method']);
-            }
-
-            /**
-             * Process Providers
-             */
-            $aProvidersIds = $oForm->getCleanValue('providers_ids');
-            $bProvidersIds = !empty($aProvidersIds) && is_array($aProvidersIds);
-            $aProvidersValues = $oForm->getCleanValue('providers');
-            $bProvidersValues = !empty($aProvidersValues) && is_array($aProvidersValues);
-
-            //--- Providers: Remove deleted
-            if(!empty($aAutomator['providers']) && is_array($aAutomator['providers']))
-                $this->_oDb->deleteAutomatorProvidersById(array_diff(array_keys($aAutomator['providers']), $bProvidersIds ? $aProvidersIds : []));
-
-            //--- Providers: Update existed
-            if($bProvidersIds)
-                foreach($aProvidersIds as $iIndex => $iApId)
-                    $this->_oDb->updateAutomatorProvider(['provider_id' => (int)$aProvidersValues[$iIndex]], ['id' => (int)$iApId]);
-
-            //--- Providers: Add new
-            $iProvidersIds = $bProvidersIds ? count($aProvidersIds) : 0;
-            $iProvidersValues = $bProvidersValues ? count($aProvidersValues) : 0;
-            if($iProvidersValues > $iProvidersIds) {
-                $aProvidersValues = array_slice($aProvidersValues, $iProvidersIds);
-                foreach($aProvidersValues as $iProvidersValue)
-                    $this->_oDb->insertAutomatorProvider([
-                        'automator_id' => $iId,
-                        'provider_id' => (int)$iProvidersValue,
-                    ]);
-            }
-
-            /**
-             * Process Helpers
-             */
-            $aHelpersIds = $oForm->getCleanValue('helpers_ids');
-            $bHelpersIds = !empty($aHelpersIds) && is_array($aHelpersIds);
-            $aHelpersValues = $oForm->getCleanValue('helpers');
-            $bHelpersValues = !empty($aHelpersValues) && is_array($aHelpersValues);
-
-            //--- Helpers: Remove deleted
-            if(!empty($aAutomator['helpers']) && is_array($aAutomator['helpers']))
-                $this->_oDb->deleteAutomatorHelpersById(array_diff(array_keys($aAutomator['helpers']), $bHelpersIds ? $aHelpersIds : []));
-
-            //--- Helpers: Update existed
-            if($bHelpersIds)
-                foreach($aHelpersIds as $iIndex => $iAhId)
-                    $this->_oDb->updateAutomatorHelper(['helper_id' => (int)$aHelpersValues[$iIndex]], ['id' => (int)$iAhId]);
-
-            //--- Helpers: Add new
-            $iHelpersIds = $bHelpersIds ? count($aHelpersIds) : 0;
-            $iHelpersValues = $bHelpersValues ? count($aHelpersValues) : 0;
-            if($iHelpersValues > $iHelpersIds) {
-                $aHelpersValues = array_slice($aHelpersValues, $iHelpersIds);
-                foreach($aHelpersValues as $iHelpersValue)
-                    $this->_oDb->insertAutomatorHelper([
-                        'automator_id' => $iId,
-                        'helper_id' => (int)$iHelpersValue,
-                    ]);
-            }
-
-            /**
-             * Process Assistants
-             */
-            $aAssistantsIds = $oForm->getCleanValue('assistants_ids');
-            $bAssistantsIds = !empty($aAssistantsIds) && is_array($aAssistantsIds);
-            $aAssistantsValues = $oForm->getCleanValue('assistants');
-            $bAssistantsValues = !empty($aAssistantsValues) && is_array($aAssistantsValues);
-
-            //--- Assistants: Remove deleted
-            if(!empty($aAutomator['assistants']) && is_array($aAutomator['assistants']))
-                $this->_oDb->deleteAutomatorAssistantsById(array_diff(array_keys($aAutomator['assistants']), $bAssistantsIds ? $aAssistantsIds : []));
-
-            //--- Assistants: Update existed
-            if($bAssistantsIds)
-                foreach($aAssistantsIds as $iIndex => $iAhId)
-                    $this->_oDb->updateAutomatorAssistant(['assistant_id' => (int)$aAssistantsValues[$iIndex]], ['id' => (int)$iAhId]);
-
-            //--- Assistants: Add new
-            $iAssistantsIds = $bAssistantsIds ? count($aAssistantsIds) : 0;
-            $iAssistantsValues = $bAssistantsValues ? count($aAssistantsValues) : 0;
-            if($iAssistantsValues > $iAssistantsIds) {
-                $aAssistantsValues = array_slice($aAssistantsValues, $iAssistantsIds);
-                foreach($aAssistantsValues as $iAssistantsValue)
-                    $this->_oDb->insertAutomatorAssistant([
-                        'automator_id' => $iId,
-                        'assistant_id' => (int)$iAssistantsValue,
-                    ]);
-            }
-
-            $iProfileId = $oForm->getCleanValue('profile_id');
-            if(empty($iProfileId)) {
-                $iProfileId = (int)getParam('sys_agents_profile');
-                if(empty($iProfileId))
-                    $iProfileId = current(bx_srv('system', 'get_options_agents_profile', [false], 'TemplServices'))['key'];
-
-                $aValsToAdd['profile_id'] = $iProfileId;
-            }
-
-            $sSchedulerTime = $oForm->getCleanValue('scheduler_time');
-            if(!empty($sSchedulerTime))
-                $aValsToAdd['params'] = json_encode(['scheduler_time' => $sSchedulerTime]);
-
-            if($oForm->update($iId, $aValsToAdd) !== false) {
-                if(($oCmts = BxDolAI::getInstance()->getAutomatorCmtsObject($iId, $oTemplate)) !== null) {
-                    $sInstructions = $oAI->getAutomatorInstruction('profile', $iProfileId);
-
-                    $aProviders = $this->_oDb->getAutomatorsBy(['sample' => 'providers_by_id_pairs', 'id' => $iId]);
-                    if(!empty($aProviders) && is_array($aProviders))
-                        $sInstructions .= $oAI->getAutomatorInstruction('providers', array_values($aProviders));
-
-                    $aHelpers = $this->_oDb->getAutomatorsBy(['sample' => 'helpers_by_id_pairs', 'id' => $iId]);
-                    if(!empty($aHelpers) && is_array($aHelpers))
-                        $sInstructions .= $oAI->getAutomatorInstruction('helpers', array_values($aHelpers));
-
-                    $aAssistants = $this->_oDb->getAutomatorsBy(['sample' => 'assistants_by_id_pairs', 'id' => $iId]);
-                    if(!empty($aAssistants) && is_array($aAssistants))
-                        $sInstructions .= $oAI->getAutomatorInstruction('assistants', array_values($aAssistants));
-
-                    $oCmts->addAuto([
-                        'cmt_author_id' => $iProfileId,
-                        'cmt_parent_id' => 0,
-                        'cmt_text' => $sInstructions
-                    ]);
-
-                    if(($oMessage = new BxDolAIMessageString('hb', $sInstructions)) && ($sResponse = $oAI->getModelObject($aAutomator['model_id'])->getResponse($aAutomator['type'], $oMessage, $aAutomator['params'])) !== false) {
-                        sleep(1);
-                        $oCmts->addAuto([
-                            'cmt_author_id' => $this->_iProfileIdAi,
-                            'cmt_parent_id' => 0,
-                            'cmt_text' => $sResponse
-                        ]);
-                    }
-                }
-
-                $aRes = ['grid' => $this->getCode(false), 'blink' => $iId];
-            }
-            else
-                $aRes = ['msg' => _t('_sys_txt_error_occured')];
-
-            return echoJson($aRes);
-        } 
-
-        $sFormId = $oForm->getId();
-        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup', _t('_sys_agents_automators_popup_edit'), $this->_oTemplate->parseHtmlByName('agents_automator_form.html', [
-            'form_id' => $sFormId,
-            'form' => $oForm->getCode(true),
-            'object' => $this->_sObject,
-            'action' => $sAction
-        ]));
-
-        return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
-    }
-
-    protected function _getCellSwitcher ($mixedValue, $sKey, $aField, $aRow)
-    {
-        if(empty($aRow['code']) || $aRow['status'] != BX_DOL_AI_AUTOMATOR_STATUS_READY)
-            return parent::_getCellDefault('', $sKey, $aField, $aRow);
-
-        return parent::_getCellSwitcher ($mixedValue, $sKey, $aField, $aRow);
-    }
-
-    protected function _getCellType($mixedValue, $sKey, $aField, $aRow)
-    {
-        return parent::_getCellDefault(_t('_sys_agents_automators_field_type_' . $mixedValue), $sKey, $aField, $aRow);
-    }
-
-    protected function _getCellData($sKey, $aField, $aRow)
-    {
-        if($sKey == 'message_id' && ($iCmtId = (int)$aRow[$sKey]) != 0 && ($oCmts = BxDolAI::getInstance()->getAutomatorCmtsObject($aRow['id'])) !== false) {
-            $aCmt = $oCmts->getCommentSimple($iCmtId);
-            if(!empty($aCmt) && is_array($aCmt))
-                $aRow[$sKey] = $aCmt['cmt_text'];
-        }
-
-        return parent::_getCellData($sKey, $aField, $aRow);
-    }
-
-    protected function _getCellStatus($mixedValue, $sKey, $aField, $aRow)
-    {
-        return parent::_getCellDefault(_t('_sys_agents_automators_field_status_' . $mixedValue), $sKey, $aField, $aRow);
-    }
-    
-    protected function _delete ($mixedId)
-    {
-        $mixedResult = parent::_delete($mixedId);
-        if($mixedResult) {
-            $this->_oDb->deleteAutomatorProviders(['automator_id' => (int)$mixedId]);
-            $this->_oDb->deleteAutomatorHelpers(['automator_id' => (int)$mixedId]);
-            $this->_oDb->deleteAutomatorAssistants(['automator_id' => (int)$mixedId]);
-
-            if(($oCmts = BxDolAI::getInstance()->getAutomatorCmtsObject($mixedId)) !== false)
-                $oCmts->onObjectDelete();
-        }
-
-        return $mixedResult;
-    }
-
-    protected function _getFormEdit($sAction, $aAutomator = [])
-    {
-        $aForm = $this->_getForm($sAction, $aAutomator);
-        $aForm['form_attrs']['action'] .= '&id=' . $aAutomator['id'];
-
-        unset($aForm['inputs']['type']);
-        unset($aForm['inputs']['message']);
-
-        return $aForm;
-    }
-
-    protected function _getForm($sAction, $aAutomator = [])
-    {
-        $sJsObject = $this->getPageJsObject();
-
-        $sType = isset($aAutomator['type']) ? $aAutomator['type'] : 'event';
-
-        if(!empty($aAutomator['params']) && is_string($aAutomator['params']))
-            $aAutomator['params'] = json_decode($aAutomator['params'], true);
-
-        $aForm = array(
-            'form_attrs' => array(
-                'id' => 'bx_std_agents_automators_' . $sAction,
-                'action' => BX_DOL_URL_ROOT . 'grid.php?o=sys_studio_agents_automators&a=' . $sAction,
-                'method' => 'post',
-            ),
-            'params' => array (
-                'db' => array(
-                    'table' => 'sys_agents_automators',
-                    'key' => 'id',
-                    'submit_name' => 'do_submit',
-                ),
-            ),
-            'inputs' => array(
-                'name' => [
-                    'type' => 'text',
-                    'name' => 'name',
-                    'caption' => _t('_sys_agents_automators_field_name'),
-                    'value' => isset($aAutomator['name']) ? $aAutomator['name'] : '',
-                    'required' => '1',
-                    'checker' => [
-                        'func' => 'Avail',
-                        'params' => [],
-                        'error' => _t('_sys_agents_form_field_err_enter'),
-                    ],
-                    'db' => [
-                        'pass' => 'Xss',
-                    ],
-                ],
-                'model_id' => [
-                    'type' => 'select',
-                    'name' => 'model_id',
-                    'caption' => _t('_sys_agents_automators_field_model_id'),
-                    'info' => '',
-                    'value' => isset($aAutomator['model_id']) ? $aAutomator['model_id'] : BxDolAI::getDefaultModel(),
-                    'values' => $this->_oDb->getModelsBy(['sample' => 'all_pairs', 'active' => 1, 'hidden' => 0]),
-                    'required' => '1',
-                    'checker' => [
-                        'func' => 'Avail',
-                        'params' => [],
-                        'error' => _t('_sys_agents_form_field_err_select'),
-                    ],
-                    'db' => [
-                        'pass' => 'Int',
-                    ],
-                ],
-                'profile_id' => [
-                    'type' => 'select',
-                    'name' => 'profile_id',
-                    'caption' => _t('_sys_agents_automators_field_profile_id'),
-                    'info' => _t('_sys_agents_automators_field_profile_id_inf'),
-                    'value' => isset($aAutomator['profile_id']) ? $aAutomator['profile_id'] : 0,
-                    'values' => bx_srv('system', 'get_options_agents_profile', [], 'TemplServices'),
-                    'required' => '0',
-                    'db' => [
-                        'pass' => 'Int',
-                    ]
-                ],
-                'type' => [
-                    'type' => 'select',
-                    'name' => 'type',
-                    'caption' => _t('_sys_agents_automators_field_type'),
-                    'info' => '',
-                    'value' => $sType,
-                    'values' => [
-                        'event' => _t('_sys_agents_automators_field_type_event'),
-                        'scheduler' => _t('_sys_agents_automators_field_type_scheduler'),
-                        'webhook' => _t('_sys_agents_automators_field_type_webhook'),
-                    ],
-                    'attrs' => [
-                        'onchange' => $this->getPageJsObject() . '.onChangeAutomatorType(this)',
-                    ],
-                    'required' => '1',
-                    'db' => [
-                        'pass' => 'Xss',
-                    ]
-                ],
-                'alert_unit' => [
-                    'type' => 'hidden',
-                    'name' => 'alert_unit',
-                    'caption' => _t('_sys_agents_automators_field_alert_unit'),
-                    'value' => isset($aAutomator['alert_unit']) ? $aAutomator['alert_unit'] : '',
-                    'tr_attrs' => [
-                        'style' => $sType != 'event' ? 'display:none' : ''
-                    ],
-                    'db' => [
-                        'pass' => 'Xss',
-                    ],
-                ],
-                'alert_action' => [
-                    'type' => 'hidden',
-                    'name' => 'alert_action',
-                    'caption' => _t('_sys_agents_automators_field_alert_action'),
-                    'value' => isset($aAutomator['alert_action']) ? $aAutomator['alert_action'] : '',
-                    'tr_attrs' => [
-                        'style' => $sType != 'event' ? 'display:none' : ''
-                    ],
-                    'db' => [
-                        'pass' => 'Xss',
-                    ],
-                ],
-                'scheduler_time' => [
-                    'type' => 'hidden',
-                    'name' => 'scheduler_time',
-                    'caption' => _t('_sys_agents_automators_field_scheduler_time'),
-                    'value' => isset($aAutomator['params']['scheduler_time']) ? $aAutomator['params']['scheduler_time'] : '',
-                    'tr_attrs' => [
-                        'style' => $sType != 'scheduler' ? 'display:none' : ''
-                    ],
-                ],
-                'providers' => [
-                    'type' => 'custom',
-                    'name' => 'providers',
-                    'caption' => _t('_sys_agents_automators_field_providers'),
-                    'value' => '',
-                ],
-                'helpers' => [
-                    'type' => 'custom',
-                    'name' => 'helpers',
-                    'caption' => _t('_sys_agents_automators_field_helpers'),
-                    'value' => '',
-                ],
-                'assistants' => [
-                    'type' => 'custom',
-                    'name' => 'assistants',
-                    'caption' => _t('_sys_agents_automators_field_assistants'),
-                    'value' => '',
-                ],
-                'message' => [
-                    'type' => 'textarea',
-                    'name' => 'message',
-                    'caption' => _t('_sys_agents_automators_field_message'),
-                    'required' => '1',
-                    'checker' => [
-                        'func' => 'Avail',
-                        'params' => [],
-                        'error' => _t('_sys_agents_automators_field_message_err'),
-                    ],
-                ],
-                'submit' => $this->_getFormControls(),
-
-            ),
-        );
-        
-        if(isset($aForm['inputs']['providers'])) {
-            $oForm = new BxTemplFormView([]);
-
-            $sProviders = 'providers';
-            $aProviders = array_map(function($sTitle) {
-                return _t($sTitle);
-            }, ['' => '_sys_please_select'] + $this->_oDb->getProvidersBy(['sample' => 'all_pairs', 'active' => 1]));
-
-            $aTmplVarsProviders = [];
-            if(!empty($aAutomator[$sProviders]) && is_array($aAutomator[$sProviders])) {
-                foreach($aAutomator[$sProviders] as $iApId => $iProviderId) {
-                    $aInputSelect = [
-                        'type' => 'select',
-                        'name' => $sProviders . '[]',
-                        'values' => $aProviders,
-                        'value' => (int)$iProviderId,
-                        'attrs' => [
-                            'class' => 'bx-def-margin-sec-top-auto'
-                        ]
-                    ];
-                    $sInput = $oForm->genInput($aInputSelect);
-
-                    $aInputHidden = [
-                        'type' => 'hidden',
-                        'name' => $sProviders . '_ids[]',
-                        'value' => (int)$iApId,
-                    ];
-                    $sInput .= $oForm->genInput($aInputHidden);
-
-                    $aTmplVarsProviders[] = ['js_object' => $sJsObject, 'input_select' => $sInput];
-                }
-            }
-            else  {
-                $aInputSelect = [
-                    'type' => 'select',
-                    'name' => $sProviders . '[]',
-                    'values' => $aProviders,
-                    'value' => '',
-                    'attrs' => [
-                        'class' => 'bx-def-margin-sec-top-auto'
-                    ]
-                ];
-
-                $aTmplVarsProviders = [
-                    ['js_object' => $sJsObject, 'input_select' => $oForm->genInput($aInputSelect)],
-                ];
-            }
-        
-            $aInputButton = [
-                'type' => 'button',
-                'name' => $sProviders . '_add',
-                'value' => _t('_sys_agents_automators_field_providers_add'),
-                'attrs' => [
-                    'class' => 'bx-def-margin-sec-top',
-                    'onclick' => $sJsObject . ".providerAdd(this, '" . $sProviders . "');"
-                ]
-            ];
-
-            $aForm['inputs'][$sProviders]['content'] = $this->_oTemplate->parseHtmlByName('agents_automator_form_providers.html', [
-                'bx_repeat:providers' => $aTmplVarsProviders,
-                'btn_add' => $oForm->genInputButton($aInputButton)
-            ]);
-        }
-
-        if(isset($aForm['inputs']['helpers'])) {
-            $oForm = new BxTemplFormView([]);
-
-            $sHelpers = 'helpers';
-            $aHelpers = array_map(function($sTitle) {
-                return _t($sTitle);
-            }, ['' => '_sys_please_select'] + $this->_oDb->getHelpersBy(['sample' => 'all_pairs', 'active' => 1]));
-
-            $aTmplVarsHelpers = [];
-            if(!empty($aAutomator[$sHelpers]) && is_array($aAutomator[$sHelpers])) {
-                foreach($aAutomator[$sHelpers] as $iAhId => $iHelperId) {
-                    $aInputSelect = [
-                        'type' => 'select',
-                        'name' => $sHelpers . '[]',
-                        'values' => $aHelpers,
-                        'value' => (int)$iHelperId,
-                        'attrs' => [
-                            'class' => 'bx-def-margin-sec-top-auto'
-                        ]
-                    ];
-                    $sInput = $oForm->genInput($aInputSelect);
-
-                    $aInputHidden = [
-                        'type' => 'hidden',
-                        'name' => $sHelpers . '_ids[]',
-                        'value' => (int)$iAhId,
-                    ];
-                    $sInput .= $oForm->genInput($aInputHidden);
-
-                    $aTmplVarsHelpers[] = ['js_object' => $sJsObject, 'input_select' => $sInput];
-                }
-            }
-            else  {
-                $aInputSelect = [
-                    'type' => 'select',
-                    'name' => $sHelpers . '[]',
-                    'values' => $aHelpers,
-                    'value' => '',
-                    'attrs' => [
-                        'class' => 'bx-def-margin-sec-top-auto'
-                    ]
-                ];
-
-                $aTmplVarsHelpers = [
-                    ['js_object' => $sJsObject, 'input_select' => $oForm->genInput($aInputSelect)],
-                ];
-            }
-        
-            $aInputButton = [
-                'type' => 'button',
-                'name' => $sHelpers . '_add',
-                'value' => _t('_sys_agents_automators_field_helpers_add'),
-                'attrs' => [
-                    'class' => 'bx-def-margin-sec-top',
-                    'onclick' => $sJsObject . ".helperAdd(this, '" . $sHelpers . "');"
-                ]
-            ];
-
-            $aForm['inputs'][$sHelpers]['content'] = $this->_oTemplate->parseHtmlByName('agents_automator_form_helpers.html', [
-                'bx_repeat:helpers' => $aTmplVarsHelpers,
-                'btn_add' => $oForm->genInputButton($aInputButton)
-            ]);
-        }
-
-        if(isset($aForm['inputs']['assistants'])) {
-            $oForm = new BxTemplFormView([]);
-
-            $sAssistants = 'assistants';
-            $aAssistants = array_map(function($sTitle) {
-                return _t($sTitle);
-            }, ['' => '_sys_please_select'] + $this->_oDb->getAssistantsBy(['sample' => 'all_pairs', 'active' => 1]));
-
-            $aTmplVarsAssistants = [];
-            if(!empty($aAutomator[$sAssistants]) && is_array($aAutomator[$sAssistants])) {
-                foreach($aAutomator[$sAssistants] as $iAhId => $iAssistantId) {
-                    $aInputSelect = [
-                        'type' => 'select',
-                        'name' => $sAssistants . '[]',
-                        'values' => $aAssistants,
-                        'value' => (int)$iAssistantId,
-                        'attrs' => [
-                            'class' => 'bx-def-margin-sec-top-auto'
-                        ]
-                    ];
-                    $sInput = $oForm->genInput($aInputSelect);
-
-                    $aInputHidden = [
-                        'type' => 'hidden',
-                        'name' => $sAssistants . '_ids[]',
-                        'value' => (int)$iAhId,
-                    ];
-                    $sInput .= $oForm->genInput($aInputHidden);
-
-                    $aTmplVarsAssistants[] = ['js_object' => $sJsObject, 'input_select' => $sInput];
-                }
-            }
-            else  {
-                $aInputSelect = [
-                    'type' => 'select',
-                    'name' => $sAssistants . '[]',
-                    'values' => $aAssistants,
-                    'value' => '',
-                    'attrs' => [
-                        'class' => 'bx-def-margin-sec-top-auto'
-                    ]
-                ];
-
-                $aTmplVarsAssistants = [
-                    ['js_object' => $sJsObject, 'input_select' => $oForm->genInput($aInputSelect)],
-                ];
-            }
-        
-            $aInputButton = [
-                'type' => 'button',
-                'name' => $sAssistants . '_add',
-                'value' => _t('_sys_agents_automators_field_assistants_add'),
-                'attrs' => [
-                    'class' => 'bx-def-margin-sec-top',
-                    'onclick' => $sJsObject . ".assistantAdd(this, '" . $sAssistants . "');"
-                ]
-            ];
-
-            $aForm['inputs'][$sAssistants]['content'] = $this->_oTemplate->parseHtmlByName('agents_automator_form_assistants.html', [
-                'bx_repeat:assistants' => $aTmplVarsAssistants,
-                'btn_add' => $oForm->genInputButton($aInputButton)
-            ]);
-        }
-
-        return $aForm;
-    }
-
-    protected function _getAutomatorName($sName)
-    {
-        return uriGenerate($sName, 'sys_agents_automators', 'name', ['lowercase' => false]);
-    }
-}
-
-/** @} */

+ 0 - 243
studio/template/scripts/BxBaseStudioAgentsHelpers.php

@@ -1,243 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaView UNA Studio Representation classes
- * @ingroup     UnaStudio
- * @{
- */
-
-class BxBaseStudioAgentsHelpers extends BxDolStudioAgentsHelpers
-{
-    protected $_sUrlPage;
-    protected $_sFieldName;
-
-    public function __construct ($aOptions, $oTemplate = false)
-    {
-        parent::__construct ($aOptions, $oTemplate);
-
-        $this->_sUrlPage = BX_DOL_URL_STUDIO . 'agents.php?page=helpers';
-
-        $this->_sFieldName = 'name';
-    }
-
-    public function getPageJsObject()
-    {
-        return 'oBxDolStudioPageAgents';
-    }
-
-    public function performActionAdd()
-    {
-        $sAction = 'add';
-
-        $aForm = $this->_getForm($sAction);
-        $oForm = new BxTemplFormView($aForm);
-        $oForm->initChecker();
-
-        if($oForm->isSubmittedAndValid()) {
-            $aValsToAdd = ['added' => time()];
-
-            $sName = $oForm->getCleanValue($this->_sFieldName);
-            $sName = $this->_getHelperName($sName);
-            BxDolForm::setSubmittedValue($this->_sFieldName, $sName, $oForm->aFormAttrs['method']);
-
-            $iProfileId = $oForm->getCleanValue('profile_id');
-            if(empty($iProfileId)) {
-                $iProfileId = (int)getParam('sys_agents_profile');
-                if(empty($iProfileId))
-                    $iProfileId = current(bx_srv('system', 'get_options_agents_profile', [false], 'TemplServices'))['key'];
-
-                $aValsToAdd['profile_id'] = $iProfileId;
-            }
-
-            $bIsValid = true;
-            if($bIsValid) {
-                if(($iId = $oForm->insert($aValsToAdd)) !== false) {
-                    $aRes = ['grid' => $this->getCode(false), 'blink' => $iId];
-                }
-                else
-                    $aRes = ['msg' => _t('_sys_txt_error_occured')];
-
-                return echoJson($aRes);
-            }
-        }
-
-        $sFormId = $oForm->getId();
-        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup', _t('_sys_agents_helpers_popup_add'), $this->_oTemplate->parseHtmlByName('agents_automator_form.html', [
-            'form_id' => $sFormId,
-            'form' => $oForm->getCode(true),
-            'object' => $this->_sObject,
-            'action' => $sAction
-        ]));
-
-        return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
-    }
-
-    public function performActionEdit()
-    {
-        $sAction = 'edit';
-
-        $iId = $this->_getId();
-        $aHelper = $this->_oDb->getHelpersBy(['sample' => 'id', 'id' => $iId]);
-
-        $aForm = $this->_getFormEdit($sAction, $aHelper);
-        $oForm = new BxTemplFormView($aForm);
-        $oForm->initChecker();
-
-        if($oForm->isSubmittedAndValid()) {
-            $aValsToAdd = [];
-
-            $sName = $oForm->getCleanValue($this->_sFieldName);
-            if($aHelper[$this->_sFieldName] != $sName) {
-                $sName = $this->_getHelperName($sName);
-                BxDolForm::setSubmittedValue($this->_sFieldName, $sName, $oForm->aFormAttrs['method']);
-            }
-
-            $iProfileId = $oForm->getCleanValue('profile_id');
-            if(empty($iProfileId)) {
-                $iProfileId = (int)getParam('sys_agents_profile');
-                if(empty($iProfileId))
-                    $iProfileId = current(bx_srv('system', 'get_options_agents_profile', [false], 'TemplServices'))['key'];
-
-                $aValsToAdd['profile_id'] = $iProfileId;
-            }
-            
-            if($oForm->update($iId, $aValsToAdd) !== false)
-                $aRes = ['grid' => $this->getCode(false), 'blink' => $iId];
-            else
-                $aRes = ['msg' => _t('_sys_txt_error_occured')];
-
-            return echoJson($aRes);
-        } 
-
-        $sFormId = $oForm->getId();
-        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup', _t('_sys_agents_helpers_popup_edit'), $this->_oTemplate->parseHtmlByName('agents_automator_form.html', [
-            'form_id' => $sFormId,
-            'form' => $oForm->getCode(true),
-            'object' => $this->_sObject,
-            'action' => $sAction
-        ]));
-
-        return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
-    }
-
-    protected function _delete ($mixedId)
-    {
-        $mixedResult = parent::_delete($mixedId);
-        if($mixedResult)
-            $this->_oDb->deleteAutomatorHelpers(['helper_id' => (int)$mixedId]);
-
-        return $mixedResult;
-    }
-
-    protected function _getFormEdit($sAction, $aHelper = [])
-    {
-        $aForm = $this->_getForm($sAction, $aHelper);
-        $aForm['form_attrs']['action'] .= '&id=' . $aHelper['id'];
-
-        return $aForm;
-    }
-
-    protected function _getForm($sAction, $aHelper = [])
-    {
-        $sJsObject = $this->getPageJsObject();
-
-        $aForm = array(
-            'form_attrs' => array(
-                'id' => 'bx_std_agents_helpers_' . $sAction,
-                'action' => BX_DOL_URL_ROOT . 'grid.php?o=sys_studio_agents_helpers&a=' . $sAction,
-                'method' => 'post',
-            ),
-            'params' => array (
-                'db' => array(
-                    'table' => 'sys_agents_helpers',
-                    'key' => 'id',
-                    'submit_name' => 'do_submit',
-                ),
-            ),
-            'inputs' => array(
-                'name' => [
-                    'type' => 'text',
-                    'name' => 'name',
-                    'required' => '1',
-                    'caption' => _t('_sys_agents_helpers_field_name'),
-                    'value' => isset($aHelper['name']) ? $aHelper['name'] : '',
-                    'required' => '1',
-                    'checker' => [
-                        'func' => 'Avail',
-                        'params' => [],
-                        'error' => _t('_sys_agents_form_field_err_enter'),
-                    ],
-                    'db' => [
-                        'pass' => 'Xss',
-                    ]
-                ],
-                'model_id' => [
-                    'type' => 'select',
-                    'name' => 'model_id',
-                    'caption' => _t('_sys_agents_helpers_field_model_id'),
-                    'info' => '',
-                    'value' => isset($aHelper['model_id']) ? $aHelper['model_id'] : BxDolAI::getDefaultModel(),
-                    'values' => $this->_oDb->getModelsBy(['sample' => 'all_pairs', 'active' => 1, 'hidden' => 0]),
-                    'required' => '1',
-                    'db' => [
-                        'pass' => 'Int',
-                    ]
-                ],
-                'profile_id' => [
-                    'type' => 'select',
-                    'name' => 'profile_id',
-                    'caption' => _t('_sys_agents_helpers_field_profile_id'),
-                    'info' => _t('_sys_agents_helpers_field_profile_id_inf'),
-                    'value' => isset($aHelper['profile_id']) ? $aHelper['profile_id'] : 0,
-                    'values' => bx_srv('system', 'get_options_agents_profile', [], 'TemplServices'),
-                    'required' => '0',
-                    'db' => [
-                        'pass' => 'Int',
-                    ]
-                ],
-                'description' => [
-                    'type' => 'textarea',
-                    'name' => 'description',
-                    'caption' => _t('_sys_agents_helpers_field_description'),
-                    'value' => isset($aHelper['description']) ? $aHelper['description'] : '',
-                    'required' => '1',
-                    'checker' => [
-                        'func' => 'Avail',
-                        'params' => [],
-                        'error' => _t('_sys_agents_form_field_err_enter'),
-                    ],
-                    'db' => [
-                        'pass' => 'Xss',
-                    ]
-                ],
-                'prompt' => [
-                    'type' => 'textarea',
-                    'name' => 'prompt',
-                    'caption' => _t('_sys_agents_helpers_field_prompt'),
-                    'value' => isset($aHelper['prompt']) ? $aHelper['prompt'] : '',
-                    'required' => '1',
-                    'checker' => [
-                        'func' => 'Avail',
-                        'params' => [],
-                        'error' => _t('_sys_agents_helpers_field_prompt_err'),
-                    ],
-                    'db' => [
-                        'pass' => 'Xss',
-                    ]
-                ],
-                'submit' => $this->_getFormControls(),
-            ),
-        );
-
-        return $aForm;
-    }
-
-    protected function _getHelperName($sName)
-    {
-        return uriGenerate($sName, 'sys_agents_helpers', 'name', ['lowercase' => false]);
-    }
-}
-
-/** @} */

+ 1 - 1
studio/template/scripts/BxBaseStudioAgentsLogs.php

@@ -8,7 +8,7 @@
  * @{
  */
 
-class BxBaseStudioAgentsLogs extends BxDolStudioAgentsGrid
+class BxBaseStudioAgentsLogs extends BxTemplStudioGridAgents
 {
     public function __construct ($aOptions, $oTemplate = false)
     {

+ 1 - 1
studio/template/scripts/BxBaseStudioAgentsModels.php

@@ -8,7 +8,7 @@
  * @{
  */
 
-class BxBaseStudioAgentsModels extends BxDolStudioAgentsGrid
+class BxBaseStudioAgentsModels extends BxTemplStudioGridAgents
 {
     protected $_sUrlPage;
 

+ 0 - 291
studio/template/scripts/BxBaseStudioAgentsProviders.php

@@ -1,291 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaView UNA Studio Representation classes
- * @ingroup     UnaStudio
- * @{
- */
-
-class BxBaseStudioAgentsProviders extends BxDolStudioAgentsProviders
-{
-    protected $_sUrlPage;
-    protected $_sFieldName;
-
-    public function __construct ($aOptions, $oTemplate = false)
-    {
-        parent::__construct ($aOptions, $oTemplate);
-
-        $this->_sUrlPage = BX_DOL_URL_STUDIO . 'agents.php?page=providers';
-
-        $this->_sFieldName = 'name';
-    }
-
-    public function getPageJsObject()
-    {
-        return 'oBxDolStudioPageAgents';
-    }
-
-    public function performActionAdd()
-    {
-        $sAction = 'add';
-
-        $aProvider = [];
-        if(($iTypeId = bx_get('type_id')) !== false && $iTypeId > 0) {
-            $aProvider = [
-                'type_id' => (int)$iTypeId,
-                'options' => $this->_oDb->getProviderOptionsBy(['sample' => 'provider_type_id', 'provider_type_id' => $iTypeId])
-            ];
-        }
-
-        $aForm = $this->_getForm($sAction, $aProvider);
-        $oForm = new BxTemplFormView($aForm);
-        $oForm->initChecker();
-
-        if($oForm->isSubmittedAndValid()) {
-            $aValsToAdd = [
-                'profile_id' => bx_get_logged_profile_id(), 
-                'added' => time(), 
-                'active' => 1
-            ];
-
-            $sName = $oForm->getCleanValue($this->_sFieldName);
-            $sName = $this->_getProviderName($sName);
-            BxDolForm::setSubmittedValue($this->_sFieldName, $sName, $oForm->aFormAttrs['method']);
-
-            if(($iId = $oForm->insert($aValsToAdd)) !== false) {
-                if(!empty($aProvider['options']) && is_array($aProvider['options']))
-                    foreach($aProvider['options'] as $aOption)
-                        $this->_oDb->insertProviderValue([
-                            'provider_id' => $iId, 
-                            'option_id' => $aOption['id'],
-                            'value' => $oForm->getCleanValue($aOption['name'])
-                        ]);
-
-                $aRes = ['grid' => $this->getCode(false), 'blink' => $iId];
-            }
-            else
-                $aRes = ['msg' => _t('_sys_txt_error_occured')];
-
-            return echoJson($aRes);
-        }
-
-        $sFormId = $oForm->getId();
-        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup_' . $sAction, _t('_sys_agents_providers_popup_add'), $this->_oTemplate->parseHtmlByName('agents_provider_form.html', [
-            'form_id' => $sFormId,
-            'form' => $oForm->getCode(true),
-            'object' => $this->_sObject,
-            'action' => $sAction
-        ]));
-
-        return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
-    }
-
-    public function performActionEdit()
-    {
-        $sAction = 'edit';
-
-        $iId = $this->_getId();
-
-        $oAIProvider = BxDolAI::getInstance()->getProviderObject($iId);
-        if(!$oAIProvider)
-            return echoJson([]);
-
-        $aProviderInfo = $oAIProvider->getInfo();
-
-        $aForm = $this->_getFormEdit($sAction, $aProviderInfo);
-        $oForm = new BxTemplFormView($aForm);
-        $oForm->initChecker();
-
-        if($oForm->isSubmittedAndValid()) {
-            $sName = $oForm->getCleanValue($this->_sFieldName);
-            if($aProviderInfo[$this->_sFieldName] != $sName) {
-                $sName = $this->_getProviderName($sName);
-                BxDolForm::setSubmittedValue($this->_sFieldName, $sName, $oForm->aFormAttrs['method']);
-            }
-
-            if($oForm->update($iId) === false)
-                return echoJson(['msg' => _t('_sys_txt_error_occured')]);
-
-            if(!empty($aProviderInfo['options']) && is_array($aProviderInfo['options']))
-                foreach($aProviderInfo['options'] as $aOption)
-                    $this->_oDb->insertProviderValue([
-                        'provider_id' => $iId, 
-                        'option_id' => $aOption['id'],
-                        'value' => $oForm->getCleanValue($aOption['name'])
-                    ]);
-
-            return echoJson(['grid' => $this->getCode(false), 'blink' => $iId]);
-        } 
-
-        $sFormId = $oForm->getId();
-        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup_' . $sAction, _t('_sys_agents_providers_popup_edit'), $this->_oTemplate->parseHtmlByName('agents_provider_form.html', [
-            'form_id' => $sFormId,
-            'form' => $oForm->getCode(true),
-            'object' => $this->_sObject,
-            'action' => $sAction
-        ]));
-
-        return echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => false]]]);
-    }
-
-    public function performActionInfo()
-    {
-        $sAction = 'view';
-
-        $iId = $this->_getId();
-
-        $oAIProvider = BxDolAI::getInstance()->getProviderObject($iId);
-        if(!$oAIProvider)
-            return echoJson([]);
-
-        $aProviderInfo = $oAIProvider->getInfo();
-
-        $aForm = $this->_getFormView($sAction, $aProviderInfo);
-        $oForm = new BxTemplFormView($aForm);
-        $oForm->initChecker($aProviderInfo);
-
-        $sFormId = $oForm->getId();
-        $sContent = BxTemplStudioFunctions::getInstance()->popupBox($sFormId . '_popup_' . $sAction, _t('_sys_agents_providers_popup_view'), $this->_oTemplate->parseHtmlByName('agents_provider_form.html', [
-            'form_id' => $oForm->getId(),
-            'form' => $oForm->getCode(true),
-            'object' => $this->_sObject,
-            'action' => $sAction
-        ]));
-
-        echoJson(['popup' => ['html' => $sContent, 'options' => ['closeOnOuterClick' => true, 'removeOnClose' => true]]]);
-    }
-
-    protected function _delete ($mixedId)
-    {
-        $mixedResult = parent::_delete($mixedId);
-        if($mixedResult) {
-            $this->_oDb->deleteProviderValues(['provider_id' => (int)$mixedId]);
-
-            $this->_oDb->deleteAutomatorProviders(['provider_id' => (int)$mixedId]);
-        }
-
-        return $mixedResult;
-    }
-
-    protected function _getFormView($sAction, $aProvider = [])
-    {
-        $aForm = $this->_getForm($sAction, $aProvider);
-        $aForm['params']['view_mode'] = 1;
-
-        return $aForm;
-    }
-    
-    protected function _getFormEdit($sAction, $aProvider = [])
-    {
-        $aForm = $this->_getForm($sAction, $aProvider);
-        $aForm['form_attrs']['action'] .= '&id=' . $aProvider['id'];
-
-        return $aForm;
-    }
-
-    protected function _getForm($sAction, $aProvider = [])
-    {
-        $bProvider = !empty($aProvider) && is_array($aProvider);
-
-        $aForm = [
-            'form_attrs' => [
-                'id' => 'bx_std_agents_providers_' . $sAction,
-                'action' => BX_DOL_URL_ROOT . 'grid.php?o=sys_studio_agents_providers&a=' . $sAction,
-                'method' => 'post',
-            ],
-            'params' => [
-                'db' => [
-                    'table' => 'sys_agents_providers',
-                    'key' => 'id',
-                    'submit_name' => 'do_submit',
-                ],
-            ],
-            'inputs' => [
-                'controls' => $this->_getFormControls(),
-            ],
-        ];
-                    
-        if($sAction == 'add' && !$bProvider) {
-            $aForm['inputs'] = bx_array_insert_before([
-                'type_id' => [
-                    'type' => 'select',
-                    'name' => 'type_id',
-                    'caption' => _t('_sys_agents_providers_field_type_id'),
-                    'info' => '',
-                    'value' => isset($aProvider['type_id']) ? $aProvider['type_id'] : 0,
-                    'values' => array_map(function($sTitle) {
-                        return _t($sTitle);
-                    }, ['' => '_sys_please_select'] + $this->_oDb->getProviderTypesBy(['sample' => 'all_pairs', 'active' => 1])),
-                    'required' => '1',
-                    'db' => [
-                        'pass' => 'Int',
-                    ]
-                ],
-            ], $aForm['inputs'], 'controls');
-
-            $aForm['inputs']['controls'][0] = array_merge($aForm['inputs']['controls'][0], [
-                'name' => 'do_select',
-                'value' => _t('_sys_select')
-            ]);
-        }
-        else {
-            $aInputsAdd = [
-                'type_id' => [
-                    'type' => 'hidden',
-                    'name' => 'type_id',
-                    'value' => isset($aProvider['type_id']) ? $aProvider['type_id'] : 0,
-                    'db' => [
-                        'pass' => 'Int',
-                    ]
-                ],
-                'name' => [
-                    'type' => 'text',
-                    'name' => 'name',
-                    'caption' => _t('_sys_agents_providers_field_name'),
-                    'value' => isset($aProvider['name']) ? $aProvider['name'] : '',
-                    'required' => '1',
-                    'checker' => [
-                        'func' => 'Avail',
-                        'params' => [],
-                        'error' => _t('_sys_agents_form_field_err_enter'),
-                    ],
-                    'db' => [
-                        'pass' => 'Xss',
-                    ],
-                ],
-            ];
-
-            if(!empty($aProvider['options']) && is_array($aProvider['options']))
-                foreach($aProvider['options'] as $aOption) {
-                    if($aOption['type'] == 'value' && empty($aOption['value']))
-                        continue;
-
-                    $aInputsAdd[$aOption['name']] = [
-                        'type' => $aOption['type'],
-                        'name' => $aOption['name'],
-                        'caption' => _t($aOption['title']),
-                        'info' => _t($aOption['description']),
-                        'value' => isset($aOption['value']) ? $aOption['value'] : '',
-                        'checker' => !empty($aOption['check_type']) ? [
-                            'func' => $aOption['check_type'],
-                            'params' => !empty($aOption['check_params']) ? unserialize($aOption['check_params']) : '',
-                            'error' => _t($aOption['check_error']),
-                        ] : null,
-                    ];
-                }
-
-            $aForm['inputs'] = bx_array_insert_before($aInputsAdd, $aForm['inputs'], 'controls');
-        }
-
-        return $aForm;
-    }
-
-    protected function _getProviderName($sName)
-    {
-        return uriGenerate($sName, 'sys_agents_providers', 'name', ['lowercase' => false]);
-    }
-}
-
-/** @} */

+ 1 - 1
studio/template/scripts/BxBaseStudioAgentsVectorStoreData.php

@@ -8,7 +8,7 @@
  * @{
  */
 
-class BxBaseStudioAgentsVectorStoreData extends BxDolStudioAgentsGrid
+class BxBaseStudioAgentsVectorStoreData extends BxTemplStudioGridAgents
 {
     public function __construct ($aOptions, $oTemplate = false)
     {

+ 1 - 1
studio/template/scripts/BxBaseStudioGridAgents.php

@@ -8,7 +8,7 @@
  * @{
  */
 
-class BxBaseStudioGridAgents extends BxTemplStudioGrid
+class BxBaseStudioGridAgents extends BxDolStudioGridAgents
 {
     public function __construct($aOptions, $oTemplate = false)
     {

+ 0 - 19
studio/template/scripts_templ/BxTemplStudioAgentsAutomators.php

@@ -1,19 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaStudioView UNA Studio Representation classes
- * @ingroup     UnaStudio
- * @{
- */
-
-class BxTemplStudioAgentsAutomators extends BxBaseStudioAgentsAutomators
-{
-    public function __construct ($aOptions, $oTemplate = false)
-    {
-        parent::__construct ($aOptions, $oTemplate);
-    }
-}
-
-/** @} */

+ 0 - 19
studio/template/scripts_templ/BxTemplStudioAgentsHelpers.php

@@ -1,19 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaStudioView UNA Studio Representation classes
- * @ingroup     UnaStudio
- * @{
- */
-
-class BxTemplStudioAgentsHelpers extends BxBaseStudioAgentsHelpers
-{
-    public function __construct ($aOptions, $oTemplate = false)
-    {
-        parent::__construct ($aOptions, $oTemplate);
-    }
-}
-
-/** @} */

+ 0 - 19
studio/template/scripts_templ/BxTemplStudioAgentsProviders.php

@@ -1,19 +0,0 @@
-<?php defined('BX_DOL') or die('hack attempt');
-/**
- * Copyright (c) UNA, Inc - https://una.io
- * MIT License - https://opensource.org/licenses/MIT
- *
- * @defgroup    UnaStudioView UNA Studio Representation classes
- * @ingroup     UnaStudio
- * @{
- */
-
-class BxTemplStudioAgentsProviders extends BxBaseStudioAgentsProviders
-{
-    public function __construct ($aOptions, $oTemplate = false)
-    {
-        parent::__construct ($aOptions, $oTemplate);
-    }
-}
-
-/** @} */

+ 0 - 5
template/agents_comment_actions_automator.html

@@ -1,5 +0,0 @@
-<div class="__style_prefix__-actions mt-2">
-    <a class="bx-btn bx-btn-small bx-btn-primary" href="javascript:void(0)" onclick="javascript:__js_object__.approveCode(this, __id__)">
-        <bx_text:_sys_agents_automators_btn_approve />
-    </a>
-</div>

+ 0 - 10
template/agents_comment_content.html

@@ -1,10 +0,0 @@
-<div class="__style_prefix__-body bx-def-vanilla-html bx-def-vh-sm relative mt-2 max-w-none text-clip">
-    __text__
-    <div class="__style_prefix__-body-overflow bx-def-color-bg-box-overflow absolute bottom-0 w-full h-1/5"></div>
-</div>
-<bx_if:show_attached>
-    <div class="__style_prefix__-attached bx-clearfix -mx-1 -mb-1">__attached__</div>
-</bx_if:show_attached>
-<bx_if:show_counters>
-    <div class="__style_prefix__-counters -mx-1 mt-1">__counters__</div>
-</bx_if:show_counters>

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است