@easbot/gateway 0.2.22 → 0.2.24

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 +0,0 @@
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;
@@ -1 +0,0 @@
1
- 'use strict';require('./chunk-GY3SWWW3.cjs');var promises=require('fs/promises'),i=require('path'),xdgBasedir=require('xdg-basedir'),O=require('os');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var i__default=/*#__PURE__*/_interopDefault(i);var O__default=/*#__PURE__*/_interopDefault(O);var c={name:"@easbot/gateway",version:"0.2.22",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"}};var a="easbot",l=i__default.default.join(xdgBasedir.xdgData,a),k=i__default.default.join(xdgBasedir.xdgCache,a),x=i__default.default.join(xdgBasedir.xdgConfig,a),j=i__default.default.join(xdgBasedir.xdgState,a);exports.Global=void 0;(e=>{e.Path={get home(){return process.env.EASBOT_TEST_HOME||O__default.default.homedir()},data:l,bin:i__default.default.join(l,"bin"),log:i__default.default.join(l,"log"),cache:k,config:x,state:j};let t=null,s=null;async function v(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=c.version||"local";}catch{t="local";}return t||"local"}function g(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=c.version||"local";}catch{t="local";}return t||"local"}e.getVersion=g;function p(){if(s)return s;if(process.env.EASBOT_CHANNEL)return s=process.env.EASBOT_CHANNEL,s;let o=g();return o==="local"||o.includes("dev")?s="local":o.includes("beta")||o.includes("alpha")?s="preview":s="latest",s||"local"}e.getChannel=p;function B(){return p()==="local"}e.isLocal=B;function C(){return p()==="preview"}e.isPreview=C;let u=false,n=null;async function H(){if(!u)return n||(n=(async()=>{await v(),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 o="1",d=i__default.default.join(e.Path.cache,"version");if(await promises.readFile(d,"utf-8").catch(()=>"0")!==o){try{let h=await promises.readdir(e.Path.cache);await Promise.all(h.map(b=>promises.rm(i__default.default.join(e.Path.cache,b),{recursive:!0,force:!0})));}catch{}await promises.writeFile(d,o);}u=true;})(),n)}e.init=H;})(exports.Global||(exports.Global={}));
@@ -1,2 +0,0 @@
1
- import'./chunk-HAMGVOQD.mjs';import {mkdir,readFile,readdir,rm,writeFile}from'fs/promises';import i from'path';import {xdgData,xdgCache,xdgConfig,xdgState}from'xdg-basedir';import O from'os';var c={name:"@easbot/gateway",version:"0.2.22",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"}};var a="easbot",l=i.join(xdgData,a),k=i.join(xdgCache,a),x=i.join(xdgConfig,a),j=i.join(xdgState,a),m;(e=>{e.Path={get home(){return process.env.EASBOT_TEST_HOME||O.homedir()},data:l,bin:i.join(l,"bin"),log:i.join(l,"log"),cache:k,config:x,state:j};let t=null,s=null;async function v(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=c.version||"local";}catch{t="local";}return t||"local"}function g(){if(t)return t;if(process.env.EASBOT_VERSION)return t=process.env.EASBOT_VERSION,t;try{t=c.version||"local";}catch{t="local";}return t||"local"}e.getVersion=g;function p(){if(s)return s;if(process.env.EASBOT_CHANNEL)return s=process.env.EASBOT_CHANNEL,s;let o=g();return o==="local"||o.includes("dev")?s="local":o.includes("beta")||o.includes("alpha")?s="preview":s="latest",s||"local"}e.getChannel=p;function B(){return p()==="local"}e.isLocal=B;function C(){return p()==="preview"}e.isPreview=C;let u=false,n=null;async function H(){if(!u)return n||(n=(async()=>{await v(),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 o="1",d=i.join(e.Path.cache,"version");if(await readFile(d,"utf-8").catch(()=>"0")!==o){try{let h=await readdir(e.Path.cache);await Promise.all(h.map(b=>rm(i.join(e.Path.cache,b),{recursive:!0,force:!0})));}catch{}await writeFile(d,o);}u=true;})(),n)}e.init=H;})(m||(m={}));
2
- export{m as Global};
@@ -1 +0,0 @@
1
- 'use strict';var chunk5ETPYYQR_cjs=require('./chunk-5ETPYYQR.cjs');require('./chunk-GY3SWWW3.cjs');Object.defineProperty(exports,"Log",{enumerable:true,get:function(){return chunk5ETPYYQR_cjs.a}});
@@ -1 +0,0 @@
1
- export{a as Log}from'./chunk-6TRL3CVJ.mjs';import'./chunk-HAMGVOQD.mjs';
@@ -1 +0,0 @@
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}});
@@ -1 +0,0 @@
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 DELETED
@@ -1,8 +0,0 @@
1
- 'use strict';var chunkB7KSBA5N_cjs=require('./chunks/chunk-B7KSBA5N.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=chunkB7KSBA5N_cjs.a.getStatus(),o=(await chunkB7KSBA5N_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 chunkB7KSBA5N_cjs.a.init({directory:e,printLogs:t.debug,logLevel:t.debug?"DEBUG":"INFO"}),chunkB7KSBA5N_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 chunkB7KSBA5N_cjs.a.start(a);let n=(await chunkB7KSBA5N_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(chunkB7KSBA5N_cjs.a.getStatus()==="stopped"){console.log(r("cli.already_stopped"));return}await chunkB7KSBA5N_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 chunkB7KSBA5N_cjs.a.restart(e);let a=(await chunkB7KSBA5N_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 chunkB7KSBA5N_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
-
4
- ${r("cli.examples.title")}:
5
- $ gateway start --port 8080 # ${r("cli.example.start")}
6
- $ gateway stop # ${r("cli.example.stop")}
7
- $ gateway restart --port 9090 # ${r("cli.example.restart")}
8
- $ gateway start --hostname 0.0.0.0 # ${r("cli.example.hostname")}`);}async function rt(t=process.argv){utils.loadEnv();let e=new commander.Command;e.name("gateway").description(r("cli.program.description")).version("1.0.0"),et(e),await e.parseAsync(t);}rt().catch(t=>{let e=t.code==="EPIPE"||t.code==="EIO";e||i.error("CLI failed to execute",{error:t});let o=t instanceof Error?t.message:String(t),a=t instanceof Error?t.stack:"";try{console.error(r("cli.error.execution_failed")),o&&console.error(`${r("cli.error.detail")} ${o}`),a&&console.error(a);}catch{}e||process.exit(1);});exports.main=rt;exports.registerGatewayCommand=et;
package/dist/cli.d.cts DELETED
@@ -1,6 +0,0 @@
1
- import { Command } from 'commander';
2
-
3
- declare function registerGatewayCommand(program: Command): void;
4
- declare function main(argv?: string[]): Promise<void>;
5
-
6
- export { main, registerGatewayCommand };
package/dist/cli.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import { Command } from 'commander';
2
-
3
- declare function registerGatewayCommand(program: Command): void;
4
- declare function main(argv?: string[]): Promise<void>;
5
-
6
- export { main, registerGatewayCommand };
package/dist/cli.mjs DELETED
@@ -1,8 +0,0 @@
1
- import {a as a$1}from'./chunks/chunk-IOTK6QKN.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
- ${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
-
4
- ${r("cli.examples.title")}:
5
- $ gateway start --port 8080 # ${r("cli.example.start")}
6
- $ gateway stop # ${r("cli.example.stop")}
7
- $ gateway restart --port 9090 # ${r("cli.example.restart")}
8
- $ gateway start --hostname 0.0.0.0 # ${r("cli.example.hostname")}`);}async function ot(t=process.argv){loadEnv();let e=new Command;e.name("gateway").description(r("cli.program.description")).version("1.0.0"),rt(e),await e.parseAsync(t);}ot().catch(t=>{let e=t.code==="EPIPE"||t.code==="EIO";e||i.error("CLI failed to execute",{error:t});let o=t instanceof Error?t.message:String(t),a=t instanceof Error?t.stack:"";try{console.error(r("cli.error.execution_failed")),o&&console.error(`${r("cli.error.detail")} ${o}`),a&&console.error(a);}catch{}e||process.exit(1);});export{ot as main,rt as registerGatewayCommand};