From f642ad8b22e2ccc942a96a578db6e265cb354940 Mon Sep 17 00:00:00 2001 From: mbruzon Date: Sat, 20 Jun 2026 10:04:54 +0200 Subject: [PATCH] #wip: Exporter projects. --- JSON/AnP.settings.json | 4 +- Public/ecma/Application/AnP.ecma.js | 10 +- Public/ecma/Application/Components.ecma.js | 16 +- .../ecma/Components/AIChatComponent.ecma.js | 161 +++++++-- Public/ecma/Components/BaseComponent.ecma.js | 5 +- Public/ecma/Controllers/AIController.ecma.js | 4 +- Public/ecma/Managers/RoutesManager.ecma.js | 126 ++++++- Public/ecma/Managers/ViewsManager.ecma.js | 14 +- Public/ecma/Models/RouteModel.ecma.js | 29 +- Public/ecma/Utils/MarkDown.ecma.js | 26 ++ Public/ecma/Utils/Patterns.ecma.js | 3 +- Public/json/AnP.routes.json | 3 + Public/json/AnP.settings.json | 7 +- Public/json/i18n/AnP.i18n.espanol.json | 3 +- Public/json/views/AnP.views.ai.json | 9 + Public/scss/AnP.css | 8 +- Public/scss/AnP.css.map | 2 +- Public/scss/_icons.scss | 5 +- Python/Abstracts/__init__py | 0 Python/Application/__init__py | 0 Python/Controllers/__init__py | 0 Python/Drivers/__init__py | 0 Python/Interfaces/Abstracts/__init__py | 0 Python/Interfaces/Application/__init__py | 0 Python/Interfaces/Managers/__init__py | 0 Python/Interfaces/__init__py | 0 Python/Managers/ControllersManager.py | 2 +- Python/Managers/DispatchesManager.py | 2 +- Python/Managers/I18NManager.py | 2 +- Python/Managers/ModelsManager.py | 3 +- Python/Managers/SettingsManager.py | 5 +- Python/Managers/__init__py | 0 Python/Models/__init__py | 0 Python/Utils/Checks.py | 22 +- Python/Utils/Common.py | 19 +- Python/Utils/__init__py | 0 Python/__init__py | 0 Python/map.anp.py | 312 ++++++++++++++++++ 38 files changed, 722 insertions(+), 80 deletions(-) create mode 100644 Public/json/AnP.routes.json create mode 100644 Public/json/views/AnP.views.ai.json create mode 100644 Python/Abstracts/__init__py create mode 100644 Python/Application/__init__py create mode 100644 Python/Controllers/__init__py create mode 100644 Python/Drivers/__init__py create mode 100644 Python/Interfaces/Abstracts/__init__py create mode 100644 Python/Interfaces/Application/__init__py create mode 100644 Python/Interfaces/Managers/__init__py create mode 100644 Python/Interfaces/__init__py create mode 100644 Python/Managers/__init__py create mode 100644 Python/Models/__init__py create mode 100644 Python/Utils/__init__py create mode 100644 Python/__init__py create mode 100644 Python/map.anp.py diff --git a/JSON/AnP.settings.json b/JSON/AnP.settings.json index a05ca24..41151eb 100644 --- a/JSON/AnP.settings.json +++ b/JSON/AnP.settings.json @@ -210,8 +210,8 @@ "AnP_HTTPServersManager_start" : null, "default_http_servers" : { "anp" : { - "type2" : "HTTPServerDriver", - "type" : "HTTPSocketServerDriver", + "type" : "HTTPServerDriver", + "type2" : "HTTPSocketServerDriver", "host" : "", "port" : 18000 } diff --git a/Public/ecma/Application/AnP.ecma.js b/Public/ecma/Application/AnP.ecma.js index 92a531b..ca851a6 100644 --- a/Public/ecma/Application/AnP.ecma.js +++ b/Public/ecma/Application/AnP.ecma.js @@ -83,6 +83,11 @@ export const AnP = (function(){ /** @type {WebSocketsClientsManager} */ this.web_sockets_clients = new WebSocketsClientsManager(self); + /** @type {HTMLElement|Document} */ + this.item_self = document; + /** @type {string|null} */ + this.hash_self = null; + /** * @returns {void} * @access private @@ -139,7 +144,10 @@ export const AnP = (function(){ if(ok !== false && self.settings.get("build_base_gui")){ Common.preload(self.settings.get("position"), (position, asynchronous, ok) => { if(position){ - Common.HTML(position, self.components.base.build()); + self.hash_self = ( + self.item_self = Common.HTML(position, self.components.base.build())[0] + ).getAttribute("data-hash"); + self.routes.refresh(); end(true); }else end(false); diff --git a/Public/ecma/Application/Components.ecma.js b/Public/ecma/Application/Components.ecma.js index 7eb194b..7137de6 100644 --- a/Public/ecma/Application/Components.ecma.js +++ b/Public/ecma/Application/Components.ecma.js @@ -12,7 +12,7 @@ import { AIChatComponent } from "../Components/AIChatComponent.ecma.js"; import {Common} from "../Utils/Common.ecma.js"; import {Check} from "../Utils/Checks.ecma.js"; import { - Span, Img, Button, Label, Input, Textarea, Div + Span, Img, Button, Label, Input, Textarea, Div, Fieldset } from "../Utils/HTMLDSL.ecma.js"; /** @@ -67,7 +67,7 @@ export const Components = (function(){ /** @type {I18NComponent} */ this.i18n_selector = new I18NComponent(anp); /** @type {AIChatComponent} */ - this.aichat = new AIChatComponent(anp); + this.aichat_manager = new AIChatComponent(anp); /** * @returns {void} @@ -88,7 +88,7 @@ export const Components = (function(){ * @access private */ const thread_method = () => { - document.querySelectorAll(".anp .input .field-information[data-i18n=length]").forEach(item => { + anp.item_self.querySelectorAll(".input .field-information[data-i18n=length]").forEach(item => { /** @type {HTMLSpanElement} */ const field = item.querySelector(".value"), @@ -473,6 +473,16 @@ export const Components = (function(){ self.button(name, action, inputs) ))); + /** + * @param {!number} code + * @returns {Array.} + * @access public + */ + this.http_error = code => Fieldset({class : "error-" + code}, [ + self.i18n("http_error", "legend", {code : code}), + self.i18n("http_error_" + code, "p") + ]); + constructor(); }; diff --git a/Public/ecma/Components/AIChatComponent.ecma.js b/Public/ecma/Components/AIChatComponent.ecma.js index 7a929c2..88762d0 100644 --- a/Public/ecma/Components/AIChatComponent.ecma.js +++ b/Public/ecma/Components/AIChatComponent.ecma.js @@ -30,21 +30,46 @@ export const AIChatComponent = (function(){ const AIChatComponent = function(anp){ /** @type {AIChatComponent} */ - const self = this; - /** @type {string|null} */ - let web_socket_id = null; + const self = this, + /** @type {Object.>} */ + cache = {}; /** * @returns {void} * @access private */ - const constructor = () => {}; + const constructor = () => { + setTimeout(() => { + anp.components.aichat = self.build; + }, 0); + }; + /** + * @param {!HTMLElement} item + * @returns {HTMLFielsetElement} + * @access private + */ + const get_chat_box = item => { + + while((!item.classList || !item.classList.contains("aichat")) && (item = item.parentElement)); + + return item; + }; + + /** + * @param {?(Object.|Array.)} [inputs = null] + * @returns {Array.} + * @access public + */ this.build = (inputs = null) => { + /** @type {string} */ const name = Common.get_value("name", inputs, "aichat"); - return Fieldset({class : "aichat"}, [ + return Fieldset({ + class : "aichat", + data_name : Common.get_value("name", inputs, "aichat") + }, [ anp.components.i18n(name, "legend"), Section({class : "conversations"}, [ Article({ @@ -57,7 +82,12 @@ export const AIChatComponent = (function(){ method : "post", action : "#", on_submit : send, - on_key_down : check_keys + on_key_down : check_keys, + data_connection : Common.data_encode([ + Common.get_value("web_socket", inputs, "anp"), + Common.get_value("controller", inputs, "ai"), + Common.get_value(["action", "method"], inputs, "message") + ]) }, [ anp.components.text("message", { multiline : true @@ -67,6 +97,12 @@ export const AIChatComponent = (function(){ ]); }; + /** + * @param {!string} name + * @param {!string} value + * @returns {Array.} + * @access private + */ const build_data_icon = (name, value) => LI({ data_name : name, data_i18n : value, @@ -77,6 +113,12 @@ export const AIChatComponent = (function(){ anp.components.i18n(value) ]); + /** + * @param {!string} name + * @param {?string} [value = null] + * @returns {Array.} + * @access private + */ const build_data_item = (name, value = null) => LI({ data_name : name, data_i18n : name, @@ -88,6 +130,11 @@ export const AIChatComponent = (function(){ value === null ? null : Span({class : "value"}, "" + value) ]); + /** + * @param {!HTMLElement} item + * @returns {HTMLTextAreaElement} + * @access private + */ const get_message_box = item => { while((!item.classList || !item.classList.contains("message")) && (item = item.parentElement)); @@ -95,25 +142,49 @@ export const AIChatComponent = (function(){ return item; }; + /** + * @param {!HTMLElement} item + * @param {!Event} event + * @returns {void} + * @access private + */ const set_view = (item, event) => { + /** @type {HTMLTextAreaElement} */ const box = get_message_box(item), + /** @type {string} */ mode = item.getAttribute("data-i18n"); box.getAttribute("data-mode") != mode && box.setAttribute("data-mode", mode); }; + /** + * @param {!string} content + * @returns {[string, string, string]} + * @access private + */ const format = content => { + /** @type {string} */ const html = MarkDown.to_html(content); return [html, html.replace(//g, ">"), content]; }; + /** + * @param {!string} id + * @param {!string} type + * @param {?string} [content = ""] + * @param {?string} [mode = "waiting"] + * @returns {HTMLFielsetElement} + * @access private + */ const build_message = (id, type, content = "", mode = "waiting") => { + /** @type {[string, string, string]} */ const [html, raw_html, md] = format(content), + /** @type {number} */ date = Date.now(); return Fieldset({ @@ -147,17 +218,32 @@ export const AIChatComponent = (function(){ ]); }; + /** + * + * @param {!HTMLElement} item + * @param {!Event} event + * @returns {boolean} + * @access private + */ const send = (item, event) => { + /** @type {HTMLTextAreaElement} */ const text_box = item.querySelector("[name=message]"), + /** @type {string} */ text = text_box.value.trim(), - conversation = document.querySelector(".aichat [data-conversation][data-selected=true]").getAttribute("data-conversation"); + /** @type {HTMLArticleElement} */ + conversation = anp.item_self.querySelector(".aichat [data-conversation][data-selected=true]").getAttribute("data-conversation"); event.preventDefault(); if(text){ - const data_id = anp.unique_keys.get(); + console.log([item, item.querySelector("[name=message]"), item.querySelector("[name=message]").parentNode.parentNode.getAttribute("data-connection")]); + + /** @type {string} */ + const data_id = anp.unique_keys.get(), + /** @type {[string, string, string]} */ + [web_socket, controller, method] = Common.data_decode(item.querySelector("[name=message]").parentNode.parentNode.getAttribute("data-connection")); Common.HTML( ".aichat [data-conversation=" + conversation + "]", @@ -166,7 +252,7 @@ export const AIChatComponent = (function(){ ); text_box.value = ""; - anp.web_sockets_clients.send("anp", "ai", "message", { + anp.web_sockets_clients.send(web_socket, controller, method, { message_id : data_id, message : text, conversation : conversation @@ -177,16 +263,32 @@ export const AIChatComponent = (function(){ return false; }; + /** + * @param {!HTMLElement} item + * @param {!Event} event + * @returns {void} + * @access private + */ const check_keys = (item, event) => { event.key == "Enter" && !event.shiftKey && send(item, event); }; + /** + * @param {!string} conversation + * @param {!string} message + * @param {!string} status + * @returns {void} + * @access private + */ const set_status = (conversation, message, status) => { - // console.log([conversation, message, status]); - const box = document.querySelector(".aichat [data-conversation='" + conversation + "']>[data-type=bot][data-id='" + message + "']"), + /** @type {HTMLFieldSetElement} */ + const box = anp.item_self.querySelector(".aichat [data-conversation='" + conversation + "']>[data-type=bot][data-id='" + message + "']"), + /** @type {HTMLSpanElement} */ status_box = box.querySelector("[data-name=status]"), + /** @type {HTMLSpanElement} */ status_i18n_box = status_box.querySelector("[data-i18n]"), + /** @type {string} */ status_text = anp.i18n.get(status); @@ -200,19 +302,24 @@ export const AIChatComponent = (function(){ }; + /** + * @param {!string} conversation + * @param {!string} message + * @param {!string} fragment + * @param {!boolean} ok + * @param {!boolean} done + * @returns {void} + * @access public + */ this.write_response = (conversation, message, fragment, ok, done) => { - // console.log([id, fragment]); - const box = document.querySelector(".aichat .messages>[data-type=bot][data-id='" + message + "']"), - // status = ( - // !ok ? "error" : - // done ? "done" : - // "loading"), - // status_text = anp.i18n.get(status), - // status_box = box.querySelector("[data-name=status]"), - // status_i18n_box = status_box.querySelector("[data-i18n]"), + /** @type {HTMLFieldSetElement} */ + const box = anp.item_self.querySelector(".aichat .messages>[data-type=bot][data-id='" + message + "']"), + /** @type {number} */ date = Date.now(), + /** @type {HTMLSpanElement} */ tokens_box = box.querySelector("[data-name=response_tokens] .value"), + /** @type {[string, string, string]} */ [html, raw_html, md] = format(box.querySelector(".md-content").textContent += fragment); box.querySelector(".html-content").innerHTML = html; @@ -222,13 +329,6 @@ export const AIChatComponent = (function(){ box.setAttribute("data-ok", ok); box.setAttribute("data-done", done); - // box.setAttribute("data-status", status); - - // status_box.setAttribute("data-i18n", status); - // status_box.setAttribute("title", status_text); - // status_box.querySelector("[data-icon]").setAttribute("data-icon", status); - // status_i18n_box.setAttribute("data-i18n", status_text); - // status_i18n_box.innerHTML = status_text; set_status(conversation, message, ( !ok ? "error" : @@ -241,6 +341,13 @@ export const AIChatComponent = (function(){ }; + /** + * @param {!string} conversation + * @param {!string} message + * @param {!string} status + * @returns {void} + * @access public + */ this.change_status = (conversation, message, status) => { set_status(conversation, message, status); }; diff --git a/Public/ecma/Components/BaseComponent.ecma.js b/Public/ecma/Components/BaseComponent.ecma.js index 251b65c..05d4a03 100644 --- a/Public/ecma/Components/BaseComponent.ecma.js +++ b/Public/ecma/Components/BaseComponent.ecma.js @@ -170,7 +170,8 @@ export const BaseComponent = (function(){ Nav({class : "top-menu"}, [ UL(null, anp.settings.get("main_menu", inputs, [ ["home", "#"], - ["git", git, "_blank"] + ["git", git, "_blank"], + ["ai", "#/ai"] ]).map(([name, link, target]) => LI({ data_i18n : name, data_i18n_without : true, @@ -188,7 +189,7 @@ export const BaseComponent = (function(){ anp.components.session_mini.build() ]), Main(null, [ - anp.components.aichat.build(inputs) + // anp.components.aichat.build(inputs) ]), Footer(null, [ anp.components.buttons([ diff --git a/Public/ecma/Controllers/AIController.ecma.js b/Public/ecma/Controllers/AIController.ecma.js index 4a7ceac..a5be8ae 100644 --- a/Public/ecma/Controllers/AIController.ecma.js +++ b/Public/ecma/Controllers/AIController.ecma.js @@ -39,7 +39,7 @@ export const AIController = (function(){ * @access private */ this.message = (data, code) => { - anp.components.aichat.write_response( + anp.components.aichat_manager.write_response( data.data.conversation, data.data.message, data.data.response, @@ -55,7 +55,7 @@ export const AIController = (function(){ * @access private */ this.status = (data, code) => { - anp.components.aichat.change_status( + anp.components.aichat_manager.change_status( data.data.conversation, data.data.message, data.data.status diff --git a/Public/ecma/Managers/RoutesManager.ecma.js b/Public/ecma/Managers/RoutesManager.ecma.js index 07456d3..7497562 100644 --- a/Public/ecma/Managers/RoutesManager.ecma.js +++ b/Public/ecma/Managers/RoutesManager.ecma.js @@ -2,6 +2,8 @@ import {Common} from "../Utils/Common.ecma.js"; import {RouteModel} from "../Models/RouteModel.ecma.js"; +import {Check} from "../Utils/Checks.ecma.js"; +import {RE} from "../Utils/Patterns.ecma.js"; /** * @typedef {import("../AnP.ecma.js").AnP} AnP @@ -23,6 +25,11 @@ export const RoutesManager = (function(){ * @return {boolean} */ + /** + * @callback default_callback + * @return {void} + */ + /** * @constructs RoutesManager * @param {!AnP} anp @@ -67,11 +74,19 @@ export const RoutesManager = (function(){ if(last_url != current_url){ last_url = current_url; - self.go(last_url); + self.refresh(); }; }; + /** + * @returns {void} + * @access public + */ + this.refresh = () => { + self.go(last_url); + }; + /** * @param {?continue_callback} callback * @returns {boolean} @@ -138,11 +153,114 @@ export const RoutesManager = (function(){ return true; }; - this.add = (inputs, overwrite = false, callback = null) => { - Common.execute(callback, true); + /** + * @param {!(string|RegExp)} route_path + * @param {!string} view + * @param {!boolean} overwrite + * @returns {boolean} + * @access private + */ + const set_new = (route_path, view, permissions, overwrite) => { + + /** @type {RouteModel} */ + const route = new RouteModel(route_path, view, permissions); + let i = null; + + if(!routes.some((exists, j) => { + if(exists.route.source == route.route.source){ + i = j; + return true; + }; + return false; + })){ + if(i === null) + routes.push(route); + else if(overwrite) + routes[i] = route; + return true; + }; + return false; }; - this.go = path => {}; + /** + * @param {?any} inputs + * @param {!boolean} [overwrite = false] + * @param {?default_callback} [callback = null] + * @returns {void} + * @access public + */ + this.add = (inputs, overwrite = false, callback = null) => { + if(Check.is_string(inputs)){ + + /** @type {RegExpMatchArray} */ + const matches = (inputs = inputs.trim()).match(RE.ROUTES); + + if(matches){ + set_new(matches[1], matches[2], matches[3] ? matches[3].split(",") : [], overwrite); + Common.execute(callback); + }else if(Check.is_json(inputs)) + self.add(JSON.parse(inputs), overwrite, callback); + else + anp.files.load_json(inputs, data => { + self.add(data, overwrite, callback); + }); + + }else if(Check.is_array(inputs)){ + if(inputs.length >= 2 && inputs.length <= 3 && ( + Check.is_string(inputs[0]) && inputs[0] == inputs[0].trim() && + Check.is_key(inputs[1]) && + !inputs[2] || (Check.is_array(inputs[2]) && inputs[2].every(Check.is_key)) + )){ + set_new(inputs[0], inputs[1], inputs[3], overwrite); + Common.execute(callback); + return; + }; + + /** @type {number} */ + let i = 0; + /** @type {number} */ + const l = inputs.length, + /** @type {default_callback} */ + end = () => ++ i == l && Common.execute(callback); + + inputs.forEach(subinputs => { + self.add(subinputs, overwrite, end); + }); + + }else if(Check.is_dictionary(inputs)){ + set_new(inputs.route, inputs.view, inputs.permissions || [], overwrite); + Common.execute(callback); + }else + Common.execute(callback); + }; + + /** + * @param {!string} path + * @returns {void} + * @access public + */ + this.go = path => { + + const main = anp.item_self.querySelector("main"); + + if(!main) + return; + + main.innerHTML = ""; + + for(const route of routes){ + + /** @type {[boolean, Object.]} */ + const [ok, variables] = route.check(path); + + if(ok){ + Common.HTML("main", anp.views.get(route.view, variables)) + break; + }; + + }; + + }; constructor(); }; diff --git a/Public/ecma/Managers/ViewsManager.ecma.js b/Public/ecma/Managers/ViewsManager.ecma.js index 6f89f50..2ad4a6d 100644 --- a/Public/ecma/Managers/ViewsManager.ecma.js +++ b/Public/ecma/Managers/ViewsManager.ecma.js @@ -51,7 +51,7 @@ export const ViewsManager = (function(){ */ this.update = (callback = null) => { Common.execute_array(["default_views_files", "views_files", "default_views", "views"], (key, next) => { - self.add(self.get(key), true, next); + self.add(anp.settings.get(key), true, next); }, callback, true); }; @@ -129,7 +129,17 @@ export const ViewsManager = (function(){ }, true); }; - this.get = (key, inputs = null) => {}; + /** + * @param {!string} key + * @param {?(Object.|Array.)} [inputs = null] + * @returns {Array.|null} + * @access public + */ + this.get = (key, inputs = null) => { + if(views[key] && views[key].type && anp.components[views[key].type]) + return anp.components[views[key].type]([views[key], inputs]); + return anp.components.http_error(502); + }; constructor(); }; diff --git a/Public/ecma/Models/RouteModel.ecma.js b/Public/ecma/Models/RouteModel.ecma.js index 886b72f..8c21c72 100644 --- a/Public/ecma/Models/RouteModel.ecma.js +++ b/Public/ecma/Models/RouteModel.ecma.js @@ -2,12 +2,14 @@ import {Check} from "../Utils/Checks.ecma.js"; import {Common} from "../Utils/Common.ecma.js"; +import {RE} from "../Utils/Patterns.ecma.js"; /** * @class RouteModel * @constructor * @param {!(string|RegExp)} route * @param {!string} view + * @param {Array.} [permissions = []] * @returns {void} * @access public * @static @@ -18,11 +20,12 @@ export const RouteModel = (function(){ * @constructs RouteModel * @param {!(string|RegExp)} route * @param {!string} view + * @param {Array.} [permissions = []] * @returns {void} * @access private * @static */ - const RouteModel = function(route, view){ + const RouteModel = function(route, view, permissions = []){ /** @type {RouteModel} */ const self = this; @@ -33,6 +36,8 @@ export const RouteModel = (function(){ this.variables = []; /** @type {string} */ this.view = view; + /** @type {Array.} */ + this.permissions = permissions; /** * @returns {void} @@ -40,17 +45,35 @@ export const RouteModel = (function(){ */ const constructor = () => { if(Check.is_string(route)) - route = new RegExp("^" + Common.to_regular_expression(route.replace(RE.STRING_VARIABLES, (_, key) => { + self.route = new RegExp("^" + Common.to_regular_expression(route.replace(RE.STRING_VARIABLES, (_, key) => { self.variables.push(key); return "#######"; })).replace(/#{7}/g, "([^\\/]+)") + "\\/?$", "i"); else if(Check.is_regular_expression(route)) - (this.route = route).source.replace(/\([^\(\)]+\)/g, all => { + (self.route = route).source.replace(/\([^\(\)]+\)/g, all => { self.variables.push("" + self.variables.length); return all; }); }; + /** + * @param {!string} url + * @returns {[!boolean, Object.]} + * @access public + */ + this.check = url => { + + /** @type {RegExpMatchArray} */ + const matches = url.match(self.route); + + return matches ? [true, self.variables.reduce((variables, key, i) => { + + variables[key] = matches[i + 1]; + + return variables; + }, {})] : [false, {}]; + } + constructor(); }; diff --git a/Public/ecma/Utils/MarkDown.ecma.js b/Public/ecma/Utils/MarkDown.ecma.js index b60b84d..d8bc94c 100644 --- a/Public/ecma/Utils/MarkDown.ecma.js +++ b/Public/ecma/Utils/MarkDown.ecma.js @@ -28,6 +28,32 @@ export const MarkDown = (function(){ MarkDown.Italic = () => new MarkDown.Item(/\*((?:(?!(?:\*)).|\*{2})+)\*(?!\*)/, (match, content) => `${MarkDown.to_html(content, false)}`); + // MarkDown.UnorderedList = () => new MarkDown.Item(/^\s*[-+*]\s+(.+)$/m, (match, content) => `
  • ${MarkDown.to_html(content, false)}
