@easbot/gateway 0.2.13 → 0.2.14

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.
@@ -1,2 +1,2 @@
1
- 'use strict';var chunk5ETPYYQR_cjs=require('./chunk-5ETPYYQR.cjs'),e=require('zod'),_=require('path'),fs=require('fs'),be=require('fs/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var e__default=/*#__PURE__*/_interopDefault(e);var ___default=/*#__PURE__*/_interopDefault(_);var be__default=/*#__PURE__*/_interopDefault(be);var Y=chunk5ETPYYQR_cjs.a.create({service:"gateway:config"});e__default.default.enum(["telegram","slack","feishu","wechat","webchat","signal","nostr"]);e__default.default.enum(["low","medium","high","critical"]);var m=e__default.default.object({enabled:e__default.default.boolean().default(true),botToken:e__default.default.string().describe("Telegram Bot Token"),webhookUrl:e__default.default.string().optional().describe("Webhook URL for receiving updates"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),y=e__default.default.object({enabled:e__default.default.boolean().default(true),botToken:e__default.default.string().describe("Slack Bot Token (xoxb-*)"),appToken:e__default.default.string().optional().describe("Slack App Token (xapp-*) for Socket Mode"),signingSecret:e__default.default.string().optional().describe("Slack Signing Secret for webhook verification"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),b=e__default.default.object({enabled:e__default.default.boolean().default(true),appId:e__default.default.string().describe("Feishu App ID"),appSecret:e__default.default.string().describe("Feishu App Secret"),encryptKey:e__default.default.string().optional().describe("Feishu Encrypt Key for message encryption"),verificationToken:e__default.default.string().optional().describe("Feishu Verification Token"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),S=e__default.default.object({enabled:e__default.default.boolean().default(true),mode:e__default.default.enum(["official","wecom"]).default("official"),appId:e__default.default.string().describe("WeChat App ID"),appSecret:e__default.default.string().describe("WeChat App Secret"),token:e__default.default.string().optional().describe("WeChat Token for message verification"),encodingAESKey:e__default.default.string().optional().describe("WeChat Encoding AES Key"),agentId:e__default.default.string().optional().describe("WeCom Agent ID"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),w=e__default.default.object({enabled:e__default.default.boolean().default(true),path:e__default.default.string().optional().default("/"),heartbeatInterval:e__default.default.number().int().positive().optional().default(3e4),connectionTimeout:e__default.default.number().int().positive().optional().default(6e4),maxConnections:e__default.default.number().int().positive().optional().default(1e3),cors:e__default.default.boolean().optional().default(true)}),A=e__default.default.object({enabled:e__default.default.boolean().default(true),serviceUrl:e__default.default.string().optional().default("https://chat.signal.org"),phoneNumber:e__default.default.string().describe("Signal phone number"),password:e__default.default.string().optional().describe("Signal account password"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),x=e__default.default.object({enabled:e__default.default.boolean().default(true),relays:e__default.default.array(e__default.default.string()).min(1).describe("Nostr relay URLs"),privateKey:e__default.default.string().optional().describe("Nostr private key (hex)"),publicKey:e__default.default.string().optional().describe("Nostr public key (hex)"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),O=e__default.default.object({telegram:m.optional(),slack:y.optional(),feishu:b.optional(),wechat:S.optional(),webchat:w.optional(),signal:A.optional(),nostr:x.optional()}),D=e__default.default.object({enabled:e__default.default.boolean().default(false),cert:e__default.default.string().describe("Path to SSL certificate file (\u6216 certPath)"),key:e__default.default.string().describe("Path to SSL key file (\u6216 keyPath)"),certPath:e__default.default.string().optional().describe("Path to SSL certificate file (alias of cert)"),keyPath:e__default.default.string().optional().describe("Path to SSL key file (alias of key)"),ca:e__default.default.string().optional().describe("Path to CA certificate file"),forceRedirect:e__default.default.boolean().optional().default(false).describe("Force redirect HTTP to HTTPS"),httpPort:e__default.default.number().int().positive().optional().default(80).describe("HTTP redirect port")}),J=e__default.default.object({name:e__default.default.string().describe("Token name/description"),value:e__default.default.string().describe("Token value"),permissions:e__default.default.array(e__default.default.string()).default(["*"]).describe("Associated permissions"),expiresAt:e__default.default.number().int().positive().optional().describe("Expiration timestamp (Unix timestamp)"),description:e__default.default.string().optional().describe("Token description")}),$=e__default.default.object({enabled:e__default.default.boolean().default(true),tokens:e__default.default.array(J).default([]).describe("List of valid tokens"),onInvalid:e__default.default.enum(["reject","anonymous"]).default("reject").describe("Behavior when token validation fails"),allowAnonymous:e__default.default.boolean().default(false).describe("Allow anonymous access"),defaultPermissions:e__default.default.array(e__default.default.string()).default([]).describe("Default permissions for anonymous users")}),X=e__default.default.object({enabled:e__default.default.boolean().default(false),authorizationServer:e__default.default.string().describe("OAuth2 authorization server URL"),clientId:e__default.default.string().describe("OAuth2 client ID"),clientSecret:e__default.default.string().describe("OAuth2 client secret"),tokenValidationEndpoint:e__default.default.string().describe("OAuth2 token validation endpoint"),scope:e__default.default.array(e__default.default.string()).default([]).describe("OAuth2 scopes")}),j=e__default.default.object({type:e__default.default.enum(["token","oauth2"]).default("token"),token:$.optional(),oauth2:X.optional()}),z=e__default.default.object({mode:e__default.default.enum(["pull","push","both"]).default("both"),interval:e__default.default.number().int().positive().default(3e4),pushEvents:e__default.default.array(e__default.default.enum(["register","deregister","heartbeat","status_change"])).default(["register","deregister","status_change"]),conflictResolution:e__default.default.enum(["latest","local","remote"]).default("latest")}),Z=e__default.default.object({id:e__default.default.string().describe("Gateway node ID"),address:e__default.default.string().describe("Gateway node address (e.g., http://localhost:3001)"),enabled:e__default.default.boolean().default(true),metadata:e__default.default.record(e__default.default.string(),e__default.default.any()).optional()}),U=e__default.default.object({nodeId:e__default.default.string().describe("Current gateway node ID"),nodes:e__default.default.array(Z).default([]).describe("Other gateway nodes in the cluster"),sync:z.optional()}),v=e__default.default.object({maxConnectionsPerChannel:e__default.default.number().int().positive().default(100),idleTimeout:e__default.default.number().int().positive().default(3e5),reuseStrategy:e__default.default.enum(["lru","fifo","random"]).default("lru"),healthCheckInterval:e__default.default.number().int().positive().default(6e4),acquireTimeout:e__default.default.number().int().positive().default(5e3),warmupCount:e__default.default.number().int().nonnegative().default(0).describe("Number of connections to warm up")}),T=e__default.default.object({maxLength:e__default.default.number().int().positive().default(1e4),concurrency:e__default.default.number().int().positive().default(100),batchSize:e__default.default.number().int().positive().default(10),batchTimeout:e__default.default.number().int().positive().default(100),priorityLevels:e__default.default.number().int().positive().default(4)}),G=e__default.default.object({failureThreshold:e__default.default.number().int().positive().default(5),successThreshold:e__default.default.number().int().positive().default(3),timeout:e__default.default.number().int().positive().default(3e4),halfOpenDuration:e__default.default.number().int().positive().default(15e3)}),P=e__default.default.object({heartbeatInterval:e__default.default.number().int().positive().default(3e4),heartbeatTimeout:e__default.default.number().int().positive().default(9e4),heartbeatCheckInterval:e__default.default.number().int().positive().default(1e4),autoDeregisterTimeout:e__default.default.number().int().positive().default(3e5),maxAgents:e__default.default.number().int().positive().default(100),persistenceFile:e__default.default.string().optional().describe("Path to persist agent registrations"),maxRegistrations:e__default.default.number().int().positive().default(1e3)}),k=e__default.default.object({sessionTimeout:e__default.default.number().int().positive().default(18e5),resumeGracePeriod:e__default.default.number().int().positive().default(3e5),maxSessions:e__default.default.number().int().positive().default(1e4),persistenceFile:e__default.default.string().optional().describe("Path to persist sessions")}),I=e__default.default.object({enabled:e__default.default.boolean().default(true),port:e__default.default.number().int().positive().default(8080),hostname:e__default.default.string().default("localhost"),path:e__default.default.string().optional().default("/"),maxConnections:e__default.default.number().int().positive().optional().default(1e3),connectionTimeout:e__default.default.number().int().positive().optional().default(6e4),heartbeatInterval:e__default.default.number().int().positive().optional().default(3e4),sessionExpireMs:e__default.default.number().int().positive().optional().default(3e5),https:D.optional(),auth:j.optional(),cors:e__default.default.boolean().default(true),corsOrigins:e__default.default.array(e__default.default.string()).optional(),mdns:e__default.default.boolean().default(false),mdnsDomain:e__default.default.string().optional().default("gateway.easbot.local")}),d=e__default.default.object({server:I.optional(),channels:O.optional(),cluster:U.optional(),connectionPool:v.optional(),messageQueue:T.optional(),circuitBreaker:G.optional(),agentRegistry:P.optional(),session:k.optional(),defaultAgent:e__default.default.string().optional().describe("Default agent ID for routing"),logLevel:e__default.default.enum(["DEBUG","INFO","WARN","ERROR"]).optional().default("INFO")}).catchall(e__default.default.unknown());function N(t){let n=d.safeParse(t);return n.success||Y.warn("Invalid gateway config",{issues:n.error.issues}),n.success?n.data:d.parse({})}function ee(t){return d.parse(t)}var Ce=chunk5ETPYYQR_cjs.a.create({service:"gateway:interfaces"}),f;function Je(t){f=t,Ce.debug("Agent adapter registered",{hasSubAgentRunner:!!t.subAgentRunner});}function $e(){return f}function Q(){return f!==void 0}function K(){if(!f)throw new Error("Agent adapter not set. Call setAgentAdapter() before using Gateway.");return f}var he={Path:{home:process.env.HOME||process.env.USERPROFILE||"",data:".easbot",cache:".easbot/cache",config:".easbot",state:".easbot/state",log:".easbot/log",bin:".easbot/bin"}},de={directory:process.cwd(),worktree:process.cwd()},F=class{async load(n){return E(n)}},me=new F;function Xe(){return f?f.configLoader:me}function q(){return f?f.global:he}function R(){return f?f.instance:de}var l=chunk5ETPYYQR_cjs.a.create({service:"gateway:config"}),W={enabled:true,port:8080,hostname:"localhost",path:"/",maxConnections:1e3,connectionTimeout:6e4,heartbeatInterval:3e4,sessionExpireMs:3e5,cors:true,mdns:false,mdnsDomain:"gateway.easbot.local",https:{enabled:false,cert:"",key:"",certPath:void 0,keyPath:void 0,ca:void 0,forceRedirect:false,httpPort:80}},Se={maxConnectionsPerChannel:100,idleTimeout:3e5,reuseStrategy:"lru",healthCheckInterval:6e4,acquireTimeout:5e3,warmupCount:0},we={maxLength:1e4,concurrency:100,batchSize:10,batchTimeout:100,priorityLevels:4},Ae={failureThreshold:5,successThreshold:3,timeout:3e4,halfOpenDuration:15e3},xe={heartbeatInterval:3e4,heartbeatTimeout:9e4,heartbeatCheckInterval:1e4,autoDeregisterTimeout:3e5,maxAgents:100,maxRegistrations:1e3},ve={sessionTimeout:18e5,resumeGracePeriod:3e5,maxSessions:1e4},Te={enabled:true,botToken:"",maxConnections:100,timeout:3e4},Ge={enabled:true,botToken:"",maxConnections:100,timeout:3e4},Pe={enabled:true,appId:"",appSecret:"",maxConnections:100,timeout:3e4},ke={enabled:true,mode:"official",appId:"",appSecret:"",maxConnections:100,timeout:3e4},Ie={enabled:true,path:"/ws",heartbeatInterval:3e4,connectionTimeout:6e4,maxConnections:1e3,cors:true},Ne={enabled:true,serviceUrl:"https://chat.signal.org",phoneNumber:"",maxConnections:100,timeout:3e4},Le={enabled:true,relays:[],maxConnections:100,timeout:3e4},C,p=null;async function V(t){try{if(!fs.existsSync(t))return null;let n=await be__default.default.readFile(t,"utf-8"),o=n,a=!1,r=!1,s=[];for(let i=0;i<n.length;i++){let g=n[i];if(r){s.push(g),r=!1;continue}if(g==="\\"){s.push(g),r=!0;continue}if(g==='"'){a=!a,s.push(g);continue}if(!a&&g==="/"&&n[i+1]==="/"){for(;i<n.length&&n[i]!==`
2
- `&&n[i]!=="\r";)i++;continue}if(!a&&g==="/"&&n[i+1]==="*"){for(i+=2;i<n.length-1;){if(n[i]==="*"&&n[i+1]==="/"){i+=2;break}i++;}continue}s.push(g);}return o=s.join("").trim(),o?JSON.parse(o):null}catch(n){return l.debug("Failed to load config file",{file:t,error:String(n)}),null}}function h(t,n){let o={...t,...n};return (t.server||n.server)&&(o.server={...t.server,...n.server}),(t.channels||n.channels)&&(o.channels={...t.channels,...n.channels}),o}async function Ee(){let t=q(),n=R(),o=[],a=___default.default.join(t.Path.config);o.push(a),o.push(n.directory);try{let{Filesystem:s}=await import('@easbot/utils'),i=await Array.fromAsync(s.up({targets:[".easbot"],start:n.directory,stop:n.worktree}));o.push(...i);}catch{l.debug("Filesystem utils not available, using basic directories");}let r=process.env.EASBOT_CONFIG_DIR;return r&&(o.push(r),l.debug("Using EASBOT_CONFIG_DIR",{path:r})),[...new Set(o)]}async function Fe(t){let n=["gateway.json"],o={};for(let a of n){let r=___default.default.join(t,a),s=await V(r);if(s)if("gateway"in s&&s.gateway){let i=s.gateway;"server"in i||"channels"in i||"cluster"in i?o=h(o,i):o=h(o,{server:i}),l.debug("Loaded gateway config from file (nested format)",{file:r});}else "gateway"in s||(o=h(o,s),l.debug("Loaded gateway config from file (direct format)",{file:r}));}return o}async function Re(t){let n=["easbot.json"];for(let o of n){let a=___default.default.join(t,o),r=await V(a);if(r?.gateway)return l.debug("Loaded gateway config from easbot.json",{file:a}),r.gateway}return {}}function _e(){return C||(C=async()=>{if(Q())try{let a=K(),r=await a.configLoader.load(a.instance.directory);if(r&&typeof r=="object"){let s=r.gateway;if(s){l.debug("Loaded gateway config from agent adapter");let i=N(s);return p=i,{config:i,directories:Array.from(new Set([a.instance.directory,a.instance.worktree,a.global.Path.config]).values())}}}}catch(a){l.debug("Failed to load config from agent adapter",{error:String(a)});}let t=await Ee(),n={};for(let a of t){let r=await Fe(a);n=h(n,r);let s=await Re(a);n=h(n,s);}let o=N(n);return p=o,l.info("Gateway config loaded",{directories:t.length,port:o.server?.port,logLevel:o.logLevel}),{config:o,directories:t}}),C}async function c(){return _e()()}async function E(t){return t&&(C=void 0,p=null),(await c()).config}function H(){return p}function B(){return p!==null}function te(){C=void 0,p=null,l.debug("Config cache cleared");}function ne(){return R().directory}async function oe(){let{config:t}=await c();return I.parse({...W,...t.server})}async function ie(t){let{config:n}=await c(),o=n.channels?.[t],r={telegram:m.parse(Te),slack:y.parse(Ge),feishu:b.parse(Pe),wechat:S.parse(ke),webchat:w.parse(Ie),signal:A.parse(Ne),nostr:x.parse(Le)}[t];if(!r)throw new Error(`Unknown channel type: ${t}`);return {...r,...o}}async function ae(){let{config:t}=await c();return v.parse({...Se,...t.connectionPool})}async function re(){let{config:t}=await c();return T.parse({...we,...t.messageQueue})}async function se(){let{config:t}=await c();return G.parse({...Ae,...t.circuitBreaker})}async function ce(){let{config:t}=await c();return P.parse({...xe,...t.agentRegistry})}async function fe(){let{config:t}=await c();return k.parse({...ve,...t.session})}async function le(){let{config:t}=await c();return t.server?.https}async function ge(){let{config:t}=await c();return t.server?.auth}async function ue(){let{config:t}=await c();return t.cluster}async function pe(){let{config:t}=await c();return t.defaultAgent}async function M(){let{config:t}=await c();return t.logLevel??"INFO"}exports.A=ne;exports.B=oe;exports.C=ie;exports.D=ae;exports.E=re;exports.F=se;exports.G=ce;exports.H=fe;exports.I=le;exports.J=ge;exports.K=ue;exports.L=pe;exports.M=M;exports.N=Je;exports.O=$e;exports.P=Q;exports.Q=K;exports.R=Xe;exports.S=q;exports.T=R;exports.a=m;exports.b=y;exports.c=b;exports.d=S;exports.e=w;exports.f=A;exports.g=x;exports.h=O;exports.i=D;exports.j=j;exports.k=z;exports.l=U;exports.m=v;exports.n=T;exports.o=G;exports.p=P;exports.q=k;exports.r=I;exports.s=d;exports.t=N;exports.u=ee;exports.v=W;exports.w=E;exports.x=H;exports.y=B;exports.z=te;
1
+ 'use strict';var chunk5ETPYYQR_cjs=require('./chunk-5ETPYYQR.cjs'),e=require('zod'),L=require('path'),fs=require('fs'),he=require('fs/promises');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var e__default=/*#__PURE__*/_interopDefault(e);var L__default=/*#__PURE__*/_interopDefault(L);var he__default=/*#__PURE__*/_interopDefault(he);var K=chunk5ETPYYQR_cjs.a.create({service:"gateway:config"});e__default.default.enum(["telegram","slack","feishu","wechat","webchat","signal","nostr"]);e__default.default.enum(["low","medium","high","critical"]);var m=e__default.default.object({enabled:e__default.default.boolean().default(true),botToken:e__default.default.string().describe("Telegram Bot Token"),webhookUrl:e__default.default.string().optional().describe("Webhook URL for receiving updates"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),y=e__default.default.object({enabled:e__default.default.boolean().default(true),botToken:e__default.default.string().describe("Slack Bot Token (xoxb-*)"),appToken:e__default.default.string().optional().describe("Slack App Token (xapp-*) for Socket Mode"),signingSecret:e__default.default.string().optional().describe("Slack Signing Secret for webhook verification"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),b=e__default.default.object({enabled:e__default.default.boolean().default(true),appId:e__default.default.string().describe("Feishu App ID"),appSecret:e__default.default.string().describe("Feishu App Secret"),encryptKey:e__default.default.string().optional().describe("Feishu Encrypt Key for message encryption"),verificationToken:e__default.default.string().optional().describe("Feishu Verification Token"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),S=e__default.default.object({enabled:e__default.default.boolean().default(true),mode:e__default.default.enum(["official","wecom"]).default("official"),appId:e__default.default.string().describe("WeChat App ID"),appSecret:e__default.default.string().describe("WeChat App Secret"),token:e__default.default.string().optional().describe("WeChat Token for message verification"),encodingAESKey:e__default.default.string().optional().describe("WeChat Encoding AES Key"),agentId:e__default.default.string().optional().describe("WeCom Agent ID"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),w=e__default.default.object({enabled:e__default.default.boolean().default(true),path:e__default.default.string().optional().default("/"),heartbeatInterval:e__default.default.number().int().positive().optional().default(3e4),connectionTimeout:e__default.default.number().int().positive().optional().default(6e4),maxConnections:e__default.default.number().int().positive().optional().default(1e3),cors:e__default.default.boolean().optional().default(true)}),A=e__default.default.object({enabled:e__default.default.boolean().default(true),serviceUrl:e__default.default.string().optional().default("https://chat.signal.org"),phoneNumber:e__default.default.string().describe("Signal phone number"),password:e__default.default.string().optional().describe("Signal account password"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),x=e__default.default.object({enabled:e__default.default.boolean().default(true),relays:e__default.default.array(e__default.default.string()).min(1).describe("Nostr relay URLs"),privateKey:e__default.default.string().optional().describe("Nostr private key (hex)"),publicKey:e__default.default.string().optional().describe("Nostr public key (hex)"),maxConnections:e__default.default.number().int().positive().optional().default(100),timeout:e__default.default.number().int().positive().optional().default(3e4)}),R=e__default.default.object({telegram:m.optional(),slack:y.optional(),feishu:b.optional(),wechat:S.optional(),webchat:w.optional(),signal:A.optional(),nostr:x.optional()}),_=e__default.default.object({enabled:e__default.default.boolean().default(false),cert:e__default.default.string().describe("Path to SSL certificate file (\u6216 certPath)"),key:e__default.default.string().describe("Path to SSL key file (\u6216 keyPath)"),certPath:e__default.default.string().optional().describe("Path to SSL certificate file (alias of cert)"),keyPath:e__default.default.string().optional().describe("Path to SSL key file (alias of key)"),ca:e__default.default.string().optional().describe("Path to CA certificate file"),forceRedirect:e__default.default.boolean().optional().default(false).describe("Force redirect HTTP to HTTPS"),httpPort:e__default.default.number().int().positive().optional().default(80).describe("HTTP redirect port")}),V=e__default.default.object({name:e__default.default.string().describe("Token name/description"),value:e__default.default.string().describe("Token value"),permissions:e__default.default.array(e__default.default.string()).default(["*"]).describe("Associated permissions"),expiresAt:e__default.default.number().int().positive().optional().describe("Expiration timestamp (Unix timestamp)"),description:e__default.default.string().optional().describe("Token description")}),q=e__default.default.object({enabled:e__default.default.boolean().default(true),tokens:e__default.default.array(V).default([]).describe("List of valid tokens"),onInvalid:e__default.default.enum(["reject","anonymous"]).default("reject").describe("Behavior when token validation fails"),allowAnonymous:e__default.default.boolean().default(false).describe("Allow anonymous access"),defaultPermissions:e__default.default.array(e__default.default.string()).default([]).describe("Default permissions for anonymous users")}),Y=e__default.default.object({enabled:e__default.default.boolean().default(false),authorizationServer:e__default.default.string().describe("OAuth2 authorization server URL"),clientId:e__default.default.string().describe("OAuth2 client ID"),clientSecret:e__default.default.string().describe("OAuth2 client secret"),tokenValidationEndpoint:e__default.default.string().describe("OAuth2 token validation endpoint"),scope:e__default.default.array(e__default.default.string()).default([]).describe("OAuth2 scopes")}),O=e__default.default.object({type:e__default.default.enum(["token","oauth2"]).default("token"),token:q.optional(),oauth2:Y.optional()}),D=e__default.default.object({mode:e__default.default.enum(["pull","push","both"]).default("both"),interval:e__default.default.number().int().positive().default(3e4),pushEvents:e__default.default.array(e__default.default.enum(["register","deregister","heartbeat","status_change"])).default(["register","deregister","status_change"]),conflictResolution:e__default.default.enum(["latest","local","remote"]).default("latest")}),J=e__default.default.object({id:e__default.default.string().describe("Gateway node ID"),address:e__default.default.string().describe("Gateway node address (e.g., http://localhost:3001)"),enabled:e__default.default.boolean().default(true),metadata:e__default.default.record(e__default.default.string(),e__default.default.any()).optional()}),j=e__default.default.object({nodeId:e__default.default.string().describe("Current gateway node ID"),nodes:e__default.default.array(J).default([]).describe("Other gateway nodes in the cluster"),sync:D.optional()}),v=e__default.default.object({maxConnectionsPerChannel:e__default.default.number().int().positive().default(100),idleTimeout:e__default.default.number().int().positive().default(3e5),reuseStrategy:e__default.default.enum(["lru","fifo","random"]).default("lru"),healthCheckInterval:e__default.default.number().int().positive().default(6e4),acquireTimeout:e__default.default.number().int().positive().default(5e3),warmupCount:e__default.default.number().int().nonnegative().default(0).describe("Number of connections to warm up")}),T=e__default.default.object({maxLength:e__default.default.number().int().positive().default(1e4),concurrency:e__default.default.number().int().positive().default(100),batchSize:e__default.default.number().int().positive().default(10),batchTimeout:e__default.default.number().int().positive().default(100),priorityLevels:e__default.default.number().int().positive().default(4)}),G=e__default.default.object({failureThreshold:e__default.default.number().int().positive().default(5),successThreshold:e__default.default.number().int().positive().default(3),timeout:e__default.default.number().int().positive().default(3e4),halfOpenDuration:e__default.default.number().int().positive().default(15e3)}),P=e__default.default.object({heartbeatInterval:e__default.default.number().int().positive().default(3e4),heartbeatTimeout:e__default.default.number().int().positive().default(9e4),heartbeatCheckInterval:e__default.default.number().int().positive().default(1e4),autoDeregisterTimeout:e__default.default.number().int().positive().default(3e5),maxAgents:e__default.default.number().int().positive().default(100),persistenceFile:e__default.default.string().optional().describe("Path to persist agent registrations"),maxRegistrations:e__default.default.number().int().positive().default(1e3)}),k=e__default.default.object({sessionTimeout:e__default.default.number().int().positive().default(18e5),resumeGracePeriod:e__default.default.number().int().positive().default(3e5),maxSessions:e__default.default.number().int().positive().default(1e4),persistenceFile:e__default.default.string().optional().describe("Path to persist sessions")}),I=e__default.default.object({enabled:e__default.default.boolean().default(true),port:e__default.default.number().int().positive().default(8080),hostname:e__default.default.string().default("localhost"),path:e__default.default.string().optional().default("/"),maxConnections:e__default.default.number().int().positive().optional().default(1e3),connectionTimeout:e__default.default.number().int().positive().optional().default(6e4),heartbeatInterval:e__default.default.number().int().positive().optional().default(3e4),sessionExpireMs:e__default.default.number().int().positive().optional().default(3e5),https:_.optional(),auth:O.optional(),cors:e__default.default.boolean().default(true),corsOrigins:e__default.default.array(e__default.default.string()).optional(),mdns:e__default.default.boolean().default(false),mdnsDomain:e__default.default.string().optional().default("gateway.easbot.local")}),d=e__default.default.object({server:I.optional(),channels:R.optional(),cluster:j.optional(),connectionPool:v.optional(),messageQueue:T.optional(),circuitBreaker:G.optional(),agentRegistry:P.optional(),session:k.optional(),defaultAgent:e__default.default.string().optional().describe("Default agent ID for routing"),logLevel:e__default.default.enum(["DEBUG","INFO","WARN","ERROR"]).optional().default("INFO")}).catchall(e__default.default.unknown());function E(t){let n=d.safeParse(t);return n.success||K.warn("Invalid gateway config",{issues:n.error.issues}),n.success?n.data:d.parse({})}function $(t){return d.parse(t)}var ge=chunk5ETPYYQR_cjs.a.create({service:"gateway:interfaces"}),f;function Ve(t){f=t,ge.debug("Agent adapter registered",{hasSubAgentRunner:!!t.subAgentRunner});}function qe(){return f}function Ye(){return f!==void 0}function Je(){if(!f)throw new Error("Agent adapter not set. Call setAgentAdapter() before using Gateway.");return f}var ue={Path:{home:process.env.HOME||process.env.USERPROFILE||"",data:".easbot",cache:".easbot/cache",config:".easbot",state:".easbot/state",log:".easbot/log",bin:".easbot/bin"}},pe={directory:process.cwd(),worktree:process.cwd()};function M(){return f?f.global:ue}function F(){return f?f.instance:pe}var g=chunk5ETPYYQR_cjs.a.create({service:"gateway:config"}),z={enabled:true,port:8080,hostname:"localhost",path:"/",maxConnections:1e3,connectionTimeout:6e4,heartbeatInterval:3e4,sessionExpireMs:3e5,cors:true,mdns:false,mdnsDomain:"gateway.easbot.local",https:{enabled:false,cert:"",key:"",certPath:void 0,keyPath:void 0,ca:void 0,forceRedirect:false,httpPort:80}},de={maxConnectionsPerChannel:100,idleTimeout:3e5,reuseStrategy:"lru",healthCheckInterval:6e4,acquireTimeout:5e3,warmupCount:0},me={maxLength:1e4,concurrency:100,batchSize:10,batchTimeout:100,priorityLevels:4},ye={failureThreshold:5,successThreshold:3,timeout:3e4,halfOpenDuration:15e3},be={heartbeatInterval:3e4,heartbeatTimeout:9e4,heartbeatCheckInterval:1e4,autoDeregisterTimeout:3e5,maxAgents:100,maxRegistrations:1e3},Se={sessionTimeout:18e5,resumeGracePeriod:3e5,maxSessions:1e4},we={enabled:true,botToken:"",maxConnections:100,timeout:3e4},Ae={enabled:true,botToken:"",maxConnections:100,timeout:3e4},xe={enabled:true,appId:"",appSecret:"",maxConnections:100,timeout:3e4},ve={enabled:true,mode:"official",appId:"",appSecret:"",maxConnections:100,timeout:3e4},Te={enabled:true,path:"/ws",heartbeatInterval:3e4,connectionTimeout:6e4,maxConnections:1e3,cors:true},Ge={enabled:true,serviceUrl:"https://chat.signal.org",phoneNumber:"",maxConnections:100,timeout:3e4},Pe={enabled:true,relays:[],maxConnections:100,timeout:3e4},p,h=null;async function Q(t){try{if(!fs.existsSync(t))return null;let n=await he__default.default.readFile(t,"utf-8"),o=n,s=!1,a=!1,r=[];for(let i=0;i<n.length;i++){let l=n[i];if(a){r.push(l),a=!1;continue}if(l==="\\"){r.push(l),a=!0;continue}if(l==='"'){s=!s,r.push(l);continue}if(!s&&l==="/"&&n[i+1]==="/"){for(;i<n.length&&n[i]!==`
2
+ `&&n[i]!=="\r";)i++;continue}if(!s&&l==="/"&&n[i+1]==="*"){for(i+=2;i<n.length-1;){if(n[i]==="*"&&n[i+1]==="/"){i+=2;break}i++;}continue}r.push(l);}return o=r.join("").trim(),o?JSON.parse(o):null}catch(n){return g.debug("Failed to load config file",{file:t,error:String(n)}),null}}function C(t,n){let o={...t,...n};return (t.server||n.server)&&(o.server={...t.server,...n.server}),(t.channels||n.channels)&&(o.channels={...t.channels,...n.channels}),o}async function ke(){let t=M(),n=F(),o=[],s=L__default.default.join(t.Path.config);o.push(s),o.push(n.directory);try{let{Filesystem:r}=await import('@easbot/utils'),i=await Array.fromAsync(r.up({targets:[".easbot"],start:n.directory,stop:n.worktree}));o.push(...i);}catch{g.debug("Filesystem utils not available, using basic directories");}let a=process.env.EASBOT_CONFIG_DIR;return a&&(o.push(a),g.debug("Using EASBOT_CONFIG_DIR",{path:a})),[...new Set(o)]}async function Ie(t){let n=["gateway.json"],o={};for(let s of n){let a=L__default.default.join(t,s),r=await Q(a);if(r)if("gateway"in r&&r.gateway){let i=r.gateway;"server"in i||"channels"in i||"cluster"in i?o=C(o,i):o=C(o,{server:i}),g.debug("Loaded gateway config from file (nested format)",{file:a});}else "gateway"in r||(o=C(o,r),g.debug("Loaded gateway config from file (direct format)",{file:a}));}return o}async function Ne(t){let n=["easbot.json"];for(let o of n){let s=L__default.default.join(t,o),a=await Q(s);if(a?.gateway)return g.debug("Loaded gateway config from easbot.json",{file:s}),a.gateway}return {}}function Ee(){return p||(p=async()=>{let t=await ke(),n={};for(let s of t){let a=await Ie(s);n=C(n,a);let r=await Ne(s);n=C(n,r);}let o=E(n);return h=o,g.info("Gateway config loaded",{directories:t.length,port:o.server?.port,logLevel:o.logLevel}),{config:o,directories:t}}),p}async function c(){return Ee()()}async function U(t){return t&&(p=void 0,h=null),(await c()).config}function W(){return h}function H(){return h!==null}function X(){p=void 0,h=null,g.debug("Config cache cleared");}function Z(){return F().directory}async function ee(){let{config:t}=await c();return I.parse({...z,...t.server})}async function te(t){let{config:n}=await c(),o=n.channels?.[t],a={telegram:m.parse(we),slack:y.parse(Ae),feishu:b.parse(xe),wechat:S.parse(ve),webchat:w.parse(Te),signal:A.parse(Ge),nostr:x.parse(Pe)}[t];if(!a)throw new Error(`Unknown channel type: ${t}`);return {...a,...o}}async function ne(){let{config:t}=await c();return v.parse({...de,...t.connectionPool})}async function oe(){let{config:t}=await c();return T.parse({...me,...t.messageQueue})}async function ie(){let{config:t}=await c();return G.parse({...ye,...t.circuitBreaker})}async function ae(){let{config:t}=await c();return P.parse({...be,...t.agentRegistry})}async function re(){let{config:t}=await c();return k.parse({...Se,...t.session})}async function se(){let{config:t}=await c();return t.server?.https}async function ce(){let{config:t}=await c();return t.server?.auth}async function le(){let{config:t}=await c();return t.cluster}async function fe(){let{config:t}=await c();return t.defaultAgent}async function B(){let{config:t}=await c();return t.logLevel??"INFO"}exports.A=Z;exports.B=ee;exports.C=te;exports.D=ne;exports.E=oe;exports.F=ie;exports.G=ae;exports.H=re;exports.I=se;exports.J=ce;exports.K=le;exports.L=fe;exports.M=B;exports.N=Ve;exports.O=qe;exports.P=Ye;exports.Q=Je;exports.R=M;exports.S=F;exports.a=m;exports.b=y;exports.c=b;exports.d=S;exports.e=w;exports.f=A;exports.g=x;exports.h=R;exports.i=_;exports.j=O;exports.k=D;exports.l=j;exports.m=v;exports.n=T;exports.o=G;exports.p=P;exports.q=k;exports.r=I;exports.s=d;exports.t=E;exports.u=$;exports.v=z;exports.w=U;exports.x=W;exports.y=H;exports.z=X;
@@ -0,0 +1 @@
1
+ 'use strict';var chunkRR6UFR5U_cjs=require('./chunk-RR6UFR5U.cjs'),chunk5ETPYYQR_cjs=require('./chunk-5ETPYYQR.cjs'),chunkGY3SWWW3_cjs=require('./chunk-GY3SWWW3.cjs');var e=chunk5ETPYYQR_cjs.a.create({service:"gateway"}),s=class a extends Error{constructor(t,w,m){super(t);chunkGY3SWWW3_cjs.a(this,"type");chunkGY3SWWW3_cjs.a(this,"stage");chunkGY3SWWW3_cjs.a(this,"cause");this.type="GatewayInitializationError",this.stage=w,this.cause=m,Error.captureStackTrace&&Error.captureStackTrace(this,a);}};function b(a){let n=["ECONNRESET","EPIPE","ETIMEDOUT","ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","ENETUNREACH"],t=a.code;return n.includes(t??"")}function C(){process.on("unhandledRejection",a=>{let n=a instanceof Error?a:new Error(String(a));b(n)||e.error("unhandled promise rejection",{error:n.message,stack:n.stack});}),process.on("uncaughtException",a=>{b(a)||(e.error("uncaught exception",{error:a.message,stack:a.stack}),process.exit(1));});}exports.a=void 0;(k=>{let a={initialized:false,initPromise:null,directory:".easbot",config:null},n,t={server:null,config:null,initialized:false,status:"stopped"};async function w(o={}){if(a.initialized)return;if(a.initPromise)return a.initPromise;let i={directory:o.directory??".easbot",printLogs:o.printLogs??false,logLevel:o.logLevel??"INFO"};return a.directory=i.directory,a.initPromise=(async()=>{let{Global:c}=await import('./global-NMLJCTEY.cjs');try{await c.init();}catch(r){throw new s("Failed to initialize global directories","global",r instanceof Error?r:void 0)}try{await chunk5ETPYYQR_cjs.a.init({logDir:c.Path.log,print:i.printLogs,level:i.logLevel});}catch(r){throw new s("Failed to initialize log infrastructure","log",r instanceof Error?r:void 0)}try{C();}catch(r){throw new s("Failed to install unhandled exception handlers","server",r instanceof Error?r:void 0)}try{a.config=await chunkRR6UFR5U_cjs.w(i.directory);}catch(r){throw new s("Failed to load gateway configuration","config",r instanceof Error?r:void 0)}a.initialized=true,e.info("gateway runtime initialized",{directory:i.directory,logLevel:i.logLevel});})(),a.initPromise}k.init=w;function m(){return a.initialized}k.isInitialized=m;function S(){return n||(n=async()=>{if(!a.initialized)throw new s("Gateway not initialized. Call init() first.","server");let o=chunkRR6UFR5U_cjs.S(),i=await chunkRR6UFR5U_cjs.w(o.directory);return i.server?.enabled?(t={server:null,config:i,initialized:true,status:"stopped"},e.info("gateway initialized",{port:i.server?.port,hostname:i.server?.hostname}),t):(e.debug("gateway server disabled or not configured"),{server:null,config:i,initialized:true,status:"stopped"})}),n}function d(){return S()()}k.state=d;async function z(){return (await d()).server}k.get=z;async function R(){return (await d()).config?.server?.enabled??false}k.isEnabled=R;async function N(){return (await d()).config}k.config=N;function T(){return t.status}k.getStatus=T;async function h(o){e.debug("Gateway.start: called"),a.initialized||(e.debug("Gateway.start: calling init()"),await w(),e.debug("Gateway.start: init() completed")),e.debug("Gateway.start: calling state()");let i=await d();if(e.debug("Gateway.start: state() completed",{status:i.status}),!(i.config?.server?.enabled??true))throw e.warn("gateway server is disabled"),new Error("Gateway server is disabled");if(t.status==="running"){e.info("gateway server is already running");return}if(t.status==="starting"){e.info("gateway server is starting");return}t.status="starting",e.debug("Gateway.start: status set to starting");try{let r={...i.config?.server,...o};e.debug("gateway start: creating server with config",{port:r.port,hostname:r.hostname,path:r.path,https:r.https?.enabled}),e.debug("Gateway.start: calling createGatewayServer");let g=await P(r);e.debug("Gateway.start: createGatewayServer completed"),e.debug("gateway start: server created, updating state"),t.server=g,t.status="running",t.error=void 0,e.info("gateway server started",{port:r.port,hostname:r.hostname});}catch(r){throw t.status="error",t.error=r instanceof Error?r.message:String(r),e.error("failed to start gateway server",{error:t.error}),r}}k.start=h;async function G(){if(t.status==="stopped"){e.info("gateway server is already stopped");return}if(t.status==="stopping"){e.info("gateway server is stopping");return}t.status="stopping";try{t.server&&await t.server.stop(),t.server=null,t.status="stopped",t.error=void 0,e.info("gateway server stopped");}catch(o){throw t.status="error",t.error=o instanceof Error?o.message:String(o),e.error("failed to stop gateway server",{error:t.error}),o}}k.stop=G;async function I(o){e.info("restarting gateway server"),(t.status==="running"||t.status==="starting")&&await G(),await h(o);}k.restart=I;async function L(){let o=chunkRR6UFR5U_cjs.S(),i=await chunkRR6UFR5U_cjs.w(o.directory);return t.config=i,a.config=i,e.info("gateway config reloaded"),i}k.reloadConfig=L;async function P(o,i){e.debug("createGatewayServer: starting");let{GatewayServer:c}=await import('./server-CPD2KBY7.cjs');e.debug("createGatewayServer: GatewayServer imported");let r=new c(o);e.debug("createGatewayServer: server instance created"),e.debug("createGatewayServer: created server instance, calling start()");let g=i?.startupTimeout??3e4;if(await(async()=>{let l=new Promise((u,x)=>{setTimeout(()=>{x(new Error(`Gateway server startup timeout after ${g}ms`));},g);});try{e.debug("createGatewayServer: calling server.start()"),await Promise.race([r.start(),l]),e.debug("createGatewayServer: server.start() completed");}catch(u){e.error("gateway server start failed, attempting cleanup",{error:u instanceof Error?u.message:String(u)});try{await r.stop();}catch{}throw u}})(),i?.onStarted)try{await i.onStarted(r);}catch(l){e.warn("server started but onStarted callback failed",{error:l instanceof Error?l.message:String(l)});}return e.info("gateway server created and started",{port:o.port,hostname:o.hostname}),r}k.createGatewayServer=P;})(exports.a||(exports.a={}));
@@ -1,2 +1,2 @@
1
- var s={name:"@easbot/gateway",version:"0.2.13",description:"EASBot Gateway - AI Agent Server and Multi-channel Integration Platform - \u652F\u6301 WebSocket\u3001HTTP\u3001Discord\u3001Telegram\u3001Slack \u7B49\u591A\u6E20\u9053\u96C6\u6210",type:"module",main:"dist/index.cjs",module:"dist/index.mjs",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.cjs"},"./package.json":"./package.json"},scripts:{dev:"cross-env NODE_ENV=development tsx src/cli.ts -- start",start:"cross-env NODE_ENV=production node dist/cli.mjs start",build:"tsup --env.NODE_ENV production",test:"vitest","test:run":"vitest run",lint:"biome check .","lint:fix":"biome check --write .","lint:report":"biome check --reporter=summary .",format:"biome format .","format:fix":"biome format --write .","type-check":"tsc --noEmit",clean:"npx rimraf dist node_modules",prepare:"echo norun",prepublishOnly:"pnpm build","publish:npm":"bash scripts/publish.sh","publish:npm:win":"powershell -ExecutionPolicy Bypass -File scripts/publish.ps1"},keywords:["easbot","gateway","server","websocket","http","agent","multi-channel","discord","telegram","slack","feishu","wechat","chat","integration"],author:"houjallen",license:"MIT",repository:{type:"git",url:"https://github.com/houjallen/easbot.git",directory:"packages/gateway"},homepage:"https://github.com/houjallen/easbot/tree/main/packages/gateway#readme",bugs:{url:"https://github.com/houjallen/easbot/issues"},files:["dist","README.md","README.en.md","LICENSE"],dependencies:{"@ai-sdk/provider":"^3.0.10","@ai-sdk/provider-utils":"^4.0.27","@ai-sdk/openai-compatible":"^2.0.47","@ai-sdk/anthropic":"^3.0.76","@easbot/plugin":"workspace:*","@easbot/sdk":"workspace:*","@easbot/types":"workspace:*","@easbot/utils":"workspace:*","@hono/node-server":"^2.0.2","@hono/node-ws":"^1.3.0","@hono/standard-validator":"^0.2.2","@hono/zod-validator":"^0.7.6",commander:"^14.0.3",zod:"^4.4.3",hono:"^4.12.18","hono-openapi":"^1.3.0",ws:"^8.20.0",ai:"^6.0.176","better-sqlite3":"^12.9.0","jieba-wasm":"^2.4.0","xdg-basedir":"^5.1.0",minimatch:"^10.2.5"},devDependencies:{"@biomejs/biome":"^2.4.14","@types/better-sqlite3":"^7.6.13","@types/ws":"^8.18.1","@types/node":"^25.6.2","@vitest/coverage-v8":"^4.1.5",dotenv:"^17.4.2",tsup:"^8.5.1",typescript:"^6.0.3",vitest:"^4.1.5"},engines:{node:">=22.22.3"},publishConfig:{access:"public"}};
1
+ var s={name:"@easbot/gateway",version:"0.2.14",description:"EASBot Gateway - AI Agent Server and Multi-channel Integration Platform - \u652F\u6301 WebSocket\u3001HTTP\u3001Discord\u3001Telegram\u3001Slack \u7B49\u591A\u6E20\u9053\u96C6\u6210",type:"module",main:"dist/index.cjs",module:"dist/index.mjs",types:"dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.mjs",require:"./dist/index.cjs"},"./package.json":"./package.json"},scripts:{dev:"cross-env NODE_ENV=development tsx src/cli.ts -- start",start:"cross-env NODE_ENV=production node dist/cli.mjs start",build:"tsup --env.NODE_ENV production",test:"vitest","test:run":"vitest run",lint:"biome check .","lint:fix":"biome check --write .","lint:report":"biome check --reporter=summary .",format:"biome format .","format:fix":"biome format --write .","type-check":"tsc --noEmit",clean:"npx rimraf dist node_modules",prepare:"echo norun",prepublishOnly:"pnpm build","publish:npm":"bash scripts/publish.sh","publish:npm:win":"powershell -ExecutionPolicy Bypass -File scripts/publish.ps1"},keywords:["easbot","gateway","server","websocket","http","agent","multi-channel","discord","telegram","slack","feishu","wechat","chat","integration"],author:"houjallen",license:"MIT",repository:{type:"git",url:"https://github.com/houjallen/easbot.git",directory:"packages/gateway"},homepage:"https://github.com/houjallen/easbot/tree/main/packages/gateway#readme",bugs:{url:"https://github.com/houjallen/easbot/issues"},files:["dist","README.md","README.en.md","LICENSE"],dependencies:{"@ai-sdk/provider":"^3.0.10","@ai-sdk/provider-utils":"^4.0.27","@ai-sdk/openai-compatible":"^2.0.47","@ai-sdk/anthropic":"^3.0.76","@easbot/plugin":"workspace:*","@easbot/sdk":"workspace:*","@easbot/types":"workspace:*","@easbot/utils":"workspace:*","@hono/node-server":"^2.0.2","@hono/node-ws":"^1.3.0","@hono/standard-validator":"^0.2.2","@hono/zod-validator":"^0.7.6",commander:"^14.0.3",zod:"^4.4.3",hono:"^4.12.18","hono-openapi":"^1.3.0",ws:"^8.20.0",ai:"^6.0.176","better-sqlite3":"^12.9.0","jieba-wasm":"^2.4.0","xdg-basedir":"^5.1.0",minimatch:"^10.2.5"},devDependencies:{"@biomejs/biome":"^2.4.14","@types/better-sqlite3":"^7.6.13","@types/ws":"^8.18.1","@types/node":"^25.6.2","@vitest/coverage-v8":"^4.1.5",dotenv:"^17.4.2",tsup:"^8.5.1",typescript:"^6.0.3",vitest:"^4.1.5"},engines:{node:">=22.22.3"},publishConfig:{access:"public"}};
2
2
  export{s as a};
@@ -1 +1 @@
1
- import {a}from'./chunk-D2ZQ47GV.mjs';import'./chunk-HAMGVOQD.mjs';import {mkdir,readFile,readdir,rm,writeFile}from'fs/promises';import o from'path';import {xdgData,xdgCache,xdgConfig,xdgState}from'xdg-basedir';import w from'os';var s="easbot",c=o.join(xdgData,s),x=o.join(xdgCache,s),H=o.join(xdgConfig,s),N=o.join(xdgState,s),f;(e=>{e.Path={get home(){return process.env.EASBOT_TEST_HOME||w.homedir()},data:c,bin:o.join(c,"bin"),log:o.join(c,"log"),cache:x,config:H,state:N};let t=null,n=null;async function P(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{let r=await import('./package-JLVEIYME.mjs');t=r.default?.version||r.version||"local";}catch{t="local";}return t||"local"}function A(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=a.version||"local";}catch{t="local";}return t||"local"}e.getVersion=A;function l(){if(n)return n;if(process.env.EASBOT_CHANNEL)return n=process.env.EASBOT_CHANNEL,n;let r=A();return r==="local"||r.includes("dev")?n="local":r.includes("beta")||r.includes("alpha")?n="preview":n="latest",n||"local"}e.getChannel=l;function y(){return l()==="local"}e.isLocal=y;function C(){return l()==="preview"}e.isPreview=C;let u=false,a$1=null;async function V(){if(!u)return a$1||(a$1=(async()=>{await P(),await Promise.all([mkdir(e.Path.data,{recursive:true}),mkdir(e.Path.config,{recursive:true}),mkdir(e.Path.state,{recursive:true}),mkdir(e.Path.log,{recursive:true}),mkdir(e.Path.bin,{recursive:true}),mkdir(e.Path.cache,{recursive:true})]).then(()=>{process.env.EASBOT_DATA_PATH=e.Path.data,process.env.EASBOT_CONFIG_PATH=e.Path.config,process.env.EASBOT_STATE_PATH=e.Path.state,process.env.EASBOT_LOG_PATH=e.Path.log,process.env.EASBOT_BIN_PATH=e.Path.bin,process.env.EASBOT_CACHE_PATH=e.Path.cache;});let r="1",h=o.join(e.Path.cache,"version");if(await readFile(h,"utf-8").catch(()=>"0")!==r){try{let p=await readdir(e.Path.cache);await Promise.all(p.map(E=>rm(o.join(e.Path.cache,E),{recursive:!0,force:!0})));}catch{}await writeFile(h,r);}u=true;})(),a$1)}e.init=V;})(f||(f={}));export{f as Global};
1
+ import {a}from'./chunk-X2DH5PDZ.mjs';import'./chunk-HAMGVOQD.mjs';import {mkdir,readFile,readdir,rm,writeFile}from'fs/promises';import o from'path';import {xdgData,xdgCache,xdgConfig,xdgState}from'xdg-basedir';import w from'os';var s="easbot",c=o.join(xdgData,s),x=o.join(xdgCache,s),H=o.join(xdgConfig,s),N=o.join(xdgState,s),f;(e=>{e.Path={get home(){return process.env.EASBOT_TEST_HOME||w.homedir()},data:c,bin:o.join(c,"bin"),log:o.join(c,"log"),cache:x,config:H,state:N};let t=null,n=null;async function P(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{let r=await import('./package-JSK7ZEYD.mjs');t=r.default?.version||r.version||"local";}catch{t="local";}return t||"local"}function A(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=a.version||"local";}catch{t="local";}return t||"local"}e.getVersion=A;function l(){if(n)return n;if(process.env.EASBOT_CHANNEL)return n=process.env.EASBOT_CHANNEL,n;let r=A();return r==="local"||r.includes("dev")?n="local":r.includes("beta")||r.includes("alpha")?n="preview":n="latest",n||"local"}e.getChannel=l;function y(){return l()==="local"}e.isLocal=y;function C(){return l()==="preview"}e.isPreview=C;let u=false,a$1=null;async function V(){if(!u)return a$1||(a$1=(async()=>{await P(),await Promise.all([mkdir(e.Path.data,{recursive:true}),mkdir(e.Path.config,{recursive:true}),mkdir(e.Path.state,{recursive:true}),mkdir(e.Path.log,{recursive:true}),mkdir(e.Path.bin,{recursive:true}),mkdir(e.Path.cache,{recursive:true})]).then(()=>{process.env.EASBOT_DATA_PATH=e.Path.data,process.env.EASBOT_CONFIG_PATH=e.Path.config,process.env.EASBOT_STATE_PATH=e.Path.state,process.env.EASBOT_LOG_PATH=e.Path.log,process.env.EASBOT_BIN_PATH=e.Path.bin,process.env.EASBOT_CACHE_PATH=e.Path.cache;});let r="1",h=o.join(e.Path.cache,"version");if(await readFile(h,"utf-8").catch(()=>"0")!==r){try{let p=await readdir(e.Path.cache);await Promise.all(p.map(E=>rm(o.join(e.Path.cache,E),{recursive:!0,force:!0})));}catch{}await writeFile(h,r);}u=true;})(),a$1)}e.init=V;})(f||(f={}));export{f as Global};
@@ -1 +1 @@
1
- 'use strict';var chunkPBDA3HG4_cjs=require('./chunk-PBDA3HG4.cjs');require('./chunk-GY3SWWW3.cjs');var promises=require('fs/promises'),o=require('path'),xdgBasedir=require('xdg-basedir'),w=require('os');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var o__default=/*#__PURE__*/_interopDefault(o);var w__default=/*#__PURE__*/_interopDefault(w);var s="easbot",c=o__default.default.join(xdgBasedir.xdgData,s),x=o__default.default.join(xdgBasedir.xdgCache,s),H=o__default.default.join(xdgBasedir.xdgConfig,s),N=o__default.default.join(xdgBasedir.xdgState,s);exports.Global=void 0;(e=>{e.Path={get home(){return process.env.EASBOT_TEST_HOME||w__default.default.homedir()},data:c,bin:o__default.default.join(c,"bin"),log:o__default.default.join(c,"log"),cache:x,config:H,state:N};let t=null,n=null;async function P(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{let r=await import('./package-RO6UIPH6.cjs');t=r.default?.version||r.version||"local";}catch{t="local";}return t||"local"}function A(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=chunkPBDA3HG4_cjs.a.version||"local";}catch{t="local";}return t||"local"}e.getVersion=A;function l(){if(n)return n;if(process.env.EASBOT_CHANNEL)return n=process.env.EASBOT_CHANNEL,n;let r=A();return r==="local"||r.includes("dev")?n="local":r.includes("beta")||r.includes("alpha")?n="preview":n="latest",n||"local"}e.getChannel=l;function y(){return l()==="local"}e.isLocal=y;function C(){return l()==="preview"}e.isPreview=C;let u=false,a=null;async function V(){if(!u)return a||(a=(async()=>{await P(),await Promise.all([promises.mkdir(e.Path.data,{recursive:true}),promises.mkdir(e.Path.config,{recursive:true}),promises.mkdir(e.Path.state,{recursive:true}),promises.mkdir(e.Path.log,{recursive:true}),promises.mkdir(e.Path.bin,{recursive:true}),promises.mkdir(e.Path.cache,{recursive:true})]).then(()=>{process.env.EASBOT_DATA_PATH=e.Path.data,process.env.EASBOT_CONFIG_PATH=e.Path.config,process.env.EASBOT_STATE_PATH=e.Path.state,process.env.EASBOT_LOG_PATH=e.Path.log,process.env.EASBOT_BIN_PATH=e.Path.bin,process.env.EASBOT_CACHE_PATH=e.Path.cache;});let r="1",h=o__default.default.join(e.Path.cache,"version");if(await promises.readFile(h,"utf-8").catch(()=>"0")!==r){try{let p=await promises.readdir(e.Path.cache);await Promise.all(p.map(E=>promises.rm(o__default.default.join(e.Path.cache,E),{recursive:!0,force:!0})));}catch{}await promises.writeFile(h,r);}u=true;})(),a)}e.init=V;})(exports.Global||(exports.Global={}));
1
+ 'use strict';var chunk72MPR4K5_cjs=require('./chunk-72MPR4K5.cjs');require('./chunk-GY3SWWW3.cjs');var promises=require('fs/promises'),o=require('path'),xdgBasedir=require('xdg-basedir'),w=require('os');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var o__default=/*#__PURE__*/_interopDefault(o);var w__default=/*#__PURE__*/_interopDefault(w);var s="easbot",c=o__default.default.join(xdgBasedir.xdgData,s),x=o__default.default.join(xdgBasedir.xdgCache,s),H=o__default.default.join(xdgBasedir.xdgConfig,s),N=o__default.default.join(xdgBasedir.xdgState,s);exports.Global=void 0;(e=>{e.Path={get home(){return process.env.EASBOT_TEST_HOME||w__default.default.homedir()},data:c,bin:o__default.default.join(c,"bin"),log:o__default.default.join(c,"log"),cache:x,config:H,state:N};let t=null,n=null;async function P(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{let r=await import('./package-DXSVCCMB.cjs');t=r.default?.version||r.version||"local";}catch{t="local";}return t||"local"}function A(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=chunk72MPR4K5_cjs.a.version||"local";}catch{t="local";}return t||"local"}e.getVersion=A;function l(){if(n)return n;if(process.env.EASBOT_CHANNEL)return n=process.env.EASBOT_CHANNEL,n;let r=A();return r==="local"||r.includes("dev")?n="local":r.includes("beta")||r.includes("alpha")?n="preview":n="latest",n||"local"}e.getChannel=l;function y(){return l()==="local"}e.isLocal=y;function C(){return l()==="preview"}e.isPreview=C;let u=false,a=null;async function V(){if(!u)return a||(a=(async()=>{await P(),await Promise.all([promises.mkdir(e.Path.data,{recursive:true}),promises.mkdir(e.Path.config,{recursive:true}),promises.mkdir(e.Path.state,{recursive:true}),promises.mkdir(e.Path.log,{recursive:true}),promises.mkdir(e.Path.bin,{recursive:true}),promises.mkdir(e.Path.cache,{recursive:true})]).then(()=>{process.env.EASBOT_DATA_PATH=e.Path.data,process.env.EASBOT_CONFIG_PATH=e.Path.config,process.env.EASBOT_STATE_PATH=e.Path.state,process.env.EASBOT_LOG_PATH=e.Path.log,process.env.EASBOT_BIN_PATH=e.Path.bin,process.env.EASBOT_CACHE_PATH=e.Path.cache;});let r="1",h=o__default.default.join(e.Path.cache,"version");if(await promises.readFile(h,"utf-8").catch(()=>"0")!==r){try{let p=await promises.readdir(e.Path.cache);await Promise.all(p.map(E=>promises.rm(o__default.default.join(e.Path.cache,E),{recursive:!0,force:!0})));}catch{}await promises.writeFile(h,r);}u=true;})(),a)}e.init=V;})(exports.Global||(exports.Global={}));
@@ -0,0 +1 @@
1
+ 'use strict';var chunk72MPR4K5_cjs=require('./chunk-72MPR4K5.cjs');require('./chunk-GY3SWWW3.cjs');module.exports=chunk72MPR4K5_cjs.a;
@@ -0,0 +1 @@
1
+ export{a as default}from'./chunk-X2DH5PDZ.mjs';import'./chunk-HAMGVOQD.mjs';
@@ -0,0 +1 @@
1
+ 'use strict';var chunkASIAS35P_cjs=require('./chunk-ASIAS35P.cjs');require('./chunk-RR6UFR5U.cjs'),require('./chunk-5ETPYYQR.cjs'),require('./chunk-GY3SWWW3.cjs');Object.defineProperty(exports,"ChannelPluginLoader",{enumerable:true,get:function(){return chunkASIAS35P_cjs.q}});Object.defineProperty(exports,"GatewayServer",{enumerable:true,get:function(){return chunkASIAS35P_cjs.s}});Object.defineProperty(exports,"GatewayWebSocketServer",{enumerable:true,get:function(){return chunkASIAS35P_cjs.r}});
@@ -0,0 +1 @@
1
+ export{q as ChannelPluginLoader,s as GatewayServer,r as GatewayWebSocketServer}from'./chunk-DJTIL3AB.mjs';import'./chunk-77F43CRD.mjs';import'./chunk-6TRL3CVJ.mjs';import'./chunk-HAMGVOQD.mjs';
package/dist/cli.cjs CHANGED
@@ -1,5 +1,5 @@
1
- 'use strict';var chunkOSNL6MAL_cjs=require('./chunks/chunk-OSNL6MAL.cjs'),chunkEK6MKXZH_cjs=require('./chunks/chunk-EK6MKXZH.cjs'),chunk5ETPYYQR_cjs=require('./chunks/chunk-5ETPYYQR.cjs');require('./chunks/chunk-GY3SWWW3.cjs');var commander=require('commander'),utils=require('@easbot/utils');var R={languages:[{value:"zh-CN",name:"\u7B80\u4F53\u4E2D\u6587",example:"\u4F60\u597D\uFF0CEASBOT\uFF01",supported:true},{value:"en-US",name:"English (United States)",example:"Hello, EASBOT!",supported:true}]};var A=R.languages,M=A.filter(t=>t.supported).map(t=>t.value),d={defaultLocale:"zh-CN",locales:M},m={},f=(t,e)=>{let o=m[t]||{translation:{}};return m[t]={translation:{...o.translation,...e.translation}},m[t]},y=(t=d.defaultLocale)=>(m[t]||f(t,{translation:{}}),{locale:t,resources:m[t]||{translation:{}}});var U={translation:{"cli.startup.title":"Gateway WebSocket \u670D\u52A1\u5DF2\u542F\u52A8","cli.startup.status":"\u72B6\u6001","cli.startup.port":"\u7AEF\u53E3","cli.startup.hostname":"\u4E3B\u673A\u5730\u5740","cli.startup.protocol":"\u534F\u8BAE","cli.startup.connections":"\u8FDE\u63A5\u6570","cli.startup.running":"\u8FD0\u884C\u4E2D","cli.startup.stopped":"\u5DF2\u505C\u6B62","cli.startup.mode":"\u6A21\u5F0F","cli.startup.mode_standalone":"\u72EC\u7ACB\u6A21\u5F0F","cli.startup.mode_integrated":"\u96C6\u6210\u6A21\u5F0F","cli.status.title":"Gateway WebSocket \u670D\u52A1\u72B6\u6001","cli.stop.title":"Gateway WebSocket \u670D\u52A1\u5DF2\u505C\u6B62","cli.already_running":"Gateway \u670D\u52A1\u5DF2\u5728\u8FD0\u884C\u4E2D","cli.already_stopped":"Gateway \u670D\u52A1\u5DF2\u505C\u6B62","cli.shutdown_signal":"\u6536\u5230 {{signal}}\uFF0C\u6B63\u5728\u4F18\u96C5\u5173\u95ED...","cli.shutdown_success":"Gateway \u670D\u52A1\u5DF2\u6210\u529F\u505C\u6B62","cli.unknown_command":"\u672A\u77E5\u547D\u4EE4: {{command}}","cli.error.start_failed":"\u542F\u52A8 Gateway \u5931\u8D25","cli.error.stop_failed":"\u505C\u6B62 Gateway \u5931\u8D25","cli.error.restart_failed":"\u91CD\u542F Gateway \u5931\u8D25","cli.error.status_failed":"\u83B7\u53D6 Gateway \u72B6\u6001\u5931\u8D25","cli.error.shutdown":"\u5173\u95ED\u65F6\u53D1\u751F\u9519\u8BEF","cli.error.execution_failed":"CLI \u6267\u884C\u5931\u8D25","cli.error.detail":"\u9519\u8BEF\u8BE6\u60C5:","cli.command.start.desc":"\u542F\u52A8 Gateway WebSocket \u670D\u52A1","cli.command.stop.desc":"\u505C\u6B62 Gateway \u670D\u52A1","cli.command.restart.desc":"\u91CD\u542F Gateway \u670D\u52A1","cli.command.status.desc":"\u67E5\u770B Gateway \u670D\u52A1\u72B6\u6001","cli.option.directory":"\u5DE5\u4F5C\u76EE\u5F55","cli.option.port":"\u670D\u52A1\u7AEF\u53E3","cli.option.hostname":"\u4E3B\u673A\u5730\u5740","cli.option.debug":"\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F","cli.help.command":"\u663E\u793A\u5E2E\u52A9\u4FE1\u606F","cli.program.description":"Gateway WebSocket \u670D\u52A1\u7BA1\u7406 CLI","cli.examples.title":"\u793A\u4F8B","cli.example.start":"\u542F\u52A8\u670D\u52A1","cli.example.stop":"\u505C\u6B62\u670D\u52A1","cli.example.restart":"\u91CD\u542F\u670D\u52A1","cli.example.hostname":"\u6307\u5B9A\u76D1\u542C\u5730\u5740"}},T=U;var H={translation:{"cli.startup.title":"Gateway WebSocket Server Started","cli.startup.status":"Status","cli.startup.port":"Port","cli.startup.hostname":"Hostname","cli.startup.protocol":"Protocol","cli.startup.connections":"Connections","cli.startup.running":"Running","cli.startup.stopped":"Stopped","cli.startup.mode":"Mode","cli.startup.mode_standalone":"Standalone","cli.startup.mode_integrated":"Integrated","cli.status.title":"Gateway WebSocket Server Status","cli.stop.title":"Gateway WebSocket Server Stopped","cli.already_running":"Gateway server is already running.","cli.already_stopped":"Gateway server is already stopped.","cli.shutdown_signal":"Received {{signal}}, shutting down gracefully...","cli.shutdown_success":"Gateway stopped successfully.","cli.unknown_command":"Unknown command: {{command}}","cli.error.start_failed":"Failed to start gateway","cli.error.stop_failed":"Failed to stop gateway","cli.error.restart_failed":"Failed to restart gateway","cli.error.status_failed":"Failed to get gateway status","cli.error.shutdown":"Error during shutdown","cli.error.execution_failed":"CLI failed to execute","cli.error.detail":"Error detail:","cli.command.start.desc":"Start Gateway WebSocket service","cli.command.stop.desc":"Stop Gateway service","cli.command.restart.desc":"Restart Gateway service","cli.command.status.desc":"Check Gateway service status","cli.option.directory":"Working directory","cli.option.port":"Service port","cli.option.hostname":"Host address","cli.option.debug":"Enable debug mode","cli.help.command":"Display help information","cli.program.description":"Gateway WebSocket service management CLI","cli.examples.title":"Examples","cli.example.start":"Start service","cli.example.stop":"Stop service","cli.example.restart":"Restart service","cli.example.hostname":"Specify listening address"}},G=H;var z=()=>{y("zh-CN"),y("en-US"),f("zh-CN",T),f("en-US",G);};z();var S=new Map;var v=new Map;var D=t=>{if(v.has(t))return v.get(t);let e=/{{\s*(\w+)\s*}}/g,o=[],a;for(;(a=e.exec(t))!==null;){let l=a[1];l&&!o.includes(l)&&o.push(l);}let p=new RegExp("{{\\s*("+o.join("|")+")\\s*}}","g"),n={keys:o,regex:p};return v.set(t,n),n},_=(t,e)=>{if(!t||typeof t!="string")return "";if(!e||Object.keys(e).length===0)return t;let{regex:o,keys:a}=D(t);return a.length===0||!a.some(n=>n in e)?t:t.replace(o,(n,l)=>{let u=e[l];return u==null?"":String(u)})},X=t=>t&&d.locales.includes(t)?t:d.defaultLocale,I=t=>{if(!S.has(t)){let{resources:e}=y(t);S.set(t,e);}return S.get(t)},K=(t,e={})=>{let o=X(e.locale),p=I(o)?.translation[t];if(p&&typeof p=="string"){let n=_(p,e.vars);return n!=null?String(n):String(t)}if(o!==d.defaultLocale){let l=I(d.defaultLocale)?.translation[t];if(l&&typeof l=="string"){let u=_(l,e.vars);return u!=null?String(u):String(t)}}return String(e.fallback??t)},r=K;var i=chunk5ETPYYQR_cjs.a.create({service:"cli-gateway"}),w=58,C="\u2551",O="\u2554",k="\u255A",N="\u2560",L="\u2550";function Z(t,e=w){let o=e-t.length;return o<=0?t:t+" ".repeat(o)}function s(t){console.log(`${C} ${Z(t)} ${C}`);}function $(){console.log(`${O}${L.repeat(w)}${O.replace("\u2554","\u2557")}`);}function B(){console.log(`${N}${L.repeat(w)}${N.replace("\u2560","\u2563")}`);}function E(){console.log(`${k}${L.repeat(w)}${k.replace("\u255A","\u255D")}`);}function P(t){console.log(""),$(),s(r("cli.startup.title")),B(),s(`${r("cli.startup.status")}: ${r("cli.startup.running").padEnd(37-r("cli.startup.status").length)}`),s(`${r("cli.startup.port")}: ${String(t.port).padEnd(37-r("cli.startup.port").length)}`),s(`${r("cli.startup.hostname")}: ${t.hostname.padEnd(37-r("cli.startup.hostname").length)}`),s(`${r("cli.startup.protocol")}: ws${" ".repeat(32)}`),t.connections!==void 0&&s(`${r("cli.startup.connections")}:${String(t.connections).padEnd(37-r("cli.startup.connections").length)}`),s(`${r("cli.startup.mode")}: ${(t.mode==="standalone"?r("cli.startup.mode_standalone"):r("cli.startup.mode_integrated")).padEnd(37-r("cli.startup.mode").length)}`),E(),console.log("");}function q(){console.log(""),$(),s(r("cli.stop.title")),E(),console.log("");}async function Q(){try{let t=chunkOSNL6MAL_cjs.a.getStatus(),o=(await chunkOSNL6MAL_cjs.a.get())?.getStatus();console.log(""),$(),s(r("cli.status.title")),B(),s(`${r("cli.startup.status")}: ${t.toUpperCase().padEnd(37-r("cli.startup.status").length)}`),o&&(s(`${r("cli.startup.port")}: ${String(o.port).padEnd(37-r("cli.startup.port").length)}`),s(`${r("cli.startup.hostname")}: ${(o.hostname||"localhost").padEnd(37-r("cli.startup.hostname").length)}`),s(`${r("cli.startup.connections")}:${String(o.connections||0).padEnd(37-r("cli.startup.connections").length)}`)),E(),console.log("");}catch(t){i.error("Failed to get gateway status",{error:t instanceof Error?t.message:String(t)}),console.error(`${r("cli.error.status_failed")}: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}}async function V(t){let e=t.directory||process.cwd();i.info("Starting gateway service",{port:t.port,hostname:t.hostname,directory:e});try{if(await chunkOSNL6MAL_cjs.a.init({directory:e,printLogs:t.debug,logLevel:t.debug?"DEBUG":"INFO"}),chunkOSNL6MAL_cjs.a.getStatus()==="running"){console.log(r("cli.already_running"));return}let a={};t.port&&(a.port=t.port),t.hostname&&(a.hostname=t.hostname),await chunkOSNL6MAL_cjs.a.start(a);let n=(await chunkOSNL6MAL_cjs.a.get())?.getStatus();P({port:n?.port||t.port||8080,hostname:n?.hostname||t.hostname||"localhost",connections:n?.connections||0,mode:chunkEK6MKXZH_cjs.P()?"integrated":"standalone"}),W();}catch(o){i.error("Failed to start gateway",{error:o instanceof Error?o.message:String(o)}),console.error(`${r("cli.error.start_failed")}: ${o instanceof Error?o.message:String(o)}`),process.exit(1);}}async function Y(){i.info("Stopping gateway service");try{if(chunkOSNL6MAL_cjs.a.getStatus()==="stopped"){console.log(r("cli.already_stopped"));return}await chunkOSNL6MAL_cjs.a.stop(),q(),i.info("Gateway stopped successfully");}catch(t){i.error("Failed to stop gateway",{error:t instanceof Error?t.message:String(t)}),console.error(`${r("cli.error.stop_failed")}: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}}async function tt(t){i.info("Restarting gateway service");try{let e={};t.port&&(e.port=t.port),t.hostname&&(e.hostname=t.hostname),await chunkOSNL6MAL_cjs.a.restart(e);let a=(await chunkOSNL6MAL_cjs.a.get())?.getStatus();P({port:a?.port||t.port||8080,hostname:a?.hostname||t.hostname||"localhost",connections:a?.connections||0,mode:chunkEK6MKXZH_cjs.P()?"integrated":"standalone"}),W(),i.info("Gateway restarted successfully");}catch(e){i.error("Failed to restart gateway",{error:e instanceof Error?e.message:String(e)}),console.error(`${r("cli.error.restart_failed")}: ${e instanceof Error?e.message:String(e)}`),process.exit(1);}}function W(){let t=async e=>{i.debug(`Received ${e}, shutting down gracefully...`),console.log(`
2
- ${r("cli.shutdown_signal",{vars:{signal:e}})}`);try{await chunkOSNL6MAL_cjs.a.stop(),i.debug("Gateway stopped"),console.log(r("cli.shutdown_success"));}catch(o){i.error("Error during shutdown",{error:o instanceof Error?o.message:String(o)});}process.exit(0);};process.on("SIGINT",()=>{t("SIGINT").catch(console.error);}),process.on("SIGTERM",()=>{t("SIGTERM").catch(console.error);});}async function h(t,e){switch(t){case "start":await V(e);break;case "stop":await Y();break;case "restart":await tt(e);break;case "status":await Q();break;default:console.error(r("cli.unknown_command",{vars:{command:t}})),process.exit(1);}}function et(t){t.command("start").description(r("cli.command.start.desc")).option("-D, --directory <path>",r("cli.option.directory")).option("-p, --port <number>",r("cli.option.port"),e=>parseInt(e,10)).option("-H, --hostname <address>",r("cli.option.hostname")).option("-d, --debug",r("cli.option.debug"),false).action(async e=>{await h("start",{directory:e.directory,port:e.port,hostname:e.hostname,debug:e.debug});}),t.command("stop").description(r("cli.command.stop.desc")).action(async()=>{await h("stop",{});}),t.command("restart").description(r("cli.command.restart.desc")).option("-D, --directory <path>",r("cli.option.directory")).option("-p, --port <number>",r("cli.option.port"),e=>parseInt(e,10)).option("-H, --hostname <address>",r("cli.option.hostname")).option("-d, --debug",r("cli.option.debug"),false).action(async e=>{await h("restart",{directory:e.directory,port:e.port,hostname:e.hostname,debug:e.debug});}),t.command("status").description(r("cli.command.status.desc")).action(async()=>{await h("status",{});}),t.addHelpCommand("help",r("cli.help.command")).addHelpText("after",`
1
+ 'use strict';var chunkULWP4SK3_cjs=require('./chunks/chunk-ULWP4SK3.cjs'),chunkRR6UFR5U_cjs=require('./chunks/chunk-RR6UFR5U.cjs'),chunk5ETPYYQR_cjs=require('./chunks/chunk-5ETPYYQR.cjs');require('./chunks/chunk-GY3SWWW3.cjs');var commander=require('commander'),utils=require('@easbot/utils');var R={languages:[{value:"zh-CN",name:"\u7B80\u4F53\u4E2D\u6587",example:"\u4F60\u597D\uFF0CEASBOT\uFF01",supported:true},{value:"en-US",name:"English (United States)",example:"Hello, EASBOT!",supported:true}]};var A=R.languages,M=A.filter(t=>t.supported).map(t=>t.value),d={defaultLocale:"zh-CN",locales:M},m={},f=(t,e)=>{let o=m[t]||{translation:{}};return m[t]={translation:{...o.translation,...e.translation}},m[t]},y=(t=d.defaultLocale)=>(m[t]||f(t,{translation:{}}),{locale:t,resources:m[t]||{translation:{}}});var U={translation:{"cli.startup.title":"Gateway WebSocket \u670D\u52A1\u5DF2\u542F\u52A8","cli.startup.status":"\u72B6\u6001","cli.startup.port":"\u7AEF\u53E3","cli.startup.hostname":"\u4E3B\u673A\u5730\u5740","cli.startup.protocol":"\u534F\u8BAE","cli.startup.connections":"\u8FDE\u63A5\u6570","cli.startup.running":"\u8FD0\u884C\u4E2D","cli.startup.stopped":"\u5DF2\u505C\u6B62","cli.startup.mode":"\u6A21\u5F0F","cli.startup.mode_standalone":"\u72EC\u7ACB\u6A21\u5F0F","cli.startup.mode_integrated":"\u96C6\u6210\u6A21\u5F0F","cli.status.title":"Gateway WebSocket \u670D\u52A1\u72B6\u6001","cli.stop.title":"Gateway WebSocket \u670D\u52A1\u5DF2\u505C\u6B62","cli.already_running":"Gateway \u670D\u52A1\u5DF2\u5728\u8FD0\u884C\u4E2D","cli.already_stopped":"Gateway \u670D\u52A1\u5DF2\u505C\u6B62","cli.shutdown_signal":"\u6536\u5230 {{signal}}\uFF0C\u6B63\u5728\u4F18\u96C5\u5173\u95ED...","cli.shutdown_success":"Gateway \u670D\u52A1\u5DF2\u6210\u529F\u505C\u6B62","cli.unknown_command":"\u672A\u77E5\u547D\u4EE4: {{command}}","cli.error.start_failed":"\u542F\u52A8 Gateway \u5931\u8D25","cli.error.stop_failed":"\u505C\u6B62 Gateway \u5931\u8D25","cli.error.restart_failed":"\u91CD\u542F Gateway \u5931\u8D25","cli.error.status_failed":"\u83B7\u53D6 Gateway \u72B6\u6001\u5931\u8D25","cli.error.shutdown":"\u5173\u95ED\u65F6\u53D1\u751F\u9519\u8BEF","cli.error.execution_failed":"CLI \u6267\u884C\u5931\u8D25","cli.error.detail":"\u9519\u8BEF\u8BE6\u60C5:","cli.command.start.desc":"\u542F\u52A8 Gateway WebSocket \u670D\u52A1","cli.command.stop.desc":"\u505C\u6B62 Gateway \u670D\u52A1","cli.command.restart.desc":"\u91CD\u542F Gateway \u670D\u52A1","cli.command.status.desc":"\u67E5\u770B Gateway \u670D\u52A1\u72B6\u6001","cli.option.directory":"\u5DE5\u4F5C\u76EE\u5F55","cli.option.port":"\u670D\u52A1\u7AEF\u53E3","cli.option.hostname":"\u4E3B\u673A\u5730\u5740","cli.option.debug":"\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F","cli.help.command":"\u663E\u793A\u5E2E\u52A9\u4FE1\u606F","cli.program.description":"Gateway WebSocket \u670D\u52A1\u7BA1\u7406 CLI","cli.examples.title":"\u793A\u4F8B","cli.example.start":"\u542F\u52A8\u670D\u52A1","cli.example.stop":"\u505C\u6B62\u670D\u52A1","cli.example.restart":"\u91CD\u542F\u670D\u52A1","cli.example.hostname":"\u6307\u5B9A\u76D1\u542C\u5730\u5740"}},T=U;var H={translation:{"cli.startup.title":"Gateway WebSocket Server Started","cli.startup.status":"Status","cli.startup.port":"Port","cli.startup.hostname":"Hostname","cli.startup.protocol":"Protocol","cli.startup.connections":"Connections","cli.startup.running":"Running","cli.startup.stopped":"Stopped","cli.startup.mode":"Mode","cli.startup.mode_standalone":"Standalone","cli.startup.mode_integrated":"Integrated","cli.status.title":"Gateway WebSocket Server Status","cli.stop.title":"Gateway WebSocket Server Stopped","cli.already_running":"Gateway server is already running.","cli.already_stopped":"Gateway server is already stopped.","cli.shutdown_signal":"Received {{signal}}, shutting down gracefully...","cli.shutdown_success":"Gateway stopped successfully.","cli.unknown_command":"Unknown command: {{command}}","cli.error.start_failed":"Failed to start gateway","cli.error.stop_failed":"Failed to stop gateway","cli.error.restart_failed":"Failed to restart gateway","cli.error.status_failed":"Failed to get gateway status","cli.error.shutdown":"Error during shutdown","cli.error.execution_failed":"CLI failed to execute","cli.error.detail":"Error detail:","cli.command.start.desc":"Start Gateway WebSocket service","cli.command.stop.desc":"Stop Gateway service","cli.command.restart.desc":"Restart Gateway service","cli.command.status.desc":"Check Gateway service status","cli.option.directory":"Working directory","cli.option.port":"Service port","cli.option.hostname":"Host address","cli.option.debug":"Enable debug mode","cli.help.command":"Display help information","cli.program.description":"Gateway WebSocket service management CLI","cli.examples.title":"Examples","cli.example.start":"Start service","cli.example.stop":"Stop service","cli.example.restart":"Restart service","cli.example.hostname":"Specify listening address"}},G=H;var z=()=>{y("zh-CN"),y("en-US"),f("zh-CN",T),f("en-US",G);};z();var S=new Map;var v=new Map;var D=t=>{if(v.has(t))return v.get(t);let e=/{{\s*(\w+)\s*}}/g,o=[],a;for(;(a=e.exec(t))!==null;){let l=a[1];l&&!o.includes(l)&&o.push(l);}let p=new RegExp("{{\\s*("+o.join("|")+")\\s*}}","g"),n={keys:o,regex:p};return v.set(t,n),n},_=(t,e)=>{if(!t||typeof t!="string")return "";if(!e||Object.keys(e).length===0)return t;let{regex:o,keys:a}=D(t);return a.length===0||!a.some(n=>n in e)?t:t.replace(o,(n,l)=>{let u=e[l];return u==null?"":String(u)})},X=t=>t&&d.locales.includes(t)?t:d.defaultLocale,I=t=>{if(!S.has(t)){let{resources:e}=y(t);S.set(t,e);}return S.get(t)},K=(t,e={})=>{let o=X(e.locale),p=I(o)?.translation[t];if(p&&typeof p=="string"){let n=_(p,e.vars);return n!=null?String(n):String(t)}if(o!==d.defaultLocale){let l=I(d.defaultLocale)?.translation[t];if(l&&typeof l=="string"){let u=_(l,e.vars);return u!=null?String(u):String(t)}}return String(e.fallback??t)},r=K;var i=chunk5ETPYYQR_cjs.a.create({service:"cli-gateway"}),w=58,C="\u2551",O="\u2554",k="\u255A",N="\u2560",L="\u2550";function Z(t,e=w){let o=e-t.length;return o<=0?t:t+" ".repeat(o)}function s(t){console.log(`${C} ${Z(t)} ${C}`);}function $(){console.log(`${O}${L.repeat(w)}${O.replace("\u2554","\u2557")}`);}function B(){console.log(`${N}${L.repeat(w)}${N.replace("\u2560","\u2563")}`);}function E(){console.log(`${k}${L.repeat(w)}${k.replace("\u255A","\u255D")}`);}function P(t){console.log(""),$(),s(r("cli.startup.title")),B(),s(`${r("cli.startup.status")}: ${r("cli.startup.running").padEnd(37-r("cli.startup.status").length)}`),s(`${r("cli.startup.port")}: ${String(t.port).padEnd(37-r("cli.startup.port").length)}`),s(`${r("cli.startup.hostname")}: ${t.hostname.padEnd(37-r("cli.startup.hostname").length)}`),s(`${r("cli.startup.protocol")}: ws${" ".repeat(32)}`),t.connections!==void 0&&s(`${r("cli.startup.connections")}:${String(t.connections).padEnd(37-r("cli.startup.connections").length)}`),s(`${r("cli.startup.mode")}: ${(t.mode==="standalone"?r("cli.startup.mode_standalone"):r("cli.startup.mode_integrated")).padEnd(37-r("cli.startup.mode").length)}`),E(),console.log("");}function q(){console.log(""),$(),s(r("cli.stop.title")),E(),console.log("");}async function Q(){try{let t=chunkULWP4SK3_cjs.a.getStatus(),o=(await chunkULWP4SK3_cjs.a.get())?.getStatus();console.log(""),$(),s(r("cli.status.title")),B(),s(`${r("cli.startup.status")}: ${t.toUpperCase().padEnd(37-r("cli.startup.status").length)}`),o&&(s(`${r("cli.startup.port")}: ${String(o.port).padEnd(37-r("cli.startup.port").length)}`),s(`${r("cli.startup.hostname")}: ${(o.hostname||"localhost").padEnd(37-r("cli.startup.hostname").length)}`),s(`${r("cli.startup.connections")}:${String(o.connections||0).padEnd(37-r("cli.startup.connections").length)}`)),E(),console.log("");}catch(t){i.error("Failed to get gateway status",{error:t instanceof Error?t.message:String(t)}),console.error(`${r("cli.error.status_failed")}: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}}async function V(t){let e=t.directory||process.cwd();i.info("Starting gateway service",{port:t.port,hostname:t.hostname,directory:e});try{if(await chunkULWP4SK3_cjs.a.init({directory:e,printLogs:t.debug,logLevel:t.debug?"DEBUG":"INFO"}),chunkULWP4SK3_cjs.a.getStatus()==="running"){console.log(r("cli.already_running"));return}let a={};t.port&&(a.port=t.port),t.hostname&&(a.hostname=t.hostname),await chunkULWP4SK3_cjs.a.start(a);let n=(await chunkULWP4SK3_cjs.a.get())?.getStatus();P({port:n?.port||t.port||8080,hostname:n?.hostname||t.hostname||"localhost",connections:n?.connections||0,mode:chunkRR6UFR5U_cjs.P()?"integrated":"standalone"}),W();}catch(o){i.error("Failed to start gateway",{error:o instanceof Error?o.message:String(o)}),console.error(`${r("cli.error.start_failed")}: ${o instanceof Error?o.message:String(o)}`),process.exit(1);}}async function Y(){i.info("Stopping gateway service");try{if(chunkULWP4SK3_cjs.a.getStatus()==="stopped"){console.log(r("cli.already_stopped"));return}await chunkULWP4SK3_cjs.a.stop(),q(),i.info("Gateway stopped successfully");}catch(t){i.error("Failed to stop gateway",{error:t instanceof Error?t.message:String(t)}),console.error(`${r("cli.error.stop_failed")}: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}}async function tt(t){i.info("Restarting gateway service");try{let e={};t.port&&(e.port=t.port),t.hostname&&(e.hostname=t.hostname),await chunkULWP4SK3_cjs.a.restart(e);let a=(await chunkULWP4SK3_cjs.a.get())?.getStatus();P({port:a?.port||t.port||8080,hostname:a?.hostname||t.hostname||"localhost",connections:a?.connections||0,mode:chunkRR6UFR5U_cjs.P()?"integrated":"standalone"}),W(),i.info("Gateway restarted successfully");}catch(e){i.error("Failed to restart gateway",{error:e instanceof Error?e.message:String(e)}),console.error(`${r("cli.error.restart_failed")}: ${e instanceof Error?e.message:String(e)}`),process.exit(1);}}function W(){let t=async e=>{i.debug(`Received ${e}, shutting down gracefully...`),console.log(`
2
+ ${r("cli.shutdown_signal",{vars:{signal:e}})}`);try{await chunkULWP4SK3_cjs.a.stop(),i.debug("Gateway stopped"),console.log(r("cli.shutdown_success"));}catch(o){i.error("Error during shutdown",{error:o instanceof Error?o.message:String(o)});}process.exit(0);};process.on("SIGINT",()=>{t("SIGINT").catch(console.error);}),process.on("SIGTERM",()=>{t("SIGTERM").catch(console.error);});}async function h(t,e){switch(t){case "start":await V(e);break;case "stop":await Y();break;case "restart":await tt(e);break;case "status":await Q();break;default:console.error(r("cli.unknown_command",{vars:{command:t}})),process.exit(1);}}function et(t){t.command("start").description(r("cli.command.start.desc")).option("-D, --directory <path>",r("cli.option.directory")).option("-p, --port <number>",r("cli.option.port"),e=>parseInt(e,10)).option("-H, --hostname <address>",r("cli.option.hostname")).option("-d, --debug",r("cli.option.debug"),false).action(async e=>{await h("start",{directory:e.directory,port:e.port,hostname:e.hostname,debug:e.debug});}),t.command("stop").description(r("cli.command.stop.desc")).action(async()=>{await h("stop",{});}),t.command("restart").description(r("cli.command.restart.desc")).option("-D, --directory <path>",r("cli.option.directory")).option("-p, --port <number>",r("cli.option.port"),e=>parseInt(e,10)).option("-H, --hostname <address>",r("cli.option.hostname")).option("-d, --debug",r("cli.option.debug"),false).action(async e=>{await h("restart",{directory:e.directory,port:e.port,hostname:e.hostname,debug:e.debug});}),t.command("status").description(r("cli.command.status.desc")).action(async()=>{await h("status",{});}),t.addHelpCommand("help",r("cli.help.command")).addHelpText("after",`
3
3
 
4
4
  ${r("cli.examples.title")}:
5
5
  $ gateway start --port 8080 # ${r("cli.example.start")}
package/dist/cli.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import {a as a$1}from'./chunks/chunk-EOEPZQKC.mjs';import {P as P$1}from'./chunks/chunk-LFGRYJV2.mjs';import {a}from'./chunks/chunk-6TRL3CVJ.mjs';import'./chunks/chunk-HAMGVOQD.mjs';import {Command}from'commander';import {loadEnv}from'@easbot/utils';var T={languages:[{value:"zh-CN",name:"\u7B80\u4F53\u4E2D\u6587",example:"\u4F60\u597D\uFF0CEASBOT\uFF01",supported:true},{value:"en-US",name:"English (United States)",example:"Hello, EASBOT!",supported:true}]};var M=T.languages,U=M.filter(t=>t.supported).map(t=>t.value),d={defaultLocale:"zh-CN",locales:U},f={},y=(t,e)=>{let o=f[t]||{translation:{}};return f[t]={translation:{...o.translation,...e.translation}},f[t]},h=(t=d.defaultLocale)=>(f[t]||y(t,{translation:{}}),{locale:t,resources:f[t]||{translation:{}}});var H={translation:{"cli.startup.title":"Gateway WebSocket \u670D\u52A1\u5DF2\u542F\u52A8","cli.startup.status":"\u72B6\u6001","cli.startup.port":"\u7AEF\u53E3","cli.startup.hostname":"\u4E3B\u673A\u5730\u5740","cli.startup.protocol":"\u534F\u8BAE","cli.startup.connections":"\u8FDE\u63A5\u6570","cli.startup.running":"\u8FD0\u884C\u4E2D","cli.startup.stopped":"\u5DF2\u505C\u6B62","cli.startup.mode":"\u6A21\u5F0F","cli.startup.mode_standalone":"\u72EC\u7ACB\u6A21\u5F0F","cli.startup.mode_integrated":"\u96C6\u6210\u6A21\u5F0F","cli.status.title":"Gateway WebSocket \u670D\u52A1\u72B6\u6001","cli.stop.title":"Gateway WebSocket \u670D\u52A1\u5DF2\u505C\u6B62","cli.already_running":"Gateway \u670D\u52A1\u5DF2\u5728\u8FD0\u884C\u4E2D","cli.already_stopped":"Gateway \u670D\u52A1\u5DF2\u505C\u6B62","cli.shutdown_signal":"\u6536\u5230 {{signal}}\uFF0C\u6B63\u5728\u4F18\u96C5\u5173\u95ED...","cli.shutdown_success":"Gateway \u670D\u52A1\u5DF2\u6210\u529F\u505C\u6B62","cli.unknown_command":"\u672A\u77E5\u547D\u4EE4: {{command}}","cli.error.start_failed":"\u542F\u52A8 Gateway \u5931\u8D25","cli.error.stop_failed":"\u505C\u6B62 Gateway \u5931\u8D25","cli.error.restart_failed":"\u91CD\u542F Gateway \u5931\u8D25","cli.error.status_failed":"\u83B7\u53D6 Gateway \u72B6\u6001\u5931\u8D25","cli.error.shutdown":"\u5173\u95ED\u65F6\u53D1\u751F\u9519\u8BEF","cli.error.execution_failed":"CLI \u6267\u884C\u5931\u8D25","cli.error.detail":"\u9519\u8BEF\u8BE6\u60C5:","cli.command.start.desc":"\u542F\u52A8 Gateway WebSocket \u670D\u52A1","cli.command.stop.desc":"\u505C\u6B62 Gateway \u670D\u52A1","cli.command.restart.desc":"\u91CD\u542F Gateway \u670D\u52A1","cli.command.status.desc":"\u67E5\u770B Gateway \u670D\u52A1\u72B6\u6001","cli.option.directory":"\u5DE5\u4F5C\u76EE\u5F55","cli.option.port":"\u670D\u52A1\u7AEF\u53E3","cli.option.hostname":"\u4E3B\u673A\u5730\u5740","cli.option.debug":"\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F","cli.help.command":"\u663E\u793A\u5E2E\u52A9\u4FE1\u606F","cli.program.description":"Gateway WebSocket \u670D\u52A1\u7BA1\u7406 CLI","cli.examples.title":"\u793A\u4F8B","cli.example.start":"\u542F\u52A8\u670D\u52A1","cli.example.stop":"\u505C\u6B62\u670D\u52A1","cli.example.restart":"\u91CD\u542F\u670D\u52A1","cli.example.hostname":"\u6307\u5B9A\u76D1\u542C\u5730\u5740"}},G=H;var z={translation:{"cli.startup.title":"Gateway WebSocket Server Started","cli.startup.status":"Status","cli.startup.port":"Port","cli.startup.hostname":"Hostname","cli.startup.protocol":"Protocol","cli.startup.connections":"Connections","cli.startup.running":"Running","cli.startup.stopped":"Stopped","cli.startup.mode":"Mode","cli.startup.mode_standalone":"Standalone","cli.startup.mode_integrated":"Integrated","cli.status.title":"Gateway WebSocket Server Status","cli.stop.title":"Gateway WebSocket Server Stopped","cli.already_running":"Gateway server is already running.","cli.already_stopped":"Gateway server is already stopped.","cli.shutdown_signal":"Received {{signal}}, shutting down gracefully...","cli.shutdown_success":"Gateway stopped successfully.","cli.unknown_command":"Unknown command: {{command}}","cli.error.start_failed":"Failed to start gateway","cli.error.stop_failed":"Failed to stop gateway","cli.error.restart_failed":"Failed to restart gateway","cli.error.status_failed":"Failed to get gateway status","cli.error.shutdown":"Error during shutdown","cli.error.execution_failed":"CLI failed to execute","cli.error.detail":"Error detail:","cli.command.start.desc":"Start Gateway WebSocket service","cli.command.stop.desc":"Stop Gateway service","cli.command.restart.desc":"Restart Gateway service","cli.command.status.desc":"Check Gateway service status","cli.option.directory":"Working directory","cli.option.port":"Service port","cli.option.hostname":"Host address","cli.option.debug":"Enable debug mode","cli.help.command":"Display help information","cli.program.description":"Gateway WebSocket service management CLI","cli.examples.title":"Examples","cli.example.start":"Start service","cli.example.stop":"Stop service","cli.example.restart":"Restart service","cli.example.hostname":"Specify listening address"}},_=z;var D=()=>{h("zh-CN"),h("en-US"),y("zh-CN",G),y("en-US",_);};D();var v=new Map;var L=new Map;var X=t=>{if(L.has(t))return L.get(t);let e=/{{\s*(\w+)\s*}}/g,o=[],a;for(;(a=e.exec(t))!==null;){let l=a[1];l&&!o.includes(l)&&o.push(l);}let p=new RegExp("{{\\s*("+o.join("|")+")\\s*}}","g"),n={keys:o,regex:p};return L.set(t,n),n},I=(t,e)=>{if(!t||typeof t!="string")return "";if(!e||Object.keys(e).length===0)return t;let{regex:o,keys:a}=X(t);return a.length===0||!a.some(n=>n in e)?t:t.replace(o,(n,l)=>{let u=e[l];return u==null?"":String(u)})},K=t=>t&&d.locales.includes(t)?t:d.defaultLocale,C=t=>{if(!v.has(t)){let{resources:e}=h(t);v.set(t,e);}return v.get(t)},j=(t,e={})=>{let o=K(e.locale),p=C(o)?.translation[t];if(p&&typeof p=="string"){let n=I(p,e.vars);return n!=null?String(n):String(t)}if(o!==d.defaultLocale){let l=C(d.defaultLocale)?.translation[t];if(l&&typeof l=="string"){let u=I(l,e.vars);return u!=null?String(u):String(t)}}return String(e.fallback??t)},r=j;var i=a.create({service:"cli-gateway"}),x=58,O="\u2551",k="\u2554",N="\u255A",B="\u2560",$="\u2550";function q(t,e=x){let o=e-t.length;return o<=0?t:t+" ".repeat(o)}function s(t){console.log(`${O} ${q(t)} ${O}`);}function E(){console.log(`${k}${$.repeat(x)}${k.replace("\u2554","\u2557")}`);}function P(){console.log(`${B}${$.repeat(x)}${B.replace("\u2560","\u2563")}`);}function b(){console.log(`${N}${$.repeat(x)}${N.replace("\u255A","\u255D")}`);}function W(t){console.log(""),E(),s(r("cli.startup.title")),P(),s(`${r("cli.startup.status")}: ${r("cli.startup.running").padEnd(37-r("cli.startup.status").length)}`),s(`${r("cli.startup.port")}: ${String(t.port).padEnd(37-r("cli.startup.port").length)}`),s(`${r("cli.startup.hostname")}: ${t.hostname.padEnd(37-r("cli.startup.hostname").length)}`),s(`${r("cli.startup.protocol")}: ws${" ".repeat(32)}`),t.connections!==void 0&&s(`${r("cli.startup.connections")}:${String(t.connections).padEnd(37-r("cli.startup.connections").length)}`),s(`${r("cli.startup.mode")}: ${(t.mode==="standalone"?r("cli.startup.mode_standalone"):r("cli.startup.mode_integrated")).padEnd(37-r("cli.startup.mode").length)}`),b(),console.log("");}function Q(){console.log(""),E(),s(r("cli.stop.title")),b(),console.log("");}async function V(){try{let t=a$1.getStatus(),o=(await a$1.get())?.getStatus();console.log(""),E(),s(r("cli.status.title")),P(),s(`${r("cli.startup.status")}: ${t.toUpperCase().padEnd(37-r("cli.startup.status").length)}`),o&&(s(`${r("cli.startup.port")}: ${String(o.port).padEnd(37-r("cli.startup.port").length)}`),s(`${r("cli.startup.hostname")}: ${(o.hostname||"localhost").padEnd(37-r("cli.startup.hostname").length)}`),s(`${r("cli.startup.connections")}:${String(o.connections||0).padEnd(37-r("cli.startup.connections").length)}`)),b(),console.log("");}catch(t){i.error("Failed to get gateway status",{error:t instanceof Error?t.message:String(t)}),console.error(`${r("cli.error.status_failed")}: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}}async function Y(t){let e=t.directory||process.cwd();i.info("Starting gateway service",{port:t.port,hostname:t.hostname,directory:e});try{if(await a$1.init({directory:e,printLogs:t.debug,logLevel:t.debug?"DEBUG":"INFO"}),a$1.getStatus()==="running"){console.log(r("cli.already_running"));return}let a={};t.port&&(a.port=t.port),t.hostname&&(a.hostname=t.hostname),await a$1.start(a);let n=(await a$1.get())?.getStatus();W({port:n?.port||t.port||8080,hostname:n?.hostname||t.hostname||"localhost",connections:n?.connections||0,mode:P$1()?"integrated":"standalone"}),F();}catch(o){i.error("Failed to start gateway",{error:o instanceof Error?o.message:String(o)}),console.error(`${r("cli.error.start_failed")}: ${o instanceof Error?o.message:String(o)}`),process.exit(1);}}async function tt(){i.info("Stopping gateway service");try{if(a$1.getStatus()==="stopped"){console.log(r("cli.already_stopped"));return}await a$1.stop(),Q(),i.info("Gateway stopped successfully");}catch(t){i.error("Failed to stop gateway",{error:t instanceof Error?t.message:String(t)}),console.error(`${r("cli.error.stop_failed")}: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}}async function et(t){i.info("Restarting gateway service");try{let e={};t.port&&(e.port=t.port),t.hostname&&(e.hostname=t.hostname),await a$1.restart(e);let a=(await a$1.get())?.getStatus();W({port:a?.port||t.port||8080,hostname:a?.hostname||t.hostname||"localhost",connections:a?.connections||0,mode:P$1()?"integrated":"standalone"}),F(),i.info("Gateway restarted successfully");}catch(e){i.error("Failed to restart gateway",{error:e instanceof Error?e.message:String(e)}),console.error(`${r("cli.error.restart_failed")}: ${e instanceof Error?e.message:String(e)}`),process.exit(1);}}function F(){let t=async e=>{i.debug(`Received ${e}, shutting down gracefully...`),console.log(`
1
+ import {a as a$1}from'./chunks/chunk-ENCE7NRO.mjs';import {P as P$1}from'./chunks/chunk-77F43CRD.mjs';import {a}from'./chunks/chunk-6TRL3CVJ.mjs';import'./chunks/chunk-HAMGVOQD.mjs';import {Command}from'commander';import {loadEnv}from'@easbot/utils';var T={languages:[{value:"zh-CN",name:"\u7B80\u4F53\u4E2D\u6587",example:"\u4F60\u597D\uFF0CEASBOT\uFF01",supported:true},{value:"en-US",name:"English (United States)",example:"Hello, EASBOT!",supported:true}]};var M=T.languages,U=M.filter(t=>t.supported).map(t=>t.value),d={defaultLocale:"zh-CN",locales:U},f={},y=(t,e)=>{let o=f[t]||{translation:{}};return f[t]={translation:{...o.translation,...e.translation}},f[t]},h=(t=d.defaultLocale)=>(f[t]||y(t,{translation:{}}),{locale:t,resources:f[t]||{translation:{}}});var H={translation:{"cli.startup.title":"Gateway WebSocket \u670D\u52A1\u5DF2\u542F\u52A8","cli.startup.status":"\u72B6\u6001","cli.startup.port":"\u7AEF\u53E3","cli.startup.hostname":"\u4E3B\u673A\u5730\u5740","cli.startup.protocol":"\u534F\u8BAE","cli.startup.connections":"\u8FDE\u63A5\u6570","cli.startup.running":"\u8FD0\u884C\u4E2D","cli.startup.stopped":"\u5DF2\u505C\u6B62","cli.startup.mode":"\u6A21\u5F0F","cli.startup.mode_standalone":"\u72EC\u7ACB\u6A21\u5F0F","cli.startup.mode_integrated":"\u96C6\u6210\u6A21\u5F0F","cli.status.title":"Gateway WebSocket \u670D\u52A1\u72B6\u6001","cli.stop.title":"Gateway WebSocket \u670D\u52A1\u5DF2\u505C\u6B62","cli.already_running":"Gateway \u670D\u52A1\u5DF2\u5728\u8FD0\u884C\u4E2D","cli.already_stopped":"Gateway \u670D\u52A1\u5DF2\u505C\u6B62","cli.shutdown_signal":"\u6536\u5230 {{signal}}\uFF0C\u6B63\u5728\u4F18\u96C5\u5173\u95ED...","cli.shutdown_success":"Gateway \u670D\u52A1\u5DF2\u6210\u529F\u505C\u6B62","cli.unknown_command":"\u672A\u77E5\u547D\u4EE4: {{command}}","cli.error.start_failed":"\u542F\u52A8 Gateway \u5931\u8D25","cli.error.stop_failed":"\u505C\u6B62 Gateway \u5931\u8D25","cli.error.restart_failed":"\u91CD\u542F Gateway \u5931\u8D25","cli.error.status_failed":"\u83B7\u53D6 Gateway \u72B6\u6001\u5931\u8D25","cli.error.shutdown":"\u5173\u95ED\u65F6\u53D1\u751F\u9519\u8BEF","cli.error.execution_failed":"CLI \u6267\u884C\u5931\u8D25","cli.error.detail":"\u9519\u8BEF\u8BE6\u60C5:","cli.command.start.desc":"\u542F\u52A8 Gateway WebSocket \u670D\u52A1","cli.command.stop.desc":"\u505C\u6B62 Gateway \u670D\u52A1","cli.command.restart.desc":"\u91CD\u542F Gateway \u670D\u52A1","cli.command.status.desc":"\u67E5\u770B Gateway \u670D\u52A1\u72B6\u6001","cli.option.directory":"\u5DE5\u4F5C\u76EE\u5F55","cli.option.port":"\u670D\u52A1\u7AEF\u53E3","cli.option.hostname":"\u4E3B\u673A\u5730\u5740","cli.option.debug":"\u542F\u7528\u8C03\u8BD5\u6A21\u5F0F","cli.help.command":"\u663E\u793A\u5E2E\u52A9\u4FE1\u606F","cli.program.description":"Gateway WebSocket \u670D\u52A1\u7BA1\u7406 CLI","cli.examples.title":"\u793A\u4F8B","cli.example.start":"\u542F\u52A8\u670D\u52A1","cli.example.stop":"\u505C\u6B62\u670D\u52A1","cli.example.restart":"\u91CD\u542F\u670D\u52A1","cli.example.hostname":"\u6307\u5B9A\u76D1\u542C\u5730\u5740"}},G=H;var z={translation:{"cli.startup.title":"Gateway WebSocket Server Started","cli.startup.status":"Status","cli.startup.port":"Port","cli.startup.hostname":"Hostname","cli.startup.protocol":"Protocol","cli.startup.connections":"Connections","cli.startup.running":"Running","cli.startup.stopped":"Stopped","cli.startup.mode":"Mode","cli.startup.mode_standalone":"Standalone","cli.startup.mode_integrated":"Integrated","cli.status.title":"Gateway WebSocket Server Status","cli.stop.title":"Gateway WebSocket Server Stopped","cli.already_running":"Gateway server is already running.","cli.already_stopped":"Gateway server is already stopped.","cli.shutdown_signal":"Received {{signal}}, shutting down gracefully...","cli.shutdown_success":"Gateway stopped successfully.","cli.unknown_command":"Unknown command: {{command}}","cli.error.start_failed":"Failed to start gateway","cli.error.stop_failed":"Failed to stop gateway","cli.error.restart_failed":"Failed to restart gateway","cli.error.status_failed":"Failed to get gateway status","cli.error.shutdown":"Error during shutdown","cli.error.execution_failed":"CLI failed to execute","cli.error.detail":"Error detail:","cli.command.start.desc":"Start Gateway WebSocket service","cli.command.stop.desc":"Stop Gateway service","cli.command.restart.desc":"Restart Gateway service","cli.command.status.desc":"Check Gateway service status","cli.option.directory":"Working directory","cli.option.port":"Service port","cli.option.hostname":"Host address","cli.option.debug":"Enable debug mode","cli.help.command":"Display help information","cli.program.description":"Gateway WebSocket service management CLI","cli.examples.title":"Examples","cli.example.start":"Start service","cli.example.stop":"Stop service","cli.example.restart":"Restart service","cli.example.hostname":"Specify listening address"}},_=z;var D=()=>{h("zh-CN"),h("en-US"),y("zh-CN",G),y("en-US",_);};D();var v=new Map;var L=new Map;var X=t=>{if(L.has(t))return L.get(t);let e=/{{\s*(\w+)\s*}}/g,o=[],a;for(;(a=e.exec(t))!==null;){let l=a[1];l&&!o.includes(l)&&o.push(l);}let p=new RegExp("{{\\s*("+o.join("|")+")\\s*}}","g"),n={keys:o,regex:p};return L.set(t,n),n},I=(t,e)=>{if(!t||typeof t!="string")return "";if(!e||Object.keys(e).length===0)return t;let{regex:o,keys:a}=X(t);return a.length===0||!a.some(n=>n in e)?t:t.replace(o,(n,l)=>{let u=e[l];return u==null?"":String(u)})},K=t=>t&&d.locales.includes(t)?t:d.defaultLocale,C=t=>{if(!v.has(t)){let{resources:e}=h(t);v.set(t,e);}return v.get(t)},j=(t,e={})=>{let o=K(e.locale),p=C(o)?.translation[t];if(p&&typeof p=="string"){let n=I(p,e.vars);return n!=null?String(n):String(t)}if(o!==d.defaultLocale){let l=C(d.defaultLocale)?.translation[t];if(l&&typeof l=="string"){let u=I(l,e.vars);return u!=null?String(u):String(t)}}return String(e.fallback??t)},r=j;var i=a.create({service:"cli-gateway"}),x=58,O="\u2551",k="\u2554",N="\u255A",B="\u2560",$="\u2550";function q(t,e=x){let o=e-t.length;return o<=0?t:t+" ".repeat(o)}function s(t){console.log(`${O} ${q(t)} ${O}`);}function E(){console.log(`${k}${$.repeat(x)}${k.replace("\u2554","\u2557")}`);}function P(){console.log(`${B}${$.repeat(x)}${B.replace("\u2560","\u2563")}`);}function b(){console.log(`${N}${$.repeat(x)}${N.replace("\u255A","\u255D")}`);}function W(t){console.log(""),E(),s(r("cli.startup.title")),P(),s(`${r("cli.startup.status")}: ${r("cli.startup.running").padEnd(37-r("cli.startup.status").length)}`),s(`${r("cli.startup.port")}: ${String(t.port).padEnd(37-r("cli.startup.port").length)}`),s(`${r("cli.startup.hostname")}: ${t.hostname.padEnd(37-r("cli.startup.hostname").length)}`),s(`${r("cli.startup.protocol")}: ws${" ".repeat(32)}`),t.connections!==void 0&&s(`${r("cli.startup.connections")}:${String(t.connections).padEnd(37-r("cli.startup.connections").length)}`),s(`${r("cli.startup.mode")}: ${(t.mode==="standalone"?r("cli.startup.mode_standalone"):r("cli.startup.mode_integrated")).padEnd(37-r("cli.startup.mode").length)}`),b(),console.log("");}function Q(){console.log(""),E(),s(r("cli.stop.title")),b(),console.log("");}async function V(){try{let t=a$1.getStatus(),o=(await a$1.get())?.getStatus();console.log(""),E(),s(r("cli.status.title")),P(),s(`${r("cli.startup.status")}: ${t.toUpperCase().padEnd(37-r("cli.startup.status").length)}`),o&&(s(`${r("cli.startup.port")}: ${String(o.port).padEnd(37-r("cli.startup.port").length)}`),s(`${r("cli.startup.hostname")}: ${(o.hostname||"localhost").padEnd(37-r("cli.startup.hostname").length)}`),s(`${r("cli.startup.connections")}:${String(o.connections||0).padEnd(37-r("cli.startup.connections").length)}`)),b(),console.log("");}catch(t){i.error("Failed to get gateway status",{error:t instanceof Error?t.message:String(t)}),console.error(`${r("cli.error.status_failed")}: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}}async function Y(t){let e=t.directory||process.cwd();i.info("Starting gateway service",{port:t.port,hostname:t.hostname,directory:e});try{if(await a$1.init({directory:e,printLogs:t.debug,logLevel:t.debug?"DEBUG":"INFO"}),a$1.getStatus()==="running"){console.log(r("cli.already_running"));return}let a={};t.port&&(a.port=t.port),t.hostname&&(a.hostname=t.hostname),await a$1.start(a);let n=(await a$1.get())?.getStatus();W({port:n?.port||t.port||8080,hostname:n?.hostname||t.hostname||"localhost",connections:n?.connections||0,mode:P$1()?"integrated":"standalone"}),F();}catch(o){i.error("Failed to start gateway",{error:o instanceof Error?o.message:String(o)}),console.error(`${r("cli.error.start_failed")}: ${o instanceof Error?o.message:String(o)}`),process.exit(1);}}async function tt(){i.info("Stopping gateway service");try{if(a$1.getStatus()==="stopped"){console.log(r("cli.already_stopped"));return}await a$1.stop(),Q(),i.info("Gateway stopped successfully");}catch(t){i.error("Failed to stop gateway",{error:t instanceof Error?t.message:String(t)}),console.error(`${r("cli.error.stop_failed")}: ${t instanceof Error?t.message:String(t)}`),process.exit(1);}}async function et(t){i.info("Restarting gateway service");try{let e={};t.port&&(e.port=t.port),t.hostname&&(e.hostname=t.hostname),await a$1.restart(e);let a=(await a$1.get())?.getStatus();W({port:a?.port||t.port||8080,hostname:a?.hostname||t.hostname||"localhost",connections:a?.connections||0,mode:P$1()?"integrated":"standalone"}),F(),i.info("Gateway restarted successfully");}catch(e){i.error("Failed to restart gateway",{error:e instanceof Error?e.message:String(e)}),console.error(`${r("cli.error.restart_failed")}: ${e instanceof Error?e.message:String(e)}`),process.exit(1);}}function F(){let t=async e=>{i.debug(`Received ${e}, shutting down gracefully...`),console.log(`
2
2
  ${r("cli.shutdown_signal",{vars:{signal:e}})}`);try{await a$1.stop(),i.debug("Gateway stopped"),console.log(r("cli.shutdown_success"));}catch(o){i.error("Error during shutdown",{error:o instanceof Error?o.message:String(o)});}process.exit(0);};process.on("SIGINT",()=>{t("SIGINT").catch(console.error);}),process.on("SIGTERM",()=>{t("SIGTERM").catch(console.error);});}async function w(t,e){switch(t){case "start":await Y(e);break;case "stop":await tt();break;case "restart":await et(e);break;case "status":await V();break;default:console.error(r("cli.unknown_command",{vars:{command:t}})),process.exit(1);}}function rt(t){t.command("start").description(r("cli.command.start.desc")).option("-D, --directory <path>",r("cli.option.directory")).option("-p, --port <number>",r("cli.option.port"),e=>parseInt(e,10)).option("-H, --hostname <address>",r("cli.option.hostname")).option("-d, --debug",r("cli.option.debug"),false).action(async e=>{await w("start",{directory:e.directory,port:e.port,hostname:e.hostname,debug:e.debug});}),t.command("stop").description(r("cli.command.stop.desc")).action(async()=>{await w("stop",{});}),t.command("restart").description(r("cli.command.restart.desc")).option("-D, --directory <path>",r("cli.option.directory")).option("-p, --port <number>",r("cli.option.port"),e=>parseInt(e,10)).option("-H, --hostname <address>",r("cli.option.hostname")).option("-d, --debug",r("cli.option.debug"),false).action(async e=>{await w("restart",{directory:e.directory,port:e.port,hostname:e.hostname,debug:e.debug});}),t.command("status").description(r("cli.command.status.desc")).action(async()=>{await w("status",{});}),t.addHelpCommand("help",r("cli.help.command")).addHelpText("after",`
3
3
 
4
4
  ${r("cli.examples.title")}: