@andrewcaires/api 5.4.1 → 5.4.3

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.esm.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v5.4.1
2
+ * @andrewcaires/api v5.4.3
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,UnauthorizedError as t,parameterFactory as i,ResponseError as r,Context as n,InternalServerError as s,ValidationError as o,StatusCodes as d,BadRequestError as a,NotFoundError as l,Application as u,Extends as c,Get as p,Ctx as h,Controller as v,Post as g,ValidateBody as y,Body as m,App as f,Middleware as E,Delete as S,Put as O,Params as _,All as A,Options as w,Upload as T,ConflictError as b,ForbiddenError as P}from"@andrewcaires/express";import{isUndefined as I,isFunction as x,includesArray as C,isPlainObject as R,isString as j,isNumber as D,uuidv7 as M,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 G,forEachAsync as z,upperCamelCase as W,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 ve,Encryptor as ge,sha256 as ye}from"@andrewcaires/node";import{config as me}from"dotenv";import{metadata as fe,isClassMethodDecoratorContext as Ee,Trait as Se,Singleton as Oe}from"@andrewcaires/decorator";import{Store as _e}from"express-session";import Ae from"jsonwebtoken";import{createHmac as we,timingSafeEqual as Te}from"node:crypto";import{verify as be,hashSync as Pe}from"@node-rs/argon2";import{existsSync as Ie,statSync as xe,readdirSync as Ce,mkdirSync as Re,lstatSync as je,rmSync as De}from"node:fs";import{join as Me}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,Ge;!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"}(Ge||(Ge={}));const ze=i=>r=>(n,s,o)=>{e(e=>Fe(void 0,void 0,void 0,function*(){var n;I(r)&&(r=x(e.controller.name)?e.controller.name():null===(n=e.controller.constructor)||void 0===n?void 0:n.name);const{permissions:s=[]}=e.req;if(s.includes(`${r}.${i}`))return e.next();e.error(new t("Access Denied"))}))(n,s,o)},We=ze("create"),Ye=ze("delete"),Je=ze("read"),Xe=ze("update"),Qe=(...i)=>(r,n,s)=>{e(e=>Fe(void 0,void 0,void 0,function*(){const{groups:r=[]}=e.req;if(C(i,r))return e.next();e.error(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(C(i,r))return e.next();e.error(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=x(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();e.error(new t("Access Denied"))}))(r,n,s)},tt=()=>(t,i,r)=>{e(e=>Fe(void 0,void 0,void 0,function*(){yield(e=>Fe(void 0,void 0,void 0,function*(){var t;if(e.req.access&&e.req.user)return e.next();const{authService:i}=e.app,{access:r,user:n}=null!==(t=yield i.apiAuth(e).catch(t=>{e.error(t)}))&&void 0!==t?t:{};r&&n&&e.next()}))(e)}))(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)||D(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}:{})}),vt=(e,t,i,r)=>({jsonrpc:"2.0",id:e,error:Object.assign({code:t,message:i},void 0!==r?{data:r}:{})}),gt=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",St=["POST","DELETE","OPTIONS"],Ot=St.join(", "),_t=["Content-Type","Accept",Et,ft],At=e=>{if(!(e instanceof SyntaxError))return!1;const t=e;return"entity.parse.failed"===t.type||400===t.status||400===t.statusCode},wt=e=>{if(At(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=gt(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:Ot},r?{"Access-Control-Allow-Origin":r}:{}),r&&"*"!==r?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":Ot,"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:M(),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 Tt=Symbol.for("@andrewcaires/api:mcp:tool"),bt=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(I(e.input))throw new Error(`MCP tool "${e.name}" input must be declared`)},Pt=e=>{const t=fe(Tt,e,[]);return t.length||"function"==typeof e?t:fe(Tt,Object.getPrototypeOf(e),[])},It=e=>{const t=[];for(const i of e)for(const e of Pt(i))t.push(xt(i,e));return t},xt=(e,t)=>{const i=e[t.propertyKey];if(!x(i))throw new Error(`MCP tool "${t.name}" handler was not found`);return bt(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(bt(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 Ct=e=>(bt(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(Tt,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,v;const g=i.ctx instanceof n?i.ctx:null,y=null!==(r=null==g?void 0:g.id)&&void 0!==r?r:null,m=null!==(a=null!==(d=null===(o=null===(s=null==g?void 0:g.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 g?Object.assign(Object.assign({},f),{full_url:null!==(c=g.getUrl())&&void 0!==c?c:"",ip_address:null!==(p=g.getIp())&&void 0!==p?p:"",user_agent:null!==(v=null===(h=g.req)||void 0===h?void 0:h.headers["user-agent"])&&void 0!==v?v:""}):f},Dt=e=>{const t=F(e),i=t.primaryKeyAttribute;return{model:t,record_id:i?e.getDataValue(i):null}},Mt={afterCreate:(e,t)=>Fe(void 0,void 0,void 0,function*(){const{model:i,record_id:r}=Dt(e),n=Object.entries(e.toJSON()),s=Object.fromEntries(n.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield ti.create(Object.assign(Object.assign({},jt(qe.CREATE,i,t)),{record:r,currently:s})).catch(he.catch)}),afterUpdate:(e,t)=>Fe(void 0,void 0,void 0,function*(){const{model:i,record_id:r}=Dt(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 ti.create(Object.assign(Object.assign({},jt(qe.UPDATE,i,t)),{record:r,currently:n,previously:s})).catch(he.catch)}),afterDestroy:(e,t)=>Fe(void 0,void 0,void 0,function*(){const{model:i,record_id:r}=Dt(e),n=Object.entries(e.toJSON()),s=Object.fromEntries(n.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield ti.create(Object.assign(Object.assign({},jt(qe.DELETE,i,t)),{record:r,currently:s})).catch(he.catch)})},kt=e=>(I(e)&&(e=Env.DATABASE_AUDIT),te(e?Mt:{})),Nt=Symbol.for("@andrewcaires/api:worker"),Ht=e=>{if(!j(e)||!e.trim())throw new Error("Worker name is required");return(t,i)=>{Ee(i)?i.addInitializer(function(){qt(this.constructor,i.name,e)}):qt(t,i,e)}},Ft=e=>{const t=fe(Nt,e,[]);return t.length||"function"==typeof e?t:fe(Nt,Object.getPrototypeOf(e),[])},Lt=e=>{const t=[];for(const i of e)for(const e of Ft(i))t.push(Bt(i,e));return Ut(t),t},Kt=(e,t)=>Fe(void 0,void 0,void 0,function*(){const i=Lt(e).find(e=>e.name===t);if(!i)throw new Error(`Worker "${t}" not found`);return i.run()}),qt=(e,t,i)=>{const r=fe(Nt,e,[]),n={name:i,propertyKey:t};r.some(e=>e.propertyKey===n.propertyKey&&e.name===n.name)||r.push(n)},Bt=(e,t)=>{if(!j(t.name)||!t.name.trim())throw new Error("Worker name is required");const i=e[t.propertyKey];if(!x(i))throw new Error(`Worker "${t.name}" handler was not found`);return{name:t.name,run:()=>i.call(e)}},Ut=e=>{const t=new Set;for(const i of e){if(t.has(i.name))throw new Error(`Duplicate worker name: ${i.name}`);t.add(i.name)}};let Vt=class RegisterModel extends de{};ke([ie.Id(7),He("design:type",String)],Vt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Vt.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Number)],Vt.prototype,"expired_at",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Vt.prototype,"active",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.BelongsTo(()=>ei),He("design:type",String)],Vt.prototype,"user_id",void 0),Vt=ke([ne(Ke),se("register"),oe("5.3.6")],Vt);let $t=class UserAuthModel extends de{};ke([ie.Id(7),He("design:type",String)],$t.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],$t.prototype,"hash",void 0),ke([ie.String(),He("design:type",String)],$t.prototype,"ip_address",void 0),ke([ie.String(),He("design:type",String)],$t.prototype,"user_agent",void 0),ke([ie.FullDate(),He("design:type",Object)],$t.prototype,"revoked_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],$t.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],$t.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],$t.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],$t.prototype,"user_id",void 0),$t=ke([ne(Ke),se("users_auth"),oe("5.3.6")],$t);let Gt=class PageModel extends de{};ke([ie.Id(7),He("design:type",String)],Gt.prototype,"id",void 0),ke([ie.String(),ae(Ve.PAGE),He("design:type",String)],Gt.prototype,"type",void 0),ke([ie.String(),He("design:type",String)],Gt.prototype,"name",void 0),ke([ie.Text(),He("design:type",String)],Gt.prototype,"description",void 0),ke([ie.String(),He("design:type",String)],Gt.prototype,"icon",void 0),ke([ie.String(),He("design:type",String)],Gt.prototype,"path",void 0),ke([ie.Timestamp(),He("design:type",Number)],Gt.prototype,"position",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Gt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Gt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Gt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Gt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Gt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Gt),He("design:type",String)],Gt.prototype,"page_id",void 0),ke([re.HasMany(()=>Gt),He("design:type",Array)],Gt.prototype,"pages",void 0),ke([re.BelongsTo(()=>zt),He("design:type",String)],Gt.prototype,"permission_id",void 0),Gt=ke([ne(Ke),se("page"),kt(),oe("5.3.6")],Gt);let zt=class PermissionModel extends de{};ke([ie.Id(7),He("design:type",String)],zt.prototype,"id",void 0),ke([ie.String(),le(),He("design:type",String)],zt.prototype,"name",void 0),ke([ie.Text(),He("design:type",String)],zt.prototype,"description",void 0),ke([ie.Boolean(),He("design:type",Boolean)],zt.prototype,"active",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(()=>Wt),He("design:type",Array)],zt.prototype,"groups_permissions",void 0),ke([re.HasMany(()=>Gt),He("design:type",Array)],zt.prototype,"pages",void 0),zt=ke([ne(Ke),se("permission"),kt(),oe("5.3.6")],zt);let Wt=class GroupPermissionModel extends de{};ke([ie.Id(7),He("design:type",String)],Wt.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Wt.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Yt),He("design:type",String)],Wt.prototype,"group_id",void 0),ke([re.BelongsTo(()=>zt),He("design:type",String)],Wt.prototype,"permission_id",void 0),Wt=ke([ne(Ke),se("groups_permissions"),kt(),oe("5.3.6")],Wt);let Yt=class GroupModel extends de{};ke([ie.Id(7),He("design:type",String)],Yt.prototype,"id",void 0),ke([ie.String(),le(),He("design:type",String)],Yt.prototype,"name",void 0),ke([ie.Text(),He("design:type",String)],Yt.prototype,"description",void 0),ke([ie.Enum(Be),ae(Be.SYSTEM),He("design:type",String)],Yt.prototype,"type",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Yt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Yt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Yt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Yt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Yt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>Qt),He("design:type",Array)],Yt.prototype,"users_groups",void 0),ke([re.HasMany(()=>Wt),He("design:type",Array)],Yt.prototype,"groups_permissions",void 0),Yt=ke([ne(Ke),se("group"),kt(),oe("5.3.6")],Yt);let Jt=class UserTenantModel extends de{};ke([ie.Id(7),He("design:type",String)],Jt.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Jt.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],Jt.prototype,"tenant_id",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],Jt.prototype,"user_id",void 0),Jt=ke([ne(Ke),se("users_tenants"),kt(),oe("5.3.6")],Jt);let Xt=class TenantModel 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.Text(),He("design:type",String)],Xt.prototype,"description",void 0),ke([ie.Enum($e),ae($e.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(()=>Jt),He("design:type",Array)],Xt.prototype,"users_tenants",void 0),Xt=ke([ne(Ke),se("tenant"),kt(),oe("5.3.6")],Xt);let Qt=class UserGroupModel extends de{};ke([ie.Id(7),He("design:type",String)],Qt.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Qt.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Yt),He("design:type",String)],Qt.prototype,"group_id",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],Qt.prototype,"user_id",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],Qt.prototype,"tenant_id",void 0),Qt=ke([ne(Ke),se("users_groups"),kt(),oe("5.3.6")],Qt);let Zt=class UserPasswordModel extends de{};ke([ie.Id(7),He("design:type",String)],Zt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Zt.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Object)],Zt.prototype,"revoked_at",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.BelongsTo(()=>ei),He("design:type",String)],Zt.prototype,"user_id",void 0),Zt=ke([ne(Ke),se("users_password"),kt(),oe("5.3.6")],Zt);let ei=class UserModel extends de{};ke([ie.Id(7),He("design:type",String)],ei.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ei.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],ei.prototype,"username",void 0),ke([ie.String(),He("design:type",String)],ei.prototype,"email",void 0),ke([ie.Text(),He("design:type",String)],ei.prototype,"notes",void 0),ke([ie.Enum(Ge),ae(Ge.ACTIVE),He("design:type",String)],ei.prototype,"status",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],ei.prototype,"metadata",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.HasMany(()=>ti),He("design:type",Array)],ei.prototype,"audits",void 0),ke([re.HasMany(()=>$t),He("design:type",Array)],ei.prototype,"users_auths",void 0),ke([re.HasMany(()=>Vt),He("design:type",Array)],ei.prototype,"registers",void 0),ke([re.HasMany(()=>Qt),He("design:type",Array)],ei.prototype,"users_groups",void 0),ke([re.HasMany(()=>Zt),He("design:type",Array)],ei.prototype,"users_passwords",void 0),ke([re.HasMany(()=>Jt),He("design:type",Array)],ei.prototype,"users_tenants",void 0),ei=ke([ne(Ke),se("user"),kt(),oe("5.3.6")],ei);let ti=class AuditModel extends de{};ke([ie.Id(7),He("design:type",String)],ti.prototype,"id",void 0),ke([ie.Enum(qe),He("design:type",String)],ti.prototype,"type",void 0),ke([ie.String(),He("design:type",String)],ti.prototype,"model",void 0),ke([ie.String(),He("design:type",String)],ti.prototype,"record",void 0),ke([ie.Json(),He("design:type",Object)],ti.prototype,"currently",void 0),ke([ie.Json(),He("design:type",Object)],ti.prototype,"previously",void 0),ke([ie.String(36),He("design:type",String)],ti.prototype,"request_id",void 0),ke([ie.Text(),He("design:type",String)],ti.prototype,"full_url",void 0),ke([ie.String(),He("design:type",String)],ti.prototype,"ip_address",void 0),ke([ie.Text(),He("design:type",String)],ti.prototype,"user_agent",void 0),ke([ie.String(),He("design:type",String)],ti.prototype,"source",void 0),ke([ie.FullDate(),He("design:type",Object)],ti.prototype,"reverted_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ti.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ti.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],ti.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],ti.prototype,"user_id",void 0),ti=ke([ne(Ke),se("audit"),oe("5.3.6")],ti);let ii=class ConfigModel extends de{};ke([ie.Id(7),He("design:type",String)],ii.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ii.prototype,"key",void 0),ke([ie.Text(),He("design:type",String)],ii.prototype,"value",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("configs"),oe("5.3.6")],ii);let ri=class ForgotModel extends de{};ke([ie.Id(7),He("design:type",String)],ri.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ri.prototype,"secret",void 0),ke([ie.FullDate(),He("design:type",Number)],ri.prototype,"expired_at",void 0),ke([ie.Boolean(),He("design:type",Boolean)],ri.prototype,"active",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),ke([ie.DeletedAt(),He("design:type",Object)],ri.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],ri.prototype,"user_id",void 0),ri=ke([ne(Ke),se("forgot"),oe("5.3.6")],ri);let ni=class LogModel extends de{};ke([ie.Id(7),He("design:type",String)],ni.prototype,"id",void 0),ke([ie.Enum(Ue),ae(Ue.INFO),He("design:type",String)],ni.prototype,"level",void 0),ke([ie.Text(),He("design:type",String)],ni.prototype,"message",void 0),ke([ie.String(),He("design:type",String)],ni.prototype,"source",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ni.prototype,"created_at",void 0),ni=ke([ne(Ke),se("log"),oe("5.3.6")],ni);let si=class MigrationModel extends de{};ke([ie.Id(7),He("design:type",String)],si.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],si.prototype,"model",void 0),ke([ie.String(),He("design:type",String)],si.prototype,"version",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),si=ke([ne(Ke),se("migration"),oe("5.3.6")],si);let oi=class SecretModel extends de{};ke([ie.Id(7),He("design:type",String)],oi.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],oi.prototype,"key",void 0),ke([ie.Text(),He("design:type",String)],oi.prototype,"hash",void 0),ke([ie.CreatedAt(),He("design:type",Date)],oi.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],oi.prototype,"updated_at",void 0),oi=ke([ne(Ke),se("secret"),oe("5.3.6")],oi);let di=class SessionModel extends de{};ke([ie.Id(7),He("design:type",String)],di.prototype,"id",void 0),ke([ie.Json(),He("design:type",Object)],di.prototype,"data",void 0),ke([ie.FullDate(),He("design:type",Date)],di.prototype,"expired_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],di.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],di.prototype,"updated_at",void 0),di=ke([ne(Ke),se("session"),oe("5.3.6")],di);let ai=class UserKeyModel extends de{};ke([ie.Id(7),He("design:type",String)],ai.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ai.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],ai.prototype,"prefix",void 0),ke([ie.Text(),He("design:type",String)],ai.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Object)],ai.prototype,"last_used_at",void 0),ke([ie.FullDate(),He("design:type",Object)],ai.prototype,"expires_at",void 0),ke([ie.FullDate(),He("design:type",Object)],ai.prototype,"revoked_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ai.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ai.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],ai.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],ai.prototype,"user_id",void 0),ai=ke([ne(Ke),se("users_key"),kt(),oe("5.3.6")],ai);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:ve.White,e,t),Ke&&(yield ni.create({level:e,message:t,source:null!=i?i:""}).catch(he.catch))})}}Log.colors={error:ve.Red,info:ve.Cyan,warn:ve.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 ii.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 ii.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return Fe(this,arguments,void 0,function*(e,t=""){const[i]=(yield ii.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 ii.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 oi.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 oi.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 oi.findOrCreate({where:{key:e},defaults:{key:e,value: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 oi.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 ge(Env.ENCRYPTION_SECRET))}}class SessionStore extends _e{constructor(){super(),this.all=e=>Fe(this,void 0,void 0,function*(){e=e||L;const t=yield di.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 di.destroy().catch(he.catch),e&&e()}),this.destroy=(e,t)=>Fe(this,void 0,void 0,function*(){yield di.destroy({where:{id:e}}).catch(he.catch),t&&t()}),this.expired=()=>Fe(this,void 0,void 0,function*(){yield di.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 di.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 di.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 di.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 li=class Service{};li=ke([Se(Loggable)],li);let ui=class UserService extends li{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 ei.count({where:{id:e}}).catch(this.error))&&void 0!==i?i:0))return!1;const n=null!==(r=yield Zt.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 be(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 ei.count({where:{id:e}}).catch(this.error))&&void 0!==i?i:0))return!1;const r=yield Zt.findOne({attributes:["hash"],where:{revoked_at:null,user_id:e}}).catch(this.error);return t+=Env.PASSWORD_PEPPER,r&&(yield be(r.hash,t).catch(L))||!1})}createPassword(e,t,i){return Fe(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield ei.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))return!1;yield Zt.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 Zt.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 Yt.findAll({attributes:["name"],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.name))})}getPermissions(e,t){return Fe(this,void 0,void 0,function*(){var i;return(null!==(i=yield zt.findAll({attributes:["name"],where:{active:!0},include:[{association:"groups_permissions",required:!0,include:[{association:"group",required:!0,attributes:["id","name"],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.name)})}getTenants(e){return Fe(this,void 0,void 0,function*(){var t;return(null!==(t=yield Xt.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}))})}};ui=ke([Oe()],ui);let ci=class AuthService extends li{constructor(){super(),this.options={algorithm:"HS256",expiresIn:`${Env.TOKEN_TTL}ms`},this.userAttributes={exclude:["username","notes","deleted_at"]},this.userService=new ui}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=we("sha256",Env.TOKEN_PEPPER).update(o).digest("hex");if(!(yield ai.create({name:t,prefix:n,hash:d,expires_at:i,user_id:r.id},Object.assign({},{ctx:e})).catch(this.error)))throw new s("API key could not be created");return 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 $t.create({hash:n,user_id:r},Object.assign({},{ctx:e})).catch(this.error);if(!o)throw new s;const d=Ae.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}})}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 $t.findOne({where:{hash:r},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:i,status:Ge.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:Ae.sign({id:i,hash:n.hash},Env.TOKEN_SECRET,this.options)}})}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 $t&&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 ai.findOne({where:{prefix:i},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{status:Ge.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=we("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}).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 $t.findOne({attributes:{exclude:["hash"]},where:{hash:r},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:i,status:Ge.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}})}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&&Te(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 Ae.verify(e,Env.TOKEN_SECRET,{algorithms:["HS256"],clockTolerance:i})}catch(e){throw new t("Invalid token")}})}};ci=ke([Oe(),He("design:paramtypes",[])],ci);class ModelService extends li{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");I(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 null;const s=null==e?void 0:e.getQuery(i?`${i}_where`:"where");if(!j(s))return null;const d=t.attributes,a=ce.parse(d,s);return I(a.error)?(t.where=Object.assign(Object.assign({},null!==(r=t.where)&&void 0!==r?r:{}),null!==(n=a.value)&&void 0!==n?n:{}),null):new o(a.error.join(", "))}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);const o=this.applyWhere(r,s);if(o)return null==r||r.error(o),0;this.applySelect(r,s);const a=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:a}),a})}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)return null==n||n.error(new s),null;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(I(d))return null==r||r.error(new a),0;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);return c?(null==r||r.success("OK"),c):(null==r||r.error(new l),0)})}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=I(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);if(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){const e=this.applyWhere(r,a);if(e)return null==r||r.error(e),{count:0,records:[]}}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(I(h))return null==s||s.error(new a),null;const v=$({},u);v.attributes=this.getAttributes(null!==(i=null==v?void 0:v.attributes)&&void 0!==i?i:[]),c&&this.applySelect(s,v);const g=yield this.model.findOne(Object.assign(Object.assign({},v),{where:{[ue.and]:Object.assign({[p]:h},null!==(r=null==v?void 0:v.where)&&void 0!==r?r:{})}})).catch(this.error);return g?(null==s||s.prepare(d.OK,n?yield n(g):g.toJSON()),g):(null==s||s.error(new l),null)})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var i;const r=G(t),{ctx:n}=null!=t?t:{};r.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(i=r.attributes)&&void 0!==i?i:[]),this.applySearch(n,r);const s=this.applyWhere(n,r,t.name);return s?(null==n||n.error(s),null):(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={description:"",active:!0};yield z(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=W(e.replace(/_/g," ")," ");yield zt.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${W(i," ")}`,key:r,tags:n},t)})}))})}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(I(p))return null==s||s.error(new a),!1;const h=$({},u),v=$({},null!==(r=null===(i=null==s?void 0:s.req)||void 0===i?void 0:i.body)&&void 0!==r?r:{},null!=o?o:{}),g=yield this.model.findOne(Object.assign(Object.assign({},h),{attributes:this.getAttributes([c,...Object.keys(v)]),where:{[ue.and]:Object.assign({[c]:p},null!==(n=null==h?void 0:h.where)&&void 0!==n?n:{})}})).catch(this.error);return g?(g.set(v),g.changed()?(null==s||s.success("OK"),yield g.save(Object.assign({},{ctx:s})).catch(this.error),!0):(null==s||s.success("Record not changed"),!1)):(null==s||s.error(new l),!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:M},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*(){x(e.sync)&&(yield e.sync(this))})),this.authService=new ci,this.userService=new ui,this._prepared=!0)})}run(){return Fe(this,arguments,void 0,function*(e=process.argv){const t=this.workerCliRequest(e);if(t)try{const e=yield this.runWorker(t.name);return this.writeWorkerResult(e),e}catch(e){this.error(e)}else yield this.listen()})}runWorker(e){return Fe(this,void 0,void 0,function*(){return yield this.prepare(),Kt(this.controllers,e)})}workerCliRequest(e=process.argv){const t=this.getCliOption(e,"--worker");if(t)return{name:t}}getCliOption(e,t){const i=e.find(e=>e.startsWith(`${t}=`));if(i){const e=i.slice(t.length+1).trim();if(!e)throw new Error(`Option "${t}" requires a value`);return e}const r=e.indexOf(t);if(r<0)return;const n=e[r+1];if(!n||n.startsWith("-"))throw new Error(`Option "${t}" requires a value`);return n}writeWorkerResult(e){void 0!==e&&("string"!=typeof e?process.stdout.write(`${JSON.stringify(e)}\n`):process.stdout.write(`${e}\n`))}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 si.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 pi=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=W(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=`${e}.${i}`;yield zt.findOrCreate({where:{name:r},defaults:{name:r,description:`${t} ${W(i," ")}`,active:!0}})}))})}};pi=ke([Se(Loggable)],pi);let hi=class ModelController extends pi{constructor(){super(...arguments),this.attributes=[],this.permissions=["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=W(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=`${e}.${i}`;yield zt.findOrCreate({where:{name:r},defaults:{name:r,description:`${t} ${W(i," ")}`,active:!0}})})),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}};hi=ke([c(pi)],hi);let vi=class AuditsController extends hi{constructor(){super(...arguments),this.model=ti,this.permissions=["read"]}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["currently","previously"]}}})})}get(e){return Fe(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}};ke([p(),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],vi.prototype,"all",null),ke([p("/:id"),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],vi.prototype,"get",null),vi=ke([v("/audits"),c(hi)],vi);let gi=class AuthController extends pi{constructor(){super(...arguments),this.authService=new ci}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 Zt.findOne({where:{revoked_at:null},include:[{association:"user",required:!0,where:{status:{[ue.in]:[Ge.ACTIVE,Ge.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 be(a.hash,r).catch(L))||void 0===o||!o)return e.error(new t("Invalid credentials")),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});if(a.user.registers.length)return e.error(new t("Activation Required")),s.emit("auth.activation",{ctx:e}),void this.emit("auth.activation",{ctx:e});if(a.user.status!==Ge.ACTIVE)return e.error(new t("Invalid credentials")),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const{token:l}=null!==(d=yield this.authService.createApiToken(e,a.user).catch(t=>{e.error(t),s.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e})}))&&void 0!==d?d:{};l&&(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 ai)return e.error(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))return e.error(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*(){var r;const{token:n}=null!==(r=yield this.authService.renewApiToken(t).catch(t=>{e.error(t)}))&&void 0!==r?r:{};n&&(e.json({token:n}),i.emit("auth.renew",{ctx:e}),this.emit("auth.renew",{ctx:e}))})}};ke([g("/login"),y(e=>({username:e.string().min(3),password:e.string().min(5),remember:e.boolean().parse().default(!1)})),Ne(0,h()),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)],gi.prototype,"login",null),ke([p("/logout"),tt(),Ne(0,h()),Ne(1,it()),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,Object,Application]),He("design:returntype",Promise)],gi.prototype,"logout",null),ke([p("/me"),tt(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],gi.prototype,"user",null),ke([g("/renew"),y(e=>({token:e.string()})),Ne(0,h()),Ne(1,m("token")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],gi.prototype,"renew",null),gi=ke([v("/auth"),c(pi)],gi);let yi=class CrudController extends hi{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)return e.error(new o(n.message||n.error));e.req.body=n.value,e.next()}validateCreate(e){const t=this.CrudValidateCreate();if(t==this._crud)return e.error(new s);this.validate(e,t)}validateUpdate(e){const t=this.CrudValidateUpdate();if(t==this._crud)return e.error(new s);this.validate(e,t)}};ke([g(),tt(),We(),E("validateCreate"),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"add",null),ke([p(),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"all",null),ke([p("/count"),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"rows",null),ke([S("/:id"),tt(),Ye(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"del",null),ke([p("/:id"),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"get",null),ke([O("/:id"),tt(),Xe(),E("validateUpdate"),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"set",null),ke([Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",void 0)],yi.prototype,"validateCreate",null),ke([Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",void 0)],yi.prototype,"validateUpdate",null),yi=ke([c(hi)],yi);let mi=class FilesController extends pi{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=Me(this.directory,t);if(!Ie(i)||!xe(i).isDirectory())return e.error(new l);let r;return r=Ce(i),r=r.map(e=>this.info(Me(i,e))),r=r.filter(Q),Object.assign(Object.assign({},this.info(i)),{files:r})})}info(e){if(!Ie(e))return null;const t=xe(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=W(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=`${e}.${i}`;yield zt.findOrCreate({where:{name:r},defaults:{name:r,description:`${t} ${W(i," ")}`,active:!0}})}))})}};ke([p("/path"),p("/path/*path"),tt(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],mi.prototype,"files",null),mi=ke([v("/files"),c(pi)],mi);let fi=class ForgotController extends pi{check(e,t){return Fe(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)return e.error(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 ei.findOne({where:{[ue.or]:[{email:r},{username:t}]}}).catch(this.error);if(!n)return e.error(new l);const s=B(),o=Date.now()+6e4*Env.TOKEN_TTL_FORGOT,d=yield ri.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)return e.error(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 ri.findOne({where:{token:e,active:!0},include:[{association:"users",required:!0}]}).catch(this.error)})}};ke([p("/check"),y(e=>({token:e.string()})),Ne(0,h()),Ne(1,m("token")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],fi.prototype,"check",null),ke([g(),y(e=>({username:e.string().min(4)})),Ne(0,h()),Ne(1,m("username")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],fi.prototype,"forgot",null),ke([g("/reset"),y(e=>({token:e.string(),password:e.string().min(5)})),Ne(0,h()),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)],fi.prototype,"reset",null),fi=ke([v("/forgot"),c(pi)],fi);let Ei=class GroupsController extends yi{constructor(){super(...arguments),this.model=Yt,this.schemaCreate={name:H.string(),description:H.string().default(""),type:H.enum(Object.values(Be)).default(Be.SYSTEM),active:H.boolean().parse(),metadata:H.object().parse().default({})},this.schemaUpdate={description:H.string().optional(),type:H.enum(Object.values(Be)).optional(),active:H.boolean().parse().optional(),metadata:H.object().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(ei)})}users(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkGroup(e,t))&&(yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_groups",required:!0,attributes:[],where:{group_id:t}}]}}))})}checkGroup(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield Yt.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([p("/:id/users"),tt(),Je("users"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ei.prototype,"users",null),Ei=ke([v("/groups"),c(yi)],Ei);let Si=class GroupsPermissionsController extends hi{constructor(){super(...arguments),this.model=zt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){(yield this.checkGroup(e,t))&&(yield this.checkPermissions(e,i))&&(yield this.addPermissions(e,t,i),e.success("OK"))})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{include:[{association:"groups_permissions",required:!0,attributes:[],where:{group_id:t}}]}})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){(yield this.checkGroup(e,t))&&(yield this.checkPermissions(e,i))&&(yield Wt.destroy(Object.assign({where:{group_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*(){if(!(yield this.checkGroup(e,t)))return;if(!(yield this.checkPermissions(e,i)))return;const r=yield this.addPermissions(e,t,i);yield Wt.destroy(Object.assign({where:{group_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 J(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Wt.findOrCreate(Object.assign({where:{group_id:t,permission_id:i},defaults:{group_id:t,permission_id:i}},{ctx:e})).catch(this.error))&&void 0!==n?n:[];s&&r.push(i)})),r})}checkGroup(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield Yt.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}checkPermissions(e,t){return Fe(this,void 0,void 0,function*(){var i;if(t.length!=K(t).length)return e.error(new o("Duplicate permission id")),!1;return(null!==(i=yield zt.count({where:{id:{[ue.in]:t}}}).catch(this.error))&&void 0!==i?i:0)==t.length||(e.error(new o("Invalid permission id")),!1)})}};ke([g("/:id/permissions"),tt(),We(),Xe("groups"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Si.prototype,"add",null),ke([p("/:id/permissions"),tt(),Je(),Xe("groups"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Si.prototype,"all",null),ke([S("/:id/permissions"),tt(),Ye(),Xe("groups"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Si.prototype,"del",null),ke([O("/:id/permissions"),tt(),Xe(),Xe("groups"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Si.prototype,"set",null),Si=ke([v("/groups"),c(hi)],Si);let Oi=class HealthController{ping(e){return Fe(this,void 0,void 0,function*(){e.json({status:"ok",timestamp:Date.now(),uptime:process.uptime()})})}};ke([A("/"),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Oi.prototype,"ping",null),Oi=ke([v("/health")],Oi);let _i=class LogsController extends hi{constructor(){super(...arguments),this.model=ni,this.permissions=["read"]}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}};ke([p(),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],_i.prototype,"all",null),_i=ke([v("/logs"),c(hi)],_i);let Ai=class McpController extends pi{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",Ot),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:Ot},r?{"Access-Control-Allow-Origin":r}:{}),r&&"*"!==r?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":Ot,"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([p(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ai.prototype,"get",null),ke([w(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ai.prototype,"options",null),ke([g(),tt(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ai.prototype,"post",null),ke([S(),tt(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ai.prototype,"delete",null),Ai=ke([v("/mcp"),c(pi)],Ai);let wi=class PagesController extends yi{constructor(){super(...arguments),this.model=Gt,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(),metadata:H.object().parse().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(),metadata:H.object().parse().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.checkPages(e,i))&&(yield J(t,t=>Fe(this,[t],void 0,function*({id:t,order:i}){yield Gt.update({order:i},Object.assign({where:{id:t},individualHooks:!0},{ctx:e})).catch(this.error)})),e.success("OK"))})}checkPages(e,t){return Fe(this,void 0,void 0,function*(){var i;if(t.length!=K(t).length)return e.error(new o("Duplicate page id")),!1;return(null!==(i=yield Gt.count({where:{id:{[ue.in]:t}}}).catch(this.error))&&void 0!==i?i:0)==t.length||(e.error(new o("Invalid page id")),!1)})}};ke([O("/position"),tt(),Xe(),y(e=>({pages:e.array(e.object({id:e.string().uuid(),position:e.number().parse()}))})),Ne(0,h()),Ne(1,m("pages")),He("design:type",Function),He("design:paramtypes",[n,Array]),He("design:returntype",Promise)],wi.prototype,"position",null),wi=ke([v("/pages"),c(yi)],wi);let Ti=class PermissionsController extends yi{constructor(){super(...arguments),this.model=zt,this.schemaCreate={name:H.string(),description:H.string().default(""),active:H.boolean().parse(),metadata:H.object().parse().default({})},this.schemaUpdate={description:H.string().optional(),active:H.boolean().parse().optional(),metadata:H.object().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(Yt)})}groups(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkPermission(e,t))&&(yield this.groupModelService.findAll({ctx:e,options:{include:[{association:"groups_permissions",required:!0,attributes:[],where:{permission_id:t}}]}}))})}checkPermission(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield zt.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([p("/:id/groups"),tt(),Je("groups"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ti.prototype,"groups",null),Ti=ke([v("/permissions"),c(yi)],Ti);let bi=class RegisterController extends pi{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:a,confirm:l}=t,u=d||o,c=ye(a);if(yield ei.count({where:{[ue.or]:[{email:o},{username:u}]}}).catch(this.error))return e.error("INVALID EMAIL OR USERNAME");if(c!=ye(l))return e.error("INVALID PASSWORD");const p=yield ei.create({name:r,email:o,username:u,password:c,avatar:"",date:n,description:"",status:Ge.PENDING}).catch(this.error);if(!p)return e.error(new s);const h=yield Vt.create({token:yield this.getId(),active:!0,user_id:p.id}).catch(this.error);if(!h)return yield p.destroy().catch(this.error),e.error(new s);e.success("OK"),i.emit("register.user",{ctx:e,register:h,user:p}),this.emit("register.user",{ctx:e,register:h,user:p})})}confirm(e,t,i){return Fe(this,void 0,void 0,function*(){const r=yield Vt.findOne({where:{token:t,active:!0},include:[{association:"users",required:!0}]}).catch(this.error);if(!r)return e.error(new l);r.active=!1,yield r.save().catch(this.error),r.user.status=Ge.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 Vt.findOne({where:{active:!0},include:[{model:ei,required:!0,where:{[ue.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!n)return e.error(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=M();return(yield Vt.count({where:{token:e}}))?this.getId():e})}};ke([g(),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,h()),Ne(1,m()),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,Object,Application]),He("design:returntype",Promise)],bi.prototype,"register",null),ke([g("/confirm"),y(e=>({token:e.string()})),Ne(0,h()),Ne(1,m("token")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],bi.prototype,"confirm",null),ke([g("/send"),y(e=>({username:e.string().min(4)})),Ne(0,h()),Ne(1,m("username")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],bi.prototype,"send",null),bi=ke([v("/register"),c(pi)],bi);let Pi=class SetupController extends pi{constructor(){super(...arguments),this.userService=new ui}setup(e){return Fe(this,void 0,void 0,function*(){var t;if(yield ei.count())return e.error(new l("Endpoint Not Found"));const i=yield ei.create({name:"Admin",username:"admin",email:"admin@localhost.com",notes:"",status:Ge.ACTIVE},Object.assign({},{ctx:e})).catch(this.error);if(!i)return e.error(new s);yield this.userService.createPassword(i.id,"admin",e);const r=yield Yt.create({name:"admin",description:"Admin",active:!0},Object.assign({},{ctx:e}));yield Qt.create({user_id:i.id,group_id:r.id},Object.assign({},{ctx:e})),yield Yt.create({name:"user",description:"User",active:!0},Object.assign({},{ctx:e}));const n=null!==(t=yield zt.findAll({where:{active:!0}}).catch(this.error))&&void 0!==t?t:[];yield J(n,t=>Fe(this,void 0,void 0,function*(){yield Wt.create({group_id:r.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}};ke([p(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Pi.prototype,"setup",null),Pi=ke([v("/setup"),c(pi)],Pi);let Ii=class TenantsController extends yi{constructor(){super(...arguments),this.model=Xt,this.schemaCreate={name:H.string(),description:H.string().default(""),status:H.enum(Object.values($e)).default($e.ACTIVE),metadata:H.object().parse().default({})},this.schemaUpdate={name:H.string().optional(),description:H.string().optional(),status:H.enum(Object.values($e)).optional(),metadata:H.object().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(ei)})}users(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkTenant(e,t))&&(yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_tenants",required:!0,attributes:[],where:{tenant_id:t}}]}}))})}checkTenant(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield Xt.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([p("/:id/users"),tt(),Je("users"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ii.prototype,"users",null),Ii=ke([v("/tenants"),c(yi)],Ii);let xi=class TestController extends pi{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([p(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],xi.prototype,"json",null),ke([Ht("test.sum"),He("design:type",Function),He("design:paramtypes",[]),He("design:returntype",Promise)],xi.prototype,"workerSum",null),ke([Ct({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)],xi.prototype,"sum",null),ke([Ct({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)],xi.prototype,"multiply",null),ke([Ct({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)],xi.prototype,"average",null),ke([Ct({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)],xi.prototype,"validationString",null),ke([Ct({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)],xi.prototype,"validationNumber",null),ke([Ct({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)],xi.prototype,"validationBoolean",null),ke([Ct({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)],xi.prototype,"validationArray",null),ke([Ct({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)],xi.prototype,"validationObject",null),ke([Ct({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)],xi.prototype,"validationEnum",null),ke([Ct({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)],xi.prototype,"validationDate",null),ke([Ct({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)],xi.prototype,"validationOptional",null),ke([Ct({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)],xi.prototype,"validationDefaults",null),ke([Ct({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)],xi.prototype,"validationParse",null),ke([Ct({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)],xi.prototype,"validationNested",null),xi=ke([v("/test"),c(pi)],xi);let Ci=class UsersController extends hi{constructor(){super(),this.model=ei,this.permissions=["avatar","create","read","update","delete","password"],this.path=Env.HTTP_PUBLIC+"/avatar",this.userService=new ui,Env.HTTP_PUBLIC&&Ie(Env.HTTP_PUBLIC)&&!Ie(this.path)&&Re(this.path)}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 ei.findOne({where:{id:t.id}}).catch(this.error);if(!i)return je(o).isFile()&&De(o),e.error(new s);const r=this.path+"/"+i.metadata.avatar_url;if(Ie(r)&&je(r).isFile()&&De(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()&&De(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*(){return(yield this.userService.checkPassword(n.id,i))?(yield this.userService.canAssignPassword(n.id,r))?(yield this.userService.createPassword(n.id,r,e))?e.success("OK"):void e.error(new s):e.error(new b("Password already used")):e.error(new t("Invalid Password"))})}password_admin(e,t,i){return Fe(this,void 0,void 0,function*(){if(yield this.userService.createPassword(i,t,e))return e.success("OK");e.error(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)return e.error(new P);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([g("/avatar"),tt(),et("avatar"),T({file:{count:1,path:`${Env.HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),Ne(0,h()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,ei]),He("design:returntype",Promise)],Ci.prototype,"avatar",null),ke([S("/avatar"),tt(),et("avatar"),Ne(0,h()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,ei]),He("design:returntype",Promise)],Ci.prototype,"avatar_del",null),ke([g("/password"),tt(),et("password"),y(e=>({oldPassword:e.string().min(5),newPassword:e.string().min(5)})),Ne(0,h()),Ne(1,m("oldPassword")),Ne(2,m("newPassword")),Ne(3,lt()),He("design:type",Function),He("design:paramtypes",[n,String,String,ei]),He("design:returntype",Promise)],Ci.prototype,"password",null),ke([g("/:id/password"),tt(),Xe(),y(e=>({password:e.string().min(5)})),Ne(0,h()),Ne(1,m("password")),Ne(2,_("id")),He("design:type",Function),He("design:paramtypes",[n,String,String]),He("design:returntype",Promise)],Ci.prototype,"password_admin",null),ke([g(),tt(),We(),y(e=>({name:e.string(),email:e.string().email(),username:e.string().min(3),notes:e.string().default(""),status:e.enum(Object.values(Ge)).default(Ge.ACTIVE),metadata:e.object().parse().default({})})),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"add",null),ke([p(),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"all",null),ke([p("/count"),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"rows",null),ke([S("/:id"),tt(),Ye(),Ne(0,h()),Ne(1,_("id")),Ne(2,lt()),He("design:type",Function),He("design:paramtypes",[n,String,ei]),He("design:returntype",Promise)],Ci.prototype,"del",null),ke([p("/:id"),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"get",null),ke([O("/: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(Ge)).optional(),metadata:e.object().parse().optional()})),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"set",null),Ci=ke([v("/users"),c(hi),He("design:paramtypes",[])],Ci);let Ri=class UsersGroupsController extends hi{constructor(){super(...arguments),this.model=Yt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){(yield this.checkUser(e,t))&&(yield this.checkGroups(e,i))&&(yield this.addGroups(e,t,i),e.success("OK"))})}all(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkUser(e,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.checkUser(e,t))&&(yield this.checkGroups(e,i))&&(yield Qt.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*(){if(!(yield this.checkUser(e,t)))return;if(!(yield this.checkGroups(e,i)))return;const r=yield this.addGroups(e,t,i);yield Qt.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 J(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Qt.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})}checkGroups(e,t){return Fe(this,void 0,void 0,function*(){var i;if(t.length!=K(t).length)return e.error(new o("Duplicate group id")),!1;return(null!==(i=yield Yt.count({where:{id:{[ue.in]:t}}}).catch(this.error))&&void 0!==i?i:0)==t.length||(e.error(new o("Invalid group id")),!1)})}checkUser(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield ei.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([g("/:id/groups"),tt(),We(),Xe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Ri.prototype,"add",null),ke([p("/:id/groups"),tt(),Je(),Xe("users"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ri.prototype,"all",null),ke([S("/:id/groups"),tt(),Ye(),Xe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Ri.prototype,"del",null),ke([O("/:id/groups"),tt(),Xe(),Xe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Ri.prototype,"set",null),Ri=ke([v("/users"),c(hi)],Ri);let ji=class UsersKeysController extends hi{constructor(){super(...arguments),this.model=ai,this.permissions=["create","read"]}add(e,t,i,r){return Fe(this,void 0,void 0,function*(){e.json({token: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 ei.findOne({where:{id:t}}).catch(this.error);if(!n)return e.error(new l);e.json({token:yield r.authService.createApiKey(e,i.name,i.expires_at,n)})})}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}}]}})})}all_admin(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkUser(e,t))&&(yield this.findAll({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t}}]}}))})}checkUser(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield ei.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([g("/keys"),tt(),We(),y(e=>({name:e.string(),expires_at:e.date()})),Ne(0,h()),Ne(1,lt()),Ne(2,m()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,ei,Object,Application]),He("design:returntype",Promise)],ji.prototype,"add",null),ke([g("/:id/keys"),tt(),We(),Xe("users"),y(e=>({name:e.string(),expires_at:e.date()})),Ne(0,h()),Ne(1,_("id")),Ne(2,m()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,Object,Application]),He("design:returntype",Promise)],ji.prototype,"add_admin",null),ke([p("/keys"),tt(),Je(),Ne(0,h()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,ei]),He("design:returntype",Promise)],ji.prototype,"all",null),ke([p("/:id/keys"),tt(),Je(),Xe("users"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],ji.prototype,"all_admin",null),ji=ke([v("/users"),c(hi)],ji);let Di=class UsersTenantsController extends hi{constructor(){super(...arguments),this.model=Xt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){(yield this.checkUser(e,t))&&(yield this.checkTenants(e,i))&&(yield this.addTenants(e,t,i),e.success("OK"))})}all(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkUser(e,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.checkUser(e,t))&&(yield this.checkTenants(e,i))&&(yield Jt.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*(){if(!(yield this.checkUser(e,t)))return;if(!(yield this.checkTenants(e,i)))return;const r=yield this.addTenants(e,t,i);yield Jt.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 J(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Jt.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})}checkTenants(e,t){return Fe(this,void 0,void 0,function*(){var i;if(t.length!=K(t).length)return e.error(new o("Duplicate tenant id")),!1;return(null!==(i=yield Xt.count({where:{id:{[ue.in]:t}}}).catch(this.error))&&void 0!==i?i:0)==t.length||(e.error(new o("Invalid tenant id")),!1)})}checkUser(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield ei.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([g("/:id/tenants"),tt(),We(),Xe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Di.prototype,"add",null),ke([p("/:id/tenants"),tt(),Je(),Xe("users"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Di.prototype,"all",null),ke([S("/:id/tenants"),tt(),Ye(),Xe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Di.prototype,"del",null),ke([O("/:id/tenants"),tt(),Xe(),Xe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Di.prototype,"set",null),Di=ke([v("/users"),c(hi)],Di);export{Application,kt as Audit,ti as AuditModel,qe as AuditTypes,vi as AuditsController,gi as AuthController,ci as AuthService,pi as BaseController,We as CanCreate,Ye as CanDelete,Je as CanRead,Xe as CanUpdate,Config,ii as ConfigModel,yi as CrudController,Env,mi as FilesController,fi as ForgotController,ri as ForgotModel,Yt as GroupModel,Wt as GroupPermissionModel,Be as GroupTypes,Ei as GroupsController,Si as GroupsPermissionsController,Qe as HasGroups,Ze as HasPermissions,et as HasScope,Oi as HealthController,tt as IsAuthenticated,Log,Ue as LogLevels,ni as LogModel,Loggable,_i as LogsController,mt as MCP_DEFAULT_PROTOCOL_VERSION,Ot as MCP_HTTP_ALLOW,St as MCP_HTTP_ALLOWED_METHODS,_t as MCP_HTTP_DEFAULT_ALLOWED_HEADERS,ft as MCP_PROTOCOL_VERSION_HEADER,Et as MCP_SESSION_ID_HEADER,yt as MCP_SUPPORTED_PROTOCOL_VERSIONS,Tt as MCP_TOOL_METADATA,Ai as McpController,McpError,ut as McpErrorCode,McpHttpHandler,McpInternalError,McpInvalidParamsError,McpInvalidRequestError,McpInvalidSessionError,McpMethodNotFoundError,McpParseError,McpServerError,McpSessionStore,Ct as McpTool,McpToolNotFoundError,McpToolRegistry,si as MigrationModel,hi as ModelController,ModelService,Gt as PageModel,Ve as PageTypes,wi as PagesController,zt as PermissionModel,Ti as PermissionsController,bi as RegisterController,Vt as RegisterModel,it as ReqAccess,rt as ReqGroup,nt as ReqGroups,st as ReqPermission,ot as ReqPermissions,dt as ReqTenant,at as ReqTenants,lt as ReqUser,Secret,oi as SecretModel,li as Service,di as SessionModel,SessionStore,Pi as SetupController,Xt as TenantModel,$e as TenantStatus,Ii as TenantsController,xi as TestController,$t as UserAuthModel,Qt as UserGroupModel,ai as UserKeyModel,ei as UserModel,Zt as UserPasswordModel,ui as UserService,Ge as UserStatus,Jt as UserTenantModel,Ci as UsersController,Ri as UsersGroupsController,ji as UsersKeysController,Di as UsersTenantsController,Nt as WORKER_METADATA,Ht as Worker,bt as assertValidMcpToolDefinition,ze as canFactory,It as discoverMcpTools,Lt as discoverWorkers,Pt as getMcpToolMetadata,Ft as getWorkerMetadata,At as isJsonParseError,ct as isJsonRpcId,wt as jsonParseErrorResponse,ht as jsonRpcError,vt as jsonRpcErrorFromCode,pt as jsonRpcResult,gt as parseJsonRpcRequest,Kt as runWorker,Ke as sequelize};
7
+ import{Use as e,UnauthorizedError as t,parameterFactory as i,ResponseError as r,Context as n,InternalServerError as s,ValidationError as o,StatusCodes as d,BadRequestError as a,NotFoundError as l,Application as u,Extends as c,Get as p,Ctx as h,Controller as v,Post as g,ValidateBody as y,Body as m,App as f,Middleware as E,Delete as S,Put as O,Params as _,All as A,Options as w,Upload as T,ConflictError as b,ForbiddenError as P}from"@andrewcaires/express";import{isUndefined as I,isFunction as x,includesArray as C,isPlainObject as R,isString as j,isNumber as D,uuidv7 as M,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 G,forEachAsync as z,upperCamelCase as W,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 ve,Encryptor as ge,sha256 as ye}from"@andrewcaires/node";import{config as me}from"dotenv";import{metadata as fe,isClassMethodDecoratorContext as Ee,Trait as Se,Singleton as Oe}from"@andrewcaires/decorator";import{Store as _e}from"express-session";import Ae from"jsonwebtoken";import{createHmac as we,timingSafeEqual as Te}from"node:crypto";import{verify as be,hashSync as Pe}from"@node-rs/argon2";import{existsSync as Ie,statSync as xe,readdirSync as Ce,mkdirSync as Re,lstatSync as je,rmSync as De}from"node:fs";import{join as Me}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,Ge;!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"}(Ge||(Ge={}));const ze=i=>r=>(n,s,o)=>{e(e=>Fe(void 0,void 0,void 0,function*(){var n;I(r)&&(r=x(e.controller.name)?e.controller.name():null===(n=e.controller.constructor)||void 0===n?void 0:n.name);const{permissions:s=[]}=e.req;if(s.includes(`${r}.${i}`))return e.next();e.error(new t("Access Denied"))}))(n,s,o)},We=ze("create"),Ye=ze("delete"),Je=ze("read"),Xe=ze("update"),Qe=(...i)=>(r,n,s)=>{e(e=>Fe(void 0,void 0,void 0,function*(){const{groups:r=[]}=e.req;if(C(i,r))return e.next();e.error(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(C(i,r))return e.next();e.error(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=x(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();e.error(new t("Access Denied"))}))(r,n,s)},tt=()=>(t,i,r)=>{e(e=>Fe(void 0,void 0,void 0,function*(){yield(e=>Fe(void 0,void 0,void 0,function*(){var t;if(e.req.access&&e.req.user)return e.next();const{authService:i}=e.app,{access:r,user:n}=null!==(t=yield i.apiAuth(e).catch(t=>{e.error(t)}))&&void 0!==t?t:{};r&&n&&e.next()}))(e)}))(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)||D(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}:{})}),vt=(e,t,i,r)=>({jsonrpc:"2.0",id:e,error:Object.assign({code:t,message:i},void 0!==r?{data:r}:{})}),gt=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",St=["POST","DELETE","OPTIONS"],Ot=St.join(", "),_t=["Content-Type","Accept",Et,ft],At=e=>{if(!(e instanceof SyntaxError))return!1;const t=e;return"entity.parse.failed"===t.type||400===t.status||400===t.statusCode},wt=e=>{if(At(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=gt(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:Ot},r?{"Access-Control-Allow-Origin":r}:{}),r&&"*"!==r?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":Ot,"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:M(),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 Tt=Symbol.for("@andrewcaires/api:mcp:tool"),bt=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(I(e.input))throw new Error(`MCP tool "${e.name}" input must be declared`)},Pt=e=>{const t=fe(Tt,e,[]);return t.length||"function"==typeof e?t:fe(Tt,Object.getPrototypeOf(e),[])},It=e=>{const t=[];for(const i of e)for(const e of Pt(i))t.push(xt(i,e));return t},xt=(e,t)=>{const i=e[t.propertyKey];if(!x(i))throw new Error(`MCP tool "${t.name}" handler was not found`);return bt(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(bt(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 Ct=e=>(bt(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(Tt,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,v;const g=i.ctx instanceof n?i.ctx:null,y=null!==(r=null==g?void 0:g.id)&&void 0!==r?r:null,m=null!==(a=null!==(d=null===(o=null===(s=null==g?void 0:g.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 g?Object.assign(Object.assign({},f),{full_url:null!==(c=g.getUrl())&&void 0!==c?c:"",ip_address:null!==(p=g.getIp())&&void 0!==p?p:"",user_agent:null!==(v=null===(h=g.req)||void 0===h?void 0:h.headers["user-agent"])&&void 0!==v?v:""}):f},Dt=e=>{const t=F(e),i=t.primaryKeyAttribute;return{model:t,record_id:i?e.getDataValue(i):null}},Mt={afterCreate:(e,t)=>Fe(void 0,void 0,void 0,function*(){const{model:i,record_id:r}=Dt(e),n=Object.entries(e.toJSON()),s=Object.fromEntries(n.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield ti.create(Object.assign(Object.assign({},jt(qe.CREATE,i,t)),{record:r,currently:s})).catch(he.catch)}),afterUpdate:(e,t)=>Fe(void 0,void 0,void 0,function*(){const{model:i,record_id:r}=Dt(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 ti.create(Object.assign(Object.assign({},jt(qe.UPDATE,i,t)),{record:r,currently:n,previously:s})).catch(he.catch)}),afterDestroy:(e,t)=>Fe(void 0,void 0,void 0,function*(){const{model:i,record_id:r}=Dt(e),n=Object.entries(e.toJSON()),s=Object.fromEntries(n.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield ti.create(Object.assign(Object.assign({},jt(qe.DELETE,i,t)),{record:r,currently:s})).catch(he.catch)})},kt=e=>(I(e)&&(e=Env.DATABASE_AUDIT),te(e?Mt:{})),Nt=Symbol.for("@andrewcaires/api:worker"),Ht=e=>{if(!j(e)||!e.trim())throw new Error("Worker name is required");return(t,i)=>{Ee(i)?i.addInitializer(function(){qt(this.constructor,i.name,e)}):qt(t,i,e)}},Ft=e=>{const t=fe(Nt,e,[]);return t.length||"function"==typeof e?t:fe(Nt,Object.getPrototypeOf(e),[])},Lt=e=>{const t=[];for(const i of e)for(const e of Ft(i))t.push(Bt(i,e));return Ut(t),t},Kt=(e,t)=>Fe(void 0,void 0,void 0,function*(){const i=Lt(e).find(e=>e.name===t);if(!i)throw new Error(`Worker "${t}" not found`);return i.run()}),qt=(e,t,i)=>{const r=fe(Nt,e,[]),n={name:i,propertyKey:t};r.some(e=>e.propertyKey===n.propertyKey&&e.name===n.name)||r.push(n)},Bt=(e,t)=>{if(!j(t.name)||!t.name.trim())throw new Error("Worker name is required");const i=e[t.propertyKey];if(!x(i))throw new Error(`Worker "${t.name}" handler was not found`);return{name:t.name,run:()=>i.call(e)}},Ut=e=>{const t=new Set;for(const i of e){if(t.has(i.name))throw new Error(`Duplicate worker name: ${i.name}`);t.add(i.name)}};let Vt=class RegisterModel extends de{};ke([ie.Id(7),He("design:type",String)],Vt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Vt.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Number)],Vt.prototype,"expired_at",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Vt.prototype,"active",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.BelongsTo(()=>ei),He("design:type",String)],Vt.prototype,"user_id",void 0),Vt=ke([ne(Ke),se("register"),oe("5.4.2")],Vt);let $t=class UserAuthModel extends de{};ke([ie.Id(7),He("design:type",String)],$t.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],$t.prototype,"hash",void 0),ke([ie.String(),He("design:type",String)],$t.prototype,"ip_address",void 0),ke([ie.String(),He("design:type",String)],$t.prototype,"user_agent",void 0),ke([ie.FullDate(),He("design:type",Object)],$t.prototype,"revoked_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],$t.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],$t.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],$t.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],$t.prototype,"user_id",void 0),$t=ke([ne(Ke),se("users_auth"),oe("5.4.2")],$t);let Gt=class PageModel extends de{};ke([ie.Id(7),He("design:type",String)],Gt.prototype,"id",void 0),ke([ie.Enum(Ve),ae(Ve.PAGE),He("design:type",String)],Gt.prototype,"type",void 0),ke([ie.String(),He("design:type",String)],Gt.prototype,"name",void 0),ke([ie.Text(),He("design:type",String)],Gt.prototype,"description",void 0),ke([ie.String(),He("design:type",String)],Gt.prototype,"icon",void 0),ke([ie.String(),He("design:type",String)],Gt.prototype,"path",void 0),ke([ie.Timestamp(),He("design:type",Number)],Gt.prototype,"position",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Gt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Gt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Gt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Gt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Gt.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>Gt),He("design:type",String)],Gt.prototype,"page_id",void 0),ke([re.HasMany(()=>Gt),He("design:type",Array)],Gt.prototype,"pages",void 0),ke([re.BelongsTo(()=>zt),He("design:type",String)],Gt.prototype,"permission_id",void 0),Gt=ke([ne(Ke),se("page"),kt(),oe("5.4.2")],Gt);let zt=class PermissionModel extends de{};ke([ie.Id(7),He("design:type",String)],zt.prototype,"id",void 0),ke([ie.String(),le(),He("design:type",String)],zt.prototype,"name",void 0),ke([ie.Text(),He("design:type",String)],zt.prototype,"description",void 0),ke([ie.Boolean(),He("design:type",Boolean)],zt.prototype,"active",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(()=>Wt),He("design:type",Array)],zt.prototype,"groups_permissions",void 0),ke([re.HasMany(()=>Gt),He("design:type",Array)],zt.prototype,"pages",void 0),zt=ke([ne(Ke),se("permission"),kt(),oe("5.4.2")],zt);let Wt=class GroupPermissionModel extends de{};ke([ie.Id(7),He("design:type",String)],Wt.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Wt.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Yt),He("design:type",String)],Wt.prototype,"group_id",void 0),ke([re.BelongsTo(()=>zt),He("design:type",String)],Wt.prototype,"permission_id",void 0),Wt=ke([ne(Ke),se("groups_permissions"),kt(),oe("5.4.2")],Wt);let Yt=class GroupModel extends de{};ke([ie.Id(7),He("design:type",String)],Yt.prototype,"id",void 0),ke([ie.String(),le(),He("design:type",String)],Yt.prototype,"name",void 0),ke([ie.Text(),He("design:type",String)],Yt.prototype,"description",void 0),ke([ie.Enum(Be),ae(Be.SYSTEM),He("design:type",String)],Yt.prototype,"type",void 0),ke([ie.Boolean(),He("design:type",Boolean)],Yt.prototype,"active",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],Yt.prototype,"metadata",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Yt.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],Yt.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],Yt.prototype,"deleted_at",void 0),ke([re.HasMany(()=>Qt),He("design:type",Array)],Yt.prototype,"users_groups",void 0),ke([re.HasMany(()=>Wt),He("design:type",Array)],Yt.prototype,"groups_permissions",void 0),Yt=ke([ne(Ke),se("group"),kt(),oe("5.4.2")],Yt);let Jt=class UserTenantModel extends de{};ke([ie.Id(7),He("design:type",String)],Jt.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Jt.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],Jt.prototype,"tenant_id",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],Jt.prototype,"user_id",void 0),Jt=ke([ne(Ke),se("users_tenants"),kt(),oe("5.4.2")],Jt);let Xt=class TenantModel 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.Text(),He("design:type",String)],Xt.prototype,"description",void 0),ke([ie.Enum($e),ae($e.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(()=>Jt),He("design:type",Array)],Xt.prototype,"users_tenants",void 0),Xt=ke([ne(Ke),se("tenant"),kt(),oe("5.4.2")],Xt);let Qt=class UserGroupModel extends de{};ke([ie.Id(7),He("design:type",String)],Qt.prototype,"id",void 0),ke([ie.CreatedAt(),He("design:type",Date)],Qt.prototype,"created_at",void 0),ke([re.BelongsTo(()=>Yt),He("design:type",String)],Qt.prototype,"group_id",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],Qt.prototype,"user_id",void 0),ke([re.BelongsTo(()=>Xt),He("design:type",String)],Qt.prototype,"tenant_id",void 0),Qt=ke([ne(Ke),se("users_groups"),kt(),oe("5.4.2")],Qt);let Zt=class UserPasswordModel extends de{};ke([ie.Id(7),He("design:type",String)],Zt.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],Zt.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Object)],Zt.prototype,"revoked_at",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.BelongsTo(()=>ei),He("design:type",String)],Zt.prototype,"user_id",void 0),Zt=ke([ne(Ke),se("users_password"),kt(),oe("5.4.2")],Zt);let ei=class UserModel extends de{};ke([ie.Id(7),He("design:type",String)],ei.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ei.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],ei.prototype,"username",void 0),ke([ie.String(),He("design:type",String)],ei.prototype,"email",void 0),ke([ie.Text(),He("design:type",String)],ei.prototype,"notes",void 0),ke([ie.Enum(Ge),ae(Ge.ACTIVE),He("design:type",String)],ei.prototype,"status",void 0),ke([ie.Json(),ae(()=>({})),He("design:type",Object)],ei.prototype,"metadata",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.HasMany(()=>ti),He("design:type",Array)],ei.prototype,"audits",void 0),ke([re.HasMany(()=>$t),He("design:type",Array)],ei.prototype,"users_auths",void 0),ke([re.HasMany(()=>Vt),He("design:type",Array)],ei.prototype,"registers",void 0),ke([re.HasMany(()=>Qt),He("design:type",Array)],ei.prototype,"users_groups",void 0),ke([re.HasMany(()=>Zt),He("design:type",Array)],ei.prototype,"users_passwords",void 0),ke([re.HasMany(()=>Jt),He("design:type",Array)],ei.prototype,"users_tenants",void 0),ei=ke([ne(Ke),se("user"),kt(),oe("5.4.2")],ei);let ti=class AuditModel extends de{};ke([ie.Id(7),He("design:type",String)],ti.prototype,"id",void 0),ke([ie.Enum(qe),He("design:type",String)],ti.prototype,"type",void 0),ke([ie.String(),He("design:type",String)],ti.prototype,"model",void 0),ke([ie.String(),He("design:type",String)],ti.prototype,"record",void 0),ke([ie.Json(),He("design:type",Object)],ti.prototype,"currently",void 0),ke([ie.Json(),He("design:type",Object)],ti.prototype,"previously",void 0),ke([ie.String(36),He("design:type",String)],ti.prototype,"request_id",void 0),ke([ie.Text(),He("design:type",String)],ti.prototype,"full_url",void 0),ke([ie.String(),He("design:type",String)],ti.prototype,"ip_address",void 0),ke([ie.Text(),He("design:type",String)],ti.prototype,"user_agent",void 0),ke([ie.String(),He("design:type",String)],ti.prototype,"source",void 0),ke([ie.FullDate(),He("design:type",Object)],ti.prototype,"reverted_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ti.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ti.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],ti.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],ti.prototype,"user_id",void 0),ti=ke([ne(Ke),se("audit"),oe("5.4.2")],ti);let ii=class ConfigModel extends de{};ke([ie.Id(7),He("design:type",String)],ii.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ii.prototype,"key",void 0),ke([ie.Text(),He("design:type",String)],ii.prototype,"value",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("configs"),oe("5.4.2")],ii);let ri=class ForgotModel extends de{};ke([ie.Id(7),He("design:type",String)],ri.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ri.prototype,"secret",void 0),ke([ie.FullDate(),He("design:type",Number)],ri.prototype,"expired_at",void 0),ke([ie.Boolean(),He("design:type",Boolean)],ri.prototype,"active",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),ke([ie.DeletedAt(),He("design:type",Object)],ri.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],ri.prototype,"user_id",void 0),ri=ke([ne(Ke),se("forgot"),oe("5.4.2")],ri);let ni=class LogModel extends de{};ke([ie.Id(7),He("design:type",String)],ni.prototype,"id",void 0),ke([ie.Enum(Ue),ae(Ue.INFO),He("design:type",String)],ni.prototype,"level",void 0),ke([ie.Text(),He("design:type",String)],ni.prototype,"message",void 0),ke([ie.String(),He("design:type",String)],ni.prototype,"source",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ni.prototype,"created_at",void 0),ni=ke([ne(Ke),se("log"),oe("5.4.2")],ni);let si=class MigrationModel extends de{};ke([ie.Id(7),He("design:type",String)],si.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],si.prototype,"model",void 0),ke([ie.String(),He("design:type",String)],si.prototype,"version",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),si=ke([ne(Ke),se("migration"),oe("5.4.2")],si);let oi=class SecretModel extends de{};ke([ie.Id(7),He("design:type",String)],oi.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],oi.prototype,"key",void 0),ke([ie.Text(),He("design:type",String)],oi.prototype,"hash",void 0),ke([ie.CreatedAt(),He("design:type",Date)],oi.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],oi.prototype,"updated_at",void 0),oi=ke([ne(Ke),se("secret"),oe("5.4.2")],oi);let di=class SessionModel extends de{};ke([ie.Id(7),He("design:type",String)],di.prototype,"id",void 0),ke([ie.Json(),He("design:type",Object)],di.prototype,"data",void 0),ke([ie.FullDate(),He("design:type",Date)],di.prototype,"expired_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],di.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],di.prototype,"updated_at",void 0),di=ke([ne(Ke),se("session"),oe("5.4.2")],di);let ai=class UserKeyModel extends de{};ke([ie.Id(7),He("design:type",String)],ai.prototype,"id",void 0),ke([ie.String(),He("design:type",String)],ai.prototype,"name",void 0),ke([ie.String(),He("design:type",String)],ai.prototype,"prefix",void 0),ke([ie.Text(),He("design:type",String)],ai.prototype,"hash",void 0),ke([ie.FullDate(),He("design:type",Object)],ai.prototype,"last_used_at",void 0),ke([ie.FullDate(),He("design:type",Object)],ai.prototype,"expires_at",void 0),ke([ie.FullDate(),He("design:type",Object)],ai.prototype,"revoked_at",void 0),ke([ie.CreatedAt(),He("design:type",Date)],ai.prototype,"created_at",void 0),ke([ie.UpdatedAt(),He("design:type",Date)],ai.prototype,"updated_at",void 0),ke([ie.DeletedAt(),He("design:type",Object)],ai.prototype,"deleted_at",void 0),ke([re.BelongsTo(()=>ei),He("design:type",String)],ai.prototype,"user_id",void 0),ai=ke([ne(Ke),se("users_key"),kt(),oe("5.4.2")],ai);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:ve.White,e,t),Ke&&(yield ni.create({level:e,message:t,source:null!=i?i:""}).catch(he.catch))})}}Log.colors={error:ve.Red,info:ve.Cyan,warn:ve.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 ii.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 ii.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return Fe(this,arguments,void 0,function*(e,t=""){const[i]=(yield ii.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 ii.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 oi.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 oi.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 oi.findOrCreate({where:{key:e},defaults:{key:e,value: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 oi.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 ge(Env.ENCRYPTION_SECRET))}}class SessionStore extends _e{constructor(){super(),this.all=e=>Fe(this,void 0,void 0,function*(){e=e||L;const t=yield di.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 di.destroy().catch(he.catch),e&&e()}),this.destroy=(e,t)=>Fe(this,void 0,void 0,function*(){yield di.destroy({where:{id:e}}).catch(he.catch),t&&t()}),this.expired=()=>Fe(this,void 0,void 0,function*(){yield di.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 di.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 di.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 di.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 li=class Service{};li=ke([Se(Loggable)],li);let ui=class UserService extends li{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 ei.count({where:{id:e}}).catch(this.error))&&void 0!==i?i:0))return!1;const n=null!==(r=yield Zt.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 be(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 ei.count({where:{id:e}}).catch(this.error))&&void 0!==i?i:0))return!1;const r=yield Zt.findOne({attributes:["hash"],where:{revoked_at:null,user_id:e}}).catch(this.error);return t+=Env.PASSWORD_PEPPER,r&&(yield be(r.hash,t).catch(L))||!1})}createPassword(e,t,i){return Fe(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield ei.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))return!1;yield Zt.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 Zt.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 Yt.findAll({attributes:["name"],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.name))})}getPermissions(e,t){return Fe(this,void 0,void 0,function*(){var i;return(null!==(i=yield zt.findAll({attributes:["name"],where:{active:!0},include:[{association:"groups_permissions",required:!0,include:[{association:"group",required:!0,attributes:["id","name"],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.name)})}getTenants(e){return Fe(this,void 0,void 0,function*(){var t;return(null!==(t=yield Xt.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}))})}};ui=ke([Oe()],ui);let ci=class AuthService extends li{constructor(){super(),this.options={algorithm:"HS256",expiresIn:`${Env.TOKEN_TTL}ms`},this.userAttributes={exclude:["username","notes","deleted_at"]},this.userService=new ui}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=we("sha256",Env.TOKEN_PEPPER).update(o).digest("hex");if(!(yield ai.create({name:t,prefix:n,hash:d,expires_at:i,user_id:r.id},Object.assign({},{ctx:e})).catch(this.error)))throw new s("API key could not be created");return 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 $t.create({hash:n,user_id:r},Object.assign({},{ctx:e})).catch(this.error);if(!o)throw new s;const d=Ae.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}})}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 $t.findOne({where:{hash:r},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:i,status:Ge.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:Ae.sign({id:i,hash:n.hash},Env.TOKEN_SECRET,this.options)}})}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 $t&&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 ai.findOne({where:{prefix:i},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{status:Ge.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=we("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}).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 $t.findOne({attributes:{exclude:["hash"]},where:{hash:r},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:i,status:Ge.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}})}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&&Te(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 Ae.verify(e,Env.TOKEN_SECRET,{algorithms:["HS256"],clockTolerance:i})}catch(e){throw new t("Invalid token")}})}};ci=ke([Oe(),He("design:paramtypes",[])],ci);class ModelService extends li{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");I(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 null;const s=null==e?void 0:e.getQuery(i?`${i}_where`:"where");if(!j(s))return null;const d=t.attributes,a=ce.parse(d,s);return I(a.error)?(t.where=Object.assign(Object.assign({},null!==(r=t.where)&&void 0!==r?r:{}),null!==(n=a.value)&&void 0!==n?n:{}),null):new o(a.error.join(", "))}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);const o=this.applyWhere(r,s);if(o)return null==r||r.error(o),0;this.applySelect(r,s);const a=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:a}),a})}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)return null==n||n.error(new s),null;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(I(d))return null==r||r.error(new a),0;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);return c?(null==r||r.success("OK"),c):(null==r||r.error(new l),0)})}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=I(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);if(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){const e=this.applyWhere(r,a);if(e)return null==r||r.error(e),{count:0,records:[]}}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(I(h))return null==s||s.error(new a),null;const v=$({},u);v.attributes=this.getAttributes(null!==(i=null==v?void 0:v.attributes)&&void 0!==i?i:[]),c&&this.applySelect(s,v);const g=yield this.model.findOne(Object.assign(Object.assign({},v),{where:{[ue.and]:Object.assign({[p]:h},null!==(r=null==v?void 0:v.where)&&void 0!==r?r:{})}})).catch(this.error);return g?(null==s||s.prepare(d.OK,n?yield n(g):g.toJSON()),g):(null==s||s.error(new l),null)})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var i;const r=G(t),{ctx:n}=null!=t?t:{};r.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(i=r.attributes)&&void 0!==i?i:[]),this.applySearch(n,r);const s=this.applyWhere(n,r,t.name);return s?(null==n||n.error(s),null):(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={description:"",active:!0};yield z(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=`${e}.${i}`,n=W(e.replace(/_/g," ")," ");yield zt.findOrCreate({where:{key:r},defaults:Object.assign({name:`${n} ${W(i," ")}`,key:r,tags:n},t)})}))})}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(I(p))return null==s||s.error(new a),!1;const h=$({},u),v=$({},null!==(r=null===(i=null==s?void 0:s.req)||void 0===i?void 0:i.body)&&void 0!==r?r:{},null!=o?o:{}),g=yield this.model.findOne(Object.assign(Object.assign({},h),{attributes:this.getAttributes([c,...Object.keys(v)]),where:{[ue.and]:Object.assign({[c]:p},null!==(n=null==h?void 0:h.where)&&void 0!==n?n:{})}})).catch(this.error);return g?(g.set(v),g.changed()?(null==s||s.success("OK"),yield g.save(Object.assign({},{ctx:s})).catch(this.error),!0):(null==s||s.success("Record not changed"),!1)):(null==s||s.error(new l),!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:M},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*(){x(e.sync)&&(yield e.sync(this))})),this.authService=new ci,this.userService=new ui,this._prepared=!0)})}run(){return Fe(this,arguments,void 0,function*(e=process.argv){const t=this.workerCliRequest(e);if(t)try{const e=yield this.runWorker(t.name);return this.writeWorkerResult(e),e}catch(e){this.error(e)}else yield this.listen()})}runWorker(e){return Fe(this,void 0,void 0,function*(){return yield this.prepare(),Kt(this.controllers,e)})}workerCliRequest(e=process.argv){const t=this.getCliOption(e,"--worker");if(t)return{name:t}}getCliOption(e,t){const i=e.find(e=>e.startsWith(`${t}=`));if(i){const e=i.slice(t.length+1).trim();if(!e)throw new Error(`Option "${t}" requires a value`);return e}const r=e.indexOf(t);if(r<0)return;const n=e[r+1];if(!n||n.startsWith("-"))throw new Error(`Option "${t}" requires a value`);return n}writeWorkerResult(e){void 0!==e&&("string"!=typeof e?process.stdout.write(`${JSON.stringify(e)}\n`):process.stdout.write(`${e}\n`))}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 si.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 pi=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=W(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=`${e}.${i}`;yield zt.findOrCreate({where:{name:r},defaults:{name:r,description:`${t} ${W(i," ")}`,active:!0}})}))})}};pi=ke([Se(Loggable)],pi);let hi=class ModelController extends pi{constructor(){super(...arguments),this.attributes=[],this.permissions=["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=W(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=`${e}.${i}`;yield zt.findOrCreate({where:{name:r},defaults:{name:r,description:`${t} ${W(i," ")}`,active:!0}})})),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}};hi=ke([c(pi)],hi);let vi=class AuditsController extends hi{constructor(){super(...arguments),this.model=ti,this.permissions=["read"]}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["currently","previously"]}}})})}get(e){return Fe(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}};ke([p(),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],vi.prototype,"all",null),ke([p("/:id"),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],vi.prototype,"get",null),vi=ke([v("/audits"),c(hi)],vi);let gi=class AuthController extends pi{constructor(){super(...arguments),this.authService=new ci}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 Zt.findOne({where:{revoked_at:null},include:[{association:"user",required:!0,where:{status:{[ue.in]:[Ge.ACTIVE,Ge.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 be(a.hash,r).catch(L))||void 0===o||!o)return e.error(new t("Invalid credentials")),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});if(a.user.registers.length)return e.error(new t("Activation Required")),s.emit("auth.activation",{ctx:e}),void this.emit("auth.activation",{ctx:e});if(a.user.status!==Ge.ACTIVE)return e.error(new t("Invalid credentials")),s.emit("auth.failure",{ctx:e}),void this.emit("auth.failure",{ctx:e});const{token:l}=null!==(d=yield this.authService.createApiToken(e,a.user).catch(t=>{e.error(t),s.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e})}))&&void 0!==d?d:{};l&&(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 ai)return e.error(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))return e.error(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*(){var r;const{token:n}=null!==(r=yield this.authService.renewApiToken(t).catch(t=>{e.error(t)}))&&void 0!==r?r:{};n&&(e.json({token:n}),i.emit("auth.renew",{ctx:e}),this.emit("auth.renew",{ctx:e}))})}};ke([g("/login"),y(e=>({username:e.string().min(3),password:e.string().min(5),remember:e.boolean().parse().default(!1)})),Ne(0,h()),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)],gi.prototype,"login",null),ke([p("/logout"),tt(),Ne(0,h()),Ne(1,it()),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,Object,Application]),He("design:returntype",Promise)],gi.prototype,"logout",null),ke([p("/me"),tt(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],gi.prototype,"user",null),ke([g("/renew"),y(e=>({token:e.string()})),Ne(0,h()),Ne(1,m("token")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],gi.prototype,"renew",null),gi=ke([v("/auth"),c(pi)],gi);let yi=class CrudController extends hi{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)return e.error(new o(n.message||n.error));e.req.body=n.value,e.next()}validateCreate(e){const t=this.CrudValidateCreate();if(t==this._crud)return e.error(new s);this.validate(e,t)}validateUpdate(e){const t=this.CrudValidateUpdate();if(t==this._crud)return e.error(new s);this.validate(e,t)}};ke([g(),tt(),We(),E("validateCreate"),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"add",null),ke([p(),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"all",null),ke([p("/count"),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"rows",null),ke([S("/:id"),tt(),Ye(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"del",null),ke([p("/:id"),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"get",null),ke([O("/:id"),tt(),Xe(),E("validateUpdate"),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],yi.prototype,"set",null),ke([Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",void 0)],yi.prototype,"validateCreate",null),ke([Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",void 0)],yi.prototype,"validateUpdate",null),yi=ke([c(hi)],yi);let mi=class FilesController extends pi{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=Me(this.directory,t);if(!Ie(i)||!xe(i).isDirectory())return e.error(new l);let r;return r=Ce(i),r=r.map(e=>this.info(Me(i,e))),r=r.filter(Q),Object.assign(Object.assign({},this.info(i)),{files:r})})}info(e){if(!Ie(e))return null;const t=xe(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=W(e.replace(/_/g," ")," ");yield J(this.permissions,i=>Fe(this,void 0,void 0,function*(){const r=`${e}.${i}`;yield zt.findOrCreate({where:{name:r},defaults:{name:r,description:`${t} ${W(i," ")}`,active:!0}})}))})}};ke([p("/path"),p("/path/*path"),tt(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],mi.prototype,"files",null),mi=ke([v("/files"),c(pi)],mi);let fi=class ForgotController extends pi{check(e,t){return Fe(this,void 0,void 0,function*(){const i=yield this.find(t);if(!i||!i.user)return e.error(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 ei.findOne({where:{[ue.or]:[{email:r},{username:t}]}}).catch(this.error);if(!n)return e.error(new l);const s=B(),o=Date.now()+6e4*Env.TOKEN_TTL_FORGOT,d=yield ri.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)return e.error(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 ri.findOne({where:{token:e,active:!0},include:[{association:"users",required:!0}]}).catch(this.error)})}};ke([p("/check"),y(e=>({token:e.string()})),Ne(0,h()),Ne(1,m("token")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],fi.prototype,"check",null),ke([g(),y(e=>({username:e.string().min(4)})),Ne(0,h()),Ne(1,m("username")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],fi.prototype,"forgot",null),ke([g("/reset"),y(e=>({token:e.string(),password:e.string().min(5)})),Ne(0,h()),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)],fi.prototype,"reset",null),fi=ke([v("/forgot"),c(pi)],fi);let Ei=class GroupsController extends yi{constructor(){super(...arguments),this.model=Yt,this.schemaCreate={name:H.string(),description:H.string().default(""),type:H.enum(Object.values(Be)).default(Be.SYSTEM),active:H.boolean().parse(),metadata:H.object().parse().default({})},this.schemaUpdate={description:H.string().optional(),type:H.enum(Object.values(Be)).optional(),active:H.boolean().parse().optional(),metadata:H.object().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(ei)})}users(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkGroup(e,t))&&(yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_groups",required:!0,attributes:[],where:{group_id:t}}]}}))})}checkGroup(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield Yt.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([p("/:id/users"),tt(),Je("users"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ei.prototype,"users",null),Ei=ke([v("/groups"),c(yi)],Ei);let Si=class GroupsPermissionsController extends hi{constructor(){super(...arguments),this.model=zt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){(yield this.checkGroup(e,t))&&(yield this.checkPermissions(e,i))&&(yield this.addPermissions(e,t,i),e.success("OK"))})}all(e,t){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{include:[{association:"groups_permissions",required:!0,attributes:[],where:{group_id:t}}]}})})}del(e,t,i){return Fe(this,void 0,void 0,function*(){(yield this.checkGroup(e,t))&&(yield this.checkPermissions(e,i))&&(yield Wt.destroy(Object.assign({where:{group_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*(){if(!(yield this.checkGroup(e,t)))return;if(!(yield this.checkPermissions(e,i)))return;const r=yield this.addPermissions(e,t,i);yield Wt.destroy(Object.assign({where:{group_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 J(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Wt.findOrCreate(Object.assign({where:{group_id:t,permission_id:i},defaults:{group_id:t,permission_id:i}},{ctx:e})).catch(this.error))&&void 0!==n?n:[];s&&r.push(i)})),r})}checkGroup(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield Yt.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}checkPermissions(e,t){return Fe(this,void 0,void 0,function*(){var i;if(t.length!=K(t).length)return e.error(new o("Duplicate permission id")),!1;return(null!==(i=yield zt.count({where:{id:{[ue.in]:t}}}).catch(this.error))&&void 0!==i?i:0)==t.length||(e.error(new o("Invalid permission id")),!1)})}};ke([g("/:id/permissions"),tt(),We(),Xe("groups"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Si.prototype,"add",null),ke([p("/:id/permissions"),tt(),Je(),Xe("groups"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Si.prototype,"all",null),ke([S("/:id/permissions"),tt(),Ye(),Xe("groups"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Si.prototype,"del",null),ke([O("/:id/permissions"),tt(),Xe(),Xe("groups"),y(e=>({permissions:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("permissions")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Si.prototype,"set",null),Si=ke([v("/groups"),c(hi)],Si);let Oi=class HealthController{ping(e){return Fe(this,void 0,void 0,function*(){e.json({status:"ok",timestamp:Date.now(),uptime:process.uptime()})})}};ke([A("/"),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Oi.prototype,"ping",null),Oi=ke([v("/health")],Oi);let _i=class LogsController extends hi{constructor(){super(...arguments),this.model=ni,this.permissions=["read"]}all(e){return Fe(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}};ke([p(),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],_i.prototype,"all",null),_i=ke([v("/logs"),c(hi)],_i);let Ai=class McpController extends pi{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",Ot),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:Ot},r?{"Access-Control-Allow-Origin":r}:{}),r&&"*"!==r?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":Ot,"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([p(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ai.prototype,"get",null),ke([w(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ai.prototype,"options",null),ke([g(),tt(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ai.prototype,"post",null),ke([S(),tt(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ai.prototype,"delete",null),Ai=ke([v("/mcp"),c(pi)],Ai);let wi=class PagesController extends yi{constructor(){super(...arguments),this.model=Gt,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(),metadata:H.object().parse().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(),metadata:H.object().parse().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.checkPages(e,i))&&(yield J(t,t=>Fe(this,[t],void 0,function*({id:t,position:i}){yield Gt.update({position:i},Object.assign({where:{id:t},individualHooks:!0},{ctx:e})).catch(this.error)})),e.success("OK"))})}checkPages(e,t){return Fe(this,void 0,void 0,function*(){var i;if(t.length!=K(t).length)return e.error(new o("Duplicate page id")),!1;return(null!==(i=yield Gt.count({where:{id:{[ue.in]:t}}}).catch(this.error))&&void 0!==i?i:0)==t.length||(e.error(new o("Invalid page id")),!1)})}};ke([O("/position"),tt(),Xe(),y(e=>({pages:e.array(e.object({id:e.string().uuid(),position:e.number().parse()}))})),Ne(0,h()),Ne(1,m("pages")),He("design:type",Function),He("design:paramtypes",[n,Array]),He("design:returntype",Promise)],wi.prototype,"position",null),wi=ke([v("/pages"),c(yi)],wi);let Ti=class PermissionsController extends yi{constructor(){super(...arguments),this.model=zt,this.schemaCreate={name:H.string(),description:H.string().default(""),active:H.boolean().parse(),metadata:H.object().parse().default({})},this.schemaUpdate={description:H.string().optional(),active:H.boolean().parse().optional(),metadata:H.object().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(Yt)})}groups(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkPermission(e,t))&&(yield this.groupModelService.findAll({ctx:e,options:{include:[{association:"groups_permissions",required:!0,attributes:[],where:{permission_id:t}}]}}))})}checkPermission(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield zt.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([p("/:id/groups"),tt(),Je("groups"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ti.prototype,"groups",null),Ti=ke([v("/permissions"),c(yi)],Ti);let bi=class RegisterController extends pi{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:a,confirm:l}=t,u=d||o,c=ye(a);if(yield ei.count({where:{[ue.or]:[{email:o},{username:u}]}}).catch(this.error))return e.error("INVALID EMAIL OR USERNAME");if(c!=ye(l))return e.error("INVALID PASSWORD");const p=yield ei.create({name:r,email:o,username:u,password:c,avatar:"",date:n,description:"",status:Ge.PENDING}).catch(this.error);if(!p)return e.error(new s);const h=yield Vt.create({token:yield this.getId(),active:!0,user_id:p.id}).catch(this.error);if(!h)return yield p.destroy().catch(this.error),e.error(new s);e.success("OK"),i.emit("register.user",{ctx:e,register:h,user:p}),this.emit("register.user",{ctx:e,register:h,user:p})})}confirm(e,t,i){return Fe(this,void 0,void 0,function*(){const r=yield Vt.findOne({where:{token:t,active:!0},include:[{association:"users",required:!0}]}).catch(this.error);if(!r)return e.error(new l);r.active=!1,yield r.save().catch(this.error),r.user.status=Ge.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 Vt.findOne({where:{active:!0},include:[{model:ei,required:!0,where:{[ue.or]:[{email:r},{username:t}]}}]}).catch(this.error);if(!n)return e.error(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=M();return(yield Vt.count({where:{token:e}}))?this.getId():e})}};ke([g(),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,h()),Ne(1,m()),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,Object,Application]),He("design:returntype",Promise)],bi.prototype,"register",null),ke([g("/confirm"),y(e=>({token:e.string()})),Ne(0,h()),Ne(1,m("token")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],bi.prototype,"confirm",null),ke([g("/send"),y(e=>({username:e.string().min(4)})),Ne(0,h()),Ne(1,m("username")),Ne(2,f()),He("design:type",Function),He("design:paramtypes",[n,String,Application]),He("design:returntype",Promise)],bi.prototype,"send",null),bi=ke([v("/register"),c(pi)],bi);let Pi=class SetupController extends pi{constructor(){super(...arguments),this.userService=new ui}setup(e){return Fe(this,void 0,void 0,function*(){var t;if(yield ei.count())return e.error(new l("Endpoint Not Found"));const i=yield ei.create({name:"Admin",username:"admin",email:"admin@localhost.com",notes:"",status:Ge.ACTIVE},Object.assign({},{ctx:e})).catch(this.error);if(!i)return e.error(new s);yield this.userService.createPassword(i.id,"admin",e);const r=yield Yt.create({name:"admin",description:"Admin",active:!0},Object.assign({},{ctx:e}));yield Qt.create({user_id:i.id,group_id:r.id},Object.assign({},{ctx:e})),yield Yt.create({name:"user",description:"User",active:!0},Object.assign({},{ctx:e}));const n=null!==(t=yield zt.findAll({where:{active:!0}}).catch(this.error))&&void 0!==t?t:[];yield J(n,t=>Fe(this,void 0,void 0,function*(){yield Wt.create({group_id:r.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}};ke([p(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Pi.prototype,"setup",null),Pi=ke([v("/setup"),c(pi)],Pi);let Ii=class TenantsController extends yi{constructor(){super(...arguments),this.model=Xt,this.schemaCreate={name:H.string(),description:H.string().default(""),status:H.enum(Object.values($e)).default($e.ACTIVE),metadata:H.object().parse().default({})},this.schemaUpdate={name:H.string().optional(),description:H.string().optional(),status:H.enum(Object.values($e)).optional(),metadata:H.object().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(ei)})}users(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkTenant(e,t))&&(yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_tenants",required:!0,attributes:[],where:{tenant_id:t}}]}}))})}checkTenant(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield Xt.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([p("/:id/users"),tt(),Je("users"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ii.prototype,"users",null),Ii=ke([v("/tenants"),c(yi)],Ii);let xi=class TestController extends pi{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([p(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],xi.prototype,"json",null),ke([Ht("test.sum"),He("design:type",Function),He("design:paramtypes",[]),He("design:returntype",Promise)],xi.prototype,"workerSum",null),ke([Ct({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)],xi.prototype,"sum",null),ke([Ct({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)],xi.prototype,"multiply",null),ke([Ct({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)],xi.prototype,"average",null),ke([Ct({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)],xi.prototype,"validationString",null),ke([Ct({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)],xi.prototype,"validationNumber",null),ke([Ct({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)],xi.prototype,"validationBoolean",null),ke([Ct({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)],xi.prototype,"validationArray",null),ke([Ct({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)],xi.prototype,"validationObject",null),ke([Ct({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)],xi.prototype,"validationEnum",null),ke([Ct({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)],xi.prototype,"validationDate",null),ke([Ct({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)],xi.prototype,"validationOptional",null),ke([Ct({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)],xi.prototype,"validationDefaults",null),ke([Ct({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)],xi.prototype,"validationParse",null),ke([Ct({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)],xi.prototype,"validationNested",null),xi=ke([v("/test"),c(pi)],xi);let Ci=class UsersController extends hi{constructor(){super(),this.model=ei,this.permissions=["avatar","create","read","update","delete","password"],this.path=Env.HTTP_PUBLIC+"/avatar",this.userService=new ui,Env.HTTP_PUBLIC&&Ie(Env.HTTP_PUBLIC)&&!Ie(this.path)&&Re(this.path)}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 ei.findOne({where:{id:t.id}}).catch(this.error);if(!i)return je(o).isFile()&&De(o),e.error(new s);const r=this.path+"/"+i.metadata.avatar_url;if(Ie(r)&&je(r).isFile()&&De(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()&&De(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*(){return(yield this.userService.checkPassword(n.id,i))?(yield this.userService.canAssignPassword(n.id,r))?(yield this.userService.createPassword(n.id,r,e))?e.success("OK"):void e.error(new s):e.error(new b("Password already used")):e.error(new t("Invalid Password"))})}password_admin(e,t,i){return Fe(this,void 0,void 0,function*(){if(yield this.userService.createPassword(i,t,e))return e.success("OK");e.error(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)return e.error(new P);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([g("/avatar"),tt(),et("avatar"),T({file:{count:1,path:`${Env.HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),Ne(0,h()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,ei]),He("design:returntype",Promise)],Ci.prototype,"avatar",null),ke([S("/avatar"),tt(),et("avatar"),Ne(0,h()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,ei]),He("design:returntype",Promise)],Ci.prototype,"avatar_del",null),ke([g("/password"),tt(),et("password"),y(e=>({oldPassword:e.string().min(5),newPassword:e.string().min(5)})),Ne(0,h()),Ne(1,m("oldPassword")),Ne(2,m("newPassword")),Ne(3,lt()),He("design:type",Function),He("design:paramtypes",[n,String,String,ei]),He("design:returntype",Promise)],Ci.prototype,"password",null),ke([g("/:id/password"),tt(),Xe(),y(e=>({password:e.string().min(5)})),Ne(0,h()),Ne(1,m("password")),Ne(2,_("id")),He("design:type",Function),He("design:paramtypes",[n,String,String]),He("design:returntype",Promise)],Ci.prototype,"password_admin",null),ke([g(),tt(),We(),y(e=>({name:e.string(),email:e.string().email(),username:e.string().min(3),notes:e.string().default(""),status:e.enum(Object.values(Ge)).default(Ge.ACTIVE),metadata:e.object().parse().default({})})),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"add",null),ke([p(),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"all",null),ke([p("/count"),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"rows",null),ke([S("/:id"),tt(),Ye(),Ne(0,h()),Ne(1,_("id")),Ne(2,lt()),He("design:type",Function),He("design:paramtypes",[n,String,ei]),He("design:returntype",Promise)],Ci.prototype,"del",null),ke([p("/:id"),tt(),Je(),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"get",null),ke([O("/: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(Ge)).optional(),metadata:e.object().parse().optional()})),Ne(0,h()),He("design:type",Function),He("design:paramtypes",[n]),He("design:returntype",Promise)],Ci.prototype,"set",null),Ci=ke([v("/users"),c(hi),He("design:paramtypes",[])],Ci);let Ri=class UsersGroupsController extends hi{constructor(){super(...arguments),this.model=Yt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){(yield this.checkUser(e,t))&&(yield this.checkGroups(e,i))&&(yield this.addGroups(e,t,i),e.success("OK"))})}all(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkUser(e,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.checkUser(e,t))&&(yield this.checkGroups(e,i))&&(yield Qt.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*(){if(!(yield this.checkUser(e,t)))return;if(!(yield this.checkGroups(e,i)))return;const r=yield this.addGroups(e,t,i);yield Qt.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 J(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Qt.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})}checkGroups(e,t){return Fe(this,void 0,void 0,function*(){var i;if(t.length!=K(t).length)return e.error(new o("Duplicate group id")),!1;return(null!==(i=yield Yt.count({where:{id:{[ue.in]:t}}}).catch(this.error))&&void 0!==i?i:0)==t.length||(e.error(new o("Invalid group id")),!1)})}checkUser(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield ei.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([g("/:id/groups"),tt(),We(),Xe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Ri.prototype,"add",null),ke([p("/:id/groups"),tt(),Je(),Xe("users"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Ri.prototype,"all",null),ke([S("/:id/groups"),tt(),Ye(),Xe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Ri.prototype,"del",null),ke([O("/:id/groups"),tt(),Xe(),Xe("users"),y(e=>({groups:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("groups")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Ri.prototype,"set",null),Ri=ke([v("/users"),c(hi)],Ri);let ji=class UsersKeysController extends hi{constructor(){super(...arguments),this.model=ai,this.permissions=["create","read"]}add(e,t,i,r){return Fe(this,void 0,void 0,function*(){e.json({token: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 ei.findOne({where:{id:t}}).catch(this.error);if(!n)return e.error(new l);e.json({token:yield r.authService.createApiKey(e,i.name,i.expires_at,n)})})}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}}]}})})}all_admin(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkUser(e,t))&&(yield this.findAll({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t}}]}}))})}checkUser(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield ei.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([g("/keys"),tt(),We(),y(e=>({name:e.string(),expires_at:e.date()})),Ne(0,h()),Ne(1,lt()),Ne(2,m()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,ei,Object,Application]),He("design:returntype",Promise)],ji.prototype,"add",null),ke([g("/:id/keys"),tt(),We(),Xe("users"),y(e=>({name:e.string(),expires_at:e.date()})),Ne(0,h()),Ne(1,_("id")),Ne(2,m()),Ne(3,f()),He("design:type",Function),He("design:paramtypes",[n,String,Object,Application]),He("design:returntype",Promise)],ji.prototype,"add_admin",null),ke([p("/keys"),tt(),Je(),Ne(0,h()),Ne(1,lt()),He("design:type",Function),He("design:paramtypes",[n,ei]),He("design:returntype",Promise)],ji.prototype,"all",null),ke([p("/:id/keys"),tt(),Je(),Xe("users"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],ji.prototype,"all_admin",null),ji=ke([v("/users"),c(hi)],ji);let Di=class UsersTenantsController extends hi{constructor(){super(...arguments),this.model=Xt,this.permissions=[]}add(e,t,i){return Fe(this,void 0,void 0,function*(){(yield this.checkUser(e,t))&&(yield this.checkTenants(e,i))&&(yield this.addTenants(e,t,i),e.success("OK"))})}all(e,t){return Fe(this,void 0,void 0,function*(){(yield this.checkUser(e,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.checkUser(e,t))&&(yield this.checkTenants(e,i))&&(yield Jt.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*(){if(!(yield this.checkUser(e,t)))return;if(!(yield this.checkTenants(e,i)))return;const r=yield this.addTenants(e,t,i);yield Jt.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 J(i,i=>Fe(this,void 0,void 0,function*(){var n;const[s]=null!==(n=yield Jt.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})}checkTenants(e,t){return Fe(this,void 0,void 0,function*(){var i;if(t.length!=K(t).length)return e.error(new o("Duplicate tenant id")),!1;return(null!==(i=yield Xt.count({where:{id:{[ue.in]:t}}}).catch(this.error))&&void 0!==i?i:0)==t.length||(e.error(new o("Invalid tenant id")),!1)})}checkUser(e,t){return Fe(this,void 0,void 0,function*(){var i;return!!(null!==(i=yield ei.count({where:{id:t}}).catch(this.error))&&void 0!==i?i:0)||(e.error(new l),!1)})}};ke([g("/:id/tenants"),tt(),We(),Xe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Di.prototype,"add",null),ke([p("/:id/tenants"),tt(),Je(),Xe("users"),Ne(0,h()),Ne(1,_("id")),He("design:type",Function),He("design:paramtypes",[n,String]),He("design:returntype",Promise)],Di.prototype,"all",null),ke([S("/:id/tenants"),tt(),Ye(),Xe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Di.prototype,"del",null),ke([O("/:id/tenants"),tt(),Xe(),Xe("users"),y(e=>({tenants:e.array(e.string().uuid())})),Ne(0,h()),Ne(1,_("id")),Ne(2,m("tenants")),He("design:type",Function),He("design:paramtypes",[n,String,Array]),He("design:returntype",Promise)],Di.prototype,"set",null),Di=ke([v("/users"),c(hi)],Di);export{Application,kt as Audit,ti as AuditModel,qe as AuditTypes,vi as AuditsController,gi as AuthController,ci as AuthService,pi as BaseController,We as CanCreate,Ye as CanDelete,Je as CanRead,Xe as CanUpdate,Config,ii as ConfigModel,yi as CrudController,Env,mi as FilesController,fi as ForgotController,ri as ForgotModel,Yt as GroupModel,Wt as GroupPermissionModel,Be as GroupTypes,Ei as GroupsController,Si as GroupsPermissionsController,Qe as HasGroups,Ze as HasPermissions,et as HasScope,Oi as HealthController,tt as IsAuthenticated,Log,Ue as LogLevels,ni as LogModel,Loggable,_i as LogsController,mt as MCP_DEFAULT_PROTOCOL_VERSION,Ot as MCP_HTTP_ALLOW,St as MCP_HTTP_ALLOWED_METHODS,_t as MCP_HTTP_DEFAULT_ALLOWED_HEADERS,ft as MCP_PROTOCOL_VERSION_HEADER,Et as MCP_SESSION_ID_HEADER,yt as MCP_SUPPORTED_PROTOCOL_VERSIONS,Tt as MCP_TOOL_METADATA,Ai as McpController,McpError,ut as McpErrorCode,McpHttpHandler,McpInternalError,McpInvalidParamsError,McpInvalidRequestError,McpInvalidSessionError,McpMethodNotFoundError,McpParseError,McpServerError,McpSessionStore,Ct as McpTool,McpToolNotFoundError,McpToolRegistry,si as MigrationModel,hi as ModelController,ModelService,Gt as PageModel,Ve as PageTypes,wi as PagesController,zt as PermissionModel,Ti as PermissionsController,bi as RegisterController,Vt as RegisterModel,it as ReqAccess,rt as ReqGroup,nt as ReqGroups,st as ReqPermission,ot as ReqPermissions,dt as ReqTenant,at as ReqTenants,lt as ReqUser,Secret,oi as SecretModel,li as Service,di as SessionModel,SessionStore,Pi as SetupController,Xt as TenantModel,$e as TenantStatus,Ii as TenantsController,xi as TestController,$t as UserAuthModel,Qt as UserGroupModel,ai as UserKeyModel,ei as UserModel,Zt as UserPasswordModel,ui as UserService,Ge as UserStatus,Jt as UserTenantModel,Ci as UsersController,Ri as UsersGroupsController,ji as UsersKeysController,Di as UsersTenantsController,Nt as WORKER_METADATA,Ht as Worker,bt as assertValidMcpToolDefinition,ze as canFactory,It as discoverMcpTools,Lt as discoverWorkers,Pt as getMcpToolMetadata,Ft as getWorkerMetadata,At as isJsonParseError,ct as isJsonRpcId,wt as jsonParseErrorResponse,ht as jsonRpcError,vt as jsonRpcErrorFromCode,pt as jsonRpcResult,gt as parseJsonRpcRequest,Kt as runWorker,Ke as sequelize};