@andrewcaires/api 5.7.0 → 5.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +2 -2
- package/dist/index.d.ts +2 -1
- package/dist/index.esm.js +2 -2
- package/package.json +3 -3
package/dist/index.esm.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* @andrewcaires/api v5.7.
|
|
2
|
+
* @andrewcaires/api v5.7.1
|
|
3
3
|
* Simple api for small applications using express, jsonwebtoken, sequelize and websocket
|
|
4
4
|
* (c) 2026 Andrew Caires
|
|
5
5
|
* @license: MIT
|
|
6
6
|
*/
|
|
7
|
-
import{Use as e,HttpUnauthorizedError as t,parameterFactory as i,HttpError as r,Context as n,HttpInternalServerError as s,HttpValidationError as o,HttpStatusCodeByName as d,HttpBadRequestError as a,HttpNotFoundError as l,Application as u,Get as c,Ctx as p,Params as h,Controller as g,Post as v,ValidateBody as y,Body as m,App as f,Middleware as E,Delete as w,Put as S,All as O,Options as _,Upload as A,HttpConflictError as b,HttpForbiddenError as T}from"@andrewcaires/express";import{isUndefined as P,isFunction as I,slugify as C,includesArray as x,isPlainObject as R,isString as j,isNumber as M,uuidv7 as D,isArray as k,isValidationShape as N,Validation as H,getConstructor as F,noop as L,uniqueArray as K,isNull as q,uniqueID as B,createApiKey as U,clamp as V,merge as $,clone as W,upperCamelCase as G,forEachAsync as z,sleep as Y,forEachSeries as J,EventEmitter as X,isDef as Q}from"@andrewcaires/utils.js";import{WebSocketServer as Z}from"ws";import{Sequelize as ee,Hooks as te,Column as ie,Association as re,Database as ne,ModelName as se,Version as oe,Model as de,DefaultValue as ae,Index as le,Op as ue,Where as ce}from"@andrewcaires/sequelize";import{Env as pe,Log as he,LogColor as ge,Encryptor as ve,sha256 as ye}from"@andrewcaires/node";import{config as me}from"dotenv";import{metadata as fe,isClassMethodDecoratorContext as Ee,Trait as we,Singleton as Se}from"@andrewcaires/decorator";import{Store as Oe}from"express-session";import _e from"jsonwebtoken";import{createHmac as Ae,timingSafeEqual as be}from"node:crypto";import{verify as Te,hashSync as Pe}from"@node-rs/argon2";import{existsSync as Ie,statSync as Ce,readdirSync as xe,mkdirSync as Re,lstatSync as je,rmSync as Me}from"node:fs";import{join as De}from"node:path";function ke(e,t,i,r){var n,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(o=(s<3?n(o):s>3?n(t,i,o):n(t,i))||o);return s>3&&o&&Object.defineProperty(t,i,o),o}function Ne(e,t){return function(i,r){t(i,r,e)}}function He(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function Fe(e,t,i,r){return new(i||(i=Promise))(function(n,s){function o(e){try{a(r.next(e))}catch(e){s(e)}}function d(e){try{a(r.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(o,d)}a((r=r.apply(e,t||[])).next())})}var Le;"function"==typeof SuppressedError&&SuppressedError,me({quiet:!0});class Env extends pe{}Le=Env,Env.AUDIT_IGNORE=Le.getString("AUDIT_IGNORE","hash,password").split(","),Env.BASE_NAME=Le.getString("BASE_NAME",""),Env.CONSOLE_ERROR=Le.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=Le.getString("DATABASE_URI","",!0),Env.DATABASE_LOG=Le.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=Le.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=Le.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=Le.getString("DATABASE_TIMEZONE","+00:00"),Env.ENCRYPTION_SECRET=Le.getString("ENCRYPTION_SECRET",""),Env.HTTP_CROSS=Le.getString("HTTP_CROSS",""),Env.HTTP_HYBRID=Le.getBool("HTTP_HYBRID",!1),Env.HTTP_NOTFOUND=Le.getString("HTTP_NOTFOUND",""),Env.HTTP_PATH=Le.getString("HTTP_PATH","/api"),Env.HTTP_PORT=Le.getInt("HTTP_PORT",Le.getInt("PORT",3e3)),Env.HTTP_PUBLIC=Le.getString("HTTP_PUBLIC",""),Env.HTTP_REDIRECT=Le.getString("HTTP_REDIRECT",""),Env.HTTP_TLS_CA=Le.getFile("HTTP_TLS_CA"),Env.HTTP_TLS_CRT=Le.getFile("HTTP_TLS_CRT"),Env.HTTP_TLS_KEY=Le.getFile("HTTP_TLS_KEY"),Env.MODEL_LIMIT=Le.getInt("MODEL_LIMIT",10),Env.MODEL_LIMIT_MAX=Le.getInt("MODEL_LIMIT_MAX",100),Env.MCP_SESSION_TTL=Le.getMs("MCP_SESSION_TTL","30m"),Env.PASSWORD_ALGORITHM=Le.getInt("PASSWORD_ALGORITHM",2),Env.PASSWORD_MEMORY_COST=Le.getInt("PASSWORD_MEMORY_COST",4096),Env.PASSWORD_PARALLELISM=Le.getInt("PASSWORD_PARALLELISM",1),Env.PASSWORD_PEPPER=Le.getString("PASSWORD_PEPPER",""),Env.PASSWORD_REUSE=Le.getBool("PASSWORD_REUSE",!0),Env.PASSWORD_TIME_COST=Le.getInt("PASSWORD_TIME_COST",3),Env.SLEEP_AUTH=Le.getMs("SLEEP_AUTH","2s"),Env.SLEEP_FORGOT=Le.getMs("SLEEP_FORGOT","5s"),Env.SLEEP_REGISTRY=Le.getMs("SLEEP_REGISTRY","5s"),Env.TENANT_HEADER=Le.getString("TENANT_HEADER","X-Tenant-ID").toLowerCase(),Env.TOKEN_COOKIE=Le.getString("TOKEN_COOKIE",Le.getString("TOKEN_HEADER","Authorization")).toLowerCase(),Env.TOKEN_COOKIE_SET=Le.getBool("TOKEN_COOKIE_SET",!0),Env.TOKEN_HEADER=Le.getString("TOKEN_HEADER","authorization"),Env.TOKEN_PEPPER=Le.getString("TOKEN_PEPPER",""),Env.TOKEN_PREFIX=Le.getString("TOKEN_PREFIX","api"),Env.TOKEN_SECRET=Le.getString("TOKEN_SECRET",""),Env.TOKEN_TTL=Le.getMs("TOKEN_TTL","1d"),Env.TOKEN_TTL_FORGOT=Le.getMs("TOKEN_TTL_FORGOT","1d"),Env.TOKEN_TTL_RENEW=Le.getMs("TOKEN_TTL_RENEW","1d"),Env.TOKEN_TYPE=Le.getString("TOKEN_TYPE","bearer"),Env.API_BODYPARSER_STRICT=Le.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=Le.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=Le.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=Le.getString("API_BODYPARSER_TYPE","json"),Env.API_SESSION_NAME=Le.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=Le.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=Le.getString("API_SESSION_SECRET","yoursecret"),Env.API_WEBSOCKET_START=Le.getBool("API_WEBSOCKET_START",!1);const Ke=new ee({uri:Env.DATABASE_URI,logging:Env.DATABASE_LOG,prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE});var qe,Be,Ue,Ve,$e,We;!function(e){e.CREATE="CREATE",e.DELETE="DELETE",e.UPDATE="UPDATE"}(qe||(qe={})),function(e){e.SYSTEM="system",e.TENANT="tenant"}(Be||(Be={})),function(e){e.INFO="info",e.WARN="warn",e.ERROR="error"}(Ue||(Ue={})),function(e){e.PAGE="page",e.GROUP="group",e.DIVIDER="divider",e.HIDDEN="hidden",e.EXTERNAL="external"}(Ve||(Ve={})),function(e){e.ACTIVE="active",e.PENDING="pending",e.SUSPENDED="suspended",e.DISABLED="disabled",e.ARCHIVED="archived"}($e||($e={})),function(e){e.ACTIVE="active",e.PENDING="pending",e.DISABLED="disabled",e.LOCKED="locked",e.ARCHIVED="archived"}(We||(We={}));const Ge=i=>r=>(n,s,o)=>{e(e=>Fe(void 0,void 0,void 0,function*(){var n;const s=P(r)?I(e.controller.name)?e.controller.name():null===(n=e.controller.constructor)||void 0===n?void 0:n.name:r,{permissions:o=[]}=e.req;if(!o.includes(C(`${s}.${i}`,".")))throw new t("Access denied");e.next()}))(n,s,o)},ze=Ge("create"),Ye=Ge("delete"),Je=Ge("read"),Xe=Ge("update"),Qe=(...i)=>(r,n,s)=>{e(e=>Fe(void 0,void 0,void 0,function*(){const{groups:r=[]}=e.req;if(x(i,r))return e.next();throw new t("Access denied")}))(r,n,s)},Ze=(...i)=>(r,n,s)=>{e(e=>Fe(void 0,void 0,void 0,function*(){const{permissions:r=[]}=e.req;if(x(i,r))return e.next();throw new t("Access denied")}))(r,n,s)},et=i=>(r,n,s)=>{e(e=>Fe(void 0,void 0,void 0,function*(){var r;const n=I(e.controller.name)?e.controller.name():null===(r=e.controller.constructor)||void 0===r?void 0:r.name,{permissions:s=[]}=e.req;if(s.includes(`${n}.${i}`))return e.next();throw new t("Access denied")}))(r,n,s)},tt=()=>(t,i,r)=>{e(e=>Fe(void 0,void 0,void 0,function*(){if(e.req.access&&e.req.user)return e.next();const{authService:t}=e.app;yield t.apiAuth(e),e.next()}))(t,i,r)},it=i(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.access}),rt=i(({ctx:e,key:t})=>{var i,r;return(null!==(r=null===(i=e.req)||void 0===i?void 0:i.groups)&&void 0!==r?r:[]).includes(t)}),nt=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==i?i:[]}),st=i(({ctx:e,key:t})=>{var i,r;return(null!==(r=null===(i=e.req)||void 0===i?void 0:i.permissions)&&void 0!==r?r:[]).includes(t)}),ot=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==i?i:[]}),dt=i(({ctx:e})=>{var t;return null!==(t=e.getHeader(Env.TENANT_HEADER))&&void 0!==t?t:null}),at=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.tenants)&&void 0!==i?i:[]}),lt=i(({ctx:e,key:t})=>{var i;return t&&e.req.user&&t in e.req.user?e.req.user[t]:null===(i=e.req)||void 0===i?void 0:i.user}),ut={ParseError:-32700,InvalidRequest:-32600,MethodNotFound:-32601,InvalidParams:-32602,InternalError:-32603,ServerError:-32e3,InvalidSession:-32001};class McpError extends r{constructor(e,t=ut.ServerError,i=200,r){super(e,i),this.code=t,this.data=r,this.name=this.constructor.name}}class McpParseError extends McpError{constructor(e="Parse error",t){super(e,ut.ParseError,400,t)}}class McpInvalidRequestError extends McpError{constructor(e="Invalid Request",t){super(e,ut.InvalidRequest,400,t)}}class McpMethodNotFoundError extends McpError{constructor(e){super(`Method not found: ${e}`,ut.MethodNotFound,200)}}class McpInvalidParamsError extends McpError{constructor(e="Invalid params",t){super(e,ut.InvalidParams,200,t)}}class McpInternalError extends McpError{constructor(e="Internal error",t){super(e,ut.InternalError,200,t)}}class McpServerError extends McpError{constructor(e="Server error",t){super(e,ut.ServerError,500,t)}}class McpInvalidSessionError extends McpError{constructor(e="Invalid MCP session",t=404){super(e,ut.InvalidSession,t)}}class McpToolNotFoundError extends McpError{constructor(e){super("Tool not found",ut.InvalidParams,200,{toolName:e})}}const ct=e=>j(e)||M(e),pt=(e,t)=>({jsonrpc:"2.0",id:e,result:t}),ht=(e,t)=>({jsonrpc:"2.0",id:e,error:Object.assign({code:t.code,message:t.message},void 0!==t.data?{data:t.data}:{})}),gt=(e,t,i,r)=>({jsonrpc:"2.0",id:e,error:Object.assign({code:t,message:i},void 0!==r?{data:r}:{})}),vt=e=>{if(!R(e))throw new McpInvalidRequestError("Invalid Request");if("2.0"!==e.jsonrpc)throw new McpInvalidRequestError("Invalid JSON-RPC version");if(!j(e.method))throw new McpInvalidRequestError("Invalid method");if(void 0!==e.id&&!ct(e.id))throw new McpInvalidRequestError("Invalid id");return e},yt=["2025-11-25","2025-06-18"],mt=yt[0],ft="MCP-Protocol-Version",Et="MCP-Session-Id",wt=["POST","DELETE","OPTIONS"],St=wt.join(", "),Ot=["Content-Type","Accept",Et,ft],_t=e=>{if(!(e instanceof SyntaxError))return!1;const t=e;return"entity.parse.failed"===t.type||400===t.status||400===t.statusCode},At=e=>{if(_t(e))return{status:400,body:ht(null,new McpParseError("Parse error",{message:e.message}))}};class McpHttpHandler{constructor(e){var t,i,r;this.sessions=e.sessions,this.tools=e.tools,this.logger=e.logger,this.serverName=null!==(t=e.serverName)&&void 0!==t?t:"andrewcaires-api-mcp",this.serverVersion=null!==(i=e.serverVersion)&&void 0!==i?i:"1.0.0",this.allowedHeaders=this.normalizeAllowedHeaders(e.allowedHeaders).join(", "),this.allowedOrigins=(null===(r=e.allowedOrigins)||void 0===r?void 0:r.length)?e.allowedOrigins:["*"]}post(e){return Fe(this,void 0,void 0,function*(){var t;let i=null;try{const r=vt(this.getBody(e));if(i=null!==(t=r.id)&&void 0!==t?t:null,"initialize"===r.method)return this.withTransportHeaders(this.initialize(r.id,r.params,e),e);if("notifications/initialized"===r.method)return this.withTransportHeaders(this.initialized(r.id,r.params,e),e);if("ping"===r.method)return this.validateObjectParams(r.params),this.withTransportHeaders(this.withSession(r.id,e,e=>({status:200,body:pt(e,{})})),e);if("tools/list"===r.method)return this.validateObjectParams(r.params),this.withTransportHeaders(this.withInitializedSession(r.id,e,e=>({status:200,body:pt(e,{tools:this.tools.list()})})),e);if("tools/call"===r.method)return this.withTransportHeaders(yield this.callTool(r.id,r.params,e),e);if(void 0===r.id)return this.withTransportHeaders({status:202},e);throw new McpMethodNotFoundError(r.method)}catch(t){return this.withTransportHeaders(this.errorResponse(i,t),e)}})}delete(e){const t=this.getHeader(e,Et);if(!t)return this.withTransportHeaders(this.errorResponse(null,new McpInvalidSessionError(`${Et} header is required`,400)),e);return this.sessions.get(t)?(this.sessions.delete(t),this.withTransportHeaders({status:204},e)):this.withTransportHeaders(this.errorResponse(null,new McpInvalidSessionError),e)}get(e){return this.withTransportHeaders({status:405},e)}options(e){return this.withTransportHeaders({status:204},e)}initialize(e,t,i){const r=this.requireRequestId({jsonrpc:"2.0",id:e,method:"initialize",params:t}),n=this.negotiateProtocolVersion(t),s=this.sessions.create(n);return Object.assign(s,this.getAuthContext(i)),{status:200,headers:{[Et]:s.sessionId,[ft]:s.protocolVersion},body:pt(r,{protocolVersion:s.protocolVersion,capabilities:{tools:{listChanged:!1}},serverInfo:{name:this.serverName,version:this.serverVersion}})}}initialized(e,t,i){if(void 0!==e)throw new McpInvalidRequestError("notifications/initialized must not include id");this.validateObjectParams(t);const r=this.requireSession(i);return this.sessions.markInitialized(r.sessionId),{status:202}}callTool(e,t,i){return Fe(this,void 0,void 0,function*(){return this.withInitializedSession(e,i,(e,i)=>Fe(this,void 0,void 0,function*(){var r;const n=this.parseToolCallParams(t),s=Date.now();let o,d=!1;try{const t=yield this.tools.call(n.name,n.arguments,i);return d=!t.isError,o=t.isError?"Tool execution failed":void 0,{status:200,body:pt(e,t)}}catch(e){if(e instanceof McpError)throw o=e.message,e;throw o="Internal error",e}finally{null===(r=this.logger)||void 0===r||r.toolCall(Object.assign({sessionId:i.sessionId,toolName:n.name,durationMs:Date.now()-s,success:d},o?{error:o}:{}))}}))})}requireRequestId(e){if(!ct(e.id))throw new McpInvalidRequestError("Request id is required");return e.id}withSession(e,t,i){const r=this.requireRequestId({jsonrpc:"2.0",id:e,method:"session"}),n=this.requireSession(t),s=this.getHeader(t,ft);if(s&&s!==n.protocolVersion)throw new McpInvalidRequestError(`${ft} does not match the initialized session`);return i(r,n)}withInitializedSession(e,t,i){return this.withSession(e,t,(e,t)=>{if(!t.initialized)throw new McpInvalidRequestError("Session not initialized");return i(e,t)})}requireSession(e){const t=this.getHeader(e,Et);if(!t)throw new McpInvalidSessionError(`${Et} header is required`,400);return this.sessions.require(t)}negotiateProtocolVersion(e){if(!R(e)||!j(e.protocolVersion))throw new McpInvalidParamsError("params.protocolVersion is required");return yt.includes(e.protocolVersion)?e.protocolVersion:mt}parseToolCallParams(e){if(!R(e)||!j(e.name))throw new McpInvalidParamsError("params.name is required");return{name:e.name,arguments:e.arguments}}validateObjectParams(e){if(void 0!==e&&!R(e))throw new McpInvalidParamsError("params must be an object")}withTransportHeaders(e,t){var i;const r=this.getAllowedOrigin(t);return Object.assign(Object.assign({},e),{headers:Object.assign(Object.assign(Object.assign(Object.assign({Allow:St},r?{"Access-Control-Allow-Origin":r}:{}),r&&"*"!==r?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":St,"Access-Control-Allow-Headers":this.allowedHeaders}),null!==(i=e.headers)&&void 0!==i?i:{})})}errorResponse(e,t){if(t instanceof McpError)return{status:t.status,body:ht(e,t)};const i=new McpServerError;return{status:i.status,body:ht(e,i)}}getBody(e){return"function"==typeof e.getBody?e.getBody():e.body}getHeader(e,t){var i,r,n;const s=null!==(i=e.req)&&void 0!==i?i:e.request,o=this.getHeaderFromRequest(s,t);if(o)return o;const d=this.getHeaderFromRecord(e.headers,t);if(d)return d;if("function"==typeof e.getHeaders){const i=this.getHeaderFromRecord(e.getHeaders(),t);if(i)return i}return"function"==typeof e.getHeader&&null!==(n=null!==(r=e.getHeader(t))&&void 0!==r?r:e.getHeader(t.toLowerCase()))&&void 0!==n?n:""}getHeaderFromRequest(e,t){if(!e||"object"!=typeof e)return"";const i=e;if("function"==typeof i.get){const e=this.normalizeHeaderValue(i.get(t));if(e)return e}if("function"==typeof i.header){const e=this.normalizeHeaderValue(i.header(t));if(e)return e}return this.getHeaderFromRecord(i.headers,t)}getHeaderFromRecord(e,t){if(!e)return"";const i=t.toLowerCase(),r=Object.keys(e).find(e=>e.toLowerCase()===i),n=r?e[r]:void 0;return this.normalizeHeaderValue(n)}normalizeHeaderValue(e){var t,i,r;return Array.isArray(e)?null!==(i=null===(t=e[0])||void 0===t?void 0:t.toString())&&void 0!==i?i:"":null!==(r=null==e?void 0:e.toString())&&void 0!==r?r:""}normalizeAllowedHeaders(e=[]){const t=["Content-Type","Accept",...e.map(e=>e.toLowerCase()),Et,ft];return t.filter((e,i)=>Boolean(e)&&t.findIndex(t=>t.toLowerCase()===e.toLowerCase())===i)}getAllowedOrigin(e){if(this.allowedOrigins.includes("*"))return"*";if(!e)return;const t=this.getHeader(e,"Origin");return this.allowedOrigins.includes(t)?t:void 0}getAuthContext(e){var t,i,r;const n=null!==(i=null!==(t=e.req)&&void 0!==t?t:e.context)&&void 0!==i?i:{},s=n.user,o="string"==typeof n.userId?n.userId:null===(r=null==s?void 0:s.id)||void 0===r?void 0:r.toString();return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},n.access?{access:n.access}:{}),n.groups?{groups:n.groups}:{}),n.permissions?{permissions:n.permissions}:{}),n.tenants?{tenants:n.tenants}:{}),n.user?{user:n.user}:{}),o?{userId:o}:{})}}class McpSessionStore{constructor(e=18e5,t=()=>Date.now()){this.sessions=new Map,this.ttl=e,this.now=t}create(e){this.cleanup();const t=this.now(),i={sessionId:D(),createdAt:t,expiresAt:t+this.ttl,protocolVersion:e,initialized:!1};return this.sessions.set(i.sessionId,i),i}get(e){this.cleanup();const t=this.sessions.get(e);if(t){if(!this.isExpired(t))return t;this.sessions.delete(e)}}require(e){const t=this.get(e);if(!t)throw new McpInvalidSessionError;return t}markInitialized(e){const t=this.require(e);return t.initialized=!0,t}delete(e){return this.cleanup(),this.sessions.delete(e)}cleanup(){const e=this.now();for(const[t,i]of this.sessions)i.expiresAt<=e&&this.sessions.delete(t)}size(){return this.cleanup(),this.sessions.size}isExpired(e){return e.expiresAt<=this.now()}}const bt=Symbol.for("@andrewcaires/api:mcp:tool"),Tt=e=>{if(!j(e.name)||!e.name.trim())throw new Error("MCP tool name is required");if(!j(e.title)||!e.title.trim())throw new Error(`MCP tool "${e.name}" title is required`);if(!j(e.description)||!e.description.trim())throw new Error(`MCP tool "${e.name}" description is required`);if(P(e.input))throw new Error(`MCP tool "${e.name}" input must be declared`)},Pt=e=>{const t=fe(bt,e,[]);return t.length||"function"==typeof e?t:fe(bt,Object.getPrototypeOf(e),[])},It=e=>{const t=[];for(const i of e)for(const e of Pt(i))t.push(Ct(i,e));return t},Ct=(e,t)=>{const i=e[t.propertyKey];if(!I(i))throw new Error(`MCP tool "${t.name}" handler was not found`);return Tt(t),Object.assign(Object.assign(Object.assign({name:t.name,title:t.title,description:t.description},void 0!==t.input?{input:t.input}:{}),void 0!==t.output?{output:t.output}:{}),{run:(t,r)=>i.call(e,t,r)})};class McpToolRegistry{constructor(e=[]){this.tools=new Map,e.forEach(e=>this.register(e))}register(e){var t,i;if(Tt(e),this.tools.has(e.name))throw new Error(`Duplicate MCP tool name: ${e.name}`);const r=this.normalizeMcpValidation(null!==(t=e.input)&&void 0!==t?t:{},"object"),n=e.output?this.normalizeMcpValidation(null!==(i=e.output)&&void 0!==i?i:{},"any"):void 0;this.tools.set(e.name,{inputSchema:this.normalizeSchema(r.schema),inputValidation:r.validation,outputSchema:(null==n?void 0:n.schema)?this.normalizeSchema(n.schema):void 0,outputValidation:null==n?void 0:n.validation,tool:e})}list(){return Array.from(this.tools.values()).map(({tool:e})=>{var t,i,r,n;return Object.assign({name:e.name,title:e.title,description:e.description,inputSchema:null!==(i=null===(t=this.tools.get(e.name))||void 0===t?void 0:t.inputSchema)&&void 0!==i?i:{}},(null===(r=this.tools.get(e.name))||void 0===r?void 0:r.outputSchema)?{outputSchema:null===(n=this.tools.get(e.name))||void 0===n?void 0:n.outputSchema}:{})})}call(e,t,i){return Fe(this,void 0,void 0,function*(){var r;const n=this.tools.get(e);if(!n)throw new McpToolNotFoundError(e);const s=null!=t?t:{};if(!R(s))return this.toolInputValidationError(["arguments must be an object"]);const o=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({session:i},i.access?{access:i.access}:{}),i.groups?{groups:i.groups}:{}),i.permissions?{permissions:i.permissions}:{}),i.tenants?{tenants:i.tenants}:{}),i.user?{user:i.user}:{}),i.userId?{userId:i.userId}:{});let d=s;const a=this.validateAdditionalProperties(n.inputSchema,s);if(a.length)return this.toolInputValidationError(a);if(n.inputValidation){const e=n.inputValidation.validate(s,o);if(e.error)return this.toolInputValidationError([e.error]);d=null!==(r=e.value)&&void 0!==r?r:{}}try{const e=yield n.tool.run(d,o);if(!n.outputValidation&&this.isCallToolResult(e))return e;let t=e;if(n.outputValidation){const i=n.outputValidation.validate(e,o);if(i.error)return this.outputValidationError();t=i.value}return{content:[{type:"text",text:JSON.stringify(t)}],structuredContent:t}}catch(e){return{isError:!0,content:[{type:"text",text:"Tool execution failed."}]}}})}isCallToolResult(e){return R(e)&&k(e.content)}normalizeMcpValidation(e,t="object"){if(N(e)){const t=H.object(e).parse();return{schema:t.toSchema(),validation:t}}const i="object"===t?H.object({}).parse():H.any();return{schema:i.toSchema(),validation:i}}normalizeSchema(e){if(k(e))return e.map(e=>this.normalizeSchema(e));if(!R(e))return e;const t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,this.normalizeSchema(t)]));if(k(t.type)){const e=t.type.filter(e=>"null"!==e);t.type=1===e.length?e[0]:e}return t}outputValidationError(){return{isError:!0,content:[{type:"text",text:"Tool output validation failed."}]}}toolInputValidationError(e){return{isError:!0,content:[{type:"text",text:"Invalid tool arguments."}],structuredContent:{errors:e}}}validateAdditionalProperties(e,t){if("object"!==e.type||!1!==e.additionalProperties||!R(e.properties))return[];const i=Object.keys(e.properties);return Object.keys(t).filter(e=>!i.includes(e)).map(e=>`additional property "${e}" is not allowed`)}}const xt=e=>(Tt(e),(t,i)=>{Ee(i)?i.addInitializer(function(){Rt(this.constructor,i.name,e)}):Rt(t,i,e)}),Rt=(e,t,i)=>{const r=fe(bt,e,[]),n=Object.assign(Object.assign({},i),{propertyKey:t});r.some(e=>e.propertyKey===n.propertyKey&&e.name===n.name)||r.push(n)},jt=(e,t,i)=>{var r,s,o,d,a,l,u,c,p,h,g;const v=i.ctx instanceof n?i.ctx:null,y=null!==(r=null==v?void 0:v.id)&&void 0!==r?r:null,m=null!==(a=null!==(d=null===(o=null===(s=null==v?void 0:v.req)||void 0===s?void 0:s.user)||void 0===o?void 0:o.id)&&void 0!==d?d:i.user_id)&&void 0!==a?a:null,f={type:e,model:null!==(l=null==t?void 0:t.getTableName())&&void 0!==l?l:null,source:null!==(u=Env.BASE_NAME)&&void 0!==u?u:"",request_id:y,user_id:m};return v?Object.assign(Object.assign({},f),{full_url:null!==(c=v.getUrl())&&void 0!==c?c:"",ip_address:null!==(p=v.getIp())&&void 0!==p?p:"",user_agent:null!==(g=null===(h=v.req)||void 0===h?void 0:h.headers["user-agent"])&&void 0!==g?g:""}):f},Mt=e=>{const t=F(e),i=t.primaryKeyAttribute;return{model:t,record_id:i?e.getDataValue(i):null}},Dt=(e,t)=>Fe(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:i,record_id:r}=Mt(e),n=Object.entries(e.toJSON()),s=Object.fromEntries(n.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield Qt.create(Object.assign(Object.assign({},jt(qe.CREATE,i,t)),{record:r,currently:s})).catch(he.catch)}),kt=(e,t)=>Fe(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:i,record_id:r}=Mt(e),n={},s={},o=e.changed();o&&o.length&&o.filter(e=>!Env.AUDIT_IGNORE.includes(e)).forEach(t=>{n[t]=e.getDataValue(t),s[t]=e.previous(t)}),yield Qt.create(Object.assign(Object.assign({},jt(qe.UPDATE,i,t)),{record:r,currently:n,previously:s})).catch(he.catch)}),Nt=(e,t)=>Fe(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:i,record_id:r}=Mt(e),n=Object.entries(e.toJSON()),s=Object.fromEntries(n.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield Qt.create(Object.assign(Object.assign({},jt(qe.DELETE,i,t)),{record:r,currently:s})).catch(he.catch)}),Ht=e=>(P(e)&&(e=Env.DATABASE_AUDIT),te(e?{afterCreate:Dt,afterUpdate:kt,afterDestroy:Nt}:{}));class WorkerRegistry{static register(e,t){const i=WorkerRegistry.normalizeWorkerName(e);if(!i)throw new Error("Worker name is required.");if(WorkerRegistry.workers.has(i))throw new Error(`Worker "${i}" is already registered.`);WorkerRegistry.workers.set(i,{name:i,handler:t})}static registerClass(e,t){WorkerRegistry.register(e,()=>Fe(this,void 0,void 0,function*(){const e=new t;yield e.handler()}))}static registerMethod(e,t,i){const r=I(t),n=t.constructor;WorkerRegistry.register(e,()=>Fe(this,void 0,void 0,function*(){const e=r?t:new n,s=e[i];if(!I(s))throw new Error(`Worker method "${String(i)}" is not callable.`);yield s.call(e)}))}static start(e){return Fe(this,void 0,void 0,function*(){const t=WorkerRegistry.get(e);yield t.handler()})}static list(){const e=new Set(WorkerRegistry.workers.values());return Array.from(e).map(e=>{var{handler:t}=e,i=function(e,t){var i={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(i[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(i[r[n]]=e[r[n]])}return i}(e,["handler"]);return Object.assign({},i)})}static names(){return WorkerRegistry.list().map(({name:e})=>e).sort()}static get(e){var t;const i=WorkerRegistry.normalizeStartName(e),r=null!==(t=WorkerRegistry.workers.get(i))&&void 0!==t?t:Array.from(WorkerRegistry.workers.values()).find(e=>WorkerRegistry.normalizeStartName(e.name)===i);if(!r)throw new Error(`Worker "${e}" not found. Available workers: ${WorkerRegistry.names().join(", ")}`);return r}static normalizeStartName(e){return C(e,"-")}static normalizeWorkerName(e){return e.trim()}}WorkerRegistry.workers=new Map;const Ft=e=>(t,i,r)=>{if(void 0===i)WorkerRegistry.registerClass(e,t);else{if(!I(null==r?void 0:r.value))throw new Error(`Worker method "${String(i)}" is not callable.`);WorkerRegistry.registerMethod(e,t,i)}};let Lt=class RegisterModel extends de{};ke([ie.Id(7),He("design:type",String)],Lt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Lt.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Number)],Lt.prototype,"expired_at",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Lt.prototype,"active",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Lt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Lt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Lt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],Lt.prototype,"user_id",void 0),Lt=ke([ne(Ke),se("register"),oe("5.6.0")],Lt);let Kt=class UserAuthModel extends de{};ke([ie.Id(7),He("design:type",String)],Kt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Kt.prototype,"hash",void 0),ke([ie.String(),He("design:type",String)],Kt.prototype,"ip_address",void 0),ke([ie.String(),He("design:type",String)],Kt.prototype,"user_agent",void 0),ke([ie.FullDate(),He("design:type",Object)],Kt.prototype,"revoked_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Kt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Kt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Kt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],Kt.prototype,"user_id",void 0),Kt=ke([ne(Ke),se("users_auth"),oe("5.6.0")],Kt);let qt=class PageModel extends de{};ke([ie.Id(7),He("design:type",String)],qt.prototype,"id",void 0),ke([ie.Enum(Ve),ae(Ve.PAGE),He("design:type",String)],qt.prototype,"type",void 0),ke([ie.String(),He("design:type",String)],qt.prototype,"name",void 0),ke([ie.Text(),He("design:type",String)],qt.prototype,"description",void 0),ke([ie.String(),He("design:type",String)],qt.prototype,"icon",void 0),ke([ie.String(),He("design:type",String)],qt.prototype,"path",void 0),ke([ie.Timestamp(),He("design:type",Number)],qt.prototype,"position",void 0),ke([ie.Boolean(),He("design:type",Boolean)],qt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],qt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],qt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],qt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],qt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>qt),He("design:type",String)],qt.prototype,"page_id",void 0),ke([re.HasMany(()=>qt),He("design:type",Array)],qt.prototype,"pages",void 0),ke([re.BelongsTo(()=>Bt),He("design:type",String)],qt.prototype,"permission_id",void 0),qt=ke([ne(Ke),se("page"),Ht(),oe("5.6.0")],qt);let Bt=class PermissionModel extends de{};ke([ie.Id(7),He("design:type",String)],Bt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Bt.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],Bt.prototype,"permission",void 0),ke([ie.Text(),ae(""),He("design:type",String)],Bt.prototype,"description",void 0),ke([ie.Boolean(),ae(!0),He("design:type",Boolean)],Bt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Bt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Bt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Bt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Bt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>Ut),He("design:type",Array)],Bt.prototype,"roles_permissions",void 0),ke([re.HasMany(()=>qt),He("design:type",Array)],Bt.prototype,"pages",void 0),Bt=ke([ne(Ke),se("permission"),Ht(),oe("5.6.0")],Bt);let Ut=class RolePermissionModel extends de{};ke([ie.Id(7),He("design:type",String)],Ut.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Ut.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Bt),He("design:type",String)],Ut.prototype,"permission_id",void 0),ke([re.BelongsTo(()=>Vt),He("design:type",String)],Ut.prototype,"role_id",void 0),Ut=ke([ne(Ke),se("roles_permission"),Ht(),oe("5.6.0")],Ut);let Vt=class RoleModel extends de{};ke([ie.Id(7),He("design:type",String)],Vt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Vt.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],Vt.prototype,"role",void 0),ke([ie.Text(),He("design:type",String)],Vt.prototype,"description",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Vt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Vt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Vt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Vt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Vt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>$t),He("design:type",Array)],Vt.prototype,"groups_roles",void 0),ke([re.HasMany(()=>Ut),He("design:type",Array)],Vt.prototype,"roles_permissions",void 0),Vt=ke([ne(Ke),se("role"),Ht(),oe("5.6.0")],Vt);let $t=class GroupRoleModel extends de{};ke([ie.Id(7),He("design:type",String)],$t.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],$t.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Wt),He("design:type",String)],$t.prototype,"group_id",void 0),ke([re.BelongsTo(()=>Vt),He("design:type",String)],$t.prototype,"role_id",void 0),$t=ke([ne(Ke),se("groups_roles"),Ht(),oe("5.6.0")],$t);let Wt=class GroupModel extends de{};ke([ie.Id(7),He("design:type",String)],Wt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Wt.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],Wt.prototype,"group",void 0),ke([ie.Text(),He("design:type",String)],Wt.prototype,"description",void 0),ke([ie.Enum(Be),ae(Be.SYSTEM),He("design:type",String)],Wt.prototype,"type",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Wt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Wt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Wt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Wt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Wt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>Yt),He("design:type",Array)],Wt.prototype,"users_groups",void 0),ke([re.HasMany(()=>$t),He("design:type",Array)],Wt.prototype,"groups_roles",void 0),Wt=ke([ne(Ke),se("group"),Ht(),oe("5.6.0")],Wt);let Gt=class UserTenantModel extends de{};ke([ie.Id(7),He("design:type",String)],Gt.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Gt.prototype,"created_at",void 0),ke([re.BelongsTo(()=>zt),He("design:type",String)],Gt.prototype,"tenant_id",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],Gt.prototype,"user_id",void 0),Gt=ke([ne(Ke),se("users_tenants"),Ht(),oe("5.6.0")],Gt);let zt=class TenantModel extends de{};ke([ie.Id(7),He("design:type",String)],zt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],zt.prototype,"name",void 0),ke([ie.Text(),He("design:type",String)],zt.prototype,"description",void 0),ke([ie.Enum($e),ae($e.ACTIVE),He("design:type",String)],zt.prototype,"status",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],zt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],zt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],zt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],zt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>Gt),He("design:type",Array)],zt.prototype,"users_tenants",void 0),zt=ke([ne(Ke),se("tenant"),Ht(),oe("5.6.0")],zt);let Yt=class UserGroupModel extends de{};ke([ie.Id(7),He("design:type",String)],Yt.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Yt.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Wt),He("design:type",String)],Yt.prototype,"group_id",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],Yt.prototype,"user_id",void 0),ke([re.BelongsTo(()=>zt),He("design:type",String)],Yt.prototype,"tenant_id",void 0),Yt=ke([ne(Ke),se("users_groups"),Ht(),oe("5.6.0")],Yt);let Jt=class UserPasswordModel extends de{};ke([ie.Id(7),He("design:type",String)],Jt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Jt.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Object)],Jt.prototype,"revoked_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Jt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Jt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Jt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],Jt.prototype,"user_id",void 0),Jt=ke([ne(Ke),se("users_password"),Ht(),oe("5.6.0")],Jt);let Xt=class UserModel extends de{};ke([ie.Id(7),He("design:type",String)],Xt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Xt.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],Xt.prototype,"username",void 0),ke([ie.String(),He("design:type",String)],Xt.prototype,"email",void 0),ke([ie.Text(),He("design:type",String)],Xt.prototype,"notes",void 0),ke([ie.Enum(We),ae(We.ACTIVE),He("design:type",String)],Xt.prototype,"status",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Xt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Xt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Xt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Xt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>Qt),He("design:type",Array)],Xt.prototype,"audits",void 0),ke([re.HasMany(()=>Kt),He("design:type",Array)],Xt.prototype,"users_auths",void 0),ke([re.HasMany(()=>Lt),He("design:type",Array)],Xt.prototype,"registers",void 0),ke([re.HasMany(()=>Yt),He("design:type",Array)],Xt.prototype,"users_groups",void 0),ke([re.HasMany(()=>Jt),He("design:type",Array)],Xt.prototype,"users_passwords",void 0),ke([re.HasMany(()=>Gt),He("design:type",Array)],Xt.prototype,"users_tenants",void 0),Xt=ke([ne(Ke),se("user"),Ht(),oe("5.6.0")],Xt);let Qt=class AuditModel extends de{};ke([ie.Id(7),He("design:type",String)],Qt.prototype,"id",void 0),ke([ie.Enum(qe),He("design:type",String)],Qt.prototype,"type",void 0),ke([ie.String(),He("design:type",String)],Qt.prototype,"model",void 0),ke([ie.String(),le(),He("design:type",String)],Qt.prototype,"record",void 0),ke([ie.Json(),He("design:type",Object)],Qt.prototype,"currently",void 0),ke([ie.Json(),He("design:type",Object)],Qt.prototype,"previously",void 0),ke([ie.Char(36),le(),He("design:type",String)],Qt.prototype,"request_id",void 0),ke([ie.Text(),He("design:type",String)],Qt.prototype,"full_url",void 0),ke([ie.String(),He("design:type",String)],Qt.prototype,"ip_address",void 0),ke([ie.Text(),He("design:type",String)],Qt.prototype,"user_agent",void 0),ke([ie.String(),He("design:type",String)],Qt.prototype,"source",void 0),ke([ie.FullDate(),He("design:type",Object)],Qt.prototype,"reverted_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Qt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Qt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Qt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],Qt.prototype,"user_id",void 0),Qt=ke([ne(Ke),se("audit"),oe("5.6.0")],Qt);let Zt=class ConfigModel extends de{};ke([ie.Id(7),He("design:type",String)],Zt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Zt.prototype,"key",void 0),ke([ie.Text(),He("design:type",String)],Zt.prototype,"value",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Zt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Zt.prototype,"updated_at",void 0),Zt=ke([ne(Ke),se("configs"),oe("5.6.0")],Zt);let ei=class ForgotModel extends de{};ke([ie.Id(7),He("design:type",String)],ei.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ei.prototype,"secret",void 0),ke([ie.FullDate(),He("design:type",Number)],ei.prototype,"expired_at",void 0),ke([ie.Boolean(),He("design:type",Boolean)],ei.prototype,"active",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ei.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ei.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],ei.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],ei.prototype,"user_id",void 0),ei=ke([ne(Ke),se("forgot"),oe("5.6.0")],ei);let ti=class LogModel extends de{};ke([ie.Id(7),He("design:type",String)],ti.prototype,"id",void 0),ke([ie.Enum(Ue),ae(Ue.INFO),He("design:type",String)],ti.prototype,"level",void 0),ke([ie.Text(),He("design:type",String)],ti.prototype,"message",void 0),ke([ie.String(),He("design:type",String)],ti.prototype,"source",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ti.prototype,"created_at",void 0),ti=ke([ne(Ke),se("log"),oe("5.6.0")],ti);let ii=class MigrationModel extends de{};ke([ie.Id(7),He("design:type",String)],ii.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ii.prototype,"model",void 0),ke([ie.String(),He("design:type",String)],ii.prototype,"version",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ii.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ii.prototype,"updated_at",void 0),ii=ke([ne(Ke),se("migration"),oe("5.6.0")],ii);let ri=class SecretModel extends de{};ke([ie.Id(7),He("design:type",String)],ri.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ri.prototype,"key",void 0),ke([ie.Text(),He("design:type",String)],ri.prototype,"hash",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ri.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ri.prototype,"updated_at",void 0),ri=ke([ne(Ke),se("secret"),oe("5.6.0")],ri);let ni=class SessionModel extends de{};ke([ie.Id(7),He("design:type",String)],ni.prototype,"id",void 0),ke([ie.Json(),He("design:type",Object)],ni.prototype,"data",void 0),ke([ie.FullDate(),He("design:type",Date)],ni.prototype,"expired_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ni.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ni.prototype,"updated_at",void 0),ni=ke([ne(Ke),se("session"),oe("5.6.0")],ni);let si=class UserKeyModel extends de{};ke([ie.Id(7),He("design:type",String)],si.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],si.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],si.prototype,"prefix",void 0),ke([ie.Text(),He("design:type",String)],si.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Object)],si.prototype,"last_used_at",void 0),ke([ie.FullDate(),He("design:type",Object)],si.prototype,"expires_at",void 0),ke([ie.FullDate(),He("design:type",Object)],si.prototype,"revoked_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],si.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],si.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],si.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],si.prototype,"user_id",void 0),si=ke([ne(Ke),se("users_key"),Ht(),oe("5.6.0")],si);class Log{static error(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,i)})}static info(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,i)})}static warn(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,i)})}static writeRaw(e,t,i,r){return Fe(this,void 0,void 0,function*(){var n;r&&he.console(null!==(n=this.colors[e])&&void 0!==n?n:ge.White,e,t),Ke&&(yield ti.create({level:e,message:t,source:null!=i?i:""}).catch(he.catch))})}}Log.colors={error:ge.Red,info:ge.Cyan,warn:ge.Yellow};class Loggable{get log(){return e=>Loggable.logInfo(this,e)}static get log(){return e=>this.logInfo(this,e)}get error(){return e=>Loggable.logError(this,e)}static get error(){return e=>this.logError(this,e)}static logError(e,t){var i,r;Log.error(null!==(r=null!==(i=null==t?void 0:t.message)&&void 0!==i?i:t)&&void 0!==r?r:"",this.source(e),Env.CONSOLE_ERROR)}static logInfo(e,t){Log.info(null!=t?t:"",this.source(e),Env.CONSOLE_ERROR)}static source(e){var t,i,r;const n=null!==(r=null!==(i=null===(t=null==e?void 0:e.constructor)||void 0===t?void 0:t.name)&&void 0!==i?i:null==e?void 0:e.name)&&void 0!==r?r:"null";return Env.BASE_NAME?`${Env.BASE_NAME}.${n}`:n}}class Config extends Loggable{static all(e){return Fe(this,void 0,void 0,function*(){var t;const i=null!==(t=yield Zt.findAll({attributes:["key","value"],where:(null==e?void 0:e.length)?{key:{[ue.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[];return Object.fromEntries(i.map(e=>[e.key,e.value]))})}static del(e){return Fe(this,void 0,void 0,function*(){return((yield Zt.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return Fe(this,arguments,void 0,function*(e,t=""){const[i]=(yield Zt.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return i?i.value:t})}static set(e,t){return Fe(this,void 0,void 0,function*(){const[i,r]=(yield Zt.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];i&&!r&&(yield i.update({value:t}).catch(this.error))})}}class Secret extends Loggable{static all(e){return Fe(this,void 0,void 0,function*(){var t;return(null!==(t=yield ri.findAll({attributes:["key"],where:(null==e?void 0:e.length)?{key:{[ue.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}static del(e){return Fe(this,void 0,void 0,function*(){return((yield ri.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return Fe(this,arguments,void 0,function*(e,t=""){var i;this.init();const r=this.encryptor.encrypt(t),[n]=(yield ri.findOrCreate({where:{key:e},defaults:{key:e,hash:r}}).catch(this.error))||[];return n&&null!==(i=this.encryptor.decrypt(n.hash))&&void 0!==i?i:t})}static set(e,t){return Fe(this,void 0,void 0,function*(){this.init();const i=this.encryptor.encrypt(t),[r,n]=(yield ri.findOrCreate({where:{key:e},defaults:{key:e,hash:i}}).catch(this.error))||[];r&&!n&&(yield r.update({hash:i}).catch(this.error))})}static init(){this.encryptor||(this.encryptor=new ve(Env.ENCRYPTION_SECRET))}}class SessionStore extends Oe{constructor(){super(),this.all=e=>Fe(this,void 0,void 0,function*(){e=e||L;const t=yield ni.findAll({attributes:["id","expired_at"],where:{expired_at:{[ue.gte]:new Date}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.id)),e()}),this.clear=e=>Fe(this,void 0,void 0,function*(){yield ni.destroy().catch(he.catch),e&&e()}),this.destroy=(e,t)=>Fe(this,void 0,void 0,function*(){yield ni.destroy({where:{id:e}}).catch(he.catch),t&&t()}),this.expired=()=>Fe(this,void 0,void 0,function*(){yield ni.destroy({where:{expired_at:{[ue.lt]:new Date}}}).catch(he.catch)}),this.get=(e,t)=>Fe(this,void 0,void 0,function*(){t=t||L;const i=yield ni.findOne({where:{id:e,expired_at:{[ue.gte]:new Date}}}).catch(e=>(t(e),null));if(i){if(i.data.cookie){if(new Date(i.data.cookie.expires).getTime()<=Date.now())return yield i.destroy().catch(he.catch),void t(null)}t(null,i.data)}else t(null)}),this.length=e=>Fe(this,void 0,void 0,function*(){e&&e(null,(yield ni.count().catch(he.catch))||0)}),this.set=(e,t,i)=>Fe(this,void 0,void 0,function*(){i=i||L;const r=new Date;r.setTime(r.getTime()+Env.API_SESSION_LIFETIME);const[n,s]=(yield ni.findOrCreate({where:{id:e},defaults:{id:e,data:t,expired_at:r}}).catch(he.catch))||[];n?(s||(n.data=t,n.expired_at=r,yield n.save().catch(he.catch)),i()):i()}),setInterval(this.expired,6e4)}}let oi=class Service{};oi=ke([we(Loggable)],oi);let di=class UserService extends oi{constructor(){super(...arguments),this.hashOptions={algorithm:Env.PASSWORD_ALGORITHM,memoryCost:Env.PASSWORD_MEMORY_COST,parallelism:Env.PASSWORD_PARALLELISM,timeCost:Env.PASSWORD_TIME_COST}}canAssignPassword(e,t){return Fe(this,void 0,void 0,function*(){var i,r;if(Env.PASSWORD_REUSE)return!0;if(!(null!==(i=yield Xt.count({where:{id:e}}).catch(this.error))&&void 0!==i?i:0))return!1;const n=null!==(r=yield Jt.findAll({attributes:["hash"],where:{user_id:e}}).catch(this.error))&&void 0!==r?r:[];t+=Env.PASSWORD_PEPPER;for(const e of n)if(yield Te(e.hash,t).catch(L))return!1;return!0})}checkPassword(e,t){return Fe(this,void 0,void 0,function*(){var i;if(!(null!==(i=yield Xt.count({where:{id:e}}).catch(this.error))&&void 0!==i?i:0))return!1;const r=yield Jt.findOne({attributes:["hash"],where:{revoked_at:null,user_id:e}}).catch(this.error);return t+=Env.PASSWORD_PEPPER,r&&(yield Te(r.hash,t).catch(L))||!1})}createPassword(e,t,i){return Fe(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield Xt.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))return!1;yield Jt.update({revoked_at:new Date},{where:{revoked_at:null,user_id:e}}).catch(this.error);const n=Pe(t+Env.PASSWORD_PEPPER,this.hashOptions);return yield Jt.create({hash:n,user_id:e},Object.assign({},{ctx:i})).catch(this.error),!0})}getGroups(e,t){return Fe(this,void 0,void 0,function*(){var i;return K((null!==(i=yield Wt.findAll({attributes:["group"],where:{active:!0},include:[{association:"users_groups",required:!0,where:Object.assign({user_id:e},t||q(t)?{tenant_id:t}:{})}]}).catch(this.error))&&void 0!==i?i:[]).map(e=>e.group))})}getPermissions(e,t){return Fe(this,void 0,void 0,function*(){var i;return K((null!==(i=yield Bt.findAll({attributes:["permission"],where:{active:!0},include:[{association:"roles_permissions",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],where:{active:!0},include:[{association:"groups_roles",required:!0,attributes:[],include:[{association:"group",required:!0,attributes:[],where:{active:!0},include:[{association:"users_groups",required:!0,attributes:[],where:Object.assign({user_id:e},t||q(t)?{tenant_id:t}:{})}]}]}]}]}]}).catch(this.error))&&void 0!==i?i:[]).map(e=>e.permission))})}getGroupPermissions(e){return Fe(this,void 0,void 0,function*(){var t;return K((null!==(t=yield Bt.findAll({attributes:["permission"],where:{active:!0},include:[{association:"roles_permissions",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],where:{active:!0},include:[{association:"groups_roles",required:!0,attributes:[],where:{group_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.permission))})}getTenants(e){return Fe(this,void 0,void 0,function*(){var t;return(null!==(t=yield zt.findAll({attributes:["id","name"],where:{status:$e.ACTIVE},include:[{association:"users_tenants",required:!0,where:{user_id:e}}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>({id:e.id,name:e.name}))})}};di=ke([Se()],di);let ai=class AuthService extends oi{constructor(){super(...arguments),this.options={algorithm:"HS256",expiresIn:`${Env.TOKEN_TTL}ms`},this.userAttributes={exclude:["username","notes","deleted_at"]},this.userService=new di}apiAuth(e){return Fe(this,void 0,void 0,function*(){var i,r;const n=e.getHeader(Env.TOKEN_HEADER);let s=e.getCookie(Env.TOKEN_COOKIE);s=`${Env.TOKEN_TYPE} ${s}`;const[o,d]=null!==(r=null===(i=n||s)||void 0===i?void 0:i.split(" "))&&void 0!==r?r:["",""];if(!d||o.toLowerCase()!=Env.TOKEN_TYPE)throw new t("Invalid token type");const a=/^sk_([\w]+)_([\w]{6})\./.test(d),{access:l,user:u}=yield a?this.apiKeyAuth(d):this.apiTokenAuth(d),c=e.getHeader("user-agent");if(l instanceof Kt&&l.user_agent&&l.user_agent!=c)throw new t("Invalid API token");return e.req.access=l,yield this.attachAuthContext(e,u),{access:l,user:u}})}apiKeyAuth(e){return Fe(this,void 0,void 0,function*(){if(!Env.TOKEN_PEPPER)throw new s("Authentication service unavailable");if(!e)throw new t("API key missing");const[i]=e.split(".");if(!i)throw new t("Invalid API key");const r=yield si.findOne({where:{prefix:i},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{status:We.ACTIVE}}]});if(!r||!r.user)throw new t("Invalid API key");if(r.revoked_at)throw new t("API key revoked");if(r.expires_at&&r.expires_at<new Date)throw new t("API key expired");const n=Ae("sha256",Env.TOKEN_PEPPER).update(e).digest("hex");if(!this.safeEqual(n,r.hash))throw new t("Invalid API key");return yield r.update({last_used_at:new Date},Object.assign({},{withoutAudit:!0})).catch(this.error),{access:r,user:r.user}})}apiTokenAuth(e){return Fe(this,void 0,void 0,function*(){const{id:i,hash:r}=yield this.verifyJwt(e);if(!i||!r)throw new t("Invalid API token");const n=yield Kt.findOne({attributes:{exclude:["hash"]},where:{hash:r},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:i,status:We.ACTIVE}}]}).catch(this.error);if(!n||!n.user)throw new t("Invalid API token");if(n.revoked_at)throw new t("API token revoked");return{access:n,user:n.user}})}createApiKey(e,t,i,r){return Fe(this,void 0,void 0,function*(){if(!Env.TOKEN_PEPPER)throw new s("Authentication service unavailable");const n=`sk_${Env.TOKEN_PREFIX}_${B(6)}`,o=`${n}.${U()}`,d=Ae("sha256",Env.TOKEN_PEPPER).update(o).digest("hex"),a=yield si.create({name:t,prefix:n,hash:d,expires_at:i,user_id:r.id},Object.assign({},{ctx:e})).catch(this.error);if(!a)throw new s("API key could not be created");return{id:a.id,key:o}})}createApiToken(e,t){return Fe(this,void 0,void 0,function*(){var i;if(!Env.TOKEN_SECRET)throw new s("Authentication service unavailable");const{id:r}=t,n=U(),o=yield Kt.create({hash:n,user_id:r},Object.assign({},{ctx:e})).catch(this.error);if(!o)throw new s;const d=_e.sign({id:r,hash:n},Env.TOKEN_SECRET,this.options);if(o.user_agent=null!==(i=e.getHeader("user-agent"))&&void 0!==i?i:"",o.ip_address=e.getIp(),!(yield o.save().catch(this.error)))throw new s("Authentication service unavailable");return{token:d}})}deleteApiKey(e,t,i){return Fe(this,void 0,void 0,function*(){const r=yield si.findOne({attributes:["id","revoked_at"],where:{id:t,user_id:i.id}}).catch(this.error);return!!r&&(!(!r.revoked_at&&!(yield r.update({revoked_at:new Date},Object.assign({},{ctx:e})).catch(this.error)))&&(yield r.destroy(Object.assign({},{ctx:e})).catch(this.error),!0))})}renewApiToken(e){return Fe(this,void 0,void 0,function*(){const{id:i,hash:r}=yield this.verifyJwt(e,Env.TOKEN_TTL_RENEW/1e3);if(!i||!r)throw new t("Invalid API token");const n=yield Kt.findOne({where:{hash:r},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:i,status:We.ACTIVE}}]}).catch(this.error);if(!n||!n.user)throw new t("Invalid API token");if(n.revoked_at)throw new t("API token revoked");if(n.hash=U(),!(yield n.save().catch(this.error)))throw new s("Authentication service unavailable");return{token:_e.sign({id:i,hash:n.hash},Env.TOKEN_SECRET,this.options)}})}revokeApiKey(e,t,i){return Fe(this,void 0,void 0,function*(){var r;const[n]=null!==(r=yield si.update({revoked_at:new Date},Object.assign({where:{id:t,revoked_at:null,user_id:i.id}},{ctx:e})).catch(this.error))&&void 0!==r?r:[0];return n>0})}attachAuthContext(e,i){return Fe(this,void 0,void 0,function*(){e.req.user=i;const r=e.getHeader(Env.TENANT_HEADER),n=yield this.userService.getTenants(i.id);if(r&&!n.find(e=>e.id==r))throw new t("Tenant not found or access denied");const[s,o]=yield Promise.all([this.userService.getGroups(i.id,r),this.userService.getPermissions(i.id,r)]);e.req.groups=s,e.req.permissions=o,e.req.tenants=n})}safeEqual(e,t){const i=Buffer.from(e,"hex"),r=Buffer.from(t,"hex");return i.length===r.length&&be(i,r)}verifyJwt(e,i){return Fe(this,void 0,void 0,function*(){if(!Env.TOKEN_SECRET)throw new s("Authentication service unavailable");if(!e||e.split(".").length<3)throw new t("Invalid token");try{return _e.verify(e,Env.TOKEN_SECRET,{algorithms:["HS256"],clockTolerance:i})}catch(e){throw new t("Invalid token")}})}};ai=ke([Se()],ai);class ModelService extends oi{constructor(e,t){var i,r;super(),this.attributes=[],this.permissions=[],this.search=[],this.model=e,(null==t?void 0:t.permissions)&&(this.permissions=t.permissions);const n=Object.keys(e.getAttributes());this.attributes=this.filterAttributes(n,null!==(i=null==t?void 0:t.attributes)&&void 0!==i?i:[]),this.search=this.filterAttributes(n,null!==(r=null==t?void 0:t.search)&&void 0!==r?r:this.attributes)}applySelect(e,t,i){if(!t)return;const r=null==e?void 0:e.getQuery(i?`${i}_select`:"select"),n=t.attributes,s=e=>n.includes(e);t.attributes=[],j(r)&&r.length&&t.attributes.push(...r.split(/\s*,\s*/g).filter(s)),t.attributes.length||(t.attributes=n)}applyOrders(e,t){if(!t)return;const i=null==e?void 0:e.getQuery("order"),r=[],n=t.attributes,s=([e])=>n.includes(e),o=e=>e&&["ASC","DESC"].includes(e)?e:"ASC";if(j(i)&&i.length){const e=i.split(/\s*,\s*/g).map(e=>e.split(/\s*:\s*/g));r.push(...e.filter(s).map(([e,t])=>[e,o((null!=t?t:"ASC").toUpperCase())]))}r.length&&(t.order=r)}applyPagination(e,t){if(!t)return;const i=null==e?void 0:e.getQuery("limit"),r=null==e?void 0:e.getQuery("offset");P(t.limit)&&(t.limit=Env.MODEL_LIMIT,j(i)&&(t.limit=parseInt(i)||0),t.limit=V(t.limit,-1,Env.MODEL_LIMIT_MAX)),t.limit<0&&(t.limit=void 0),j(r)&&(t.offset=parseInt(r)||0,t.offset<0&&(t.offset=void 0))}applySearch(e,t){var i;if(!t)return;const r=null==e?void 0:e.getQuery("search");r&&j(r)&&(t.where=Object.assign(Object.assign({},null!==(i=t.where)&&void 0!==i?i:{}),{[ue.or]:this.search.map(e=>({[e]:{[ue.substring]:r}}))}))}applyWhere(e,t,i){var r,n;if(!t)return;const d=null==e?void 0:e.getQuery(i?`${i}_where`:"where");if(!j(d))return;const a=t.attributes;try{const e=ce.parse(a,null!==(r=JSON.parse(d))&&void 0!==r?r:{});t.where=Object.assign(Object.assign({},null!==(n=t.where)&&void 0!==n?n:{}),null!=e?e:{})}catch(e){if(e instanceof Error)throw new o(e.message);throw new s}}countAll(e){return Fe(this,void 0,void 0,function*(){var t,i;const{ctx:r,options:n={}}=e,s=$({},n);s.attributes=this.getAttributes(null!==(t=null==s?void 0:s.attributes)&&void 0!==t?t:[]),this.applySearch(r,s),this.applyWhere(r,s),this.applySelect(r,s);const o=null!==(i=yield this.model.count(Object.assign(Object.assign({},s),{distinct:!!s.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error))&&void 0!==i?i:0;return null==r||r.prepare(d.OK,{count:o}),o})}create(e){return Fe(this,void 0,void 0,function*(){var t,i;const{body:r={},ctx:n,options:o={}}=e,a=$({},o),l=yield this.model.create(Object.assign({},$({},null!==(i=null===(t=null==n?void 0:n.req)||void 0===t?void 0:t.body)&&void 0!==i?i:{},r)),Object.assign(Object.assign({},a),{ctx:n})).catch(this.error);if(!l)throw new s;const{primaryKeyAttribute:u}=this.model;return null==n||n.prepare(d.OK,{[u]:l.getDataValue(u)}),l})}delete(e){return Fe(this,void 0,void 0,function*(){var t,i;const{ctx:r,id:n,options:s={}}=e,{primaryKeyAttribute:o}=this.model,d=null!==(t=null==r?void 0:r.getParam(o))&&void 0!==t?t:n;if(P(d))throw new a;const u=$({},s),c=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},u),{where:{[ue.and]:Object.assign({[o]:d},null!==(i=null==u?void 0:u.where)&&void 0!==i?i:{})},individualHooks:!0}),{ctx:r})).catch(this.error);if(!c)throw new l;return null==r||r.success("OK"),c})}filterAttributes(e,t){if(k(t))return t.length?t.filter(t=>j(t)&&e.includes(t)):e;const{exclude:i,include:r}=t,n=P(r)?e:r.filter(t=>j(t)&&e.includes(t)),s=null!=i?i:[];return s.length?n.filter(e=>!s.includes(e)):n}findAll(e){return Fe(this,void 0,void 0,function*(){var t,i;const{ctx:r,callback:n,options:s={},query:o=!0}=e,a=$({},s);a.attributes=this.getAttributes(null!==(t=null==a?void 0:a.attributes)&&void 0!==t?t:[]),o&&this.applySelect(r,a),this.applyOrders(r,a),this.applyPagination(r,a),(null!==(i=null==a?void 0:a.limit)&&void 0!==i?i:0)>Env.MODEL_LIMIT_MAX&&(a.limit=Env.MODEL_LIMIT_MAX),this.applySearch(r,a),o&&this.applyWhere(r,a);const[l,u]=yield Promise.all([this.model.count(Object.assign(Object.assign({},a),{distinct:!!a.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error).then(e=>null!=e?e:0),this.model.findAll(a).catch(this.error).then(e=>null!=e?e:[])]),c={count:l,records:n?yield n(u):u};return null==r||r.prepare(d.OK,c),c})}findOne(e){return Fe(this,void 0,void 0,function*(){var t,i,r;const{callback:n,ctx:s,id:o,options:u={},query:c=!0}=e,{primaryKeyAttribute:p}=this.model,h=null!==(t=null==s?void 0:s.getParam(p))&&void 0!==t?t:o;if(P(h))throw new a;const g=$({},u);g.attributes=this.getAttributes(null!==(i=null==g?void 0:g.attributes)&&void 0!==i?i:[]),c&&this.applySelect(s,g);const v=yield this.model.findOne(Object.assign(Object.assign({},g),{where:{[ue.and]:Object.assign({[p]:h},null!==(r=null==g?void 0:g.where)&&void 0!==r?r:{})}})).catch(this.error);if(!v)throw new l;return null==s||s.prepare(d.OK,n?yield n(v):v.toJSON()),v})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var i;const r=W(t),{ctx:n}=null!=t?t:{};return r.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(i=r.attributes)&&void 0!==i?i:[]),this.applySearch(n,r),this.applyWhere(n,r,t.name),this.applySelect(n,r,t.name),Object.assign({model:e},r)}name(){return this.model.tableName}sync(){return Fe(this,void 0,void 0,function*(){if(!this.permissions.length)return;const e=this.name().toLowerCase(),t=G(e.replace(/_/g," ")," ");yield z(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=C(`${e}.${i}`,".");yield Bt.findOrCreate({where:{permission:r},defaults:{name:`${t} ${G(i," ")}`}})}))})}update(e){return Fe(this,void 0,void 0,function*(){var t,i,r,n;const{ctx:s,body:o,id:d,options:u={}}=e,{primaryKeyAttribute:c}=this.model,p=null!==(t=null==s?void 0:s.getParam(c))&&void 0!==t?t:d;if(P(p))throw new a;const h=$({},u),g=$({},null!==(r=null===(i=null==s?void 0:s.req)||void 0===i?void 0:i.body)&&void 0!==r?r:{},null!=o?o:{}),v=yield this.model.findOne(Object.assign(Object.assign({},h),{attributes:this.getAttributes([c,...Object.keys(g)]),where:{[ue.and]:Object.assign({[c]:p},null!==(n=null==h?void 0:h.where)&&void 0!==n?n:{})}})).catch(this.error);if(!v)throw new l;return v.set(g),v.changed()?(yield v.save(Object.assign({},{ctx:s})).catch(this.error),null==s||s.success("OK"),!0):(null==s||s.success("Record not changed"),!1)})}}class Application extends u{constructor(e,t){super(e,$({},{cross:!!Env.HTTP_CROSS&&("*"===Env.HTTP_CROSS||{origin:Env.HTTP_CROSS.split(",")}),hybrid:Env.HTTP_HYBRID,json:{strict:Env.API_BODYPARSER_STRICT,inflate:Env.API_BODYPARSER_INFLATE,limit:Env.API_BODYPARSER_LIMIT,type:Env.API_BODYPARSER_TYPE},notfound:Env.HTTP_NOTFOUND,path:Env.HTTP_PATH,port:Env.HTTP_PORT,public:Env.HTTP_PUBLIC,redirect:Env.HTTP_REDIRECT,session:{store:new SessionStore,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:D},tls:{ca:Env.HTTP_TLS_CA,cert:Env.HTTP_TLS_CRT,key:Env.HTTP_TLS_KEY}},null!=t?t:{})),this._prepared=!1}error(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.error(e.message,t,Env.CONSOLE_ERROR)}log(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return Fe(this,void 0,void 0,function*(){yield this.prepare(),yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new Z({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>Fe(this,void 0,void 0,function*(){t.url||(t.url=""),e.on("close",()=>{}),yield Y(2e3)})))})}prepare(){return Fe(this,void 0,void 0,function*(){this._prepared||(yield Ke.sync(),yield this.migrations(Ke),yield J(this.controllers,e=>Fe(this,void 0,void 0,function*(){I(e.sync)&&(yield e.sync(this))})),this.authService=new ai,this.userService=new di,this._prepared=!0)})}migrations(e){return Fe(this,void 0,void 0,function*(){const t=[];yield J(Object.keys(e.models),i=>Fe(this,void 0,void 0,function*(){var r;const n=e.models[i],s=n.version();if(!s)return;const[o,d]=null!==(r=yield ii.findOrCreate({where:{model:n.tableName},defaults:{model:n.tableName,version:""}}).catch(this.error))&&void 0!==r?r:[];o&&(d||o.version!=s)&&(o.version=s,yield o.save().catch(this.error),t.push(n))})),yield J(t,e=>Fe(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}let li=class BaseController extends X{constructor(){super(...arguments),this.permissions=[]}name(){var e,t;return(null!==(t=null===(e=this.constructor)||void 0===e?void 0:e.name)&&void 0!==t?t:"api").replace(/(([a-z])([A-Z]))/g,"$2_$3")}sync(){return Fe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=G(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=C(`${e}.${i}`,".");yield Bt.findOrCreate({where:{permission:r},defaults:{name:`${t} ${G(i," ")}`}})}))})}};li=ke([we(Loggable)],li);class ModelController extends li{constructor(){super(...arguments),this.attributes=[],this.permissions=["audit","create","read","update","delete"],this.search=[]}countAll(e){return Fe(this,void 0,void 0,function*(){return yield this.service.countAll(e)})}create(e){return Fe(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return Fe(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return Fe(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return Fe(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}include(e,t){return this.service.include(e,t)}sync(){return Fe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=G(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=C(`${e}.${i}`,".");yield Bt.findOrCreate({where:{permission:r},defaults:{name:`${t} ${G(i," ")}`}})})),this.service=new ModelService(this.model,{attributes:this.attributes.length?this.attributes:void 0,search:this.search.length?this.search:void 0})})}update(e){return Fe(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}}let ui=class AuditsController extends ModelController{constructor(){super(...arguments),this.model=Qt,this.permissions=["read"]}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["currently","previously"]}}})})}record(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensurePermission(e,t),yield this.findAll({ctx:e,options:{where:{record:t}}})})}get(e){return Fe(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}ensurePermission(e,i){return Fe(this,void 0,void 0,function*(){var r;const n=yield Qt.findOne({where:{record:i}}).catch(this.error);if(!n)return;const s=C(`${n.model}.audit`,".");if(!(null===(r=e.req.permissions)||void 0===r?void 0:r.includes(s)))throw new t("Access denied")})}};ke([c(),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],ui.prototype,"all",null),ke([c("/record/:record"),tt(),Ne(0,p()),Ne(1,h("record")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],ui.prototype,"record",null),ke([c("/:id"),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],ui.prototype,"get",null),ui=ke([g("/audits")],ui);let ci=class AuthController extends li{constructor(){super(...arguments),this.authService=new ai}login(e,i,r,n,s){return Fe(this,void 0,void 0,function*(){var o,d;yield Y(Env.SLEEP_AUTH);const a=yield Jt.findOne({where:{revoked_at:null},include:[{association:"user",required:!0,where:{status:{[ue.in]:[We.ACTIVE,We.PENDING]},[ue.or]:[{email:i},{username:i}]},include:[{association:"registers",required:!1,where:{active:!0}}]}]}).catch(this.error);if(r+=Env.PASSWORD_PEPPER,!a||!a.user||null===(o=yield Te(a.hash,r).catch(L))||void 0===o||!o)throw s.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),new t("Invalid credentials");if(a.user.registers.length)throw s.emit("auth.activation",{ctx:e}),this.emit("auth.activation",{ctx:e}),new t("Activation required");if(a.user.status!==We.ACTIVE)throw s.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),new t("Invalid credentials");const{token:l}=null!==(d=yield this.authService.createApiToken(e,a.user).catch(t=>{throw s.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),t}))&&void 0!==d?d:{};Env.TOKEN_COOKIE_SET&&e.setCookie(Env.TOKEN_COOKIE,l,{httpOnly:!0,secure:Env.isProduction(),sameSite:"lax",maxAge:n?Env.TOKEN_TTL:void 0}),e.json({token:l}),s.emit("auth.login",{ctx:e}),this.emit("auth.login",{ctx:e})})}logout(e,i,r){return Fe(this,void 0,void 0,function*(){if(i instanceof si)throw new t("Access denied");if(i.revoked_at=new Date,!(yield i.save().catch(this.error)))throw new s("Authentication service unavailable");Env.TOKEN_COOKIE_SET&&e.clearCookie(Env.TOKEN_COOKIE),e.success("OK"),r.emit("auth.logout",{ctx:e}),this.emit("auth.logout",{ctx:e})})}user(e){return Fe(this,void 0,void 0,function*(){const{groups:t,permissions:i,tenants:r,user:n}=e.req;if(!(t&&i&&r&&n))throw new s;e.json(Object.assign(Object.assign({},n.toJSON()),{groups:t,permissions:i,tenants:r}))})}renew(e,t,i){return Fe(this,void 0,void 0,function*(){const{token:r}=yield this.authService.renewApiToken(t);e.json({token:r}),i.emit("auth.renew",{ctx:e}),this.emit("auth.renew",{ctx:e})})}};ke([v("/login"),y(e=>({username:e.string().min(3),password:e.string().min(5),remember:e.boolean().parse().default(!1)})),Ne(0,p()),Ne(1,m("username")),Ne(2,m("password")),Ne(3,m("remember")),Ne(4,f()),He("design:type",Function),He("design:paramtypes",[n,String,String,Boolean,Application]),He("design:returntype",Promise)],ci.prototype,"login",null),ke([c("/logout"),tt(),Ne(0,p()),Ne(1,it()),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,Object,Application]),He("design:returntype",Promise)],ci.prototype,"logout",null),ke([c("/me"),tt(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],ci.prototype,"user",null),ke([v("/renew"),y(e=>({token:e.string()})),Ne(0,p()),Ne(1,m("token")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],ci.prototype,"renew",null),ci=ke([g("/auth")],ci);class CrudController extends ModelController{constructor(){super(...arguments),this._crud={}}CrudArgumentsCountAll(e){return{ctx:e}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidateCreate(){return this._crud}CrudValidateUpdate(){return this._crud}add(e){return Fe(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}rows(e){return Fe(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsCountAll(e))})}del(e){return Fe(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return Fe(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return Fe(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validate(e,t){var i,r;const n=H.object(t).parse().validate(null!==(r=null===(i=e.req)||void 0===i?void 0:i.body)&&void 0!==r?r:{});if(n.error)throw new o(n.message||n.error);e.req.body=n.value,e.next()}validateCreate(e){const t=this.CrudValidateCreate();if(t==this._crud)throw new s;this.validate(e,t)}validateUpdate(e){const t=this.CrudValidateUpdate();if(t==this._crud)throw new s;this.validate(e,t)}}ke([v(),tt(),ze(),E("validateCreate"),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"add",null),ke([c(),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"all",null),ke([c("/count"),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"rows",null),ke([w("/:id"),tt(),Ye(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"del",null),ke([c("/:id"),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"get",null),ke([S("/:id"),tt(),Xe(),E("validateUpdate"),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"set",null),ke([Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",void 0)],CrudController.prototype,"validateCreate",null),ke([Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",void 0)],CrudController.prototype,"validateUpdate",null);let pi=class FilesController extends li{constructor(){super(...arguments),this.directory=Env.HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return Fe(this,void 0,void 0,function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=De(this.directory,t);if(!Ie(i)||!Ce(i).isDirectory())throw new l;let r;return r=xe(i),r=r.map(e=>this.info(De(i,e))),r=r.filter(Q),Object.assign(Object.assign({},this.info(i)),{files:r})})}info(e){if(!Ie(e))return null;const t=Ce(e),i=e.split("/").pop();e=e.replace(this.directory,"/").replace(/^\/\//,"/");const r=t.isDirectory();return{name:i,path:e.replace(/^\/\//,"/"),size:t.size,extension:r?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:r,symlink:t.isSymbolicLink()}}name(){return"files"}sync(){return Fe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=G(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=C(`${e}.${i}`,".");yield Bt.findOrCreate({where:{permission:r},defaults:{name:`${t} ${G(i," ")}`}})}))})}};ke([c("/path"),c("/path/*path"),tt(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],pi.prototype,"files",null),pi=ke([g("/files")],pi);let hi=class ForgotController extends li{check(e,t){return Fe(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)throw new l;i.secret=B(),yield i.save(),e.json({token:i.secret})})}forgot(e,t,i){return Fe(this,void 0,void 0,function*(){yield Y(Env.SLEEP_FORGOT);const r=t,n=yield Xt.findOne({where:{[ue.or]:[{email:r},{username:t}]}}).catch(this.error);if(!n)throw new l;const s=B(),o=Date.now()+6e4*Env.TOKEN_TTL_FORGOT,d=yield ei.create({token:s,timestamp:o,active:!0,user_id:n.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:d,user:n}),this.emit("forgot.send",{ctx:e,forgot:d,user:n})})}reset(e,t,i,r){return Fe(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i)throw new l;i.active=!1,yield i.save().catch(this.error),yield i.user.save().catch(this.error),e.success("OK"),r.emit("forgot.reset",{ctx:e,user:i.user}),this.emit("forgot.reset",{ctx:e,user:i.user})})}find(e){return Fe(this,void 0,void 0,function*(){return yield ei.findOne({where:{token:e,active:!0},include:[{association:"users",required:!0}]}).catch(this.error)})}};ke([c("/check"),y(e=>({token:e.string()})),Ne(0,p()),Ne(1,m("token")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],hi.prototype,"check",null),ke([v(),y(e=>({username:e.string().min(4)})),Ne(0,p()),Ne(1,m("username")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],hi.prototype,"forgot",null),ke([v("/reset"),y(e=>({token:e.string(),password:e.string().min(5)})),Ne(0,p()),Ne(1,m("token")),Ne(2,m("password")),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,String,Application]),He("design:returntype",Promise)],hi.prototype,"reset",null),hi=ke([g("/forgot")],hi);let gi=class GroupsController extends CrudController{constructor(){super(...arguments),this.model=Wt,this.schemaCreate={name:H.string(),group:H.string().slugify("."),description:H.string().default(""),type:H.enum(Object.values(Be)).default(Be.SYSTEM),active:H.boolean().parse()},this.schemaUpdate={name:H.string().optional(),group:H.string().slugify(".").optional(),description:H.string().optional(),type:H.enum(Object.values(Be)).optional(),active:H.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return Fe(this,void 0,void 0,function*(){yield e.sync.call(this),this.userModelService=new ModelService(Xt)})}users(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_groups",required:!0,attributes:[],where:{group_id:t}}]}})})}ensureGroup(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Wt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([c("/:id/users"),tt(),Je("users"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],gi.prototype,"users",null),gi=ke([g("/groups")],gi);let vi=class GroupsPermissionsController extends li{constructor(){super(...arguments),this.userService=new di}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t);const i=yield this.userService.getGroupPermissions(t);e.json({permissions:i})})}ensureGroup(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Wt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([c("/:id/permissions"),tt(),Je("groups"),Je("permissions"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],vi.prototype,"all",null),vi=ke([g("/groups")],vi);let yi=class GroupsRolesController extends ModelController{constructor(){super(...arguments),this.model=Vt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(i),yield this.addRoles(e,t,i),e.success("OK")})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],where:{group_id:t}}]}})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(i),yield $t.destroy(Object.assign({where:{group_id:t,role_id:{[ue.in]:i}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(i);const r=yield this.addRoles(e,t,i);yield $t.destroy(Object.assign({where:{group_id:t,role_id:{[ue.notIn]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addRoles(e,t,i){return Fe(this,void 0,void 0,function*(){const r=[];return yield z(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield $t.findOrCreate(Object.assign({where:{group_id:t,role_id:i},defaults:{group_id:t,role_id:i}},{ctx:e})).catch(this.error))&&void 0!==n?n:[];s&&r.push(i)})),r})}ensureGroup(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Wt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}ensureRoles(e){return Fe(this,void 0,void 0,function*(){var t;if(e.length!=K(e).length)throw new o("Duplicate role id");if((null!==(t=yield Vt.count({where:{id:{[ue.in]:e}}}).catch(this.error))&&void 0!==t?t:0)!=e.length)throw new o("Invalid role id")})}};ke([v("/:id/roles"),tt(),ze(),Je("groups"),y(e=>({roles:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("roles")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],yi.prototype,"add",null),ke([c("/:id/roles"),tt(),Je(),Je("groups"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],yi.prototype,"all",null),ke([w("/:id/roles"),tt(),Ye(),Je("groups"),y(e=>({roles:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("roles")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],yi.prototype,"del",null),ke([S("/:id/roles"),tt(),Xe(),Je("groups"),y(e=>({roles:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("roles")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],yi.prototype,"set",null),yi=ke([g("/groups")],yi);let mi=class HealthController{ping(e){return Fe(this,void 0,void 0,function*(){e.json({status:"ok",timestamp:Date.now(),uptime:process.uptime()})})}};ke([O("/"),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],mi.prototype,"ping",null),mi=ke([g("/health")],mi);let fi=class LogsController extends ModelController{constructor(){super(...arguments),this.model=ti,this.permissions=["read"]}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}};ke([c(),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],fi.prototype,"all",null),fi=ke([g("/logs")],fi);let Ei=class McpController extends li{constructor(){super(...arguments),this.tools=new McpToolRegistry,this.toolsRegistered=!1,this.handler=new McpHttpHandler({sessions:new McpSessionStore(Env.MCP_SESSION_TTL),tools:this.tools,allowedHeaders:[Env.TOKEN_HEADER],allowedOrigins:Env.HTTP_CROSS.split(","),logger:{toolCall:e=>Fe(this,void 0,void 0,function*(){yield Log.info(JSON.stringify(e),"mcp")})}})}sync(e){const t=Object.create(null,{sync:{get:()=>super.sync}});return Fe(this,void 0,void 0,function*(){yield t.sync.call(this),this.toolsRegistered||(this.toolsRegistered=!0,e&&(e.instance.use((e,t,i,r)=>{if(!this.isMcpEndpoint(t))return r(e);const n=this.jsonParseErrorResponse(e);if(!n)return r(e);this.setResponseHeaders(i,t),i.status(n.status).json(n.body)}),e.instance.use((e,t,i)=>{if(!this.isMcpEndpoint(e)||!["GET","HEAD"].includes(e.method))return i();t.setHeader("Allow",St),this.setResponseHeaders(t,e),t.status(405).end()}),It(e.controllers).forEach(e=>this.tools.register(e))))})}get(e){return Fe(this,void 0,void 0,function*(){this.respond(e,this.handler.get(e))})}options(e){return Fe(this,void 0,void 0,function*(){this.respond(e,this.handler.options(e))})}post(e){return Fe(this,void 0,void 0,function*(){this.respond(e,yield this.handler.post(e))})}delete(e){return Fe(this,void 0,void 0,function*(){this.respond(e,this.handler.delete(e))})}isJsonParseError(e){if(!(e instanceof SyntaxError))return!1;const t=e;return"entity.parse.failed"===t.type||400===t.status||400===t.statusCode}isMcpEndpoint(e){const t=(e.originalUrl||e.url).split("?")[0].replace(/\/+$/g,"")||"/";return t===`${(Env.HTTP_PATH||"/").replace(/\/+$/g,"")||""}/mcp`.replace(/\/+/g,"/")||"/mcp"===t}jsonParseErrorResponse(e){if(this.isJsonParseError(e))return{status:400,body:ht(null,new McpParseError("Parse error",{message:e.message}))}}respond(e,t){var i;this.setResponseHeaders(e.res,e.req);for(const[r,n]of Object.entries(null!==(i=t.headers)&&void 0!==i?i:{}))e.res.setHeader(r,n);void 0!==t.body?e.res.status(t.status).json(t.body):e.res.status(t.status).end()}setResponseHeaders(e,t,i){const r=this.getAllowedOrigin(t);Object.entries(Object.assign(Object.assign(Object.assign(Object.assign({Allow:St},r?{"Access-Control-Allow-Origin":r}:{}),r&&"*"!==r?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":St,"Access-Control-Allow-Headers":`Content-Type, Accept, ${Env.TOKEN_HEADER}, ${Et}, ${ft}`}),null!=i?i:{})).forEach(([t,i])=>{e.setHeader(t,i)})}getAllowedOrigin(e){if(Env.HTTP_CROSS.split(",").includes("*"))return"*";const t=null==e?void 0:e.headers.origin;if(!t)return;const i=Array.isArray(t)?t[0]:t;return Env.HTTP_CROSS.split(",").includes(i)?i:void 0}};ke([c(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ei.prototype,"get",null),ke([_(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ei.prototype,"options",null),ke([v(),tt(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ei.prototype,"post",null),ke([w(),tt(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ei.prototype,"delete",null),Ei=ke([g("/mcp")],Ei);let wi=class PagesController extends CrudController{constructor(){super(...arguments),this.model=qt,this.schemaCreate={type:H.enum(Object.values(Ve)).optional(),name:H.string().optional(),description:H.string().optional(),icon:H.string().optional(),path:H.string().optional(),active:H.boolean().optional(),page_id:H.string().uuid().empty(),permission_id:H.string().uuid().empty()},this.schemaUpdate={type:H.enum(Object.values(Ve)).optional(),name:H.string().optional(),description:H.string().optional(),icon:H.string().optional(),path:H.string().optional(),active:H.boolean().optional(),page_id:H.string().uuid().empty(),permission_id:H.string().uuid().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}position(e,t){return Fe(this,void 0,void 0,function*(){const i=t.map(({id:e})=>e);yield this.ensurePages(i),yield J(t,t=>Fe(this,[t],void 0,function*({id:t,position:i}){yield qt.update({position:i},Object.assign({where:{id:t},individualHooks:!0},{ctx:e})).catch(this.error)})),e.success("OK")})}ensurePages(e){return Fe(this,void 0,void 0,function*(){var t;if(e.length!=K(e).length)throw new o("Duplicate page id");if((null!==(t=yield qt.count({where:{id:{[ue.in]:e}}}).catch(this.error))&&void 0!==t?t:0)!=e.length)throw new o("Invalid page id")})}};ke([S("/position"),tt(),Xe(),y(e=>({pages:e.array(e.object({id:e.string().uuid(),position:e.number().parse()}))})),Ne(0,p()),Ne(1,m("pages")),He("design:type",Function),He("design:paramtypes",[n,Array]),He("design:returntype",Promise)],wi.prototype,"position",null),wi=ke([g("/pages")],wi);let Si=class PermissionsController extends CrudController{constructor(){super(...arguments),this.model=Bt,this.schemaCreate={name:H.string(),permission:H.string().slugify("."),description:H.string().default(""),active:H.boolean().parse()},this.schemaUpdate={name:H.string().optional(),permission:H.string().slugify(".").optional(),description:H.string().optional(),active:H.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return Fe(this,void 0,void 0,function*(){yield e.sync.call(this),this.groupModelService=new ModelService(Wt)})}groups(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensurePermission(t),yield this.groupModelService.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],include:[{association:"roles_permissions",required:!0,attributes:[],where:{permission_id:t}}]}]}]}})})}ensurePermission(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Bt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([c("/:id/groups"),tt(),Je("groups"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Si.prototype,"groups",null),Si=ke([g("/permissions")],Si);let Oi=class ProfileController extends ModelController{constructor(){super(),this.model=Xt,this.permissions=["avatar","password"],this.path=Env.HTTP_PUBLIC+"/avatar",this.userService=new di,Env.HTTP_PUBLIC&&Ie(Env.HTTP_PUBLIC)&&!Ie(this.path)&&Re(this.path)}user(e){return Fe(this,void 0,void 0,function*(){const{groups:t,permissions:i,tenants:r,user:n}=e.req;if(!(t&&i&&r&&n))throw new s;e.json(Object.assign(Object.assign({},n.toJSON()),{groups:t,permissions:i,tenants:r}))})}avatar(e,t){return Fe(this,void 0,void 0,function*(){var i;const r=e.getFiles();if(r.file&&r.file.length){const{filename:n,path:o}=null!==(i=r.file[0])&&void 0!==i?i:{};if(n){const i=yield Xt.findOne({where:{id:t.id}}).catch(this.error);if(!i)throw je(o).isFile()&&Me(o),new s;const r=this.path+"/"+i.metadata.avatar_url;if(Ie(r)&&je(r).isFile()&&Me(r),i.changed("metadata",!0),i.metadata.avatar_url=n,yield i.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not changed")})}avatar_del(e,t){return Fe(this,void 0,void 0,function*(){const i=this.path+"/"+t.metadata.avatar_url;if(Ie(i)&&je(i).isFile()&&Me(i),t.changed("metadata",!0),t.metadata.avatar_url=null,yield t.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK");e.success("Record not changed")})}password(e,i,r,n){return Fe(this,void 0,void 0,function*(){if(!(yield this.userService.checkPassword(n.id,i)))throw new t("Invalid password");if(!(yield this.userService.canAssignPassword(n.id,r)))throw new b("Password already used");if(yield this.userService.createPassword(n.id,r,e))return e.success("OK");throw new s})}};ke([c(),tt(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Oi.prototype,"user",null),ke([v("/avatar"),tt(),et("avatar"),A({file:{count:1,path:`${Env.HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),Ne(0,p()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,Xt]),He("design:returntype",Promise)],Oi.prototype,"avatar",null),ke([w("/avatar"),tt(),et("avatar"),Ne(0,p()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,Xt]),He("design:returntype",Promise)],Oi.prototype,"avatar_del",null),ke([v("/password"),tt(),et("password"),y(e=>({oldPassword:e.string().min(5),newPassword:e.string().min(5)})),Ne(0,p()),Ne(1,m("oldPassword")),Ne(2,m("newPassword")),Ne(3,lt()),He("design:type",Function),He("design:paramtypes",[n,String,String,Xt]),He("design:returntype",Promise)],Oi.prototype,"password",null),Oi=ke([g("/profile"),He("design:paramtypes",[])],Oi);let _i=class RegisterController extends li{register(e,t,i){return Fe(this,void 0,void 0,function*(){yield Y(Env.SLEEP_REGISTRY);const{name:r,date:n,email:o,username:d,password:l,confirm:u}=t,c=d||o,p=ye(l);if(yield Xt.count({where:{[ue.or]:[{email:o},{username:c}]}}).catch(this.error))throw new a("Invalid email or username");if(p!=ye(u))throw new a("Invalid password");const h=yield Xt.create({name:r,email:o,username:c,password:p,avatar:"",date:n,description:"",status:We.PENDING}).catch(this.error);if(!h)throw new s;const g=yield Lt.create({token:yield this.getId(),active:!0,user_id:h.id}).catch(this.error);if(!g)throw yield h.destroy().catch(this.error),new s;e.success("OK"),i.emit("register.user",{ctx:e,register:g,user:h}),this.emit("register.user",{ctx:e,register:g,user:h})})}confirm(e,t,i){return Fe(this,void 0,void 0,function*(){const r=yield Lt.findOne({where:{token:t,active:!0},include:[{association:"users",required:!0}]}).catch(this.error);if(!r)throw new l;r.active=!1,yield r.save().catch(this.error),r.user.status=We.ACTIVE,yield r.user.save().catch(this.error),e.success("OK"),i.emit("register.confirm",{ctx:e,register:r,user:r.user}),this.emit("register.confirm",{ctx:e,register:r,user:r.user})})}send(e,t,i){return Fe(this,void 0,void 0,function*(){const r=t,n=yield Lt.findOne({where:{active:!0},include:[{model:Xt,required:!0,where:{[ue.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!n)throw new l;e.success("OK"),i.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})})}getId(){return Fe(this,void 0,void 0,function*(){const e=D();return(yield Lt.count({where:{token:e}}))?this.getId():e})}};ke([v(),y(e=>({name:e.string(),date:e.date(),email:e.string().email(),username:e.string().min(4).default(e.ref("email")),password:e.string().min(5),confirm:e.string().min(5)})),Ne(0,p()),Ne(1,m()),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,Object,Application]),He("design:returntype",Promise)],_i.prototype,"register",null),ke([v("/confirm"),y(e=>({token:e.string()})),Ne(0,p()),Ne(1,m("token")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],_i.prototype,"confirm",null),ke([v("/send"),y(e=>({username:e.string().min(4)})),Ne(0,p()),Ne(1,m("username")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],_i.prototype,"send",null),_i=ke([g("/register")],_i);let Ai=class RolesController extends CrudController{constructor(){super(...arguments),this.model=Vt,this.schemaCreate={name:H.string(),role:H.string().slugify("."),description:H.string().default(""),active:H.boolean().parse()},this.schemaUpdate={name:H.string().optional(),role:H.string().slugify(".").optional(),description:H.string().optional(),active:H.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return Fe(this,void 0,void 0,function*(){yield e.sync.call(this),this.groupModelService=new ModelService(Wt)})}groups(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.groupModelService.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],where:{role_id:t}}]}})})}ensureRole(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Vt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([c("/:id/groups"),tt(),Je("groups"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ai.prototype,"groups",null),Ai=ke([g("/roles")],Ai);let bi=class RolesPermissionsController extends ModelController{constructor(){super(...arguments),this.model=Bt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(i),yield this.addPermissions(e,t,i),e.success("OK")})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.findAll({ctx:e,options:{include:[{association:"roles_permissions",required:!0,attributes:[],where:{role_id:t}}]}})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(i),yield Ut.destroy(Object.assign({where:{role_id:t,permission_id:{[ue.in]:i}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(i);const r=yield this.addPermissions(e,t,i);yield Ut.destroy(Object.assign({where:{role_id:t,permission_id:{[ue.notIn]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addPermissions(e,t,i){return Fe(this,void 0,void 0,function*(){const r=[];return yield z(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Ut.findOrCreate(Object.assign({where:{role_id:t,permission_id:i},defaults:{role_id:t,permission_id:i}},{ctx:e})).catch(this.error))&&void 0!==n?n:[];s&&r.push(i)})),r})}ensurePermissions(e){return Fe(this,void 0,void 0,function*(){var t;if(e.length!=K(e).length)throw new o("Duplicate permission id");if((null!==(t=yield Bt.count({where:{id:{[ue.in]:e}}}).catch(this.error))&&void 0!==t?t:0)!=e.length)throw new o("Invalid permission id")})}ensureRole(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Vt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([v("/:id/permissions"),tt(),ze(),Xe("roles"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],bi.prototype,"add",null),ke([c("/:id/permissions"),tt(),Je(),Xe("roles"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],bi.prototype,"all",null),ke([w("/:id/permissions"),tt(),Ye(),Xe("roles"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],bi.prototype,"del",null),ke([S("/:id/permissions"),tt(),Xe(),Xe("roles"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],bi.prototype,"set",null),bi=ke([g("/roles")],bi);let Ti=class SetupController extends li{constructor(){super(...arguments),this.userService=new di}setup(e){return Fe(this,void 0,void 0,function*(){var t;if(yield Xt.count())throw new l("Endpoint not found");const i=yield Xt.create({name:"Admin",username:"admin",email:"admin@localhost.com",notes:"",status:We.ACTIVE},Object.assign({},{ctx:e})).catch(this.error);if(!i)throw new s;yield this.userService.createPassword(i.id,"admin",e);const r=yield Wt.create({name:"Admin",group:"admin",description:"",active:!0},Object.assign({},{ctx:e}));yield Yt.create({user_id:i.id,group_id:r.id},Object.assign({},{ctx:e})),yield Wt.create({name:"User",group:"user",description:"",active:!0},Object.assign({},{ctx:e}));const n=yield Vt.create({name:"Admin Permissions",role:"admin",description:"",active:!0},Object.assign({},{ctx:e}));if(!n)throw new s;yield $t.create({group_id:r.id,role_id:n.id},Object.assign({},{ctx:e}));const o=null!==(t=yield Bt.findAll({where:{active:!0}}).catch(this.error))&&void 0!==t?t:[];yield J(o,t=>Fe(this,void 0,void 0,function*(){yield Ut.create({role_id:n.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}};ke([c(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ti.prototype,"setup",null),Ti=ke([g("/setup")],Ti);let Pi=class TenantsController extends CrudController{constructor(){super(...arguments),this.model=zt,this.schemaCreate={name:H.string(),description:H.string().default(""),status:H.enum(Object.values($e)).default($e.ACTIVE)},this.schemaUpdate={name:H.string().optional(),description:H.string().optional(),status:H.enum(Object.values($e)).optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return Fe(this,void 0,void 0,function*(){yield e.sync.call(this),this.userModelService=new ModelService(Xt)})}users(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureTenant(t),yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_tenants",required:!0,attributes:[],where:{tenant_id:t}}]}})})}ensureTenant(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield zt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([c("/:id/users"),tt(),Je("users"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Pi.prototype,"users",null),Pi=ke([g("/tenants")],Pi);let Ii=class TestController extends li{json(e){return Fe(this,void 0,void 0,function*(){e.json({ok:!0,message:"hello",timestamp:Date.now()})})}workerSum(){return Fe(this,void 0,void 0,function*(){return{value:2}})}sum(e,t){return Fe(this,void 0,void 0,function*(){const{a:t,b:i}=e;return{value:t+i}})}multiply(e,t){return Fe(this,void 0,void 0,function*(){const{a:t,b:i}=e;return{value:t*i}})}average(e,t){return Fe(this,void 0,void 0,function*(){const t=e.values;return{value:t.reduce((e,t)=>e+t,0)/t.length,count:t.length}})}validationString(e,t){return Fe(this,void 0,void 0,function*(){const t=e.text;return{length:t.length,normalized:t.trim()}})}validationNumber(e,t){return Fe(this,void 0,void 0,function*(){return{doubled:2*e.value}})}validationBoolean(e,t){return Fe(this,void 0,void 0,function*(){return{active:e.active}})}validationArray(e,t){return Fe(this,void 0,void 0,function*(){return{count:e.tags.length}})}validationObject(e,t){return Fe(this,void 0,void 0,function*(){const t=e.profile;return{summary:{name:t.name,adult:t.age>=18}}})}validationEnum(e,t){return Fe(this,void 0,void 0,function*(){return{status:e.status}})}validationDate(e,t){return Fe(this,void 0,void 0,function*(){const t=e.date;return{iso:t.toISOString(),timestamp:t.getTime()}})}validationOptional(e,t){return Fe(this,void 0,void 0,function*(){const t=e.nickname;return Object.assign({name:e.name,hasNickname:Boolean(t)},t?{nickname:t}:{})})}validationDefaults(e,t){return Fe(this,void 0,void 0,function*(){return{name:e.name,limit:e.limit}})}validationParse(e,t){return Fe(this,void 0,void 0,function*(){return{active:e.active,amount:e.amount}})}validationNested(e,t){return Fe(this,void 0,void 0,function*(){const t=e.payload;return{userId:t.user.id,scoreCount:t.scores.length}})}};ke([c(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ii.prototype,"json",null),ke([Ft("test.sum"),He("design:type",Function),He("design:paramtypes",[]),He("design:returntype",Promise)],Ii.prototype,"workerSum",null),ke([xt({name:"sum",title:"Somar numeros",description:"Soma dois numeros.",input:{a:H.number().description("valor a"),b:H.number().description("valor b")},output:{value:H.number().description("resultado da soma de a + b")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"sum",null),ke([xt({name:"multiply",title:"Multiplicar numeros",description:"Multiplica dois numeros.",input:{a:H.number().description("valor a"),b:H.number().description("valor b")},output:{value:H.number().description("resultado da multiplicação de a * b")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"multiply",null),ke([xt({name:"average",title:"Calcular media",description:"Calcula a media de uma lista de numeros.",input:{values:H.array(H.number().description("numero usado no calculo da media")).min(1).max(10).description("lista de numeros para calcular a media")},output:{value:H.number().description("media calculada"),count:H.number().description("quantidade de numeros usados")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"average",null),ke([xt({name:"validation.string",title:"Validacao de string",description:"Exemplo de validacao de texto com tamanho minimo e maximo.",input:{text:H.string().min(5).max(50).description("Texto entre 5 e 50 caracteres.")},output:{length:H.number().description("Quantidade de caracteres do texto."),normalized:H.string().description("Texto normalizado sem espacos nas pontas.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationString",null),ke([xt({name:"validation.number",title:"Validacao de number",description:"Exemplo de validacao numerica com minimo e maximo.",input:{value:H.number().min(0).max(100).description("Numero entre 0 e 100.")},output:{doubled:H.number().description("Numero multiplicado por dois.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationNumber",null),ke([xt({name:"validation.boolean",title:"Validacao de boolean",description:"Exemplo de validacao de booleano sem parse implicito.",input:{active:H.boolean().description("Indica se o registro esta ativo.")},output:{active:H.boolean().description("Booleano validado.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationBoolean",null),ke([xt({name:"validation.array",title:"Validacao de array",description:"Exemplo de validacao de array com limites e item tipado.",input:{tags:H.array(H.string().min(2).max(20).description("Tag entre 2 e 20 caracteres.")).min(1).max(5).description("Lista de tags entre 1 e 5 itens.")},output:{count:H.number().description("Quantidade de tags recebidas.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationArray",null),ke([xt({name:"validation.object",title:"Validacao de object",description:"Exemplo de validacao de objeto simples.",input:{profile:H.object({name:H.string().min(2).max(60).description("Nome do perfil."),age:H.number().min(0).max(120).description("Idade do perfil."),nickname:H.string().empty().max(30).description("Apelido opcional do perfil.")}).description("Objeto de perfil.")},output:{summary:H.object({name:H.string().description("Nome validado."),adult:H.boolean().description("Indica se a idade e maior ou igual a 18.")}).description("Resumo do perfil.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationObject",null),ke([xt({name:"validation.enum",title:"Validacao de enum",description:"Exemplo de validacao de lista fechada de valores.",input:{status:H.enum(["draft","active","archived"]).description("Status permitido.")},output:{status:H.string().description("Status validado.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationEnum",null),ke([xt({name:"validation.date",title:"Validacao de date",description:"Exemplo de validacao e parse de data.",input:{date:H.date().parse().description("Data em formato aceito pelo Date.")},output:{iso:H.string().description("Data em ISO string."),timestamp:H.number().description("Data em timestamp Unix em milissegundos.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationDate",null),ke([xt({name:"validation.optional",title:"Validacao de campo opcional",description:"Exemplo de campo opcional aceitando ausencia.",input:{name:H.string().min(2).description("Nome obrigatorio."),nickname:H.string().empty().max(30).description("Apelido opcional.")},output:{name:H.string().description("Nome validado."),hasNickname:H.boolean().description("Indica se apelido foi enviado."),nickname:H.string().empty().description("Apelido validado quando enviado.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationOptional",null),ke([xt({name:"validation.defaults",title:"Validacao de valores padrao",description:"Exemplo de campos opcionais com valores padrao.",input:{name:H.string().default("guest").description("Nome opcional com valor padrao."),limit:H.number().parse().default(10).min(1).max(100).description("Limite opcional com valor padrao.")},output:{name:H.string().description("Nome final."),limit:H.number().description("Limite final.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationDefaults",null),ke([xt({name:"validation.parse",title:"Validacao com parse",description:"Exemplo de parse de boolean e number antes da validacao final.",input:{active:H.boolean().parse().default(!1).description("Booleano aceitando valores parseaveis."),amount:H.number().parse().min(1).max(1e3).description("Numero aceitando string numerica.")},output:{active:H.boolean().description("Booleano parseado."),amount:H.number().description("Numero parseado.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationParse",null),ke([xt({name:"validation.nested",title:"Validacao de objeto aninhado",description:"Exemplo de objeto aninhado com array interno.",input:{payload:H.object({user:H.object({id:H.string().min(3).max(30).description("Identificador do usuario."),email:H.string().email().description("Email do usuario.")}).description("Usuario do payload."),scores:H.array(H.number().min(0).max(100).description("Pontuacao individual.")).min(1).max(3).description("Pontuacoes do usuario.")}).description("Payload aninhado.")},output:{userId:H.string().description("Identificador validado."),scoreCount:H.number().description("Quantidade de pontuacoes.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationNested",null),Ii=ke([g("/test")],Ii);let Ci=class UsersController extends ModelController{constructor(){super(...arguments),this.model=Xt,this.userService=new di}password(e,t,i){return Fe(this,void 0,void 0,function*(){if(yield this.userService.createPassword(i,t,e))return e.success("OK");throw new l})}add(e){return Fe(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}rows(e){return Fe(this,void 0,void 0,function*(){yield this.countAll({ctx:e})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){if(i.id==t)throw new T;yield this.delete({ctx:e})})}get(e){return Fe(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return Fe(this,void 0,void 0,function*(){yield this.update({ctx:e})})}};ke([v("/:id/password"),tt(),Xe(),y(e=>({password:e.string().min(5)})),Ne(0,p()),Ne(1,m("password")),Ne(2,h("id")),He("design:type",Function),He("design:paramtypes",[n,String,String]),He("design:returntype",Promise)],Ci.prototype,"password",null),ke([v(),tt(),ze(),y(e=>({name:e.string(),email:e.string().email(),username:e.string().min(3),notes:e.string().default(""),status:e.enum(Object.values(We)).default(We.ACTIVE)})),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"add",null),ke([c(),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"all",null),ke([c("/count"),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"rows",null),ke([w("/:id"),tt(),Ye(),Ne(0,p()),Ne(1,h("id")),Ne(2,lt()),He("design:type",Function),He("design:paramtypes",[n,String,Xt]),He("design:returntype",Promise)],Ci.prototype,"del",null),ke([c("/:id"),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"get",null),ke([S("/:id"),tt(),Xe(),y(e=>({name:e.string().optional(),email:e.string().email().optional(),username:e.string().min(3).optional(),notes:e.string().optional(),status:e.enum(Object.values(We)).optional()})),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"set",null),Ci=ke([g("/users")],Ci);let xi=class UsersGroupsController extends ModelController{constructor(){super(...arguments),this.model=Wt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(i),yield this.addGroups(e,t,i),e.success("OK")})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{include:[{association:"users_groups",required:!0,attributes:[],where:{user_id:t}}]}})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(i),yield Yt.destroy(Object.assign({where:{user_id:t,group_id:{[ue.in]:i}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(i);const r=yield this.addGroups(e,t,i);yield Yt.destroy(Object.assign({where:{user_id:t,group_id:{[ue.notIn]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addGroups(e,t,i){return Fe(this,void 0,void 0,function*(){const r=[];return yield z(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Yt.findOrCreate(Object.assign({where:{user_id:t,group_id:i},defaults:{user_id:t,group_id:i}},{ctx:e})).catch(this.error))&&void 0!==n?n:[];s&&r.push(i)})),r})}ensureGroups(e){return Fe(this,void 0,void 0,function*(){var t;if(e.length!=K(e).length)throw new o("Duplicate group id");if((null!==(t=yield Wt.count({where:{id:{[ue.in]:e}}}).catch(this.error))&&void 0!==t?t:0)!=e.length)throw new o("Invalid group id")})}ensureUser(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Xt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([v("/:id/groups"),tt(),ze(),Xe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],xi.prototype,"add",null),ke([c("/:id/groups"),tt(),Je(),Xe("users"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],xi.prototype,"all",null),ke([w("/:id/groups"),tt(),Ye(),Xe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],xi.prototype,"del",null),ke([S("/:id/groups"),tt(),Xe(),Xe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],xi.prototype,"set",null),xi=ke([g("/users")],xi);let Ri=class UsersKeysController extends ModelController{constructor(){super(...arguments),this.model=si,this.permissions=["admin","audit","create","read","update","delete"]}add(e,t,i,r){return Fe(this,void 0,void 0,function*(){e.json(yield r.authService.createApiKey(e,i.name,i.expires_at,t))})}add_admin(e,t,i,r){return Fe(this,void 0,void 0,function*(){const n=yield Xt.findOne({attributes:["id"],where:{id:t}}).catch(this.error);if(!n)throw new l;e.json(yield r.authService.createApiKey(e,i.name,i.expires_at,n))})}revoke(e,t,i,r){return Fe(this,void 0,void 0,function*(){if(!(yield r.authService.revokeApiKey(e,t,i)))throw new l;e.success("OK")})}revoke_admin(e,t,i,r){return Fe(this,void 0,void 0,function*(){const n=yield Xt.findOne({attributes:["id"],where:{id:t}}).catch(this.error);if(!n||!(yield r.authService.revokeApiKey(e,i,n)))throw new l;e.success("OK")})}del(e,t,i,r){return Fe(this,void 0,void 0,function*(){if(!(yield r.authService.deleteApiKey(e,t,i)))throw new l;e.success("OK")})}del_admin(e,t,i,r){return Fe(this,void 0,void 0,function*(){const n=yield Xt.findOne({attributes:["id"],where:{id:t}}).catch(this.error);if(!n||!(yield r.authService.deleteApiKey(e,i,n)))throw new l;e.success("OK")})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t.id}}]}})})}get(e,t){return Fe(this,void 0,void 0,function*(){yield this.findOne({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t.id}}]}})})}all_admin(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t}}]}})})}get_admin(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findOne({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t}}]}})})}ensureUser(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Xt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([v("/keys"),tt(),ze(),y(e=>({name:e.string(),expires_at:e.date().min(()=>new Date).empty()})),Ne(0,p()),Ne(1,lt()),Ne(2,m()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,Xt,Object,Application]),He("design:returntype",Promise)],Ri.prototype,"add",null),ke([v("/:id/keys"),tt(),ze(),Ze("users.keys.admin"),y(e=>({name:e.string(),expires_at:e.date().min(()=>new Date).empty()})),Ne(0,p()),Ne(1,h("id")),Ne(2,m()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,Object,Application]),He("design:returntype",Promise)],Ri.prototype,"add_admin",null),ke([v("/keys/:id/revoke"),tt(),Xe(),Ne(0,p()),Ne(1,h("id")),Ne(2,lt()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,Xt,Application]),He("design:returntype",Promise)],Ri.prototype,"revoke",null),ke([v("/:id/keys/:key/revoke"),tt(),Xe(),Ze("users.keys.admin"),Ne(0,p()),Ne(1,h("id")),Ne(2,h("key")),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,String,Application]),He("design:returntype",Promise)],Ri.prototype,"revoke_admin",null),ke([w("/keys/:id"),tt(),Ye(),Ne(0,p()),Ne(1,h("id")),Ne(2,lt()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,Xt,Application]),He("design:returntype",Promise)],Ri.prototype,"del",null),ke([w("/:id/keys/:key"),tt(),Ye(),Ze("users.keys.admin"),Ne(0,p()),Ne(1,h("id")),Ne(2,h("key")),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,String,Application]),He("design:returntype",Promise)],Ri.prototype,"del_admin",null),ke([c("/keys"),tt(),Je(),Ne(0,p()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,Xt]),He("design:returntype",Promise)],Ri.prototype,"all",null),ke([c("/keys/:id"),tt(),Je(),Ne(0,p()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,Xt]),He("design:returntype",Promise)],Ri.prototype,"get",null),ke([c("/:id/keys"),tt(),Je(),Ze("users.keys.admin"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ri.prototype,"all_admin",null),ke([c("/:user/keys/:id"),tt(),Je(),Ze("users.keys.admin"),Ne(0,p()),Ne(1,h("user")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ri.prototype,"get_admin",null),Ri=ke([g("/users")],Ri);let ji=class UsersTenantsController extends ModelController{constructor(){super(...arguments),this.model=zt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(i),yield this.addTenants(e,t,i),e.success("OK")})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{include:[{association:"users_tenants",required:!0,attributes:[],where:{user_id:t}}]}})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(i),yield Gt.destroy(Object.assign({where:{user_id:t,tenant_id:{[ue.in]:i}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(i);const r=yield this.addTenants(e,t,i);yield Gt.destroy(Object.assign({where:{user_id:t,tenant_id:{[ue.notIn]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addTenants(e,t,i){return Fe(this,void 0,void 0,function*(){const r=[];return yield z(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Gt.findOrCreate(Object.assign({where:{user_id:t,tenant_id:i},defaults:{user_id:t,tenant_id:i}},{ctx:e})).catch(this.error))&&void 0!==n?n:[];s&&r.push(i)})),r})}ensureTenants(e){return Fe(this,void 0,void 0,function*(){var t;if(e.length!=K(e).length)throw new o("Duplicate tenant id");if((null!==(t=yield zt.count({where:{id:{[ue.in]:e}}}).catch(this.error))&&void 0!==t?t:0)!=e.length)throw new o("Invalid tenant id")})}ensureUser(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Xt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([v("/:id/tenants"),tt(),ze(),Xe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],ji.prototype,"add",null),ke([c("/:id/tenants"),tt(),Je(),Xe("users"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],ji.prototype,"all",null),ke([w("/:id/tenants"),tt(),Ye(),Xe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],ji.prototype,"del",null),ke([S("/:id/tenants"),tt(),Xe(),Xe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],ji.prototype,"set",null),ji=ke([g("/users")],ji);export{Application,Ht as Audit,Qt as AuditModel,qe as AuditTypes,ui as AuditsController,ci as AuthController,ai as AuthService,li as BaseController,ze as CanCreate,Ye as CanDelete,Je as CanRead,Xe as CanUpdate,Config,Zt as ConfigModel,CrudController,Env,pi as FilesController,hi as ForgotController,ei as ForgotModel,Wt as GroupModel,$t as GroupRoleModel,Be as GroupTypes,gi as GroupsController,vi as GroupsPermissionsController,yi as GroupsRolesController,Qe as HasGroups,Ze as HasPermissions,et as HasScope,mi as HealthController,tt as IsAuthenticated,Log,Ue as LogLevels,ti as LogModel,Loggable,fi as LogsController,mt as MCP_DEFAULT_PROTOCOL_VERSION,St as MCP_HTTP_ALLOW,wt as MCP_HTTP_ALLOWED_METHODS,Ot as MCP_HTTP_DEFAULT_ALLOWED_HEADERS,ft as MCP_PROTOCOL_VERSION_HEADER,Et as MCP_SESSION_ID_HEADER,yt as MCP_SUPPORTED_PROTOCOL_VERSIONS,bt as MCP_TOOL_METADATA,Ei as McpController,McpError,ut as McpErrorCode,McpHttpHandler,McpInternalError,McpInvalidParamsError,McpInvalidRequestError,McpInvalidSessionError,McpMethodNotFoundError,McpParseError,McpServerError,McpSessionStore,xt as McpTool,McpToolNotFoundError,McpToolRegistry,ii as MigrationModel,ModelController,ModelService,qt as PageModel,Ve as PageTypes,wi as PagesController,Bt as PermissionModel,Si as PermissionsController,Oi as ProfileController,_i as RegisterController,Lt as RegisterModel,Ft as RegisterWorker,it as ReqAccess,rt as ReqGroup,nt as ReqGroups,st as ReqPermission,ot as ReqPermissions,dt as ReqTenant,at as ReqTenants,lt as ReqUser,Vt as RoleModel,Ut as RolePermissionModel,Ai as RolesController,bi as RolesPermissionsController,Secret,ri as SecretModel,oi as Service,ni as SessionModel,SessionStore,Ti as SetupController,zt as TenantModel,$e as TenantStatus,Pi as TenantsController,Ii as TestController,Kt as UserAuthModel,Yt as UserGroupModel,si as UserKeyModel,Xt as UserModel,Jt as UserPasswordModel,di as UserService,We as UserStatus,Gt as UserTenantModel,Ci as UsersController,xi as UsersGroupsController,Ri as UsersKeysController,ji as UsersTenantsController,WorkerRegistry,Tt as assertValidMcpToolDefinition,Ge as canFactory,It as discoverMcpTools,Pt as getMcpToolMetadata,_t as isJsonParseError,ct as isJsonRpcId,At as jsonParseErrorResponse,ht as jsonRpcError,gt as jsonRpcErrorFromCode,pt as jsonRpcResult,vt as parseJsonRpcRequest,Ke as sequelize};
|
|
7
|
+
import{Use as e,HttpUnauthorizedError as t,parameterFactory as i,HttpError as r,Context as n,HttpInternalServerError as s,HttpValidationError as o,HttpStatusCodeByName as d,HttpBadRequestError as a,HttpNotFoundError as l,Application as u,Get as c,Ctx as p,Params as h,Controller as g,Post as v,ValidateBody as y,Body as m,App as f,Middleware as E,Delete as w,Put as S,All as O,Options as _,Upload as A,HttpConflictError as b,HttpForbiddenError as T}from"@andrewcaires/express";import{isUndefined as P,isFunction as I,slugify as C,includesArray as x,isPlainObject as R,isString as j,isNumber as M,uuidv7 as D,isArray as k,isValidationShape as N,Validation as H,getConstructor as F,noop as L,uniqueArray as K,isNull as q,uniqueID as B,createApiKey as U,clamp as V,merge as $,clone as W,upperCamelCase as G,forEachAsync as z,sleep as Y,forEachSeries as J,EventEmitter as Q,isDef as X}from"@andrewcaires/utils.js";import{WebSocketServer as Z}from"ws";import{Sequelize as ee,Hooks as te,Column as ie,Association as re,Database as ne,ModelName as se,Version as oe,Model as de,DefaultValue as ae,Index as le,Op as ue,Where as ce}from"@andrewcaires/sequelize";import{Env as pe,Log as he,LogColor as ge,Encryptor as ve,sha256 as ye}from"@andrewcaires/node";import{config as me}from"dotenv";import{metadata as fe,isClassMethodDecoratorContext as Ee,Trait as we,Singleton as Se}from"@andrewcaires/decorator";import{Store as Oe}from"express-session";import _e from"jsonwebtoken";import{createHmac as Ae,timingSafeEqual as be}from"node:crypto";import{verify as Te,hashSync as Pe}from"@node-rs/argon2";import{existsSync as Ie,statSync as Ce,readdirSync as xe,mkdirSync as Re,lstatSync as je,rmSync as Me}from"node:fs";import{join as De}from"node:path";function ke(e,t,i,r){var n,s=arguments.length,o=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,i):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)o=Reflect.decorate(e,t,i,r);else for(var d=e.length-1;d>=0;d--)(n=e[d])&&(o=(s<3?n(o):s>3?n(t,i,o):n(t,i))||o);return s>3&&o&&Object.defineProperty(t,i,o),o}function Ne(e,t){return function(i,r){t(i,r,e)}}function He(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function Fe(e,t,i,r){return new(i||(i=Promise))(function(n,s){function o(e){try{a(r.next(e))}catch(e){s(e)}}function d(e){try{a(r.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?n(e.value):(t=e.value,t instanceof i?t:new i(function(e){e(t)})).then(o,d)}a((r=r.apply(e,t||[])).next())})}var Le;"function"==typeof SuppressedError&&SuppressedError,me({quiet:!0});class Env extends pe{}Le=Env,Env.AUDIT_IGNORE=Le.getString("AUDIT_IGNORE","hash,password").split(","),Env.BASE_NAME=Le.getString("BASE_NAME",""),Env.CONSOLE_ERROR=Le.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=Le.getString("DATABASE_URI","",!0),Env.DATABASE_LOG=Le.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=Le.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=Le.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=Le.getString("DATABASE_TIMEZONE","+00:00"),Env.ENCRYPTION_SECRET=Le.getString("ENCRYPTION_SECRET",""),Env.HTTP_CROSS=Le.getString("HTTP_CROSS",""),Env.HTTP_HYBRID=Le.getBool("HTTP_HYBRID",!1),Env.HTTP_NOTFOUND=Le.getString("HTTP_NOTFOUND",""),Env.HTTP_PATH=Le.getString("HTTP_PATH","/api"),Env.HTTP_PORT=Le.getInt("HTTP_PORT",Le.getInt("PORT",3e3)),Env.HTTP_PUBLIC=Le.getString("HTTP_PUBLIC",""),Env.HTTP_REDIRECT=Le.getString("HTTP_REDIRECT",""),Env.HTTP_TLS_CA=Le.getFile("HTTP_TLS_CA"),Env.HTTP_TLS_CRT=Le.getFile("HTTP_TLS_CRT"),Env.HTTP_TLS_KEY=Le.getFile("HTTP_TLS_KEY"),Env.MODEL_LIMIT=Le.getInt("MODEL_LIMIT",10),Env.MODEL_LIMIT_MAX=Le.getInt("MODEL_LIMIT_MAX",100),Env.MCP_SESSION_TTL=Le.getMs("MCP_SESSION_TTL","30m"),Env.PASSWORD_ALGORITHM=Le.getInt("PASSWORD_ALGORITHM",2),Env.PASSWORD_MEMORY_COST=Le.getInt("PASSWORD_MEMORY_COST",4096),Env.PASSWORD_PARALLELISM=Le.getInt("PASSWORD_PARALLELISM",1),Env.PASSWORD_PEPPER=Le.getString("PASSWORD_PEPPER",""),Env.PASSWORD_REUSE=Le.getBool("PASSWORD_REUSE",!0),Env.PASSWORD_TIME_COST=Le.getInt("PASSWORD_TIME_COST",3),Env.SLEEP_AUTH=Le.getMs("SLEEP_AUTH","2s"),Env.SLEEP_FORGOT=Le.getMs("SLEEP_FORGOT","5s"),Env.SLEEP_REGISTRY=Le.getMs("SLEEP_REGISTRY","5s"),Env.TENANT_HEADER=Le.getString("TENANT_HEADER","X-Tenant-ID").toLowerCase(),Env.TOKEN_COOKIE=Le.getString("TOKEN_COOKIE",Le.getString("TOKEN_HEADER","authorization")).toLowerCase(),Env.TOKEN_COOKIE_SET=Le.getBool("TOKEN_COOKIE_SET",!0),Env.TOKEN_HEADER=Le.getString("TOKEN_HEADER","authorization"),Env.TOKEN_PEPPER=Le.getString("TOKEN_PEPPER",""),Env.TOKEN_PREFIX=Le.getString("TOKEN_PREFIX","api"),Env.TOKEN_QUERY=Le.getString("TOKEN_QUERY","api_key"),Env.TOKEN_SECRET=Le.getString("TOKEN_SECRET",""),Env.TOKEN_TTL=Le.getMs("TOKEN_TTL","1d"),Env.TOKEN_TTL_FORGOT=Le.getMs("TOKEN_TTL_FORGOT","1d"),Env.TOKEN_TTL_RENEW=Le.getMs("TOKEN_TTL_RENEW","1d"),Env.TOKEN_TYPE=Le.getString("TOKEN_TYPE","bearer"),Env.API_BODYPARSER_STRICT=Le.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=Le.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=Le.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=Le.getString("API_BODYPARSER_TYPE","json"),Env.API_SESSION_NAME=Le.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=Le.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=Le.getString("API_SESSION_SECRET","yoursecret"),Env.API_WEBSOCKET_START=Le.getBool("API_WEBSOCKET_START",!1);const Ke=new ee({uri:Env.DATABASE_URI,logging:Env.DATABASE_LOG,prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE});var qe,Be,Ue,Ve,$e,We;!function(e){e.CREATE="CREATE",e.DELETE="DELETE",e.UPDATE="UPDATE"}(qe||(qe={})),function(e){e.SYSTEM="system",e.TENANT="tenant"}(Be||(Be={})),function(e){e.INFO="info",e.WARN="warn",e.ERROR="error"}(Ue||(Ue={})),function(e){e.PAGE="page",e.GROUP="group",e.DIVIDER="divider",e.HIDDEN="hidden",e.EXTERNAL="external"}(Ve||(Ve={})),function(e){e.ACTIVE="active",e.PENDING="pending",e.SUSPENDED="suspended",e.DISABLED="disabled",e.ARCHIVED="archived"}($e||($e={})),function(e){e.ACTIVE="active",e.PENDING="pending",e.DISABLED="disabled",e.LOCKED="locked",e.ARCHIVED="archived"}(We||(We={}));const Ge=i=>r=>(n,s,o)=>{e(e=>Fe(void 0,void 0,void 0,function*(){var n;const s=P(r)?I(e.controller.name)?e.controller.name():null===(n=e.controller.constructor)||void 0===n?void 0:n.name:r,{permissions:o=[]}=e.req;if(!o.includes(C(`${s}.${i}`,".")))throw new t("Access denied");e.next()}))(n,s,o)},ze=Ge("create"),Ye=Ge("delete"),Je=Ge("read"),Qe=Ge("update"),Xe=(...i)=>(r,n,s)=>{e(e=>Fe(void 0,void 0,void 0,function*(){const{groups:r=[]}=e.req;if(x(i,r))return e.next();throw new t("Access denied")}))(r,n,s)},Ze=(...i)=>(r,n,s)=>{e(e=>Fe(void 0,void 0,void 0,function*(){const{permissions:r=[]}=e.req;if(x(i,r))return e.next();throw new t("Access denied")}))(r,n,s)},et=i=>(r,n,s)=>{e(e=>Fe(void 0,void 0,void 0,function*(){var r;const n=I(e.controller.name)?e.controller.name():null===(r=e.controller.constructor)||void 0===r?void 0:r.name,{permissions:s=[]}=e.req;if(s.includes(`${n}.${i}`))return e.next();throw new t("Access denied")}))(r,n,s)},tt=()=>(t,i,r)=>{e(e=>Fe(void 0,void 0,void 0,function*(){if(e.req.access&&e.req.user)return e.next();const{authService:t}=e.app;yield t.apiAuth(e),e.next()}))(t,i,r)},it=i(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.access}),rt=i(({ctx:e,key:t})=>{var i,r;return(null!==(r=null===(i=e.req)||void 0===i?void 0:i.groups)&&void 0!==r?r:[]).includes(t)}),nt=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==i?i:[]}),st=i(({ctx:e,key:t})=>{var i,r;return(null!==(r=null===(i=e.req)||void 0===i?void 0:i.permissions)&&void 0!==r?r:[]).includes(t)}),ot=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==i?i:[]}),dt=i(({ctx:e})=>{var t;return null!==(t=e.getHeader(Env.TENANT_HEADER))&&void 0!==t?t:null}),at=i(({ctx:e})=>{var t,i;return null!==(i=null===(t=e.req)||void 0===t?void 0:t.tenants)&&void 0!==i?i:[]}),lt=i(({ctx:e,key:t})=>{var i;return t&&e.req.user&&t in e.req.user?e.req.user[t]:null===(i=e.req)||void 0===i?void 0:i.user}),ut={ParseError:-32700,InvalidRequest:-32600,MethodNotFound:-32601,InvalidParams:-32602,InternalError:-32603,ServerError:-32e3,InvalidSession:-32001};class McpError extends r{constructor(e,t=ut.ServerError,i=200,r){super(e,i),this.code=t,this.data=r,this.name=this.constructor.name}}class McpParseError extends McpError{constructor(e="Parse error",t){super(e,ut.ParseError,400,t)}}class McpInvalidRequestError extends McpError{constructor(e="Invalid Request",t){super(e,ut.InvalidRequest,400,t)}}class McpMethodNotFoundError extends McpError{constructor(e){super(`Method not found: ${e}`,ut.MethodNotFound,200)}}class McpInvalidParamsError extends McpError{constructor(e="Invalid params",t){super(e,ut.InvalidParams,200,t)}}class McpInternalError extends McpError{constructor(e="Internal error",t){super(e,ut.InternalError,200,t)}}class McpServerError extends McpError{constructor(e="Server error",t){super(e,ut.ServerError,500,t)}}class McpInvalidSessionError extends McpError{constructor(e="Invalid MCP session",t=404){super(e,ut.InvalidSession,t)}}class McpToolNotFoundError extends McpError{constructor(e){super("Tool not found",ut.InvalidParams,200,{toolName:e})}}const ct=e=>j(e)||M(e),pt=(e,t)=>({jsonrpc:"2.0",id:e,result:t}),ht=(e,t)=>({jsonrpc:"2.0",id:e,error:Object.assign({code:t.code,message:t.message},void 0!==t.data?{data:t.data}:{})}),gt=(e,t,i,r)=>({jsonrpc:"2.0",id:e,error:Object.assign({code:t,message:i},void 0!==r?{data:r}:{})}),vt=e=>{if(!R(e))throw new McpInvalidRequestError("Invalid Request");if("2.0"!==e.jsonrpc)throw new McpInvalidRequestError("Invalid JSON-RPC version");if(!j(e.method))throw new McpInvalidRequestError("Invalid method");if(void 0!==e.id&&!ct(e.id))throw new McpInvalidRequestError("Invalid id");return e},yt=["2025-11-25","2025-06-18"],mt=yt[0],ft="MCP-Protocol-Version",Et="MCP-Session-Id",wt=["POST","DELETE","OPTIONS"],St=wt.join(", "),Ot=["Content-Type","Accept",Et,ft],_t=e=>{if(!(e instanceof SyntaxError))return!1;const t=e;return"entity.parse.failed"===t.type||400===t.status||400===t.statusCode},At=e=>{if(_t(e))return{status:400,body:ht(null,new McpParseError("Parse error",{message:e.message}))}};class McpHttpHandler{constructor(e){var t,i,r;this.sessions=e.sessions,this.tools=e.tools,this.logger=e.logger,this.serverName=null!==(t=e.serverName)&&void 0!==t?t:"andrewcaires-api-mcp",this.serverVersion=null!==(i=e.serverVersion)&&void 0!==i?i:"1.0.0",this.allowedHeaders=this.normalizeAllowedHeaders(e.allowedHeaders).join(", "),this.allowedOrigins=(null===(r=e.allowedOrigins)||void 0===r?void 0:r.length)?e.allowedOrigins:["*"]}post(e){return Fe(this,void 0,void 0,function*(){var t;let i=null;try{const r=vt(this.getBody(e));if(i=null!==(t=r.id)&&void 0!==t?t:null,"initialize"===r.method)return this.withTransportHeaders(this.initialize(r.id,r.params,e),e);if("notifications/initialized"===r.method)return this.withTransportHeaders(this.initialized(r.id,r.params,e),e);if("ping"===r.method)return this.validateObjectParams(r.params),this.withTransportHeaders(this.withSession(r.id,e,e=>({status:200,body:pt(e,{})})),e);if("tools/list"===r.method)return this.validateObjectParams(r.params),this.withTransportHeaders(this.withInitializedSession(r.id,e,e=>({status:200,body:pt(e,{tools:this.tools.list()})})),e);if("tools/call"===r.method)return this.withTransportHeaders(yield this.callTool(r.id,r.params,e),e);if(void 0===r.id)return this.withTransportHeaders({status:202},e);throw new McpMethodNotFoundError(r.method)}catch(t){return this.withTransportHeaders(this.errorResponse(i,t),e)}})}delete(e){const t=this.getHeader(e,Et);if(!t)return this.withTransportHeaders(this.errorResponse(null,new McpInvalidSessionError(`${Et} header is required`,400)),e);return this.sessions.get(t)?(this.sessions.delete(t),this.withTransportHeaders({status:204},e)):this.withTransportHeaders(this.errorResponse(null,new McpInvalidSessionError),e)}get(e){return this.withTransportHeaders({status:405},e)}options(e){return this.withTransportHeaders({status:204},e)}initialize(e,t,i){const r=this.requireRequestId({jsonrpc:"2.0",id:e,method:"initialize",params:t}),n=this.negotiateProtocolVersion(t),s=this.sessions.create(n);return Object.assign(s,this.getAuthContext(i)),{status:200,headers:{[Et]:s.sessionId,[ft]:s.protocolVersion},body:pt(r,{protocolVersion:s.protocolVersion,capabilities:{tools:{listChanged:!1}},serverInfo:{name:this.serverName,version:this.serverVersion}})}}initialized(e,t,i){if(void 0!==e)throw new McpInvalidRequestError("notifications/initialized must not include id");this.validateObjectParams(t);const r=this.requireSession(i);return this.sessions.markInitialized(r.sessionId),{status:202}}callTool(e,t,i){return Fe(this,void 0,void 0,function*(){return this.withInitializedSession(e,i,(e,i)=>Fe(this,void 0,void 0,function*(){var r;const n=this.parseToolCallParams(t),s=Date.now();let o,d=!1;try{const t=yield this.tools.call(n.name,n.arguments,i);return d=!t.isError,o=t.isError?"Tool execution failed":void 0,{status:200,body:pt(e,t)}}catch(e){if(e instanceof McpError)throw o=e.message,e;throw o="Internal error",e}finally{null===(r=this.logger)||void 0===r||r.toolCall(Object.assign({sessionId:i.sessionId,toolName:n.name,durationMs:Date.now()-s,success:d},o?{error:o}:{}))}}))})}requireRequestId(e){if(!ct(e.id))throw new McpInvalidRequestError("Request id is required");return e.id}withSession(e,t,i){const r=this.requireRequestId({jsonrpc:"2.0",id:e,method:"session"}),n=this.requireSession(t),s=this.getHeader(t,ft);if(s&&s!==n.protocolVersion)throw new McpInvalidRequestError(`${ft} does not match the initialized session`);return i(r,n)}withInitializedSession(e,t,i){return this.withSession(e,t,(e,t)=>{if(!t.initialized)throw new McpInvalidRequestError("Session not initialized");return i(e,t)})}requireSession(e){const t=this.getHeader(e,Et);if(!t)throw new McpInvalidSessionError(`${Et} header is required`,400);return this.sessions.require(t)}negotiateProtocolVersion(e){if(!R(e)||!j(e.protocolVersion))throw new McpInvalidParamsError("params.protocolVersion is required");return yt.includes(e.protocolVersion)?e.protocolVersion:mt}parseToolCallParams(e){if(!R(e)||!j(e.name))throw new McpInvalidParamsError("params.name is required");return{name:e.name,arguments:e.arguments}}validateObjectParams(e){if(void 0!==e&&!R(e))throw new McpInvalidParamsError("params must be an object")}withTransportHeaders(e,t){var i;const r=this.getAllowedOrigin(t);return Object.assign(Object.assign({},e),{headers:Object.assign(Object.assign(Object.assign(Object.assign({Allow:St},r?{"Access-Control-Allow-Origin":r}:{}),r&&"*"!==r?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":St,"Access-Control-Allow-Headers":this.allowedHeaders}),null!==(i=e.headers)&&void 0!==i?i:{})})}errorResponse(e,t){if(t instanceof McpError)return{status:t.status,body:ht(e,t)};const i=new McpServerError;return{status:i.status,body:ht(e,i)}}getBody(e){return"function"==typeof e.getBody?e.getBody():e.body}getHeader(e,t){var i,r,n;const s=null!==(i=e.req)&&void 0!==i?i:e.request,o=this.getHeaderFromRequest(s,t);if(o)return o;const d=this.getHeaderFromRecord(e.headers,t);if(d)return d;if("function"==typeof e.getHeaders){const i=this.getHeaderFromRecord(e.getHeaders(),t);if(i)return i}return"function"==typeof e.getHeader&&null!==(n=null!==(r=e.getHeader(t))&&void 0!==r?r:e.getHeader(t.toLowerCase()))&&void 0!==n?n:""}getHeaderFromRequest(e,t){if(!e||"object"!=typeof e)return"";const i=e;if("function"==typeof i.get){const e=this.normalizeHeaderValue(i.get(t));if(e)return e}if("function"==typeof i.header){const e=this.normalizeHeaderValue(i.header(t));if(e)return e}return this.getHeaderFromRecord(i.headers,t)}getHeaderFromRecord(e,t){if(!e)return"";const i=t.toLowerCase(),r=Object.keys(e).find(e=>e.toLowerCase()===i),n=r?e[r]:void 0;return this.normalizeHeaderValue(n)}normalizeHeaderValue(e){var t,i,r;return Array.isArray(e)?null!==(i=null===(t=e[0])||void 0===t?void 0:t.toString())&&void 0!==i?i:"":null!==(r=null==e?void 0:e.toString())&&void 0!==r?r:""}normalizeAllowedHeaders(e=[]){const t=["Content-Type","Accept",...e.map(e=>e.toLowerCase()),Et,ft];return t.filter((e,i)=>Boolean(e)&&t.findIndex(t=>t.toLowerCase()===e.toLowerCase())===i)}getAllowedOrigin(e){if(this.allowedOrigins.includes("*"))return"*";if(!e)return;const t=this.getHeader(e,"Origin");return this.allowedOrigins.includes(t)?t:void 0}getAuthContext(e){var t,i,r;const n=null!==(i=null!==(t=e.req)&&void 0!==t?t:e.context)&&void 0!==i?i:{},s=n.user,o="string"==typeof n.userId?n.userId:null===(r=null==s?void 0:s.id)||void 0===r?void 0:r.toString();return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},n.access?{access:n.access}:{}),n.groups?{groups:n.groups}:{}),n.permissions?{permissions:n.permissions}:{}),n.tenants?{tenants:n.tenants}:{}),n.user?{user:n.user}:{}),o?{userId:o}:{})}}class McpSessionStore{constructor(e=18e5,t=()=>Date.now()){this.sessions=new Map,this.ttl=e,this.now=t}create(e){this.cleanup();const t=this.now(),i={sessionId:D(),createdAt:t,expiresAt:t+this.ttl,protocolVersion:e,initialized:!1};return this.sessions.set(i.sessionId,i),i}get(e){this.cleanup();const t=this.sessions.get(e);if(t){if(!this.isExpired(t))return t;this.sessions.delete(e)}}require(e){const t=this.get(e);if(!t)throw new McpInvalidSessionError;return t}markInitialized(e){const t=this.require(e);return t.initialized=!0,t}delete(e){return this.cleanup(),this.sessions.delete(e)}cleanup(){const e=this.now();for(const[t,i]of this.sessions)i.expiresAt<=e&&this.sessions.delete(t)}size(){return this.cleanup(),this.sessions.size}isExpired(e){return e.expiresAt<=this.now()}}const bt=Symbol.for("@andrewcaires/api:mcp:tool"),Tt=e=>{if(!j(e.name)||!e.name.trim())throw new Error("MCP tool name is required");if(!j(e.title)||!e.title.trim())throw new Error(`MCP tool "${e.name}" title is required`);if(!j(e.description)||!e.description.trim())throw new Error(`MCP tool "${e.name}" description is required`);if(P(e.input))throw new Error(`MCP tool "${e.name}" input must be declared`)},Pt=e=>{const t=fe(bt,e,[]);return t.length||"function"==typeof e?t:fe(bt,Object.getPrototypeOf(e),[])},It=e=>{const t=[];for(const i of e)for(const e of Pt(i))t.push(Ct(i,e));return t},Ct=(e,t)=>{const i=e[t.propertyKey];if(!I(i))throw new Error(`MCP tool "${t.name}" handler was not found`);return Tt(t),Object.assign(Object.assign(Object.assign({name:t.name,title:t.title,description:t.description},void 0!==t.input?{input:t.input}:{}),void 0!==t.output?{output:t.output}:{}),{run:(t,r)=>i.call(e,t,r)})};class McpToolRegistry{constructor(e=[]){this.tools=new Map,e.forEach(e=>this.register(e))}register(e){var t,i;if(Tt(e),this.tools.has(e.name))throw new Error(`Duplicate MCP tool name: ${e.name}`);const r=this.normalizeMcpValidation(null!==(t=e.input)&&void 0!==t?t:{},"object"),n=e.output?this.normalizeMcpValidation(null!==(i=e.output)&&void 0!==i?i:{},"any"):void 0;this.tools.set(e.name,{inputSchema:this.normalizeSchema(r.schema),inputValidation:r.validation,outputSchema:(null==n?void 0:n.schema)?this.normalizeSchema(n.schema):void 0,outputValidation:null==n?void 0:n.validation,tool:e})}list(){return Array.from(this.tools.values()).map(({tool:e})=>{var t,i,r,n;return Object.assign({name:e.name,title:e.title,description:e.description,inputSchema:null!==(i=null===(t=this.tools.get(e.name))||void 0===t?void 0:t.inputSchema)&&void 0!==i?i:{}},(null===(r=this.tools.get(e.name))||void 0===r?void 0:r.outputSchema)?{outputSchema:null===(n=this.tools.get(e.name))||void 0===n?void 0:n.outputSchema}:{})})}call(e,t,i){return Fe(this,void 0,void 0,function*(){var r;const n=this.tools.get(e);if(!n)throw new McpToolNotFoundError(e);const s=null!=t?t:{};if(!R(s))return this.toolInputValidationError(["arguments must be an object"]);const o=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({session:i},i.access?{access:i.access}:{}),i.groups?{groups:i.groups}:{}),i.permissions?{permissions:i.permissions}:{}),i.tenants?{tenants:i.tenants}:{}),i.user?{user:i.user}:{}),i.userId?{userId:i.userId}:{});let d=s;const a=this.validateAdditionalProperties(n.inputSchema,s);if(a.length)return this.toolInputValidationError(a);if(n.inputValidation){const e=n.inputValidation.validate(s,o);if(e.error)return this.toolInputValidationError([e.error]);d=null!==(r=e.value)&&void 0!==r?r:{}}try{const e=yield n.tool.run(d,o);if(!n.outputValidation&&this.isCallToolResult(e))return e;let t=e;if(n.outputValidation){const i=n.outputValidation.validate(e,o);if(i.error)return this.outputValidationError();t=i.value}return{content:[{type:"text",text:JSON.stringify(t)}],structuredContent:t}}catch(e){return{isError:!0,content:[{type:"text",text:"Tool execution failed."}]}}})}isCallToolResult(e){return R(e)&&k(e.content)}normalizeMcpValidation(e,t="object"){if(N(e)){const t=H.object(e).parse();return{schema:t.toSchema(),validation:t}}const i="object"===t?H.object({}).parse():H.any();return{schema:i.toSchema(),validation:i}}normalizeSchema(e){if(k(e))return e.map(e=>this.normalizeSchema(e));if(!R(e))return e;const t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,this.normalizeSchema(t)]));if(k(t.type)){const e=t.type.filter(e=>"null"!==e);t.type=1===e.length?e[0]:e}return t}outputValidationError(){return{isError:!0,content:[{type:"text",text:"Tool output validation failed."}]}}toolInputValidationError(e){return{isError:!0,content:[{type:"text",text:"Invalid tool arguments."}],structuredContent:{errors:e}}}validateAdditionalProperties(e,t){if("object"!==e.type||!1!==e.additionalProperties||!R(e.properties))return[];const i=Object.keys(e.properties);return Object.keys(t).filter(e=>!i.includes(e)).map(e=>`additional property "${e}" is not allowed`)}}const xt=e=>(Tt(e),(t,i)=>{Ee(i)?i.addInitializer(function(){Rt(this.constructor,i.name,e)}):Rt(t,i,e)}),Rt=(e,t,i)=>{const r=fe(bt,e,[]),n=Object.assign(Object.assign({},i),{propertyKey:t});r.some(e=>e.propertyKey===n.propertyKey&&e.name===n.name)||r.push(n)},jt=(e,t,i)=>{var r,s,o,d,a,l,u,c,p,h,g;const v=i.ctx instanceof n?i.ctx:null,y=null!==(r=null==v?void 0:v.id)&&void 0!==r?r:null,m=null!==(a=null!==(d=null===(o=null===(s=null==v?void 0:v.req)||void 0===s?void 0:s.user)||void 0===o?void 0:o.id)&&void 0!==d?d:i.user_id)&&void 0!==a?a:null,f={type:e,model:null!==(l=null==t?void 0:t.getTableName())&&void 0!==l?l:null,source:null!==(u=Env.BASE_NAME)&&void 0!==u?u:"",request_id:y,user_id:m};return v?Object.assign(Object.assign({},f),{full_url:null!==(c=v.getUrl())&&void 0!==c?c:"",ip_address:null!==(p=v.getIp())&&void 0!==p?p:"",user_agent:null!==(g=null===(h=v.req)||void 0===h?void 0:h.headers["user-agent"])&&void 0!==g?g:""}):f},Mt=e=>{const t=F(e),i=t.primaryKeyAttribute;return{model:t,record_id:i?e.getDataValue(i):null}},Dt=(e,t)=>Fe(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:i,record_id:r}=Mt(e),n=Object.entries(e.toJSON()),s=Object.fromEntries(n.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield Xt.create(Object.assign(Object.assign({},jt(qe.CREATE,i,t)),{record:r,currently:s})).catch(he.catch)}),kt=(e,t)=>Fe(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:i,record_id:r}=Mt(e),n={},s={},o=e.changed();o&&o.length&&o.filter(e=>!Env.AUDIT_IGNORE.includes(e)).forEach(t=>{n[t]=e.getDataValue(t),s[t]=e.previous(t)}),yield Xt.create(Object.assign(Object.assign({},jt(qe.UPDATE,i,t)),{record:r,currently:n,previously:s})).catch(he.catch)}),Nt=(e,t)=>Fe(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:i,record_id:r}=Mt(e),n=Object.entries(e.toJSON()),s=Object.fromEntries(n.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield Xt.create(Object.assign(Object.assign({},jt(qe.DELETE,i,t)),{record:r,currently:s})).catch(he.catch)}),Ht=e=>(P(e)&&(e=Env.DATABASE_AUDIT),te(e?{afterCreate:Dt,afterUpdate:kt,afterDestroy:Nt}:{}));class WorkerRegistry{static register(e,t){const i=WorkerRegistry.normalizeWorkerName(e);if(!i)throw new Error("Worker name is required.");if(WorkerRegistry.workers.has(i))throw new Error(`Worker "${i}" is already registered.`);WorkerRegistry.workers.set(i,{name:i,handler:t})}static registerClass(e,t){WorkerRegistry.register(e,()=>Fe(this,void 0,void 0,function*(){const e=new t;yield e.handler()}))}static registerMethod(e,t,i){const r=I(t),n=t.constructor;WorkerRegistry.register(e,()=>Fe(this,void 0,void 0,function*(){const e=r?t:new n,s=e[i];if(!I(s))throw new Error(`Worker method "${String(i)}" is not callable.`);yield s.call(e)}))}static start(e){return Fe(this,void 0,void 0,function*(){const t=WorkerRegistry.get(e);yield t.handler()})}static list(){const e=new Set(WorkerRegistry.workers.values());return Array.from(e).map(e=>{var{handler:t}=e,i=function(e,t){var i={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(i[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(r=Object.getOwnPropertySymbols(e);n<r.length;n++)t.indexOf(r[n])<0&&Object.prototype.propertyIsEnumerable.call(e,r[n])&&(i[r[n]]=e[r[n]])}return i}(e,["handler"]);return Object.assign({},i)})}static names(){return WorkerRegistry.list().map(({name:e})=>e).sort()}static get(e){var t;const i=WorkerRegistry.normalizeStartName(e),r=null!==(t=WorkerRegistry.workers.get(i))&&void 0!==t?t:Array.from(WorkerRegistry.workers.values()).find(e=>WorkerRegistry.normalizeStartName(e.name)===i);if(!r)throw new Error(`Worker "${e}" not found. Available workers: ${WorkerRegistry.names().join(", ")}`);return r}static normalizeStartName(e){return C(e,"-")}static normalizeWorkerName(e){return e.trim()}}WorkerRegistry.workers=new Map;const Ft=e=>(t,i,r)=>{if(void 0===i)WorkerRegistry.registerClass(e,t);else{if(!I(null==r?void 0:r.value))throw new Error(`Worker method "${String(i)}" is not callable.`);WorkerRegistry.registerMethod(e,t,i)}};let Lt=class RegisterModel extends de{};ke([ie.Id(7),He("design:type",String)],Lt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Lt.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Number)],Lt.prototype,"expired_at",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Lt.prototype,"active",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Lt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Lt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Lt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Qt),He("design:type",String)],Lt.prototype,"user_id",void 0),Lt=ke([ne(Ke),se("register"),oe("5.6.0")],Lt);let Kt=class UserAuthModel extends de{};ke([ie.Id(7),He("design:type",String)],Kt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Kt.prototype,"hash",void 0),ke([ie.String(),He("design:type",String)],Kt.prototype,"ip_address",void 0),ke([ie.String(),He("design:type",String)],Kt.prototype,"user_agent",void 0),ke([ie.FullDate(),He("design:type",Object)],Kt.prototype,"revoked_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Kt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Kt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Kt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Qt),He("design:type",String)],Kt.prototype,"user_id",void 0),Kt=ke([ne(Ke),se("users_auth"),oe("5.6.0")],Kt);let qt=class PageModel extends de{};ke([ie.Id(7),He("design:type",String)],qt.prototype,"id",void 0),ke([ie.Enum(Ve),ae(Ve.PAGE),He("design:type",String)],qt.prototype,"type",void 0),ke([ie.String(),He("design:type",String)],qt.prototype,"name",void 0),ke([ie.Text(),He("design:type",String)],qt.prototype,"description",void 0),ke([ie.String(),He("design:type",String)],qt.prototype,"icon",void 0),ke([ie.String(),He("design:type",String)],qt.prototype,"path",void 0),ke([ie.Timestamp(),He("design:type",Number)],qt.prototype,"position",void 0),ke([ie.Boolean(),He("design:type",Boolean)],qt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],qt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],qt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],qt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],qt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>qt),He("design:type",String)],qt.prototype,"page_id",void 0),ke([re.HasMany(()=>qt),He("design:type",Array)],qt.prototype,"pages",void 0),ke([re.BelongsTo(()=>Bt),He("design:type",String)],qt.prototype,"permission_id",void 0),qt=ke([ne(Ke),se("page"),Ht(),oe("5.6.0")],qt);let Bt=class PermissionModel extends de{};ke([ie.Id(7),He("design:type",String)],Bt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Bt.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],Bt.prototype,"permission",void 0),ke([ie.Text(),ae(""),He("design:type",String)],Bt.prototype,"description",void 0),ke([ie.Boolean(),ae(!0),He("design:type",Boolean)],Bt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Bt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Bt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Bt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Bt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>Ut),He("design:type",Array)],Bt.prototype,"roles_permissions",void 0),ke([re.HasMany(()=>qt),He("design:type",Array)],Bt.prototype,"pages",void 0),Bt=ke([ne(Ke),se("permission"),Ht(),oe("5.6.0")],Bt);let Ut=class RolePermissionModel extends de{};ke([ie.Id(7),He("design:type",String)],Ut.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Ut.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Bt),He("design:type",String)],Ut.prototype,"permission_id",void 0),ke([re.BelongsTo(()=>Vt),He("design:type",String)],Ut.prototype,"role_id",void 0),Ut=ke([ne(Ke),se("roles_permission"),Ht(),oe("5.6.0")],Ut);let Vt=class RoleModel extends de{};ke([ie.Id(7),He("design:type",String)],Vt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Vt.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],Vt.prototype,"role",void 0),ke([ie.Text(),He("design:type",String)],Vt.prototype,"description",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Vt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Vt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Vt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Vt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Vt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>$t),He("design:type",Array)],Vt.prototype,"groups_roles",void 0),ke([re.HasMany(()=>Ut),He("design:type",Array)],Vt.prototype,"roles_permissions",void 0),Vt=ke([ne(Ke),se("role"),Ht(),oe("5.6.0")],Vt);let $t=class GroupRoleModel extends de{};ke([ie.Id(7),He("design:type",String)],$t.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],$t.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Wt),He("design:type",String)],$t.prototype,"group_id",void 0),ke([re.BelongsTo(()=>Vt),He("design:type",String)],$t.prototype,"role_id",void 0),$t=ke([ne(Ke),se("groups_roles"),Ht(),oe("5.6.0")],$t);let Wt=class GroupModel extends de{};ke([ie.Id(7),He("design:type",String)],Wt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Wt.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],Wt.prototype,"group",void 0),ke([ie.Text(),He("design:type",String)],Wt.prototype,"description",void 0),ke([ie.Enum(Be),ae(Be.SYSTEM),He("design:type",String)],Wt.prototype,"type",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Wt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Wt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Wt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Wt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Wt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>Yt),He("design:type",Array)],Wt.prototype,"users_groups",void 0),ke([re.HasMany(()=>$t),He("design:type",Array)],Wt.prototype,"groups_roles",void 0),Wt=ke([ne(Ke),se("group"),Ht(),oe("5.6.0")],Wt);let Gt=class UserTenantModel extends de{};ke([ie.Id(7),He("design:type",String)],Gt.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Gt.prototype,"created_at",void 0),ke([re.BelongsTo(()=>zt),He("design:type",String)],Gt.prototype,"tenant_id",void 0),ke([re.BelongsTo(()=>Qt),He("design:type",String)],Gt.prototype,"user_id",void 0),Gt=ke([ne(Ke),se("users_tenants"),Ht(),oe("5.6.0")],Gt);let zt=class TenantModel extends de{};ke([ie.Id(7),He("design:type",String)],zt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],zt.prototype,"name",void 0),ke([ie.Text(),He("design:type",String)],zt.prototype,"description",void 0),ke([ie.Enum($e),ae($e.ACTIVE),He("design:type",String)],zt.prototype,"status",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],zt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],zt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],zt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],zt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>Gt),He("design:type",Array)],zt.prototype,"users_tenants",void 0),zt=ke([ne(Ke),se("tenant"),Ht(),oe("5.6.0")],zt);let Yt=class UserGroupModel extends de{};ke([ie.Id(7),He("design:type",String)],Yt.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Yt.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Wt),He("design:type",String)],Yt.prototype,"group_id",void 0),ke([re.BelongsTo(()=>Qt),He("design:type",String)],Yt.prototype,"user_id",void 0),ke([re.BelongsTo(()=>zt),He("design:type",String)],Yt.prototype,"tenant_id",void 0),Yt=ke([ne(Ke),se("users_groups"),Ht(),oe("5.6.0")],Yt);let Jt=class UserPasswordModel extends de{};ke([ie.Id(7),He("design:type",String)],Jt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Jt.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Object)],Jt.prototype,"revoked_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Jt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Jt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Jt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Qt),He("design:type",String)],Jt.prototype,"user_id",void 0),Jt=ke([ne(Ke),se("users_password"),Ht(),oe("5.6.0")],Jt);let Qt=class UserModel extends de{};ke([ie.Id(7),He("design:type",String)],Qt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Qt.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],Qt.prototype,"username",void 0),ke([ie.String(),He("design:type",String)],Qt.prototype,"email",void 0),ke([ie.Text(),He("design:type",String)],Qt.prototype,"notes",void 0),ke([ie.Enum(We),ae(We.ACTIVE),He("design:type",String)],Qt.prototype,"status",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Qt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Qt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Qt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Qt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>Xt),He("design:type",Array)],Qt.prototype,"audits",void 0),ke([re.HasMany(()=>Kt),He("design:type",Array)],Qt.prototype,"users_auths",void 0),ke([re.HasMany(()=>Lt),He("design:type",Array)],Qt.prototype,"registers",void 0),ke([re.HasMany(()=>Yt),He("design:type",Array)],Qt.prototype,"users_groups",void 0),ke([re.HasMany(()=>Jt),He("design:type",Array)],Qt.prototype,"users_passwords",void 0),ke([re.HasMany(()=>Gt),He("design:type",Array)],Qt.prototype,"users_tenants",void 0),Qt=ke([ne(Ke),se("user"),Ht(),oe("5.6.0")],Qt);let Xt=class AuditModel extends de{};ke([ie.Id(7),He("design:type",String)],Xt.prototype,"id",void 0),ke([ie.Enum(qe),He("design:type",String)],Xt.prototype,"type",void 0),ke([ie.String(),He("design:type",String)],Xt.prototype,"model",void 0),ke([ie.String(),le(),He("design:type",String)],Xt.prototype,"record",void 0),ke([ie.Json(),He("design:type",Object)],Xt.prototype,"currently",void 0),ke([ie.Json(),He("design:type",Object)],Xt.prototype,"previously",void 0),ke([ie.Char(36),le(),He("design:type",String)],Xt.prototype,"request_id",void 0),ke([ie.Text(),He("design:type",String)],Xt.prototype,"full_url",void 0),ke([ie.String(),He("design:type",String)],Xt.prototype,"ip_address",void 0),ke([ie.Text(),He("design:type",String)],Xt.prototype,"user_agent",void 0),ke([ie.String(),He("design:type",String)],Xt.prototype,"source",void 0),ke([ie.FullDate(),He("design:type",Object)],Xt.prototype,"reverted_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Xt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Xt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Xt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Qt),He("design:type",String)],Xt.prototype,"user_id",void 0),Xt=ke([ne(Ke),se("audit"),oe("5.6.0")],Xt);let Zt=class ConfigModel extends de{};ke([ie.Id(7),He("design:type",String)],Zt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Zt.prototype,"key",void 0),ke([ie.Text(),He("design:type",String)],Zt.prototype,"value",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Zt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Zt.prototype,"updated_at",void 0),Zt=ke([ne(Ke),se("configs"),oe("5.6.0")],Zt);let ei=class ForgotModel extends de{};ke([ie.Id(7),He("design:type",String)],ei.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ei.prototype,"secret",void 0),ke([ie.FullDate(),He("design:type",Number)],ei.prototype,"expired_at",void 0),ke([ie.Boolean(),He("design:type",Boolean)],ei.prototype,"active",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ei.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ei.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],ei.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Qt),He("design:type",String)],ei.prototype,"user_id",void 0),ei=ke([ne(Ke),se("forgot"),oe("5.6.0")],ei);let ti=class LogModel extends de{};ke([ie.Id(7),He("design:type",String)],ti.prototype,"id",void 0),ke([ie.Enum(Ue),ae(Ue.INFO),He("design:type",String)],ti.prototype,"level",void 0),ke([ie.Text(),He("design:type",String)],ti.prototype,"message",void 0),ke([ie.String(),He("design:type",String)],ti.prototype,"source",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ti.prototype,"created_at",void 0),ti=ke([ne(Ke),se("log"),oe("5.6.0")],ti);let ii=class MigrationModel extends de{};ke([ie.Id(7),He("design:type",String)],ii.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ii.prototype,"model",void 0),ke([ie.String(),He("design:type",String)],ii.prototype,"version",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ii.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ii.prototype,"updated_at",void 0),ii=ke([ne(Ke),se("migration"),oe("5.6.0")],ii);let ri=class SecretModel extends de{};ke([ie.Id(7),He("design:type",String)],ri.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ri.prototype,"key",void 0),ke([ie.Text(),He("design:type",String)],ri.prototype,"hash",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ri.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ri.prototype,"updated_at",void 0),ri=ke([ne(Ke),se("secret"),oe("5.6.0")],ri);let ni=class SessionModel extends de{};ke([ie.Id(7),He("design:type",String)],ni.prototype,"id",void 0),ke([ie.Json(),He("design:type",Object)],ni.prototype,"data",void 0),ke([ie.FullDate(),He("design:type",Date)],ni.prototype,"expired_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ni.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ni.prototype,"updated_at",void 0),ni=ke([ne(Ke),se("session"),oe("5.6.0")],ni);let si=class UserKeyModel extends de{};ke([ie.Id(7),He("design:type",String)],si.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],si.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],si.prototype,"prefix",void 0),ke([ie.Text(),He("design:type",String)],si.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Object)],si.prototype,"last_used_at",void 0),ke([ie.FullDate(),He("design:type",Object)],si.prototype,"expires_at",void 0),ke([ie.FullDate(),He("design:type",Object)],si.prototype,"revoked_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],si.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],si.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],si.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Qt),He("design:type",String)],si.prototype,"user_id",void 0),si=ke([ne(Ke),se("users_key"),Ht(),oe("5.6.0")],si);class Log{static error(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,i)})}static info(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,i)})}static warn(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,i)})}static writeRaw(e,t,i,r){return Fe(this,void 0,void 0,function*(){var n;r&&he.console(null!==(n=this.colors[e])&&void 0!==n?n:ge.White,e,t),Ke&&(yield ti.create({level:e,message:t,source:null!=i?i:""}).catch(he.catch))})}}Log.colors={error:ge.Red,info:ge.Cyan,warn:ge.Yellow};class Loggable{get log(){return e=>Loggable.logInfo(this,e)}static get log(){return e=>this.logInfo(this,e)}get error(){return e=>Loggable.logError(this,e)}static get error(){return e=>this.logError(this,e)}static logError(e,t){var i,r;Log.error(null!==(r=null!==(i=null==t?void 0:t.message)&&void 0!==i?i:t)&&void 0!==r?r:"",this.source(e),Env.CONSOLE_ERROR)}static logInfo(e,t){Log.info(null!=t?t:"",this.source(e),Env.CONSOLE_ERROR)}static source(e){var t,i,r;const n=null!==(r=null!==(i=null===(t=null==e?void 0:e.constructor)||void 0===t?void 0:t.name)&&void 0!==i?i:null==e?void 0:e.name)&&void 0!==r?r:"null";return Env.BASE_NAME?`${Env.BASE_NAME}.${n}`:n}}class Config extends Loggable{static all(e){return Fe(this,void 0,void 0,function*(){var t;const i=null!==(t=yield Zt.findAll({attributes:["key","value"],where:(null==e?void 0:e.length)?{key:{[ue.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[];return Object.fromEntries(i.map(e=>[e.key,e.value]))})}static del(e){return Fe(this,void 0,void 0,function*(){return((yield Zt.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return Fe(this,arguments,void 0,function*(e,t=""){const[i]=(yield Zt.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return i?i.value:t})}static set(e,t){return Fe(this,void 0,void 0,function*(){const[i,r]=(yield Zt.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];i&&!r&&(yield i.update({value:t}).catch(this.error))})}}class Secret extends Loggable{static all(e){return Fe(this,void 0,void 0,function*(){var t;return(null!==(t=yield ri.findAll({attributes:["key"],where:(null==e?void 0:e.length)?{key:{[ue.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}static del(e){return Fe(this,void 0,void 0,function*(){return((yield ri.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return Fe(this,arguments,void 0,function*(e,t=""){var i;this.init();const r=this.encryptor.encrypt(t),[n]=(yield ri.findOrCreate({where:{key:e},defaults:{key:e,hash:r}}).catch(this.error))||[];return n&&null!==(i=this.encryptor.decrypt(n.hash))&&void 0!==i?i:t})}static set(e,t){return Fe(this,void 0,void 0,function*(){this.init();const i=this.encryptor.encrypt(t),[r,n]=(yield ri.findOrCreate({where:{key:e},defaults:{key:e,hash:i}}).catch(this.error))||[];r&&!n&&(yield r.update({hash:i}).catch(this.error))})}static init(){this.encryptor||(this.encryptor=new ve(Env.ENCRYPTION_SECRET))}}class SessionStore extends Oe{constructor(){super(),this.all=e=>Fe(this,void 0,void 0,function*(){e=e||L;const t=yield ni.findAll({attributes:["id","expired_at"],where:{expired_at:{[ue.gte]:new Date}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.id)),e()}),this.clear=e=>Fe(this,void 0,void 0,function*(){yield ni.destroy().catch(he.catch),e&&e()}),this.destroy=(e,t)=>Fe(this,void 0,void 0,function*(){yield ni.destroy({where:{id:e}}).catch(he.catch),t&&t()}),this.expired=()=>Fe(this,void 0,void 0,function*(){yield ni.destroy({where:{expired_at:{[ue.lt]:new Date}}}).catch(he.catch)}),this.get=(e,t)=>Fe(this,void 0,void 0,function*(){t=t||L;const i=yield ni.findOne({where:{id:e,expired_at:{[ue.gte]:new Date}}}).catch(e=>(t(e),null));if(i){if(i.data.cookie){if(new Date(i.data.cookie.expires).getTime()<=Date.now())return yield i.destroy().catch(he.catch),void t(null)}t(null,i.data)}else t(null)}),this.length=e=>Fe(this,void 0,void 0,function*(){e&&e(null,(yield ni.count().catch(he.catch))||0)}),this.set=(e,t,i)=>Fe(this,void 0,void 0,function*(){i=i||L;const r=new Date;r.setTime(r.getTime()+Env.API_SESSION_LIFETIME);const[n,s]=(yield ni.findOrCreate({where:{id:e},defaults:{id:e,data:t,expired_at:r}}).catch(he.catch))||[];n?(s||(n.data=t,n.expired_at=r,yield n.save().catch(he.catch)),i()):i()}),setInterval(this.expired,6e4)}}let oi=class Service{};oi=ke([we(Loggable)],oi);let di=class UserService extends oi{constructor(){super(...arguments),this.hashOptions={algorithm:Env.PASSWORD_ALGORITHM,memoryCost:Env.PASSWORD_MEMORY_COST,parallelism:Env.PASSWORD_PARALLELISM,timeCost:Env.PASSWORD_TIME_COST}}canAssignPassword(e,t){return Fe(this,void 0,void 0,function*(){var i,r;if(Env.PASSWORD_REUSE)return!0;if(!(null!==(i=yield Qt.count({where:{id:e}}).catch(this.error))&&void 0!==i?i:0))return!1;const n=null!==(r=yield Jt.findAll({attributes:["hash"],where:{user_id:e}}).catch(this.error))&&void 0!==r?r:[];t+=Env.PASSWORD_PEPPER;for(const e of n)if(yield Te(e.hash,t).catch(L))return!1;return!0})}checkPassword(e,t){return Fe(this,void 0,void 0,function*(){var i;if(!(null!==(i=yield Qt.count({where:{id:e}}).catch(this.error))&&void 0!==i?i:0))return!1;const r=yield Jt.findOne({attributes:["hash"],where:{revoked_at:null,user_id:e}}).catch(this.error);return t+=Env.PASSWORD_PEPPER,r&&(yield Te(r.hash,t).catch(L))||!1})}createPassword(e,t,i){return Fe(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield Qt.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))return!1;yield Jt.update({revoked_at:new Date},{where:{revoked_at:null,user_id:e}}).catch(this.error);const n=Pe(t+Env.PASSWORD_PEPPER,this.hashOptions);return yield Jt.create({hash:n,user_id:e},Object.assign({},{ctx:i})).catch(this.error),!0})}getGroups(e,t){return Fe(this,void 0,void 0,function*(){var i;return K((null!==(i=yield Wt.findAll({attributes:["group"],where:{active:!0},include:[{association:"users_groups",required:!0,where:Object.assign({user_id:e},t||q(t)?{tenant_id:t}:{})}]}).catch(this.error))&&void 0!==i?i:[]).map(e=>e.group))})}getPermissions(e,t){return Fe(this,void 0,void 0,function*(){var i;return K((null!==(i=yield Bt.findAll({attributes:["permission"],where:{active:!0},include:[{association:"roles_permissions",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],where:{active:!0},include:[{association:"groups_roles",required:!0,attributes:[],include:[{association:"group",required:!0,attributes:[],where:{active:!0},include:[{association:"users_groups",required:!0,attributes:[],where:Object.assign({user_id:e},t||q(t)?{tenant_id:t}:{})}]}]}]}]}]}).catch(this.error))&&void 0!==i?i:[]).map(e=>e.permission))})}getGroupPermissions(e){return Fe(this,void 0,void 0,function*(){var t;return K((null!==(t=yield Bt.findAll({attributes:["permission"],where:{active:!0},include:[{association:"roles_permissions",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],where:{active:!0},include:[{association:"groups_roles",required:!0,attributes:[],where:{group_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.permission))})}getTenants(e){return Fe(this,void 0,void 0,function*(){var t;return(null!==(t=yield zt.findAll({attributes:["id","name"],where:{status:$e.ACTIVE},include:[{association:"users_tenants",required:!0,where:{user_id:e}}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>({id:e.id,name:e.name}))})}};di=ke([Se()],di);let ai=class AuthService extends oi{constructor(){super(...arguments),this.options={algorithm:"HS256",expiresIn:`${Env.TOKEN_TTL}ms`},this.userAttributes={exclude:["username","notes","deleted_at"]},this.userService=new di}apiAuth(e){return Fe(this,void 0,void 0,function*(){var i,r;const n=e.getQuery(Env.TOKEN_QUERY),s=e.getCookie(Env.TOKEN_COOKIE),o=e.getHeader(Env.TOKEN_HEADER),[d,a]=null!==(r=null===(i=o||`${Env.TOKEN_TYPE} ${s||n}`)||void 0===i?void 0:i.split(" "))&&void 0!==r?r:["",""];if(!a||d.toLowerCase()!=Env.TOKEN_TYPE)throw new t("Invalid token type");const l=/^sk_([\w]+)_([\w]{6})\./.test(a),{access:u,user:c}=yield l?this.apiKeyAuth(a):this.apiTokenAuth(a),p=e.getHeader("user-agent");if(u instanceof Kt&&u.user_agent&&u.user_agent!=p)throw new t("Invalid API token");return e.req.access=u,yield this.attachAuthContext(e,c),{access:u,user:c}})}apiKeyAuth(e){return Fe(this,void 0,void 0,function*(){if(!Env.TOKEN_PEPPER)throw new s("Authentication service unavailable");if(!e)throw new t("API key missing");const[i]=e.split(".");if(!i)throw new t("Invalid API key");const r=yield si.findOne({where:{prefix:i},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{status:We.ACTIVE}}]});if(!r||!r.user)throw new t("Invalid API key");if(r.revoked_at)throw new t("API key revoked");if(r.expires_at&&r.expires_at<new Date)throw new t("API key expired");const n=Ae("sha256",Env.TOKEN_PEPPER).update(e).digest("hex");if(!this.safeEqual(n,r.hash))throw new t("Invalid API key");return yield r.update({last_used_at:new Date},Object.assign({},{withoutAudit:!0})).catch(this.error),{access:r,user:r.user}})}apiTokenAuth(e){return Fe(this,void 0,void 0,function*(){const{id:i,hash:r}=yield this.verifyJwt(e);if(!i||!r)throw new t("Invalid API token");const n=yield Kt.findOne({attributes:{exclude:["hash"]},where:{hash:r},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:i,status:We.ACTIVE}}]}).catch(this.error);if(!n||!n.user)throw new t("Invalid API token");if(n.revoked_at)throw new t("API token revoked");return{access:n,user:n.user}})}createApiKey(e,t,i,r){return Fe(this,void 0,void 0,function*(){if(!Env.TOKEN_PEPPER)throw new s("Authentication service unavailable");const n=`sk_${Env.TOKEN_PREFIX}_${B(6)}`,o=`${n}.${U()}`,d=Ae("sha256",Env.TOKEN_PEPPER).update(o).digest("hex"),a=yield si.create({name:t,prefix:n,hash:d,expires_at:i,user_id:r.id},Object.assign({},{ctx:e})).catch(this.error);if(!a)throw new s("API key could not be created");return{id:a.id,key:o}})}createApiToken(e,t){return Fe(this,void 0,void 0,function*(){var i;if(!Env.TOKEN_SECRET)throw new s("Authentication service unavailable");const{id:r}=t,n=U(),o=yield Kt.create({hash:n,user_id:r},Object.assign({},{ctx:e})).catch(this.error);if(!o)throw new s;const d=_e.sign({id:r,hash:n},Env.TOKEN_SECRET,this.options);if(o.user_agent=null!==(i=e.getHeader("user-agent"))&&void 0!==i?i:"",o.ip_address=e.getIp(),!(yield o.save().catch(this.error)))throw new s("Authentication service unavailable");return{token:d}})}deleteApiKey(e,t,i){return Fe(this,void 0,void 0,function*(){const r=yield si.findOne({attributes:["id","revoked_at"],where:{id:t,user_id:i.id}}).catch(this.error);return!!r&&(!(!r.revoked_at&&!(yield r.update({revoked_at:new Date},Object.assign({},{ctx:e})).catch(this.error)))&&(yield r.destroy(Object.assign({},{ctx:e})).catch(this.error),!0))})}renewApiToken(e){return Fe(this,void 0,void 0,function*(){const{id:i,hash:r}=yield this.verifyJwt(e,Env.TOKEN_TTL_RENEW/1e3);if(!i||!r)throw new t("Invalid API token");const n=yield Kt.findOne({where:{hash:r},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:i,status:We.ACTIVE}}]}).catch(this.error);if(!n||!n.user)throw new t("Invalid API token");if(n.revoked_at)throw new t("API token revoked");if(n.hash=U(),!(yield n.save().catch(this.error)))throw new s("Authentication service unavailable");return{token:_e.sign({id:i,hash:n.hash},Env.TOKEN_SECRET,this.options)}})}revokeApiKey(e,t,i){return Fe(this,void 0,void 0,function*(){var r;const[n]=null!==(r=yield si.update({revoked_at:new Date},Object.assign({where:{id:t,revoked_at:null,user_id:i.id}},{ctx:e})).catch(this.error))&&void 0!==r?r:[0];return n>0})}attachAuthContext(e,i){return Fe(this,void 0,void 0,function*(){e.req.user=i;const r=e.getHeader(Env.TENANT_HEADER),n=yield this.userService.getTenants(i.id);if(r&&!n.find(e=>e.id==r))throw new t("Tenant not found or access denied");const[s,o]=yield Promise.all([this.userService.getGroups(i.id,r),this.userService.getPermissions(i.id,r)]);e.req.groups=s,e.req.permissions=o,e.req.tenants=n})}safeEqual(e,t){const i=Buffer.from(e,"hex"),r=Buffer.from(t,"hex");return i.length===r.length&&be(i,r)}verifyJwt(e,i){return Fe(this,void 0,void 0,function*(){if(!Env.TOKEN_SECRET)throw new s("Authentication service unavailable");if(!e||e.split(".").length<3)throw new t("Invalid token");try{return _e.verify(e,Env.TOKEN_SECRET,{algorithms:["HS256"],clockTolerance:i})}catch(e){throw new t("Invalid token")}})}};ai=ke([Se()],ai);class ModelService extends oi{constructor(e,t){var i,r;super(),this.attributes=[],this.permissions=[],this.search=[],this.model=e,(null==t?void 0:t.permissions)&&(this.permissions=t.permissions);const n=Object.keys(e.getAttributes());this.attributes=this.filterAttributes(n,null!==(i=null==t?void 0:t.attributes)&&void 0!==i?i:[]),this.search=this.filterAttributes(n,null!==(r=null==t?void 0:t.search)&&void 0!==r?r:this.attributes)}applySelect(e,t,i){if(!t)return;const r=null==e?void 0:e.getQuery(i?`${i}_select`:"select"),n=t.attributes,s=e=>n.includes(e);t.attributes=[],j(r)&&r.length&&t.attributes.push(...r.split(/\s*,\s*/g).filter(s)),t.attributes.length||(t.attributes=n)}applyOrders(e,t){if(!t)return;const i=null==e?void 0:e.getQuery("order"),r=[],n=t.attributes,s=([e])=>n.includes(e),o=e=>e&&["ASC","DESC"].includes(e)?e:"ASC";if(j(i)&&i.length){const e=i.split(/\s*,\s*/g).map(e=>e.split(/\s*:\s*/g));r.push(...e.filter(s).map(([e,t])=>[e,o((null!=t?t:"ASC").toUpperCase())]))}r.length&&(t.order=r)}applyPagination(e,t){if(!t)return;const i=null==e?void 0:e.getQuery("limit"),r=null==e?void 0:e.getQuery("offset");P(t.limit)&&(t.limit=Env.MODEL_LIMIT,j(i)&&(t.limit=parseInt(i)||0),t.limit=V(t.limit,-1,Env.MODEL_LIMIT_MAX)),t.limit<0&&(t.limit=void 0),j(r)&&(t.offset=parseInt(r)||0,t.offset<0&&(t.offset=void 0))}applySearch(e,t){var i;if(!t)return;const r=null==e?void 0:e.getQuery("search");r&&j(r)&&(t.where=Object.assign(Object.assign({},null!==(i=t.where)&&void 0!==i?i:{}),{[ue.or]:this.search.map(e=>({[e]:{[ue.substring]:r}}))}))}applyWhere(e,t,i){var r,n;if(!t)return;const d=null==e?void 0:e.getQuery(i?`${i}_where`:"where");if(!j(d))return;const a=t.attributes;try{const e=ce.parse(a,null!==(r=JSON.parse(d))&&void 0!==r?r:{});t.where=Object.assign(Object.assign({},null!==(n=t.where)&&void 0!==n?n:{}),null!=e?e:{})}catch(e){if(e instanceof Error)throw new o(e.message);throw new s}}countAll(e){return Fe(this,void 0,void 0,function*(){var t,i;const{ctx:r,options:n={}}=e,s=$({},n);s.attributes=this.getAttributes(null!==(t=null==s?void 0:s.attributes)&&void 0!==t?t:[]),this.applySearch(r,s),this.applyWhere(r,s),this.applySelect(r,s);const o=null!==(i=yield this.model.count(Object.assign(Object.assign({},s),{distinct:!!s.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error))&&void 0!==i?i:0;return null==r||r.prepare(d.OK,{count:o}),o})}create(e){return Fe(this,void 0,void 0,function*(){var t,i;const{body:r={},ctx:n,options:o={}}=e,a=$({},o),l=yield this.model.create(Object.assign({},$({},null!==(i=null===(t=null==n?void 0:n.req)||void 0===t?void 0:t.body)&&void 0!==i?i:{},r)),Object.assign(Object.assign({},a),{ctx:n})).catch(this.error);if(!l)throw new s;const{primaryKeyAttribute:u}=this.model;return null==n||n.prepare(d.OK,{[u]:l.getDataValue(u)}),l})}delete(e){return Fe(this,void 0,void 0,function*(){var t,i;const{ctx:r,id:n,options:s={}}=e,{primaryKeyAttribute:o}=this.model,d=null!==(t=null==r?void 0:r.getParam(o))&&void 0!==t?t:n;if(P(d))throw new a;const u=$({},s),c=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},u),{where:{[ue.and]:Object.assign({[o]:d},null!==(i=null==u?void 0:u.where)&&void 0!==i?i:{})},individualHooks:!0}),{ctx:r})).catch(this.error);if(!c)throw new l;return null==r||r.success("OK"),c})}filterAttributes(e,t){if(k(t))return t.length?t.filter(t=>j(t)&&e.includes(t)):e;const{exclude:i,include:r}=t,n=P(r)?e:r.filter(t=>j(t)&&e.includes(t)),s=null!=i?i:[];return s.length?n.filter(e=>!s.includes(e)):n}findAll(e){return Fe(this,void 0,void 0,function*(){var t,i;const{ctx:r,callback:n,options:s={},query:o=!0}=e,a=$({},s);a.attributes=this.getAttributes(null!==(t=null==a?void 0:a.attributes)&&void 0!==t?t:[]),o&&this.applySelect(r,a),this.applyOrders(r,a),this.applyPagination(r,a),(null!==(i=null==a?void 0:a.limit)&&void 0!==i?i:0)>Env.MODEL_LIMIT_MAX&&(a.limit=Env.MODEL_LIMIT_MAX),this.applySearch(r,a),o&&this.applyWhere(r,a);const[l,u]=yield Promise.all([this.model.count(Object.assign(Object.assign({},a),{distinct:!!a.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error).then(e=>null!=e?e:0),this.model.findAll(a).catch(this.error).then(e=>null!=e?e:[])]),c={count:l,records:n?yield n(u):u};return null==r||r.prepare(d.OK,c),c})}findOne(e){return Fe(this,void 0,void 0,function*(){var t,i,r;const{callback:n,ctx:s,id:o,options:u={},query:c=!0}=e,{primaryKeyAttribute:p}=this.model,h=null!==(t=null==s?void 0:s.getParam(p))&&void 0!==t?t:o;if(P(h))throw new a;const g=$({},u);g.attributes=this.getAttributes(null!==(i=null==g?void 0:g.attributes)&&void 0!==i?i:[]),c&&this.applySelect(s,g);const v=yield this.model.findOne(Object.assign(Object.assign({},g),{where:{[ue.and]:Object.assign({[p]:h},null!==(r=null==g?void 0:g.where)&&void 0!==r?r:{})}})).catch(this.error);if(!v)throw new l;return null==s||s.prepare(d.OK,n?yield n(v):v.toJSON()),v})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var i;const r=W(t),{ctx:n}=null!=t?t:{};return r.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(i=r.attributes)&&void 0!==i?i:[]),this.applySearch(n,r),this.applyWhere(n,r,t.name),this.applySelect(n,r,t.name),Object.assign({model:e},r)}name(){return this.model.tableName}sync(){return Fe(this,void 0,void 0,function*(){if(!this.permissions.length)return;const e=this.name().toLowerCase(),t=G(e.replace(/_/g," ")," ");yield z(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=C(`${e}.${i}`,".");yield Bt.findOrCreate({where:{permission:r},defaults:{name:`${t} ${G(i," ")}`}})}))})}update(e){return Fe(this,void 0,void 0,function*(){var t,i,r,n;const{ctx:s,body:o,id:d,options:u={}}=e,{primaryKeyAttribute:c}=this.model,p=null!==(t=null==s?void 0:s.getParam(c))&&void 0!==t?t:d;if(P(p))throw new a;const h=$({},u),g=$({},null!==(r=null===(i=null==s?void 0:s.req)||void 0===i?void 0:i.body)&&void 0!==r?r:{},null!=o?o:{}),v=yield this.model.findOne(Object.assign(Object.assign({},h),{attributes:this.getAttributes([c,...Object.keys(g)]),where:{[ue.and]:Object.assign({[c]:p},null!==(n=null==h?void 0:h.where)&&void 0!==n?n:{})}})).catch(this.error);if(!v)throw new l;return v.set(g),v.changed()?(yield v.save(Object.assign({},{ctx:s})).catch(this.error),null==s||s.success("OK"),!0):(null==s||s.success("Record not changed"),!1)})}}class Application extends u{constructor(e,t){super(e,$({},{cross:!!Env.HTTP_CROSS&&("*"===Env.HTTP_CROSS||{origin:Env.HTTP_CROSS.split(",")}),hybrid:Env.HTTP_HYBRID,json:{strict:Env.API_BODYPARSER_STRICT,inflate:Env.API_BODYPARSER_INFLATE,limit:Env.API_BODYPARSER_LIMIT,type:Env.API_BODYPARSER_TYPE},notfound:Env.HTTP_NOTFOUND,path:Env.HTTP_PATH,port:Env.HTTP_PORT,public:Env.HTTP_PUBLIC,redirect:Env.HTTP_REDIRECT,session:{store:new SessionStore,name:Env.API_SESSION_NAME,secret:Env.API_SESSION_SECRET,cookie:{maxAge:Env.API_SESSION_LIFETIME},genid:D},tls:{ca:Env.HTTP_TLS_CA,cert:Env.HTTP_TLS_CRT,key:Env.HTTP_TLS_KEY}},null!=t?t:{})),this._prepared=!1}error(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.error(e.message,t,Env.CONSOLE_ERROR)}log(e,t){Env.BASE_NAME&&(t=t?`${Env.BASE_NAME}.${t}`:Env.BASE_NAME),Log.info(e,t,!0)}listen(){const e=Object.create(null,{listen:{get:()=>super.listen}});return Fe(this,void 0,void 0,function*(){yield this.prepare(),yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new Z({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>Fe(this,void 0,void 0,function*(){t.url||(t.url=""),e.on("close",()=>{}),yield Y(2e3)})))})}prepare(){return Fe(this,void 0,void 0,function*(){this._prepared||(yield Ke.sync(),yield this.migrations(Ke),yield J(this.controllers,e=>Fe(this,void 0,void 0,function*(){I(e.sync)&&(yield e.sync(this))})),this.authService=new ai,this.userService=new di,this._prepared=!0)})}migrations(e){return Fe(this,void 0,void 0,function*(){const t=[];yield J(Object.keys(e.models),i=>Fe(this,void 0,void 0,function*(){var r;const n=e.models[i],s=n.version();if(!s)return;const[o,d]=null!==(r=yield ii.findOrCreate({where:{model:n.tableName},defaults:{model:n.tableName,version:""}}).catch(this.error))&&void 0!==r?r:[];o&&(d||o.version!=s)&&(o.version=s,yield o.save().catch(this.error),t.push(n))})),yield J(t,e=>Fe(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}let li=class BaseController extends Q{constructor(){super(...arguments),this.permissions=[]}name(){var e,t;return(null!==(t=null===(e=this.constructor)||void 0===e?void 0:e.name)&&void 0!==t?t:"api").replace(/(([a-z])([A-Z]))/g,"$2_$3")}sync(){return Fe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=G(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=C(`${e}.${i}`,".");yield Bt.findOrCreate({where:{permission:r},defaults:{name:`${t} ${G(i," ")}`}})}))})}};li=ke([we(Loggable)],li);class ModelController extends li{constructor(){super(...arguments),this.attributes=[],this.permissions=["audit","create","read","update","delete"],this.search=[]}countAll(e){return Fe(this,void 0,void 0,function*(){return yield this.service.countAll(e)})}create(e){return Fe(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return Fe(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return Fe(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return Fe(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}include(e,t){return this.service.include(e,t)}sync(){return Fe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=G(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=C(`${e}.${i}`,".");yield Bt.findOrCreate({where:{permission:r},defaults:{name:`${t} ${G(i," ")}`}})})),this.service=new ModelService(this.model,{attributes:this.attributes.length?this.attributes:void 0,search:this.search.length?this.search:void 0})})}update(e){return Fe(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}}let ui=class AuditsController extends ModelController{constructor(){super(...arguments),this.model=Xt,this.permissions=["read"]}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["currently","previously"]}}})})}record(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensurePermission(e,t),yield this.findAll({ctx:e,options:{where:{record:t}}})})}get(e){return Fe(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}ensurePermission(e,i){return Fe(this,void 0,void 0,function*(){var r;const n=yield Xt.findOne({where:{record:i}}).catch(this.error);if(!n)return;const s=C(`${n.model}.audit`,".");if(!(null===(r=e.req.permissions)||void 0===r?void 0:r.includes(s)))throw new t("Access denied")})}};ke([c(),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],ui.prototype,"all",null),ke([c("/record/:record"),tt(),Ne(0,p()),Ne(1,h("record")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],ui.prototype,"record",null),ke([c("/:id"),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],ui.prototype,"get",null),ui=ke([g("/audits")],ui);let ci=class AuthController extends li{constructor(){super(...arguments),this.authService=new ai}login(e,i,r,n,s){return Fe(this,void 0,void 0,function*(){var o,d;yield Y(Env.SLEEP_AUTH);const a=yield Jt.findOne({where:{revoked_at:null},include:[{association:"user",required:!0,where:{status:{[ue.in]:[We.ACTIVE,We.PENDING]},[ue.or]:[{email:i},{username:i}]},include:[{association:"registers",required:!1,where:{active:!0}}]}]}).catch(this.error);if(r+=Env.PASSWORD_PEPPER,!a||!a.user||null===(o=yield Te(a.hash,r).catch(L))||void 0===o||!o)throw s.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),new t("Invalid credentials");if(a.user.registers.length)throw s.emit("auth.activation",{ctx:e}),this.emit("auth.activation",{ctx:e}),new t("Activation required");if(a.user.status!==We.ACTIVE)throw s.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),new t("Invalid credentials");const{token:l}=null!==(d=yield this.authService.createApiToken(e,a.user).catch(t=>{throw s.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),t}))&&void 0!==d?d:{};Env.TOKEN_COOKIE_SET&&e.setCookie(Env.TOKEN_COOKIE,l,{httpOnly:!0,secure:Env.isProduction(),sameSite:"lax",maxAge:n?Env.TOKEN_TTL:void 0}),e.json({token:l}),s.emit("auth.login",{ctx:e}),this.emit("auth.login",{ctx:e})})}logout(e,i,r){return Fe(this,void 0,void 0,function*(){if(i instanceof si)throw new t("Access denied");if(i.revoked_at=new Date,!(yield i.save().catch(this.error)))throw new s("Authentication service unavailable");Env.TOKEN_COOKIE_SET&&e.clearCookie(Env.TOKEN_COOKIE),e.success("OK"),r.emit("auth.logout",{ctx:e}),this.emit("auth.logout",{ctx:e})})}user(e){return Fe(this,void 0,void 0,function*(){const{groups:t,permissions:i,tenants:r,user:n}=e.req;if(!(t&&i&&r&&n))throw new s;e.json(Object.assign(Object.assign({},n.toJSON()),{groups:t,permissions:i,tenants:r}))})}renew(e,t,i){return Fe(this,void 0,void 0,function*(){const{token:r}=yield this.authService.renewApiToken(t);e.json({token:r}),i.emit("auth.renew",{ctx:e}),this.emit("auth.renew",{ctx:e})})}};ke([v("/login"),y(e=>({username:e.string().min(3),password:e.string().min(5),remember:e.boolean().parse().default(!1)})),Ne(0,p()),Ne(1,m("username")),Ne(2,m("password")),Ne(3,m("remember")),Ne(4,f()),He("design:type",Function),He("design:paramtypes",[n,String,String,Boolean,Application]),He("design:returntype",Promise)],ci.prototype,"login",null),ke([c("/logout"),tt(),Ne(0,p()),Ne(1,it()),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,Object,Application]),He("design:returntype",Promise)],ci.prototype,"logout",null),ke([c("/me"),tt(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],ci.prototype,"user",null),ke([v("/renew"),y(e=>({token:e.string()})),Ne(0,p()),Ne(1,m("token")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],ci.prototype,"renew",null),ci=ke([g("/auth")],ci);class CrudController extends ModelController{constructor(){super(...arguments),this._crud={}}CrudArgumentsCountAll(e){return{ctx:e}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidateCreate(){return this._crud}CrudValidateUpdate(){return this._crud}add(e){return Fe(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}rows(e){return Fe(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsCountAll(e))})}del(e){return Fe(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return Fe(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return Fe(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validate(e,t){var i,r;const n=H.object(t).parse().validate(null!==(r=null===(i=e.req)||void 0===i?void 0:i.body)&&void 0!==r?r:{});if(n.error)throw new o(n.message||n.error);e.req.body=n.value,e.next()}validateCreate(e){const t=this.CrudValidateCreate();if(t==this._crud)throw new s;this.validate(e,t)}validateUpdate(e){const t=this.CrudValidateUpdate();if(t==this._crud)throw new s;this.validate(e,t)}}ke([v(),tt(),ze(),E("validateCreate"),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"add",null),ke([c(),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"all",null),ke([c("/count"),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"rows",null),ke([w("/:id"),tt(),Ye(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"del",null),ke([c("/:id"),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"get",null),ke([S("/:id"),tt(),Qe(),E("validateUpdate"),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],CrudController.prototype,"set",null),ke([Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",void 0)],CrudController.prototype,"validateCreate",null),ke([Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",void 0)],CrudController.prototype,"validateUpdate",null);let pi=class FilesController extends li{constructor(){super(...arguments),this.directory=Env.HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return Fe(this,void 0,void 0,function*(){let{path:t}=e.req;t=t.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=De(this.directory,t);if(!Ie(i)||!Ce(i).isDirectory())throw new l;let r;return r=xe(i),r=r.map(e=>this.info(De(i,e))),r=r.filter(X),Object.assign(Object.assign({},this.info(i)),{files:r})})}info(e){if(!Ie(e))return null;const t=Ce(e),i=e.split("/").pop();e=e.replace(this.directory,"/").replace(/^\/\//,"/");const r=t.isDirectory();return{name:i,path:e.replace(/^\/\//,"/"),size:t.size,extension:r?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:r,symlink:t.isSymbolicLink()}}name(){return"files"}sync(){return Fe(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=G(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=C(`${e}.${i}`,".");yield Bt.findOrCreate({where:{permission:r},defaults:{name:`${t} ${G(i," ")}`}})}))})}};ke([c("/path"),c("/path/*path"),tt(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],pi.prototype,"files",null),pi=ke([g("/files")],pi);let hi=class ForgotController extends li{check(e,t){return Fe(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)throw new l;i.secret=B(),yield i.save(),e.json({token:i.secret})})}forgot(e,t,i){return Fe(this,void 0,void 0,function*(){yield Y(Env.SLEEP_FORGOT);const r=t,n=yield Qt.findOne({where:{[ue.or]:[{email:r},{username:t}]}}).catch(this.error);if(!n)throw new l;const s=B(),o=Date.now()+6e4*Env.TOKEN_TTL_FORGOT,d=yield ei.create({token:s,timestamp:o,active:!0,user_id:n.id});e.success("OK"),i.emit("forgot.send",{ctx:e,forgot:d,user:n}),this.emit("forgot.send",{ctx:e,forgot:d,user:n})})}reset(e,t,i,r){return Fe(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i)throw new l;i.active=!1,yield i.save().catch(this.error),yield i.user.save().catch(this.error),e.success("OK"),r.emit("forgot.reset",{ctx:e,user:i.user}),this.emit("forgot.reset",{ctx:e,user:i.user})})}find(e){return Fe(this,void 0,void 0,function*(){return yield ei.findOne({where:{token:e,active:!0},include:[{association:"users",required:!0}]}).catch(this.error)})}};ke([c("/check"),y(e=>({token:e.string()})),Ne(0,p()),Ne(1,m("token")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],hi.prototype,"check",null),ke([v(),y(e=>({username:e.string().min(4)})),Ne(0,p()),Ne(1,m("username")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],hi.prototype,"forgot",null),ke([v("/reset"),y(e=>({token:e.string(),password:e.string().min(5)})),Ne(0,p()),Ne(1,m("token")),Ne(2,m("password")),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,String,Application]),He("design:returntype",Promise)],hi.prototype,"reset",null),hi=ke([g("/forgot")],hi);let gi=class GroupsController extends CrudController{constructor(){super(...arguments),this.model=Wt,this.schemaCreate={name:H.string(),group:H.string().slugify("."),description:H.string().default(""),type:H.enum(Object.values(Be)).default(Be.SYSTEM),active:H.boolean().parse()},this.schemaUpdate={name:H.string().optional(),group:H.string().slugify(".").optional(),description:H.string().optional(),type:H.enum(Object.values(Be)).optional(),active:H.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return Fe(this,void 0,void 0,function*(){yield e.sync.call(this),this.userModelService=new ModelService(Qt)})}users(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_groups",required:!0,attributes:[],where:{group_id:t}}]}})})}ensureGroup(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Wt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([c("/:id/users"),tt(),Je("users"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],gi.prototype,"users",null),gi=ke([g("/groups")],gi);let vi=class GroupsPermissionsController extends li{constructor(){super(...arguments),this.userService=new di}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t);const i=yield this.userService.getGroupPermissions(t);e.json({permissions:i})})}ensureGroup(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Wt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([c("/:id/permissions"),tt(),Je("groups"),Je("permissions"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],vi.prototype,"all",null),vi=ke([g("/groups")],vi);let yi=class GroupsRolesController extends ModelController{constructor(){super(...arguments),this.model=Vt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(i),yield this.addRoles(e,t,i),e.success("OK")})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],where:{group_id:t}}]}})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(i),yield $t.destroy(Object.assign({where:{group_id:t,role_id:{[ue.in]:i}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(i);const r=yield this.addRoles(e,t,i);yield $t.destroy(Object.assign({where:{group_id:t,role_id:{[ue.notIn]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addRoles(e,t,i){return Fe(this,void 0,void 0,function*(){const r=[];return yield z(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield $t.findOrCreate(Object.assign({where:{group_id:t,role_id:i},defaults:{group_id:t,role_id:i}},{ctx:e})).catch(this.error))&&void 0!==n?n:[];s&&r.push(i)})),r})}ensureGroup(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Wt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}ensureRoles(e){return Fe(this,void 0,void 0,function*(){var t;if(e.length!=K(e).length)throw new o("Duplicate role id");if((null!==(t=yield Vt.count({where:{id:{[ue.in]:e}}}).catch(this.error))&&void 0!==t?t:0)!=e.length)throw new o("Invalid role id")})}};ke([v("/:id/roles"),tt(),ze(),Je("groups"),y(e=>({roles:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("roles")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],yi.prototype,"add",null),ke([c("/:id/roles"),tt(),Je(),Je("groups"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],yi.prototype,"all",null),ke([w("/:id/roles"),tt(),Ye(),Je("groups"),y(e=>({roles:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("roles")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],yi.prototype,"del",null),ke([S("/:id/roles"),tt(),Qe(),Je("groups"),y(e=>({roles:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("roles")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],yi.prototype,"set",null),yi=ke([g("/groups")],yi);let mi=class HealthController{ping(e){return Fe(this,void 0,void 0,function*(){e.json({status:"ok",timestamp:Date.now(),uptime:process.uptime()})})}};ke([O("/"),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],mi.prototype,"ping",null),mi=ke([g("/health")],mi);let fi=class LogsController extends ModelController{constructor(){super(...arguments),this.model=ti,this.permissions=["read"]}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}};ke([c(),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],fi.prototype,"all",null),fi=ke([g("/logs")],fi);let Ei=class McpController extends li{constructor(){super(...arguments),this.tools=new McpToolRegistry,this.toolsRegistered=!1,this.handler=new McpHttpHandler({sessions:new McpSessionStore(Env.MCP_SESSION_TTL),tools:this.tools,allowedHeaders:[Env.TOKEN_HEADER],allowedOrigins:Env.HTTP_CROSS.split(","),logger:{toolCall:e=>Fe(this,void 0,void 0,function*(){yield Log.info(JSON.stringify(e),"mcp")})}})}sync(e){const t=Object.create(null,{sync:{get:()=>super.sync}});return Fe(this,void 0,void 0,function*(){yield t.sync.call(this),this.toolsRegistered||(this.toolsRegistered=!0,e&&(e.instance.use((e,t,i,r)=>{if(!this.isMcpEndpoint(t))return r(e);const n=this.jsonParseErrorResponse(e);if(!n)return r(e);this.setResponseHeaders(i,t),i.status(n.status).json(n.body)}),e.instance.use((e,t,i)=>{if(!this.isMcpEndpoint(e)||!["GET","HEAD"].includes(e.method))return i();t.setHeader("Allow",St),this.setResponseHeaders(t,e),t.status(405).end()}),It(e.controllers).forEach(e=>this.tools.register(e))))})}get(e){return Fe(this,void 0,void 0,function*(){this.respond(e,this.handler.get(e))})}options(e){return Fe(this,void 0,void 0,function*(){this.respond(e,this.handler.options(e))})}post(e){return Fe(this,void 0,void 0,function*(){this.respond(e,yield this.handler.post(e))})}delete(e){return Fe(this,void 0,void 0,function*(){this.respond(e,this.handler.delete(e))})}isJsonParseError(e){if(!(e instanceof SyntaxError))return!1;const t=e;return"entity.parse.failed"===t.type||400===t.status||400===t.statusCode}isMcpEndpoint(e){const t=(e.originalUrl||e.url).split("?")[0].replace(/\/+$/g,"")||"/";return t===`${(Env.HTTP_PATH||"/").replace(/\/+$/g,"")||""}/mcp`.replace(/\/+/g,"/")||"/mcp"===t}jsonParseErrorResponse(e){if(this.isJsonParseError(e))return{status:400,body:ht(null,new McpParseError("Parse error",{message:e.message}))}}respond(e,t){var i;this.setResponseHeaders(e.res,e.req);for(const[r,n]of Object.entries(null!==(i=t.headers)&&void 0!==i?i:{}))e.res.setHeader(r,n);void 0!==t.body?e.res.status(t.status).json(t.body):e.res.status(t.status).end()}setResponseHeaders(e,t,i){const r=this.getAllowedOrigin(t);Object.entries(Object.assign(Object.assign(Object.assign(Object.assign({Allow:St},r?{"Access-Control-Allow-Origin":r}:{}),r&&"*"!==r?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":St,"Access-Control-Allow-Headers":`Content-Type, Accept, ${Env.TOKEN_HEADER}, ${Et}, ${ft}`}),null!=i?i:{})).forEach(([t,i])=>{e.setHeader(t,i)})}getAllowedOrigin(e){if(Env.HTTP_CROSS.split(",").includes("*"))return"*";const t=null==e?void 0:e.headers.origin;if(!t)return;const i=Array.isArray(t)?t[0]:t;return Env.HTTP_CROSS.split(",").includes(i)?i:void 0}};ke([c(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ei.prototype,"get",null),ke([_(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ei.prototype,"options",null),ke([v(),tt(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ei.prototype,"post",null),ke([w(),tt(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ei.prototype,"delete",null),Ei=ke([g("/mcp")],Ei);let wi=class PagesController extends CrudController{constructor(){super(...arguments),this.model=qt,this.schemaCreate={type:H.enum(Object.values(Ve)).optional(),name:H.string().optional(),description:H.string().optional(),icon:H.string().optional(),path:H.string().optional(),active:H.boolean().optional(),page_id:H.string().uuid().empty(),permission_id:H.string().uuid().empty()},this.schemaUpdate={type:H.enum(Object.values(Ve)).optional(),name:H.string().optional(),description:H.string().optional(),icon:H.string().optional(),path:H.string().optional(),active:H.boolean().optional(),page_id:H.string().uuid().empty(),permission_id:H.string().uuid().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}position(e,t){return Fe(this,void 0,void 0,function*(){const i=t.map(({id:e})=>e);yield this.ensurePages(i),yield J(t,t=>Fe(this,[t],void 0,function*({id:t,position:i}){yield qt.update({position:i},Object.assign({where:{id:t},individualHooks:!0},{ctx:e})).catch(this.error)})),e.success("OK")})}ensurePages(e){return Fe(this,void 0,void 0,function*(){var t;if(e.length!=K(e).length)throw new o("Duplicate page id");if((null!==(t=yield qt.count({where:{id:{[ue.in]:e}}}).catch(this.error))&&void 0!==t?t:0)!=e.length)throw new o("Invalid page id")})}};ke([S("/position"),tt(),Qe(),y(e=>({pages:e.array(e.object({id:e.string().uuid(),position:e.number().parse()}))})),Ne(0,p()),Ne(1,m("pages")),He("design:type",Function),He("design:paramtypes",[n,Array]),He("design:returntype",Promise)],wi.prototype,"position",null),wi=ke([g("/pages")],wi);let Si=class PermissionsController extends CrudController{constructor(){super(...arguments),this.model=Bt,this.schemaCreate={name:H.string(),permission:H.string().slugify("."),description:H.string().default(""),active:H.boolean().parse()},this.schemaUpdate={name:H.string().optional(),permission:H.string().slugify(".").optional(),description:H.string().optional(),active:H.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return Fe(this,void 0,void 0,function*(){yield e.sync.call(this),this.groupModelService=new ModelService(Wt)})}groups(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensurePermission(t),yield this.groupModelService.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],include:[{association:"roles_permissions",required:!0,attributes:[],where:{permission_id:t}}]}]}]}})})}ensurePermission(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Bt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([c("/:id/groups"),tt(),Je("groups"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Si.prototype,"groups",null),Si=ke([g("/permissions")],Si);let Oi=class ProfileController extends ModelController{constructor(){super(),this.model=Qt,this.permissions=["avatar","password"],this.path=Env.HTTP_PUBLIC+"/avatar",this.userService=new di,Env.HTTP_PUBLIC&&Ie(Env.HTTP_PUBLIC)&&!Ie(this.path)&&Re(this.path)}user(e){return Fe(this,void 0,void 0,function*(){const{groups:t,permissions:i,tenants:r,user:n}=e.req;if(!(t&&i&&r&&n))throw new s;e.json(Object.assign(Object.assign({},n.toJSON()),{groups:t,permissions:i,tenants:r}))})}avatar(e,t){return Fe(this,void 0,void 0,function*(){var i;const r=e.getFiles();if(r.file&&r.file.length){const{filename:n,path:o}=null!==(i=r.file[0])&&void 0!==i?i:{};if(n){const i=yield Qt.findOne({where:{id:t.id}}).catch(this.error);if(!i)throw je(o).isFile()&&Me(o),new s;const r=this.path+"/"+i.metadata.avatar_url;if(Ie(r)&&je(r).isFile()&&Me(r),i.changed("metadata",!0),i.metadata.avatar_url=n,yield i.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not changed")})}avatar_del(e,t){return Fe(this,void 0,void 0,function*(){const i=this.path+"/"+t.metadata.avatar_url;if(Ie(i)&&je(i).isFile()&&Me(i),t.changed("metadata",!0),t.metadata.avatar_url=null,yield t.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK");e.success("Record not changed")})}password(e,i,r,n){return Fe(this,void 0,void 0,function*(){if(!(yield this.userService.checkPassword(n.id,i)))throw new t("Invalid password");if(!(yield this.userService.canAssignPassword(n.id,r)))throw new b("Password already used");if(yield this.userService.createPassword(n.id,r,e))return e.success("OK");throw new s})}};ke([c(),tt(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Oi.prototype,"user",null),ke([v("/avatar"),tt(),et("avatar"),A({file:{count:1,path:`${Env.HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),Ne(0,p()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,Qt]),He("design:returntype",Promise)],Oi.prototype,"avatar",null),ke([w("/avatar"),tt(),et("avatar"),Ne(0,p()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,Qt]),He("design:returntype",Promise)],Oi.prototype,"avatar_del",null),ke([v("/password"),tt(),et("password"),y(e=>({oldPassword:e.string().min(5),newPassword:e.string().min(5)})),Ne(0,p()),Ne(1,m("oldPassword")),Ne(2,m("newPassword")),Ne(3,lt()),He("design:type",Function),He("design:paramtypes",[n,String,String,Qt]),He("design:returntype",Promise)],Oi.prototype,"password",null),Oi=ke([g("/profile"),He("design:paramtypes",[])],Oi);let _i=class RegisterController extends li{register(e,t,i){return Fe(this,void 0,void 0,function*(){yield Y(Env.SLEEP_REGISTRY);const{name:r,date:n,email:o,username:d,password:l,confirm:u}=t,c=d||o,p=ye(l);if(yield Qt.count({where:{[ue.or]:[{email:o},{username:c}]}}).catch(this.error))throw new a("Invalid email or username");if(p!=ye(u))throw new a("Invalid password");const h=yield Qt.create({name:r,email:o,username:c,password:p,avatar:"",date:n,description:"",status:We.PENDING}).catch(this.error);if(!h)throw new s;const g=yield Lt.create({token:yield this.getId(),active:!0,user_id:h.id}).catch(this.error);if(!g)throw yield h.destroy().catch(this.error),new s;e.success("OK"),i.emit("register.user",{ctx:e,register:g,user:h}),this.emit("register.user",{ctx:e,register:g,user:h})})}confirm(e,t,i){return Fe(this,void 0,void 0,function*(){const r=yield Lt.findOne({where:{token:t,active:!0},include:[{association:"users",required:!0}]}).catch(this.error);if(!r)throw new l;r.active=!1,yield r.save().catch(this.error),r.user.status=We.ACTIVE,yield r.user.save().catch(this.error),e.success("OK"),i.emit("register.confirm",{ctx:e,register:r,user:r.user}),this.emit("register.confirm",{ctx:e,register:r,user:r.user})})}send(e,t,i){return Fe(this,void 0,void 0,function*(){const r=t,n=yield Lt.findOne({where:{active:!0},include:[{model:Qt,required:!0,where:{[ue.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!n)throw new l;e.success("OK"),i.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})})}getId(){return Fe(this,void 0,void 0,function*(){const e=D();return(yield Lt.count({where:{token:e}}))?this.getId():e})}};ke([v(),y(e=>({name:e.string(),date:e.date(),email:e.string().email(),username:e.string().min(4).default(e.ref("email")),password:e.string().min(5),confirm:e.string().min(5)})),Ne(0,p()),Ne(1,m()),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,Object,Application]),He("design:returntype",Promise)],_i.prototype,"register",null),ke([v("/confirm"),y(e=>({token:e.string()})),Ne(0,p()),Ne(1,m("token")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],_i.prototype,"confirm",null),ke([v("/send"),y(e=>({username:e.string().min(4)})),Ne(0,p()),Ne(1,m("username")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],_i.prototype,"send",null),_i=ke([g("/register")],_i);let Ai=class RolesController extends CrudController{constructor(){super(...arguments),this.model=Vt,this.schemaCreate={name:H.string(),role:H.string().slugify("."),description:H.string().default(""),active:H.boolean().parse()},this.schemaUpdate={name:H.string().optional(),role:H.string().slugify(".").optional(),description:H.string().optional(),active:H.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return Fe(this,void 0,void 0,function*(){yield e.sync.call(this),this.groupModelService=new ModelService(Wt)})}groups(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.groupModelService.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],where:{role_id:t}}]}})})}ensureRole(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Vt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([c("/:id/groups"),tt(),Je("groups"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ai.prototype,"groups",null),Ai=ke([g("/roles")],Ai);let bi=class RolesPermissionsController extends ModelController{constructor(){super(...arguments),this.model=Bt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(i),yield this.addPermissions(e,t,i),e.success("OK")})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.findAll({ctx:e,options:{include:[{association:"roles_permissions",required:!0,attributes:[],where:{role_id:t}}]}})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(i),yield Ut.destroy(Object.assign({where:{role_id:t,permission_id:{[ue.in]:i}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(i);const r=yield this.addPermissions(e,t,i);yield Ut.destroy(Object.assign({where:{role_id:t,permission_id:{[ue.notIn]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addPermissions(e,t,i){return Fe(this,void 0,void 0,function*(){const r=[];return yield z(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Ut.findOrCreate(Object.assign({where:{role_id:t,permission_id:i},defaults:{role_id:t,permission_id:i}},{ctx:e})).catch(this.error))&&void 0!==n?n:[];s&&r.push(i)})),r})}ensurePermissions(e){return Fe(this,void 0,void 0,function*(){var t;if(e.length!=K(e).length)throw new o("Duplicate permission id");if((null!==(t=yield Bt.count({where:{id:{[ue.in]:e}}}).catch(this.error))&&void 0!==t?t:0)!=e.length)throw new o("Invalid permission id")})}ensureRole(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Vt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([v("/:id/permissions"),tt(),ze(),Qe("roles"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],bi.prototype,"add",null),ke([c("/:id/permissions"),tt(),Je(),Qe("roles"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],bi.prototype,"all",null),ke([w("/:id/permissions"),tt(),Ye(),Qe("roles"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],bi.prototype,"del",null),ke([S("/:id/permissions"),tt(),Qe(),Qe("roles"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],bi.prototype,"set",null),bi=ke([g("/roles")],bi);let Ti=class SetupController extends li{constructor(){super(...arguments),this.userService=new di}setup(e){return Fe(this,void 0,void 0,function*(){var t;if(yield Qt.count())throw new l("Endpoint not found");const i=yield Qt.create({name:"Admin",username:"admin",email:"admin@localhost.com",notes:"",status:We.ACTIVE},Object.assign({},{ctx:e})).catch(this.error);if(!i)throw new s;yield this.userService.createPassword(i.id,"admin",e);const r=yield Wt.create({name:"Admin",group:"admin",description:"",active:!0},Object.assign({},{ctx:e}));yield Yt.create({user_id:i.id,group_id:r.id},Object.assign({},{ctx:e})),yield Wt.create({name:"User",group:"user",description:"",active:!0},Object.assign({},{ctx:e}));const n=yield Vt.create({name:"Admin Permissions",role:"admin",description:"",active:!0},Object.assign({},{ctx:e}));if(!n)throw new s;yield $t.create({group_id:r.id,role_id:n.id},Object.assign({},{ctx:e}));const o=null!==(t=yield Bt.findAll({where:{active:!0}}).catch(this.error))&&void 0!==t?t:[];yield J(o,t=>Fe(this,void 0,void 0,function*(){yield Ut.create({role_id:n.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}};ke([c(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ti.prototype,"setup",null),Ti=ke([g("/setup")],Ti);let Pi=class TenantsController extends CrudController{constructor(){super(...arguments),this.model=zt,this.schemaCreate={name:H.string(),description:H.string().default(""),status:H.enum(Object.values($e)).default($e.ACTIVE)},this.schemaUpdate={name:H.string().optional(),description:H.string().optional(),status:H.enum(Object.values($e)).optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return Fe(this,void 0,void 0,function*(){yield e.sync.call(this),this.userModelService=new ModelService(Qt)})}users(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureTenant(t),yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_tenants",required:!0,attributes:[],where:{tenant_id:t}}]}})})}ensureTenant(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield zt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([c("/:id/users"),tt(),Je("users"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Pi.prototype,"users",null),Pi=ke([g("/tenants")],Pi);let Ii=class TestController extends li{json(e){return Fe(this,void 0,void 0,function*(){e.json({ok:!0,message:"hello",timestamp:Date.now()})})}workerSum(){return Fe(this,void 0,void 0,function*(){return{value:2}})}sum(e,t){return Fe(this,void 0,void 0,function*(){const{a:t,b:i}=e;return{value:t+i}})}multiply(e,t){return Fe(this,void 0,void 0,function*(){const{a:t,b:i}=e;return{value:t*i}})}average(e,t){return Fe(this,void 0,void 0,function*(){const t=e.values;return{value:t.reduce((e,t)=>e+t,0)/t.length,count:t.length}})}validationString(e,t){return Fe(this,void 0,void 0,function*(){const t=e.text;return{length:t.length,normalized:t.trim()}})}validationNumber(e,t){return Fe(this,void 0,void 0,function*(){return{doubled:2*e.value}})}validationBoolean(e,t){return Fe(this,void 0,void 0,function*(){return{active:e.active}})}validationArray(e,t){return Fe(this,void 0,void 0,function*(){return{count:e.tags.length}})}validationObject(e,t){return Fe(this,void 0,void 0,function*(){const t=e.profile;return{summary:{name:t.name,adult:t.age>=18}}})}validationEnum(e,t){return Fe(this,void 0,void 0,function*(){return{status:e.status}})}validationDate(e,t){return Fe(this,void 0,void 0,function*(){const t=e.date;return{iso:t.toISOString(),timestamp:t.getTime()}})}validationOptional(e,t){return Fe(this,void 0,void 0,function*(){const t=e.nickname;return Object.assign({name:e.name,hasNickname:Boolean(t)},t?{nickname:t}:{})})}validationDefaults(e,t){return Fe(this,void 0,void 0,function*(){return{name:e.name,limit:e.limit}})}validationParse(e,t){return Fe(this,void 0,void 0,function*(){return{active:e.active,amount:e.amount}})}validationNested(e,t){return Fe(this,void 0,void 0,function*(){const t=e.payload;return{userId:t.user.id,scoreCount:t.scores.length}})}};ke([c(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ii.prototype,"json",null),ke([Ft("test.sum"),He("design:type",Function),He("design:paramtypes",[]),He("design:returntype",Promise)],Ii.prototype,"workerSum",null),ke([xt({name:"sum",title:"Somar numeros",description:"Soma dois numeros.",input:{a:H.number().description("valor a"),b:H.number().description("valor b")},output:{value:H.number().description("resultado da soma de a + b")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"sum",null),ke([xt({name:"multiply",title:"Multiplicar numeros",description:"Multiplica dois numeros.",input:{a:H.number().description("valor a"),b:H.number().description("valor b")},output:{value:H.number().description("resultado da multiplicação de a * b")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"multiply",null),ke([xt({name:"average",title:"Calcular media",description:"Calcula a media de uma lista de numeros.",input:{values:H.array(H.number().description("numero usado no calculo da media")).min(1).max(10).description("lista de numeros para calcular a media")},output:{value:H.number().description("media calculada"),count:H.number().description("quantidade de numeros usados")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"average",null),ke([xt({name:"validation.string",title:"Validacao de string",description:"Exemplo de validacao de texto com tamanho minimo e maximo.",input:{text:H.string().min(5).max(50).description("Texto entre 5 e 50 caracteres.")},output:{length:H.number().description("Quantidade de caracteres do texto."),normalized:H.string().description("Texto normalizado sem espacos nas pontas.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationString",null),ke([xt({name:"validation.number",title:"Validacao de number",description:"Exemplo de validacao numerica com minimo e maximo.",input:{value:H.number().min(0).max(100).description("Numero entre 0 e 100.")},output:{doubled:H.number().description("Numero multiplicado por dois.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationNumber",null),ke([xt({name:"validation.boolean",title:"Validacao de boolean",description:"Exemplo de validacao de booleano sem parse implicito.",input:{active:H.boolean().description("Indica se o registro esta ativo.")},output:{active:H.boolean().description("Booleano validado.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationBoolean",null),ke([xt({name:"validation.array",title:"Validacao de array",description:"Exemplo de validacao de array com limites e item tipado.",input:{tags:H.array(H.string().min(2).max(20).description("Tag entre 2 e 20 caracteres.")).min(1).max(5).description("Lista de tags entre 1 e 5 itens.")},output:{count:H.number().description("Quantidade de tags recebidas.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationArray",null),ke([xt({name:"validation.object",title:"Validacao de object",description:"Exemplo de validacao de objeto simples.",input:{profile:H.object({name:H.string().min(2).max(60).description("Nome do perfil."),age:H.number().min(0).max(120).description("Idade do perfil."),nickname:H.string().empty().max(30).description("Apelido opcional do perfil.")}).description("Objeto de perfil.")},output:{summary:H.object({name:H.string().description("Nome validado."),adult:H.boolean().description("Indica se a idade e maior ou igual a 18.")}).description("Resumo do perfil.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationObject",null),ke([xt({name:"validation.enum",title:"Validacao de enum",description:"Exemplo de validacao de lista fechada de valores.",input:{status:H.enum(["draft","active","archived"]).description("Status permitido.")},output:{status:H.string().description("Status validado.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationEnum",null),ke([xt({name:"validation.date",title:"Validacao de date",description:"Exemplo de validacao e parse de data.",input:{date:H.date().parse().description("Data em formato aceito pelo Date.")},output:{iso:H.string().description("Data em ISO string."),timestamp:H.number().description("Data em timestamp Unix em milissegundos.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationDate",null),ke([xt({name:"validation.optional",title:"Validacao de campo opcional",description:"Exemplo de campo opcional aceitando ausencia.",input:{name:H.string().min(2).description("Nome obrigatorio."),nickname:H.string().empty().max(30).description("Apelido opcional.")},output:{name:H.string().description("Nome validado."),hasNickname:H.boolean().description("Indica se apelido foi enviado."),nickname:H.string().empty().description("Apelido validado quando enviado.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationOptional",null),ke([xt({name:"validation.defaults",title:"Validacao de valores padrao",description:"Exemplo de campos opcionais com valores padrao.",input:{name:H.string().default("guest").description("Nome opcional com valor padrao."),limit:H.number().parse().default(10).min(1).max(100).description("Limite opcional com valor padrao.")},output:{name:H.string().description("Nome final."),limit:H.number().description("Limite final.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationDefaults",null),ke([xt({name:"validation.parse",title:"Validacao com parse",description:"Exemplo de parse de boolean e number antes da validacao final.",input:{active:H.boolean().parse().default(!1).description("Booleano aceitando valores parseaveis."),amount:H.number().parse().min(1).max(1e3).description("Numero aceitando string numerica.")},output:{active:H.boolean().description("Booleano parseado."),amount:H.number().description("Numero parseado.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationParse",null),ke([xt({name:"validation.nested",title:"Validacao de objeto aninhado",description:"Exemplo de objeto aninhado com array interno.",input:{payload:H.object({user:H.object({id:H.string().min(3).max(30).description("Identificador do usuario."),email:H.string().email().description("Email do usuario.")}).description("Usuario do payload."),scores:H.array(H.number().min(0).max(100).description("Pontuacao individual.")).min(1).max(3).description("Pontuacoes do usuario.")}).description("Payload aninhado.")},output:{userId:H.string().description("Identificador validado."),scoreCount:H.number().description("Quantidade de pontuacoes.")}}),He("design:type",Function),He("design:paramtypes",[Object,Object]),He("design:returntype",Promise)],Ii.prototype,"validationNested",null),Ii=ke([g("/test")],Ii);let Ci=class UsersController extends ModelController{constructor(){super(...arguments),this.model=Qt,this.userService=new di}password(e,t,i){return Fe(this,void 0,void 0,function*(){if(yield this.userService.createPassword(i,t,e))return e.success("OK");throw new l})}add(e){return Fe(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}rows(e){return Fe(this,void 0,void 0,function*(){yield this.countAll({ctx:e})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){if(i.id==t)throw new T;yield this.delete({ctx:e})})}get(e){return Fe(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return Fe(this,void 0,void 0,function*(){yield this.update({ctx:e})})}};ke([v("/:id/password"),tt(),Qe(),y(e=>({password:e.string().min(5)})),Ne(0,p()),Ne(1,m("password")),Ne(2,h("id")),He("design:type",Function),He("design:paramtypes",[n,String,String]),He("design:returntype",Promise)],Ci.prototype,"password",null),ke([v(),tt(),ze(),y(e=>({name:e.string(),email:e.string().email(),username:e.string().min(3),notes:e.string().default(""),status:e.enum(Object.values(We)).default(We.ACTIVE)})),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"add",null),ke([c(),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"all",null),ke([c("/count"),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"rows",null),ke([w("/:id"),tt(),Ye(),Ne(0,p()),Ne(1,h("id")),Ne(2,lt()),He("design:type",Function),He("design:paramtypes",[n,String,Qt]),He("design:returntype",Promise)],Ci.prototype,"del",null),ke([c("/:id"),tt(),Je(),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"get",null),ke([S("/:id"),tt(),Qe(),y(e=>({name:e.string().optional(),email:e.string().email().optional(),username:e.string().min(3).optional(),notes:e.string().optional(),status:e.enum(Object.values(We)).optional()})),Ne(0,p()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"set",null),Ci=ke([g("/users")],Ci);let xi=class UsersGroupsController extends ModelController{constructor(){super(...arguments),this.model=Wt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(i),yield this.addGroups(e,t,i),e.success("OK")})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{include:[{association:"users_groups",required:!0,attributes:[],where:{user_id:t}}]}})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(i),yield Yt.destroy(Object.assign({where:{user_id:t,group_id:{[ue.in]:i}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(i);const r=yield this.addGroups(e,t,i);yield Yt.destroy(Object.assign({where:{user_id:t,group_id:{[ue.notIn]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addGroups(e,t,i){return Fe(this,void 0,void 0,function*(){const r=[];return yield z(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Yt.findOrCreate(Object.assign({where:{user_id:t,group_id:i},defaults:{user_id:t,group_id:i}},{ctx:e})).catch(this.error))&&void 0!==n?n:[];s&&r.push(i)})),r})}ensureGroups(e){return Fe(this,void 0,void 0,function*(){var t;if(e.length!=K(e).length)throw new o("Duplicate group id");if((null!==(t=yield Wt.count({where:{id:{[ue.in]:e}}}).catch(this.error))&&void 0!==t?t:0)!=e.length)throw new o("Invalid group id")})}ensureUser(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Qt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([v("/:id/groups"),tt(),ze(),Qe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],xi.prototype,"add",null),ke([c("/:id/groups"),tt(),Je(),Qe("users"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],xi.prototype,"all",null),ke([w("/:id/groups"),tt(),Ye(),Qe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],xi.prototype,"del",null),ke([S("/:id/groups"),tt(),Qe(),Qe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],xi.prototype,"set",null),xi=ke([g("/users")],xi);let Ri=class UsersKeysController extends ModelController{constructor(){super(...arguments),this.model=si,this.permissions=["admin","audit","create","read","update","delete"]}add(e,t,i,r){return Fe(this,void 0,void 0,function*(){e.json(yield r.authService.createApiKey(e,i.name,i.expires_at,t))})}add_admin(e,t,i,r){return Fe(this,void 0,void 0,function*(){const n=yield Qt.findOne({attributes:["id"],where:{id:t}}).catch(this.error);if(!n)throw new l;e.json(yield r.authService.createApiKey(e,i.name,i.expires_at,n))})}revoke(e,t,i,r){return Fe(this,void 0,void 0,function*(){if(!(yield r.authService.revokeApiKey(e,t,i)))throw new l;e.success("OK")})}revoke_admin(e,t,i,r){return Fe(this,void 0,void 0,function*(){const n=yield Qt.findOne({attributes:["id"],where:{id:t}}).catch(this.error);if(!n||!(yield r.authService.revokeApiKey(e,i,n)))throw new l;e.success("OK")})}del(e,t,i,r){return Fe(this,void 0,void 0,function*(){if(!(yield r.authService.deleteApiKey(e,t,i)))throw new l;e.success("OK")})}del_admin(e,t,i,r){return Fe(this,void 0,void 0,function*(){const n=yield Qt.findOne({attributes:["id"],where:{id:t}}).catch(this.error);if(!n||!(yield r.authService.deleteApiKey(e,i,n)))throw new l;e.success("OK")})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t.id}}]}})})}get(e,t){return Fe(this,void 0,void 0,function*(){yield this.findOne({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t.id}}]}})})}all_admin(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t}}]}})})}get_admin(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findOne({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t}}]}})})}ensureUser(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Qt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([v("/keys"),tt(),ze(),y(e=>({name:e.string(),expires_at:e.date().min(()=>new Date).empty()})),Ne(0,p()),Ne(1,lt()),Ne(2,m()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,Qt,Object,Application]),He("design:returntype",Promise)],Ri.prototype,"add",null),ke([v("/:id/keys"),tt(),ze(),Ze("users.keys.admin"),y(e=>({name:e.string(),expires_at:e.date().min(()=>new Date).empty()})),Ne(0,p()),Ne(1,h("id")),Ne(2,m()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,Object,Application]),He("design:returntype",Promise)],Ri.prototype,"add_admin",null),ke([v("/keys/:id/revoke"),tt(),Qe(),Ne(0,p()),Ne(1,h("id")),Ne(2,lt()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,Qt,Application]),He("design:returntype",Promise)],Ri.prototype,"revoke",null),ke([v("/:id/keys/:key/revoke"),tt(),Qe(),Ze("users.keys.admin"),Ne(0,p()),Ne(1,h("id")),Ne(2,h("key")),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,String,Application]),He("design:returntype",Promise)],Ri.prototype,"revoke_admin",null),ke([w("/keys/:id"),tt(),Ye(),Ne(0,p()),Ne(1,h("id")),Ne(2,lt()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,Qt,Application]),He("design:returntype",Promise)],Ri.prototype,"del",null),ke([w("/:id/keys/:key"),tt(),Ye(),Ze("users.keys.admin"),Ne(0,p()),Ne(1,h("id")),Ne(2,h("key")),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,String,Application]),He("design:returntype",Promise)],Ri.prototype,"del_admin",null),ke([c("/keys"),tt(),Je(),Ne(0,p()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,Qt]),He("design:returntype",Promise)],Ri.prototype,"all",null),ke([c("/keys/:id"),tt(),Je(),Ne(0,p()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,Qt]),He("design:returntype",Promise)],Ri.prototype,"get",null),ke([c("/:id/keys"),tt(),Je(),Ze("users.keys.admin"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ri.prototype,"all_admin",null),ke([c("/:user/keys/:id"),tt(),Je(),Ze("users.keys.admin"),Ne(0,p()),Ne(1,h("user")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ri.prototype,"get_admin",null),Ri=ke([g("/users")],Ri);let ji=class UsersTenantsController extends ModelController{constructor(){super(...arguments),this.model=zt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(i),yield this.addTenants(e,t,i),e.success("OK")})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{include:[{association:"users_tenants",required:!0,attributes:[],where:{user_id:t}}]}})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(i),yield Gt.destroy(Object.assign({where:{user_id:t,tenant_id:{[ue.in]:i}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,i){return Fe(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(i);const r=yield this.addTenants(e,t,i);yield Gt.destroy(Object.assign({where:{user_id:t,tenant_id:{[ue.notIn]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addTenants(e,t,i){return Fe(this,void 0,void 0,function*(){const r=[];return yield z(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Gt.findOrCreate(Object.assign({where:{user_id:t,tenant_id:i},defaults:{user_id:t,tenant_id:i}},{ctx:e})).catch(this.error))&&void 0!==n?n:[];s&&r.push(i)})),r})}ensureTenants(e){return Fe(this,void 0,void 0,function*(){var t;if(e.length!=K(e).length)throw new o("Duplicate tenant id");if((null!==(t=yield zt.count({where:{id:{[ue.in]:e}}}).catch(this.error))&&void 0!==t?t:0)!=e.length)throw new o("Invalid tenant id")})}ensureUser(e){return Fe(this,void 0,void 0,function*(){var t;if(!(null!==(t=yield Qt.count({where:{id:e}}).catch(this.error))&&void 0!==t?t:0))throw new l})}};ke([v("/:id/tenants"),tt(),ze(),Qe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],ji.prototype,"add",null),ke([c("/:id/tenants"),tt(),Je(),Qe("users"),Ne(0,p()),Ne(1,h("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],ji.prototype,"all",null),ke([w("/:id/tenants"),tt(),Ye(),Qe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],ji.prototype,"del",null),ke([S("/:id/tenants"),tt(),Qe(),Qe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,p()),Ne(1,h("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],ji.prototype,"set",null),ji=ke([g("/users")],ji);export{Application,Ht as Audit,Xt as AuditModel,qe as AuditTypes,ui as AuditsController,ci as AuthController,ai as AuthService,li as BaseController,ze as CanCreate,Ye as CanDelete,Je as CanRead,Qe as CanUpdate,Config,Zt as ConfigModel,CrudController,Env,pi as FilesController,hi as ForgotController,ei as ForgotModel,Wt as GroupModel,$t as GroupRoleModel,Be as GroupTypes,gi as GroupsController,vi as GroupsPermissionsController,yi as GroupsRolesController,Xe as HasGroups,Ze as HasPermissions,et as HasScope,mi as HealthController,tt as IsAuthenticated,Log,Ue as LogLevels,ti as LogModel,Loggable,fi as LogsController,mt as MCP_DEFAULT_PROTOCOL_VERSION,St as MCP_HTTP_ALLOW,wt as MCP_HTTP_ALLOWED_METHODS,Ot as MCP_HTTP_DEFAULT_ALLOWED_HEADERS,ft as MCP_PROTOCOL_VERSION_HEADER,Et as MCP_SESSION_ID_HEADER,yt as MCP_SUPPORTED_PROTOCOL_VERSIONS,bt as MCP_TOOL_METADATA,Ei as McpController,McpError,ut as McpErrorCode,McpHttpHandler,McpInternalError,McpInvalidParamsError,McpInvalidRequestError,McpInvalidSessionError,McpMethodNotFoundError,McpParseError,McpServerError,McpSessionStore,xt as McpTool,McpToolNotFoundError,McpToolRegistry,ii as MigrationModel,ModelController,ModelService,qt as PageModel,Ve as PageTypes,wi as PagesController,Bt as PermissionModel,Si as PermissionsController,Oi as ProfileController,_i as RegisterController,Lt as RegisterModel,Ft as RegisterWorker,it as ReqAccess,rt as ReqGroup,nt as ReqGroups,st as ReqPermission,ot as ReqPermissions,dt as ReqTenant,at as ReqTenants,lt as ReqUser,Vt as RoleModel,Ut as RolePermissionModel,Ai as RolesController,bi as RolesPermissionsController,Secret,ri as SecretModel,oi as Service,ni as SessionModel,SessionStore,Ti as SetupController,zt as TenantModel,$e as TenantStatus,Pi as TenantsController,Ii as TestController,Kt as UserAuthModel,Yt as UserGroupModel,si as UserKeyModel,Qt as UserModel,Jt as UserPasswordModel,di as UserService,We as UserStatus,Gt as UserTenantModel,Ci as UsersController,xi as UsersGroupsController,Ri as UsersKeysController,ji as UsersTenantsController,WorkerRegistry,Tt as assertValidMcpToolDefinition,Ge as canFactory,It as discoverMcpTools,Pt as getMcpToolMetadata,_t as isJsonParseError,ct as isJsonRpcId,At as jsonParseErrorResponse,ht as jsonRpcError,gt as jsonRpcErrorFromCode,pt as jsonRpcResult,vt as parseJsonRpcRequest,Ke as sequelize};
|