@andrewcaires/api 5.7.0 → 5.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js CHANGED
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * @andrewcaires/api v5.7.0
2
+ * @andrewcaires/api v5.7.2
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
- "use strict";var e,t=require("@andrewcaires/express"),r=require("@andrewcaires/utils.js"),o=require("ws"),i=require("@andrewcaires/sequelize"),s=require("@andrewcaires/node"),n=require("dotenv"),d=require("@andrewcaires/decorator"),a=require("express-session"),l=require("jsonwebtoken"),p=require("node:crypto"),u=require("@node-rs/argon2"),c=require("node:fs"),g=require("node:path");function h(e,t,r,o){var i,s=arguments.length,n=s<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(i=e[d])&&(n=(s<3?i(n):s>3?i(t,r,n):i(t,r))||n);return s>3&&n&&Object.defineProperty(t,r,n),n}function y(e,t){return function(r,o){t(r,o,e)}}function v(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function m(e,t,r,o){return new(r||(r=Promise))(function(i,s){function n(e){try{a(o.next(e))}catch(e){s(e)}}function d(e){try{a(o.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(n,d)}a((o=o.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError,n.config({quiet:!0});class Env extends s.Env{}e=Env,Env.AUDIT_IGNORE=e.getString("AUDIT_IGNORE","hash,password").split(","),Env.BASE_NAME=e.getString("BASE_NAME",""),Env.CONSOLE_ERROR=e.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=e.getString("DATABASE_URI","",!0),Env.DATABASE_LOG=e.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=e.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=e.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=e.getString("DATABASE_TIMEZONE","+00:00"),Env.ENCRYPTION_SECRET=e.getString("ENCRYPTION_SECRET",""),Env.HTTP_CROSS=e.getString("HTTP_CROSS",""),Env.HTTP_HYBRID=e.getBool("HTTP_HYBRID",!1),Env.HTTP_NOTFOUND=e.getString("HTTP_NOTFOUND",""),Env.HTTP_PATH=e.getString("HTTP_PATH","/api"),Env.HTTP_PORT=e.getInt("HTTP_PORT",e.getInt("PORT",3e3)),Env.HTTP_PUBLIC=e.getString("HTTP_PUBLIC",""),Env.HTTP_REDIRECT=e.getString("HTTP_REDIRECT",""),Env.HTTP_TLS_CA=e.getFile("HTTP_TLS_CA"),Env.HTTP_TLS_CRT=e.getFile("HTTP_TLS_CRT"),Env.HTTP_TLS_KEY=e.getFile("HTTP_TLS_KEY"),Env.MODEL_LIMIT=e.getInt("MODEL_LIMIT",10),Env.MODEL_LIMIT_MAX=e.getInt("MODEL_LIMIT_MAX",100),Env.MCP_SESSION_TTL=e.getMs("MCP_SESSION_TTL","30m"),Env.PASSWORD_ALGORITHM=e.getInt("PASSWORD_ALGORITHM",2),Env.PASSWORD_MEMORY_COST=e.getInt("PASSWORD_MEMORY_COST",4096),Env.PASSWORD_PARALLELISM=e.getInt("PASSWORD_PARALLELISM",1),Env.PASSWORD_PEPPER=e.getString("PASSWORD_PEPPER",""),Env.PASSWORD_REUSE=e.getBool("PASSWORD_REUSE",!0),Env.PASSWORD_TIME_COST=e.getInt("PASSWORD_TIME_COST",3),Env.SLEEP_AUTH=e.getMs("SLEEP_AUTH","2s"),Env.SLEEP_FORGOT=e.getMs("SLEEP_FORGOT","5s"),Env.SLEEP_REGISTRY=e.getMs("SLEEP_REGISTRY","5s"),Env.TENANT_HEADER=e.getString("TENANT_HEADER","X-Tenant-ID").toLowerCase(),Env.TOKEN_COOKIE=e.getString("TOKEN_COOKIE",e.getString("TOKEN_HEADER","Authorization")).toLowerCase(),Env.TOKEN_COOKIE_SET=e.getBool("TOKEN_COOKIE_SET",!0),Env.TOKEN_HEADER=e.getString("TOKEN_HEADER","authorization"),Env.TOKEN_PEPPER=e.getString("TOKEN_PEPPER",""),Env.TOKEN_PREFIX=e.getString("TOKEN_PREFIX","api"),Env.TOKEN_SECRET=e.getString("TOKEN_SECRET",""),Env.TOKEN_TTL=e.getMs("TOKEN_TTL","1d"),Env.TOKEN_TTL_FORGOT=e.getMs("TOKEN_TTL_FORGOT","1d"),Env.TOKEN_TTL_RENEW=e.getMs("TOKEN_TTL_RENEW","1d"),Env.TOKEN_TYPE=e.getString("TOKEN_TYPE","bearer"),Env.API_BODYPARSER_STRICT=e.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=e.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=e.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=e.getString("API_BODYPARSER_TYPE","json"),Env.API_SESSION_NAME=e.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=e.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=e.getString("API_SESSION_SECRET","yoursecret"),Env.API_WEBSOCKET_START=e.getBool("API_WEBSOCKET_START",!1);const x=new i.Sequelize({uri:Env.DATABASE_URI,logging:Env.DATABASE_LOG,prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE});var C,E,f,S,M,A;exports.AuditTypes=void 0,(C=exports.AuditTypes||(exports.AuditTypes={})).CREATE="CREATE",C.DELETE="DELETE",C.UPDATE="UPDATE",exports.GroupTypes=void 0,(E=exports.GroupTypes||(exports.GroupTypes={})).SYSTEM="system",E.TENANT="tenant",exports.LogLevels=void 0,(f=exports.LogLevels||(exports.LogLevels={})).INFO="info",f.WARN="warn",f.ERROR="error",exports.PageTypes=void 0,(S=exports.PageTypes||(exports.PageTypes={})).PAGE="page",S.GROUP="group",S.DIVIDER="divider",S.HIDDEN="hidden",S.EXTERNAL="external",exports.TenantStatus=void 0,(M=exports.TenantStatus||(exports.TenantStatus={})).ACTIVE="active",M.PENDING="pending",M.SUSPENDED="suspended",M.DISABLED="disabled",M.ARCHIVED="archived",exports.UserStatus=void 0,(A=exports.UserStatus||(exports.UserStatus={})).ACTIVE="active",A.PENDING="pending",A.DISABLED="disabled",A.LOCKED="locked",A.ARCHIVED="archived";const P=e=>o=>(i,s,n)=>{t.Use(i=>m(void 0,void 0,void 0,function*(){var s;const n=r.isUndefined(o)?r.isFunction(i.controller.name)?i.controller.name():null===(s=i.controller.constructor)||void 0===s?void 0:s.name:o,{permissions:d=[]}=i.req;if(!d.includes(r.slugify(`${n}.${e}`,".")))throw new t.HttpUnauthorizedError("Access denied");i.next()}))(i,s,n)},w=P("create"),O=P("delete"),T=P("read"),_=P("update"),b=(...e)=>(o,i,s)=>{t.Use(o=>m(void 0,void 0,void 0,function*(){const{permissions:i=[]}=o.req;if(r.includesArray(e,i))return o.next();throw new t.HttpUnauthorizedError("Access denied")}))(o,i,s)},R=e=>(o,i,s)=>{t.Use(o=>m(void 0,void 0,void 0,function*(){var i;const s=r.isFunction(o.controller.name)?o.controller.name():null===(i=o.controller.constructor)||void 0===i?void 0:i.name,{permissions:n=[]}=o.req;if(n.includes(`${s}.${e}`))return o.next();throw new t.HttpUnauthorizedError("Access denied")}))(o,i,s)},I=()=>(e,r,o)=>{t.Use(e=>m(void 0,void 0,void 0,function*(){if(e.req.access&&e.req.user)return e.next();const{authService:t}=e.app;yield t.apiAuth(e),e.next()}))(e,r,o)},U=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.access}),D=t.parameterFactory(({ctx:e,key:t})=>{var r,o;return(null!==(o=null===(r=e.req)||void 0===r?void 0:r.groups)&&void 0!==o?o:[]).includes(t)}),j=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==r?r:[]}),H=t.parameterFactory(({ctx:e,key:t})=>{var r,o;return(null!==(o=null===(r=e.req)||void 0===r?void 0:r.permissions)&&void 0!==o?o:[]).includes(t)}),V=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==r?r:[]}),N=t.parameterFactory(({ctx:e})=>{var t;return null!==(t=e.getHeader(Env.TENANT_HEADER))&&void 0!==t?t:null}),F=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.tenants)&&void 0!==r?r:[]}),k=t.parameterFactory(({ctx:e,key:t})=>{var r;return t&&e.req.user&&t in e.req.user?e.req.user[t]:null===(r=e.req)||void 0===r?void 0:r.user}),B={ParseError:-32700,InvalidRequest:-32600,MethodNotFound:-32601,InvalidParams:-32602,InternalError:-32603,ServerError:-32e3,InvalidSession:-32001};class McpError extends t.HttpError{constructor(e,t=B.ServerError,r=200,o){super(e,r),this.code=t,this.data=o,this.name=this.constructor.name}}class McpParseError extends McpError{constructor(e="Parse error",t){super(e,B.ParseError,400,t)}}class McpInvalidRequestError extends McpError{constructor(e="Invalid Request",t){super(e,B.InvalidRequest,400,t)}}class McpMethodNotFoundError extends McpError{constructor(e){super(`Method not found: ${e}`,B.MethodNotFound,200)}}class McpInvalidParamsError extends McpError{constructor(e="Invalid params",t){super(e,B.InvalidParams,200,t)}}class McpServerError extends McpError{constructor(e="Server error",t){super(e,B.ServerError,500,t)}}class McpInvalidSessionError extends McpError{constructor(e="Invalid MCP session",t=404){super(e,B.InvalidSession,t)}}class McpToolNotFoundError extends McpError{constructor(e){super("Tool not found",B.InvalidParams,200,{toolName:e})}}const L=e=>r.isString(e)||r.isNumber(e),G=(e,t)=>({jsonrpc:"2.0",id:e,result:t}),q=(e,t)=>({jsonrpc:"2.0",id:e,error:Object.assign({code:t.code,message:t.message},void 0!==t.data?{data:t.data}:{})}),K=e=>{if(!r.isPlainObject(e))throw new McpInvalidRequestError("Invalid Request");if("2.0"!==e.jsonrpc)throw new McpInvalidRequestError("Invalid JSON-RPC version");if(!r.isString(e.method))throw new McpInvalidRequestError("Invalid method");if(void 0!==e.id&&!L(e.id))throw new McpInvalidRequestError("Invalid id");return e},z=["2025-11-25","2025-06-18"],W=z[0],$="MCP-Protocol-Version",Y="MCP-Session-Id",J=["POST","DELETE","OPTIONS"],X=J.join(", "),Q=["Content-Type","Accept",Y,$],Z=e=>{if(!(e instanceof SyntaxError))return!1;const t=e;return"entity.parse.failed"===t.type||400===t.status||400===t.statusCode};class McpHttpHandler{constructor(e){var t,r,o;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!==(r=e.serverVersion)&&void 0!==r?r:"1.0.0",this.allowedHeaders=this.normalizeAllowedHeaders(e.allowedHeaders).join(", "),this.allowedOrigins=(null===(o=e.allowedOrigins)||void 0===o?void 0:o.length)?e.allowedOrigins:["*"]}post(e){return m(this,void 0,void 0,function*(){var t;let r=null;try{const o=K(this.getBody(e));if(r=null!==(t=o.id)&&void 0!==t?t:null,"initialize"===o.method)return this.withTransportHeaders(this.initialize(o.id,o.params,e),e);if("notifications/initialized"===o.method)return this.withTransportHeaders(this.initialized(o.id,o.params,e),e);if("ping"===o.method)return this.validateObjectParams(o.params),this.withTransportHeaders(this.withSession(o.id,e,e=>({status:200,body:G(e,{})})),e);if("tools/list"===o.method)return this.validateObjectParams(o.params),this.withTransportHeaders(this.withInitializedSession(o.id,e,e=>({status:200,body:G(e,{tools:this.tools.list()})})),e);if("tools/call"===o.method)return this.withTransportHeaders(yield this.callTool(o.id,o.params,e),e);if(void 0===o.id)return this.withTransportHeaders({status:202},e);throw new McpMethodNotFoundError(o.method)}catch(t){return this.withTransportHeaders(this.errorResponse(r,t),e)}})}delete(e){const t=this.getHeader(e,Y);if(!t)return this.withTransportHeaders(this.errorResponse(null,new McpInvalidSessionError(`${Y} 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,r){const o=this.requireRequestId({jsonrpc:"2.0",id:e,method:"initialize",params:t}),i=this.negotiateProtocolVersion(t),s=this.sessions.create(i);return Object.assign(s,this.getAuthContext(r)),{status:200,headers:{[Y]:s.sessionId,[$]:s.protocolVersion},body:G(o,{protocolVersion:s.protocolVersion,capabilities:{tools:{listChanged:!1}},serverInfo:{name:this.serverName,version:this.serverVersion}})}}initialized(e,t,r){if(void 0!==e)throw new McpInvalidRequestError("notifications/initialized must not include id");this.validateObjectParams(t);const o=this.requireSession(r);return this.sessions.markInitialized(o.sessionId),{status:202}}callTool(e,t,r){return m(this,void 0,void 0,function*(){return this.withInitializedSession(e,r,(e,r)=>m(this,void 0,void 0,function*(){var o;const i=this.parseToolCallParams(t),s=Date.now();let n,d=!1;try{const t=yield this.tools.call(i.name,i.arguments,r);return d=!t.isError,n=t.isError?"Tool execution failed":void 0,{status:200,body:G(e,t)}}catch(e){if(e instanceof McpError)throw n=e.message,e;throw n="Internal error",e}finally{null===(o=this.logger)||void 0===o||o.toolCall(Object.assign({sessionId:r.sessionId,toolName:i.name,durationMs:Date.now()-s,success:d},n?{error:n}:{}))}}))})}requireRequestId(e){if(!L(e.id))throw new McpInvalidRequestError("Request id is required");return e.id}withSession(e,t,r){const o=this.requireRequestId({jsonrpc:"2.0",id:e,method:"session"}),i=this.requireSession(t),s=this.getHeader(t,$);if(s&&s!==i.protocolVersion)throw new McpInvalidRequestError(`${$} does not match the initialized session`);return r(o,i)}withInitializedSession(e,t,r){return this.withSession(e,t,(e,t)=>{if(!t.initialized)throw new McpInvalidRequestError("Session not initialized");return r(e,t)})}requireSession(e){const t=this.getHeader(e,Y);if(!t)throw new McpInvalidSessionError(`${Y} header is required`,400);return this.sessions.require(t)}negotiateProtocolVersion(e){if(!r.isPlainObject(e)||!r.isString(e.protocolVersion))throw new McpInvalidParamsError("params.protocolVersion is required");return z.includes(e.protocolVersion)?e.protocolVersion:W}parseToolCallParams(e){if(!r.isPlainObject(e)||!r.isString(e.name))throw new McpInvalidParamsError("params.name is required");return{name:e.name,arguments:e.arguments}}validateObjectParams(e){if(void 0!==e&&!r.isPlainObject(e))throw new McpInvalidParamsError("params must be an object")}withTransportHeaders(e,t){var r;const o=this.getAllowedOrigin(t);return Object.assign(Object.assign({},e),{headers:Object.assign(Object.assign(Object.assign(Object.assign({Allow:X},o?{"Access-Control-Allow-Origin":o}:{}),o&&"*"!==o?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":X,"Access-Control-Allow-Headers":this.allowedHeaders}),null!==(r=e.headers)&&void 0!==r?r:{})})}errorResponse(e,t){if(t instanceof McpError)return{status:t.status,body:q(e,t)};const r=new McpServerError;return{status:r.status,body:q(e,r)}}getBody(e){return"function"==typeof e.getBody?e.getBody():e.body}getHeader(e,t){var r,o,i;const s=null!==(r=e.req)&&void 0!==r?r:e.request,n=this.getHeaderFromRequest(s,t);if(n)return n;const d=this.getHeaderFromRecord(e.headers,t);if(d)return d;if("function"==typeof e.getHeaders){const r=this.getHeaderFromRecord(e.getHeaders(),t);if(r)return r}return"function"==typeof e.getHeader&&null!==(i=null!==(o=e.getHeader(t))&&void 0!==o?o:e.getHeader(t.toLowerCase()))&&void 0!==i?i:""}getHeaderFromRequest(e,t){if(!e||"object"!=typeof e)return"";const r=e;if("function"==typeof r.get){const e=this.normalizeHeaderValue(r.get(t));if(e)return e}if("function"==typeof r.header){const e=this.normalizeHeaderValue(r.header(t));if(e)return e}return this.getHeaderFromRecord(r.headers,t)}getHeaderFromRecord(e,t){if(!e)return"";const r=t.toLowerCase(),o=Object.keys(e).find(e=>e.toLowerCase()===r),i=o?e[o]:void 0;return this.normalizeHeaderValue(i)}normalizeHeaderValue(e){var t,r,o;return Array.isArray(e)?null!==(r=null===(t=e[0])||void 0===t?void 0:t.toString())&&void 0!==r?r:"":null!==(o=null==e?void 0:e.toString())&&void 0!==o?o:""}normalizeAllowedHeaders(e=[]){const t=["Content-Type","Accept",...e.map(e=>e.toLowerCase()),Y,$];return t.filter((e,r)=>Boolean(e)&&t.findIndex(t=>t.toLowerCase()===e.toLowerCase())===r)}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,r,o;const i=null!==(r=null!==(t=e.req)&&void 0!==t?t:e.context)&&void 0!==r?r:{},s=i.user,n="string"==typeof i.userId?i.userId:null===(o=null==s?void 0:s.id)||void 0===o?void 0:o.toString();return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},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}:{}),n?{userId:n}:{})}}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(),o={sessionId:r.uuidv7(),createdAt:t,expiresAt:t+this.ttl,protocolVersion:e,initialized:!1};return this.sessions.set(o.sessionId,o),o}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,r]of this.sessions)r.expiresAt<=e&&this.sessions.delete(t)}size(){return this.cleanup(),this.sessions.size}isExpired(e){return e.expiresAt<=this.now()}}const ee=Symbol.for("@andrewcaires/api:mcp:tool"),te=e=>{if(!r.isString(e.name)||!e.name.trim())throw new Error("MCP tool name is required");if(!r.isString(e.title)||!e.title.trim())throw new Error(`MCP tool "${e.name}" title is required`);if(!r.isString(e.description)||!e.description.trim())throw new Error(`MCP tool "${e.name}" description is required`);if(r.isUndefined(e.input))throw new Error(`MCP tool "${e.name}" input must be declared`)},re=e=>{const t=d.metadata(ee,e,[]);return t.length||"function"==typeof e?t:d.metadata(ee,Object.getPrototypeOf(e),[])},oe=e=>{const t=[];for(const r of e)for(const e of re(r))t.push(ie(r,e));return t},ie=(e,t)=>{const o=e[t.propertyKey];if(!r.isFunction(o))throw new Error(`MCP tool "${t.name}" handler was not found`);return te(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)=>o.call(e,t,r)})};class McpToolRegistry{constructor(e=[]){this.tools=new Map,e.forEach(e=>this.register(e))}register(e){var t,r;if(te(e),this.tools.has(e.name))throw new Error(`Duplicate MCP tool name: ${e.name}`);const o=this.normalizeMcpValidation(null!==(t=e.input)&&void 0!==t?t:{},"object"),i=e.output?this.normalizeMcpValidation(null!==(r=e.output)&&void 0!==r?r:{},"any"):void 0;this.tools.set(e.name,{inputSchema:this.normalizeSchema(o.schema),inputValidation:o.validation,outputSchema:(null==i?void 0:i.schema)?this.normalizeSchema(i.schema):void 0,outputValidation:null==i?void 0:i.validation,tool:e})}list(){return Array.from(this.tools.values()).map(({tool:e})=>{var t,r,o,i;return Object.assign({name:e.name,title:e.title,description:e.description,inputSchema:null!==(r=null===(t=this.tools.get(e.name))||void 0===t?void 0:t.inputSchema)&&void 0!==r?r:{}},(null===(o=this.tools.get(e.name))||void 0===o?void 0:o.outputSchema)?{outputSchema:null===(i=this.tools.get(e.name))||void 0===i?void 0:i.outputSchema}:{})})}call(e,t,o){return m(this,void 0,void 0,function*(){var i;const s=this.tools.get(e);if(!s)throw new McpToolNotFoundError(e);const n=null!=t?t:{};if(!r.isPlainObject(n))return this.toolInputValidationError(["arguments must be an object"]);const d=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({session:o},o.access?{access:o.access}:{}),o.groups?{groups:o.groups}:{}),o.permissions?{permissions:o.permissions}:{}),o.tenants?{tenants:o.tenants}:{}),o.user?{user:o.user}:{}),o.userId?{userId:o.userId}:{});let a=n;const l=this.validateAdditionalProperties(s.inputSchema,n);if(l.length)return this.toolInputValidationError(l);if(s.inputValidation){const e=s.inputValidation.validate(n,d);if(e.error)return this.toolInputValidationError([e.error]);a=null!==(i=e.value)&&void 0!==i?i:{}}try{const e=yield s.tool.run(a,d);if(!s.outputValidation&&this.isCallToolResult(e))return e;let t=e;if(s.outputValidation){const r=s.outputValidation.validate(e,d);if(r.error)return this.outputValidationError();t=r.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.isPlainObject(e)&&r.isArray(e.content)}normalizeMcpValidation(e,t="object"){if(r.isValidationShape(e)){const t=r.Validation.object(e).parse();return{schema:t.toSchema(),validation:t}}const o="object"===t?r.Validation.object({}).parse():r.Validation.any();return{schema:o.toSchema(),validation:o}}normalizeSchema(e){if(r.isArray(e))return e.map(e=>this.normalizeSchema(e));if(!r.isPlainObject(e))return e;const t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,this.normalizeSchema(t)]));if(r.isArray(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.isPlainObject(e.properties))return[];const o=Object.keys(e.properties);return Object.keys(t).filter(e=>!o.includes(e)).map(e=>`additional property "${e}" is not allowed`)}}const se=e=>(te(e),(t,r)=>{d.isClassMethodDecoratorContext(r)?r.addInitializer(function(){ne(this.constructor,r.name,e)}):ne(t,r,e)}),ne=(e,t,r)=>{const o=d.metadata(ee,e,[]),i=Object.assign(Object.assign({},r),{propertyKey:t});o.some(e=>e.propertyKey===i.propertyKey&&e.name===i.name)||o.push(i)},de=(e,r,o)=>{var i,s,n,d,a,l,p,u,c,g,h;const y=o.ctx instanceof t.Context?o.ctx:null,v=null!==(i=null==y?void 0:y.id)&&void 0!==i?i:null,m=null!==(a=null!==(d=null===(n=null===(s=null==y?void 0:y.req)||void 0===s?void 0:s.user)||void 0===n?void 0:n.id)&&void 0!==d?d:o.user_id)&&void 0!==a?a:null,x={type:e,model:null!==(l=null==r?void 0:r.getTableName())&&void 0!==l?l:null,source:null!==(p=Env.BASE_NAME)&&void 0!==p?p:"",request_id:v,user_id:m};return y?Object.assign(Object.assign({},x),{full_url:null!==(u=y.getUrl())&&void 0!==u?u:"",ip_address:null!==(c=y.getIp())&&void 0!==c?c:"",user_agent:null!==(h=null===(g=y.req)||void 0===g?void 0:g.headers["user-agent"])&&void 0!==h?h:""}):x},ae=e=>{const t=r.getConstructor(e),o=t.primaryKeyAttribute;return{model:t,record_id:o?e.getDataValue(o):null}},le=(e,t)=>m(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:r,record_id:o}=ae(e),i=Object.entries(e.toJSON()),n=Object.fromEntries(i.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield exports.AuditModel.create(Object.assign(Object.assign({},de(exports.AuditTypes.CREATE,r,t)),{record:o,currently:n})).catch(s.Log.catch)}),pe=(e,t)=>m(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:r,record_id:o}=ae(e),i={},n={},d=e.changed();d&&d.length&&d.filter(e=>!Env.AUDIT_IGNORE.includes(e)).forEach(t=>{i[t]=e.getDataValue(t),n[t]=e.previous(t)}),yield exports.AuditModel.create(Object.assign(Object.assign({},de(exports.AuditTypes.UPDATE,r,t)),{record:o,currently:i,previously:n})).catch(s.Log.catch)}),ue=(e,t)=>m(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:r,record_id:o}=ae(e),i=Object.entries(e.toJSON()),n=Object.fromEntries(i.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield exports.AuditModel.create(Object.assign(Object.assign({},de(exports.AuditTypes.DELETE,r,t)),{record:o,currently:n})).catch(s.Log.catch)}),ce=e=>(r.isUndefined(e)&&(e=Env.DATABASE_AUDIT),i.Hooks(e?{afterCreate:le,afterUpdate:pe,afterDestroy:ue}:{}));class WorkerRegistry{static register(e,t){const r=WorkerRegistry.normalizeWorkerName(e);if(!r)throw new Error("Worker name is required.");if(WorkerRegistry.workers.has(r))throw new Error(`Worker "${r}" is already registered.`);WorkerRegistry.workers.set(r,{name:r,handler:t})}static registerClass(e,t){WorkerRegistry.register(e,()=>m(this,void 0,void 0,function*(){const e=new t;yield e.handler()}))}static registerMethod(e,t,o){const i=r.isFunction(t),s=t.constructor;WorkerRegistry.register(e,()=>m(this,void 0,void 0,function*(){const e=i?t:new s,n=e[o];if(!r.isFunction(n))throw new Error(`Worker method "${String(o)}" is not callable.`);yield n.call(e)}))}static start(e){return m(this,void 0,void 0,function*(){const t=WorkerRegistry.get(e);yield t.handler()})}static list(){const e=new Set(WorkerRegistry.workers.values());return Array.from(e).map(e=>{var{handler:t}=e,r=function(e,t){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(o=Object.getOwnPropertySymbols(e);i<o.length;i++)t.indexOf(o[i])<0&&Object.prototype.propertyIsEnumerable.call(e,o[i])&&(r[o[i]]=e[o[i]])}return r}(e,["handler"]);return Object.assign({},r)})}static names(){return WorkerRegistry.list().map(({name:e})=>e).sort()}static get(e){var t;const r=WorkerRegistry.normalizeStartName(e),o=null!==(t=WorkerRegistry.workers.get(r))&&void 0!==t?t:Array.from(WorkerRegistry.workers.values()).find(e=>WorkerRegistry.normalizeStartName(e.name)===r);if(!o)throw new Error(`Worker "${e}" not found. Available workers: ${WorkerRegistry.names().join(", ")}`);return o}static normalizeStartName(e){return r.slugify(e,"-")}static normalizeWorkerName(e){return e.trim()}}WorkerRegistry.workers=new Map;const ge=e=>(t,o,i)=>{if(void 0===o)WorkerRegistry.registerClass(e,t);else{if(!r.isFunction(null==i?void 0:i.value))throw new Error(`Worker method "${String(o)}" is not callable.`);WorkerRegistry.registerMethod(e,t,o)}};exports.RegisterModel=class RegisterModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.RegisterModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.RegisterModel.prototype,"hash",void 0),h([i.Column.FullDate(),v("design:type",Number)],exports.RegisterModel.prototype,"expired_at",void 0),h([i.Column.Boolean(),v("design:type",Boolean)],exports.RegisterModel.prototype,"active",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.RegisterModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.RegisterModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.RegisterModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.RegisterModel.prototype,"user_id",void 0),exports.RegisterModel=h([i.Database(x),i.ModelName("register"),i.Version("5.6.0")],exports.RegisterModel),exports.UserAuthModel=class UserAuthModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserAuthModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"hash",void 0),h([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"ip_address",void 0),h([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"user_agent",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.UserAuthModel.prototype,"revoked_at",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserAuthModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserAuthModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.UserAuthModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserAuthModel.prototype,"user_id",void 0),exports.UserAuthModel=h([i.Database(x),i.ModelName("users_auth"),i.Version("5.6.0")],exports.UserAuthModel),exports.PageModel=class PageModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.PageModel.prototype,"id",void 0),h([i.Column.Enum(exports.PageTypes),i.DefaultValue(exports.PageTypes.PAGE),v("design:type",String)],exports.PageModel.prototype,"type",void 0),h([i.Column.String(),v("design:type",String)],exports.PageModel.prototype,"name",void 0),h([i.Column.Text(),v("design:type",String)],exports.PageModel.prototype,"description",void 0),h([i.Column.String(),v("design:type",String)],exports.PageModel.prototype,"icon",void 0),h([i.Column.String(),v("design:type",String)],exports.PageModel.prototype,"path",void 0),h([i.Column.Timestamp(),v("design:type",Number)],exports.PageModel.prototype,"position",void 0),h([i.Column.Boolean(),v("design:type",Boolean)],exports.PageModel.prototype,"active",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.PageModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.PageModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.PageModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.PageModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.PageModel),v("design:type",String)],exports.PageModel.prototype,"page_id",void 0),h([i.Association.HasMany(()=>exports.PageModel),v("design:type",Array)],exports.PageModel.prototype,"pages",void 0),h([i.Association.BelongsTo(()=>exports.PermissionModel),v("design:type",String)],exports.PageModel.prototype,"permission_id",void 0),exports.PageModel=h([i.Database(x),i.ModelName("page"),ce(),i.Version("5.6.0")],exports.PageModel),exports.PermissionModel=class PermissionModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.PermissionModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.PermissionModel.prototype,"name",void 0),h([i.Column.String(),v("design:type",String)],exports.PermissionModel.prototype,"permission",void 0),h([i.Column.Text(),i.DefaultValue(""),v("design:type",String)],exports.PermissionModel.prototype,"description",void 0),h([i.Column.Boolean(),i.DefaultValue(!0),v("design:type",Boolean)],exports.PermissionModel.prototype,"active",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.PermissionModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.PermissionModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.PermissionModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.PermissionModel.prototype,"deleted_at",void 0),h([i.Association.HasMany(()=>exports.RolePermissionModel),v("design:type",Array)],exports.PermissionModel.prototype,"roles_permissions",void 0),h([i.Association.HasMany(()=>exports.PageModel),v("design:type",Array)],exports.PermissionModel.prototype,"pages",void 0),exports.PermissionModel=h([i.Database(x),i.ModelName("permission"),ce(),i.Version("5.6.0")],exports.PermissionModel),exports.RolePermissionModel=class RolePermissionModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.RolePermissionModel.prototype,"id",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.RolePermissionModel.prototype,"created_at",void 0),h([i.Association.BelongsTo(()=>exports.PermissionModel),v("design:type",String)],exports.RolePermissionModel.prototype,"permission_id",void 0),h([i.Association.BelongsTo(()=>exports.RoleModel),v("design:type",String)],exports.RolePermissionModel.prototype,"role_id",void 0),exports.RolePermissionModel=h([i.Database(x),i.ModelName("roles_permission"),ce(),i.Version("5.6.0")],exports.RolePermissionModel),exports.RoleModel=class RoleModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.RoleModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.RoleModel.prototype,"name",void 0),h([i.Column.String(),v("design:type",String)],exports.RoleModel.prototype,"role",void 0),h([i.Column.Text(),v("design:type",String)],exports.RoleModel.prototype,"description",void 0),h([i.Column.Boolean(),v("design:type",Boolean)],exports.RoleModel.prototype,"active",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.RoleModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.RoleModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.RoleModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.RoleModel.prototype,"deleted_at",void 0),h([i.Association.HasMany(()=>exports.GroupRoleModel),v("design:type",Array)],exports.RoleModel.prototype,"groups_roles",void 0),h([i.Association.HasMany(()=>exports.RolePermissionModel),v("design:type",Array)],exports.RoleModel.prototype,"roles_permissions",void 0),exports.RoleModel=h([i.Database(x),i.ModelName("role"),ce(),i.Version("5.6.0")],exports.RoleModel),exports.GroupRoleModel=class GroupRoleModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.GroupRoleModel.prototype,"id",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.GroupRoleModel.prototype,"created_at",void 0),h([i.Association.BelongsTo(()=>exports.GroupModel),v("design:type",String)],exports.GroupRoleModel.prototype,"group_id",void 0),h([i.Association.BelongsTo(()=>exports.RoleModel),v("design:type",String)],exports.GroupRoleModel.prototype,"role_id",void 0),exports.GroupRoleModel=h([i.Database(x),i.ModelName("groups_roles"),ce(),i.Version("5.6.0")],exports.GroupRoleModel),exports.GroupModel=class GroupModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.GroupModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"name",void 0),h([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"group",void 0),h([i.Column.Text(),v("design:type",String)],exports.GroupModel.prototype,"description",void 0),h([i.Column.Enum(exports.GroupTypes),i.DefaultValue(exports.GroupTypes.SYSTEM),v("design:type",String)],exports.GroupModel.prototype,"type",void 0),h([i.Column.Boolean(),v("design:type",Boolean)],exports.GroupModel.prototype,"active",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.GroupModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.GroupModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.GroupModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.GroupModel.prototype,"deleted_at",void 0),h([i.Association.HasMany(()=>exports.UserGroupModel),v("design:type",Array)],exports.GroupModel.prototype,"users_groups",void 0),h([i.Association.HasMany(()=>exports.GroupRoleModel),v("design:type",Array)],exports.GroupModel.prototype,"groups_roles",void 0),exports.GroupModel=h([i.Database(x),i.ModelName("group"),ce(),i.Version("5.6.0")],exports.GroupModel),exports.UserTenantModel=class UserTenantModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserTenantModel.prototype,"id",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserTenantModel.prototype,"created_at",void 0),h([i.Association.BelongsTo(()=>exports.TenantModel),v("design:type",String)],exports.UserTenantModel.prototype,"tenant_id",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserTenantModel.prototype,"user_id",void 0),exports.UserTenantModel=h([i.Database(x),i.ModelName("users_tenants"),ce(),i.Version("5.6.0")],exports.UserTenantModel),exports.TenantModel=class TenantModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.TenantModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.TenantModel.prototype,"name",void 0),h([i.Column.Text(),v("design:type",String)],exports.TenantModel.prototype,"description",void 0),h([i.Column.Enum(exports.TenantStatus),i.DefaultValue(exports.TenantStatus.ACTIVE),v("design:type",String)],exports.TenantModel.prototype,"status",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.TenantModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.TenantModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.TenantModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.TenantModel.prototype,"deleted_at",void 0),h([i.Association.HasMany(()=>exports.UserTenantModel),v("design:type",Array)],exports.TenantModel.prototype,"users_tenants",void 0),exports.TenantModel=h([i.Database(x),i.ModelName("tenant"),ce(),i.Version("5.6.0")],exports.TenantModel),exports.UserGroupModel=class UserGroupModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserGroupModel.prototype,"id",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserGroupModel.prototype,"created_at",void 0),h([i.Association.BelongsTo(()=>exports.GroupModel),v("design:type",String)],exports.UserGroupModel.prototype,"group_id",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserGroupModel.prototype,"user_id",void 0),h([i.Association.BelongsTo(()=>exports.TenantModel),v("design:type",String)],exports.UserGroupModel.prototype,"tenant_id",void 0),exports.UserGroupModel=h([i.Database(x),i.ModelName("users_groups"),ce(),i.Version("5.6.0")],exports.UserGroupModel),exports.UserPasswordModel=class UserPasswordModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserPasswordModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.UserPasswordModel.prototype,"hash",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.UserPasswordModel.prototype,"revoked_at",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserPasswordModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserPasswordModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.UserPasswordModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserPasswordModel.prototype,"user_id",void 0),exports.UserPasswordModel=h([i.Database(x),i.ModelName("users_password"),ce(),i.Version("5.6.0")],exports.UserPasswordModel),exports.UserModel=class UserModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"name",void 0),h([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"username",void 0),h([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"email",void 0),h([i.Column.Text(),v("design:type",String)],exports.UserModel.prototype,"notes",void 0),h([i.Column.Enum(exports.UserStatus),i.DefaultValue(exports.UserStatus.ACTIVE),v("design:type",String)],exports.UserModel.prototype,"status",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.UserModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.UserModel.prototype,"deleted_at",void 0),h([i.Association.HasMany(()=>exports.AuditModel),v("design:type",Array)],exports.UserModel.prototype,"audits",void 0),h([i.Association.HasMany(()=>exports.UserAuthModel),v("design:type",Array)],exports.UserModel.prototype,"users_auths",void 0),h([i.Association.HasMany(()=>exports.RegisterModel),v("design:type",Array)],exports.UserModel.prototype,"registers",void 0),h([i.Association.HasMany(()=>exports.UserGroupModel),v("design:type",Array)],exports.UserModel.prototype,"users_groups",void 0),h([i.Association.HasMany(()=>exports.UserPasswordModel),v("design:type",Array)],exports.UserModel.prototype,"users_passwords",void 0),h([i.Association.HasMany(()=>exports.UserTenantModel),v("design:type",Array)],exports.UserModel.prototype,"users_tenants",void 0),exports.UserModel=h([i.Database(x),i.ModelName("user"),ce(),i.Version("5.6.0")],exports.UserModel),exports.AuditModel=class AuditModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.AuditModel.prototype,"id",void 0),h([i.Column.Enum(exports.AuditTypes),v("design:type",String)],exports.AuditModel.prototype,"type",void 0),h([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"model",void 0),h([i.Column.String(),i.Index(),v("design:type",String)],exports.AuditModel.prototype,"record",void 0),h([i.Column.Json(),v("design:type",Object)],exports.AuditModel.prototype,"currently",void 0),h([i.Column.Json(),v("design:type",Object)],exports.AuditModel.prototype,"previously",void 0),h([i.Column.Char(36),i.Index(),v("design:type",String)],exports.AuditModel.prototype,"request_id",void 0),h([i.Column.Text(),v("design:type",String)],exports.AuditModel.prototype,"full_url",void 0),h([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"ip_address",void 0),h([i.Column.Text(),v("design:type",String)],exports.AuditModel.prototype,"user_agent",void 0),h([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"source",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.AuditModel.prototype,"reverted_at",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.AuditModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.AuditModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.AuditModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.AuditModel.prototype,"user_id",void 0),exports.AuditModel=h([i.Database(x),i.ModelName("audit"),i.Version("5.6.0")],exports.AuditModel),exports.ConfigModel=class ConfigModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.ConfigModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.ConfigModel.prototype,"key",void 0),h([i.Column.Text(),v("design:type",String)],exports.ConfigModel.prototype,"value",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.ConfigModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.ConfigModel.prototype,"updated_at",void 0),exports.ConfigModel=h([i.Database(x),i.ModelName("configs"),i.Version("5.6.0")],exports.ConfigModel),exports.ForgotModel=class ForgotModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.ForgotModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.ForgotModel.prototype,"secret",void 0),h([i.Column.FullDate(),v("design:type",Number)],exports.ForgotModel.prototype,"expired_at",void 0),h([i.Column.Boolean(),v("design:type",Boolean)],exports.ForgotModel.prototype,"active",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.ForgotModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.ForgotModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.ForgotModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.ForgotModel.prototype,"user_id",void 0),exports.ForgotModel=h([i.Database(x),i.ModelName("forgot"),i.Version("5.6.0")],exports.ForgotModel),exports.LogModel=class LogModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.LogModel.prototype,"id",void 0),h([i.Column.Enum(exports.LogLevels),i.DefaultValue(exports.LogLevels.INFO),v("design:type",String)],exports.LogModel.prototype,"level",void 0),h([i.Column.Text(),v("design:type",String)],exports.LogModel.prototype,"message",void 0),h([i.Column.String(),v("design:type",String)],exports.LogModel.prototype,"source",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.LogModel.prototype,"created_at",void 0),exports.LogModel=h([i.Database(x),i.ModelName("log"),i.Version("5.6.0")],exports.LogModel),exports.MigrationModel=class MigrationModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.MigrationModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.MigrationModel.prototype,"model",void 0),h([i.Column.String(),v("design:type",String)],exports.MigrationModel.prototype,"version",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.MigrationModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.MigrationModel.prototype,"updated_at",void 0),exports.MigrationModel=h([i.Database(x),i.ModelName("migration"),i.Version("5.6.0")],exports.MigrationModel),exports.SecretModel=class SecretModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.SecretModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.SecretModel.prototype,"key",void 0),h([i.Column.Text(),v("design:type",String)],exports.SecretModel.prototype,"hash",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.SecretModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.SecretModel.prototype,"updated_at",void 0),exports.SecretModel=h([i.Database(x),i.ModelName("secret"),i.Version("5.6.0")],exports.SecretModel),exports.SessionModel=class SessionModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.SessionModel.prototype,"id",void 0),h([i.Column.Json(),v("design:type",Object)],exports.SessionModel.prototype,"data",void 0),h([i.Column.FullDate(),v("design:type",Date)],exports.SessionModel.prototype,"expired_at",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.SessionModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.SessionModel.prototype,"updated_at",void 0),exports.SessionModel=h([i.Database(x),i.ModelName("session"),i.Version("5.6.0")],exports.SessionModel),exports.UserKeyModel=class UserKeyModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserKeyModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.UserKeyModel.prototype,"name",void 0),h([i.Column.String(),v("design:type",String)],exports.UserKeyModel.prototype,"prefix",void 0),h([i.Column.Text(),v("design:type",String)],exports.UserKeyModel.prototype,"hash",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.UserKeyModel.prototype,"last_used_at",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.UserKeyModel.prototype,"expires_at",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.UserKeyModel.prototype,"revoked_at",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserKeyModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserKeyModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.UserKeyModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserKeyModel.prototype,"user_id",void 0),exports.UserKeyModel=h([i.Database(x),i.ModelName("users_key"),ce(),i.Version("5.6.0")],exports.UserKeyModel);class Log{static error(e,t,r){return m(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,r)})}static info(e,t,r){return m(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,r)})}static warn(e,t,r){return m(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,r)})}static writeRaw(e,t,r,o){return m(this,void 0,void 0,function*(){var i;o&&s.Log.console(null!==(i=this.colors[e])&&void 0!==i?i:s.LogColor.White,e,t),x&&(yield exports.LogModel.create({level:e,message:t,source:null!=r?r:""}).catch(s.Log.catch))})}}Log.colors={error:s.LogColor.Red,info:s.LogColor.Cyan,warn:s.LogColor.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 r,o;Log.error(null!==(o=null!==(r=null==t?void 0:t.message)&&void 0!==r?r:t)&&void 0!==o?o:"",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,r,o;const i=null!==(o=null!==(r=null===(t=null==e?void 0:e.constructor)||void 0===t?void 0:t.name)&&void 0!==r?r:null==e?void 0:e.name)&&void 0!==o?o:"null";return Env.BASE_NAME?`${Env.BASE_NAME}.${i}`:i}}class SessionStore extends a.Store{constructor(){super(),this.all=e=>m(this,void 0,void 0,function*(){e=e||r.noop;const t=yield exports.SessionModel.findAll({attributes:["id","expired_at"],where:{expired_at:{[i.Op.gte]:new Date}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.id)),e()}),this.clear=e=>m(this,void 0,void 0,function*(){yield exports.SessionModel.destroy().catch(s.Log.catch),e&&e()}),this.destroy=(e,t)=>m(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{id:e}}).catch(s.Log.catch),t&&t()}),this.expired=()=>m(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{expired_at:{[i.Op.lt]:new Date}}}).catch(s.Log.catch)}),this.get=(e,t)=>m(this,void 0,void 0,function*(){t=t||r.noop;const o=yield exports.SessionModel.findOne({where:{id:e,expired_at:{[i.Op.gte]:new Date}}}).catch(e=>(t(e),null));if(o){if(o.data.cookie){if(new Date(o.data.cookie.expires).getTime()<=Date.now())return yield o.destroy().catch(s.Log.catch),void t(null)}t(null,o.data)}else t(null)}),this.length=e=>m(this,void 0,void 0,function*(){e&&e(null,(yield exports.SessionModel.count().catch(s.Log.catch))||0)}),this.set=(e,t,o)=>m(this,void 0,void 0,function*(){o=o||r.noop;const i=new Date;i.setTime(i.getTime()+Env.API_SESSION_LIFETIME);const[n,d]=(yield exports.SessionModel.findOrCreate({where:{id:e},defaults:{id:e,data:t,expired_at:i}}).catch(s.Log.catch))||[];n?(d||(n.data=t,n.expired_at=i,yield n.save().catch(s.Log.catch)),o()):o()}),setInterval(this.expired,6e4)}}exports.Service=class Service{},exports.Service=h([d.Trait(Loggable)],exports.Service),exports.UserService=class UserService extends exports.Service{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 m(this,void 0,void 0,function*(){var o,i;if(Env.PASSWORD_REUSE)return!0;if(!(null!==(o=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==o?o:0))return!1;const s=null!==(i=yield exports.UserPasswordModel.findAll({attributes:["hash"],where:{user_id:e}}).catch(this.error))&&void 0!==i?i:[];t+=Env.PASSWORD_PEPPER;for(const e of s)if(yield u.verify(e.hash,t).catch(r.noop))return!1;return!0})}checkPassword(e,t){return m(this,void 0,void 0,function*(){var o;if(!(null!==(o=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==o?o:0))return!1;const i=yield exports.UserPasswordModel.findOne({attributes:["hash"],where:{revoked_at:null,user_id:e}}).catch(this.error);return t+=Env.PASSWORD_PEPPER,i&&(yield u.verify(i.hash,t).catch(r.noop))||!1})}createPassword(e,t,r){return m(this,void 0,void 0,function*(){var o;if(!(null!==(o=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==o?o:0))return!1;yield exports.UserPasswordModel.update({revoked_at:new Date},{where:{revoked_at:null,user_id:e}}).catch(this.error);const i=u.hashSync(t+Env.PASSWORD_PEPPER,this.hashOptions);return yield exports.UserPasswordModel.create({hash:i,user_id:e},Object.assign({},{ctx:r})).catch(this.error),!0})}getGroups(e,t){return m(this,void 0,void 0,function*(){var o;return r.uniqueArray((null!==(o=yield exports.GroupModel.findAll({attributes:["group"],where:{active:!0},include:[{association:"users_groups",required:!0,where:Object.assign({user_id:e},t||r.isNull(t)?{tenant_id:t}:{})}]}).catch(this.error))&&void 0!==o?o:[]).map(e=>e.group))})}getPermissions(e,t){return m(this,void 0,void 0,function*(){var o;return r.uniqueArray((null!==(o=yield exports.PermissionModel.findAll({attributes:["permission"],where:{active:!0},include:[{association:"roles_permissions",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],where:{active:!0},include:[{association:"groups_roles",required:!0,attributes:[],include:[{association:"group",required:!0,attributes:[],where:{active:!0},include:[{association:"users_groups",required:!0,attributes:[],where:Object.assign({user_id:e},t||r.isNull(t)?{tenant_id:t}:{})}]}]}]}]}]}).catch(this.error))&&void 0!==o?o:[]).map(e=>e.permission))})}getGroupPermissions(e){return m(this,void 0,void 0,function*(){var t;return r.uniqueArray((null!==(t=yield exports.PermissionModel.findAll({attributes:["permission"],where:{active:!0},include:[{association:"roles_permissions",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],where:{active:!0},include:[{association:"groups_roles",required:!0,attributes:[],where:{group_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.permission))})}getTenants(e){return m(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.TenantModel.findAll({attributes:["id","name"],where:{status:exports.TenantStatus.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}))})}},exports.UserService=h([d.Singleton()],exports.UserService),exports.AuthService=class AuthService extends exports.Service{constructor(){super(...arguments),this.options={algorithm:"HS256",expiresIn:`${Env.TOKEN_TTL}ms`},this.userAttributes={exclude:["username","notes","deleted_at"]},this.userService=new exports.UserService}apiAuth(e){return m(this,void 0,void 0,function*(){var r,o;const i=e.getHeader(Env.TOKEN_HEADER);let s=e.getCookie(Env.TOKEN_COOKIE);s=`${Env.TOKEN_TYPE} ${s}`;const[n,d]=null!==(o=null===(r=i||s)||void 0===r?void 0:r.split(" "))&&void 0!==o?o:["",""];if(!d||n.toLowerCase()!=Env.TOKEN_TYPE)throw new t.HttpUnauthorizedError("Invalid token type");const a=/^sk_([\w]+)_([\w]{6})\./.test(d),{access:l,user:p}=yield a?this.apiKeyAuth(d):this.apiTokenAuth(d),u=e.getHeader("user-agent");if(l instanceof exports.UserAuthModel&&l.user_agent&&l.user_agent!=u)throw new t.HttpUnauthorizedError("Invalid API token");return e.req.access=l,yield this.attachAuthContext(e,p),{access:l,user:p}})}apiKeyAuth(e){return m(this,void 0,void 0,function*(){if(!Env.TOKEN_PEPPER)throw new t.HttpInternalServerError("Authentication service unavailable");if(!e)throw new t.HttpUnauthorizedError("API key missing");const[r]=e.split(".");if(!r)throw new t.HttpUnauthorizedError("Invalid API key");const o=yield exports.UserKeyModel.findOne({where:{prefix:r},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{status:exports.UserStatus.ACTIVE}}]});if(!o||!o.user)throw new t.HttpUnauthorizedError("Invalid API key");if(o.revoked_at)throw new t.HttpUnauthorizedError("API key revoked");if(o.expires_at&&o.expires_at<new Date)throw new t.HttpUnauthorizedError("API key expired");const i=p.createHmac("sha256",Env.TOKEN_PEPPER).update(e).digest("hex");if(!this.safeEqual(i,o.hash))throw new t.HttpUnauthorizedError("Invalid API key");return yield o.update({last_used_at:new Date},Object.assign({},{withoutAudit:!0})).catch(this.error),{access:o,user:o.user}})}apiTokenAuth(e){return m(this,void 0,void 0,function*(){const{id:r,hash:o}=yield this.verifyJwt(e);if(!r||!o)throw new t.HttpUnauthorizedError("Invalid API token");const i=yield exports.UserAuthModel.findOne({attributes:{exclude:["hash"]},where:{hash:o},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:r,status:exports.UserStatus.ACTIVE}}]}).catch(this.error);if(!i||!i.user)throw new t.HttpUnauthorizedError("Invalid API token");if(i.revoked_at)throw new t.HttpUnauthorizedError("API token revoked");return{access:i,user:i.user}})}createApiKey(e,o,i,s){return m(this,void 0,void 0,function*(){if(!Env.TOKEN_PEPPER)throw new t.HttpInternalServerError("Authentication service unavailable");const n=`sk_${Env.TOKEN_PREFIX}_${r.uniqueID(6)}`,d=`${n}.${r.createApiKey()}`,a=p.createHmac("sha256",Env.TOKEN_PEPPER).update(d).digest("hex"),l=yield exports.UserKeyModel.create({name:o,prefix:n,hash:a,expires_at:i,user_id:s.id},Object.assign({},{ctx:e})).catch(this.error);if(!l)throw new t.HttpInternalServerError("API key could not be created");return{id:l.id,key:d}})}createApiToken(e,o){return m(this,void 0,void 0,function*(){var i;if(!Env.TOKEN_SECRET)throw new t.HttpInternalServerError("Authentication service unavailable");const{id:s}=o,n=r.createApiKey(),d=yield exports.UserAuthModel.create({hash:n,user_id:s},Object.assign({},{ctx:e})).catch(this.error);if(!d)throw new t.HttpInternalServerError;const a=l.sign({id:s,hash:n},Env.TOKEN_SECRET,this.options);if(d.user_agent=null!==(i=e.getHeader("user-agent"))&&void 0!==i?i:"",d.ip_address=e.getIp(),!(yield d.save().catch(this.error)))throw new t.HttpInternalServerError("Authentication service unavailable");return{token:a}})}deleteApiKey(e,t,r){return m(this,void 0,void 0,function*(){const o=yield exports.UserKeyModel.findOne({attributes:["id","revoked_at"],where:{id:t,user_id:r.id}}).catch(this.error);return!!o&&(!(!o.revoked_at&&!(yield o.update({revoked_at:new Date},Object.assign({},{ctx:e})).catch(this.error)))&&(yield o.destroy(Object.assign({},{ctx:e})).catch(this.error),!0))})}renewApiToken(e){return m(this,void 0,void 0,function*(){const{id:o,hash:i}=yield this.verifyJwt(e,Env.TOKEN_TTL_RENEW/1e3);if(!o||!i)throw new t.HttpUnauthorizedError("Invalid API token");const s=yield exports.UserAuthModel.findOne({where:{hash:i},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:o,status:exports.UserStatus.ACTIVE}}]}).catch(this.error);if(!s||!s.user)throw new t.HttpUnauthorizedError("Invalid API token");if(s.revoked_at)throw new t.HttpUnauthorizedError("API token revoked");if(s.hash=r.createApiKey(),!(yield s.save().catch(this.error)))throw new t.HttpInternalServerError("Authentication service unavailable");return{token:l.sign({id:o,hash:s.hash},Env.TOKEN_SECRET,this.options)}})}revokeApiKey(e,t,r){return m(this,void 0,void 0,function*(){var o;const[i]=null!==(o=yield exports.UserKeyModel.update({revoked_at:new Date},Object.assign({where:{id:t,revoked_at:null,user_id:r.id}},{ctx:e})).catch(this.error))&&void 0!==o?o:[0];return i>0})}attachAuthContext(e,r){return m(this,void 0,void 0,function*(){e.req.user=r;const o=e.getHeader(Env.TENANT_HEADER),i=yield this.userService.getTenants(r.id);if(o&&!i.find(e=>e.id==o))throw new t.HttpUnauthorizedError("Tenant not found or access denied");const[s,n]=yield Promise.all([this.userService.getGroups(r.id,o),this.userService.getPermissions(r.id,o)]);e.req.groups=s,e.req.permissions=n,e.req.tenants=i})}safeEqual(e,t){const r=Buffer.from(e,"hex"),o=Buffer.from(t,"hex");return r.length===o.length&&p.timingSafeEqual(r,o)}verifyJwt(e,r){return m(this,void 0,void 0,function*(){if(!Env.TOKEN_SECRET)throw new t.HttpInternalServerError("Authentication service unavailable");if(!e||e.split(".").length<3)throw new t.HttpUnauthorizedError("Invalid token");try{return l.verify(e,Env.TOKEN_SECRET,{algorithms:["HS256"],clockTolerance:r})}catch(e){throw new t.HttpUnauthorizedError("Invalid token")}})}},exports.AuthService=h([d.Singleton()],exports.AuthService);class ModelService extends exports.Service{constructor(e,t){var r,o;super(),this.attributes=[],this.permissions=[],this.search=[],this.model=e,(null==t?void 0:t.permissions)&&(this.permissions=t.permissions);const i=Object.keys(e.getAttributes());this.attributes=this.filterAttributes(i,null!==(r=null==t?void 0:t.attributes)&&void 0!==r?r:[]),this.search=this.filterAttributes(i,null!==(o=null==t?void 0:t.search)&&void 0!==o?o:this.attributes)}applySelect(e,t,o){if(!t)return;const i=null==e?void 0:e.getQuery(o?`${o}_select`:"select"),s=t.attributes,n=e=>s.includes(e);t.attributes=[],r.isString(i)&&i.length&&t.attributes.push(...i.split(/\s*,\s*/g).filter(n)),t.attributes.length||(t.attributes=s)}applyOrders(e,t){if(!t)return;const o=null==e?void 0:e.getQuery("order"),i=[],s=t.attributes,n=([e])=>s.includes(e),d=e=>e&&["ASC","DESC"].includes(e)?e:"ASC";if(r.isString(o)&&o.length){const e=o.split(/\s*,\s*/g).map(e=>e.split(/\s*:\s*/g));i.push(...e.filter(n).map(([e,t])=>[e,d((null!=t?t:"ASC").toUpperCase())]))}i.length&&(t.order=i)}applyPagination(e,t){if(!t)return;const o=null==e?void 0:e.getQuery("limit"),i=null==e?void 0:e.getQuery("offset");r.isUndefined(t.limit)&&(t.limit=Env.MODEL_LIMIT,r.isString(o)&&(t.limit=parseInt(o)||0),t.limit=r.clamp(t.limit,-1,Env.MODEL_LIMIT_MAX)),t.limit<0&&(t.limit=void 0),r.isString(i)&&(t.offset=parseInt(i)||0,t.offset<0&&(t.offset=void 0))}applySearch(e,t){var o;if(!t)return;const s=null==e?void 0:e.getQuery("search");s&&r.isString(s)&&(t.where=Object.assign(Object.assign({},null!==(o=t.where)&&void 0!==o?o:{}),{[i.Op.or]:this.search.map(e=>({[e]:{[i.Op.substring]:s}}))}))}applyWhere(e,o,s){var n,d;if(!o)return;const a=null==e?void 0:e.getQuery(s?`${s}_where`:"where");if(!r.isString(a))return;const l=o.attributes;try{const e=i.Where.parse(l,null!==(n=JSON.parse(a))&&void 0!==n?n:{});o.where=Object.assign(Object.assign({},null!==(d=o.where)&&void 0!==d?d:{}),null!=e?e:{})}catch(e){if(e instanceof Error)throw new t.HttpValidationError(e.message);throw new t.HttpInternalServerError}}countAll(e){return m(this,void 0,void 0,function*(){var o,i;const{ctx:s,options:n={}}=e,d=r.merge({},n);d.attributes=this.getAttributes(null!==(o=null==d?void 0:d.attributes)&&void 0!==o?o:[]),this.applySearch(s,d),this.applyWhere(s,d),this.applySelect(s,d);const a=null!==(i=yield this.model.count(Object.assign(Object.assign({},d),{distinct:!!d.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error))&&void 0!==i?i:0;return null==s||s.prepare(t.HttpStatusCodeByName.OK,{count:a}),a})}create(e){return m(this,void 0,void 0,function*(){var o,i;const{body:s={},ctx:n,options:d={}}=e,a=r.merge({},d),l=yield this.model.create(Object.assign({},r.merge({},null!==(i=null===(o=null==n?void 0:n.req)||void 0===o?void 0:o.body)&&void 0!==i?i:{},s)),Object.assign(Object.assign({},a),{ctx:n})).catch(this.error);if(!l)throw new t.HttpInternalServerError;const{primaryKeyAttribute:p}=this.model;return null==n||n.prepare(t.HttpStatusCodeByName.OK,{[p]:l.getDataValue(p)}),l})}delete(e){return m(this,void 0,void 0,function*(){var o,s;const{ctx:n,id:d,options:a={}}=e,{primaryKeyAttribute:l}=this.model,p=null!==(o=null==n?void 0:n.getParam(l))&&void 0!==o?o:d;if(r.isUndefined(p))throw new t.HttpBadRequestError;const u=r.merge({},a),c=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},u),{where:{[i.Op.and]:Object.assign({[l]:p},null!==(s=null==u?void 0:u.where)&&void 0!==s?s:{})},individualHooks:!0}),{ctx:n})).catch(this.error);if(!c)throw new t.HttpNotFoundError;return null==n||n.success("OK"),c})}filterAttributes(e,t){if(r.isArray(t))return t.length?t.filter(t=>r.isString(t)&&e.includes(t)):e;const{exclude:o,include:i}=t,s=r.isUndefined(i)?e:i.filter(t=>r.isString(t)&&e.includes(t)),n=null!=o?o:[];return n.length?s.filter(e=>!n.includes(e)):s}findAll(e){return m(this,void 0,void 0,function*(){var o,i;const{ctx:s,callback:n,options:d={},query:a=!0}=e,l=r.merge({},d);l.attributes=this.getAttributes(null!==(o=null==l?void 0:l.attributes)&&void 0!==o?o:[]),a&&this.applySelect(s,l),this.applyOrders(s,l),this.applyPagination(s,l),(null!==(i=null==l?void 0:l.limit)&&void 0!==i?i:0)>Env.MODEL_LIMIT_MAX&&(l.limit=Env.MODEL_LIMIT_MAX),this.applySearch(s,l),a&&this.applyWhere(s,l);const[p,u]=yield Promise.all([this.model.count(Object.assign(Object.assign({},l),{distinct:!!l.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error).then(e=>null!=e?e:0),this.model.findAll(l).catch(this.error).then(e=>null!=e?e:[])]),c={count:p,records:n?yield n(u):u};return null==s||s.prepare(t.HttpStatusCodeByName.OK,c),c})}findOne(e){return m(this,void 0,void 0,function*(){var o,s,n;const{callback:d,ctx:a,id:l,options:p={},query:u=!0}=e,{primaryKeyAttribute:c}=this.model,g=null!==(o=null==a?void 0:a.getParam(c))&&void 0!==o?o:l;if(r.isUndefined(g))throw new t.HttpBadRequestError;const h=r.merge({},p);h.attributes=this.getAttributes(null!==(s=null==h?void 0:h.attributes)&&void 0!==s?s:[]),u&&this.applySelect(a,h);const y=yield this.model.findOne(Object.assign(Object.assign({},h),{where:{[i.Op.and]:Object.assign({[c]:g},null!==(n=null==h?void 0:h.where)&&void 0!==n?n:{})}})).catch(this.error);if(!y)throw new t.HttpNotFoundError;return null==a||a.prepare(t.HttpStatusCodeByName.OK,d?yield d(y):y.toJSON()),y})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var o;const i=r.clone(t),{ctx:s}=null!=t?t:{};return i.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(o=i.attributes)&&void 0!==o?o:[]),this.applySearch(s,i),this.applyWhere(s,i,t.name),this.applySelect(s,i,t.name),Object.assign({model:e},i)}name(){return this.model.tableName}sync(){return m(this,void 0,void 0,function*(){if(!this.permissions.length)return;const e=this.name().toLowerCase(),t=r.upperCamelCase(e.replace(/_/g," ")," ");yield r.forEachAsync(this.permissions,o=>m(this,void 0,void 0,function*(){const i=r.slugify(`${e}.${o}`,".");yield exports.PermissionModel.findOrCreate({where:{permission:i},defaults:{name:`${t} ${r.upperCamelCase(o," ")}`}})}))})}update(e){return m(this,void 0,void 0,function*(){var o,s,n,d;const{ctx:a,body:l,id:p,options:u={}}=e,{primaryKeyAttribute:c}=this.model,g=null!==(o=null==a?void 0:a.getParam(c))&&void 0!==o?o:p;if(r.isUndefined(g))throw new t.HttpBadRequestError;const h=r.merge({},u),y=r.merge({},null!==(n=null===(s=null==a?void 0:a.req)||void 0===s?void 0:s.body)&&void 0!==n?n:{},null!=l?l:{}),v=yield this.model.findOne(Object.assign(Object.assign({},h),{attributes:this.getAttributes([c,...Object.keys(y)]),where:{[i.Op.and]:Object.assign({[c]:g},null!==(d=null==h?void 0:h.where)&&void 0!==d?d:{})}})).catch(this.error);if(!v)throw new t.HttpNotFoundError;return v.set(y),v.changed()?(yield v.save(Object.assign({},{ctx:a})).catch(this.error),null==a||a.success("OK"),!0):(null==a||a.success("Record not changed"),!1)})}}class Application extends t.Application{constructor(e,t){super(e,r.merge({},{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:r.uuidv7},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 m(this,void 0,void 0,function*(){yield this.prepare(),yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new o.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>m(this,void 0,void 0,function*(){t.url||(t.url=""),e.on("close",()=>{}),yield r.sleep(2e3)})))})}prepare(){return m(this,void 0,void 0,function*(){this._prepared||(yield x.sync(),yield this.migrations(x),yield r.forEachSeries(this.controllers,e=>m(this,void 0,void 0,function*(){r.isFunction(e.sync)&&(yield e.sync(this))})),this.authService=new exports.AuthService,this.userService=new exports.UserService,this._prepared=!0)})}migrations(e){return m(this,void 0,void 0,function*(){const t=[];yield r.forEachSeries(Object.keys(e.models),r=>m(this,void 0,void 0,function*(){var o;const i=e.models[r],s=i.version();if(!s)return;const[n,d]=null!==(o=yield exports.MigrationModel.findOrCreate({where:{model:i.tableName},defaults:{model:i.tableName,version:""}}).catch(this.error))&&void 0!==o?o:[];n&&(d||n.version!=s)&&(n.version=s,yield n.save().catch(this.error),t.push(i))})),yield r.forEachSeries(t,e=>m(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}exports.BaseController=class BaseController extends r.EventEmitter{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 m(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=r.upperCamelCase(e.replace(/_/g," ")," ");yield r.forEachSeries(this.permissions,o=>m(this,void 0,void 0,function*(){const i=r.slugify(`${e}.${o}`,".");yield exports.PermissionModel.findOrCreate({where:{permission:i},defaults:{name:`${t} ${r.upperCamelCase(o," ")}`}})}))})}},exports.BaseController=h([d.Trait(Loggable)],exports.BaseController);class ModelController extends exports.BaseController{constructor(){super(...arguments),this.attributes=[],this.permissions=["audit","create","read","update","delete"],this.search=[]}countAll(e){return m(this,void 0,void 0,function*(){return yield this.service.countAll(e)})}create(e){return m(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return m(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return m(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return m(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}include(e,t){return this.service.include(e,t)}sync(){return m(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=r.upperCamelCase(e.replace(/_/g," ")," ");yield r.forEachSeries(this.permissions,o=>m(this,void 0,void 0,function*(){const i=r.slugify(`${e}.${o}`,".");yield exports.PermissionModel.findOrCreate({where:{permission:i},defaults:{name:`${t} ${r.upperCamelCase(o," ")}`}})})),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 m(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}}exports.AuditsController=class AuditsController extends ModelController{constructor(){super(...arguments),this.model=exports.AuditModel,this.permissions=["read"]}all(e){return m(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["currently","previously"]}}})})}record(e,t){return m(this,void 0,void 0,function*(){yield this.ensurePermission(e,t),yield this.findAll({ctx:e,options:{where:{record:t}}})})}get(e){return m(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}ensurePermission(e,o){return m(this,void 0,void 0,function*(){var i;const s=yield exports.AuditModel.findOne({where:{record:o}}).catch(this.error);if(!s)return;const n=r.slugify(`${s.model}.audit`,".");if(!(null===(i=e.req.permissions)||void 0===i?void 0:i.includes(n)))throw new t.HttpUnauthorizedError("Access denied")})}},h([t.Get(),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),h([t.Get("/record/:record"),I(),y(0,t.Ctx()),y(1,t.Params("record")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.AuditsController.prototype,"record",null),h([t.Get("/:id"),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=h([t.Controller("/audits")],exports.AuditsController),exports.AuthController=class AuthController extends exports.BaseController{constructor(){super(...arguments),this.authService=new exports.AuthService}login(e,o,s,n,d){return m(this,void 0,void 0,function*(){var a,l;yield r.sleep(Env.SLEEP_AUTH);const p=yield exports.UserPasswordModel.findOne({where:{revoked_at:null},include:[{association:"user",required:!0,where:{status:{[i.Op.in]:[exports.UserStatus.ACTIVE,exports.UserStatus.PENDING]},[i.Op.or]:[{email:o},{username:o}]},include:[{association:"registers",required:!1,where:{active:!0}}]}]}).catch(this.error);if(s+=Env.PASSWORD_PEPPER,!p||!p.user||null===(a=yield u.verify(p.hash,s).catch(r.noop))||void 0===a||!a)throw d.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),new t.HttpUnauthorizedError("Invalid credentials");if(p.user.registers.length)throw d.emit("auth.activation",{ctx:e}),this.emit("auth.activation",{ctx:e}),new t.HttpUnauthorizedError("Activation required");if(p.user.status!==exports.UserStatus.ACTIVE)throw d.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),new t.HttpUnauthorizedError("Invalid credentials");const{token:c}=null!==(l=yield this.authService.createApiToken(e,p.user).catch(t=>{throw d.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),t}))&&void 0!==l?l:{};Env.TOKEN_COOKIE_SET&&e.setCookie(Env.TOKEN_COOKIE,c,{httpOnly:!0,secure:Env.isProduction(),sameSite:"lax",maxAge:n?Env.TOKEN_TTL:void 0}),e.json({token:c}),d.emit("auth.login",{ctx:e}),this.emit("auth.login",{ctx:e})})}logout(e,r,o){return m(this,void 0,void 0,function*(){if(r instanceof exports.UserKeyModel)throw new t.HttpUnauthorizedError("Access denied");if(r.revoked_at=new Date,!(yield r.save().catch(this.error)))throw new t.HttpInternalServerError("Authentication service unavailable");Env.TOKEN_COOKIE_SET&&e.clearCookie(Env.TOKEN_COOKIE),e.success("OK"),o.emit("auth.logout",{ctx:e}),this.emit("auth.logout",{ctx:e})})}user(e){return m(this,void 0,void 0,function*(){const{groups:r,permissions:o,tenants:i,user:s}=e.req;if(!(r&&o&&i&&s))throw new t.HttpInternalServerError;e.json(Object.assign(Object.assign({},s.toJSON()),{groups:r,permissions:o,tenants:i}))})}renew(e,t,r){return m(this,void 0,void 0,function*(){const{token:o}=yield this.authService.renewApiToken(t);e.json({token:o}),r.emit("auth.renew",{ctx:e}),this.emit("auth.renew",{ctx:e})})}},h([t.Post("/login"),t.ValidateBody(e=>({username:e.string().min(3),password:e.string().min(5),remember:e.boolean().parse().default(!1)})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.Body("password")),y(3,t.Body("remember")),y(4,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Boolean,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"login",null),h([t.Get("/logout"),I(),y(0,t.Ctx()),y(1,U()),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,Object,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),h([t.Get("/me"),I(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.AuthController.prototype,"user",null),h([t.Post("/renew"),t.ValidateBody(e=>({token:e.string()})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),exports.AuthController=h([t.Controller("/auth")],exports.AuthController);class CrudController extends ModelController{constructor(){super(...arguments),this._crud={}}CrudArgumentsCountAll(e){return{ctx:e}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidateCreate(){return this._crud}CrudValidateUpdate(){return this._crud}add(e){return m(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return m(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}rows(e){return m(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsCountAll(e))})}del(e){return m(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return m(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return m(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validate(e,o){var i,s;const n=r.Validation.object(o).parse().validate(null!==(s=null===(i=e.req)||void 0===i?void 0:i.body)&&void 0!==s?s:{});if(n.error)throw new t.HttpValidationError(n.message||n.error);e.req.body=n.value,e.next()}validateCreate(e){const r=this.CrudValidateCreate();if(r==this._crud)throw new t.HttpInternalServerError;this.validate(e,r)}validateUpdate(e){const r=this.CrudValidateUpdate();if(r==this._crud)throw new t.HttpInternalServerError;this.validate(e,r)}}h([t.Post(),I(),w(),t.Middleware("validateCreate"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"add",null),h([t.Get(),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"all",null),h([t.Get("/count"),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"rows",null),h([t.Delete("/:id"),I(),O(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"del",null),h([t.Get("/:id"),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"get",null),h([t.Put("/:id"),I(),_(),t.Middleware("validateUpdate"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"set",null),h([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",void 0)],CrudController.prototype,"validateCreate",null),h([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",void 0)],CrudController.prototype,"validateUpdate",null),exports.FilesController=class FilesController extends exports.BaseController{constructor(){super(...arguments),this.directory=Env.HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return m(this,void 0,void 0,function*(){let{path:o}=e.req;o=o.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=g.join(this.directory,o);if(!c.existsSync(i)||!c.statSync(i).isDirectory())throw new t.HttpNotFoundError;let s;return s=c.readdirSync(i),s=s.map(e=>this.info(g.join(i,e))),s=s.filter(r.isDef),Object.assign(Object.assign({},this.info(i)),{files:s})})}info(e){if(!c.existsSync(e))return null;const t=c.statSync(e),r=e.split("/").pop();e=e.replace(this.directory,"/").replace(/^\/\//,"/");const o=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:o?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:o,symlink:t.isSymbolicLink()}}name(){return"files"}sync(){return m(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=r.upperCamelCase(e.replace(/_/g," ")," ");yield r.forEachSeries(this.permissions,o=>m(this,void 0,void 0,function*(){const i=r.slugify(`${e}.${o}`,".");yield exports.PermissionModel.findOrCreate({where:{permission:i},defaults:{name:`${t} ${r.upperCamelCase(o," ")}`}})}))})}},h([t.Get("/path"),t.Get("/path/*path"),I(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.FilesController.prototype,"files",null),exports.FilesController=h([t.Controller("/files")],exports.FilesController),exports.ForgotController=class ForgotController extends exports.BaseController{check(e,o){return m(this,void 0,void 0,function*(){const i=yield this.find(o);if(!i||!i.user)throw new t.HttpNotFoundError;i.secret=r.uniqueID(),yield i.save(),e.json({token:i.secret})})}forgot(e,o,s){return m(this,void 0,void 0,function*(){yield r.sleep(Env.SLEEP_FORGOT);const n=o,d=yield exports.UserModel.findOne({where:{[i.Op.or]:[{email:n},{username:o}]}}).catch(this.error);if(!d)throw new t.HttpNotFoundError;const a=r.uniqueID(),l=Date.now()+6e4*Env.TOKEN_TTL_FORGOT,p=yield exports.ForgotModel.create({token:a,timestamp:l,active:!0,user_id:d.id});e.success("OK"),s.emit("forgot.send",{ctx:e,forgot:p,user:d}),this.emit("forgot.send",{ctx:e,forgot:p,user:d})})}reset(e,r,o,i){return m(this,void 0,void 0,function*(){const o=yield this.find(r);if(!o)throw new t.HttpNotFoundError;o.active=!1,yield o.save().catch(this.error),yield o.user.save().catch(this.error),e.success("OK"),i.emit("forgot.reset",{ctx:e,user:o.user}),this.emit("forgot.reset",{ctx:e,user:o.user})})}find(e){return m(this,void 0,void 0,function*(){return yield exports.ForgotModel.findOne({where:{token:e,active:!0},include:[{association:"users",required:!0}]}).catch(this.error)})}},h([t.Get("/check"),t.ValidateBody(e=>({token:e.string()})),y(0,t.Ctx()),y(1,t.Body("token")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),h([t.Post(),t.ValidateBody(e=>({username:e.string().min(4)})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),h([t.Post("/reset"),t.ValidateBody(e=>({token:e.string(),password:e.string().min(5)})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.Body("password")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=h([t.Controller("/forgot")],exports.ForgotController),exports.GroupsController=class GroupsController extends CrudController{constructor(){super(...arguments),this.model=exports.GroupModel,this.schemaCreate={name:r.Validation.string(),group:r.Validation.string().slugify("."),description:r.Validation.string().default(""),type:r.Validation.enum(Object.values(exports.GroupTypes)).default(exports.GroupTypes.SYSTEM),active:r.Validation.boolean().parse()},this.schemaUpdate={name:r.Validation.string().optional(),group:r.Validation.string().slugify(".").optional(),description:r.Validation.string().optional(),type:r.Validation.enum(Object.values(exports.GroupTypes)).optional(),active:r.Validation.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return m(this,void 0,void 0,function*(){yield e.sync.call(this),this.userModelService=new ModelService(exports.UserModel)})}users(e,t){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_groups",required:!0,attributes:[],where:{group_id:t}}]}})})}ensureGroup(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.GroupModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Get("/:id/users"),I(),T("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.GroupsController.prototype,"users",null),exports.GroupsController=h([t.Controller("/groups")],exports.GroupsController),exports.GroupsPermissionsController=class GroupsPermissionsController extends exports.BaseController{constructor(){super(...arguments),this.userService=new exports.UserService}all(e,t){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t);const r=yield this.userService.getGroupPermissions(t);e.json({permissions:r})})}ensureGroup(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.GroupModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Get("/:id/permissions"),I(),T("groups"),T("permissions"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),exports.GroupsPermissionsController=h([t.Controller("/groups")],exports.GroupsPermissionsController),exports.GroupsRolesController=class GroupsRolesController extends ModelController{constructor(){super(...arguments),this.model=exports.RoleModel,this.permissions=[]}add(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(r),yield this.addRoles(e,t,r),e.success("OK")})}all(e,t){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],where:{group_id:t}}]}})})}del(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(r),yield exports.GroupRoleModel.destroy(Object.assign({where:{group_id:t,role_id:{[i.Op.in]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(r);const o=yield this.addRoles(e,t,r);yield exports.GroupRoleModel.destroy(Object.assign({where:{group_id:t,role_id:{[i.Op.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addRoles(e,t,o){return m(this,void 0,void 0,function*(){const i=[];return yield r.forEachAsync(o,r=>m(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.GroupRoleModel.findOrCreate(Object.assign({where:{group_id:t,role_id:r},defaults:{group_id:t,role_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];s&&i.push(r)})),i})}ensureGroup(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.GroupModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}ensureRoles(e){return m(this,void 0,void 0,function*(){var o;if(e.length!=r.uniqueArray(e).length)throw new t.HttpValidationError("Duplicate role id");if((null!==(o=yield exports.RoleModel.count({where:{id:{[i.Op.in]:e}}}).catch(this.error))&&void 0!==o?o:0)!=e.length)throw new t.HttpValidationError("Invalid role id")})}},h([t.Post("/:id/roles"),I(),w(),T("groups"),t.ValidateBody(e=>({roles:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("roles")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.GroupsRolesController.prototype,"add",null),h([t.Get("/:id/roles"),I(),T(),T("groups"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.GroupsRolesController.prototype,"all",null),h([t.Delete("/:id/roles"),I(),O(),T("groups"),t.ValidateBody(e=>({roles:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("roles")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.GroupsRolesController.prototype,"del",null),h([t.Put("/:id/roles"),I(),_(),T("groups"),t.ValidateBody(e=>({roles:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("roles")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.GroupsRolesController.prototype,"set",null),exports.GroupsRolesController=h([t.Controller("/groups")],exports.GroupsRolesController),exports.HealthController=class HealthController{ping(e){return m(this,void 0,void 0,function*(){e.json({status:"ok",timestamp:Date.now(),uptime:process.uptime()})})}},h([t.All("/"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.HealthController.prototype,"ping",null),exports.HealthController=h([t.Controller("/health")],exports.HealthController),exports.LogsController=class LogsController extends ModelController{constructor(){super(...arguments),this.model=exports.LogModel,this.permissions=["read"]}all(e){return m(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}},h([t.Get(),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=h([t.Controller("/logs")],exports.LogsController),exports.McpController=class McpController extends exports.BaseController{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=>m(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 m(this,void 0,void 0,function*(){yield t.sync.call(this),this.toolsRegistered||(this.toolsRegistered=!0,e&&(e.instance.use((e,t,r,o)=>{if(!this.isMcpEndpoint(t))return o(e);const i=this.jsonParseErrorResponse(e);if(!i)return o(e);this.setResponseHeaders(r,t),r.status(i.status).json(i.body)}),e.instance.use((e,t,r)=>{if(!this.isMcpEndpoint(e)||!["GET","HEAD"].includes(e.method))return r();t.setHeader("Allow",X),this.setResponseHeaders(t,e),t.status(405).end()}),oe(e.controllers).forEach(e=>this.tools.register(e))))})}get(e){return m(this,void 0,void 0,function*(){this.respond(e,this.handler.get(e))})}options(e){return m(this,void 0,void 0,function*(){this.respond(e,this.handler.options(e))})}post(e){return m(this,void 0,void 0,function*(){this.respond(e,yield this.handler.post(e))})}delete(e){return m(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:q(null,new McpParseError("Parse error",{message:e.message}))}}respond(e,t){var r;this.setResponseHeaders(e.res,e.req);for(const[o,i]of Object.entries(null!==(r=t.headers)&&void 0!==r?r:{}))e.res.setHeader(o,i);void 0!==t.body?e.res.status(t.status).json(t.body):e.res.status(t.status).end()}setResponseHeaders(e,t,r){const o=this.getAllowedOrigin(t);Object.entries(Object.assign(Object.assign(Object.assign(Object.assign({Allow:X},o?{"Access-Control-Allow-Origin":o}:{}),o&&"*"!==o?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":X,"Access-Control-Allow-Headers":`Content-Type, Accept, ${Env.TOKEN_HEADER}, ${Y}, ${$}`}),null!=r?r:{})).forEach(([t,r])=>{e.setHeader(t,r)})}getAllowedOrigin(e){if(Env.HTTP_CROSS.split(",").includes("*"))return"*";const t=null==e?void 0:e.headers.origin;if(!t)return;const r=Array.isArray(t)?t[0]:t;return Env.HTTP_CROSS.split(",").includes(r)?r:void 0}},h([t.Get(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.McpController.prototype,"get",null),h([t.Options(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.McpController.prototype,"options",null),h([t.Post(),I(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.McpController.prototype,"post",null),h([t.Delete(),I(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.McpController.prototype,"delete",null),exports.McpController=h([t.Controller("/mcp")],exports.McpController),exports.PagesController=class PagesController extends CrudController{constructor(){super(...arguments),this.model=exports.PageModel,this.schemaCreate={type:r.Validation.enum(Object.values(exports.PageTypes)).optional(),name:r.Validation.string().optional(),description:r.Validation.string().optional(),icon:r.Validation.string().optional(),path:r.Validation.string().optional(),active:r.Validation.boolean().optional(),page_id:r.Validation.string().uuid().empty(),permission_id:r.Validation.string().uuid().empty()},this.schemaUpdate={type:r.Validation.enum(Object.values(exports.PageTypes)).optional(),name:r.Validation.string().optional(),description:r.Validation.string().optional(),icon:r.Validation.string().optional(),path:r.Validation.string().optional(),active:r.Validation.boolean().optional(),page_id:r.Validation.string().uuid().empty(),permission_id:r.Validation.string().uuid().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}position(e,t){return m(this,void 0,void 0,function*(){const o=t.map(({id:e})=>e);yield this.ensurePages(o),yield r.forEachSeries(t,t=>m(this,[t],void 0,function*({id:t,position:r}){yield exports.PageModel.update({position:r},Object.assign({where:{id:t},individualHooks:!0},{ctx:e})).catch(this.error)})),e.success("OK")})}ensurePages(e){return m(this,void 0,void 0,function*(){var o;if(e.length!=r.uniqueArray(e).length)throw new t.HttpValidationError("Duplicate page id");if((null!==(o=yield exports.PageModel.count({where:{id:{[i.Op.in]:e}}}).catch(this.error))&&void 0!==o?o:0)!=e.length)throw new t.HttpValidationError("Invalid page id")})}},h([t.Put("/position"),I(),_(),t.ValidateBody(e=>({pages:e.array(e.object({id:e.string().uuid(),position:e.number().parse()}))})),y(0,t.Ctx()),y(1,t.Body("pages")),v("design:type",Function),v("design:paramtypes",[t.Context,Array]),v("design:returntype",Promise)],exports.PagesController.prototype,"position",null),exports.PagesController=h([t.Controller("/pages")],exports.PagesController),exports.PermissionsController=class PermissionsController extends CrudController{constructor(){super(...arguments),this.model=exports.PermissionModel,this.schemaCreate={name:r.Validation.string(),permission:r.Validation.string().slugify("."),description:r.Validation.string().default(""),active:r.Validation.boolean().parse()},this.schemaUpdate={name:r.Validation.string().optional(),permission:r.Validation.string().slugify(".").optional(),description:r.Validation.string().optional(),active:r.Validation.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return m(this,void 0,void 0,function*(){yield e.sync.call(this),this.groupModelService=new ModelService(exports.GroupModel)})}groups(e,t){return m(this,void 0,void 0,function*(){yield this.ensurePermission(t),yield this.groupModelService.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],include:[{association:"roles_permissions",required:!0,attributes:[],where:{permission_id:t}}]}]}]}})})}ensurePermission(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.PermissionModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Get("/:id/groups"),I(),T("groups"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.PermissionsController.prototype,"groups",null),exports.PermissionsController=h([t.Controller("/permissions")],exports.PermissionsController),exports.ProfileController=class ProfileController extends ModelController{constructor(){super(),this.model=exports.UserModel,this.permissions=["avatar","password"],this.path=Env.HTTP_PUBLIC+"/avatar",this.userService=new exports.UserService,Env.HTTP_PUBLIC&&c.existsSync(Env.HTTP_PUBLIC)&&!c.existsSync(this.path)&&c.mkdirSync(this.path)}user(e){return m(this,void 0,void 0,function*(){const{groups:r,permissions:o,tenants:i,user:s}=e.req;if(!(r&&o&&i&&s))throw new t.HttpInternalServerError;e.json(Object.assign(Object.assign({},s.toJSON()),{groups:r,permissions:o,tenants:i}))})}avatar(e,r){return m(this,void 0,void 0,function*(){var o;const i=e.getFiles();if(i.file&&i.file.length){const{filename:s,path:n}=null!==(o=i.file[0])&&void 0!==o?o:{};if(s){const o=yield exports.UserModel.findOne({where:{id:r.id}}).catch(this.error);if(!o)throw c.lstatSync(n).isFile()&&c.rmSync(n),new t.HttpInternalServerError;const i=this.path+"/"+o.metadata.avatar_url;if(c.existsSync(i)&&c.lstatSync(i).isFile()&&c.rmSync(i),o.changed("metadata",!0),o.metadata.avatar_url=s,yield o.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not changed")})}avatar_del(e,t){return m(this,void 0,void 0,function*(){const r=this.path+"/"+t.metadata.avatar_url;if(c.existsSync(r)&&c.lstatSync(r).isFile()&&c.rmSync(r),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,r,o,i){return m(this,void 0,void 0,function*(){if(!(yield this.userService.checkPassword(i.id,r)))throw new t.HttpUnauthorizedError("Invalid password");if(!(yield this.userService.canAssignPassword(i.id,o)))throw new t.HttpConflictError("Password already used");if(yield this.userService.createPassword(i.id,o,e))return e.success("OK");throw new t.HttpInternalServerError})}},h([t.Get(),I(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.ProfileController.prototype,"user",null),h([t.Post("/avatar"),I(),R("avatar"),t.Upload({file:{count:1,path:`${Env.HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),y(0,t.Ctx()),y(1,k()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.ProfileController.prototype,"avatar",null),h([t.Delete("/avatar"),I(),R("avatar"),y(0,t.Ctx()),y(1,k()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.ProfileController.prototype,"avatar_del",null),h([t.Post("/password"),I(),R("password"),t.ValidateBody(e=>({oldPassword:e.string().min(5),newPassword:e.string().min(5)})),y(0,t.Ctx()),y(1,t.Body("oldPassword")),y(2,t.Body("newPassword")),y(3,k()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,exports.UserModel]),v("design:returntype",Promise)],exports.ProfileController.prototype,"password",null),exports.ProfileController=h([t.Controller("/profile"),v("design:paramtypes",[])],exports.ProfileController),exports.RegisterController=class RegisterController extends exports.BaseController{register(e,o,n){return m(this,void 0,void 0,function*(){yield r.sleep(Env.SLEEP_REGISTRY);const{name:d,date:a,email:l,username:p,password:u,confirm:c}=o,g=p||l,h=s.sha256(u);if(yield exports.UserModel.count({where:{[i.Op.or]:[{email:l},{username:g}]}}).catch(this.error))throw new t.HttpBadRequestError("Invalid email or username");if(h!=s.sha256(c))throw new t.HttpBadRequestError("Invalid password");const y=yield exports.UserModel.create({name:d,email:l,username:g,password:h,avatar:"",date:a,description:"",status:exports.UserStatus.PENDING}).catch(this.error);if(!y)throw new t.HttpInternalServerError;const v=yield exports.RegisterModel.create({token:yield this.getId(),active:!0,user_id:y.id}).catch(this.error);if(!v)throw yield y.destroy().catch(this.error),new t.HttpInternalServerError;e.success("OK"),n.emit("register.user",{ctx:e,register:v,user:y}),this.emit("register.user",{ctx:e,register:v,user:y})})}confirm(e,r,o){return m(this,void 0,void 0,function*(){const i=yield exports.RegisterModel.findOne({where:{token:r,active:!0},include:[{association:"users",required:!0}]}).catch(this.error);if(!i)throw new t.HttpNotFoundError;i.active=!1,yield i.save().catch(this.error),i.user.status=exports.UserStatus.ACTIVE,yield i.user.save().catch(this.error),e.success("OK"),o.emit("register.confirm",{ctx:e,register:i,user:i.user}),this.emit("register.confirm",{ctx:e,register:i,user:i.user})})}send(e,r,o){return m(this,void 0,void 0,function*(){const s=r,n=yield exports.RegisterModel.findOne({where:{active:!0},include:[{model:exports.UserModel,required:!0,where:{[i.Op.or]:[{email:s},{username:r}]}}]}).catch(this.error);if(!n)throw new t.HttpNotFoundError;e.success("OK"),o.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})})}getId(){return m(this,void 0,void 0,function*(){const e=r.uuidv7();return(yield exports.RegisterModel.count({where:{token:e}}))?this.getId():e})}},h([t.Post(),t.ValidateBody(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)})),y(0,t.Ctx()),y(1,t.Body()),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,Object,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),h([t.Post("/confirm"),t.ValidateBody(e=>({token:e.string()})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),h([t.Post("/send"),t.ValidateBody(e=>({username:e.string().min(4)})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=h([t.Controller("/register")],exports.RegisterController),exports.RolesController=class RolesController extends CrudController{constructor(){super(...arguments),this.model=exports.RoleModel,this.schemaCreate={name:r.Validation.string(),role:r.Validation.string().slugify("."),description:r.Validation.string().default(""),active:r.Validation.boolean().parse()},this.schemaUpdate={name:r.Validation.string().optional(),role:r.Validation.string().slugify(".").optional(),description:r.Validation.string().optional(),active:r.Validation.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return m(this,void 0,void 0,function*(){yield e.sync.call(this),this.groupModelService=new ModelService(exports.GroupModel)})}groups(e,t){return m(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.groupModelService.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],where:{role_id:t}}]}})})}ensureRole(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.RoleModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Get("/:id/groups"),I(),T("groups"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.RolesController.prototype,"groups",null),exports.RolesController=h([t.Controller("/roles")],exports.RolesController),exports.RolesPermissionsController=class RolesPermissionsController extends ModelController{constructor(){super(...arguments),this.model=exports.PermissionModel,this.permissions=[]}add(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(r),yield this.addPermissions(e,t,r),e.success("OK")})}all(e,t){return m(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.findAll({ctx:e,options:{include:[{association:"roles_permissions",required:!0,attributes:[],where:{role_id:t}}]}})})}del(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(r),yield exports.RolePermissionModel.destroy(Object.assign({where:{role_id:t,permission_id:{[i.Op.in]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(r);const o=yield this.addPermissions(e,t,r);yield exports.RolePermissionModel.destroy(Object.assign({where:{role_id:t,permission_id:{[i.Op.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addPermissions(e,t,o){return m(this,void 0,void 0,function*(){const i=[];return yield r.forEachAsync(o,r=>m(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.RolePermissionModel.findOrCreate(Object.assign({where:{role_id:t,permission_id:r},defaults:{role_id:t,permission_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];s&&i.push(r)})),i})}ensurePermissions(e){return m(this,void 0,void 0,function*(){var o;if(e.length!=r.uniqueArray(e).length)throw new t.HttpValidationError("Duplicate permission id");if((null!==(o=yield exports.PermissionModel.count({where:{id:{[i.Op.in]:e}}}).catch(this.error))&&void 0!==o?o:0)!=e.length)throw new t.HttpValidationError("Invalid permission id")})}ensureRole(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.RoleModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Post("/:id/permissions"),I(),w(),_("roles"),t.ValidateBody(e=>({permissions:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("permissions")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.RolesPermissionsController.prototype,"add",null),h([t.Get("/:id/permissions"),I(),T(),_("roles"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.RolesPermissionsController.prototype,"all",null),h([t.Delete("/:id/permissions"),I(),O(),_("roles"),t.ValidateBody(e=>({permissions:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("permissions")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.RolesPermissionsController.prototype,"del",null),h([t.Put("/:id/permissions"),I(),_(),_("roles"),t.ValidateBody(e=>({permissions:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("permissions")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.RolesPermissionsController.prototype,"set",null),exports.RolesPermissionsController=h([t.Controller("/roles")],exports.RolesPermissionsController),exports.SetupController=class SetupController extends exports.BaseController{constructor(){super(...arguments),this.userService=new exports.UserService}setup(e){return m(this,void 0,void 0,function*(){var o;if(yield exports.UserModel.count())throw new t.HttpNotFoundError("Endpoint not found");const i=yield exports.UserModel.create({name:"Admin",username:"admin",email:"admin@localhost.com",notes:"",status:exports.UserStatus.ACTIVE},Object.assign({},{ctx:e})).catch(this.error);if(!i)throw new t.HttpInternalServerError;yield this.userService.createPassword(i.id,"admin",e);const s=yield exports.GroupModel.create({name:"Admin",group:"admin",description:"",active:!0},Object.assign({},{ctx:e}));yield exports.UserGroupModel.create({user_id:i.id,group_id:s.id},Object.assign({},{ctx:e})),yield exports.GroupModel.create({name:"User",group:"user",description:"",active:!0},Object.assign({},{ctx:e}));const n=yield exports.RoleModel.create({name:"Admin Permissions",role:"admin",description:"",active:!0},Object.assign({},{ctx:e}));if(!n)throw new t.HttpInternalServerError;yield exports.GroupRoleModel.create({group_id:s.id,role_id:n.id},Object.assign({},{ctx:e}));const d=null!==(o=yield exports.PermissionModel.findAll({where:{active:!0}}).catch(this.error))&&void 0!==o?o:[];yield r.forEachSeries(d,t=>m(this,void 0,void 0,function*(){yield exports.RolePermissionModel.create({role_id:n.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}},h([t.Get(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=h([t.Controller("/setup")],exports.SetupController),exports.TenantsController=class TenantsController extends CrudController{constructor(){super(...arguments),this.model=exports.TenantModel,this.schemaCreate={name:r.Validation.string(),description:r.Validation.string().default(""),status:r.Validation.enum(Object.values(exports.TenantStatus)).default(exports.TenantStatus.ACTIVE)},this.schemaUpdate={name:r.Validation.string().optional(),description:r.Validation.string().optional(),status:r.Validation.enum(Object.values(exports.TenantStatus)).optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return m(this,void 0,void 0,function*(){yield e.sync.call(this),this.userModelService=new ModelService(exports.UserModel)})}users(e,t){return m(this,void 0,void 0,function*(){yield this.ensureTenant(t),yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_tenants",required:!0,attributes:[],where:{tenant_id:t}}]}})})}ensureTenant(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.TenantModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Get("/:id/users"),I(),T("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.TenantsController.prototype,"users",null),exports.TenantsController=h([t.Controller("/tenants")],exports.TenantsController),exports.TestController=class TestController extends exports.BaseController{json(e){return m(this,void 0,void 0,function*(){e.json({ok:!0,message:"hello",timestamp:Date.now()})})}workerSum(){return m(this,void 0,void 0,function*(){return{value:2}})}sum(e,t){return m(this,void 0,void 0,function*(){const{a:t,b:r}=e;return{value:t+r}})}multiply(e,t){return m(this,void 0,void 0,function*(){const{a:t,b:r}=e;return{value:t*r}})}average(e,t){return m(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 m(this,void 0,void 0,function*(){const t=e.text;return{length:t.length,normalized:t.trim()}})}validationNumber(e,t){return m(this,void 0,void 0,function*(){return{doubled:2*e.value}})}validationBoolean(e,t){return m(this,void 0,void 0,function*(){return{active:e.active}})}validationArray(e,t){return m(this,void 0,void 0,function*(){return{count:e.tags.length}})}validationObject(e,t){return m(this,void 0,void 0,function*(){const t=e.profile;return{summary:{name:t.name,adult:t.age>=18}}})}validationEnum(e,t){return m(this,void 0,void 0,function*(){return{status:e.status}})}validationDate(e,t){return m(this,void 0,void 0,function*(){const t=e.date;return{iso:t.toISOString(),timestamp:t.getTime()}})}validationOptional(e,t){return m(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 m(this,void 0,void 0,function*(){return{name:e.name,limit:e.limit}})}validationParse(e,t){return m(this,void 0,void 0,function*(){return{active:e.active,amount:e.amount}})}validationNested(e,t){return m(this,void 0,void 0,function*(){const t=e.payload;return{userId:t.user.id,scoreCount:t.scores.length}})}},h([t.Get(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.TestController.prototype,"json",null),h([ge("test.sum"),v("design:type",Function),v("design:paramtypes",[]),v("design:returntype",Promise)],exports.TestController.prototype,"workerSum",null),h([se({name:"sum",title:"Somar numeros",description:"Soma dois numeros.",input:{a:r.Validation.number().description("valor a"),b:r.Validation.number().description("valor b")},output:{value:r.Validation.number().description("resultado da soma de a + b")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"sum",null),h([se({name:"multiply",title:"Multiplicar numeros",description:"Multiplica dois numeros.",input:{a:r.Validation.number().description("valor a"),b:r.Validation.number().description("valor b")},output:{value:r.Validation.number().description("resultado da multiplicação de a * b")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"multiply",null),h([se({name:"average",title:"Calcular media",description:"Calcula a media de uma lista de numeros.",input:{values:r.Validation.array(r.Validation.number().description("numero usado no calculo da media")).min(1).max(10).description("lista de numeros para calcular a media")},output:{value:r.Validation.number().description("media calculada"),count:r.Validation.number().description("quantidade de numeros usados")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"average",null),h([se({name:"validation.string",title:"Validacao de string",description:"Exemplo de validacao de texto com tamanho minimo e maximo.",input:{text:r.Validation.string().min(5).max(50).description("Texto entre 5 e 50 caracteres.")},output:{length:r.Validation.number().description("Quantidade de caracteres do texto."),normalized:r.Validation.string().description("Texto normalizado sem espacos nas pontas.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationString",null),h([se({name:"validation.number",title:"Validacao de number",description:"Exemplo de validacao numerica com minimo e maximo.",input:{value:r.Validation.number().min(0).max(100).description("Numero entre 0 e 100.")},output:{doubled:r.Validation.number().description("Numero multiplicado por dois.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationNumber",null),h([se({name:"validation.boolean",title:"Validacao de boolean",description:"Exemplo de validacao de booleano sem parse implicito.",input:{active:r.Validation.boolean().description("Indica se o registro esta ativo.")},output:{active:r.Validation.boolean().description("Booleano validado.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationBoolean",null),h([se({name:"validation.array",title:"Validacao de array",description:"Exemplo de validacao de array com limites e item tipado.",input:{tags:r.Validation.array(r.Validation.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:r.Validation.number().description("Quantidade de tags recebidas.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationArray",null),h([se({name:"validation.object",title:"Validacao de object",description:"Exemplo de validacao de objeto simples.",input:{profile:r.Validation.object({name:r.Validation.string().min(2).max(60).description("Nome do perfil."),age:r.Validation.number().min(0).max(120).description("Idade do perfil."),nickname:r.Validation.string().empty().max(30).description("Apelido opcional do perfil.")}).description("Objeto de perfil.")},output:{summary:r.Validation.object({name:r.Validation.string().description("Nome validado."),adult:r.Validation.boolean().description("Indica se a idade e maior ou igual a 18.")}).description("Resumo do perfil.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationObject",null),h([se({name:"validation.enum",title:"Validacao de enum",description:"Exemplo de validacao de lista fechada de valores.",input:{status:r.Validation.enum(["draft","active","archived"]).description("Status permitido.")},output:{status:r.Validation.string().description("Status validado.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationEnum",null),h([se({name:"validation.date",title:"Validacao de date",description:"Exemplo de validacao e parse de data.",input:{date:r.Validation.date().parse().description("Data em formato aceito pelo Date.")},output:{iso:r.Validation.string().description("Data em ISO string."),timestamp:r.Validation.number().description("Data em timestamp Unix em milissegundos.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationDate",null),h([se({name:"validation.optional",title:"Validacao de campo opcional",description:"Exemplo de campo opcional aceitando ausencia.",input:{name:r.Validation.string().min(2).description("Nome obrigatorio."),nickname:r.Validation.string().empty().max(30).description("Apelido opcional.")},output:{name:r.Validation.string().description("Nome validado."),hasNickname:r.Validation.boolean().description("Indica se apelido foi enviado."),nickname:r.Validation.string().empty().description("Apelido validado quando enviado.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationOptional",null),h([se({name:"validation.defaults",title:"Validacao de valores padrao",description:"Exemplo de campos opcionais com valores padrao.",input:{name:r.Validation.string().default("guest").description("Nome opcional com valor padrao."),limit:r.Validation.number().parse().default(10).min(1).max(100).description("Limite opcional com valor padrao.")},output:{name:r.Validation.string().description("Nome final."),limit:r.Validation.number().description("Limite final.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationDefaults",null),h([se({name:"validation.parse",title:"Validacao com parse",description:"Exemplo de parse de boolean e number antes da validacao final.",input:{active:r.Validation.boolean().parse().default(!1).description("Booleano aceitando valores parseaveis."),amount:r.Validation.number().parse().min(1).max(1e3).description("Numero aceitando string numerica.")},output:{active:r.Validation.boolean().description("Booleano parseado."),amount:r.Validation.number().description("Numero parseado.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationParse",null),h([se({name:"validation.nested",title:"Validacao de objeto aninhado",description:"Exemplo de objeto aninhado com array interno.",input:{payload:r.Validation.object({user:r.Validation.object({id:r.Validation.string().min(3).max(30).description("Identificador do usuario."),email:r.Validation.string().email().description("Email do usuario.")}).description("Usuario do payload."),scores:r.Validation.array(r.Validation.number().min(0).max(100).description("Pontuacao individual.")).min(1).max(3).description("Pontuacoes do usuario.")}).description("Payload aninhado.")},output:{userId:r.Validation.string().description("Identificador validado."),scoreCount:r.Validation.number().description("Quantidade de pontuacoes.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationNested",null),exports.TestController=h([t.Controller("/test")],exports.TestController),exports.UsersController=class UsersController extends ModelController{constructor(){super(...arguments),this.model=exports.UserModel,this.userService=new exports.UserService}password(e,r,o){return m(this,void 0,void 0,function*(){if(yield this.userService.createPassword(o,r,e))return e.success("OK");throw new t.HttpNotFoundError})}add(e){return m(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return m(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}rows(e){return m(this,void 0,void 0,function*(){yield this.countAll({ctx:e})})}del(e,r,o){return m(this,void 0,void 0,function*(){if(o.id==r)throw new t.HttpForbiddenError;yield this.delete({ctx:e})})}get(e){return m(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return m(this,void 0,void 0,function*(){yield this.update({ctx:e})})}},h([t.Post("/:id/password"),I(),_(),t.ValidateBody(e=>({password:e.string().min(5)})),y(0,t.Ctx()),y(1,t.Body("password")),y(2,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String,String]),v("design:returntype",Promise)],exports.UsersController.prototype,"password",null),h([t.Post(),I(),w(),t.ValidateBody(e=>({name:e.string(),email:e.string().email(),username:e.string().min(3),notes:e.string().default(""),status:e.enum(Object.values(exports.UserStatus)).default(exports.UserStatus.ACTIVE)})),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"add",null),h([t.Get(),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"all",null),h([t.Get("/count"),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"rows",null),h([t.Delete("/:id"),I(),O(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,k()),v("design:type",Function),v("design:paramtypes",[t.Context,String,exports.UserModel]),v("design:returntype",Promise)],exports.UsersController.prototype,"del",null),h([t.Get("/:id"),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"get",null),h([t.Put("/:id"),I(),_(),t.ValidateBody(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(exports.UserStatus)).optional()})),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=h([t.Controller("/users")],exports.UsersController),exports.UsersGroupsController=class UsersGroupsController extends ModelController{constructor(){super(...arguments),this.model=exports.GroupModel,this.permissions=[]}add(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(r),yield this.addGroups(e,t,r),e.success("OK")})}all(e,t){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{include:[{association:"users_groups",required:!0,attributes:[],where:{user_id:t}}]}})})}del(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(r),yield exports.UserGroupModel.destroy(Object.assign({where:{user_id:t,group_id:{[i.Op.in]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(r);const o=yield this.addGroups(e,t,r);yield exports.UserGroupModel.destroy(Object.assign({where:{user_id:t,group_id:{[i.Op.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addGroups(e,t,o){return m(this,void 0,void 0,function*(){const i=[];return yield r.forEachAsync(o,r=>m(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.UserGroupModel.findOrCreate(Object.assign({where:{user_id:t,group_id:r},defaults:{user_id:t,group_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];s&&i.push(r)})),i})}ensureGroups(e){return m(this,void 0,void 0,function*(){var o;if(e.length!=r.uniqueArray(e).length)throw new t.HttpValidationError("Duplicate group id");if((null!==(o=yield exports.GroupModel.count({where:{id:{[i.Op.in]:e}}}).catch(this.error))&&void 0!==o?o:0)!=e.length)throw new t.HttpValidationError("Invalid group id")})}ensureUser(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Post("/:id/groups"),I(),w(),_("users"),t.ValidateBody(e=>({groups:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("groups")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"add",null),h([t.Get("/:id/groups"),I(),T(),_("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),h([t.Delete("/:id/groups"),I(),O(),_("users"),t.ValidateBody(e=>({groups:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("groups")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"del",null),h([t.Put("/:id/groups"),I(),_(),_("users"),t.ValidateBody(e=>({groups:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("groups")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=h([t.Controller("/users")],exports.UsersGroupsController),exports.UsersKeysController=class UsersKeysController extends ModelController{constructor(){super(...arguments),this.model=exports.UserKeyModel,this.permissions=["admin","audit","create","read","update","delete"]}add(e,t,r,o){return m(this,void 0,void 0,function*(){e.json(yield o.authService.createApiKey(e,r.name,r.expires_at,t))})}add_admin(e,r,o,i){return m(this,void 0,void 0,function*(){const s=yield exports.UserModel.findOne({attributes:["id"],where:{id:r}}).catch(this.error);if(!s)throw new t.HttpNotFoundError;e.json(yield i.authService.createApiKey(e,o.name,o.expires_at,s))})}revoke(e,r,o,i){return m(this,void 0,void 0,function*(){if(!(yield i.authService.revokeApiKey(e,r,o)))throw new t.HttpNotFoundError;e.success("OK")})}revoke_admin(e,r,o,i){return m(this,void 0,void 0,function*(){const s=yield exports.UserModel.findOne({attributes:["id"],where:{id:r}}).catch(this.error);if(!s||!(yield i.authService.revokeApiKey(e,o,s)))throw new t.HttpNotFoundError;e.success("OK")})}del(e,r,o,i){return m(this,void 0,void 0,function*(){if(!(yield i.authService.deleteApiKey(e,r,o)))throw new t.HttpNotFoundError;e.success("OK")})}del_admin(e,r,o,i){return m(this,void 0,void 0,function*(){const s=yield exports.UserModel.findOne({attributes:["id"],where:{id:r}}).catch(this.error);if(!s||!(yield i.authService.deleteApiKey(e,o,s)))throw new t.HttpNotFoundError;e.success("OK")})}all(e,t){return m(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t.id}}]}})})}get(e,t){return m(this,void 0,void 0,function*(){yield this.findOne({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t.id}}]}})})}all_admin(e,t){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t}}]}})})}get_admin(e,t){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findOne({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t}}]}})})}ensureUser(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Post("/keys"),I(),w(),t.ValidateBody(e=>({name:e.string(),expires_at:e.date().min(()=>new Date).empty()})),y(0,t.Ctx()),y(1,k()),y(2,t.Body()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel,Object,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"add",null),h([t.Post("/:id/keys"),I(),w(),b("users.keys.admin"),t.ValidateBody(e=>({name:e.string(),expires_at:e.date().min(()=>new Date).empty()})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Object,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"add_admin",null),h([t.Post("/keys/:id/revoke"),I(),_(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,k()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,exports.UserModel,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"revoke",null),h([t.Post("/:id/keys/:key/revoke"),I(),_(),b("users.keys.admin"),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Params("key")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"revoke_admin",null),h([t.Delete("/keys/:id"),I(),O(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,k()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,exports.UserModel,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"del",null),h([t.Delete("/:id/keys/:key"),I(),O(),b("users.keys.admin"),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Params("key")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"del_admin",null),h([t.Get("/keys"),I(),T(),y(0,t.Ctx()),y(1,k()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"all",null),h([t.Get("/keys/:id"),I(),T(),y(0,t.Ctx()),y(1,k()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"get",null),h([t.Get("/:id/keys"),I(),T(),b("users.keys.admin"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"all_admin",null),h([t.Get("/:user/keys/:id"),I(),T(),b("users.keys.admin"),y(0,t.Ctx()),y(1,t.Params("user")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"get_admin",null),exports.UsersKeysController=h([t.Controller("/users")],exports.UsersKeysController),exports.UsersTenantsController=class UsersTenantsController extends ModelController{constructor(){super(...arguments),this.model=exports.TenantModel,this.permissions=[]}add(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(r),yield this.addTenants(e,t,r),e.success("OK")})}all(e,t){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{include:[{association:"users_tenants",required:!0,attributes:[],where:{user_id:t}}]}})})}del(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(r),yield exports.UserTenantModel.destroy(Object.assign({where:{user_id:t,tenant_id:{[i.Op.in]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(r);const o=yield this.addTenants(e,t,r);yield exports.UserTenantModel.destroy(Object.assign({where:{user_id:t,tenant_id:{[i.Op.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addTenants(e,t,o){return m(this,void 0,void 0,function*(){const i=[];return yield r.forEachAsync(o,r=>m(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.UserTenantModel.findOrCreate(Object.assign({where:{user_id:t,tenant_id:r},defaults:{user_id:t,tenant_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];s&&i.push(r)})),i})}ensureTenants(e){return m(this,void 0,void 0,function*(){var o;if(e.length!=r.uniqueArray(e).length)throw new t.HttpValidationError("Duplicate tenant id");if((null!==(o=yield exports.TenantModel.count({where:{id:{[i.Op.in]:e}}}).catch(this.error))&&void 0!==o?o:0)!=e.length)throw new t.HttpValidationError("Invalid tenant id")})}ensureUser(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Post("/:id/tenants"),I(),w(),_("users"),t.ValidateBody(e=>({tenants:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("tenants")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersTenantsController.prototype,"add",null),h([t.Get("/:id/tenants"),I(),T(),_("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersTenantsController.prototype,"all",null),h([t.Delete("/:id/tenants"),I(),O(),_("users"),t.ValidateBody(e=>({tenants:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("tenants")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersTenantsController.prototype,"del",null),h([t.Put("/:id/tenants"),I(),_(),_("users"),t.ValidateBody(e=>({tenants:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("tenants")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersTenantsController.prototype,"set",null),exports.UsersTenantsController=h([t.Controller("/users")],exports.UsersTenantsController),exports.Application=Application,exports.Audit=ce,exports.CanCreate=w,exports.CanDelete=O,exports.CanRead=T,exports.CanUpdate=_,exports.Config=class Config extends Loggable{static all(e){return m(this,void 0,void 0,function*(){var t;const r=null!==(t=yield exports.ConfigModel.findAll({attributes:["key","value"],where:(null==e?void 0:e.length)?{key:{[i.Op.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[];return Object.fromEntries(r.map(e=>[e.key,e.value]))})}static del(e){return m(this,void 0,void 0,function*(){return((yield exports.ConfigModel.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return m(this,arguments,void 0,function*(e,t=""){const[r]=(yield exports.ConfigModel.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return r?r.value:t})}static set(e,t){return m(this,void 0,void 0,function*(){const[r,o]=(yield exports.ConfigModel.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];r&&!o&&(yield r.update({value:t}).catch(this.error))})}},exports.CrudController=CrudController,exports.Env=Env,exports.HasGroups=(...e)=>(o,i,s)=>{t.Use(o=>m(void 0,void 0,void 0,function*(){const{groups:i=[]}=o.req;if(r.includesArray(e,i))return o.next();throw new t.HttpUnauthorizedError("Access denied")}))(o,i,s)},exports.HasPermissions=b,exports.HasScope=R,exports.IsAuthenticated=I,exports.Log=Log,exports.Loggable=Loggable,exports.MCP_DEFAULT_PROTOCOL_VERSION=W,exports.MCP_HTTP_ALLOW=X,exports.MCP_HTTP_ALLOWED_METHODS=J,exports.MCP_HTTP_DEFAULT_ALLOWED_HEADERS=Q,exports.MCP_PROTOCOL_VERSION_HEADER=$,exports.MCP_SESSION_ID_HEADER=Y,exports.MCP_SUPPORTED_PROTOCOL_VERSIONS=z,exports.MCP_TOOL_METADATA=ee,exports.McpError=McpError,exports.McpErrorCode=B,exports.McpHttpHandler=McpHttpHandler,exports.McpInternalError=class McpInternalError extends McpError{constructor(e="Internal error",t){super(e,B.InternalError,200,t)}},exports.McpInvalidParamsError=McpInvalidParamsError,exports.McpInvalidRequestError=McpInvalidRequestError,exports.McpInvalidSessionError=McpInvalidSessionError,exports.McpMethodNotFoundError=McpMethodNotFoundError,exports.McpParseError=McpParseError,exports.McpServerError=McpServerError,exports.McpSessionStore=McpSessionStore,exports.McpTool=se,exports.McpToolNotFoundError=McpToolNotFoundError,exports.McpToolRegistry=McpToolRegistry,exports.ModelController=ModelController,exports.ModelService=ModelService,exports.RegisterWorker=ge,exports.ReqAccess=U,exports.ReqGroup=D,exports.ReqGroups=j,exports.ReqPermission=H,exports.ReqPermissions=V,exports.ReqTenant=N,exports.ReqTenants=F,exports.ReqUser=k,exports.Secret=class Secret extends Loggable{static all(e){return m(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.SecretModel.findAll({attributes:["key"],where:(null==e?void 0:e.length)?{key:{[i.Op.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}static del(e){return m(this,void 0,void 0,function*(){return((yield exports.SecretModel.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return m(this,arguments,void 0,function*(e,t=""){var r;this.init();const o=this.encryptor.encrypt(t),[i]=(yield exports.SecretModel.findOrCreate({where:{key:e},defaults:{key:e,hash:o}}).catch(this.error))||[];return i&&null!==(r=this.encryptor.decrypt(i.hash))&&void 0!==r?r:t})}static set(e,t){return m(this,void 0,void 0,function*(){this.init();const r=this.encryptor.encrypt(t),[o,i]=(yield exports.SecretModel.findOrCreate({where:{key:e},defaults:{key:e,hash:r}}).catch(this.error))||[];o&&!i&&(yield o.update({hash:r}).catch(this.error))})}static init(){this.encryptor||(this.encryptor=new s.Encryptor(Env.ENCRYPTION_SECRET))}},exports.SessionStore=SessionStore,exports.WorkerRegistry=WorkerRegistry,exports.assertValidMcpToolDefinition=te,exports.canFactory=P,exports.discoverMcpTools=oe,exports.getMcpToolMetadata=re,exports.isJsonParseError=Z,exports.isJsonRpcId=L,exports.jsonParseErrorResponse=e=>{if(Z(e))return{status:400,body:q(null,new McpParseError("Parse error",{message:e.message}))}},exports.jsonRpcError=q,exports.jsonRpcErrorFromCode=(e,t,r,o)=>({jsonrpc:"2.0",id:e,error:Object.assign({code:t,message:r},void 0!==o?{data:o}:{})}),exports.jsonRpcResult=G,exports.parseJsonRpcRequest=K,exports.sequelize=x;
7
+ "use strict";var e,t=require("@andrewcaires/express"),r=require("@andrewcaires/utils.js"),o=require("ws"),i=require("@andrewcaires/sequelize"),s=require("@andrewcaires/node"),n=require("dotenv"),d=require("@andrewcaires/decorator"),a=require("express-session"),l=require("jsonwebtoken"),p=require("node:crypto"),u=require("@node-rs/argon2"),c=require("node:fs"),g=require("node:path");function h(e,t,r,o){var i,s=arguments.length,n=s<3?t:null===o?o=Object.getOwnPropertyDescriptor(t,r):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(e,t,r,o);else for(var d=e.length-1;d>=0;d--)(i=e[d])&&(n=(s<3?i(n):s>3?i(t,r,n):i(t,r))||n);return s>3&&n&&Object.defineProperty(t,r,n),n}function y(e,t){return function(r,o){t(r,o,e)}}function v(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function m(e,t,r,o){return new(r||(r=Promise))(function(i,s){function n(e){try{a(o.next(e))}catch(e){s(e)}}function d(e){try{a(o.throw(e))}catch(e){s(e)}}function a(e){var t;e.done?i(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(n,d)}a((o=o.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError,n.config({quiet:!0});class Env extends s.Env{}e=Env,Env.AUDIT_IGNORE=e.getString("AUDIT_IGNORE","hash,password").split(","),Env.BASE_NAME=e.getString("BASE_NAME",""),Env.CONSOLE_ERROR=e.getBool("CONSOLE_ERROR",!1),Env.DATABASE_URI=e.getString("DATABASE_URI","",!0),Env.DATABASE_LOG=e.getBool("DATABASE_LOG",!1),Env.DATABASE_AUDIT=e.getBool("DATABASE_AUDIT",!0),Env.DATABASE_PREFIX=e.getString("DATABASE_PREFIX",""),Env.DATABASE_TIMEZONE=e.getString("DATABASE_TIMEZONE","+00:00"),Env.ENCRYPTION_SECRET=e.getString("ENCRYPTION_SECRET",""),Env.HTTP_CROSS=e.getString("HTTP_CROSS",""),Env.HTTP_HYBRID=e.getBool("HTTP_HYBRID",!1),Env.HTTP_NOTFOUND=e.getString("HTTP_NOTFOUND",""),Env.HTTP_PATH=e.getString("HTTP_PATH","/api"),Env.HTTP_PORT=e.getInt("HTTP_PORT",e.getInt("PORT",3e3)),Env.HTTP_PUBLIC=e.getString("HTTP_PUBLIC",""),Env.HTTP_REDIRECT=e.getString("HTTP_REDIRECT",""),Env.HTTP_TLS_CA=e.getFile("HTTP_TLS_CA"),Env.HTTP_TLS_CRT=e.getFile("HTTP_TLS_CRT"),Env.HTTP_TLS_KEY=e.getFile("HTTP_TLS_KEY"),Env.MODEL_LIMIT=e.getInt("MODEL_LIMIT",10),Env.MODEL_LIMIT_MAX=e.getInt("MODEL_LIMIT_MAX",100),Env.MCP_SESSION_TTL=e.getMs("MCP_SESSION_TTL","30m"),Env.PASSWORD_ALGORITHM=e.getInt("PASSWORD_ALGORITHM",2),Env.PASSWORD_MEMORY_COST=e.getInt("PASSWORD_MEMORY_COST",4096),Env.PASSWORD_PARALLELISM=e.getInt("PASSWORD_PARALLELISM",1),Env.PASSWORD_PEPPER=e.getString("PASSWORD_PEPPER",""),Env.PASSWORD_REUSE=e.getBool("PASSWORD_REUSE",!0),Env.PASSWORD_TIME_COST=e.getInt("PASSWORD_TIME_COST",3),Env.SLEEP_AUTH=e.getMs("SLEEP_AUTH","2s"),Env.SLEEP_FORGOT=e.getMs("SLEEP_FORGOT","5s"),Env.SLEEP_REGISTRY=e.getMs("SLEEP_REGISTRY","5s"),Env.TENANT_HEADER=e.getString("TENANT_HEADER","X-Tenant-ID").toLowerCase(),Env.TOKEN_COOKIE=e.getString("TOKEN_COOKIE",e.getString("TOKEN_HEADER","authorization")).toLowerCase(),Env.TOKEN_COOKIE_SET=e.getBool("TOKEN_COOKIE_SET",!0),Env.TOKEN_HEADER=e.getString("TOKEN_HEADER","authorization"),Env.TOKEN_PEPPER=e.getString("TOKEN_PEPPER",""),Env.TOKEN_PREFIX=e.getString("TOKEN_PREFIX","api"),Env.TOKEN_QUERY=e.getString("TOKEN_QUERY","api_key"),Env.TOKEN_SECRET=e.getString("TOKEN_SECRET",""),Env.TOKEN_TTL=e.getMs("TOKEN_TTL","1d"),Env.TOKEN_TTL_FORGOT=e.getMs("TOKEN_TTL_FORGOT","1d"),Env.TOKEN_TTL_RENEW=e.getMs("TOKEN_TTL_RENEW","1d"),Env.TOKEN_TYPE=e.getString("TOKEN_TYPE","bearer"),Env.API_BODYPARSER_STRICT=e.getBool("API_BODYPARSER_STRICT",!0),Env.API_BODYPARSER_INFLATE=e.getBool("API_BODYPARSER_INFLATE",!0),Env.API_BODYPARSER_LIMIT=e.getString("API_BODYPARSER_LIMIT","10mb"),Env.API_BODYPARSER_TYPE=e.getString("API_BODYPARSER_TYPE","json"),Env.API_SESSION_NAME=e.getString("API_SESSION_NAME","session.id"),Env.API_SESSION_LIFETIME=e.getMs("API_SESSION_LIFETIME","1d"),Env.API_SESSION_SECRET=e.getString("API_SESSION_SECRET","yoursecret"),Env.API_WEBSOCKET_START=e.getBool("API_WEBSOCKET_START",!1);const x=new i.Sequelize({uri:Env.DATABASE_URI,logging:Env.DATABASE_LOG,prefix:Env.DATABASE_PREFIX,timezone:Env.DATABASE_TIMEZONE});var C,E,f,S,M,A;exports.AuditTypes=void 0,(C=exports.AuditTypes||(exports.AuditTypes={})).CREATE="CREATE",C.DELETE="DELETE",C.UPDATE="UPDATE",exports.GroupTypes=void 0,(E=exports.GroupTypes||(exports.GroupTypes={})).SYSTEM="system",E.TENANT="tenant",exports.LogLevels=void 0,(f=exports.LogLevels||(exports.LogLevels={})).INFO="info",f.WARN="warn",f.ERROR="error",exports.PageTypes=void 0,(S=exports.PageTypes||(exports.PageTypes={})).PAGE="page",S.GROUP="group",S.DIVIDER="divider",S.HIDDEN="hidden",S.EXTERNAL="external",exports.TenantStatus=void 0,(M=exports.TenantStatus||(exports.TenantStatus={})).ACTIVE="active",M.PENDING="pending",M.SUSPENDED="suspended",M.DISABLED="disabled",M.ARCHIVED="archived",exports.UserStatus=void 0,(A=exports.UserStatus||(exports.UserStatus={})).ACTIVE="active",A.PENDING="pending",A.DISABLED="disabled",A.LOCKED="locked",A.ARCHIVED="archived";const P=e=>o=>(i,s,n)=>{t.Use(i=>m(void 0,void 0,void 0,function*(){var s;const n=r.isUndefined(o)?r.isFunction(i.controller.name)?i.controller.name():null===(s=i.controller.constructor)||void 0===s?void 0:s.name:o,{permissions:d=[]}=i.req;if(!d.includes(r.slugify(`${n}.${e}`,".")))throw new t.HttpUnauthorizedError("Access denied");i.next()}))(i,s,n)},w=P("create"),O=P("delete"),T=P("read"),_=P("update"),b=(...e)=>(o,i,s)=>{t.Use(o=>m(void 0,void 0,void 0,function*(){const{permissions:i=[]}=o.req;if(r.includesArray(e,i))return o.next();throw new t.HttpUnauthorizedError("Access denied")}))(o,i,s)},R=e=>(o,i,s)=>{t.Use(o=>m(void 0,void 0,void 0,function*(){var i;const s=r.isFunction(o.controller.name)?o.controller.name():null===(i=o.controller.constructor)||void 0===i?void 0:i.name,{permissions:n=[]}=o.req;if(n.includes(`${s}.${e}`))return o.next();throw new t.HttpUnauthorizedError("Access denied")}))(o,i,s)},I=()=>(e,r,o)=>{t.Use(e=>m(void 0,void 0,void 0,function*(){if(e.req.access&&e.req.user)return e.next();const{authService:t}=e.app;yield t.apiAuth(e),e.next()}))(e,r,o)},U=t.parameterFactory(({ctx:e})=>{var t;return null===(t=e.req)||void 0===t?void 0:t.access}),D=t.parameterFactory(({ctx:e,key:t})=>{var r,o;return(null!==(o=null===(r=e.req)||void 0===r?void 0:r.groups)&&void 0!==o?o:[]).includes(t)}),j=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.groups)&&void 0!==r?r:[]}),H=t.parameterFactory(({ctx:e,key:t})=>{var r,o;return(null!==(o=null===(r=e.req)||void 0===r?void 0:r.permissions)&&void 0!==o?o:[]).includes(t)}),V=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.permissions)&&void 0!==r?r:[]}),N=t.parameterFactory(({ctx:e})=>{var t;return null!==(t=e.getHeader(Env.TENANT_HEADER))&&void 0!==t?t:null}),F=t.parameterFactory(({ctx:e})=>{var t,r;return null!==(r=null===(t=e.req)||void 0===t?void 0:t.tenants)&&void 0!==r?r:[]}),k=t.parameterFactory(({ctx:e,key:t})=>{var r;return t&&e.req.user&&t in e.req.user?e.req.user[t]:null===(r=e.req)||void 0===r?void 0:r.user}),B={ParseError:-32700,InvalidRequest:-32600,MethodNotFound:-32601,InvalidParams:-32602,InternalError:-32603,ServerError:-32e3,InvalidSession:-32001};class McpError extends t.HttpError{constructor(e,t=B.ServerError,r=200,o){super(e,r),this.code=t,this.data=o,this.name=this.constructor.name}}class McpParseError extends McpError{constructor(e="Parse error",t){super(e,B.ParseError,400,t)}}class McpInvalidRequestError extends McpError{constructor(e="Invalid Request",t){super(e,B.InvalidRequest,400,t)}}class McpMethodNotFoundError extends McpError{constructor(e){super(`Method not found: ${e}`,B.MethodNotFound,200)}}class McpInvalidParamsError extends McpError{constructor(e="Invalid params",t){super(e,B.InvalidParams,200,t)}}class McpServerError extends McpError{constructor(e="Server error",t){super(e,B.ServerError,500,t)}}class McpInvalidSessionError extends McpError{constructor(e="Invalid MCP session",t=404){super(e,B.InvalidSession,t)}}class McpToolNotFoundError extends McpError{constructor(e){super("Tool not found",B.InvalidParams,200,{toolName:e})}}const L=e=>r.isString(e)||r.isNumber(e),G=(e,t)=>({jsonrpc:"2.0",id:e,result:t}),q=(e,t)=>({jsonrpc:"2.0",id:e,error:Object.assign({code:t.code,message:t.message},void 0!==t.data?{data:t.data}:{})}),K=e=>{if(!r.isPlainObject(e))throw new McpInvalidRequestError("Invalid Request");if("2.0"!==e.jsonrpc)throw new McpInvalidRequestError("Invalid JSON-RPC version");if(!r.isString(e.method))throw new McpInvalidRequestError("Invalid method");if(void 0!==e.id&&!L(e.id))throw new McpInvalidRequestError("Invalid id");return e},z=["2025-11-25","2025-06-18"],W=z[0],$="MCP-Protocol-Version",Y="MCP-Session-Id",J=["POST","DELETE","OPTIONS"],Q=J.join(", "),X=["Content-Type","Accept",Y,$],Z=e=>{if(!(e instanceof SyntaxError))return!1;const t=e;return"entity.parse.failed"===t.type||400===t.status||400===t.statusCode};class McpHttpHandler{constructor(e){var t,r,o;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!==(r=e.serverVersion)&&void 0!==r?r:"1.0.0",this.allowedHeaders=this.normalizeAllowedHeaders(e.allowedHeaders).join(", "),this.allowedOrigins=(null===(o=e.allowedOrigins)||void 0===o?void 0:o.length)?e.allowedOrigins:["*"]}post(e){return m(this,void 0,void 0,function*(){var t;let r=null;try{const o=K(this.getBody(e));if(r=null!==(t=o.id)&&void 0!==t?t:null,"initialize"===o.method)return this.withTransportHeaders(this.initialize(o.id,o.params,e),e);if("notifications/initialized"===o.method)return this.withTransportHeaders(this.initialized(o.id,o.params,e),e);if("ping"===o.method)return this.validateObjectParams(o.params),this.withTransportHeaders(this.withSession(o.id,e,e=>({status:200,body:G(e,{})})),e);if("tools/list"===o.method)return this.validateObjectParams(o.params),this.withTransportHeaders(this.withInitializedSession(o.id,e,e=>({status:200,body:G(e,{tools:this.tools.list()})})),e);if("tools/call"===o.method)return this.withTransportHeaders(yield this.callTool(o.id,o.params,e),e);if(void 0===o.id)return this.withTransportHeaders({status:202},e);throw new McpMethodNotFoundError(o.method)}catch(t){return this.withTransportHeaders(this.errorResponse(r,t),e)}})}delete(e){const t=this.getHeader(e,Y);if(!t)return this.withTransportHeaders(this.errorResponse(null,new McpInvalidSessionError(`${Y} 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,r){const o=this.requireRequestId({jsonrpc:"2.0",id:e,method:"initialize",params:t}),i=this.negotiateProtocolVersion(t),s=this.sessions.create(i);return Object.assign(s,this.getAuthContext(r)),{status:200,headers:{[Y]:s.sessionId,[$]:s.protocolVersion},body:G(o,{protocolVersion:s.protocolVersion,capabilities:{tools:{listChanged:!1}},serverInfo:{name:this.serverName,version:this.serverVersion}})}}initialized(e,t,r){if(void 0!==e)throw new McpInvalidRequestError("notifications/initialized must not include id");this.validateObjectParams(t);const o=this.requireSession(r);return this.sessions.markInitialized(o.sessionId),{status:202}}callTool(e,t,r){return m(this,void 0,void 0,function*(){return this.withInitializedSession(e,r,(e,r)=>m(this,void 0,void 0,function*(){var o;const i=this.parseToolCallParams(t),s=Date.now();let n,d=!1;try{const t=yield this.tools.call(i.name,i.arguments,r);return d=!t.isError,n=t.isError?"Tool execution failed":void 0,{status:200,body:G(e,t)}}catch(e){if(e instanceof McpError)throw n=e.message,e;throw n="Internal error",e}finally{null===(o=this.logger)||void 0===o||o.toolCall(Object.assign({sessionId:r.sessionId,toolName:i.name,durationMs:Date.now()-s,success:d},n?{error:n}:{}))}}))})}requireRequestId(e){if(!L(e.id))throw new McpInvalidRequestError("Request id is required");return e.id}withSession(e,t,r){const o=this.requireRequestId({jsonrpc:"2.0",id:e,method:"session"}),i=this.requireSession(t),s=this.getHeader(t,$);if(s&&s!==i.protocolVersion)throw new McpInvalidRequestError(`${$} does not match the initialized session`);return r(o,i)}withInitializedSession(e,t,r){return this.withSession(e,t,(e,t)=>{if(!t.initialized)throw new McpInvalidRequestError("Session not initialized");return r(e,t)})}requireSession(e){const t=this.getHeader(e,Y);if(!t)throw new McpInvalidSessionError(`${Y} header is required`,400);return this.sessions.require(t)}negotiateProtocolVersion(e){if(!r.isPlainObject(e)||!r.isString(e.protocolVersion))throw new McpInvalidParamsError("params.protocolVersion is required");return z.includes(e.protocolVersion)?e.protocolVersion:W}parseToolCallParams(e){if(!r.isPlainObject(e)||!r.isString(e.name))throw new McpInvalidParamsError("params.name is required");return{name:e.name,arguments:e.arguments}}validateObjectParams(e){if(void 0!==e&&!r.isPlainObject(e))throw new McpInvalidParamsError("params must be an object")}withTransportHeaders(e,t){var r;const o=this.getAllowedOrigin(t);return Object.assign(Object.assign({},e),{headers:Object.assign(Object.assign(Object.assign(Object.assign({Allow:Q},o?{"Access-Control-Allow-Origin":o}:{}),o&&"*"!==o?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":Q,"Access-Control-Allow-Headers":this.allowedHeaders}),null!==(r=e.headers)&&void 0!==r?r:{})})}errorResponse(e,t){if(t instanceof McpError)return{status:t.status,body:q(e,t)};const r=new McpServerError;return{status:r.status,body:q(e,r)}}getBody(e){return"function"==typeof e.getBody?e.getBody():e.body}getHeader(e,t){var r,o,i;const s=null!==(r=e.req)&&void 0!==r?r:e.request,n=this.getHeaderFromRequest(s,t);if(n)return n;const d=this.getHeaderFromRecord(e.headers,t);if(d)return d;if("function"==typeof e.getHeaders){const r=this.getHeaderFromRecord(e.getHeaders(),t);if(r)return r}return"function"==typeof e.getHeader&&null!==(i=null!==(o=e.getHeader(t))&&void 0!==o?o:e.getHeader(t.toLowerCase()))&&void 0!==i?i:""}getHeaderFromRequest(e,t){if(!e||"object"!=typeof e)return"";const r=e;if("function"==typeof r.get){const e=this.normalizeHeaderValue(r.get(t));if(e)return e}if("function"==typeof r.header){const e=this.normalizeHeaderValue(r.header(t));if(e)return e}return this.getHeaderFromRecord(r.headers,t)}getHeaderFromRecord(e,t){if(!e)return"";const r=t.toLowerCase(),o=Object.keys(e).find(e=>e.toLowerCase()===r),i=o?e[o]:void 0;return this.normalizeHeaderValue(i)}normalizeHeaderValue(e){var t,r,o;return Array.isArray(e)?null!==(r=null===(t=e[0])||void 0===t?void 0:t.toString())&&void 0!==r?r:"":null!==(o=null==e?void 0:e.toString())&&void 0!==o?o:""}normalizeAllowedHeaders(e=[]){const t=["Content-Type","Accept",...e.map(e=>e.toLowerCase()),Y,$];return t.filter((e,r)=>Boolean(e)&&t.findIndex(t=>t.toLowerCase()===e.toLowerCase())===r)}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,r,o;const i=null!==(r=null!==(t=e.req)&&void 0!==t?t:e.context)&&void 0!==r?r:{},s=i.user,n="string"==typeof i.userId?i.userId:null===(o=null==s?void 0:s.id)||void 0===o?void 0:o.toString();return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},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}:{}),n?{userId:n}:{})}}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(),o={sessionId:r.uuidv7(),createdAt:t,expiresAt:t+this.ttl,protocolVersion:e,initialized:!1};return this.sessions.set(o.sessionId,o),o}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,r]of this.sessions)r.expiresAt<=e&&this.sessions.delete(t)}size(){return this.cleanup(),this.sessions.size}isExpired(e){return e.expiresAt<=this.now()}}const ee=Symbol.for("@andrewcaires/api:mcp:tool"),te=e=>{if(!r.isString(e.name)||!e.name.trim())throw new Error("MCP tool name is required");if(!r.isString(e.title)||!e.title.trim())throw new Error(`MCP tool "${e.name}" title is required`);if(!r.isString(e.description)||!e.description.trim())throw new Error(`MCP tool "${e.name}" description is required`);if(r.isUndefined(e.input))throw new Error(`MCP tool "${e.name}" input must be declared`)},re=e=>{const t=d.metadata(ee,e,[]);return t.length||"function"==typeof e?t:d.metadata(ee,Object.getPrototypeOf(e),[])},oe=e=>{const t=[];for(const r of e)for(const e of re(r))t.push(ie(r,e));return t},ie=(e,t)=>{const o=e[t.propertyKey];if(!r.isFunction(o))throw new Error(`MCP tool "${t.name}" handler was not found`);return te(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)=>o.call(e,t,r)})};class McpToolRegistry{constructor(e=[]){this.tools=new Map,e.forEach(e=>this.register(e))}register(e){var t,r;if(te(e),this.tools.has(e.name))throw new Error(`Duplicate MCP tool name: ${e.name}`);const o=this.normalizeMcpValidation(null!==(t=e.input)&&void 0!==t?t:{},"object"),i=e.output?this.normalizeMcpValidation(null!==(r=e.output)&&void 0!==r?r:{},"any"):void 0;this.tools.set(e.name,{inputSchema:this.normalizeSchema(o.schema),inputValidation:o.validation,outputSchema:(null==i?void 0:i.schema)?this.normalizeSchema(i.schema):void 0,outputValidation:null==i?void 0:i.validation,tool:e})}list(){return Array.from(this.tools.values()).map(({tool:e})=>{var t,r,o,i;return Object.assign({name:e.name,title:e.title,description:e.description,inputSchema:null!==(r=null===(t=this.tools.get(e.name))||void 0===t?void 0:t.inputSchema)&&void 0!==r?r:{}},(null===(o=this.tools.get(e.name))||void 0===o?void 0:o.outputSchema)?{outputSchema:null===(i=this.tools.get(e.name))||void 0===i?void 0:i.outputSchema}:{})})}call(e,t,o){return m(this,void 0,void 0,function*(){var i;const s=this.tools.get(e);if(!s)throw new McpToolNotFoundError(e);const n=null!=t?t:{};if(!r.isPlainObject(n))return this.toolInputValidationError(["arguments must be an object"]);const d=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({session:o},o.access?{access:o.access}:{}),o.groups?{groups:o.groups}:{}),o.permissions?{permissions:o.permissions}:{}),o.tenants?{tenants:o.tenants}:{}),o.user?{user:o.user}:{}),o.userId?{userId:o.userId}:{});let a=n;const l=this.validateAdditionalProperties(s.inputSchema,n);if(l.length)return this.toolInputValidationError(l);if(s.inputValidation){const e=s.inputValidation.validate(n,d);if(e.error)return this.toolInputValidationError([e.error]);a=null!==(i=e.value)&&void 0!==i?i:{}}try{const e=yield s.tool.run(a,d);if(!s.outputValidation&&this.isCallToolResult(e))return e;let t=e;if(s.outputValidation){const r=s.outputValidation.validate(e,d);if(r.error)return this.outputValidationError();t=r.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.isPlainObject(e)&&r.isArray(e.content)}normalizeMcpValidation(e,t="object"){if(r.isValidationShape(e)){const t=r.Validation.object(e).parse();return{schema:t.toSchema(),validation:t}}const o="object"===t?r.Validation.object({}).parse():r.Validation.any();return{schema:o.toSchema(),validation:o}}normalizeSchema(e){if(r.isArray(e))return e.map(e=>this.normalizeSchema(e));if(!r.isPlainObject(e))return e;const t=Object.fromEntries(Object.entries(e).map(([e,t])=>[e,this.normalizeSchema(t)]));if(r.isArray(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.isPlainObject(e.properties))return[];const o=Object.keys(e.properties);return Object.keys(t).filter(e=>!o.includes(e)).map(e=>`additional property "${e}" is not allowed`)}}const se=e=>(te(e),(t,r)=>{d.isClassMethodDecoratorContext(r)?r.addInitializer(function(){ne(this.constructor,r.name,e)}):ne(t,r,e)}),ne=(e,t,r)=>{const o=d.metadata(ee,e,[]),i=Object.assign(Object.assign({},r),{propertyKey:t});o.some(e=>e.propertyKey===i.propertyKey&&e.name===i.name)||o.push(i)},de=(e,r,o)=>{var i,s,n,d,a,l,p,u,c,g,h;const y=o.ctx instanceof t.Context?o.ctx:null,v=null!==(i=null==y?void 0:y.id)&&void 0!==i?i:null,m=null!==(a=null!==(d=null===(n=null===(s=null==y?void 0:y.req)||void 0===s?void 0:s.user)||void 0===n?void 0:n.id)&&void 0!==d?d:o.user_id)&&void 0!==a?a:null,x={type:e,model:null!==(l=null==r?void 0:r.getTableName())&&void 0!==l?l:null,source:null!==(p=Env.BASE_NAME)&&void 0!==p?p:"",request_id:v,user_id:m};return y?Object.assign(Object.assign({},x),{full_url:null!==(u=y.getUrl())&&void 0!==u?u:"",ip_address:null!==(c=y.getIp())&&void 0!==c?c:"",user_agent:null!==(h=null===(g=y.req)||void 0===g?void 0:g.headers["user-agent"])&&void 0!==h?h:""}):x},ae=e=>{const t=r.getConstructor(e),o=t.primaryKeyAttribute;return{model:t,record_id:o?e.getDataValue(o):null}},le=(e,t)=>m(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:r,record_id:o}=ae(e),i=Object.entries(e.toJSON()),n=Object.fromEntries(i.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield exports.AuditModel.create(Object.assign(Object.assign({},de(exports.AuditTypes.CREATE,r,t)),{record:o,currently:n})).catch(s.Log.catch)}),pe=(e,t)=>m(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:r,record_id:o}=ae(e),i={},n={},d=e.changed();d&&d.length&&d.filter(e=>!Env.AUDIT_IGNORE.includes(e)).forEach(t=>{i[t]=e.getDataValue(t),n[t]=e.previous(t)}),yield exports.AuditModel.create(Object.assign(Object.assign({},de(exports.AuditTypes.UPDATE,r,t)),{record:o,currently:i,previously:n})).catch(s.Log.catch)}),ue=(e,t)=>m(void 0,void 0,void 0,function*(){if(t.withoutAudit)return;const{model:r,record_id:o}=ae(e),i=Object.entries(e.toJSON()),n=Object.fromEntries(i.filter(([e])=>!Env.AUDIT_IGNORE.includes(e)));yield exports.AuditModel.create(Object.assign(Object.assign({},de(exports.AuditTypes.DELETE,r,t)),{record:o,currently:n})).catch(s.Log.catch)}),ce=e=>(r.isUndefined(e)&&(e=Env.DATABASE_AUDIT),i.Hooks(e?{afterCreate:le,afterUpdate:pe,afterDestroy:ue}:{}));class WorkerRegistry{static register(e,t){const r=WorkerRegistry.normalizeWorkerName(e);if(!r)throw new Error("Worker name is required.");if(WorkerRegistry.workers.has(r))throw new Error(`Worker "${r}" is already registered.`);WorkerRegistry.workers.set(r,{name:r,handler:t})}static registerClass(e,t){WorkerRegistry.register(e,()=>m(this,void 0,void 0,function*(){const e=new t;yield e.handler()}))}static registerMethod(e,t,o){const i=r.isFunction(t),s=t.constructor;WorkerRegistry.register(e,()=>m(this,void 0,void 0,function*(){const e=i?t:new s,n=e[o];if(!r.isFunction(n))throw new Error(`Worker method "${String(o)}" is not callable.`);yield n.call(e)}))}static start(e){return m(this,void 0,void 0,function*(){const t=WorkerRegistry.get(e);yield t.handler()})}static list(){const e=new Set(WorkerRegistry.workers.values());return Array.from(e).map(e=>{var{handler:t}=e,r=function(e,t){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var i=0;for(o=Object.getOwnPropertySymbols(e);i<o.length;i++)t.indexOf(o[i])<0&&Object.prototype.propertyIsEnumerable.call(e,o[i])&&(r[o[i]]=e[o[i]])}return r}(e,["handler"]);return Object.assign({},r)})}static names(){return WorkerRegistry.list().map(({name:e})=>e).sort()}static get(e){var t;const r=WorkerRegistry.normalizeStartName(e),o=null!==(t=WorkerRegistry.workers.get(r))&&void 0!==t?t:Array.from(WorkerRegistry.workers.values()).find(e=>WorkerRegistry.normalizeStartName(e.name)===r);if(!o)throw new Error(`Worker "${e}" not found. Available workers: ${WorkerRegistry.names().join(", ")}`);return o}static normalizeStartName(e){return r.slugify(e,"-")}static normalizeWorkerName(e){return e.trim()}}WorkerRegistry.workers=new Map;const ge=e=>(t,o,i)=>{if(void 0===o)WorkerRegistry.registerClass(e,t);else{if(!r.isFunction(null==i?void 0:i.value))throw new Error(`Worker method "${String(o)}" is not callable.`);WorkerRegistry.registerMethod(e,t,o)}};exports.RegisterModel=class RegisterModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.RegisterModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.RegisterModel.prototype,"hash",void 0),h([i.Column.FullDate(),v("design:type",Number)],exports.RegisterModel.prototype,"expired_at",void 0),h([i.Column.Boolean(),v("design:type",Boolean)],exports.RegisterModel.prototype,"active",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.RegisterModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.RegisterModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.RegisterModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.RegisterModel.prototype,"user_id",void 0),exports.RegisterModel=h([i.Database(x),i.ModelName("register"),i.Version("5.6.0")],exports.RegisterModel),exports.UserAuthModel=class UserAuthModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserAuthModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"hash",void 0),h([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"ip_address",void 0),h([i.Column.String(),v("design:type",String)],exports.UserAuthModel.prototype,"user_agent",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.UserAuthModel.prototype,"revoked_at",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserAuthModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserAuthModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.UserAuthModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserAuthModel.prototype,"user_id",void 0),exports.UserAuthModel=h([i.Database(x),i.ModelName("users_auth"),i.Version("5.6.0")],exports.UserAuthModel),exports.PageModel=class PageModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.PageModel.prototype,"id",void 0),h([i.Column.Enum(exports.PageTypes),i.DefaultValue(exports.PageTypes.PAGE),v("design:type",String)],exports.PageModel.prototype,"type",void 0),h([i.Column.String(),v("design:type",String)],exports.PageModel.prototype,"name",void 0),h([i.Column.Text(),v("design:type",String)],exports.PageModel.prototype,"description",void 0),h([i.Column.String(),v("design:type",String)],exports.PageModel.prototype,"icon",void 0),h([i.Column.String(),v("design:type",String)],exports.PageModel.prototype,"path",void 0),h([i.Column.Timestamp(),v("design:type",Number)],exports.PageModel.prototype,"position",void 0),h([i.Column.Boolean(),v("design:type",Boolean)],exports.PageModel.prototype,"active",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.PageModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.PageModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.PageModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.PageModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.PageModel),v("design:type",String)],exports.PageModel.prototype,"page_id",void 0),h([i.Association.HasMany(()=>exports.PageModel),v("design:type",Array)],exports.PageModel.prototype,"pages",void 0),h([i.Association.BelongsTo(()=>exports.PermissionModel),v("design:type",String)],exports.PageModel.prototype,"permission_id",void 0),exports.PageModel=h([i.Database(x),i.ModelName("page"),ce(),i.Version("5.6.0")],exports.PageModel),exports.PermissionModel=class PermissionModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.PermissionModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.PermissionModel.prototype,"name",void 0),h([i.Column.String(),v("design:type",String)],exports.PermissionModel.prototype,"permission",void 0),h([i.Column.Text(),i.DefaultValue(""),v("design:type",String)],exports.PermissionModel.prototype,"description",void 0),h([i.Column.Boolean(),i.DefaultValue(!0),v("design:type",Boolean)],exports.PermissionModel.prototype,"active",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.PermissionModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.PermissionModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.PermissionModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.PermissionModel.prototype,"deleted_at",void 0),h([i.Association.HasMany(()=>exports.RolePermissionModel),v("design:type",Array)],exports.PermissionModel.prototype,"roles_permissions",void 0),h([i.Association.HasMany(()=>exports.PageModel),v("design:type",Array)],exports.PermissionModel.prototype,"pages",void 0),exports.PermissionModel=h([i.Database(x),i.ModelName("permission"),ce(),i.Version("5.6.0")],exports.PermissionModel),exports.RolePermissionModel=class RolePermissionModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.RolePermissionModel.prototype,"id",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.RolePermissionModel.prototype,"created_at",void 0),h([i.Association.BelongsTo(()=>exports.PermissionModel),v("design:type",String)],exports.RolePermissionModel.prototype,"permission_id",void 0),h([i.Association.BelongsTo(()=>exports.RoleModel),v("design:type",String)],exports.RolePermissionModel.prototype,"role_id",void 0),exports.RolePermissionModel=h([i.Database(x),i.ModelName("roles_permission"),ce(),i.Version("5.6.0")],exports.RolePermissionModel),exports.RoleModel=class RoleModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.RoleModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.RoleModel.prototype,"name",void 0),h([i.Column.String(),v("design:type",String)],exports.RoleModel.prototype,"role",void 0),h([i.Column.Text(),v("design:type",String)],exports.RoleModel.prototype,"description",void 0),h([i.Column.Boolean(),v("design:type",Boolean)],exports.RoleModel.prototype,"active",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.RoleModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.RoleModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.RoleModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.RoleModel.prototype,"deleted_at",void 0),h([i.Association.HasMany(()=>exports.GroupRoleModel),v("design:type",Array)],exports.RoleModel.prototype,"groups_roles",void 0),h([i.Association.HasMany(()=>exports.RolePermissionModel),v("design:type",Array)],exports.RoleModel.prototype,"roles_permissions",void 0),exports.RoleModel=h([i.Database(x),i.ModelName("role"),ce(),i.Version("5.6.0")],exports.RoleModel),exports.GroupRoleModel=class GroupRoleModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.GroupRoleModel.prototype,"id",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.GroupRoleModel.prototype,"created_at",void 0),h([i.Association.BelongsTo(()=>exports.GroupModel),v("design:type",String)],exports.GroupRoleModel.prototype,"group_id",void 0),h([i.Association.BelongsTo(()=>exports.RoleModel),v("design:type",String)],exports.GroupRoleModel.prototype,"role_id",void 0),exports.GroupRoleModel=h([i.Database(x),i.ModelName("groups_roles"),ce(),i.Version("5.6.0")],exports.GroupRoleModel),exports.GroupModel=class GroupModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.GroupModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"name",void 0),h([i.Column.String(),v("design:type",String)],exports.GroupModel.prototype,"group",void 0),h([i.Column.Text(),v("design:type",String)],exports.GroupModel.prototype,"description",void 0),h([i.Column.Enum(exports.GroupTypes),i.DefaultValue(exports.GroupTypes.SYSTEM),v("design:type",String)],exports.GroupModel.prototype,"type",void 0),h([i.Column.Boolean(),v("design:type",Boolean)],exports.GroupModel.prototype,"active",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.GroupModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.GroupModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.GroupModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.GroupModel.prototype,"deleted_at",void 0),h([i.Association.HasMany(()=>exports.UserGroupModel),v("design:type",Array)],exports.GroupModel.prototype,"users_groups",void 0),h([i.Association.HasMany(()=>exports.GroupRoleModel),v("design:type",Array)],exports.GroupModel.prototype,"groups_roles",void 0),exports.GroupModel=h([i.Database(x),i.ModelName("group"),ce(),i.Version("5.6.0")],exports.GroupModel),exports.UserTenantModel=class UserTenantModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserTenantModel.prototype,"id",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserTenantModel.prototype,"created_at",void 0),h([i.Association.BelongsTo(()=>exports.TenantModel),v("design:type",String)],exports.UserTenantModel.prototype,"tenant_id",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserTenantModel.prototype,"user_id",void 0),exports.UserTenantModel=h([i.Database(x),i.ModelName("users_tenants"),ce(),i.Version("5.6.0")],exports.UserTenantModel),exports.TenantModel=class TenantModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.TenantModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.TenantModel.prototype,"name",void 0),h([i.Column.Text(),v("design:type",String)],exports.TenantModel.prototype,"description",void 0),h([i.Column.Enum(exports.TenantStatus),i.DefaultValue(exports.TenantStatus.ACTIVE),v("design:type",String)],exports.TenantModel.prototype,"status",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.TenantModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.TenantModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.TenantModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.TenantModel.prototype,"deleted_at",void 0),h([i.Association.HasMany(()=>exports.UserTenantModel),v("design:type",Array)],exports.TenantModel.prototype,"users_tenants",void 0),exports.TenantModel=h([i.Database(x),i.ModelName("tenant"),ce(),i.Version("5.6.0")],exports.TenantModel),exports.UserGroupModel=class UserGroupModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserGroupModel.prototype,"id",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserGroupModel.prototype,"created_at",void 0),h([i.Association.BelongsTo(()=>exports.GroupModel),v("design:type",String)],exports.UserGroupModel.prototype,"group_id",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserGroupModel.prototype,"user_id",void 0),h([i.Association.BelongsTo(()=>exports.TenantModel),v("design:type",String)],exports.UserGroupModel.prototype,"tenant_id",void 0),exports.UserGroupModel=h([i.Database(x),i.ModelName("users_groups"),ce(),i.Version("5.6.0")],exports.UserGroupModel),exports.UserPasswordModel=class UserPasswordModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserPasswordModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.UserPasswordModel.prototype,"hash",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.UserPasswordModel.prototype,"revoked_at",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserPasswordModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserPasswordModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.UserPasswordModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserPasswordModel.prototype,"user_id",void 0),exports.UserPasswordModel=h([i.Database(x),i.ModelName("users_password"),ce(),i.Version("5.6.0")],exports.UserPasswordModel),exports.UserModel=class UserModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"name",void 0),h([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"username",void 0),h([i.Column.String(),v("design:type",String)],exports.UserModel.prototype,"email",void 0),h([i.Column.Text(),v("design:type",String)],exports.UserModel.prototype,"notes",void 0),h([i.Column.Enum(exports.UserStatus),i.DefaultValue(exports.UserStatus.ACTIVE),v("design:type",String)],exports.UserModel.prototype,"status",void 0),h([i.Column.Json(),i.DefaultValue(()=>({})),v("design:type",Object)],exports.UserModel.prototype,"metadata",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.UserModel.prototype,"deleted_at",void 0),h([i.Association.HasMany(()=>exports.AuditModel),v("design:type",Array)],exports.UserModel.prototype,"audits",void 0),h([i.Association.HasMany(()=>exports.UserAuthModel),v("design:type",Array)],exports.UserModel.prototype,"users_auths",void 0),h([i.Association.HasMany(()=>exports.RegisterModel),v("design:type",Array)],exports.UserModel.prototype,"registers",void 0),h([i.Association.HasMany(()=>exports.UserGroupModel),v("design:type",Array)],exports.UserModel.prototype,"users_groups",void 0),h([i.Association.HasMany(()=>exports.UserPasswordModel),v("design:type",Array)],exports.UserModel.prototype,"users_passwords",void 0),h([i.Association.HasMany(()=>exports.UserTenantModel),v("design:type",Array)],exports.UserModel.prototype,"users_tenants",void 0),exports.UserModel=h([i.Database(x),i.ModelName("user"),ce(),i.Version("5.6.0")],exports.UserModel),exports.AuditModel=class AuditModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.AuditModel.prototype,"id",void 0),h([i.Column.Enum(exports.AuditTypes),v("design:type",String)],exports.AuditModel.prototype,"type",void 0),h([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"model",void 0),h([i.Column.String(),i.Index(),v("design:type",String)],exports.AuditModel.prototype,"record",void 0),h([i.Column.Json(),v("design:type",Object)],exports.AuditModel.prototype,"currently",void 0),h([i.Column.Json(),v("design:type",Object)],exports.AuditModel.prototype,"previously",void 0),h([i.Column.Char(36),i.Index(),v("design:type",String)],exports.AuditModel.prototype,"request_id",void 0),h([i.Column.Text(),v("design:type",String)],exports.AuditModel.prototype,"full_url",void 0),h([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"ip_address",void 0),h([i.Column.Text(),v("design:type",String)],exports.AuditModel.prototype,"user_agent",void 0),h([i.Column.String(),v("design:type",String)],exports.AuditModel.prototype,"source",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.AuditModel.prototype,"reverted_at",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.AuditModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.AuditModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.AuditModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.AuditModel.prototype,"user_id",void 0),exports.AuditModel=h([i.Database(x),i.ModelName("audit"),i.Version("5.6.0")],exports.AuditModel),exports.ConfigModel=class ConfigModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.ConfigModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.ConfigModel.prototype,"key",void 0),h([i.Column.Text(),v("design:type",String)],exports.ConfigModel.prototype,"value",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.ConfigModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.ConfigModel.prototype,"updated_at",void 0),exports.ConfigModel=h([i.Database(x),i.ModelName("configs"),i.Version("5.6.0")],exports.ConfigModel),exports.ForgotModel=class ForgotModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.ForgotModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.ForgotModel.prototype,"secret",void 0),h([i.Column.FullDate(),v("design:type",Number)],exports.ForgotModel.prototype,"expired_at",void 0),h([i.Column.Boolean(),v("design:type",Boolean)],exports.ForgotModel.prototype,"active",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.ForgotModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.ForgotModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.ForgotModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.ForgotModel.prototype,"user_id",void 0),exports.ForgotModel=h([i.Database(x),i.ModelName("forgot"),i.Version("5.6.0")],exports.ForgotModel),exports.LogModel=class LogModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.LogModel.prototype,"id",void 0),h([i.Column.Enum(exports.LogLevels),i.DefaultValue(exports.LogLevels.INFO),v("design:type",String)],exports.LogModel.prototype,"level",void 0),h([i.Column.Text(),v("design:type",String)],exports.LogModel.prototype,"message",void 0),h([i.Column.String(),v("design:type",String)],exports.LogModel.prototype,"source",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.LogModel.prototype,"created_at",void 0),exports.LogModel=h([i.Database(x),i.ModelName("log"),i.Version("5.6.0")],exports.LogModel),exports.MigrationModel=class MigrationModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.MigrationModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.MigrationModel.prototype,"model",void 0),h([i.Column.String(),v("design:type",String)],exports.MigrationModel.prototype,"version",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.MigrationModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.MigrationModel.prototype,"updated_at",void 0),exports.MigrationModel=h([i.Database(x),i.ModelName("migration"),i.Version("5.6.0")],exports.MigrationModel),exports.SecretModel=class SecretModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.SecretModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.SecretModel.prototype,"key",void 0),h([i.Column.Text(),v("design:type",String)],exports.SecretModel.prototype,"hash",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.SecretModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.SecretModel.prototype,"updated_at",void 0),exports.SecretModel=h([i.Database(x),i.ModelName("secret"),i.Version("5.6.0")],exports.SecretModel),exports.SessionModel=class SessionModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.SessionModel.prototype,"id",void 0),h([i.Column.Json(),v("design:type",Object)],exports.SessionModel.prototype,"data",void 0),h([i.Column.FullDate(),v("design:type",Date)],exports.SessionModel.prototype,"expired_at",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.SessionModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.SessionModel.prototype,"updated_at",void 0),exports.SessionModel=h([i.Database(x),i.ModelName("session"),i.Version("5.6.0")],exports.SessionModel),exports.UserKeyModel=class UserKeyModel extends i.Model{},h([i.Column.Id(7),v("design:type",String)],exports.UserKeyModel.prototype,"id",void 0),h([i.Column.String(),v("design:type",String)],exports.UserKeyModel.prototype,"name",void 0),h([i.Column.String(),v("design:type",String)],exports.UserKeyModel.prototype,"prefix",void 0),h([i.Column.Text(),v("design:type",String)],exports.UserKeyModel.prototype,"hash",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.UserKeyModel.prototype,"last_used_at",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.UserKeyModel.prototype,"expires_at",void 0),h([i.Column.FullDate(),v("design:type",Object)],exports.UserKeyModel.prototype,"revoked_at",void 0),h([i.Column.CreatedAt(),v("design:type",Date)],exports.UserKeyModel.prototype,"created_at",void 0),h([i.Column.UpdatedAt(),v("design:type",Date)],exports.UserKeyModel.prototype,"updated_at",void 0),h([i.Column.DeletedAt(),v("design:type",Object)],exports.UserKeyModel.prototype,"deleted_at",void 0),h([i.Association.BelongsTo(()=>exports.UserModel),v("design:type",String)],exports.UserKeyModel.prototype,"user_id",void 0),exports.UserKeyModel=h([i.Database(x),i.ModelName("users_key"),ce(),i.Version("5.6.0")],exports.UserKeyModel);class Log{static error(e,t,r){return m(this,void 0,void 0,function*(){yield this.writeRaw("error",e,t,r)})}static info(e,t,r){return m(this,void 0,void 0,function*(){yield this.writeRaw("info",e,t,r)})}static warn(e,t,r){return m(this,void 0,void 0,function*(){yield this.writeRaw("warn",e,t,r)})}static writeRaw(e,t,r,o){return m(this,void 0,void 0,function*(){var i;o&&s.Log.console(null!==(i=this.colors[e])&&void 0!==i?i:s.LogColor.White,e,t),x&&(yield exports.LogModel.create({level:e,message:t,source:null!=r?r:""}).catch(s.Log.catch))})}}Log.colors={error:s.LogColor.Red,info:s.LogColor.Cyan,warn:s.LogColor.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 r,o;Log.error(null!==(o=null!==(r=null==t?void 0:t.message)&&void 0!==r?r:t)&&void 0!==o?o:"",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,r,o;const i=null!==(o=null!==(r=null===(t=null==e?void 0:e.constructor)||void 0===t?void 0:t.name)&&void 0!==r?r:null==e?void 0:e.name)&&void 0!==o?o:"null";return Env.BASE_NAME?`${Env.BASE_NAME}.${i}`:i}}class SessionStore extends a.Store{constructor(){super(),this.all=e=>m(this,void 0,void 0,function*(){e=e||r.noop;const t=yield exports.SessionModel.findAll({attributes:["id","expired_at"],where:{expired_at:{[i.Op.gte]:new Date}}}).catch(t=>(e(t),null));t&&e(null,t.map(e=>e.id)),e()}),this.clear=e=>m(this,void 0,void 0,function*(){yield exports.SessionModel.destroy().catch(s.Log.catch),e&&e()}),this.destroy=(e,t)=>m(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{id:e}}).catch(s.Log.catch),t&&t()}),this.expired=()=>m(this,void 0,void 0,function*(){yield exports.SessionModel.destroy({where:{expired_at:{[i.Op.lt]:new Date}}}).catch(s.Log.catch)}),this.get=(e,t)=>m(this,void 0,void 0,function*(){t=t||r.noop;const o=yield exports.SessionModel.findOne({where:{id:e,expired_at:{[i.Op.gte]:new Date}}}).catch(e=>(t(e),null));if(o){if(o.data.cookie){if(new Date(o.data.cookie.expires).getTime()<=Date.now())return yield o.destroy().catch(s.Log.catch),void t(null)}t(null,o.data)}else t(null)}),this.length=e=>m(this,void 0,void 0,function*(){e&&e(null,(yield exports.SessionModel.count().catch(s.Log.catch))||0)}),this.set=(e,t,o)=>m(this,void 0,void 0,function*(){o=o||r.noop;const i=new Date;i.setTime(i.getTime()+Env.API_SESSION_LIFETIME);const[n,d]=(yield exports.SessionModel.findOrCreate({where:{id:e},defaults:{id:e,data:t,expired_at:i}}).catch(s.Log.catch))||[];n?(d||(n.data=t,n.expired_at=i,yield n.save().catch(s.Log.catch)),o()):o()}),setInterval(this.expired,6e4)}}exports.Service=class Service{},exports.Service=h([d.Trait(Loggable)],exports.Service),exports.UserService=class UserService extends exports.Service{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 m(this,void 0,void 0,function*(){var o,i;if(Env.PASSWORD_REUSE)return!0;if(!(null!==(o=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==o?o:0))return!1;const s=null!==(i=yield exports.UserPasswordModel.findAll({attributes:["hash"],where:{user_id:e}}).catch(this.error))&&void 0!==i?i:[];t+=Env.PASSWORD_PEPPER;for(const e of s)if(yield u.verify(e.hash,t).catch(r.noop))return!1;return!0})}checkPassword(e,t){return m(this,void 0,void 0,function*(){var o;if(!(null!==(o=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==o?o:0))return!1;const i=yield exports.UserPasswordModel.findOne({attributes:["hash"],where:{revoked_at:null,user_id:e}}).catch(this.error);return t+=Env.PASSWORD_PEPPER,i&&(yield u.verify(i.hash,t).catch(r.noop))||!1})}createPassword(e,t,r){return m(this,void 0,void 0,function*(){var o;if(!(null!==(o=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==o?o:0))return!1;yield exports.UserPasswordModel.update({revoked_at:new Date},{where:{revoked_at:null,user_id:e}}).catch(this.error);const i=u.hashSync(t+Env.PASSWORD_PEPPER,this.hashOptions);return yield exports.UserPasswordModel.create({hash:i,user_id:e},Object.assign({},{ctx:r})).catch(this.error),!0})}getGroups(e,t){return m(this,void 0,void 0,function*(){var o;return r.uniqueArray((null!==(o=yield exports.GroupModel.findAll({attributes:["group"],where:{active:!0},include:[{association:"users_groups",required:!0,where:Object.assign({user_id:e},t||r.isNull(t)?{tenant_id:t}:{})}]}).catch(this.error))&&void 0!==o?o:[]).map(e=>e.group))})}getPermissions(e,t){return m(this,void 0,void 0,function*(){var o;return r.uniqueArray((null!==(o=yield exports.PermissionModel.findAll({attributes:["permission"],where:{active:!0},include:[{association:"roles_permissions",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],where:{active:!0},include:[{association:"groups_roles",required:!0,attributes:[],include:[{association:"group",required:!0,attributes:[],where:{active:!0},include:[{association:"users_groups",required:!0,attributes:[],where:Object.assign({user_id:e},t||r.isNull(t)?{tenant_id:t}:{})}]}]}]}]}]}).catch(this.error))&&void 0!==o?o:[]).map(e=>e.permission))})}getGroupPermissions(e){return m(this,void 0,void 0,function*(){var t;return r.uniqueArray((null!==(t=yield exports.PermissionModel.findAll({attributes:["permission"],where:{active:!0},include:[{association:"roles_permissions",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],where:{active:!0},include:[{association:"groups_roles",required:!0,attributes:[],where:{group_id:e}}]}]}]}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.permission))})}getTenants(e){return m(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.TenantModel.findAll({attributes:["id","name"],where:{status:exports.TenantStatus.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}))})}},exports.UserService=h([d.Singleton()],exports.UserService),exports.AuthService=class AuthService extends exports.Service{constructor(){super(...arguments),this.options={algorithm:"HS256",expiresIn:`${Env.TOKEN_TTL}ms`},this.userAttributes={exclude:["username","notes","deleted_at"]},this.userService=new exports.UserService}apiAuth(e){return m(this,void 0,void 0,function*(){var r,o;const i=e.getQuery(Env.TOKEN_QUERY),s=e.getCookie(Env.TOKEN_COOKIE),n=e.getHeader(Env.TOKEN_HEADER),[d,a]=null!==(o=null===(r=n||`${Env.TOKEN_TYPE} ${s||i}`)||void 0===r?void 0:r.split(" "))&&void 0!==o?o:["",""];if(!a||d.toLowerCase()!=Env.TOKEN_TYPE)throw new t.HttpUnauthorizedError("Invalid token type");const l=/^sk_([\w]+)_([\w]{6})\./.test(a),{access:p,user:u}=yield l?this.apiKeyAuth(a):this.apiTokenAuth(a),c=e.getHeader("user-agent");if(p instanceof exports.UserAuthModel&&p.user_agent&&p.user_agent!=c)throw new t.HttpUnauthorizedError("Invalid API token");return e.req.access=p,yield this.attachAuthContext(e,u),{access:p,user:u}})}apiKeyAuth(e){return m(this,void 0,void 0,function*(){if(!Env.TOKEN_PEPPER)throw new t.HttpInternalServerError("Authentication service unavailable");if(!e)throw new t.HttpUnauthorizedError("API key missing");const[r]=e.split(".");if(!r)throw new t.HttpUnauthorizedError("Invalid API key");const o=yield exports.UserKeyModel.findOne({where:{prefix:r},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{status:exports.UserStatus.ACTIVE}}]});if(!o||!o.user)throw new t.HttpUnauthorizedError("Invalid API key");if(o.revoked_at)throw new t.HttpUnauthorizedError("API key revoked");if(o.expires_at&&o.expires_at<new Date)throw new t.HttpUnauthorizedError("API key expired");const i=p.createHmac("sha256",Env.TOKEN_PEPPER).update(e).digest("hex");if(!this.safeEqual(i,o.hash))throw new t.HttpUnauthorizedError("Invalid API key");return yield o.update({last_used_at:new Date},Object.assign({},{withoutAudit:!0})).catch(this.error),{access:o,user:o.user}})}apiTokenAuth(e){return m(this,void 0,void 0,function*(){const{id:r,hash:o}=yield this.verifyJwt(e);if(!r||!o)throw new t.HttpUnauthorizedError("Invalid API token");const i=yield exports.UserAuthModel.findOne({attributes:{exclude:["hash"]},where:{hash:o},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:r,status:exports.UserStatus.ACTIVE}}]}).catch(this.error);if(!i||!i.user)throw new t.HttpUnauthorizedError("Invalid API token");if(i.revoked_at)throw new t.HttpUnauthorizedError("API token revoked");return{access:i,user:i.user}})}createApiKey(e,o,i,s){return m(this,void 0,void 0,function*(){if(!Env.TOKEN_PEPPER)throw new t.HttpInternalServerError("Authentication service unavailable");const n=`sk_${Env.TOKEN_PREFIX}_${r.uniqueID(6)}`,d=`${n}.${r.createApiKey()}`,a=p.createHmac("sha256",Env.TOKEN_PEPPER).update(d).digest("hex"),l=yield exports.UserKeyModel.create({name:o,prefix:n,hash:a,expires_at:i,user_id:s.id},Object.assign({},{ctx:e})).catch(this.error);if(!l)throw new t.HttpInternalServerError("API key could not be created");return{id:l.id,key:d}})}createApiToken(e,o){return m(this,void 0,void 0,function*(){var i;if(!Env.TOKEN_SECRET)throw new t.HttpInternalServerError("Authentication service unavailable");const{id:s}=o,n=r.createApiKey(),d=yield exports.UserAuthModel.create({hash:n,user_id:s},Object.assign({},{ctx:e})).catch(this.error);if(!d)throw new t.HttpInternalServerError;const a=l.sign({id:s,hash:n},Env.TOKEN_SECRET,this.options);if(d.user_agent=null!==(i=e.getHeader("user-agent"))&&void 0!==i?i:"",d.ip_address=e.getIp(),!(yield d.save().catch(this.error)))throw new t.HttpInternalServerError("Authentication service unavailable");return{token:a}})}deleteApiKey(e,t,r){return m(this,void 0,void 0,function*(){const o=yield exports.UserKeyModel.findOne({attributes:["id","revoked_at"],where:{id:t,user_id:r.id}}).catch(this.error);return!!o&&(!(!o.revoked_at&&!(yield o.update({revoked_at:new Date},Object.assign({},{ctx:e})).catch(this.error)))&&(yield o.destroy(Object.assign({},{ctx:e})).catch(this.error),!0))})}renewApiToken(e){return m(this,void 0,void 0,function*(){const{id:o,hash:i}=yield this.verifyJwt(e,Env.TOKEN_TTL_RENEW/1e3);if(!o||!i)throw new t.HttpUnauthorizedError("Invalid API token");const s=yield exports.UserAuthModel.findOne({where:{hash:i},include:[{association:"user",required:!0,attributes:this.userAttributes,where:{id:o,status:exports.UserStatus.ACTIVE}}]}).catch(this.error);if(!s||!s.user)throw new t.HttpUnauthorizedError("Invalid API token");if(s.revoked_at)throw new t.HttpUnauthorizedError("API token revoked");if(s.hash=r.createApiKey(),!(yield s.save().catch(this.error)))throw new t.HttpInternalServerError("Authentication service unavailable");return{token:l.sign({id:o,hash:s.hash},Env.TOKEN_SECRET,this.options)}})}revokeApiKey(e,t,r){return m(this,void 0,void 0,function*(){var o;const[i]=null!==(o=yield exports.UserKeyModel.update({revoked_at:new Date},Object.assign({where:{id:t,revoked_at:null,user_id:r.id}},{ctx:e})).catch(this.error))&&void 0!==o?o:[0];return i>0})}attachAuthContext(e,r){return m(this,void 0,void 0,function*(){e.req.user=r;const o=e.getHeader(Env.TENANT_HEADER),i=yield this.userService.getTenants(r.id);if(o&&!i.find(e=>e.id==o))throw new t.HttpUnauthorizedError("Tenant not found or access denied");const[s,n]=yield Promise.all([this.userService.getGroups(r.id,o),this.userService.getPermissions(r.id,o)]);e.req.groups=s,e.req.permissions=n,e.req.tenants=i})}safeEqual(e,t){const r=Buffer.from(e,"hex"),o=Buffer.from(t,"hex");return r.length===o.length&&p.timingSafeEqual(r,o)}verifyJwt(e,r){return m(this,void 0,void 0,function*(){if(!Env.TOKEN_SECRET)throw new t.HttpInternalServerError("Authentication service unavailable");if(!e||e.split(".").length<3)throw new t.HttpUnauthorizedError("Invalid token");try{return l.verify(e,Env.TOKEN_SECRET,{algorithms:["HS256"],clockTolerance:r})}catch(e){throw new t.HttpUnauthorizedError("Invalid token")}})}},exports.AuthService=h([d.Singleton()],exports.AuthService);class ModelService extends exports.Service{constructor(e,t){var r,o;super(),this.attributes=[],this.permissions=[],this.search=[],this.model=e,(null==t?void 0:t.permissions)&&(this.permissions=t.permissions);const i=Object.keys(e.getAttributes());this.attributes=this.filterAttributes(i,null!==(r=null==t?void 0:t.attributes)&&void 0!==r?r:[]),this.search=this.filterAttributes(i,null!==(o=null==t?void 0:t.search)&&void 0!==o?o:this.attributes)}applySelect(e,t,o){if(!t)return;const i=null==e?void 0:e.getQuery(o?`${o}_select`:"select"),s=t.attributes,n=e=>s.includes(e);t.attributes=[],r.isString(i)&&i.length&&t.attributes.push(...i.split(/\s*,\s*/g).filter(n)),t.attributes.length||(t.attributes=s)}applyOrders(e,t){if(!t)return;const o=null==e?void 0:e.getQuery("order"),i=[],s=t.attributes,n=([e])=>s.includes(e),d=e=>e&&["ASC","DESC"].includes(e)?e:"ASC";if(r.isString(o)&&o.length){const e=o.split(/\s*,\s*/g).map(e=>e.split(/\s*:\s*/g));i.push(...e.filter(n).map(([e,t])=>[e,d((null!=t?t:"ASC").toUpperCase())]))}i.length&&(t.order=i)}applyPagination(e,t){if(!t)return;const o=null==e?void 0:e.getQuery("limit"),i=null==e?void 0:e.getQuery("offset");r.isUndefined(t.limit)&&(t.limit=Env.MODEL_LIMIT,r.isString(o)&&(t.limit=parseInt(o)||0),t.limit=r.clamp(t.limit,-1,Env.MODEL_LIMIT_MAX)),t.limit<0&&(t.limit=void 0),r.isString(i)&&(t.offset=parseInt(i)||0,t.offset<0&&(t.offset=void 0))}applySearch(e,t){var o;if(!t)return;const s=null==e?void 0:e.getQuery("search");s&&r.isString(s)&&(t.where=Object.assign(Object.assign({},null!==(o=t.where)&&void 0!==o?o:{}),{[i.Op.or]:this.search.map(e=>({[e]:{[i.Op.substring]:s}}))}))}applyWhere(e,o,s){var n,d;if(!o)return;const a=null==e?void 0:e.getQuery(s?`${s}_where`:"where");if(!r.isString(a))return;const l=o.attributes;try{const e=i.Where.parse(l,null!==(n=JSON.parse(a))&&void 0!==n?n:{});o.where=Object.assign(Object.assign({},null!==(d=o.where)&&void 0!==d?d:{}),null!=e?e:{})}catch(e){if(e instanceof Error)throw new t.HttpValidationError(e.message);throw new t.HttpInternalServerError}}countAll(e){return m(this,void 0,void 0,function*(){var o,i;const{ctx:s,options:n={}}=e,d=r.merge({},n);d.attributes=this.getAttributes(null!==(o=null==d?void 0:d.attributes)&&void 0!==o?o:[]),this.applySearch(s,d),this.applyWhere(s,d),this.applySelect(s,d);const a=null!==(i=yield this.model.count(Object.assign(Object.assign({},d),{distinct:!!d.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error))&&void 0!==i?i:0;return null==s||s.prepare(t.HttpStatusCodeByName.OK,{count:a}),a})}create(e){return m(this,void 0,void 0,function*(){var o,i;const{body:s={},ctx:n,options:d={}}=e,a=r.merge({},d),l=yield this.model.create(Object.assign({},r.merge({},null!==(i=null===(o=null==n?void 0:n.req)||void 0===o?void 0:o.body)&&void 0!==i?i:{},s)),Object.assign(Object.assign({},a),{ctx:n})).catch(this.error);if(!l)throw new t.HttpInternalServerError;const{primaryKeyAttribute:p}=this.model;return null==n||n.prepare(t.HttpStatusCodeByName.OK,{[p]:l.getDataValue(p)}),l})}delete(e){return m(this,void 0,void 0,function*(){var o,s;const{ctx:n,id:d,options:a={}}=e,{primaryKeyAttribute:l}=this.model,p=null!==(o=null==n?void 0:n.getParam(l))&&void 0!==o?o:d;if(r.isUndefined(p))throw new t.HttpBadRequestError;const u=r.merge({},a),c=yield this.model.destroy(Object.assign(Object.assign(Object.assign({},u),{where:{[i.Op.and]:Object.assign({[l]:p},null!==(s=null==u?void 0:u.where)&&void 0!==s?s:{})},individualHooks:!0}),{ctx:n})).catch(this.error);if(!c)throw new t.HttpNotFoundError;return null==n||n.success("OK"),c})}filterAttributes(e,t){if(r.isArray(t))return t.length?t.filter(t=>r.isString(t)&&e.includes(t)):e;const{exclude:o,include:i}=t,s=r.isUndefined(i)?e:i.filter(t=>r.isString(t)&&e.includes(t)),n=null!=o?o:[];return n.length?s.filter(e=>!n.includes(e)):s}findAll(e){return m(this,void 0,void 0,function*(){var o,i;const{ctx:s,callback:n,options:d={},query:a=!0}=e,l=r.merge({},d);l.attributes=this.getAttributes(null!==(o=null==l?void 0:l.attributes)&&void 0!==o?o:[]),a&&this.applySelect(s,l),this.applyOrders(s,l),this.applyPagination(s,l),(null!==(i=null==l?void 0:l.limit)&&void 0!==i?i:0)>Env.MODEL_LIMIT_MAX&&(l.limit=Env.MODEL_LIMIT_MAX),this.applySearch(s,l),a&&this.applyWhere(s,l);const[p,u]=yield Promise.all([this.model.count(Object.assign(Object.assign({},l),{distinct:!!l.include,col:this.attributes.length?this.attributes[0]:void 0})).catch(this.error).then(e=>null!=e?e:0),this.model.findAll(l).catch(this.error).then(e=>null!=e?e:[])]),c={count:p,records:n?yield n(u):u};return null==s||s.prepare(t.HttpStatusCodeByName.OK,c),c})}findOne(e){return m(this,void 0,void 0,function*(){var o,s,n;const{callback:d,ctx:a,id:l,options:p={},query:u=!0}=e,{primaryKeyAttribute:c}=this.model,g=null!==(o=null==a?void 0:a.getParam(c))&&void 0!==o?o:l;if(r.isUndefined(g))throw new t.HttpBadRequestError;const h=r.merge({},p);h.attributes=this.getAttributes(null!==(s=null==h?void 0:h.attributes)&&void 0!==s?s:[]),u&&this.applySelect(a,h);const y=yield this.model.findOne(Object.assign(Object.assign({},h),{where:{[i.Op.and]:Object.assign({[c]:g},null!==(n=null==h?void 0:h.where)&&void 0!==n?n:{})}})).catch(this.error);if(!y)throw new t.HttpNotFoundError;return null==a||a.prepare(t.HttpStatusCodeByName.OK,d?yield d(y):y.toJSON()),y})}getAttributes(e){return this.filterAttributes(this.attributes,e)}include(e,t){var o;const i=r.clone(t),{ctx:s}=null!=t?t:{};return i.attributes=this.filterAttributes(Object.keys(e.getAttributes()),null!==(o=i.attributes)&&void 0!==o?o:[]),this.applySearch(s,i),this.applyWhere(s,i,t.name),this.applySelect(s,i,t.name),Object.assign({model:e},i)}name(){return this.model.tableName}sync(){return m(this,void 0,void 0,function*(){if(!this.permissions.length)return;const e=this.name().toLowerCase(),t=r.upperCamelCase(e.replace(/_/g," ")," ");yield r.forEachAsync(this.permissions,o=>m(this,void 0,void 0,function*(){const i=r.slugify(`${e}.${o}`,".");yield exports.PermissionModel.findOrCreate({where:{permission:i},defaults:{name:`${t} ${r.upperCamelCase(o," ")}`}})}))})}update(e){return m(this,void 0,void 0,function*(){var o,s,n,d;const{ctx:a,body:l,id:p,options:u={}}=e,{primaryKeyAttribute:c}=this.model,g=null!==(o=null==a?void 0:a.getParam(c))&&void 0!==o?o:p;if(r.isUndefined(g))throw new t.HttpBadRequestError;const h=r.merge({},u),y=r.merge({},null!==(n=null===(s=null==a?void 0:a.req)||void 0===s?void 0:s.body)&&void 0!==n?n:{},null!=l?l:{}),v=yield this.model.findOne(Object.assign(Object.assign({},h),{attributes:this.getAttributes([c,...Object.keys(y)]),where:{[i.Op.and]:Object.assign({[c]:g},null!==(d=null==h?void 0:h.where)&&void 0!==d?d:{})}})).catch(this.error);if(!v)throw new t.HttpNotFoundError;return v.set(y),v.changed()?(yield v.save(Object.assign({},{ctx:a})).catch(this.error),null==a||a.success("OK"),!0):(null==a||a.success("Record not changed"),!1)})}}class Application extends t.Application{constructor(e,t){super(e,r.merge({},{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:r.uuidv7},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 m(this,void 0,void 0,function*(){yield this.prepare(),yield e.listen.call(this),Env.API_WEBSOCKET_START&&this.server&&(this._webSocket=new o.WebSocketServer({server:this.server,verifyClient:(e,t)=>t(Env.API_WEBSOCKET_START)}),this._webSocket.on("connection",(e,t)=>m(this,void 0,void 0,function*(){t.url||(t.url=""),e.on("close",()=>{}),yield r.sleep(2e3)})))})}prepare(){return m(this,void 0,void 0,function*(){this._prepared||(yield x.sync(),yield this.migrations(x),yield r.forEachSeries(this.controllers,e=>m(this,void 0,void 0,function*(){r.isFunction(e.sync)&&(yield e.sync(this))})),this.authService=new exports.AuthService,this.userService=new exports.UserService,this._prepared=!0)})}migrations(e){return m(this,void 0,void 0,function*(){const t=[];yield r.forEachSeries(Object.keys(e.models),r=>m(this,void 0,void 0,function*(){var o;const i=e.models[r],s=i.version();if(!s)return;const[n,d]=null!==(o=yield exports.MigrationModel.findOrCreate({where:{model:i.tableName},defaults:{model:i.tableName,version:""}}).catch(this.error))&&void 0!==o?o:[];n&&(d||n.version!=s)&&(n.version=s,yield n.save().catch(this.error),t.push(i))})),yield r.forEachSeries(t,e=>m(this,void 0,void 0,function*(){return yield e.updateAttributes()}))})}websocket(){return this._webSocket}}exports.BaseController=class BaseController extends r.EventEmitter{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 m(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=r.upperCamelCase(e.replace(/_/g," ")," ");yield r.forEachSeries(this.permissions,o=>m(this,void 0,void 0,function*(){const i=r.slugify(`${e}.${o}`,".");yield exports.PermissionModel.findOrCreate({where:{permission:i},defaults:{name:`${t} ${r.upperCamelCase(o," ")}`}})}))})}},exports.BaseController=h([d.Trait(Loggable)],exports.BaseController);class ModelController extends exports.BaseController{constructor(){super(...arguments),this.attributes=[],this.permissions=["audit","create","read","update","delete"],this.search=[]}countAll(e){return m(this,void 0,void 0,function*(){return yield this.service.countAll(e)})}create(e){return m(this,void 0,void 0,function*(){return yield this.service.create(e)})}delete(e){return m(this,void 0,void 0,function*(){return yield this.service.delete(e)})}findAll(e){return m(this,void 0,void 0,function*(){return yield this.service.findAll(e)})}findOne(e){return m(this,void 0,void 0,function*(){return yield this.service.findOne(e)})}include(e,t){return this.service.include(e,t)}sync(){return m(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=r.upperCamelCase(e.replace(/_/g," ")," ");yield r.forEachSeries(this.permissions,o=>m(this,void 0,void 0,function*(){const i=r.slugify(`${e}.${o}`,".");yield exports.PermissionModel.findOrCreate({where:{permission:i},defaults:{name:`${t} ${r.upperCamelCase(o," ")}`}})})),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 m(this,void 0,void 0,function*(){return yield this.service.update(e)})}name(){return this.model.tableName}}exports.AuditsController=class AuditsController extends ModelController{constructor(){super(...arguments),this.model=exports.AuditModel,this.permissions=["read"]}all(e){return m(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["currently","previously"]}}})})}record(e,t){return m(this,void 0,void 0,function*(){yield this.ensurePermission(e,t),yield this.findAll({ctx:e,options:{attributes:{exclude:["currently","previously"]},where:{record:t}}})})}get(e,t,r){return m(this,void 0,void 0,function*(){r||(yield this.ensurePermission(e,t)),yield this.findOne({ctx:e})})}ensurePermission(e,o){return m(this,void 0,void 0,function*(){var i;const s=yield exports.AuditModel.findOne({attributes:["model"],where:{record:o}}).catch(this.error);if(!s)return;const n=r.slugify(`${s.model}.audit`,".");if(!(null===(i=e.req.permissions)||void 0===i?void 0:i.includes(n)))throw new t.HttpUnauthorizedError("Access denied")})}},h([t.Get(),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.AuditsController.prototype,"all",null),h([t.Get("/record/:record"),I(),y(0,t.Ctx()),y(1,t.Params("record")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.AuditsController.prototype,"record",null),h([t.Get("/:id"),I(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,H("audits.read")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Boolean]),v("design:returntype",Promise)],exports.AuditsController.prototype,"get",null),exports.AuditsController=h([t.Controller("/audits")],exports.AuditsController),exports.AuthController=class AuthController extends exports.BaseController{constructor(){super(...arguments),this.authService=new exports.AuthService}login(e,o,s,n,d){return m(this,void 0,void 0,function*(){var a,l;yield r.sleep(Env.SLEEP_AUTH);const p=yield exports.UserPasswordModel.findOne({where:{revoked_at:null},include:[{association:"user",required:!0,where:{status:{[i.Op.in]:[exports.UserStatus.ACTIVE,exports.UserStatus.PENDING]},[i.Op.or]:[{email:o},{username:o}]},include:[{association:"registers",required:!1,where:{active:!0}}]}]}).catch(this.error);if(s+=Env.PASSWORD_PEPPER,!p||!p.user||null===(a=yield u.verify(p.hash,s).catch(r.noop))||void 0===a||!a)throw d.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),new t.HttpUnauthorizedError("Invalid credentials");if(p.user.registers.length)throw d.emit("auth.activation",{ctx:e}),this.emit("auth.activation",{ctx:e}),new t.HttpUnauthorizedError("Activation required");if(p.user.status!==exports.UserStatus.ACTIVE)throw d.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),new t.HttpUnauthorizedError("Invalid credentials");const{token:c}=null!==(l=yield this.authService.createApiToken(e,p.user).catch(t=>{throw d.emit("auth.failure",{ctx:e}),this.emit("auth.failure",{ctx:e}),t}))&&void 0!==l?l:{};Env.TOKEN_COOKIE_SET&&e.setCookie(Env.TOKEN_COOKIE,c,{httpOnly:!0,secure:Env.isProduction(),sameSite:"lax",maxAge:n?Env.TOKEN_TTL:void 0}),e.json({token:c}),d.emit("auth.login",{ctx:e}),this.emit("auth.login",{ctx:e})})}logout(e,r,o){return m(this,void 0,void 0,function*(){if(r instanceof exports.UserKeyModel)throw new t.HttpUnauthorizedError("Access denied");if(r.revoked_at=new Date,!(yield r.save().catch(this.error)))throw new t.HttpInternalServerError("Authentication service unavailable");Env.TOKEN_COOKIE_SET&&e.clearCookie(Env.TOKEN_COOKIE),e.success("OK"),o.emit("auth.logout",{ctx:e}),this.emit("auth.logout",{ctx:e})})}user(e){return m(this,void 0,void 0,function*(){const{groups:r,permissions:o,tenants:i,user:s}=e.req;if(!(r&&o&&i&&s))throw new t.HttpInternalServerError;e.json(Object.assign(Object.assign({},s.toJSON()),{groups:r,permissions:o,tenants:i}))})}renew(e,t,r){return m(this,void 0,void 0,function*(){const{token:o}=yield this.authService.renewApiToken(t);e.json({token:o}),r.emit("auth.renew",{ctx:e}),this.emit("auth.renew",{ctx:e})})}},h([t.Post("/login"),t.ValidateBody(e=>({username:e.string().min(3),password:e.string().min(5),remember:e.boolean().parse().default(!1)})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.Body("password")),y(3,t.Body("remember")),y(4,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Boolean,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"login",null),h([t.Get("/logout"),I(),y(0,t.Ctx()),y(1,U()),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,Object,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"logout",null),h([t.Get("/me"),I(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.AuthController.prototype,"user",null),h([t.Post("/renew"),t.ValidateBody(e=>({token:e.string()})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.AuthController.prototype,"renew",null),exports.AuthController=h([t.Controller("/auth")],exports.AuthController);class CrudController extends ModelController{constructor(){super(...arguments),this._crud={}}CrudArgumentsCountAll(e){return{ctx:e}}CrudArgumentsCreate(e){return{ctx:e}}CrudArgumentsFindAll(e){return{ctx:e}}CrudArgumentsFindOne(e){return{ctx:e}}CrudArgumentsDelete(e){return{ctx:e}}CrudArgumentsUpdate(e){return{ctx:e}}CrudValidateCreate(){return this._crud}CrudValidateUpdate(){return this._crud}add(e){return m(this,void 0,void 0,function*(){yield this.create(this.CrudArgumentsCreate(e))})}all(e){return m(this,void 0,void 0,function*(){yield this.findAll(this.CrudArgumentsFindAll(e))})}rows(e){return m(this,void 0,void 0,function*(){yield this.countAll(this.CrudArgumentsCountAll(e))})}del(e){return m(this,void 0,void 0,function*(){yield this.delete(this.CrudArgumentsDelete(e))})}get(e){return m(this,void 0,void 0,function*(){yield this.findOne(this.CrudArgumentsFindOne(e))})}set(e){return m(this,void 0,void 0,function*(){yield this.update(this.CrudArgumentsUpdate(e))})}validate(e,o){var i,s;const n=r.Validation.object(o).parse().validate(null!==(s=null===(i=e.req)||void 0===i?void 0:i.body)&&void 0!==s?s:{});if(n.error)throw new t.HttpValidationError(n.message||n.error);e.req.body=n.value,e.next()}validateCreate(e){const r=this.CrudValidateCreate();if(r==this._crud)throw new t.HttpInternalServerError;this.validate(e,r)}validateUpdate(e){const r=this.CrudValidateUpdate();if(r==this._crud)throw new t.HttpInternalServerError;this.validate(e,r)}}h([t.Post(),I(),w(),t.Middleware("validateCreate"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"add",null),h([t.Get(),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"all",null),h([t.Get("/count"),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"rows",null),h([t.Delete("/:id"),I(),O(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"del",null),h([t.Get("/:id"),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"get",null),h([t.Put("/:id"),I(),_(),t.Middleware("validateUpdate"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],CrudController.prototype,"set",null),h([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",void 0)],CrudController.prototype,"validateCreate",null),h([y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",void 0)],CrudController.prototype,"validateUpdate",null),exports.FilesController=class FilesController extends exports.BaseController{constructor(){super(...arguments),this.directory=Env.HTTP_PUBLIC||"./",this.permissions=["delete","download","edit","list","read","rename","upload","write"]}files(e){return m(this,void 0,void 0,function*(){let{path:o}=e.req;o=o.replace(/(^\/path(\/)?)|([\\.]{1,2}\/)/g,"");const i=g.join(this.directory,o);if(!c.existsSync(i)||!c.statSync(i).isDirectory())throw new t.HttpNotFoundError;let s;return s=c.readdirSync(i),s=s.map(e=>this.info(g.join(i,e))),s=s.filter(r.isDef),Object.assign(Object.assign({},this.info(i)),{files:s})})}info(e){if(!c.existsSync(e))return null;const t=c.statSync(e),r=e.split("/").pop();e=e.replace(this.directory,"/").replace(/^\/\//,"/");const o=t.isDirectory();return{name:r,path:e.replace(/^\/\//,"/"),size:t.size,extension:o?"":"."+e.split(".").pop(),created:t.birthtime,modified:t.mtime,directory:o,symlink:t.isSymbolicLink()}}name(){return"files"}sync(){return m(this,void 0,void 0,function*(){const e=this.name().toLowerCase(),t=r.upperCamelCase(e.replace(/_/g," ")," ");yield r.forEachSeries(this.permissions,o=>m(this,void 0,void 0,function*(){const i=r.slugify(`${e}.${o}`,".");yield exports.PermissionModel.findOrCreate({where:{permission:i},defaults:{name:`${t} ${r.upperCamelCase(o," ")}`}})}))})}},h([t.Get("/path"),t.Get("/path/*path"),I(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.FilesController.prototype,"files",null),exports.FilesController=h([t.Controller("/files")],exports.FilesController),exports.ForgotController=class ForgotController extends exports.BaseController{check(e,o){return m(this,void 0,void 0,function*(){const i=yield this.find(o);if(!i||!i.user)throw new t.HttpNotFoundError;i.secret=r.uniqueID(),yield i.save(),e.json({token:i.secret})})}forgot(e,o,s){return m(this,void 0,void 0,function*(){yield r.sleep(Env.SLEEP_FORGOT);const n=o,d=yield exports.UserModel.findOne({where:{[i.Op.or]:[{email:n},{username:o}]}}).catch(this.error);if(!d)throw new t.HttpNotFoundError;const a=r.uniqueID(),l=Date.now()+6e4*Env.TOKEN_TTL_FORGOT,p=yield exports.ForgotModel.create({token:a,timestamp:l,active:!0,user_id:d.id});e.success("OK"),s.emit("forgot.send",{ctx:e,forgot:p,user:d}),this.emit("forgot.send",{ctx:e,forgot:p,user:d})})}reset(e,r,o,i){return m(this,void 0,void 0,function*(){const o=yield this.find(r);if(!o)throw new t.HttpNotFoundError;o.active=!1,yield o.save().catch(this.error),yield o.user.save().catch(this.error),e.success("OK"),i.emit("forgot.reset",{ctx:e,user:o.user}),this.emit("forgot.reset",{ctx:e,user:o.user})})}find(e){return m(this,void 0,void 0,function*(){return yield exports.ForgotModel.findOne({where:{token:e,active:!0},include:[{association:"users",required:!0}]}).catch(this.error)})}},h([t.Get("/check"),t.ValidateBody(e=>({token:e.string()})),y(0,t.Ctx()),y(1,t.Body("token")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.ForgotController.prototype,"check",null),h([t.Post(),t.ValidateBody(e=>({username:e.string().min(4)})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.ForgotController.prototype,"forgot",null),h([t.Post("/reset"),t.ValidateBody(e=>({token:e.string(),password:e.string().min(5)})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.Body("password")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.ForgotController.prototype,"reset",null),exports.ForgotController=h([t.Controller("/forgot")],exports.ForgotController),exports.GroupsController=class GroupsController extends CrudController{constructor(){super(...arguments),this.model=exports.GroupModel,this.schemaCreate={name:r.Validation.string(),group:r.Validation.string().slugify("."),description:r.Validation.string().default(""),type:r.Validation.enum(Object.values(exports.GroupTypes)).default(exports.GroupTypes.SYSTEM),active:r.Validation.boolean().parse()},this.schemaUpdate={name:r.Validation.string().optional(),group:r.Validation.string().slugify(".").optional(),description:r.Validation.string().optional(),type:r.Validation.enum(Object.values(exports.GroupTypes)).optional(),active:r.Validation.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return m(this,void 0,void 0,function*(){yield e.sync.call(this),this.userModelService=new ModelService(exports.UserModel)})}users(e,t){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_groups",required:!0,attributes:[],where:{group_id:t}}]}})})}ensureGroup(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.GroupModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Get("/:id/users"),I(),T("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.GroupsController.prototype,"users",null),exports.GroupsController=h([t.Controller("/groups")],exports.GroupsController),exports.GroupsPermissionsController=class GroupsPermissionsController extends exports.BaseController{constructor(){super(...arguments),this.userService=new exports.UserService}all(e,t){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t);const r=yield this.userService.getGroupPermissions(t);e.json({permissions:r})})}ensureGroup(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.GroupModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Get("/:id/permissions"),I(),T("groups"),T("permissions"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.GroupsPermissionsController.prototype,"all",null),exports.GroupsPermissionsController=h([t.Controller("/groups")],exports.GroupsPermissionsController),exports.GroupsRolesController=class GroupsRolesController extends ModelController{constructor(){super(...arguments),this.model=exports.RoleModel,this.permissions=[]}add(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(r),yield this.addRoles(e,t,r),e.success("OK")})}all(e,t){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],where:{group_id:t}}]}})})}del(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(r),yield exports.GroupRoleModel.destroy(Object.assign({where:{group_id:t,role_id:{[i.Op.in]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureGroup(t),yield this.ensureRoles(r);const o=yield this.addRoles(e,t,r);yield exports.GroupRoleModel.destroy(Object.assign({where:{group_id:t,role_id:{[i.Op.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addRoles(e,t,o){return m(this,void 0,void 0,function*(){const i=[];return yield r.forEachAsync(o,r=>m(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.GroupRoleModel.findOrCreate(Object.assign({where:{group_id:t,role_id:r},defaults:{group_id:t,role_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];s&&i.push(r)})),i})}ensureGroup(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.GroupModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}ensureRoles(e){return m(this,void 0,void 0,function*(){var o;if(e.length!=r.uniqueArray(e).length)throw new t.HttpValidationError("Duplicate role id");if((null!==(o=yield exports.RoleModel.count({where:{id:{[i.Op.in]:e}}}).catch(this.error))&&void 0!==o?o:0)!=e.length)throw new t.HttpValidationError("Invalid role id")})}},h([t.Post("/:id/roles"),I(),w(),T("groups"),t.ValidateBody(e=>({roles:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("roles")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.GroupsRolesController.prototype,"add",null),h([t.Get("/:id/roles"),I(),T(),T("groups"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.GroupsRolesController.prototype,"all",null),h([t.Delete("/:id/roles"),I(),O(),T("groups"),t.ValidateBody(e=>({roles:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("roles")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.GroupsRolesController.prototype,"del",null),h([t.Put("/:id/roles"),I(),_(),T("groups"),t.ValidateBody(e=>({roles:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("roles")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.GroupsRolesController.prototype,"set",null),exports.GroupsRolesController=h([t.Controller("/groups")],exports.GroupsRolesController),exports.HealthController=class HealthController{ping(e){return m(this,void 0,void 0,function*(){e.json({status:"ok",timestamp:Date.now(),uptime:process.uptime()})})}},h([t.All("/"),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.HealthController.prototype,"ping",null),exports.HealthController=h([t.Controller("/health")],exports.HealthController),exports.LogsController=class LogsController extends ModelController{constructor(){super(...arguments),this.model=exports.LogModel,this.permissions=["read"]}all(e){return m(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}},h([t.Get(),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.LogsController.prototype,"all",null),exports.LogsController=h([t.Controller("/logs")],exports.LogsController),exports.McpController=class McpController extends exports.BaseController{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=>m(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 m(this,void 0,void 0,function*(){yield t.sync.call(this),this.toolsRegistered||(this.toolsRegistered=!0,e&&(e.instance.use((e,t,r,o)=>{if(!this.isMcpEndpoint(t))return o(e);const i=this.jsonParseErrorResponse(e);if(!i)return o(e);this.setResponseHeaders(r,t),r.status(i.status).json(i.body)}),e.instance.use((e,t,r)=>{if(!this.isMcpEndpoint(e)||!["GET","HEAD"].includes(e.method))return r();t.setHeader("Allow",Q),this.setResponseHeaders(t,e),t.status(405).end()}),oe(e.controllers).forEach(e=>this.tools.register(e))))})}get(e){return m(this,void 0,void 0,function*(){this.respond(e,this.handler.get(e))})}options(e){return m(this,void 0,void 0,function*(){this.respond(e,this.handler.options(e))})}post(e){return m(this,void 0,void 0,function*(){this.respond(e,yield this.handler.post(e))})}delete(e){return m(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:q(null,new McpParseError("Parse error",{message:e.message}))}}respond(e,t){var r;this.setResponseHeaders(e.res,e.req);for(const[o,i]of Object.entries(null!==(r=t.headers)&&void 0!==r?r:{}))e.res.setHeader(o,i);void 0!==t.body?e.res.status(t.status).json(t.body):e.res.status(t.status).end()}setResponseHeaders(e,t,r){const o=this.getAllowedOrigin(t);Object.entries(Object.assign(Object.assign(Object.assign(Object.assign({Allow:Q},o?{"Access-Control-Allow-Origin":o}:{}),o&&"*"!==o?{Vary:"Origin"}:{}),{"Access-Control-Allow-Methods":Q,"Access-Control-Allow-Headers":`Content-Type, Accept, ${Env.TOKEN_HEADER}, ${Y}, ${$}`}),null!=r?r:{})).forEach(([t,r])=>{e.setHeader(t,r)})}getAllowedOrigin(e){if(Env.HTTP_CROSS.split(",").includes("*"))return"*";const t=null==e?void 0:e.headers.origin;if(!t)return;const r=Array.isArray(t)?t[0]:t;return Env.HTTP_CROSS.split(",").includes(r)?r:void 0}},h([t.Get(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.McpController.prototype,"get",null),h([t.Options(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.McpController.prototype,"options",null),h([t.Post(),I(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.McpController.prototype,"post",null),h([t.Delete(),I(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.McpController.prototype,"delete",null),exports.McpController=h([t.Controller("/mcp")],exports.McpController),exports.PagesController=class PagesController extends CrudController{constructor(){super(...arguments),this.model=exports.PageModel,this.schemaCreate={type:r.Validation.enum(Object.values(exports.PageTypes)).optional(),name:r.Validation.string().optional(),description:r.Validation.string().optional(),icon:r.Validation.string().optional(),path:r.Validation.string().optional(),active:r.Validation.boolean().optional(),page_id:r.Validation.string().uuid().empty(),permission_id:r.Validation.string().uuid().empty()},this.schemaUpdate={type:r.Validation.enum(Object.values(exports.PageTypes)).optional(),name:r.Validation.string().optional(),description:r.Validation.string().optional(),icon:r.Validation.string().optional(),path:r.Validation.string().optional(),active:r.Validation.boolean().optional(),page_id:r.Validation.string().uuid().empty(),permission_id:r.Validation.string().uuid().empty()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}position(e,t){return m(this,void 0,void 0,function*(){const o=t.map(({id:e})=>e);yield this.ensurePages(o),yield r.forEachSeries(t,t=>m(this,[t],void 0,function*({id:t,position:r}){yield exports.PageModel.update({position:r},Object.assign({where:{id:t},individualHooks:!0},{ctx:e})).catch(this.error)})),e.success("OK")})}ensurePages(e){return m(this,void 0,void 0,function*(){var o;if(e.length!=r.uniqueArray(e).length)throw new t.HttpValidationError("Duplicate page id");if((null!==(o=yield exports.PageModel.count({where:{id:{[i.Op.in]:e}}}).catch(this.error))&&void 0!==o?o:0)!=e.length)throw new t.HttpValidationError("Invalid page id")})}},h([t.Put("/position"),I(),_(),t.ValidateBody(e=>({pages:e.array(e.object({id:e.string().uuid(),position:e.number().parse()}))})),y(0,t.Ctx()),y(1,t.Body("pages")),v("design:type",Function),v("design:paramtypes",[t.Context,Array]),v("design:returntype",Promise)],exports.PagesController.prototype,"position",null),exports.PagesController=h([t.Controller("/pages")],exports.PagesController),exports.PermissionsController=class PermissionsController extends CrudController{constructor(){super(...arguments),this.model=exports.PermissionModel,this.schemaCreate={name:r.Validation.string(),permission:r.Validation.string().slugify("."),description:r.Validation.string().default(""),active:r.Validation.boolean().parse()},this.schemaUpdate={name:r.Validation.string().optional(),permission:r.Validation.string().slugify(".").optional(),description:r.Validation.string().optional(),active:r.Validation.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return m(this,void 0,void 0,function*(){yield e.sync.call(this),this.groupModelService=new ModelService(exports.GroupModel)})}groups(e,t){return m(this,void 0,void 0,function*(){yield this.ensurePermission(t),yield this.groupModelService.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],include:[{association:"role",required:!0,attributes:[],include:[{association:"roles_permissions",required:!0,attributes:[],where:{permission_id:t}}]}]}]}})})}ensurePermission(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.PermissionModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Get("/:id/groups"),I(),T("groups"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.PermissionsController.prototype,"groups",null),exports.PermissionsController=h([t.Controller("/permissions")],exports.PermissionsController),exports.ProfileController=class ProfileController extends ModelController{constructor(){super(),this.model=exports.UserModel,this.permissions=["avatar","password"],this.path=Env.HTTP_PUBLIC+"/avatar",this.userService=new exports.UserService,Env.HTTP_PUBLIC&&c.existsSync(Env.HTTP_PUBLIC)&&!c.existsSync(this.path)&&c.mkdirSync(this.path)}user(e){return m(this,void 0,void 0,function*(){const{groups:r,permissions:o,tenants:i,user:s}=e.req;if(!(r&&o&&i&&s))throw new t.HttpInternalServerError;e.json(Object.assign(Object.assign({},s.toJSON()),{groups:r,permissions:o,tenants:i}))})}avatar(e,r){return m(this,void 0,void 0,function*(){var o;const i=e.getFiles();if(i.file&&i.file.length){const{filename:s,path:n}=null!==(o=i.file[0])&&void 0!==o?o:{};if(s){const o=yield exports.UserModel.findOne({where:{id:r.id}}).catch(this.error);if(!o)throw c.lstatSync(n).isFile()&&c.rmSync(n),new t.HttpInternalServerError;const i=this.path+"/"+o.metadata.avatar_url;if(c.existsSync(i)&&c.lstatSync(i).isFile()&&c.rmSync(i),o.changed("metadata",!0),o.metadata.avatar_url=s,yield o.save(Object.assign({},{ctx:e})).catch(this.error))return e.success("OK")}}e.success("Record not changed")})}avatar_del(e,t){return m(this,void 0,void 0,function*(){const r=this.path+"/"+t.metadata.avatar_url;if(c.existsSync(r)&&c.lstatSync(r).isFile()&&c.rmSync(r),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,r,o,i){return m(this,void 0,void 0,function*(){if(!(yield this.userService.checkPassword(i.id,r)))throw new t.HttpUnauthorizedError("Invalid password");if(!(yield this.userService.canAssignPassword(i.id,o)))throw new t.HttpConflictError("Password already used");if(yield this.userService.createPassword(i.id,o,e))return e.success("OK");throw new t.HttpInternalServerError})}},h([t.Get(),I(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.ProfileController.prototype,"user",null),h([t.Post("/avatar"),I(),R("avatar"),t.Upload({file:{count:1,path:`${Env.HTTP_PUBLIC}/avatar`,types:["image/bmp","image/jpeg","image/png"],size:32}}),y(0,t.Ctx()),y(1,k()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.ProfileController.prototype,"avatar",null),h([t.Delete("/avatar"),I(),R("avatar"),y(0,t.Ctx()),y(1,k()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.ProfileController.prototype,"avatar_del",null),h([t.Post("/password"),I(),R("password"),t.ValidateBody(e=>({oldPassword:e.string().min(5),newPassword:e.string().min(5)})),y(0,t.Ctx()),y(1,t.Body("oldPassword")),y(2,t.Body("newPassword")),y(3,k()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,exports.UserModel]),v("design:returntype",Promise)],exports.ProfileController.prototype,"password",null),exports.ProfileController=h([t.Controller("/profile"),v("design:paramtypes",[])],exports.ProfileController),exports.RegisterController=class RegisterController extends exports.BaseController{register(e,o,n){return m(this,void 0,void 0,function*(){yield r.sleep(Env.SLEEP_REGISTRY);const{name:d,date:a,email:l,username:p,password:u,confirm:c}=o,g=p||l,h=s.sha256(u);if(yield exports.UserModel.count({where:{[i.Op.or]:[{email:l},{username:g}]}}).catch(this.error))throw new t.HttpBadRequestError("Invalid email or username");if(h!=s.sha256(c))throw new t.HttpBadRequestError("Invalid password");const y=yield exports.UserModel.create({name:d,email:l,username:g,password:h,avatar:"",date:a,description:"",status:exports.UserStatus.PENDING}).catch(this.error);if(!y)throw new t.HttpInternalServerError;const v=yield exports.RegisterModel.create({token:yield this.getId(),active:!0,user_id:y.id}).catch(this.error);if(!v)throw yield y.destroy().catch(this.error),new t.HttpInternalServerError;e.success("OK"),n.emit("register.user",{ctx:e,register:v,user:y}),this.emit("register.user",{ctx:e,register:v,user:y})})}confirm(e,r,o){return m(this,void 0,void 0,function*(){const i=yield exports.RegisterModel.findOne({where:{token:r,active:!0},include:[{association:"users",required:!0}]}).catch(this.error);if(!i)throw new t.HttpNotFoundError;i.active=!1,yield i.save().catch(this.error),i.user.status=exports.UserStatus.ACTIVE,yield i.user.save().catch(this.error),e.success("OK"),o.emit("register.confirm",{ctx:e,register:i,user:i.user}),this.emit("register.confirm",{ctx:e,register:i,user:i.user})})}send(e,r,o){return m(this,void 0,void 0,function*(){const s=r,n=yield exports.RegisterModel.findOne({where:{active:!0},include:[{model:exports.UserModel,required:!0,where:{[i.Op.or]:[{email:s},{username:r}]}}]}).catch(this.error);if(!n)throw new t.HttpNotFoundError;e.success("OK"),o.emit("register.send",{ctx:e,register:n,user:n.user}),this.emit("register.send",{ctx:e,register:n,user:n.user})})}getId(){return m(this,void 0,void 0,function*(){const e=r.uuidv7();return(yield exports.RegisterModel.count({where:{token:e}}))?this.getId():e})}},h([t.Post(),t.ValidateBody(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)})),y(0,t.Ctx()),y(1,t.Body()),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,Object,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"register",null),h([t.Post("/confirm"),t.ValidateBody(e=>({token:e.string()})),y(0,t.Ctx()),y(1,t.Body("token")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"confirm",null),h([t.Post("/send"),t.ValidateBody(e=>({username:e.string().min(4)})),y(0,t.Ctx()),y(1,t.Body("username")),y(2,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Application]),v("design:returntype",Promise)],exports.RegisterController.prototype,"send",null),exports.RegisterController=h([t.Controller("/register")],exports.RegisterController),exports.RolesController=class RolesController extends CrudController{constructor(){super(...arguments),this.model=exports.RoleModel,this.schemaCreate={name:r.Validation.string(),role:r.Validation.string().slugify("."),description:r.Validation.string().default(""),active:r.Validation.boolean().parse()},this.schemaUpdate={name:r.Validation.string().optional(),role:r.Validation.string().slugify(".").optional(),description:r.Validation.string().optional(),active:r.Validation.boolean().parse().optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return m(this,void 0,void 0,function*(){yield e.sync.call(this),this.groupModelService=new ModelService(exports.GroupModel)})}groups(e,t){return m(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.groupModelService.findAll({ctx:e,options:{include:[{association:"groups_roles",required:!0,attributes:[],where:{role_id:t}}]}})})}ensureRole(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.RoleModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Get("/:id/groups"),I(),T("groups"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.RolesController.prototype,"groups",null),exports.RolesController=h([t.Controller("/roles")],exports.RolesController),exports.RolesPermissionsController=class RolesPermissionsController extends ModelController{constructor(){super(...arguments),this.model=exports.PermissionModel,this.permissions=[]}add(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(r),yield this.addPermissions(e,t,r),e.success("OK")})}all(e,t){return m(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.findAll({ctx:e,options:{include:[{association:"roles_permissions",required:!0,attributes:[],where:{role_id:t}}]}})})}del(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(r),yield exports.RolePermissionModel.destroy(Object.assign({where:{role_id:t,permission_id:{[i.Op.in]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureRole(t),yield this.ensurePermissions(r);const o=yield this.addPermissions(e,t,r);yield exports.RolePermissionModel.destroy(Object.assign({where:{role_id:t,permission_id:{[i.Op.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addPermissions(e,t,o){return m(this,void 0,void 0,function*(){const i=[];return yield r.forEachAsync(o,r=>m(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.RolePermissionModel.findOrCreate(Object.assign({where:{role_id:t,permission_id:r},defaults:{role_id:t,permission_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];s&&i.push(r)})),i})}ensurePermissions(e){return m(this,void 0,void 0,function*(){var o;if(e.length!=r.uniqueArray(e).length)throw new t.HttpValidationError("Duplicate permission id");if((null!==(o=yield exports.PermissionModel.count({where:{id:{[i.Op.in]:e}}}).catch(this.error))&&void 0!==o?o:0)!=e.length)throw new t.HttpValidationError("Invalid permission id")})}ensureRole(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.RoleModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Post("/:id/permissions"),I(),w(),_("roles"),t.ValidateBody(e=>({permissions:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("permissions")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.RolesPermissionsController.prototype,"add",null),h([t.Get("/:id/permissions"),I(),T(),_("roles"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.RolesPermissionsController.prototype,"all",null),h([t.Delete("/:id/permissions"),I(),O(),_("roles"),t.ValidateBody(e=>({permissions:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("permissions")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.RolesPermissionsController.prototype,"del",null),h([t.Put("/:id/permissions"),I(),_(),_("roles"),t.ValidateBody(e=>({permissions:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("permissions")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.RolesPermissionsController.prototype,"set",null),exports.RolesPermissionsController=h([t.Controller("/roles")],exports.RolesPermissionsController),exports.SetupController=class SetupController extends exports.BaseController{constructor(){super(...arguments),this.userService=new exports.UserService}setup(e){return m(this,void 0,void 0,function*(){var o;if(yield exports.UserModel.count())throw new t.HttpNotFoundError("Endpoint not found");const i=yield exports.UserModel.create({name:"Admin",username:"admin",email:"admin@localhost.com",notes:"",status:exports.UserStatus.ACTIVE},Object.assign({},{ctx:e})).catch(this.error);if(!i)throw new t.HttpInternalServerError;yield this.userService.createPassword(i.id,"admin",e);const s=yield exports.GroupModel.create({name:"Admin",group:"admin",description:"",active:!0},Object.assign({},{ctx:e}));yield exports.UserGroupModel.create({user_id:i.id,group_id:s.id},Object.assign({},{ctx:e})),yield exports.GroupModel.create({name:"User",group:"user",description:"",active:!0},Object.assign({},{ctx:e}));const n=yield exports.RoleModel.create({name:"Admin Permissions",role:"admin",description:"",active:!0},Object.assign({},{ctx:e}));if(!n)throw new t.HttpInternalServerError;yield exports.GroupRoleModel.create({group_id:s.id,role_id:n.id},Object.assign({},{ctx:e}));const d=null!==(o=yield exports.PermissionModel.findAll({where:{active:!0}}).catch(this.error))&&void 0!==o?o:[];yield r.forEachSeries(d,t=>m(this,void 0,void 0,function*(){yield exports.RolePermissionModel.create({role_id:n.id,permission_id:t.id},Object.assign({},{ctx:e}))})),e.success("OK")})}},h([t.Get(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.SetupController.prototype,"setup",null),exports.SetupController=h([t.Controller("/setup")],exports.SetupController),exports.TenantsController=class TenantsController extends CrudController{constructor(){super(...arguments),this.model=exports.TenantModel,this.schemaCreate={name:r.Validation.string(),description:r.Validation.string().default(""),status:r.Validation.enum(Object.values(exports.TenantStatus)).default(exports.TenantStatus.ACTIVE)},this.schemaUpdate={name:r.Validation.string().optional(),description:r.Validation.string().optional(),status:r.Validation.enum(Object.values(exports.TenantStatus)).optional()}}CrudValidateCreate(){return this.schemaCreate}CrudValidateUpdate(){return this.schemaUpdate}sync(){const e=Object.create(null,{sync:{get:()=>super.sync}});return m(this,void 0,void 0,function*(){yield e.sync.call(this),this.userModelService=new ModelService(exports.UserModel)})}users(e,t){return m(this,void 0,void 0,function*(){yield this.ensureTenant(t),yield this.userModelService.findAll({ctx:e,options:{include:[{association:"users_tenants",required:!0,attributes:[],where:{tenant_id:t}}]}})})}ensureTenant(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.TenantModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Get("/:id/users"),I(),T("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.TenantsController.prototype,"users",null),exports.TenantsController=h([t.Controller("/tenants")],exports.TenantsController),exports.TestController=class TestController extends exports.BaseController{json(e){return m(this,void 0,void 0,function*(){e.json({ok:!0,message:"hello",timestamp:Date.now()})})}workerSum(){return m(this,void 0,void 0,function*(){return{value:2}})}sum(e,t){return m(this,void 0,void 0,function*(){const{a:t,b:r}=e;return{value:t+r}})}multiply(e,t){return m(this,void 0,void 0,function*(){const{a:t,b:r}=e;return{value:t*r}})}average(e,t){return m(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 m(this,void 0,void 0,function*(){const t=e.text;return{length:t.length,normalized:t.trim()}})}validationNumber(e,t){return m(this,void 0,void 0,function*(){return{doubled:2*e.value}})}validationBoolean(e,t){return m(this,void 0,void 0,function*(){return{active:e.active}})}validationArray(e,t){return m(this,void 0,void 0,function*(){return{count:e.tags.length}})}validationObject(e,t){return m(this,void 0,void 0,function*(){const t=e.profile;return{summary:{name:t.name,adult:t.age>=18}}})}validationEnum(e,t){return m(this,void 0,void 0,function*(){return{status:e.status}})}validationDate(e,t){return m(this,void 0,void 0,function*(){const t=e.date;return{iso:t.toISOString(),timestamp:t.getTime()}})}validationOptional(e,t){return m(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 m(this,void 0,void 0,function*(){return{name:e.name,limit:e.limit}})}validationParse(e,t){return m(this,void 0,void 0,function*(){return{active:e.active,amount:e.amount}})}validationNested(e,t){return m(this,void 0,void 0,function*(){const t=e.payload;return{userId:t.user.id,scoreCount:t.scores.length}})}},h([t.Get(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.TestController.prototype,"json",null),h([ge("test.sum"),v("design:type",Function),v("design:paramtypes",[]),v("design:returntype",Promise)],exports.TestController.prototype,"workerSum",null),h([se({name:"sum",title:"Somar numeros",description:"Soma dois numeros.",input:{a:r.Validation.number().description("valor a"),b:r.Validation.number().description("valor b")},output:{value:r.Validation.number().description("resultado da soma de a + b")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"sum",null),h([se({name:"multiply",title:"Multiplicar numeros",description:"Multiplica dois numeros.",input:{a:r.Validation.number().description("valor a"),b:r.Validation.number().description("valor b")},output:{value:r.Validation.number().description("resultado da multiplicação de a * b")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"multiply",null),h([se({name:"average",title:"Calcular media",description:"Calcula a media de uma lista de numeros.",input:{values:r.Validation.array(r.Validation.number().description("numero usado no calculo da media")).min(1).max(10).description("lista de numeros para calcular a media")},output:{value:r.Validation.number().description("media calculada"),count:r.Validation.number().description("quantidade de numeros usados")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"average",null),h([se({name:"validation.string",title:"Validacao de string",description:"Exemplo de validacao de texto com tamanho minimo e maximo.",input:{text:r.Validation.string().min(5).max(50).description("Texto entre 5 e 50 caracteres.")},output:{length:r.Validation.number().description("Quantidade de caracteres do texto."),normalized:r.Validation.string().description("Texto normalizado sem espacos nas pontas.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationString",null),h([se({name:"validation.number",title:"Validacao de number",description:"Exemplo de validacao numerica com minimo e maximo.",input:{value:r.Validation.number().min(0).max(100).description("Numero entre 0 e 100.")},output:{doubled:r.Validation.number().description("Numero multiplicado por dois.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationNumber",null),h([se({name:"validation.boolean",title:"Validacao de boolean",description:"Exemplo de validacao de booleano sem parse implicito.",input:{active:r.Validation.boolean().description("Indica se o registro esta ativo.")},output:{active:r.Validation.boolean().description("Booleano validado.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationBoolean",null),h([se({name:"validation.array",title:"Validacao de array",description:"Exemplo de validacao de array com limites e item tipado.",input:{tags:r.Validation.array(r.Validation.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:r.Validation.number().description("Quantidade de tags recebidas.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationArray",null),h([se({name:"validation.object",title:"Validacao de object",description:"Exemplo de validacao de objeto simples.",input:{profile:r.Validation.object({name:r.Validation.string().min(2).max(60).description("Nome do perfil."),age:r.Validation.number().min(0).max(120).description("Idade do perfil."),nickname:r.Validation.string().empty().max(30).description("Apelido opcional do perfil.")}).description("Objeto de perfil.")},output:{summary:r.Validation.object({name:r.Validation.string().description("Nome validado."),adult:r.Validation.boolean().description("Indica se a idade e maior ou igual a 18.")}).description("Resumo do perfil.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationObject",null),h([se({name:"validation.enum",title:"Validacao de enum",description:"Exemplo de validacao de lista fechada de valores.",input:{status:r.Validation.enum(["draft","active","archived"]).description("Status permitido.")},output:{status:r.Validation.string().description("Status validado.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationEnum",null),h([se({name:"validation.date",title:"Validacao de date",description:"Exemplo de validacao e parse de data.",input:{date:r.Validation.date().parse().description("Data em formato aceito pelo Date.")},output:{iso:r.Validation.string().description("Data em ISO string."),timestamp:r.Validation.number().description("Data em timestamp Unix em milissegundos.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationDate",null),h([se({name:"validation.optional",title:"Validacao de campo opcional",description:"Exemplo de campo opcional aceitando ausencia.",input:{name:r.Validation.string().min(2).description("Nome obrigatorio."),nickname:r.Validation.string().empty().max(30).description("Apelido opcional.")},output:{name:r.Validation.string().description("Nome validado."),hasNickname:r.Validation.boolean().description("Indica se apelido foi enviado."),nickname:r.Validation.string().empty().description("Apelido validado quando enviado.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationOptional",null),h([se({name:"validation.defaults",title:"Validacao de valores padrao",description:"Exemplo de campos opcionais com valores padrao.",input:{name:r.Validation.string().default("guest").description("Nome opcional com valor padrao."),limit:r.Validation.number().parse().default(10).min(1).max(100).description("Limite opcional com valor padrao.")},output:{name:r.Validation.string().description("Nome final."),limit:r.Validation.number().description("Limite final.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationDefaults",null),h([se({name:"validation.parse",title:"Validacao com parse",description:"Exemplo de parse de boolean e number antes da validacao final.",input:{active:r.Validation.boolean().parse().default(!1).description("Booleano aceitando valores parseaveis."),amount:r.Validation.number().parse().min(1).max(1e3).description("Numero aceitando string numerica.")},output:{active:r.Validation.boolean().description("Booleano parseado."),amount:r.Validation.number().description("Numero parseado.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationParse",null),h([se({name:"validation.nested",title:"Validacao de objeto aninhado",description:"Exemplo de objeto aninhado com array interno.",input:{payload:r.Validation.object({user:r.Validation.object({id:r.Validation.string().min(3).max(30).description("Identificador do usuario."),email:r.Validation.string().email().description("Email do usuario.")}).description("Usuario do payload."),scores:r.Validation.array(r.Validation.number().min(0).max(100).description("Pontuacao individual.")).min(1).max(3).description("Pontuacoes do usuario.")}).description("Payload aninhado.")},output:{userId:r.Validation.string().description("Identificador validado."),scoreCount:r.Validation.number().description("Quantidade de pontuacoes.")}}),v("design:type",Function),v("design:paramtypes",[Object,Object]),v("design:returntype",Promise)],exports.TestController.prototype,"validationNested",null),exports.TestController=h([t.Controller("/test")],exports.TestController),exports.UsersController=class UsersController extends ModelController{constructor(){super(...arguments),this.model=exports.UserModel,this.userService=new exports.UserService}password(e,r,o){return m(this,void 0,void 0,function*(){if(yield this.userService.createPassword(o,r,e))return e.success("OK");throw new t.HttpNotFoundError})}add(e){return m(this,void 0,void 0,function*(){yield this.create({ctx:e})})}all(e){return m(this,void 0,void 0,function*(){yield this.findAll({ctx:e})})}rows(e){return m(this,void 0,void 0,function*(){yield this.countAll({ctx:e})})}del(e,r,o){return m(this,void 0,void 0,function*(){if(o.id==r)throw new t.HttpForbiddenError;yield this.delete({ctx:e})})}get(e){return m(this,void 0,void 0,function*(){yield this.findOne({ctx:e})})}set(e){return m(this,void 0,void 0,function*(){yield this.update({ctx:e})})}},h([t.Post("/:id/password"),I(),_(),t.ValidateBody(e=>({password:e.string().min(5)})),y(0,t.Ctx()),y(1,t.Body("password")),y(2,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String,String]),v("design:returntype",Promise)],exports.UsersController.prototype,"password",null),h([t.Post(),I(),w(),t.ValidateBody(e=>({name:e.string(),email:e.string().email(),username:e.string().min(3),notes:e.string().default(""),status:e.enum(Object.values(exports.UserStatus)).default(exports.UserStatus.ACTIVE)})),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"add",null),h([t.Get(),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"all",null),h([t.Get("/count"),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"rows",null),h([t.Delete("/:id"),I(),O(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,k()),v("design:type",Function),v("design:paramtypes",[t.Context,String,exports.UserModel]),v("design:returntype",Promise)],exports.UsersController.prototype,"del",null),h([t.Get("/:id"),I(),T(),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"get",null),h([t.Put("/:id"),I(),_(),t.ValidateBody(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(exports.UserStatus)).optional()})),y(0,t.Ctx()),v("design:type",Function),v("design:paramtypes",[t.Context]),v("design:returntype",Promise)],exports.UsersController.prototype,"set",null),exports.UsersController=h([t.Controller("/users")],exports.UsersController),exports.UsersGroupsController=class UsersGroupsController extends ModelController{constructor(){super(...arguments),this.model=exports.GroupModel,this.permissions=[]}add(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(r),yield this.addGroups(e,t,r),e.success("OK")})}all(e,t){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{include:[{association:"users_groups",required:!0,attributes:[],where:{user_id:t}}]}})})}del(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(r),yield exports.UserGroupModel.destroy(Object.assign({where:{user_id:t,group_id:{[i.Op.in]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureGroups(r);const o=yield this.addGroups(e,t,r);yield exports.UserGroupModel.destroy(Object.assign({where:{user_id:t,group_id:{[i.Op.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addGroups(e,t,o){return m(this,void 0,void 0,function*(){const i=[];return yield r.forEachAsync(o,r=>m(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.UserGroupModel.findOrCreate(Object.assign({where:{user_id:t,group_id:r},defaults:{user_id:t,group_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];s&&i.push(r)})),i})}ensureGroups(e){return m(this,void 0,void 0,function*(){var o;if(e.length!=r.uniqueArray(e).length)throw new t.HttpValidationError("Duplicate group id");if((null!==(o=yield exports.GroupModel.count({where:{id:{[i.Op.in]:e}}}).catch(this.error))&&void 0!==o?o:0)!=e.length)throw new t.HttpValidationError("Invalid group id")})}ensureUser(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Post("/:id/groups"),I(),w(),_("users"),t.ValidateBody(e=>({groups:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("groups")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"add",null),h([t.Get("/:id/groups"),I(),T(),_("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"all",null),h([t.Delete("/:id/groups"),I(),O(),_("users"),t.ValidateBody(e=>({groups:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("groups")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"del",null),h([t.Put("/:id/groups"),I(),_(),_("users"),t.ValidateBody(e=>({groups:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("groups")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersGroupsController.prototype,"set",null),exports.UsersGroupsController=h([t.Controller("/users")],exports.UsersGroupsController),exports.UsersKeysController=class UsersKeysController extends ModelController{constructor(){super(...arguments),this.model=exports.UserKeyModel,this.permissions=["admin","audit","create","read","update","delete"]}add(e,t,r,o){return m(this,void 0,void 0,function*(){e.json(yield o.authService.createApiKey(e,r.name,r.expires_at,t))})}add_admin(e,r,o,i){return m(this,void 0,void 0,function*(){const s=yield exports.UserModel.findOne({attributes:["id"],where:{id:r}}).catch(this.error);if(!s)throw new t.HttpNotFoundError;e.json(yield i.authService.createApiKey(e,o.name,o.expires_at,s))})}revoke(e,r,o,i){return m(this,void 0,void 0,function*(){if(!(yield i.authService.revokeApiKey(e,r,o)))throw new t.HttpNotFoundError;e.success("OK")})}revoke_admin(e,r,o,i){return m(this,void 0,void 0,function*(){const s=yield exports.UserModel.findOne({attributes:["id"],where:{id:r}}).catch(this.error);if(!s||!(yield i.authService.revokeApiKey(e,o,s)))throw new t.HttpNotFoundError;e.success("OK")})}del(e,r,o,i){return m(this,void 0,void 0,function*(){if(!(yield i.authService.deleteApiKey(e,r,o)))throw new t.HttpNotFoundError;e.success("OK")})}del_admin(e,r,o,i){return m(this,void 0,void 0,function*(){const s=yield exports.UserModel.findOne({attributes:["id"],where:{id:r}}).catch(this.error);if(!s||!(yield i.authService.deleteApiKey(e,o,s)))throw new t.HttpNotFoundError;e.success("OK")})}all(e,t){return m(this,void 0,void 0,function*(){yield this.findAll({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t.id}}]}})})}get(e,t){return m(this,void 0,void 0,function*(){yield this.findOne({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t.id}}]}})})}all_admin(e,t){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t}}]}})})}get_admin(e,t){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findOne({ctx:e,options:{attributes:{exclude:["hash"]},include:[{association:"user",required:!0,attributes:[],where:{id:t}}]}})})}ensureUser(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Post("/keys"),I(),w(),t.ValidateBody(e=>({name:e.string(),expires_at:e.date().min(()=>new Date).empty()})),y(0,t.Ctx()),y(1,k()),y(2,t.Body()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel,Object,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"add",null),h([t.Post("/:id/keys"),I(),w(),b("users.keys.admin"),t.ValidateBody(e=>({name:e.string(),expires_at:e.date().min(()=>new Date).empty()})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,Object,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"add_admin",null),h([t.Post("/keys/:id/revoke"),I(),_(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,k()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,exports.UserModel,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"revoke",null),h([t.Post("/:id/keys/:key/revoke"),I(),_(),b("users.keys.admin"),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Params("key")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"revoke_admin",null),h([t.Delete("/keys/:id"),I(),O(),y(0,t.Ctx()),y(1,t.Params("id")),y(2,k()),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,exports.UserModel,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"del",null),h([t.Delete("/:id/keys/:key"),I(),O(),b("users.keys.admin"),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Params("key")),y(3,t.App()),v("design:type",Function),v("design:paramtypes",[t.Context,String,String,Application]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"del_admin",null),h([t.Get("/keys"),I(),T(),y(0,t.Ctx()),y(1,k()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"all",null),h([t.Get("/keys/:id"),I(),T(),y(0,t.Ctx()),y(1,k()),v("design:type",Function),v("design:paramtypes",[t.Context,exports.UserModel]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"get",null),h([t.Get("/:id/keys"),I(),T(),b("users.keys.admin"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"all_admin",null),h([t.Get("/:user/keys/:id"),I(),T(),b("users.keys.admin"),y(0,t.Ctx()),y(1,t.Params("user")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersKeysController.prototype,"get_admin",null),exports.UsersKeysController=h([t.Controller("/users")],exports.UsersKeysController),exports.UsersTenantsController=class UsersTenantsController extends ModelController{constructor(){super(...arguments),this.model=exports.TenantModel,this.permissions=[]}add(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(r),yield this.addTenants(e,t,r),e.success("OK")})}all(e,t){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.findAll({ctx:e,options:{include:[{association:"users_tenants",required:!0,attributes:[],where:{user_id:t}}]}})})}del(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(r),yield exports.UserTenantModel.destroy(Object.assign({where:{user_id:t,tenant_id:{[i.Op.in]:r}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}set(e,t,r){return m(this,void 0,void 0,function*(){yield this.ensureUser(t),yield this.ensureTenants(r);const o=yield this.addTenants(e,t,r);yield exports.UserTenantModel.destroy(Object.assign({where:{user_id:t,tenant_id:{[i.Op.notIn]:o}},individualHooks:!0},{ctx:e})).catch(this.error),e.success("OK")})}addTenants(e,t,o){return m(this,void 0,void 0,function*(){const i=[];return yield r.forEachAsync(o,r=>m(this,void 0,void 0,function*(){var o;const[s]=null!==(o=yield exports.UserTenantModel.findOrCreate(Object.assign({where:{user_id:t,tenant_id:r},defaults:{user_id:t,tenant_id:r}},{ctx:e})).catch(this.error))&&void 0!==o?o:[];s&&i.push(r)})),i})}ensureTenants(e){return m(this,void 0,void 0,function*(){var o;if(e.length!=r.uniqueArray(e).length)throw new t.HttpValidationError("Duplicate tenant id");if((null!==(o=yield exports.TenantModel.count({where:{id:{[i.Op.in]:e}}}).catch(this.error))&&void 0!==o?o:0)!=e.length)throw new t.HttpValidationError("Invalid tenant id")})}ensureUser(e){return m(this,void 0,void 0,function*(){var r;if(!(null!==(r=yield exports.UserModel.count({where:{id:e}}).catch(this.error))&&void 0!==r?r:0))throw new t.HttpNotFoundError})}},h([t.Post("/:id/tenants"),I(),w(),_("users"),t.ValidateBody(e=>({tenants:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("tenants")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersTenantsController.prototype,"add",null),h([t.Get("/:id/tenants"),I(),T(),_("users"),y(0,t.Ctx()),y(1,t.Params("id")),v("design:type",Function),v("design:paramtypes",[t.Context,String]),v("design:returntype",Promise)],exports.UsersTenantsController.prototype,"all",null),h([t.Delete("/:id/tenants"),I(),O(),_("users"),t.ValidateBody(e=>({tenants:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("tenants")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersTenantsController.prototype,"del",null),h([t.Put("/:id/tenants"),I(),_(),_("users"),t.ValidateBody(e=>({tenants:e.array(e.string().uuid())})),y(0,t.Ctx()),y(1,t.Params("id")),y(2,t.Body("tenants")),v("design:type",Function),v("design:paramtypes",[t.Context,String,Array]),v("design:returntype",Promise)],exports.UsersTenantsController.prototype,"set",null),exports.UsersTenantsController=h([t.Controller("/users")],exports.UsersTenantsController),exports.Application=Application,exports.Audit=ce,exports.CanCreate=w,exports.CanDelete=O,exports.CanRead=T,exports.CanUpdate=_,exports.Config=class Config extends Loggable{static all(e){return m(this,void 0,void 0,function*(){var t;const r=null!==(t=yield exports.ConfigModel.findAll({attributes:["key","value"],where:(null==e?void 0:e.length)?{key:{[i.Op.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[];return Object.fromEntries(r.map(e=>[e.key,e.value]))})}static del(e){return m(this,void 0,void 0,function*(){return((yield exports.ConfigModel.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return m(this,arguments,void 0,function*(e,t=""){const[r]=(yield exports.ConfigModel.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];return r?r.value:t})}static set(e,t){return m(this,void 0,void 0,function*(){const[r,o]=(yield exports.ConfigModel.findOrCreate({where:{key:e},defaults:{key:e,value:t}}).catch(this.error))||[];r&&!o&&(yield r.update({value:t}).catch(this.error))})}},exports.CrudController=CrudController,exports.Env=Env,exports.HasGroups=(...e)=>(o,i,s)=>{t.Use(o=>m(void 0,void 0,void 0,function*(){const{groups:i=[]}=o.req;if(r.includesArray(e,i))return o.next();throw new t.HttpUnauthorizedError("Access denied")}))(o,i,s)},exports.HasPermissions=b,exports.HasScope=R,exports.IsAuthenticated=I,exports.Log=Log,exports.Loggable=Loggable,exports.MCP_DEFAULT_PROTOCOL_VERSION=W,exports.MCP_HTTP_ALLOW=Q,exports.MCP_HTTP_ALLOWED_METHODS=J,exports.MCP_HTTP_DEFAULT_ALLOWED_HEADERS=X,exports.MCP_PROTOCOL_VERSION_HEADER=$,exports.MCP_SESSION_ID_HEADER=Y,exports.MCP_SUPPORTED_PROTOCOL_VERSIONS=z,exports.MCP_TOOL_METADATA=ee,exports.McpError=McpError,exports.McpErrorCode=B,exports.McpHttpHandler=McpHttpHandler,exports.McpInternalError=class McpInternalError extends McpError{constructor(e="Internal error",t){super(e,B.InternalError,200,t)}},exports.McpInvalidParamsError=McpInvalidParamsError,exports.McpInvalidRequestError=McpInvalidRequestError,exports.McpInvalidSessionError=McpInvalidSessionError,exports.McpMethodNotFoundError=McpMethodNotFoundError,exports.McpParseError=McpParseError,exports.McpServerError=McpServerError,exports.McpSessionStore=McpSessionStore,exports.McpTool=se,exports.McpToolNotFoundError=McpToolNotFoundError,exports.McpToolRegistry=McpToolRegistry,exports.ModelController=ModelController,exports.ModelService=ModelService,exports.RegisterWorker=ge,exports.ReqAccess=U,exports.ReqGroup=D,exports.ReqGroups=j,exports.ReqPermission=H,exports.ReqPermissions=V,exports.ReqTenant=N,exports.ReqTenants=F,exports.ReqUser=k,exports.Secret=class Secret extends Loggable{static all(e){return m(this,void 0,void 0,function*(){var t;return(null!==(t=yield exports.SecretModel.findAll({attributes:["key"],where:(null==e?void 0:e.length)?{key:{[i.Op.in]:e}}:{}}).catch(this.error))&&void 0!==t?t:[]).map(e=>e.key)})}static del(e){return m(this,void 0,void 0,function*(){return((yield exports.SecretModel.destroy({where:{key:e}}).catch(this.error))||0)>0})}static get(e){return m(this,arguments,void 0,function*(e,t=""){var r;this.init();const o=this.encryptor.encrypt(t),[i]=(yield exports.SecretModel.findOrCreate({where:{key:e},defaults:{key:e,hash:o}}).catch(this.error))||[];return i&&null!==(r=this.encryptor.decrypt(i.hash))&&void 0!==r?r:t})}static set(e,t){return m(this,void 0,void 0,function*(){this.init();const r=this.encryptor.encrypt(t),[o,i]=(yield exports.SecretModel.findOrCreate({where:{key:e},defaults:{key:e,hash:r}}).catch(this.error))||[];o&&!i&&(yield o.update({hash:r}).catch(this.error))})}static init(){this.encryptor||(this.encryptor=new s.Encryptor(Env.ENCRYPTION_SECRET))}},exports.SessionStore=SessionStore,exports.WorkerRegistry=WorkerRegistry,exports.assertValidMcpToolDefinition=te,exports.canFactory=P,exports.discoverMcpTools=oe,exports.getMcpToolMetadata=re,exports.isJsonParseError=Z,exports.isJsonRpcId=L,exports.jsonParseErrorResponse=e=>{if(Z(e))return{status:400,body:q(null,new McpParseError("Parse error",{message:e.message}))}},exports.jsonRpcError=q,exports.jsonRpcErrorFromCode=(e,t,r,o)=>({jsonrpc:"2.0",id:e,error:Object.assign({code:t,message:r},void 0!==o?{data:o}:{})}),exports.jsonRpcResult=G,exports.parseJsonRpcRequest=K,exports.sequelize=x;