`, true); + + // MarkDown.OrderedList = () => new MarkDown.Item(/^(\s*\d+\.\s+.+(?:\r\n|[\r\n])?)$/m, (match, content) => `
  1. ${MarkDown.to_html(content, false)}
`, true); + + // MarkDown.Table = () => new MarkDown.Item(/^\s*\|(.+)\|\s*$/m, (match, content) => { + + // const rows = content.split(/\r?\n/).map(row => row.trim().split("|").map(cell => cell.trim())); + + // if(rows.length < 2) + // return content; + // const header = rows[0], + // alignments = rows[1].map(cell => { + // if(/^:-+:$/.test(cell)) + // return "center"; + // else if(/^-+:$/.test(cell)) + // return "right"; + // else if(/^:-+$/.test(cell)) + // return "left"; + // return null; + // }), + // body = rows.slice(2); + + // return `${header.map((cell, i) => `${MarkDown.to_html(cell, false)}`).join("")}${body.map(row => `${row.map((cell, i) => `${MarkDown.to_html(cell, false)}`).join("")}`).join("")}
`; + + // }, true); + MarkDown.to_html = (string, blocks = true) => { let html = ``; diff --git a/Public/ecma/Utils/Patterns.ecma.js b/Public/ecma/Utils/Patterns.ecma.js index 56b3996..97887ac 100644 --- a/Public/ecma/Utils/Patterns.ecma.js +++ b/Public/ecma/Utils/Patterns.ecma.js @@ -8,5 +8,6 @@ export const RE = { ON_ATTRIBUTE : /^on[\-_]?/i, SPECIAL_HTML_EVENT_CHARACTERS : /[^a-z0-9]+/gi, WHITE_SPACES : /(?:\s+|[\r\n]+)+/g, - TO_REGULAR_EXPRESSION : /[\.\-\^\$\\\/\[\]\(\)\{\}\!\?\*\+\n\r\t]/g + TO_REGULAR_EXPRESSION : /[\.\-\^\$\\\/\[\]\(\)\{\}\!\?\*\+\n\r\t]/g, + ROUTES : /^([^ ]+) +([a-z_][a-z0-9_]*)(?: +([^ ]+)?)?$/i }; \ No newline at end of file diff --git a/Public/json/AnP.routes.json b/Public/json/AnP.routes.json new file mode 100644 index 0000000..6a20658 --- /dev/null +++ b/Public/json/AnP.routes.json @@ -0,0 +1,3 @@ +[ + "/ai ai" +] \ No newline at end of file diff --git a/Public/json/AnP.settings.json b/Public/json/AnP.settings.json index ffe7e34..8bd72dc 100644 --- a/Public/json/AnP.settings.json +++ b/Public/json/AnP.settings.json @@ -33,5 +33,10 @@ }, "default_controllers" : { "ai" : "AIController" - } + }, + "default_views_files" : [ + "/json/views/AnP.views.ai.json", + "/json/views/AnP.views.sessions.json" + ], + "default_routes_files" : "/json/AnP.routes.json" } \ No newline at end of file diff --git a/Public/json/i18n/AnP.i18n.espanol.json b/Public/json/i18n/AnP.i18n.espanol.json index edfa396..029e467 100644 --- a/Public/json/i18n/AnP.i18n.espanol.json +++ b/Public/json/i18n/AnP.i18n.espanol.json @@ -31,6 +31,7 @@ "status" : "Estado", "raw_html" : "Código HTML", "minimum" : "Mínimo", - "maximum" : "Máximo" + "maximum" : "Máximo", + "ai" : "IA" } } \ No newline at end of file diff --git a/Public/json/views/AnP.views.ai.json b/Public/json/views/AnP.views.ai.json new file mode 100644 index 0000000..4d35dd9 --- /dev/null +++ b/Public/json/views/AnP.views.ai.json @@ -0,0 +1,9 @@ +{ + "ai" : { + "type" : "aichat", + "name" : "anpbot", + "web_socket" : "anp", + "controller" : "ai", + "method" : "message" + } +} \ No newline at end of file diff --git a/Public/scss/AnP.css b/Public/scss/AnP.css index c8d59ba..28e0776 100644 --- a/Public/scss/AnP.css +++ b/Public/scss/AnP.css @@ -1233,6 +1233,10 @@ content: "\f841"; font-family: "FA6FB"; } +.anp [data-icon=ai]::before { + content: "\f27a"; + font-family: "FA6FR"; +} .anp [data-icon=user]::before { content: "\f007"; } @@ -1298,10 +1302,10 @@ } .anp [data-done=true] [data-icon=done]::before { content: "\f058"; - font-family: "FA6FR"; } .anp [data-done=false] [data-icon=done]::before { - content: "\f071"; + content: "\f057"; + font-family: "FA6FR"; } .anp [data-icon=date_from]::before { content: "\f783"; diff --git a/Public/scss/AnP.css.map b/Public/scss/AnP.css.map index c886784..e1281bd 100644 --- a/Public/scss/AnP.css.map +++ b/Public/scss/AnP.css.map @@ -1 +1 @@ -{"version":3,"sourceRoot":"","sources":["_fonts.scss","_base.scss","_settings.scss","_icons.scss","_aichat.scss"],"names":[],"mappings":"AAwDA;EACI;EACA;EACA;EACA;EACA,KACI;;AAGR;EACI;EACA;EACA;EACA;EACA,KACI;;AAGR;EACI;EACA;EACA;EACA;EACA,KACI;;AAwCR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;ACl8BJ;EAEI;EACA;EACA;EACA;EACA;EACA;;AACA;EACI,aCYO;EDXP;;AAGJ;EAA6B;;AAE7B;EAAQ;;AACR;EACI;EACA,qBCSU;EDRV;;AACA;EAAQ,qBCMC;;ADJb;EACI;EACA;EACA;EACA,eCZS;EDaT;;AAEJ;EACI;;AACA;EAAO;;AACP;EACI,wBCnBK;EDoBL,2BCpBK;;ADsBT;EACI,yBCvBK;EDwBL,4BCxBK;;AD4Bb;EACI;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA,QCvCS;EDwCT;;AAEJ;EACI,KC3CS;ED4CT,QC3CS;ED4CT;;AAEJ;EACI;EACA;EACA;EACA,QClDS;EDmDT;;AAGJ;EApFA;EACA;;AACA;EACI;;AACA;EAAQ;;AAEZ;EACI;EACA;;AACA;EACI;EACA;;AAGR;EAAkB;;AA0Ed;EAxFJ;EACA;;AACA;EACI;;AACA;EAAQ;;AAEZ;EACI;EACA;;AACA;EACI;EACA;;AAGR;EAAkB;;AA0Ed;EAxFJ;EACA;;AACA;EACI;;AACA;EAAQ;;AAEZ;EACI;EACA;;AACA;EACI;EACA;;AAGR;EAAkB;;AA+ElB;EACI;EACA;EACA;EACA;;AACA;EACI;EACA;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;EACA,OCxGE;;ADyGF;EAAqC;;AACrC;EACI;EACA;;AAEJ;EACI;EACA;;AAKZ;EACI;EACA;EACA;EACA;;AACA;EAAa;;AACb;EACI;EACA;EACA;EACA;EACA;;AACA;EAAO;;AAEX;EACI;EACA;;AAIR;EACI;;AACA;EACI;EACA;EACA;EACA;;AACA;EACI;EACA;;AAKZ;EACI;EACA;EACA;EACA;;AACA;EACI;EACA;EACA;EACA,OCzIK;ED0IL,QC1IK;ED2IL;EACA,kBCnKE;EDoKF;EACA;EACA,qBChIM;EDiIN;;AACA;EACI;EACA,qBCrIC;;ADwIT;EACI;EACA;;AACA;EAAO;;AAEX;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EAAG;;AACH;EAAwB;;AAE5B;EACI;EACA;EACA;EACA;;AACA;EACI;EACA;EACA;EACA;;AACA;EACI;EACA;;AAIJ;EAAU;;AACV;EAAc;;AAK1B;EACI;EACA;;AAEI;EAAU;;AACV;EAAc;;AAItB;EACI;EACA;EACA;;AACA;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;;AACA;EAAK;;AACL;EACI;EACA;EACA,QCrNC;EDsND;;AAKZ;EACI;EACA;EACA;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI;EACA;EACA,qBC7NC;;ADgOT;EACI;EACA;EACA,qBClOM;EDmON;;AACA;EAAI;;AAER;EAAsB;;AACtB;EACI;EACA;EACA;;;AEpRR;EACI;EACA,aH0GC;;AGxGL;EAAyB;;AACzB;EAAwB;EAA2B,aHqG9C;;AGpGL;EAAyB;;AACzB;EAAuB;EAAgB;EAAmB,aD6B/C;;AC5BX;EAA0B;;AAC1B;EAA6B;;AAC7B;EAA2B;;AAC3B;EAAyB;;AACzB;EAA+B;;AAC/B;EAA6B;;AAC7B;EAAyB;EAA2B,aH6F/C;;AG1FL;EAAyB;EAA2B,aHyF/C;;AGxFL;EAA6B;;AAC7B;EAAuB;;AACvB;EAAyB;EAA2B,aHuF/C;;AGtFL;EAA8B;;AAC9B;EAA0B;EAA2B,aHoFhD;;AGnFL;EAA4B;;AAC5B;EAA4B;;AAC5B;EAAsC;;AACtC;EAAuC;;AACvC;EAA0C;EAA2B,aHgFhE;;AG/EL;EAA2C;;AAC3C;EAA8B;;AAC9B;EAA4B;;AAC5B;EAAyB;EAA2B,aH4E/C;;AG3EL;EAA2B;;AAC3B;EAAoC;EAA2B,aH0E1D;;;AI7GL;EAAe;;AAAf;EAAe;;AAAf;EAAe;;AAaf;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAEJ;EAAO;;AACP;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EAAO;;AACP;EAAS;;AAEb;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AACA;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;;AAEJ;EACI;EACA;;AAIR;EAAa;;AACb;EACI;;AACA;EAAoB;;AACpB;EAAY;;AAEhB;AAAA;AAAA;EAE2B;;AAC3B;AAAA;AAAA;EAEoC;;AAEpC;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI;EACA;EACA;;AACA;EAAY;;AAEhB;EAAsB","file":"AnP.css"} \ No newline at end of file +{"version":3,"sourceRoot":"","sources":["_fonts.scss","_base.scss","_settings.scss","_icons.scss","_aichat.scss"],"names":[],"mappings":"AAwDA;EACI;EACA;EACA;EACA;EACA,KACI;;AAGR;EACI;EACA;EACA;EACA;EACA,KACI;;AAGR;EACI;EACA;EACA;EACA;EACA,KACI;;AAwCR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;ACl8BJ;EAEI;EACA;EACA;EACA;EACA;EACA;;AACA;EACI,aCYO;EDXP;;AAGJ;EAA6B;;AAE7B;EAAQ;;AACR;EACI;EACA,qBCSU;EDRV;;AACA;EAAQ,qBCMC;;ADJb;EACI;EACA;EACA;EACA,eCZS;EDaT;;AAEJ;EACI;;AACA;EAAO;;AACP;EACI,wBCnBK;EDoBL,2BCpBK;;ADsBT;EACI,yBCvBK;EDwBL,4BCxBK;;AD4Bb;EACI;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA,QCvCS;EDwCT;;AAEJ;EACI,KC3CS;ED4CT,QC3CS;ED4CT;;AAEJ;EACI;EACA;EACA;EACA,QClDS;EDmDT;;AAGJ;EApFA;EACA;;AACA;EACI;;AACA;EAAQ;;AAEZ;EACI;EACA;;AACA;EACI;EACA;;AAGR;EAAkB;;AA0Ed;EAxFJ;EACA;;AACA;EACI;;AACA;EAAQ;;AAEZ;EACI;EACA;;AACA;EACI;EACA;;AAGR;EAAkB;;AA0Ed;EAxFJ;EACA;;AACA;EACI;;AACA;EAAQ;;AAEZ;EACI;EACA;;AACA;EACI;EACA;;AAGR;EAAkB;;AA+ElB;EACI;EACA;EACA;EACA;;AACA;EACI;EACA;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;EACA,OCxGE;;ADyGF;EAAqC;;AACrC;EACI;EACA;;AAEJ;EACI;EACA;;AAKZ;EACI;EACA;EACA;EACA;;AACA;EAAa;;AACb;EACI;EACA;EACA;EACA;EACA;;AACA;EAAO;;AAEX;EACI;EACA;;AAIR;EACI;;AACA;EACI;EACA;EACA;EACA;;AACA;EACI;EACA;;AAKZ;EACI;EACA;EACA;EACA;;AACA;EACI;EACA;EACA;EACA,OCzIK;ED0IL,QC1IK;ED2IL;EACA,kBCnKE;EDoKF;EACA;EACA,qBChIM;EDiIN;;AACA;EACI;EACA,qBCrIC;;ADwIT;EACI;EACA;;AACA;EAAO;;AAEX;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EAAG;;AACH;EAAwB;;AAE5B;EACI;EACA;EACA;EACA;;AACA;EACI;EACA;EACA;EACA;;AACA;EACI;EACA;;AAIJ;EAAU;;AACV;EAAc;;AAK1B;EACI;EACA;;AAEI;EAAU;;AACV;EAAc;;AAItB;EACI;EACA;EACA;;AACA;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;;AACA;EAAK;;AACL;EACI;EACA;EACA,QCrNC;EDsND;;AAKZ;EACI;EACA;EACA;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI;EACA;EACA,qBC7NC;;ADgOT;EACI;EACA;EACA,qBClOM;EDmON;;AACA;EAAI;;AAER;EAAsB;;AACtB;EACI;EACA;EACA;;;AEpRR;EACI;EACA,aH0GC;;AGxGL;EAAyB;;AACzB;EAAwB;EAA2B,aHqG9C;;AGpGL;EAAuB;EAA2B,aHqG7C;;AGpGL;EAAyB;;AACzB;EAAuB;EAAgB;EAAmB,aD4B/C;;AC3BX;EAA0B;;AAC1B;EAA6B;;AAC7B;EAA2B;;AAC3B;EAAyB;;AACzB;EAA+B;;AAC/B;EAA6B;;AAC7B;EAAyB;EAA2B,aH4F/C;;AGzFL;EAAyB;EAA2B,aHwF/C;;AGvFL;EAA6B;;AAC7B;EAAuB;;AACvB;EAAyB;EAA2B,aHsF/C;;AGrFL;EAA8B;;AAC9B;EAA0B;EAA2B,aHmFhD;;AGlFL;EAA4B;;AAC5B;EAA4B;;AAC5B;EAAsC;;AACtC;EAAuC;;AACvC;EAA0C;;AAC1C;EAA2C;EAA2B,aH8EjE;;AG7EL;EAA8B;;AAC9B;EAA4B;;AAC5B;EAAyB;EAA2B,aH2E/C;;AG1EL;EAA2B;;AAC3B;EAAoC;EAA2B,aHyE1D;;;AI7GL;EAAe;;AAAf;EAAe;;AAAf;EAAe;;AAaf;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAEJ;EAAO;;AACP;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EAAO;;AACP;EAAS;;AAEb;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AACA;EACI;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;;AAEJ;EACI;EACA;;AAIR;EAAa;;AACb;EACI;;AACA;EAAoB;;AACpB;EAAY;;AAEhB;AAAA;AAAA;EAE2B;;AAC3B;AAAA;AAAA;EAEoC;;AAEpC;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACI;EACA;EACA;;AACA;EAAY;;AAEhB;EAAsB","file":"AnP.css"} \ No newline at end of file diff --git a/Public/scss/_icons.scss b/Public/scss/_icons.scss index fd3b919..038c6c1 100644 --- a/Public/scss/_icons.scss +++ b/Public/scss/_icons.scss @@ -10,6 +10,7 @@ } [data-icon=home]::before{content : unicode("f015");} [data-icon=git]::before{content : unicode("f841"); font-family : $FA6FB;} + [data-icon=ai]::before{content : unicode("f27a"); font-family : $FA6FR;} [data-icon=user]::before{content : unicode("f007");} [data-icon=ip]::before{content : "IP"; font-weight : 900; font-family : $font-normal;} [data-icon=login]::before{content : unicode("f090");} @@ -31,8 +32,8 @@ [data-icon=waiting]::before{content : unicode("f252");} [data-ok=true] [data-icon=ok]::before{content : unicode("f00c");} [data-ok=false] [data-icon=ok]::before{content : unicode("f00d");} - [data-done=true] [data-icon=done]::before{content : unicode("f058"); font-family : $FA6FR;} - [data-done=false] [data-icon=done]::before{content : unicode("f071");} + [data-done=true] [data-icon=done]::before{content : unicode("f058");} + [data-done=false] [data-icon=done]::before{content : unicode("f057"); font-family : $FA6FR;} [data-icon=date_from]::before{content : unicode("f783");} [data-icon=date_to]::before{content : unicode("f1da");} [data-icon=time]::before{content : unicode("f017"); font-family : $FA6FR;} diff --git a/Python/Abstracts/__init__py b/Python/Abstracts/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Application/__init__py b/Python/Application/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Controllers/__init__py b/Python/Controllers/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Drivers/__init__py b/Python/Drivers/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Interfaces/Abstracts/__init__py b/Python/Interfaces/Abstracts/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Interfaces/Application/__init__py b/Python/Interfaces/Application/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Interfaces/Managers/__init__py b/Python/Interfaces/Managers/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Interfaces/__init__py b/Python/Interfaces/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Managers/ControllersManager.py b/Python/Managers/ControllersManager.py index adec076..fd6616e 100644 --- a/Python/Managers/ControllersManager.py +++ b/Python/Managers/ControllersManager.py @@ -36,7 +36,7 @@ class ControllersManager: for subinputs in self.anp.files.load_json(inputs, True): for key, controller in subinputs.items(): - if Common.is_mark_key(key) and controller is None: + if Check.is_mark_key(key) and controller is None: continue ControllerClass:type[ControllerAbstract]|None diff --git a/Python/Managers/DispatchesManager.py b/Python/Managers/DispatchesManager.py index 78fad7f..773a2e7 100644 --- a/Python/Managers/DispatchesManager.py +++ b/Python/Managers/DispatchesManager.py @@ -35,7 +35,7 @@ class DispatchesManager: for subinputs in self.anp.files.load_json(inputs, True): for key, dispatch in subinputs.items(): - if Common.is_mark_key(key) and dispatch is None: + if Check.is_mark_key(key) and dispatch is None: continue DispatchClass:type[DispatchAbstract]|None diff --git a/Python/Managers/I18NManager.py b/Python/Managers/I18NManager.py index 09a7003..d7d8caa 100644 --- a/Python/Managers/I18NManager.py +++ b/Python/Managers/I18NManager.py @@ -93,7 +93,7 @@ class I18NManager: if language not in self.__sentences: self.__sentences[language] = {} for key, sentence in sentences.items(): - if Common.is_mark_key(key) and sentence is None: + if Check.is_mark_key(key) and sentence is None: continue if overwrite or key not in self.__sentences[language]: self.__sentences[language][key] = sentence \ No newline at end of file diff --git a/Python/Managers/ModelsManager.py b/Python/Managers/ModelsManager.py index 5d9c954..29a8bad 100644 --- a/Python/Managers/ModelsManager.py +++ b/Python/Managers/ModelsManager.py @@ -5,6 +5,7 @@ from typing import Self, Any, Sequence, TypeVar from Interfaces.Application.AnPInterface import AnPInterface from Abstracts.ModelAbstract import ModelAbstract from Utils.Common import Common +from Utils.Checks import Check T = TypeVar("T", bound = ModelAbstract) @@ -48,7 +49,7 @@ class ModelsManager: for subinputs in self.anp.files.load_json(inputs, True): for key, model in subinputs.items(): - if Common.is_mark_key(key) and model is None: + if Check.is_mark_key(key) and model is None: continue if issubclass(model, ModelAbstract) and ( overwrite or key not in self.__models diff --git a/Python/Managers/SettingsManager.py b/Python/Managers/SettingsManager.py index 8e07215..c20334f 100644 --- a/Python/Managers/SettingsManager.py +++ b/Python/Managers/SettingsManager.py @@ -4,6 +4,7 @@ from typing import Any, Optional, Self, Sequence from Interfaces.Application.AnPInterface import AnPInterface from Utils.Common import Common +from Utils.Checks import Check class SettingsManager: @@ -58,7 +59,7 @@ class SettingsManager: value:Any|None for key, value in subinputs.items(): - if Common.is_mark_key(key) and value is None: + if Check.is_mark_key(key) and value is None: continue if overwrite or key not in self.__settings: self.__settings[key] = value @@ -73,7 +74,7 @@ class SettingsManager: value:Any|None for key, value in subinputs.items(): - if Common.is_mark_key(key) and value is None: + if Check.is_mark_key(key) and value is None: continue if overwrite or key not in self.__secrets: self.__secrets[key] = value \ No newline at end of file diff --git a/Python/Managers/__init__py b/Python/Managers/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Models/__init__py b/Python/Models/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/Utils/Checks.py b/Python/Utils/Checks.py index 598ca64..49b7325 100644 --- a/Python/Utils/Checks.py +++ b/Python/Utils/Checks.py @@ -1,8 +1,9 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -from typing import Any, Self +from typing import Any, Self, Sequence from re import Pattern as REPattern +from os.path import isfile as is_file from json import loads as json_decode from Utils.Patterns import RE @@ -66,4 +67,21 @@ class Check: return True if Check.is_string(item): return Check.is_json_string(item, full) - return False \ No newline at end of file + return False + + @classmethod + def is_mark_key(cls:type[Self], key:str, marks:str|Sequence[str] = "AnP") -> bool: + + mark:str + + for mark in cls.get_keys(marks): + if key.startswith(mark + "_") and ( + key.endswith("_start") or + key.endswith("_end") + ): + return True + return False + + @staticmethod + def is_file(path:str) -> bool: + return is_file(path) \ No newline at end of file diff --git a/Python/Utils/Common.py b/Python/Utils/Common.py index d205f7e..d0e6211 100644 --- a/Python/Utils/Common.py +++ b/Python/Utils/Common.py @@ -3,7 +3,7 @@ from typing import Any, Callable, Optional, Sequence, Self from re import Match as REMatch -from os.path import abspath as absolute_path, dirname as directory_name, exists as path_exists, isfile as is_file +from os.path import abspath as absolute_path, dirname as directory_name, exists as path_exists from json import loads as json_decode from io import FileIO from mimetypes import guess_type as get_mime_by_extension @@ -264,23 +264,6 @@ class Common: # return "font/ttf" return get_mime_by_extension(path)[0] - @classmethod - def is_mark_key(cls:type[Self], key:str, marks:str|Sequence[str] = "AnP") -> bool: - - mark:str - - for mark in cls.get_keys(marks): - if key.startswith(mark + "_") and ( - key.endswith("_start") or - key.endswith("_end") - ): - return True - return False - - @staticmethod - def is_file(path:str) -> bool: - return is_file(path) - @staticmethod def json_encode(data:dict[str, Any|None]|Sequence[Any|None]) -> str|None: try: diff --git a/Python/Utils/__init__py b/Python/Utils/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/__init__py b/Python/__init__py new file mode 100644 index 0000000..e69de29 diff --git a/Python/map.anp.py b/Python/map.anp.py new file mode 100644 index 0000000..4b52553 --- /dev/null +++ b/Python/map.anp.py @@ -0,0 +1,312 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +from abc import ABC, abstractmethod +from typing import Any, Callable, Self, Sequence, Optional, ClassVar +from re import Pattern as REPattern +from threading import Thread + +class RE: + + KEY:ClassVar[REPattern] + STRING_VARIABLES:ClassVar[REPattern] + SLASHES:ClassVar[REPattern] + NEW_LINES:ClassVar[REPattern] + ROUTE:ClassVar[REPattern] + TO_REGULAR_EXPRESSION:ClassVar[REPattern] + ROUTE_KEY:ClassVar[REPattern] + EXCEPTION:ClassVar[REPattern] + NEW_LINE:ClassVar[REPattern] + HTTP_VARIABLE:ClassVar[REPattern] + PARENT_PATH:ClassVar[REPattern] + DOUBLE_NEW_LINE:ClassVar[REPattern] + HTTP_HEADER_PARAMETER:ClassVar[REPattern] + HTTP_REQUEST:ClassVar[REPattern] + +class Check(ABC): + + @staticmethod + @abstractmethod + def is_string(item:Any|None) -> bool:pass + + @staticmethod + @abstractmethod + def is_binary(item:Any|None) -> bool:pass + + @classmethod + @abstractmethod + def is_key(cls:type[Self], item:Any|None) -> bool:pass + + @staticmethod + @abstractmethod + def is_array(item:Any|None) -> bool:pass + + @staticmethod + @abstractmethod + def is_dictionary(item:Any|None) -> bool:pass + + @staticmethod + @abstractmethod + def is_boolean(item:Any|None) -> bool:pass + + @staticmethod + @abstractmethod + def is_integer(item:Any|None) -> bool:pass + + @staticmethod + @abstractmethod + def is_function(item:Any|None) -> bool:pass + + @staticmethod + @abstractmethod + def is_regular_expression(item:Any|None) -> bool:pass + + @staticmethod + @abstractmethod + def is_json_string(item:Any|None, full:bool = False) -> bool:pass + + @staticmethod + @abstractmethod + def is_json(item:Any|None) -> bool:pass + + @staticmethod + @abstractmethod + def is_json_data(item:Any|None, full:bool = False) -> bool:pass + + @classmethod + @abstractmethod + def is_mark_key(cls:type[Self], key:str, marks:str|Sequence[str] = "AnP") -> bool:pass + + @staticmethod + @abstractmethod + def is_file(path:str) -> bool:pass + +class Common(ABC): + + ROOT_PATH:ClassVar[str] + SLASH:ClassVar[str] + ROOTS_PATH:ClassVar[list[str]] + SPECIAL_REGULAR_EXPRESSION_CHARACTERS:ClassVar[dict[str, str]] + + @classmethod + @abstractmethod + def get_keys(cls:type[Self], *items:list[Any|None]) -> list[str]:pass + + @classmethod + @abstractmethod + def get_texts(cls:type[Self], *items:list[Any|None]) -> list[str]:pass + + @classmethod + @abstractmethod + def get_dictionaries(cls:type[Self], *items:list[Any|None]) -> list[dict[str, Any|None]]:pass + + @classmethod + @abstractmethod + def get_dictionary(cls:type[Self], inputs:Any|None, overwrite:bool = False) -> dict[str, Any|None]:pass + + @classmethod + @abstractmethod + def get_value(cls:type[Self], + keys:str|Sequence[str], + inputs:dict[str, Any|None]|Sequence[Any|None], + default:Optional[Any|None] = None + ) -> Any|None:pass + + @classmethod + @abstractmethod + def string_variables(cls:type[Self], + string:str, + inputs:dict[str, Any|None]|Sequence[Any|None], + default:Optional[str] = None + ) -> str:pass + + @classmethod + @abstractmethod + def fix_path(cls:type[Self], path:str) -> str:pass + + @classmethod + @abstractmethod + def get_absolute_path(cls:type[Self], path:str) -> str|None:pass + + @classmethod + @abstractmethod + def load_file(cls:type[Self], path:str, mode:str = "r") -> str|bytes|None:pass + + @classmethod + @abstractmethod + def load_json(cls:type[Self], + data:str|dict[str, Any|None]|Sequence[Any|None], + only_dictionaries:bool = True + ) -> list[dict[str, Any|None]|Sequence[Any|None]]:pass + + @staticmethod + @abstractmethod + def get_action_data(i:int = 0) -> dict[str, str|int]:pass + + @classmethod + @abstractmethod + def to_regular_expression(cls:type[Self], string:str) -> str:pass + + @staticmethod + @abstractmethod + def get_mime_from_path(path:str) -> str|None:pass + + @staticmethod + @abstractmethod + def json_encode(data:dict[str, Any|None]|Sequence[Any|None]) -> str|None:pass + + @staticmethod + @abstractmethod + def json_decode(data:str|bytes) -> dict[str, Any|None]|Sequence[Any|None]|None:pass + + @staticmethod + @abstractmethod + def base64_encode(data:bytes) -> str|None:pass + + @staticmethod + @abstractmethod + def base64_decode(data:str) -> bytes|None:pass + + @classmethod + @abstractmethod + def data_encode(cls:type[Self], data:Any|None) -> str|None:pass + + @classmethod + @abstractmethod + def data_decode(cls:type[Self], data:str) -> Any|None:pass + + @staticmethod + @abstractmethod + def execute(callback:Callable[..., Any|None], *arguments:Any|None) -> Any|None:pass + + @staticmethod + @abstractmethod + def unique(items:str|Sequence[Any|None]) -> str|list[Any|None]:pass + + @staticmethod + @abstractmethod + def random(items:str|Sequence[Any|None]) -> Any|None:pass + +class AIResponseModel(ABC): + + def __init__(self:Self, conversation:str) -> None: + self.conversation:str + self.start:float + self.model:str + self.response:str + self.total:str + self.context:str|list[str] + self.done:bool + self.end:float|None + self.chunks:int + self.ok:bool + self.http_code:int + self.http_message:str + + @abstractmethod + def update(self:Self, data:dict[str, Any|None]) -> None:pass + +class CommandModel(ABC): + + def __init__(self:Self, + names:str|Sequence[str], + callback:Callable[[dict[str, Any|None], Optional[list[Any|None]]], None] + ) -> None: + self.names:list[str] + self.callback:Callable[[dict[str, Any|None], Optional[list[Any|None]]], None] + + @abstractmethod + def update(self:Self, + names:str|Sequence[str], + callback:Optional[Callable[[dict[str, Any|None], Optional[list[Any|None]]], None]] = None, + overwrite:bool = False + ) -> None:pass + +class PseudoLoRAModel(ABC): + + def __init__(self:Self, + title:str, + content:str|Sequence[Any|None], + keys:Optional[str|Sequence[str]] = None, + cacheable:bool = False + ) -> None: + self.title:str + self.path:str|None + self.memory:int + self.cache:str + self.i:int + self.keys:list[str] + self.cacheable:bool + self.nested:list[PseudoLoRAModel] + + @abstractmethod + def clean_cache(self:Self) -> None:pass + +class QueueItemModel(ABC): + def __init__(self:Self, i:int, callback:Callable[[Callable[[], None]], None], *arguments:list[Any|None]) -> None: + self.i:int + self.callback:Callable[[Callable[[], None]], None] + self.arguments:list[Any|None] + self.executing:bool + self.thread:Thread|None + +class QueuesModel(ABC): + + def __init__(self:Self, key:str, inputs:Optional[int|dict[str, Any|None]|Sequence[Any|None]] = None) -> None: + self.key:str + self.items:dict[int, QueueItemModel] + self.i:int + self.p:int + self.maximum:int + self.current:int + + @abstractmethod + def add(self:Self, callback:Callable[[Callable[[], None]], None], *arguments:list[Any|None]) -> int|None:pass + + @abstractmethod + def cancel(self:Self, i:int) -> bool:pass + + @abstractmethod + def cancel_all(self:Self) -> None:pass + + @abstractmethod + def next(self:Self) -> None:pass + +class RequestModel(ABC): + + def __init__(self:Self, session:Optional[SessionModel] = None) -> None: + self.post_variables:dict[str, Any|None] + self.get_variables:dict[str, Any|None] + self.url_variables:dict[str, Any|None] + self.hash_variables:dict[str, Any|None] + self.cookies:dict[str, Any|None] + self.variables:dict[str, Any|None] + self.request_headers:dict[str, Any|None] + self.method:str|None + self.route:RouteAbstract|None + self.response:str|bytes|None + self.response_mime:str|None + self.response_charset:str|None + self.response_code:int + self.response_headers:dict[str, Any|None] + self.callback:Callable[[RequestModel, str|bytes|None], None]|None + self.data:Any|None + self.session:SessionModel|None + self.protocol:str|None + self.protocol_version:str|None + self.last_modified:str|None + + @abstractmethod + def get(self:Self, key:str|Sequence[str], default:Optional[Any] = None) -> Any|None:pass + + @abstractmethod + def set_variables(self:Self, inputs:dict[str, Any|None], on:Optional[str] = None) -> None:pass + + @abstractmethod + def set_response(self:Self, data:Any|None) -> None:pass + + @abstractmethod + def set_request_headers(self:Self, inputs:Any|None) -> None:pass + + @abstractmethod + def set_response_headers(self:Self, inputs:Any|None) -> None:pass \ No newline at end of file