synara 0.1.5 → 0.1.7

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.
Files changed (3) hide show
  1. package/README.md +52 -101
  2. package/dist/index.js +77 -53
  3. package/package.json +5 -1
package/README.md CHANGED
@@ -1,129 +1,80 @@
1
- # Synapse CLI
1
+ # Synara
2
2
 
3
3
  AI-powered coding assistant. Cloud brain, local hands.
4
4
 
5
- ## Architecture
6
-
7
- ```
8
- Local CLI (thin client) Cloud Container (thick server)
9
- ┌─────────────────────┐ ┌──────────────────────────────┐
10
- │ Terminal UI │ │ Harness Engine │
11
- │ Tool Executor │◄───WS────►│ System Prompt Assembly │
12
- │ Permission Control │ │ Guardrails / Skills │
13
- │ SYNAPSE.md Reader │ │ Context Compact (LLM) │
14
- └─────────────────────┘ │ Streaming LLM (Kimi K2.5) │
15
- │ AI Gateway → Workers AI │
16
- │ Trace Recording │
17
- └──────────────────────────────┘
18
- ```
19
-
20
- CLI only does three things: **display, execute, confirm**.
21
- All intelligence lives on the cloud.
5
+ Part of the [Synapse](https://synapse.cloudc.top) autonomous AI agent platform.
22
6
 
23
7
  ## Install
24
8
 
25
9
  ```bash
26
- npm install -g synapse-cli
10
+ npm install -g synara
27
11
  ```
28
12
 
29
- ## Usage
13
+ ## Quick Start
30
14
 
31
15
  ```bash
32
- synapse login # Login with username/password
33
- synapse # Start coding session in current directory
34
- synapse logout # Remove stored credentials
35
- synapse --help # Show help
16
+ synara login # Authenticate
17
+ synara # Start coding session in current directory
36
18
  ```
37
19
 
38
- ## Session Commands
39
-
40
- | Command | Description |
41
- |------------|------------------------------------------|
42
- | `/compact` | Compress conversation history (LLM summarization) |
43
- | `/context` | Show context usage (tokens, messages, compactions) |
44
- | `/tools` | List available tools and permission levels |
45
- | `/quit` | End session |
46
-
47
- ## Permission Model
48
-
49
- | Tool | Permission |
50
- |-------------------------------|---------------------|
51
- | read_file, grep, glob, list_dir | Auto (in-project only) |
52
- | read outside project dir | Ask each time |
53
- | write_file, edit_file | Ask (trustable via `t`) |
54
- | bash | Ask every time (never trustable) |
55
- | Destructive commands (rm -rf /, mkfs, etc.) | Blocked entirely |
56
-
57
- When prompted:
58
- - `y` — approve this operation
59
- - `n` — deny (AI will ask you what to do instead)
60
- - `t` — trust this tool type for the rest of the session (not available for bash)
61
-
62
- ## Streaming
63
-
64
- - LLM responses stream token-by-token via WebSocket
65
- - Content appears in real-time as the model generates it
66
- - Reasoning (thinking) is hidden by default
20
+ ## How It Works
67
21
 
68
- ## Context Management
69
-
70
- **Iron rule: NEVER truncate data.**
71
-
72
- Context compression uses LLM summarization, not mechanical truncation:
73
- - **autoCompact** — triggers at 80% of 256k context window, summarizes older messages in batches
74
- - **reactiveCompact** — triggers on API 413 error, compresses and retries (max 3 attempts)
75
- - **`/compact`** — manual trigger
22
+ ```
23
+ You ←→ Synara CLI (local) ←—WebSocket—→ Cloud Engine (Cloudflare)
24
+ Display output • LLM reasoning (Kimi K2.5)
25
+ • Execute tools locally • System prompt & guardrails
26
+ Permission control • Context management
27
+ ```
76
28
 
77
- Each batch of messages is sent to LLM in full for summarization. The LLM decides what's important. No data is cut by character count.
29
+ The CLI is a thin client all intelligence lives on the cloud. Your code stays local; only tool requests and results travel over the wire.
78
30
 
79
- ## Project Configuration
31
+ ## Commands
80
32
 
81
- Place `SYNAPSE.md` in your project root. It's automatically read and sent to the cloud as project-specific instructions (similar to Claude Code's `CLAUDE.md`).
33
+ ```bash
34
+ synara login # Login with username/password
35
+ synara logout # Remove stored credentials
36
+ synara --help # Show help
37
+ ```
82
38
 
83
- ## Model
39
+ ### Session Commands
84
40
 
85
- - **Kimi K2.5** via Cloudflare AI Gateway
86
- - 256k context window
87
- - temperature 1.0, top_p 0.95
88
- - Streaming with reasoning support
41
+ | Command | Description |
42
+ |------------|-------------|
43
+ | `/compact` | Compress conversation (LLM summarization, never truncation) |
44
+ | `/context` | Show token usage and compaction stats |
45
+ | `/save` | Save session locally |
46
+ | `/load` | Restore a saved session |
47
+ | `/sessions`| List saved sessions |
48
+ | `/quit` | End session |
89
49
 
90
50
  ## Tools
91
51
 
92
- | Tool | Description |
93
- |------------|------------------------------------------------|
94
- | read_file | Read a file from the project |
95
- | write_file | Create or overwrite a file (shows content first)|
96
- | edit_file | Precise string replacement in existing files |
97
- | grep | Regex search across files |
98
- | glob | Find files by name pattern |
99
- | list_dir | List directory contents |
100
- | bash | Execute shell commands |
52
+ | Tool | Description |
53
+ |------|-------------|
54
+ | `read_file` | Read file contents |
55
+ | `write_file` | Create or overwrite files |
56
+ | `edit_file` | Precise string replacement |
57
+ | `grep` | Regex search across files |
58
+ | `glob` | Find files by pattern |
59
+ | `list_dir` | List directory contents |
60
+ | `bash` | Execute shell commands |
101
61
 
102
- ## File Structure
62
+ ## Permission Model
103
63
 
104
- ```
105
- synapse-cli/ # Local client (npm package)
106
- ├── src/
107
- │ ├── index.ts # Entry: subcommands, WS connection, REPL
108
- │ ├── auth.ts # Login/logout JWT stored in ~/.synapse/token
109
- │ ├── protocol.ts # CLI Cloud message protocol
110
- │ ├── permissions.ts # t/y/n permission control
111
- │ ├── tools/executor.ts # Local tool execution
112
- │ └── ui/terminal.ts # Terminal output formatting
113
- ├── package.json
114
- └── tsconfig.json
115
-
116
- harness-agent/ # Cloud server (Cloudflare Worker + Container)
117
- ├── src/worker/index.ts # /cli/ws route → JWT auth → Container proxy
118
- └── src/services/cli_session.py # CLI session: LLM loop, streaming, compact
119
- ```
64
+ | Scope | Behavior |
65
+ |-------|----------|
66
+ | Read in project dir | Auto-approved |
67
+ | Read outside project | Requires approval |
68
+ | Write / Edit | Requires approval (trustable via `t`) |
69
+ | Bash | Requires approval every time (never trustable) |
70
+ | Destructive commands (`rm -rf /`, `mkfs`, etc.) | Blocked |
71
+
72
+ Prompt responses: `y` approve · `n` deny · `t` trust for session
120
73
 
121
- ## Design References
74
+ ## Project Config
122
75
 
123
- - **Claude Code** (March 2026 leak)tool permission model, temperature 1.0, four-tier context compression
124
- - **Kiro CLI** — /compact command, streaming UX, session management
125
- - **Synapse Harness** — guardrails + skills injection, Dreaming pipeline
76
+ Drop a `SYNAPSE.md` in your project root it's automatically sent to the cloud as project-specific instructions.
126
77
 
127
- ---
78
+ ## License
128
79
 
129
- Powered by Cloudflare · Built by Bowen Liu
80
+ MIT · Built by Bowen Liu
package/dist/index.js CHANGED
@@ -1,70 +1,94 @@
1
1
  #!/usr/bin/env node
2
- "use strict";var or=Object.create;var xt=Object.defineProperty;var ar=Object.getOwnPropertyDescriptor;var lr=Object.getOwnPropertyNames;var cr=Object.getPrototypeOf,fr=Object.prototype.hasOwnProperty;var C=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var ur=(t,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of lr(e))!fr.call(t,n)&&n!==s&&xt(t,n,{get:()=>e[n],enumerable:!(r=ar(e,n))||r.enumerable});return t};var x=(t,e,s)=>(s=t!=null?or(cr(t)):{},ur(e||!t||!t.__esModule?xt(s,"default",{value:t,enumerable:!0}):s,t));var F=C((_i,vt)=>{"use strict";var bt=["nodebuffer","arraybuffer","fragments"],Et=typeof Blob<"u";Et&&bt.push("blob");vt.exports={BINARY_TYPES:bt,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:Et,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}}});var ce=C((mi,xe)=>{"use strict";var{EMPTY_BUFFER:hr}=F(),Ge=Buffer[Symbol.species];function dr(t,e){if(t.length===0)return hr;if(t.length===1)return t[0];let s=Buffer.allocUnsafe(e),r=0;for(let n=0;n<t.length;n++){let i=t[n];s.set(i,r),r+=i.length}return r<e?new Ge(s.buffer,s.byteOffset,r):s}function wt(t,e,s,r,n){for(let i=0;i<n;i++)s[r+i]=t[i]^e[i&3]}function Tt(t,e){for(let s=0;s<t.length;s++)t[s]^=e[s&3]}function pr(t){return t.length===t.buffer.byteLength?t.buffer:t.buffer.slice(t.byteOffset,t.byteOffset+t.length)}function Ve(t){if(Ve.readOnly=!0,Buffer.isBuffer(t))return t;let e;return t instanceof ArrayBuffer?e=new Ge(t):ArrayBuffer.isView(t)?e=new Ge(t.buffer,t.byteOffset,t.byteLength):(e=Buffer.from(t),Ve.readOnly=!1),e}xe.exports={concat:dr,mask:wt,toArrayBuffer:pr,toBuffer:Ve,unmask:Tt};if(!process.env.WS_NO_BUFFER_UTIL)try{let t=require("bufferutil");xe.exports.mask=function(e,s,r,n,i){i<48?wt(e,s,r,n,i):t.mask(e,s,r,n,i)},xe.exports.unmask=function(e,s){e.length<32?Tt(e,s):t.unmask(e,s)}}catch{}});var Ct=C((gi,kt)=>{"use strict";var Ot=Symbol("kDone"),Ye=Symbol("kRun"),He=class{constructor(e){this[Ot]=()=>{this.pending--,this[Ye]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[Ye]()}[Ye](){if(this.pending!==this.concurrency&&this.jobs.length){let e=this.jobs.shift();this.pending++,e(this[Ot])}}};kt.exports=He});var ee=C((yi,Pt)=>{"use strict";var fe=require("zlib"),Nt=ce(),_r=Ct(),{kStatusCode:Lt}=F(),mr=Buffer[Symbol.species],gr=Buffer.from([0,0,255,255]),Ee=Symbol("permessage-deflate"),U=Symbol("total-length"),Z=Symbol("callback"),j=Symbol("buffers"),Q=Symbol("error"),be,ze=class{constructor(e){if(this._options=e||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._maxPayload=this._options.maxPayload|0,this._isServer=!!this._options.isServer,this._deflate=null,this._inflate=null,this.params=null,!be){let s=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;be=new _r(s)}}static get extensionName(){return"permessage-deflate"}offer(){let e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits==null&&(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let e=this._deflate[Z];this._deflate.close(),this._deflate=null,e&&e(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(e){let s=this._options,r=e.find(n=>!(s.serverNoContextTakeover===!1&&n.server_no_context_takeover||n.server_max_window_bits&&(s.serverMaxWindowBits===!1||typeof s.serverMaxWindowBits=="number"&&s.serverMaxWindowBits>n.server_max_window_bits)||typeof s.clientMaxWindowBits=="number"&&!n.client_max_window_bits));if(!r)throw new Error("None of the extension offers can be accepted");return s.serverNoContextTakeover&&(r.server_no_context_takeover=!0),s.clientNoContextTakeover&&(r.client_no_context_takeover=!0),typeof s.serverMaxWindowBits=="number"&&(r.server_max_window_bits=s.serverMaxWindowBits),typeof s.clientMaxWindowBits=="number"?r.client_max_window_bits=s.clientMaxWindowBits:(r.client_max_window_bits===!0||s.clientMaxWindowBits===!1)&&delete r.client_max_window_bits,r}acceptAsClient(e){let s=e[0];if(this._options.clientNoContextTakeover===!1&&s.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!s.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(s.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits=="number"&&s.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return s}normalizeParams(e){return e.forEach(s=>{Object.keys(s).forEach(r=>{let n=s[r];if(n.length>1)throw new Error(`Parameter "${r}" must have only a single value`);if(n=n[0],r==="client_max_window_bits"){if(n!==!0){let i=+n;if(!Number.isInteger(i)||i<8||i>15)throw new TypeError(`Invalid value for parameter "${r}": ${n}`);n=i}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${r}": ${n}`)}else if(r==="server_max_window_bits"){let i=+n;if(!Number.isInteger(i)||i<8||i>15)throw new TypeError(`Invalid value for parameter "${r}": ${n}`);n=i}else if(r==="client_no_context_takeover"||r==="server_no_context_takeover"){if(n!==!0)throw new TypeError(`Invalid value for parameter "${r}": ${n}`)}else throw new Error(`Unknown parameter "${r}"`);s[r]=n})}),e}decompress(e,s,r){be.add(n=>{this._decompress(e,s,(i,o)=>{n(),r(i,o)})})}compress(e,s,r){be.add(n=>{this._compress(e,s,(i,o)=>{n(),r(i,o)})})}_decompress(e,s,r){let n=this._isServer?"client":"server";if(!this._inflate){let i=`${n}_max_window_bits`,o=typeof this.params[i]!="number"?fe.Z_DEFAULT_WINDOWBITS:this.params[i];this._inflate=fe.createInflateRaw({...this._options.zlibInflateOptions,windowBits:o}),this._inflate[Ee]=this,this._inflate[U]=0,this._inflate[j]=[],this._inflate.on("error",Sr),this._inflate.on("data",Rt)}this._inflate[Z]=r,this._inflate.write(e),s&&this._inflate.write(gr),this._inflate.flush(()=>{let i=this._inflate[Q];if(i){this._inflate.close(),this._inflate=null,r(i);return}let o=Nt.concat(this._inflate[j],this._inflate[U]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[U]=0,this._inflate[j]=[],s&&this.params[`${n}_no_context_takeover`]&&this._inflate.reset()),r(null,o)})}_compress(e,s,r){let n=this._isServer?"server":"client";if(!this._deflate){let i=`${n}_max_window_bits`,o=typeof this.params[i]!="number"?fe.Z_DEFAULT_WINDOWBITS:this.params[i];this._deflate=fe.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:o}),this._deflate[U]=0,this._deflate[j]=[],this._deflate.on("data",yr)}this._deflate[Z]=r,this._deflate.write(e),this._deflate.flush(fe.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let i=Nt.concat(this._deflate[j],this._deflate[U]);s&&(i=new mr(i.buffer,i.byteOffset,i.length-4)),this._deflate[Z]=null,this._deflate[U]=0,this._deflate[j]=[],s&&this.params[`${n}_no_context_takeover`]&&this._deflate.reset(),r(null,i)})}};Pt.exports=ze;function yr(t){this[j].push(t),this[U]+=t.length}function Rt(t){if(this[U]+=t.length,this[Ee]._maxPayload<1||this[U]<=this[Ee]._maxPayload){this[j].push(t);return}this[Q]=new RangeError("Max payload size exceeded"),this[Q].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[Q][Lt]=1009,this.removeListener("data",Rt),this.reset()}function Sr(t){if(this[Ee]._inflate=null,this[Q]){this[Z](this[Q]);return}t[Lt]=1007,this[Z](t)}});var te=C((Si,ve)=>{"use strict";var{isUtf8:Bt}=require("buffer"),{hasBlob:xr}=F(),br=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function Er(t){return t>=1e3&&t<=1014&&t!==1004&&t!==1005&&t!==1006||t>=3e3&&t<=4999}function Ke(t){let e=t.length,s=0;for(;s<e;)if((t[s]&128)===0)s++;else if((t[s]&224)===192){if(s+1===e||(t[s+1]&192)!==128||(t[s]&254)===192)return!1;s+=2}else if((t[s]&240)===224){if(s+2>=e||(t[s+1]&192)!==128||(t[s+2]&192)!==128||t[s]===224&&(t[s+1]&224)===128||t[s]===237&&(t[s+1]&224)===160)return!1;s+=3}else if((t[s]&248)===240){if(s+3>=e||(t[s+1]&192)!==128||(t[s+2]&192)!==128||(t[s+3]&192)!==128||t[s]===240&&(t[s+1]&240)===128||t[s]===244&&t[s+1]>143||t[s]>244)return!1;s+=4}else return!1;return!0}function vr(t){return xr&&typeof t=="object"&&typeof t.arrayBuffer=="function"&&typeof t.type=="string"&&typeof t.stream=="function"&&(t[Symbol.toStringTag]==="Blob"||t[Symbol.toStringTag]==="File")}ve.exports={isBlob:vr,isValidStatusCode:Er,isValidUTF8:Ke,tokenChars:br};if(Bt)ve.exports.isValidUTF8=function(t){return t.length<24?Ke(t):Bt(t)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let t=require("utf-8-validate");ve.exports.isValidUTF8=function(e){return e.length<32?Ke(e):t(e)}}catch{}});var et=C((xi,Dt)=>{"use strict";var{Writable:wr}=require("stream"),It=ee(),{BINARY_TYPES:Tr,EMPTY_BUFFER:At,kStatusCode:Or,kWebSocket:kr}=F(),{concat:Je,toArrayBuffer:Cr,unmask:Nr}=ce(),{isValidStatusCode:Lr,isValidUTF8:Mt}=te(),we=Buffer[Symbol.species],L=0,$t=1,Ft=2,Ut=3,Xe=4,Ze=5,Te=6,Qe=class extends wr{constructor(e={}){super(),this._allowSynchronousEvents=e.allowSynchronousEvents!==void 0?e.allowSynchronousEvents:!0,this._binaryType=e.binaryType||Tr[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxPayload=e.maxPayload|0,this._skipUTF8Validation=!!e.skipUTF8Validation,this[kr]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=L}_write(e,s,r){if(this._opcode===8&&this._state==L)return r();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(r)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){let r=this._buffers[0];return this._buffers[0]=new we(r.buffer,r.byteOffset+e,r.length-e),new we(r.buffer,r.byteOffset,e)}let s=Buffer.allocUnsafe(e);do{let r=this._buffers[0],n=s.length-e;e>=r.length?s.set(this._buffers.shift(),n):(s.set(new Uint8Array(r.buffer,r.byteOffset,e),n),this._buffers[0]=new we(r.buffer,r.byteOffset+e,r.length-e)),e-=r.length}while(e>0);return s}startLoop(e){this._loop=!0;do switch(this._state){case L:this.getInfo(e);break;case $t:this.getPayloadLength16(e);break;case Ft:this.getPayloadLength64(e);break;case Ut:this.getMask();break;case Xe:this.getData(e);break;case Ze:case Te:this._loop=!1;return}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2){this._loop=!1;return}let s=this.consume(2);if((s[0]&48)!==0){let n=this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3");e(n);return}let r=(s[0]&64)===64;if(r&&!this._extensions[It.extensionName]){let n=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(n);return}if(this._fin=(s[0]&128)===128,this._opcode=s[0]&15,this._payloadLength=s[1]&127,this._opcode===0){if(r){let n=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(n);return}if(!this._fragmented){let n=this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE");e(n);return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){let n=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");e(n);return}this._compressed=r}else if(this._opcode>7&&this._opcode<11){if(!this._fin){let n=this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN");e(n);return}if(r){let n=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(n);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){let n=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH");e(n);return}}else{let n=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");e(n);return}if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(s[1]&128)===128,this._isServer){if(!this._masked){let n=this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK");e(n);return}}else if(this._masked){let n=this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK");e(n);return}this._payloadLength===126?this._state=$t:this._payloadLength===127?this._state=Ft:this.haveLength(e)}getPayloadLength16(e){if(this._bufferedBytes<2){this._loop=!1;return}this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(e)}getPayloadLength64(e){if(this._bufferedBytes<8){this._loop=!1;return}let s=this.consume(8),r=s.readUInt32BE(0);if(r>Math.pow(2,21)-1){let n=this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH");e(n);return}this._payloadLength=r*Math.pow(2,32)+s.readUInt32BE(4),this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){let s=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");e(s);return}this._masked?this._state=Ut:this._state=Xe}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=Xe}getData(e){let s=At;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=!1;return}s=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0&&Nr(s,this._mask)}if(this._opcode>7){this.controlMessage(s,e);return}if(this._compressed){this._state=Ze,this.decompress(s,e);return}s.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(s)),this.dataMessage(e)}decompress(e,s){this._extensions[It.extensionName].decompress(e,this._fin,(n,i)=>{if(n)return s(n);if(i.length){if(this._messageLength+=i.length,this._messageLength>this._maxPayload&&this._maxPayload>0){let o=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");s(o);return}this._fragments.push(i)}this.dataMessage(s),this._state===L&&this.startLoop(s)})}dataMessage(e){if(!this._fin){this._state=L;return}let s=this._messageLength,r=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let n;this._binaryType==="nodebuffer"?n=Je(r,s):this._binaryType==="arraybuffer"?n=Cr(Je(r,s)):this._binaryType==="blob"?n=new Blob(r):n=r,this._allowSynchronousEvents?(this.emit("message",n,!0),this._state=L):(this._state=Te,setImmediate(()=>{this.emit("message",n,!0),this._state=L,this.startLoop(e)}))}else{let n=Je(r,s);if(!this._skipUTF8Validation&&!Mt(n)){let i=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");e(i);return}this._state===Ze||this._allowSynchronousEvents?(this.emit("message",n,!1),this._state=L):(this._state=Te,setImmediate(()=>{this.emit("message",n,!1),this._state=L,this.startLoop(e)}))}}controlMessage(e,s){if(this._opcode===8){if(e.length===0)this._loop=!1,this.emit("conclude",1005,At),this.end();else{let r=e.readUInt16BE(0);if(!Lr(r)){let i=this.createError(RangeError,`invalid status code ${r}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");s(i);return}let n=new we(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!Mt(n)){let i=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");s(i);return}this._loop=!1,this.emit("conclude",r,n),this.end()}this._state=L;return}this._allowSynchronousEvents?(this.emit(this._opcode===9?"ping":"pong",e),this._state=L):(this._state=Te,setImmediate(()=>{this.emit(this._opcode===9?"ping":"pong",e),this._state=L,this.startLoop(s)}))}createError(e,s,r,n,i){this._loop=!1,this._errored=!0;let o=new e(r?`Invalid WebSocket frame: ${s}`:s);return Error.captureStackTrace(o,this.createError),o.code=i,o[Or]=n,o}};Dt.exports=Qe});var rt=C((Ei,qt)=>{"use strict";var{Duplex:bi}=require("stream"),{randomFillSync:Rr}=require("crypto"),Wt=ee(),{EMPTY_BUFFER:Pr,kWebSocket:Br,NOOP:Ir}=F(),{isBlob:se,isValidStatusCode:Ar}=te(),{mask:jt,toBuffer:V}=ce(),R=Symbol("kByteLength"),Mr=Buffer.alloc(4),Oe=8*1024,Y,re=Oe,I=0,$r=1,Fr=2,tt=class t{constructor(e,s,r){this._extensions=s||{},r&&(this._generateMask=r,this._maskBuffer=Buffer.alloc(4)),this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=I,this.onerror=Ir,this[Br]=void 0}static frame(e,s){let r,n=!1,i=2,o=!1;s.mask&&(r=s.maskBuffer||Mr,s.generateMask?s.generateMask(r):(re===Oe&&(Y===void 0&&(Y=Buffer.alloc(Oe)),Rr(Y,0,Oe),re=0),r[0]=Y[re++],r[1]=Y[re++],r[2]=Y[re++],r[3]=Y[re++]),o=(r[0]|r[1]|r[2]|r[3])===0,i=6);let a;typeof e=="string"?(!s.mask||o)&&s[R]!==void 0?a=s[R]:(e=Buffer.from(e),a=e.length):(a=e.length,n=s.mask&&s.readOnly&&!o);let c=a;a>=65536?(i+=8,c=127):a>125&&(i+=2,c=126);let l=Buffer.allocUnsafe(n?a+i:i);return l[0]=s.fin?s.opcode|128:s.opcode,s.rsv1&&(l[0]|=64),l[1]=c,c===126?l.writeUInt16BE(a,2):c===127&&(l[2]=l[3]=0,l.writeUIntBE(a,4,6)),s.mask?(l[1]|=128,l[i-4]=r[0],l[i-3]=r[1],l[i-2]=r[2],l[i-1]=r[3],o?[l,e]:n?(jt(e,r,l,i,a),[l]):(jt(e,r,e,0,a),[l,e])):[l,e]}close(e,s,r,n){let i;if(e===void 0)i=Pr;else{if(typeof e!="number"||!Ar(e))throw new TypeError("First argument must be a valid error code number");if(s===void 0||!s.length)i=Buffer.allocUnsafe(2),i.writeUInt16BE(e,0);else{let a=Buffer.byteLength(s);if(a>123)throw new RangeError("The message must not be greater than 123 bytes");i=Buffer.allocUnsafe(2+a),i.writeUInt16BE(e,0),typeof s=="string"?i.write(s,2):i.set(s,2)}}let o={[R]:i.length,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};this._state!==I?this.enqueue([this.dispatch,i,!1,o,n]):this.sendFrame(t.frame(i,o),n)}ping(e,s,r){let n,i;if(typeof e=="string"?(n=Buffer.byteLength(e),i=!1):se(e)?(n=e.size,i=!1):(e=V(e),n=e.length,i=V.readOnly),n>125)throw new RangeError("The data size must not be greater than 125 bytes");let o={[R]:n,fin:!0,generateMask:this._generateMask,mask:s,maskBuffer:this._maskBuffer,opcode:9,readOnly:i,rsv1:!1};se(e)?this._state!==I?this.enqueue([this.getBlobData,e,!1,o,r]):this.getBlobData(e,!1,o,r):this._state!==I?this.enqueue([this.dispatch,e,!1,o,r]):this.sendFrame(t.frame(e,o),r)}pong(e,s,r){let n,i;if(typeof e=="string"?(n=Buffer.byteLength(e),i=!1):se(e)?(n=e.size,i=!1):(e=V(e),n=e.length,i=V.readOnly),n>125)throw new RangeError("The data size must not be greater than 125 bytes");let o={[R]:n,fin:!0,generateMask:this._generateMask,mask:s,maskBuffer:this._maskBuffer,opcode:10,readOnly:i,rsv1:!1};se(e)?this._state!==I?this.enqueue([this.getBlobData,e,!1,o,r]):this.getBlobData(e,!1,o,r):this._state!==I?this.enqueue([this.dispatch,e,!1,o,r]):this.sendFrame(t.frame(e,o),r)}send(e,s,r){let n=this._extensions[Wt.extensionName],i=s.binary?2:1,o=s.compress,a,c;typeof e=="string"?(a=Buffer.byteLength(e),c=!1):se(e)?(a=e.size,c=!1):(e=V(e),a=e.length,c=V.readOnly),this._firstFragment?(this._firstFragment=!1,o&&n&&n.params[n._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(o=a>=n._threshold),this._compress=o):(o=!1,i=0),s.fin&&(this._firstFragment=!0);let l={[R]:a,fin:s.fin,generateMask:this._generateMask,mask:s.mask,maskBuffer:this._maskBuffer,opcode:i,readOnly:c,rsv1:o};se(e)?this._state!==I?this.enqueue([this.getBlobData,e,this._compress,l,r]):this.getBlobData(e,this._compress,l,r):this._state!==I?this.enqueue([this.dispatch,e,this._compress,l,r]):this.dispatch(e,this._compress,l,r)}getBlobData(e,s,r,n){this._bufferedBytes+=r[R],this._state=Fr,e.arrayBuffer().then(i=>{if(this._socket.destroyed){let a=new Error("The socket was closed while the blob was being read");process.nextTick(st,this,a,n);return}this._bufferedBytes-=r[R];let o=V(i);s?this.dispatch(o,s,r,n):(this._state=I,this.sendFrame(t.frame(o,r),n),this.dequeue())}).catch(i=>{process.nextTick(Ur,this,i,n)})}dispatch(e,s,r,n){if(!s){this.sendFrame(t.frame(e,r),n);return}let i=this._extensions[Wt.extensionName];this._bufferedBytes+=r[R],this._state=$r,i.compress(e,r.fin,(o,a)=>{if(this._socket.destroyed){let c=new Error("The socket was closed while data was being compressed");st(this,c,n);return}this._bufferedBytes-=r[R],this._state=I,r.readOnly=!1,this.sendFrame(t.frame(a,r),n),this.dequeue()})}dequeue(){for(;this._state===I&&this._queue.length;){let e=this._queue.shift();this._bufferedBytes-=e[3][R],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][R],this._queue.push(e)}sendFrame(e,s){e.length===2?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],s),this._socket.uncork()):this._socket.write(e[0],s)}};qt.exports=tt;function st(t,e,s){typeof s=="function"&&s(e);for(let r=0;r<t._queue.length;r++){let n=t._queue[r],i=n[n.length-1];typeof i=="function"&&i(e)}}function Ur(t,e,s){st(t,e,s),t.onerror(e)}});var Zt=C((vi,Xt)=>{"use strict";var{kForOnEventAttribute:ue,kListener:nt}=F(),Gt=Symbol("kCode"),Vt=Symbol("kData"),Yt=Symbol("kError"),Ht=Symbol("kMessage"),zt=Symbol("kReason"),ne=Symbol("kTarget"),Kt=Symbol("kType"),Jt=Symbol("kWasClean"),D=class{constructor(e){this[ne]=null,this[Kt]=e}get target(){return this[ne]}get type(){return this[Kt]}};Object.defineProperty(D.prototype,"target",{enumerable:!0});Object.defineProperty(D.prototype,"type",{enumerable:!0});var H=class extends D{constructor(e,s={}){super(e),this[Gt]=s.code===void 0?0:s.code,this[zt]=s.reason===void 0?"":s.reason,this[Jt]=s.wasClean===void 0?!1:s.wasClean}get code(){return this[Gt]}get reason(){return this[zt]}get wasClean(){return this[Jt]}};Object.defineProperty(H.prototype,"code",{enumerable:!0});Object.defineProperty(H.prototype,"reason",{enumerable:!0});Object.defineProperty(H.prototype,"wasClean",{enumerable:!0});var ie=class extends D{constructor(e,s={}){super(e),this[Yt]=s.error===void 0?null:s.error,this[Ht]=s.message===void 0?"":s.message}get error(){return this[Yt]}get message(){return this[Ht]}};Object.defineProperty(ie.prototype,"error",{enumerable:!0});Object.defineProperty(ie.prototype,"message",{enumerable:!0});var he=class extends D{constructor(e,s={}){super(e),this[Vt]=s.data===void 0?null:s.data}get data(){return this[Vt]}};Object.defineProperty(he.prototype,"data",{enumerable:!0});var Dr={addEventListener(t,e,s={}){for(let n of this.listeners(t))if(!s[ue]&&n[nt]===e&&!n[ue])return;let r;if(t==="message")r=function(i,o){let a=new he("message",{data:o?i:i.toString()});a[ne]=this,ke(e,this,a)};else if(t==="close")r=function(i,o){let a=new H("close",{code:i,reason:o.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});a[ne]=this,ke(e,this,a)};else if(t==="error")r=function(i){let o=new ie("error",{error:i,message:i.message});o[ne]=this,ke(e,this,o)};else if(t==="open")r=function(){let i=new D("open");i[ne]=this,ke(e,this,i)};else return;r[ue]=!!s[ue],r[nt]=e,s.once?this.once(t,r):this.on(t,r)},removeEventListener(t,e){for(let s of this.listeners(t))if(s[nt]===e&&!s[ue]){this.removeListener(t,s);break}}};Xt.exports={CloseEvent:H,ErrorEvent:ie,Event:D,EventTarget:Dr,MessageEvent:he};function ke(t,e,s){typeof t=="object"&&t.handleEvent?t.handleEvent.call(t,s):t.call(e,s)}});var Ce=C((wi,Qt)=>{"use strict";var{tokenChars:de}=te();function M(t,e,s){t[e]===void 0?t[e]=[s]:t[e].push(s)}function Wr(t){let e=Object.create(null),s=Object.create(null),r=!1,n=!1,i=!1,o,a,c=-1,l=-1,h=-1,p=0;for(;p<t.length;p++)if(l=t.charCodeAt(p),o===void 0)if(h===-1&&de[l]===1)c===-1&&(c=p);else if(p!==0&&(l===32||l===9))h===-1&&c!==-1&&(h=p);else if(l===59||l===44){if(c===-1)throw new SyntaxError(`Unexpected character at index ${p}`);h===-1&&(h=p);let w=t.slice(c,h);l===44?(M(e,w,s),s=Object.create(null)):o=w,c=h=-1}else throw new SyntaxError(`Unexpected character at index ${p}`);else if(a===void 0)if(h===-1&&de[l]===1)c===-1&&(c=p);else if(l===32||l===9)h===-1&&c!==-1&&(h=p);else if(l===59||l===44){if(c===-1)throw new SyntaxError(`Unexpected character at index ${p}`);h===-1&&(h=p),M(s,t.slice(c,h),!0),l===44&&(M(e,o,s),s=Object.create(null),o=void 0),c=h=-1}else if(l===61&&c!==-1&&h===-1)a=t.slice(c,p),c=h=-1;else throw new SyntaxError(`Unexpected character at index ${p}`);else if(n){if(de[l]!==1)throw new SyntaxError(`Unexpected character at index ${p}`);c===-1?c=p:r||(r=!0),n=!1}else if(i)if(de[l]===1)c===-1&&(c=p);else if(l===34&&c!==-1)i=!1,h=p;else if(l===92)n=!0;else throw new SyntaxError(`Unexpected character at index ${p}`);else if(l===34&&t.charCodeAt(p-1)===61)i=!0;else if(h===-1&&de[l]===1)c===-1&&(c=p);else if(c!==-1&&(l===32||l===9))h===-1&&(h=p);else if(l===59||l===44){if(c===-1)throw new SyntaxError(`Unexpected character at index ${p}`);h===-1&&(h=p);let w=t.slice(c,h);r&&(w=w.replace(/\\/g,""),r=!1),M(s,a,w),l===44&&(M(e,o,s),s=Object.create(null),o=void 0),a=void 0,c=h=-1}else throw new SyntaxError(`Unexpected character at index ${p}`);if(c===-1||i||l===32||l===9)throw new SyntaxError("Unexpected end of input");h===-1&&(h=p);let g=t.slice(c,h);return o===void 0?M(e,g,s):(a===void 0?M(s,g,!0):r?M(s,a,g.replace(/\\/g,"")):M(s,a,g),M(e,o,s)),e}function jr(t){return Object.keys(t).map(e=>{let s=t[e];return Array.isArray(s)||(s=[s]),s.map(r=>[e].concat(Object.keys(r).map(n=>{let i=r[n];return Array.isArray(i)||(i=[i]),i.map(o=>o===!0?n:`${n}=${o}`).join("; ")})).join("; ")).join(", ")}).join(", ")}Qt.exports={format:jr,parse:Wr}});var Pe=C((ki,us)=>{"use strict";var qr=require("events"),Gr=require("https"),Vr=require("http"),ss=require("net"),Yr=require("tls"),{randomBytes:Hr,createHash:zr}=require("crypto"),{Duplex:Ti,Readable:Oi}=require("stream"),{URL:it}=require("url"),q=ee(),Kr=et(),Jr=rt(),{isBlob:Xr}=te(),{BINARY_TYPES:es,CLOSE_TIMEOUT:Zr,EMPTY_BUFFER:Ne,GUID:Qr,kForOnEventAttribute:ot,kListener:en,kStatusCode:tn,kWebSocket:O,NOOP:rs}=F(),{EventTarget:{addEventListener:sn,removeEventListener:rn}}=Zt(),{format:nn,parse:on}=Ce(),{toBuffer:an}=ce(),ns=Symbol("kAborted"),at=[8,13],W=["CONNECTING","OPEN","CLOSING","CLOSED"],ln=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/,b=class t extends qr{constructor(e,s,r){super(),this._binaryType=es[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=Ne,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol="",this._readyState=t.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,e!==null?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,s===void 0?s=[]:Array.isArray(s)||(typeof s=="object"&&s!==null?(r=s,s=[]):s=[s]),is(this,e,s,r)):(this._autoPong=r.autoPong,this._closeTimeout=r.closeTimeout,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(e){es.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(e,s,r){let n=new Kr({allowSynchronousEvents:r.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:r.maxPayload,skipUTF8Validation:r.skipUTF8Validation}),i=new Jr(e,this._extensions,r.generateMask);this._receiver=n,this._sender=i,this._socket=e,n[O]=this,i[O]=this,e[O]=this,n.on("conclude",un),n.on("drain",hn),n.on("error",dn),n.on("message",pn),n.on("ping",_n),n.on("pong",mn),i.onerror=gn,e.setTimeout&&e.setTimeout(0),e.setNoDelay&&e.setNoDelay(),s.length>0&&e.unshift(s),e.on("close",ls),e.on("data",Re),e.on("end",cs),e.on("error",fs),this._readyState=t.OPEN,this.emit("open")}emitClose(){if(!this._socket){this._readyState=t.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[q.extensionName]&&this._extensions[q.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=t.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(e,s){if(this.readyState!==t.CLOSED){if(this.readyState===t.CONNECTING){N(this,this._req,"WebSocket was closed before the connection was established");return}if(this.readyState===t.CLOSING){this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();return}this._readyState=t.CLOSING,this._sender.close(e,s,!this._isServer,r=>{r||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),as(this)}}pause(){this.readyState===t.CONNECTING||this.readyState===t.CLOSED||(this._paused=!0,this._socket.pause())}ping(e,s,r){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof e=="function"?(r=e,e=s=void 0):typeof s=="function"&&(r=s,s=void 0),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){lt(this,e,r);return}s===void 0&&(s=!this._isServer),this._sender.ping(e||Ne,s,r)}pong(e,s,r){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof e=="function"?(r=e,e=s=void 0):typeof s=="function"&&(r=s,s=void 0),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){lt(this,e,r);return}s===void 0&&(s=!this._isServer),this._sender.pong(e||Ne,s,r)}resume(){this.readyState===t.CONNECTING||this.readyState===t.CLOSED||(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(e,s,r){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof s=="function"&&(r=s,s={}),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){lt(this,e,r);return}let n={binary:typeof e!="string",mask:!this._isServer,compress:!0,fin:!0,...s};this._extensions[q.extensionName]||(n.compress=!1),this._sender.send(e||Ne,n,r)}terminate(){if(this.readyState!==t.CLOSED){if(this.readyState===t.CONNECTING){N(this,this._req,"WebSocket was closed before the connection was established");return}this._socket&&(this._readyState=t.CLOSING,this._socket.destroy())}}};Object.defineProperty(b,"CONNECTING",{enumerable:!0,value:W.indexOf("CONNECTING")});Object.defineProperty(b.prototype,"CONNECTING",{enumerable:!0,value:W.indexOf("CONNECTING")});Object.defineProperty(b,"OPEN",{enumerable:!0,value:W.indexOf("OPEN")});Object.defineProperty(b.prototype,"OPEN",{enumerable:!0,value:W.indexOf("OPEN")});Object.defineProperty(b,"CLOSING",{enumerable:!0,value:W.indexOf("CLOSING")});Object.defineProperty(b.prototype,"CLOSING",{enumerable:!0,value:W.indexOf("CLOSING")});Object.defineProperty(b,"CLOSED",{enumerable:!0,value:W.indexOf("CLOSED")});Object.defineProperty(b.prototype,"CLOSED",{enumerable:!0,value:W.indexOf("CLOSED")});["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach(t=>{Object.defineProperty(b.prototype,t,{enumerable:!0})});["open","error","close","message"].forEach(t=>{Object.defineProperty(b.prototype,`on${t}`,{enumerable:!0,get(){for(let e of this.listeners(t))if(e[ot])return e[en];return null},set(e){for(let s of this.listeners(t))if(s[ot]){this.removeListener(t,s);break}typeof e=="function"&&this.addEventListener(t,e,{[ot]:!0})}})});b.prototype.addEventListener=sn;b.prototype.removeEventListener=rn;us.exports=b;function is(t,e,s,r){let n={allowSynchronousEvents:!0,autoPong:!0,closeTimeout:Zr,protocolVersion:at[1],maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...r,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(t._autoPong=n.autoPong,t._closeTimeout=n.closeTimeout,!at.includes(n.protocolVersion))throw new RangeError(`Unsupported protocol version: ${n.protocolVersion} (supported versions: ${at.join(", ")})`);let i;if(e instanceof it)i=e;else try{i=new it(e)}catch{throw new SyntaxError(`Invalid URL: ${e}`)}i.protocol==="http:"?i.protocol="ws:":i.protocol==="https:"&&(i.protocol="wss:"),t._url=i.href;let o=i.protocol==="wss:",a=i.protocol==="ws+unix:",c;if(i.protocol!=="ws:"&&!o&&!a?c=`The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`:a&&!i.pathname?c="The URL's pathname is empty":i.hash&&(c="The URL contains a fragment identifier"),c){let _=new SyntaxError(c);if(t._redirects===0)throw _;Le(t,_);return}let l=o?443:80,h=Hr(16).toString("base64"),p=o?Gr.request:Vr.request,g=new Set,w;if(n.createConnection=n.createConnection||(o?fn:cn),n.defaultPort=n.defaultPort||l,n.port=i.port||l,n.host=i.hostname.startsWith("[")?i.hostname.slice(1,-1):i.hostname,n.headers={...n.headers,"Sec-WebSocket-Version":n.protocolVersion,"Sec-WebSocket-Key":h,Connection:"Upgrade",Upgrade:"websocket"},n.path=i.pathname+i.search,n.timeout=n.handshakeTimeout,n.perMessageDeflate&&(w=new q({...n.perMessageDeflate,isServer:!1,maxPayload:n.maxPayload}),n.headers["Sec-WebSocket-Extensions"]=nn({[q.extensionName]:w.offer()})),s.length){for(let _ of s){if(typeof _!="string"||!ln.test(_)||g.has(_))throw new SyntaxError("An invalid or duplicated subprotocol was specified");g.add(_)}n.headers["Sec-WebSocket-Protocol"]=s.join(",")}if(n.origin&&(n.protocolVersion<13?n.headers["Sec-WebSocket-Origin"]=n.origin:n.headers.Origin=n.origin),(i.username||i.password)&&(n.auth=`${i.username}:${i.password}`),a){let _=n.path.split(":");n.socketPath=_[0],n.path=_[1]}let m;if(n.followRedirects){if(t._redirects===0){t._originalIpc=a,t._originalSecure=o,t._originalHostOrSocketPath=a?n.socketPath:i.host;let _=r&&r.headers;if(r={...r,headers:{}},_)for(let[f,d]of Object.entries(_))r.headers[f.toLowerCase()]=d}else if(t.listenerCount("redirect")===0){let _=a?t._originalIpc?n.socketPath===t._originalHostOrSocketPath:!1:t._originalIpc?!1:i.host===t._originalHostOrSocketPath;(!_||t._originalSecure&&!o)&&(delete n.headers.authorization,delete n.headers.cookie,_||delete n.headers.host,n.auth=void 0)}n.auth&&!r.headers.authorization&&(r.headers.authorization="Basic "+Buffer.from(n.auth).toString("base64")),m=t._req=p(n),t._redirects&&t.emit("redirect",t.url,m)}else m=t._req=p(n);n.timeout&&m.on("timeout",()=>{N(t,m,"Opening handshake has timed out")}),m.on("error",_=>{m===null||m[ns]||(m=t._req=null,Le(t,_))}),m.on("response",_=>{let f=_.headers.location,d=_.statusCode;if(f&&n.followRedirects&&d>=300&&d<400){if(++t._redirects>n.maxRedirects){N(t,m,"Maximum redirects exceeded");return}m.abort();let S;try{S=new it(f,e)}catch{let y=new SyntaxError(`Invalid URL: ${f}`);Le(t,y);return}is(t,S,s,r)}else t.emit("unexpected-response",m,_)||N(t,m,`Unexpected server response: ${_.statusCode}`)}),m.on("upgrade",(_,f,d)=>{if(t.emit("upgrade",_),t.readyState!==b.CONNECTING)return;m=t._req=null;let S=_.headers.upgrade;if(S===void 0||S.toLowerCase()!=="websocket"){N(t,f,"Invalid Upgrade header");return}let T=zr("sha1").update(h+Qr).digest("base64");if(_.headers["sec-websocket-accept"]!==T){N(t,f,"Invalid Sec-WebSocket-Accept header");return}let y=_.headers["sec-websocket-protocol"],B;if(y!==void 0?g.size?g.has(y)||(B="Server sent an invalid subprotocol"):B="Server sent a subprotocol but none was requested":g.size&&(B="Server sent no subprotocol"),B){N(t,f,B);return}y&&(t._protocol=y);let X=_.headers["sec-websocket-extensions"];if(X!==void 0){if(!w){N(t,f,"Server sent a Sec-WebSocket-Extensions header but no extension was requested");return}let G;try{G=on(X)}catch{N(t,f,"Invalid Sec-WebSocket-Extensions header");return}let St=Object.keys(G);if(St.length!==1||St[0]!==q.extensionName){N(t,f,"Server indicated an extension that was not requested");return}try{w.accept(G[q.extensionName])}catch{N(t,f,"Invalid Sec-WebSocket-Extensions header");return}t._extensions[q.extensionName]=w}t.setSocket(f,d,{allowSynchronousEvents:n.allowSynchronousEvents,generateMask:n.generateMask,maxPayload:n.maxPayload,skipUTF8Validation:n.skipUTF8Validation})}),n.finishRequest?n.finishRequest(m,t):m.end()}function Le(t,e){t._readyState=b.CLOSING,t._errorEmitted=!0,t.emit("error",e),t.emitClose()}function cn(t){return t.path=t.socketPath,ss.connect(t)}function fn(t){return t.path=void 0,!t.servername&&t.servername!==""&&(t.servername=ss.isIP(t.host)?"":t.host),Yr.connect(t)}function N(t,e,s){t._readyState=b.CLOSING;let r=new Error(s);Error.captureStackTrace(r,N),e.setHeader?(e[ns]=!0,e.abort(),e.socket&&!e.socket.destroyed&&e.socket.destroy(),process.nextTick(Le,t,r)):(e.destroy(r),e.once("error",t.emit.bind(t,"error")),e.once("close",t.emitClose.bind(t)))}function lt(t,e,s){if(e){let r=Xr(e)?e.size:an(e).length;t._socket?t._sender._bufferedBytes+=r:t._bufferedAmount+=r}if(s){let r=new Error(`WebSocket is not open: readyState ${t.readyState} (${W[t.readyState]})`);process.nextTick(s,r)}}function un(t,e){let s=this[O];s._closeFrameReceived=!0,s._closeMessage=e,s._closeCode=t,s._socket[O]!==void 0&&(s._socket.removeListener("data",Re),process.nextTick(os,s._socket),t===1005?s.close():s.close(t,e))}function hn(){let t=this[O];t.isPaused||t._socket.resume()}function dn(t){let e=this[O];e._socket[O]!==void 0&&(e._socket.removeListener("data",Re),process.nextTick(os,e._socket),e.close(t[tn])),e._errorEmitted||(e._errorEmitted=!0,e.emit("error",t))}function ts(){this[O].emitClose()}function pn(t,e){this[O].emit("message",t,e)}function _n(t){let e=this[O];e._autoPong&&e.pong(t,!this._isServer,rs),e.emit("ping",t)}function mn(t){this[O].emit("pong",t)}function os(t){t.resume()}function gn(t){let e=this[O];e.readyState!==b.CLOSED&&(e.readyState===b.OPEN&&(e._readyState=b.CLOSING,as(e)),this._socket.end(),e._errorEmitted||(e._errorEmitted=!0,e.emit("error",t)))}function as(t){t._closeTimer=setTimeout(t._socket.destroy.bind(t._socket),t._closeTimeout)}function ls(){let t=this[O];if(this.removeListener("close",ls),this.removeListener("data",Re),this.removeListener("end",cs),t._readyState=b.CLOSING,!this._readableState.endEmitted&&!t._closeFrameReceived&&!t._receiver._writableState.errorEmitted&&this._readableState.length!==0){let e=this.read(this._readableState.length);t._receiver.write(e)}t._receiver.end(),this[O]=void 0,clearTimeout(t._closeTimer),t._receiver._writableState.finished||t._receiver._writableState.errorEmitted?t.emitClose():(t._receiver.on("error",ts),t._receiver.on("finish",ts))}function Re(t){this[O]._receiver.write(t)||this.pause()}function cs(){let t=this[O];t._readyState=b.CLOSING,t._receiver.end(),this.end()}function fs(){let t=this[O];this.removeListener("error",fs),this.on("error",rs),t&&(t._readyState=b.CLOSING,this.destroy())}});var _s=C((Ni,ps)=>{"use strict";var Ci=Pe(),{Duplex:yn}=require("stream");function hs(t){t.emit("close")}function Sn(){!this.destroyed&&this._writableState.finished&&this.destroy()}function ds(t){this.removeListener("error",ds),this.destroy(),this.listenerCount("error")===0&&this.emit("error",t)}function xn(t,e){let s=!0,r=new yn({...e,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return t.on("message",function(i,o){let a=!o&&r._readableState.objectMode?i.toString():i;r.push(a)||t.pause()}),t.once("error",function(i){r.destroyed||(s=!1,r.destroy(i))}),t.once("close",function(){r.destroyed||r.push(null)}),r._destroy=function(n,i){if(t.readyState===t.CLOSED){i(n),process.nextTick(hs,r);return}let o=!1;t.once("error",function(c){o=!0,i(c)}),t.once("close",function(){o||i(n),process.nextTick(hs,r)}),s&&t.terminate()},r._final=function(n){if(t.readyState===t.CONNECTING){t.once("open",function(){r._final(n)});return}t._socket!==null&&(t._socket._writableState.finished?(n(),r._readableState.endEmitted&&r.destroy()):(t._socket.once("finish",function(){n()}),t.close()))},r._read=function(){t.isPaused&&t.resume()},r._write=function(n,i,o){if(t.readyState===t.CONNECTING){t.once("open",function(){r._write(n,i,o)});return}t.send(n,o)},r.on("end",Sn),r.on("error",ds),r}ps.exports=xn});var ct=C((Li,ms)=>{"use strict";var{tokenChars:bn}=te();function En(t){let e=new Set,s=-1,r=-1,n=0;for(n;n<t.length;n++){let o=t.charCodeAt(n);if(r===-1&&bn[o]===1)s===-1&&(s=n);else if(n!==0&&(o===32||o===9))r===-1&&s!==-1&&(r=n);else if(o===44){if(s===-1)throw new SyntaxError(`Unexpected character at index ${n}`);r===-1&&(r=n);let a=t.slice(s,r);if(e.has(a))throw new SyntaxError(`The "${a}" subprotocol is duplicated`);e.add(a),s=r=-1}else throw new SyntaxError(`Unexpected character at index ${n}`)}if(s===-1||r!==-1)throw new SyntaxError("Unexpected end of input");let i=t.slice(s,n);if(e.has(i))throw new SyntaxError(`The "${i}" subprotocol is duplicated`);return e.add(i),e}ms.exports={parse:En}});var vs=C((Pi,Es)=>{"use strict";var vn=require("events"),Be=require("http"),{Duplex:Ri}=require("stream"),{createHash:wn}=require("crypto"),gs=Ce(),z=ee(),Tn=ct(),On=Pe(),{CLOSE_TIMEOUT:kn,GUID:Cn,kWebSocket:Nn}=F(),Ln=/^[+/0-9A-Za-z]{22}==$/,ys=0,Ss=1,bs=2,ft=class extends vn{constructor(e,s){if(super(),e={allowSynchronousEvents:!0,autoPong:!0,maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:kn,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:On,...e},e.port==null&&!e.server&&!e.noServer||e.port!=null&&(e.server||e.noServer)||e.server&&e.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(e.port!=null?(this._server=Be.createServer((r,n)=>{let i=Be.STATUS_CODES[426];n.writeHead(426,{"Content-Length":i.length,"Content-Type":"text/plain"}),n.end(i)}),this._server.listen(e.port,e.host,e.backlog,s)):e.server&&(this._server=e.server),this._server){let r=this.emit.bind(this,"connection");this._removeListeners=Rn(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(n,i,o)=>{this.handleUpgrade(n,i,o,r)}})}e.perMessageDeflate===!0&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=ys}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(e){if(this._state===bs){e&&this.once("close",()=>{e(new Error("The server is not running"))}),process.nextTick(pe,this);return}if(e&&this.once("close",e),this._state!==Ss)if(this._state=Ss,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients?this.clients.size?this._shouldEmitClose=!0:process.nextTick(pe,this):process.nextTick(pe,this);else{let s=this._server;this._removeListeners(),this._removeListeners=this._server=null,s.close(()=>{pe(this)})}}shouldHandle(e){if(this.options.path){let s=e.url.indexOf("?");if((s!==-1?e.url.slice(0,s):e.url)!==this.options.path)return!1}return!0}handleUpgrade(e,s,r,n){s.on("error",xs);let i=e.headers["sec-websocket-key"],o=e.headers.upgrade,a=+e.headers["sec-websocket-version"];if(e.method!=="GET"){K(this,e,s,405,"Invalid HTTP method");return}if(o===void 0||o.toLowerCase()!=="websocket"){K(this,e,s,400,"Invalid Upgrade header");return}if(i===void 0||!Ln.test(i)){K(this,e,s,400,"Missing or invalid Sec-WebSocket-Key header");return}if(a!==13&&a!==8){K(this,e,s,400,"Missing or invalid Sec-WebSocket-Version header",{"Sec-WebSocket-Version":"13, 8"});return}if(!this.shouldHandle(e)){_e(s,400);return}let c=e.headers["sec-websocket-protocol"],l=new Set;if(c!==void 0)try{l=Tn.parse(c)}catch{K(this,e,s,400,"Invalid Sec-WebSocket-Protocol header");return}let h=e.headers["sec-websocket-extensions"],p={};if(this.options.perMessageDeflate&&h!==void 0){let g=new z({...this.options.perMessageDeflate,isServer:!0,maxPayload:this.options.maxPayload});try{let w=gs.parse(h);w[z.extensionName]&&(g.accept(w[z.extensionName]),p[z.extensionName]=g)}catch{K(this,e,s,400,"Invalid or unacceptable Sec-WebSocket-Extensions header");return}}if(this.options.verifyClient){let g={origin:e.headers[`${a===8?"sec-websocket-origin":"origin"}`],secure:!!(e.socket.authorized||e.socket.encrypted),req:e};if(this.options.verifyClient.length===2){this.options.verifyClient(g,(w,m,_,f)=>{if(!w)return _e(s,m||401,_,f);this.completeUpgrade(p,i,l,e,s,r,n)});return}if(!this.options.verifyClient(g))return _e(s,401)}this.completeUpgrade(p,i,l,e,s,r,n)}completeUpgrade(e,s,r,n,i,o,a){if(!i.readable||!i.writable)return i.destroy();if(i[Nn])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>ys)return _e(i,503);let l=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${wn("sha1").update(s+Cn).digest("base64")}`],h=new this.options.WebSocket(null,void 0,this.options);if(r.size){let p=this.options.handleProtocols?this.options.handleProtocols(r,n):r.values().next().value;p&&(l.push(`Sec-WebSocket-Protocol: ${p}`),h._protocol=p)}if(e[z.extensionName]){let p=e[z.extensionName].params,g=gs.format({[z.extensionName]:[p]});l.push(`Sec-WebSocket-Extensions: ${g}`),h._extensions=e}this.emit("headers",l,n),i.write(l.concat(`\r
2
+ "use strict";var gr=Object.create;var Pt=Object.defineProperty;var mr=Object.getOwnPropertyDescriptor;var yr=Object.getOwnPropertyNames;var Sr=Object.getPrototypeOf,xr=Object.prototype.hasOwnProperty;var L=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var br=(t,e,s,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of yr(e))!xr.call(t,n)&&n!==s&&Pt(t,n,{get:()=>e[n],enumerable:!(r=mr(e,n))||r.enumerable});return t};var E=(t,e,s)=>(s=t!=null?gr(Sr(t)):{},br(e||!t||!t.__esModule?Pt(s,"default",{value:t,enumerable:!0}):s,t));var j=L((Oo,Bt)=>{"use strict";var $t=["nodebuffer","arraybuffer","fragments"],It=typeof Blob<"u";It&&$t.push("blob");Bt.exports={BINARY_TYPES:$t,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:It,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}}});var pe=L((Co,Ce)=>{"use strict";var{EMPTY_BUFFER:Er}=j(),Qe=Buffer[Symbol.species];function wr(t,e){if(t.length===0)return Er;if(t.length===1)return t[0];let s=Buffer.allocUnsafe(e),r=0;for(let n=0;n<t.length;n++){let o=t[n];s.set(o,r),r+=o.length}return r<e?new Qe(s.buffer,s.byteOffset,r):s}function Mt(t,e,s,r,n){for(let o=0;o<n;o++)s[r+o]=t[o]^e[o&3]}function At(t,e){for(let s=0;s<t.length;s++)t[s]^=e[s&3]}function vr(t){return t.length===t.buffer.byteLength?t.buffer:t.buffer.slice(t.byteOffset,t.byteOffset+t.length)}function et(t){if(et.readOnly=!0,Buffer.isBuffer(t))return t;let e;return t instanceof ArrayBuffer?e=new Qe(t):ArrayBuffer.isView(t)?e=new Qe(t.buffer,t.byteOffset,t.byteLength):(e=Buffer.from(t),et.readOnly=!1),e}Ce.exports={concat:wr,mask:Mt,toArrayBuffer:vr,toBuffer:et,unmask:At};if(!process.env.WS_NO_BUFFER_UTIL)try{let t=require("bufferutil");Ce.exports.mask=function(e,s,r,n,o){o<48?Mt(e,s,r,n,o):t.mask(e,s,r,n,o)},Ce.exports.unmask=function(e,s){e.length<32?At(e,s):t.unmask(e,s)}}catch{}});var Dt=L((ko,Ft)=>{"use strict";var Ut=Symbol("kDone"),tt=Symbol("kRun"),st=class{constructor(e){this[Ut]=()=>{this.pending--,this[tt]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[tt]()}[tt](){if(this.pending!==this.concurrency&&this.jobs.length){let e=this.jobs.shift();this.pending++,e(this[Ut])}}};Ft.exports=st});var re=L((No,Gt)=>{"use strict";var _e=require("zlib"),Wt=pe(),Tr=Dt(),{kStatusCode:jt}=j(),Or=Buffer[Symbol.species],Cr=Buffer.from([0,0,255,255]),Ne=Symbol("permessage-deflate"),q=Symbol("total-length"),te=Symbol("callback"),H=Symbol("buffers"),se=Symbol("error"),ke,rt=class{constructor(e){if(this._options=e||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._maxPayload=this._options.maxPayload|0,this._isServer=!!this._options.isServer,this._deflate=null,this._inflate=null,this.params=null,!ke){let s=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;ke=new Tr(s)}}static get extensionName(){return"permessage-deflate"}offer(){let e={};return this._options.serverNoContextTakeover&&(e.server_no_context_takeover=!0),this._options.clientNoContextTakeover&&(e.client_no_context_takeover=!0),this._options.serverMaxWindowBits&&(e.server_max_window_bits=this._options.serverMaxWindowBits),this._options.clientMaxWindowBits?e.client_max_window_bits=this._options.clientMaxWindowBits:this._options.clientMaxWindowBits==null&&(e.client_max_window_bits=!0),e}accept(e){return e=this.normalizeParams(e),this.params=this._isServer?this.acceptAsServer(e):this.acceptAsClient(e),this.params}cleanup(){if(this._inflate&&(this._inflate.close(),this._inflate=null),this._deflate){let e=this._deflate[te];this._deflate.close(),this._deflate=null,e&&e(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(e){let s=this._options,r=e.find(n=>!(s.serverNoContextTakeover===!1&&n.server_no_context_takeover||n.server_max_window_bits&&(s.serverMaxWindowBits===!1||typeof s.serverMaxWindowBits=="number"&&s.serverMaxWindowBits>n.server_max_window_bits)||typeof s.clientMaxWindowBits=="number"&&!n.client_max_window_bits));if(!r)throw new Error("None of the extension offers can be accepted");return s.serverNoContextTakeover&&(r.server_no_context_takeover=!0),s.clientNoContextTakeover&&(r.client_no_context_takeover=!0),typeof s.serverMaxWindowBits=="number"&&(r.server_max_window_bits=s.serverMaxWindowBits),typeof s.clientMaxWindowBits=="number"?r.client_max_window_bits=s.clientMaxWindowBits:(r.client_max_window_bits===!0||s.clientMaxWindowBits===!1)&&delete r.client_max_window_bits,r}acceptAsClient(e){let s=e[0];if(this._options.clientNoContextTakeover===!1&&s.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!s.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(s.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits=="number"&&s.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return s}normalizeParams(e){return e.forEach(s=>{Object.keys(s).forEach(r=>{let n=s[r];if(n.length>1)throw new Error(`Parameter "${r}" must have only a single value`);if(n=n[0],r==="client_max_window_bits"){if(n!==!0){let o=+n;if(!Number.isInteger(o)||o<8||o>15)throw new TypeError(`Invalid value for parameter "${r}": ${n}`);n=o}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${r}": ${n}`)}else if(r==="server_max_window_bits"){let o=+n;if(!Number.isInteger(o)||o<8||o>15)throw new TypeError(`Invalid value for parameter "${r}": ${n}`);n=o}else if(r==="client_no_context_takeover"||r==="server_no_context_takeover"){if(n!==!0)throw new TypeError(`Invalid value for parameter "${r}": ${n}`)}else throw new Error(`Unknown parameter "${r}"`);s[r]=n})}),e}decompress(e,s,r){ke.add(n=>{this._decompress(e,s,(o,i)=>{n(),r(o,i)})})}compress(e,s,r){ke.add(n=>{this._compress(e,s,(o,i)=>{n(),r(o,i)})})}_decompress(e,s,r){let n=this._isServer?"client":"server";if(!this._inflate){let o=`${n}_max_window_bits`,i=typeof this.params[o]!="number"?_e.Z_DEFAULT_WINDOWBITS:this.params[o];this._inflate=_e.createInflateRaw({...this._options.zlibInflateOptions,windowBits:i}),this._inflate[Ne]=this,this._inflate[q]=0,this._inflate[H]=[],this._inflate.on("error",Nr),this._inflate.on("data",qt)}this._inflate[te]=r,this._inflate.write(e),s&&this._inflate.write(Cr),this._inflate.flush(()=>{let o=this._inflate[se];if(o){this._inflate.close(),this._inflate=null,r(o);return}let i=Wt.concat(this._inflate[H],this._inflate[q]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[q]=0,this._inflate[H]=[],s&&this.params[`${n}_no_context_takeover`]&&this._inflate.reset()),r(null,i)})}_compress(e,s,r){let n=this._isServer?"server":"client";if(!this._deflate){let o=`${n}_max_window_bits`,i=typeof this.params[o]!="number"?_e.Z_DEFAULT_WINDOWBITS:this.params[o];this._deflate=_e.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:i}),this._deflate[q]=0,this._deflate[H]=[],this._deflate.on("data",kr)}this._deflate[te]=r,this._deflate.write(e),this._deflate.flush(_e.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let o=Wt.concat(this._deflate[H],this._deflate[q]);s&&(o=new Or(o.buffer,o.byteOffset,o.length-4)),this._deflate[te]=null,this._deflate[q]=0,this._deflate[H]=[],s&&this.params[`${n}_no_context_takeover`]&&this._deflate.reset(),r(null,o)})}};Gt.exports=rt;function kr(t){this[H].push(t),this[q]+=t.length}function qt(t){if(this[q]+=t.length,this[Ne]._maxPayload<1||this[q]<=this[Ne]._maxPayload){this[H].push(t);return}this[se]=new RangeError("Max payload size exceeded"),this[se].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[se][jt]=1009,this.removeListener("data",qt),this.reset()}function Nr(t){if(this[Ne]._inflate=null,this[se]){this[te](this[se]);return}t[jt]=1007,this[te](t)}});var ne=L((Ro,Re)=>{"use strict";var{isUtf8:Vt}=require("buffer"),{hasBlob:Rr}=j(),Lr=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,0];function Pr(t){return t>=1e3&&t<=1014&&t!==1004&&t!==1005&&t!==1006||t>=3e3&&t<=4999}function nt(t){let e=t.length,s=0;for(;s<e;)if((t[s]&128)===0)s++;else if((t[s]&224)===192){if(s+1===e||(t[s+1]&192)!==128||(t[s]&254)===192)return!1;s+=2}else if((t[s]&240)===224){if(s+2>=e||(t[s+1]&192)!==128||(t[s+2]&192)!==128||t[s]===224&&(t[s+1]&224)===128||t[s]===237&&(t[s+1]&224)===160)return!1;s+=3}else if((t[s]&248)===240){if(s+3>=e||(t[s+1]&192)!==128||(t[s+2]&192)!==128||(t[s+3]&192)!==128||t[s]===240&&(t[s+1]&240)===128||t[s]===244&&t[s+1]>143||t[s]>244)return!1;s+=4}else return!1;return!0}function $r(t){return Rr&&typeof t=="object"&&typeof t.arrayBuffer=="function"&&typeof t.type=="string"&&typeof t.stream=="function"&&(t[Symbol.toStringTag]==="Blob"||t[Symbol.toStringTag]==="File")}Re.exports={isBlob:$r,isValidStatusCode:Pr,isValidUTF8:nt,tokenChars:Lr};if(Vt)Re.exports.isValidUTF8=function(t){return t.length<24?nt(t):Vt(t)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let t=require("utf-8-validate");Re.exports.isValidUTF8=function(e){return e.length<32?nt(e):t(e)}}catch{}});var ct=L((Lo,Zt)=>{"use strict";var{Writable:Ir}=require("stream"),Yt=re(),{BINARY_TYPES:Br,EMPTY_BUFFER:zt,kStatusCode:Mr,kWebSocket:Ar}=j(),{concat:ot,toArrayBuffer:Ur,unmask:Fr}=pe(),{isValidStatusCode:Dr,isValidUTF8:Ht}=ne(),Le=Buffer[Symbol.species],$=0,Kt=1,Jt=2,Xt=3,it=4,at=5,Pe=6,lt=class extends Ir{constructor(e={}){super(),this._allowSynchronousEvents=e.allowSynchronousEvents!==void 0?e.allowSynchronousEvents:!0,this._binaryType=e.binaryType||Br[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxPayload=e.maxPayload|0,this._skipUTF8Validation=!!e.skipUTF8Validation,this[Ar]=void 0,this._bufferedBytes=0,this._buffers=[],this._compressed=!1,this._payloadLength=0,this._mask=void 0,this._fragmented=0,this._masked=!1,this._fin=!1,this._opcode=0,this._totalPayloadLength=0,this._messageLength=0,this._fragments=[],this._errored=!1,this._loop=!1,this._state=$}_write(e,s,r){if(this._opcode===8&&this._state==$)return r();this._bufferedBytes+=e.length,this._buffers.push(e),this.startLoop(r)}consume(e){if(this._bufferedBytes-=e,e===this._buffers[0].length)return this._buffers.shift();if(e<this._buffers[0].length){let r=this._buffers[0];return this._buffers[0]=new Le(r.buffer,r.byteOffset+e,r.length-e),new Le(r.buffer,r.byteOffset,e)}let s=Buffer.allocUnsafe(e);do{let r=this._buffers[0],n=s.length-e;e>=r.length?s.set(this._buffers.shift(),n):(s.set(new Uint8Array(r.buffer,r.byteOffset,e),n),this._buffers[0]=new Le(r.buffer,r.byteOffset+e,r.length-e)),e-=r.length}while(e>0);return s}startLoop(e){this._loop=!0;do switch(this._state){case $:this.getInfo(e);break;case Kt:this.getPayloadLength16(e);break;case Jt:this.getPayloadLength64(e);break;case Xt:this.getMask();break;case it:this.getData(e);break;case at:case Pe:this._loop=!1;return}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2){this._loop=!1;return}let s=this.consume(2);if((s[0]&48)!==0){let n=this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3");e(n);return}let r=(s[0]&64)===64;if(r&&!this._extensions[Yt.extensionName]){let n=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(n);return}if(this._fin=(s[0]&128)===128,this._opcode=s[0]&15,this._payloadLength=s[1]&127,this._opcode===0){if(r){let n=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(n);return}if(!this._fragmented){let n=this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE");e(n);return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){let n=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");e(n);return}this._compressed=r}else if(this._opcode>7&&this._opcode<11){if(!this._fin){let n=this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN");e(n);return}if(r){let n=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(n);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){let n=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH");e(n);return}}else{let n=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");e(n);return}if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(s[1]&128)===128,this._isServer){if(!this._masked){let n=this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK");e(n);return}}else if(this._masked){let n=this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK");e(n);return}this._payloadLength===126?this._state=Kt:this._payloadLength===127?this._state=Jt:this.haveLength(e)}getPayloadLength16(e){if(this._bufferedBytes<2){this._loop=!1;return}this._payloadLength=this.consume(2).readUInt16BE(0),this.haveLength(e)}getPayloadLength64(e){if(this._bufferedBytes<8){this._loop=!1;return}let s=this.consume(8),r=s.readUInt32BE(0);if(r>Math.pow(2,21)-1){let n=this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH");e(n);return}this._payloadLength=r*Math.pow(2,32)+s.readUInt32BE(4),this.haveLength(e)}haveLength(e){if(this._payloadLength&&this._opcode<8&&(this._totalPayloadLength+=this._payloadLength,this._totalPayloadLength>this._maxPayload&&this._maxPayload>0)){let s=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");e(s);return}this._masked?this._state=Xt:this._state=it}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=it}getData(e){let s=zt;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=!1;return}s=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0&&Fr(s,this._mask)}if(this._opcode>7){this.controlMessage(s,e);return}if(this._compressed){this._state=at,this.decompress(s,e);return}s.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(s)),this.dataMessage(e)}decompress(e,s){this._extensions[Yt.extensionName].decompress(e,this._fin,(n,o)=>{if(n)return s(n);if(o.length){if(this._messageLength+=o.length,this._messageLength>this._maxPayload&&this._maxPayload>0){let i=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");s(i);return}this._fragments.push(o)}this.dataMessage(s),this._state===$&&this.startLoop(s)})}dataMessage(e){if(!this._fin){this._state=$;return}let s=this._messageLength,r=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let n;this._binaryType==="nodebuffer"?n=ot(r,s):this._binaryType==="arraybuffer"?n=Ur(ot(r,s)):this._binaryType==="blob"?n=new Blob(r):n=r,this._allowSynchronousEvents?(this.emit("message",n,!0),this._state=$):(this._state=Pe,setImmediate(()=>{this.emit("message",n,!0),this._state=$,this.startLoop(e)}))}else{let n=ot(r,s);if(!this._skipUTF8Validation&&!Ht(n)){let o=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");e(o);return}this._state===at||this._allowSynchronousEvents?(this.emit("message",n,!1),this._state=$):(this._state=Pe,setImmediate(()=>{this.emit("message",n,!1),this._state=$,this.startLoop(e)}))}}controlMessage(e,s){if(this._opcode===8){if(e.length===0)this._loop=!1,this.emit("conclude",1005,zt),this.end();else{let r=e.readUInt16BE(0);if(!Dr(r)){let o=this.createError(RangeError,`invalid status code ${r}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");s(o);return}let n=new Le(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!Ht(n)){let o=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");s(o);return}this._loop=!1,this.emit("conclude",r,n),this.end()}this._state=$;return}this._allowSynchronousEvents?(this.emit(this._opcode===9?"ping":"pong",e),this._state=$):(this._state=Pe,setImmediate(()=>{this.emit(this._opcode===9?"ping":"pong",e),this._state=$,this.startLoop(s)}))}createError(e,s,r,n,o){this._loop=!1,this._errored=!0;let i=new e(r?`Invalid WebSocket frame: ${s}`:s);return Error.captureStackTrace(i,this.createError),i.code=o,i[Mr]=n,i}};Zt.exports=lt});var ht=L(($o,ts)=>{"use strict";var{Duplex:Po}=require("stream"),{randomFillSync:Wr}=require("crypto"),Qt=re(),{EMPTY_BUFFER:jr,kWebSocket:qr,NOOP:Gr}=j(),{isBlob:oe,isValidStatusCode:Vr}=ne(),{mask:es,toBuffer:J}=pe(),I=Symbol("kByteLength"),Yr=Buffer.alloc(4),$e=8*1024,X,ie=$e,M=0,zr=1,Hr=2,ft=class t{constructor(e,s,r){this._extensions=s||{},r&&(this._generateMask=r,this._maskBuffer=Buffer.alloc(4)),this._socket=e,this._firstFragment=!0,this._compress=!1,this._bufferedBytes=0,this._queue=[],this._state=M,this.onerror=Gr,this[qr]=void 0}static frame(e,s){let r,n=!1,o=2,i=!1;s.mask&&(r=s.maskBuffer||Yr,s.generateMask?s.generateMask(r):(ie===$e&&(X===void 0&&(X=Buffer.alloc($e)),Wr(X,0,$e),ie=0),r[0]=X[ie++],r[1]=X[ie++],r[2]=X[ie++],r[3]=X[ie++]),i=(r[0]|r[1]|r[2]|r[3])===0,o=6);let f;typeof e=="string"?(!s.mask||i)&&s[I]!==void 0?f=s[I]:(e=Buffer.from(e),f=e.length):(f=e.length,n=s.mask&&s.readOnly&&!i);let c=f;f>=65536?(o+=8,c=127):f>125&&(o+=2,c=126);let u=Buffer.allocUnsafe(n?f+o:o);return u[0]=s.fin?s.opcode|128:s.opcode,s.rsv1&&(u[0]|=64),u[1]=c,c===126?u.writeUInt16BE(f,2):c===127&&(u[2]=u[3]=0,u.writeUIntBE(f,4,6)),s.mask?(u[1]|=128,u[o-4]=r[0],u[o-3]=r[1],u[o-2]=r[2],u[o-1]=r[3],i?[u,e]:n?(es(e,r,u,o,f),[u]):(es(e,r,e,0,f),[u,e])):[u,e]}close(e,s,r,n){let o;if(e===void 0)o=jr;else{if(typeof e!="number"||!Vr(e))throw new TypeError("First argument must be a valid error code number");if(s===void 0||!s.length)o=Buffer.allocUnsafe(2),o.writeUInt16BE(e,0);else{let f=Buffer.byteLength(s);if(f>123)throw new RangeError("The message must not be greater than 123 bytes");o=Buffer.allocUnsafe(2+f),o.writeUInt16BE(e,0),typeof s=="string"?o.write(s,2):o.set(s,2)}}let i={[I]:o.length,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};this._state!==M?this.enqueue([this.dispatch,o,!1,i,n]):this.sendFrame(t.frame(o,i),n)}ping(e,s,r){let n,o;if(typeof e=="string"?(n=Buffer.byteLength(e),o=!1):oe(e)?(n=e.size,o=!1):(e=J(e),n=e.length,o=J.readOnly),n>125)throw new RangeError("The data size must not be greater than 125 bytes");let i={[I]:n,fin:!0,generateMask:this._generateMask,mask:s,maskBuffer:this._maskBuffer,opcode:9,readOnly:o,rsv1:!1};oe(e)?this._state!==M?this.enqueue([this.getBlobData,e,!1,i,r]):this.getBlobData(e,!1,i,r):this._state!==M?this.enqueue([this.dispatch,e,!1,i,r]):this.sendFrame(t.frame(e,i),r)}pong(e,s,r){let n,o;if(typeof e=="string"?(n=Buffer.byteLength(e),o=!1):oe(e)?(n=e.size,o=!1):(e=J(e),n=e.length,o=J.readOnly),n>125)throw new RangeError("The data size must not be greater than 125 bytes");let i={[I]:n,fin:!0,generateMask:this._generateMask,mask:s,maskBuffer:this._maskBuffer,opcode:10,readOnly:o,rsv1:!1};oe(e)?this._state!==M?this.enqueue([this.getBlobData,e,!1,i,r]):this.getBlobData(e,!1,i,r):this._state!==M?this.enqueue([this.dispatch,e,!1,i,r]):this.sendFrame(t.frame(e,i),r)}send(e,s,r){let n=this._extensions[Qt.extensionName],o=s.binary?2:1,i=s.compress,f,c;typeof e=="string"?(f=Buffer.byteLength(e),c=!1):oe(e)?(f=e.size,c=!1):(e=J(e),f=e.length,c=J.readOnly),this._firstFragment?(this._firstFragment=!1,i&&n&&n.params[n._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(i=f>=n._threshold),this._compress=i):(i=!1,o=0),s.fin&&(this._firstFragment=!0);let u={[I]:f,fin:s.fin,generateMask:this._generateMask,mask:s.mask,maskBuffer:this._maskBuffer,opcode:o,readOnly:c,rsv1:i};oe(e)?this._state!==M?this.enqueue([this.getBlobData,e,this._compress,u,r]):this.getBlobData(e,this._compress,u,r):this._state!==M?this.enqueue([this.dispatch,e,this._compress,u,r]):this.dispatch(e,this._compress,u,r)}getBlobData(e,s,r,n){this._bufferedBytes+=r[I],this._state=Hr,e.arrayBuffer().then(o=>{if(this._socket.destroyed){let f=new Error("The socket was closed while the blob was being read");process.nextTick(ut,this,f,n);return}this._bufferedBytes-=r[I];let i=J(o);s?this.dispatch(i,s,r,n):(this._state=M,this.sendFrame(t.frame(i,r),n),this.dequeue())}).catch(o=>{process.nextTick(Kr,this,o,n)})}dispatch(e,s,r,n){if(!s){this.sendFrame(t.frame(e,r),n);return}let o=this._extensions[Qt.extensionName];this._bufferedBytes+=r[I],this._state=zr,o.compress(e,r.fin,(i,f)=>{if(this._socket.destroyed){let c=new Error("The socket was closed while data was being compressed");ut(this,c,n);return}this._bufferedBytes-=r[I],this._state=M,r.readOnly=!1,this.sendFrame(t.frame(f,r),n),this.dequeue()})}dequeue(){for(;this._state===M&&this._queue.length;){let e=this._queue.shift();this._bufferedBytes-=e[3][I],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][I],this._queue.push(e)}sendFrame(e,s){e.length===2?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],s),this._socket.uncork()):this._socket.write(e[0],s)}};ts.exports=ft;function ut(t,e,s){typeof s=="function"&&s(e);for(let r=0;r<t._queue.length;r++){let n=t._queue[r],o=n[n.length-1];typeof o=="function"&&o(e)}}function Kr(t,e,s){ut(t,e,s),t.onerror(e)}});var fs=L((Io,cs)=>{"use strict";var{kForOnEventAttribute:ge,kListener:dt}=j(),ss=Symbol("kCode"),rs=Symbol("kData"),ns=Symbol("kError"),os=Symbol("kMessage"),is=Symbol("kReason"),ae=Symbol("kTarget"),as=Symbol("kType"),ls=Symbol("kWasClean"),G=class{constructor(e){this[ae]=null,this[as]=e}get target(){return this[ae]}get type(){return this[as]}};Object.defineProperty(G.prototype,"target",{enumerable:!0});Object.defineProperty(G.prototype,"type",{enumerable:!0});var Z=class extends G{constructor(e,s={}){super(e),this[ss]=s.code===void 0?0:s.code,this[is]=s.reason===void 0?"":s.reason,this[ls]=s.wasClean===void 0?!1:s.wasClean}get code(){return this[ss]}get reason(){return this[is]}get wasClean(){return this[ls]}};Object.defineProperty(Z.prototype,"code",{enumerable:!0});Object.defineProperty(Z.prototype,"reason",{enumerable:!0});Object.defineProperty(Z.prototype,"wasClean",{enumerable:!0});var le=class extends G{constructor(e,s={}){super(e),this[ns]=s.error===void 0?null:s.error,this[os]=s.message===void 0?"":s.message}get error(){return this[ns]}get message(){return this[os]}};Object.defineProperty(le.prototype,"error",{enumerable:!0});Object.defineProperty(le.prototype,"message",{enumerable:!0});var me=class extends G{constructor(e,s={}){super(e),this[rs]=s.data===void 0?null:s.data}get data(){return this[rs]}};Object.defineProperty(me.prototype,"data",{enumerable:!0});var Jr={addEventListener(t,e,s={}){for(let n of this.listeners(t))if(!s[ge]&&n[dt]===e&&!n[ge])return;let r;if(t==="message")r=function(o,i){let f=new me("message",{data:i?o:o.toString()});f[ae]=this,Ie(e,this,f)};else if(t==="close")r=function(o,i){let f=new Z("close",{code:o,reason:i.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});f[ae]=this,Ie(e,this,f)};else if(t==="error")r=function(o){let i=new le("error",{error:o,message:o.message});i[ae]=this,Ie(e,this,i)};else if(t==="open")r=function(){let o=new G("open");o[ae]=this,Ie(e,this,o)};else return;r[ge]=!!s[ge],r[dt]=e,s.once?this.once(t,r):this.on(t,r)},removeEventListener(t,e){for(let s of this.listeners(t))if(s[dt]===e&&!s[ge]){this.removeListener(t,s);break}}};cs.exports={CloseEvent:Z,ErrorEvent:le,Event:G,EventTarget:Jr,MessageEvent:me};function Ie(t,e,s){typeof t=="object"&&t.handleEvent?t.handleEvent.call(t,s):t.call(e,s)}});var Be=L((Bo,us)=>{"use strict";var{tokenChars:ye}=ne();function F(t,e,s){t[e]===void 0?t[e]=[s]:t[e].push(s)}function Xr(t){let e=Object.create(null),s=Object.create(null),r=!1,n=!1,o=!1,i,f,c=-1,u=-1,d=-1,p=0;for(;p<t.length;p++)if(u=t.charCodeAt(p),i===void 0)if(d===-1&&ye[u]===1)c===-1&&(c=p);else if(p!==0&&(u===32||u===9))d===-1&&c!==-1&&(d=p);else if(u===59||u===44){if(c===-1)throw new SyntaxError(`Unexpected character at index ${p}`);d===-1&&(d=p);let _=t.slice(c,d);u===44?(F(e,_,s),s=Object.create(null)):i=_,c=d=-1}else throw new SyntaxError(`Unexpected character at index ${p}`);else if(f===void 0)if(d===-1&&ye[u]===1)c===-1&&(c=p);else if(u===32||u===9)d===-1&&c!==-1&&(d=p);else if(u===59||u===44){if(c===-1)throw new SyntaxError(`Unexpected character at index ${p}`);d===-1&&(d=p),F(s,t.slice(c,d),!0),u===44&&(F(e,i,s),s=Object.create(null),i=void 0),c=d=-1}else if(u===61&&c!==-1&&d===-1)f=t.slice(c,p),c=d=-1;else throw new SyntaxError(`Unexpected character at index ${p}`);else if(n){if(ye[u]!==1)throw new SyntaxError(`Unexpected character at index ${p}`);c===-1?c=p:r||(r=!0),n=!1}else if(o)if(ye[u]===1)c===-1&&(c=p);else if(u===34&&c!==-1)o=!1,d=p;else if(u===92)n=!0;else throw new SyntaxError(`Unexpected character at index ${p}`);else if(u===34&&t.charCodeAt(p-1)===61)o=!0;else if(d===-1&&ye[u]===1)c===-1&&(c=p);else if(c!==-1&&(u===32||u===9))d===-1&&(d=p);else if(u===59||u===44){if(c===-1)throw new SyntaxError(`Unexpected character at index ${p}`);d===-1&&(d=p);let _=t.slice(c,d);r&&(_=_.replace(/\\/g,""),r=!1),F(s,f,_),u===44&&(F(e,i,s),s=Object.create(null),i=void 0),f=void 0,c=d=-1}else throw new SyntaxError(`Unexpected character at index ${p}`);if(c===-1||o||u===32||u===9)throw new SyntaxError("Unexpected end of input");d===-1&&(d=p);let x=t.slice(c,d);return i===void 0?F(e,x,s):(f===void 0?F(s,x,!0):r?F(s,f,x.replace(/\\/g,"")):F(s,f,x),F(e,i,s)),e}function Zr(t){return Object.keys(t).map(e=>{let s=t[e];return Array.isArray(s)||(s=[s]),s.map(r=>[e].concat(Object.keys(r).map(n=>{let o=r[n];return Array.isArray(o)||(o=[o]),o.map(i=>i===!0?n:`${n}=${i}`).join("; ")})).join("; ")).join(", ")}).join(", ")}us.exports={format:Zr,parse:Xr}});var Fe=L((Uo,ws)=>{"use strict";var Qr=require("events"),en=require("https"),tn=require("http"),ps=require("net"),sn=require("tls"),{randomBytes:rn,createHash:nn}=require("crypto"),{Duplex:Mo,Readable:Ao}=require("stream"),{URL:pt}=require("url"),K=re(),on=ct(),an=ht(),{isBlob:ln}=ne(),{BINARY_TYPES:hs,CLOSE_TIMEOUT:cn,EMPTY_BUFFER:Me,GUID:fn,kForOnEventAttribute:_t,kListener:un,kStatusCode:hn,kWebSocket:k,NOOP:_s}=j(),{EventTarget:{addEventListener:dn,removeEventListener:pn}}=fs(),{format:_n,parse:gn}=Be(),{toBuffer:mn}=pe(),gs=Symbol("kAborted"),gt=[8,13],V=["CONNECTING","OPEN","CLOSING","CLOSED"],yn=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/,w=class t extends Qr{constructor(e,s,r){super(),this._binaryType=hs[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=Me,this._closeTimer=null,this._errorEmitted=!1,this._extensions={},this._paused=!1,this._protocol="",this._readyState=t.CONNECTING,this._receiver=null,this._sender=null,this._socket=null,e!==null?(this._bufferedAmount=0,this._isServer=!1,this._redirects=0,s===void 0?s=[]:Array.isArray(s)||(typeof s=="object"&&s!==null?(r=s,s=[]):s=[s]),ms(this,e,s,r)):(this._autoPong=r.autoPong,this._closeTimeout=r.closeTimeout,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(e){hs.includes(e)&&(this._binaryType=e,this._receiver&&(this._receiver._binaryType=e))}get bufferedAmount(){return this._socket?this._socket._writableState.length+this._sender._bufferedBytes:this._bufferedAmount}get extensions(){return Object.keys(this._extensions).join()}get isPaused(){return this._paused}get onclose(){return null}get onerror(){return null}get onopen(){return null}get onmessage(){return null}get protocol(){return this._protocol}get readyState(){return this._readyState}get url(){return this._url}setSocket(e,s,r){let n=new on({allowSynchronousEvents:r.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:r.maxPayload,skipUTF8Validation:r.skipUTF8Validation}),o=new an(e,this._extensions,r.generateMask);this._receiver=n,this._sender=o,this._socket=e,n[k]=this,o[k]=this,e[k]=this,n.on("conclude",bn),n.on("drain",En),n.on("error",wn),n.on("message",vn),n.on("ping",Tn),n.on("pong",On),o.onerror=Cn,e.setTimeout&&e.setTimeout(0),e.setNoDelay&&e.setNoDelay(),s.length>0&&e.unshift(s),e.on("close",xs),e.on("data",Ue),e.on("end",bs),e.on("error",Es),this._readyState=t.OPEN,this.emit("open")}emitClose(){if(!this._socket){this._readyState=t.CLOSED,this.emit("close",this._closeCode,this._closeMessage);return}this._extensions[K.extensionName]&&this._extensions[K.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=t.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(e,s){if(this.readyState!==t.CLOSED){if(this.readyState===t.CONNECTING){P(this,this._req,"WebSocket was closed before the connection was established");return}if(this.readyState===t.CLOSING){this._closeFrameSent&&(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end();return}this._readyState=t.CLOSING,this._sender.close(e,s,!this._isServer,r=>{r||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),Ss(this)}}pause(){this.readyState===t.CONNECTING||this.readyState===t.CLOSED||(this._paused=!0,this._socket.pause())}ping(e,s,r){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof e=="function"?(r=e,e=s=void 0):typeof s=="function"&&(r=s,s=void 0),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){mt(this,e,r);return}s===void 0&&(s=!this._isServer),this._sender.ping(e||Me,s,r)}pong(e,s,r){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof e=="function"?(r=e,e=s=void 0):typeof s=="function"&&(r=s,s=void 0),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){mt(this,e,r);return}s===void 0&&(s=!this._isServer),this._sender.pong(e||Me,s,r)}resume(){this.readyState===t.CONNECTING||this.readyState===t.CLOSED||(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(e,s,r){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof s=="function"&&(r=s,s={}),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){mt(this,e,r);return}let n={binary:typeof e!="string",mask:!this._isServer,compress:!0,fin:!0,...s};this._extensions[K.extensionName]||(n.compress=!1),this._sender.send(e||Me,n,r)}terminate(){if(this.readyState!==t.CLOSED){if(this.readyState===t.CONNECTING){P(this,this._req,"WebSocket was closed before the connection was established");return}this._socket&&(this._readyState=t.CLOSING,this._socket.destroy())}}};Object.defineProperty(w,"CONNECTING",{enumerable:!0,value:V.indexOf("CONNECTING")});Object.defineProperty(w.prototype,"CONNECTING",{enumerable:!0,value:V.indexOf("CONNECTING")});Object.defineProperty(w,"OPEN",{enumerable:!0,value:V.indexOf("OPEN")});Object.defineProperty(w.prototype,"OPEN",{enumerable:!0,value:V.indexOf("OPEN")});Object.defineProperty(w,"CLOSING",{enumerable:!0,value:V.indexOf("CLOSING")});Object.defineProperty(w.prototype,"CLOSING",{enumerable:!0,value:V.indexOf("CLOSING")});Object.defineProperty(w,"CLOSED",{enumerable:!0,value:V.indexOf("CLOSED")});Object.defineProperty(w.prototype,"CLOSED",{enumerable:!0,value:V.indexOf("CLOSED")});["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach(t=>{Object.defineProperty(w.prototype,t,{enumerable:!0})});["open","error","close","message"].forEach(t=>{Object.defineProperty(w.prototype,`on${t}`,{enumerable:!0,get(){for(let e of this.listeners(t))if(e[_t])return e[un];return null},set(e){for(let s of this.listeners(t))if(s[_t]){this.removeListener(t,s);break}typeof e=="function"&&this.addEventListener(t,e,{[_t]:!0})}})});w.prototype.addEventListener=dn;w.prototype.removeEventListener=pn;ws.exports=w;function ms(t,e,s,r){let n={allowSynchronousEvents:!0,autoPong:!0,closeTimeout:cn,protocolVersion:gt[1],maxPayload:104857600,skipUTF8Validation:!1,perMessageDeflate:!0,followRedirects:!1,maxRedirects:10,...r,socketPath:void 0,hostname:void 0,protocol:void 0,timeout:void 0,method:"GET",host:void 0,path:void 0,port:void 0};if(t._autoPong=n.autoPong,t._closeTimeout=n.closeTimeout,!gt.includes(n.protocolVersion))throw new RangeError(`Unsupported protocol version: ${n.protocolVersion} (supported versions: ${gt.join(", ")})`);let o;if(e instanceof pt)o=e;else try{o=new pt(e)}catch{throw new SyntaxError(`Invalid URL: ${e}`)}o.protocol==="http:"?o.protocol="ws:":o.protocol==="https:"&&(o.protocol="wss:"),t._url=o.href;let i=o.protocol==="wss:",f=o.protocol==="ws+unix:",c;if(o.protocol!=="ws:"&&!i&&!f?c=`The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`:f&&!o.pathname?c="The URL's pathname is empty":o.hash&&(c="The URL contains a fragment identifier"),c){let y=new SyntaxError(c);if(t._redirects===0)throw y;Ae(t,y);return}let u=i?443:80,d=rn(16).toString("base64"),p=i?en.request:tn.request,x=new Set,_;if(n.createConnection=n.createConnection||(i?xn:Sn),n.defaultPort=n.defaultPort||u,n.port=o.port||u,n.host=o.hostname.startsWith("[")?o.hostname.slice(1,-1):o.hostname,n.headers={...n.headers,"Sec-WebSocket-Version":n.protocolVersion,"Sec-WebSocket-Key":d,Connection:"Upgrade",Upgrade:"websocket"},n.path=o.pathname+o.search,n.timeout=n.handshakeTimeout,n.perMessageDeflate&&(_=new K({...n.perMessageDeflate,isServer:!1,maxPayload:n.maxPayload}),n.headers["Sec-WebSocket-Extensions"]=_n({[K.extensionName]:_.offer()})),s.length){for(let y of s){if(typeof y!="string"||!yn.test(y)||x.has(y))throw new SyntaxError("An invalid or duplicated subprotocol was specified");x.add(y)}n.headers["Sec-WebSocket-Protocol"]=s.join(",")}if(n.origin&&(n.protocolVersion<13?n.headers["Sec-WebSocket-Origin"]=n.origin:n.headers.Origin=n.origin),(o.username||o.password)&&(n.auth=`${o.username}:${o.password}`),f){let y=n.path.split(":");n.socketPath=y[0],n.path=y[1]}let S;if(n.followRedirects){if(t._redirects===0){t._originalIpc=f,t._originalSecure=i,t._originalHostOrSocketPath=f?n.socketPath:o.host;let y=r&&r.headers;if(r={...r,headers:{}},y)for(let[g,W]of Object.entries(y))r.headers[g.toLowerCase()]=W}else if(t.listenerCount("redirect")===0){let y=f?t._originalIpc?n.socketPath===t._originalHostOrSocketPath:!1:t._originalIpc?!1:o.host===t._originalHostOrSocketPath;(!y||t._originalSecure&&!i)&&(delete n.headers.authorization,delete n.headers.cookie,y||delete n.headers.host,n.auth=void 0)}n.auth&&!r.headers.authorization&&(r.headers.authorization="Basic "+Buffer.from(n.auth).toString("base64")),S=t._req=p(n),t._redirects&&t.emit("redirect",t.url,S)}else S=t._req=p(n);n.timeout&&S.on("timeout",()=>{P(t,S,"Opening handshake has timed out")}),S.on("error",y=>{S===null||S[gs]||(S=t._req=null,Ae(t,y))}),S.on("response",y=>{let g=y.headers.location,W=y.statusCode;if(g&&n.followRedirects&&W>=300&&W<400){if(++t._redirects>n.maxRedirects){P(t,S,"Maximum redirects exceeded");return}S.abort();let Y;try{Y=new pt(g,e)}catch{let l=new SyntaxError(`Invalid URL: ${g}`);Ae(t,l);return}ms(t,Y,s,r)}else t.emit("unexpected-response",S,y)||P(t,S,`Unexpected server response: ${y.statusCode}`)}),S.on("upgrade",(y,g,W)=>{if(t.emit("upgrade",y),t.readyState!==w.CONNECTING)return;S=t._req=null;let Y=y.headers.upgrade;if(Y===void 0||Y.toLowerCase()!=="websocket"){P(t,g,"Invalid Upgrade header");return}let N=nn("sha1").update(d+fn).digest("base64");if(y.headers["sec-websocket-accept"]!==N){P(t,g,"Invalid Sec-WebSocket-Accept header");return}let l=y.headers["sec-websocket-protocol"],h;if(l!==void 0?x.size?x.has(l)||(h="Server sent an invalid subprotocol"):h="Server sent a subprotocol but none was requested":x.size&&(h="Server sent no subprotocol"),h){P(t,g,h);return}l&&(t._protocol=l);let m=y.headers["sec-websocket-extensions"];if(m!==void 0){if(!_){P(t,g,"Server sent a Sec-WebSocket-Extensions header but no extension was requested");return}let O;try{O=gn(m)}catch{P(t,g,"Invalid Sec-WebSocket-Extensions header");return}let b=Object.keys(O);if(b.length!==1||b[0]!==K.extensionName){P(t,g,"Server indicated an extension that was not requested");return}try{_.accept(O[K.extensionName])}catch{P(t,g,"Invalid Sec-WebSocket-Extensions header");return}t._extensions[K.extensionName]=_}t.setSocket(g,W,{allowSynchronousEvents:n.allowSynchronousEvents,generateMask:n.generateMask,maxPayload:n.maxPayload,skipUTF8Validation:n.skipUTF8Validation})}),n.finishRequest?n.finishRequest(S,t):S.end()}function Ae(t,e){t._readyState=w.CLOSING,t._errorEmitted=!0,t.emit("error",e),t.emitClose()}function Sn(t){return t.path=t.socketPath,ps.connect(t)}function xn(t){return t.path=void 0,!t.servername&&t.servername!==""&&(t.servername=ps.isIP(t.host)?"":t.host),sn.connect(t)}function P(t,e,s){t._readyState=w.CLOSING;let r=new Error(s);Error.captureStackTrace(r,P),e.setHeader?(e[gs]=!0,e.abort(),e.socket&&!e.socket.destroyed&&e.socket.destroy(),process.nextTick(Ae,t,r)):(e.destroy(r),e.once("error",t.emit.bind(t,"error")),e.once("close",t.emitClose.bind(t)))}function mt(t,e,s){if(e){let r=ln(e)?e.size:mn(e).length;t._socket?t._sender._bufferedBytes+=r:t._bufferedAmount+=r}if(s){let r=new Error(`WebSocket is not open: readyState ${t.readyState} (${V[t.readyState]})`);process.nextTick(s,r)}}function bn(t,e){let s=this[k];s._closeFrameReceived=!0,s._closeMessage=e,s._closeCode=t,s._socket[k]!==void 0&&(s._socket.removeListener("data",Ue),process.nextTick(ys,s._socket),t===1005?s.close():s.close(t,e))}function En(){let t=this[k];t.isPaused||t._socket.resume()}function wn(t){let e=this[k];e._socket[k]!==void 0&&(e._socket.removeListener("data",Ue),process.nextTick(ys,e._socket),e.close(t[hn])),e._errorEmitted||(e._errorEmitted=!0,e.emit("error",t))}function ds(){this[k].emitClose()}function vn(t,e){this[k].emit("message",t,e)}function Tn(t){let e=this[k];e._autoPong&&e.pong(t,!this._isServer,_s),e.emit("ping",t)}function On(t){this[k].emit("pong",t)}function ys(t){t.resume()}function Cn(t){let e=this[k];e.readyState!==w.CLOSED&&(e.readyState===w.OPEN&&(e._readyState=w.CLOSING,Ss(e)),this._socket.end(),e._errorEmitted||(e._errorEmitted=!0,e.emit("error",t)))}function Ss(t){t._closeTimer=setTimeout(t._socket.destroy.bind(t._socket),t._closeTimeout)}function xs(){let t=this[k];if(this.removeListener("close",xs),this.removeListener("data",Ue),this.removeListener("end",bs),t._readyState=w.CLOSING,!this._readableState.endEmitted&&!t._closeFrameReceived&&!t._receiver._writableState.errorEmitted&&this._readableState.length!==0){let e=this.read(this._readableState.length);t._receiver.write(e)}t._receiver.end(),this[k]=void 0,clearTimeout(t._closeTimer),t._receiver._writableState.finished||t._receiver._writableState.errorEmitted?t.emitClose():(t._receiver.on("error",ds),t._receiver.on("finish",ds))}function Ue(t){this[k]._receiver.write(t)||this.pause()}function bs(){let t=this[k];t._readyState=w.CLOSING,t._receiver.end(),this.end()}function Es(){let t=this[k];this.removeListener("error",Es),this.on("error",_s),t&&(t._readyState=w.CLOSING,this.destroy())}});var Cs=L((Do,Os)=>{"use strict";var Fo=Fe(),{Duplex:kn}=require("stream");function vs(t){t.emit("close")}function Nn(){!this.destroyed&&this._writableState.finished&&this.destroy()}function Ts(t){this.removeListener("error",Ts),this.destroy(),this.listenerCount("error")===0&&this.emit("error",t)}function Rn(t,e){let s=!0,r=new kn({...e,autoDestroy:!1,emitClose:!1,objectMode:!1,writableObjectMode:!1});return t.on("message",function(o,i){let f=!i&&r._readableState.objectMode?o.toString():o;r.push(f)||t.pause()}),t.once("error",function(o){r.destroyed||(s=!1,r.destroy(o))}),t.once("close",function(){r.destroyed||r.push(null)}),r._destroy=function(n,o){if(t.readyState===t.CLOSED){o(n),process.nextTick(vs,r);return}let i=!1;t.once("error",function(c){i=!0,o(c)}),t.once("close",function(){i||o(n),process.nextTick(vs,r)}),s&&t.terminate()},r._final=function(n){if(t.readyState===t.CONNECTING){t.once("open",function(){r._final(n)});return}t._socket!==null&&(t._socket._writableState.finished?(n(),r._readableState.endEmitted&&r.destroy()):(t._socket.once("finish",function(){n()}),t.close()))},r._read=function(){t.isPaused&&t.resume()},r._write=function(n,o,i){if(t.readyState===t.CONNECTING){t.once("open",function(){r._write(n,o,i)});return}t.send(n,i)},r.on("end",Nn),r.on("error",Ts),r}Os.exports=Rn});var yt=L((Wo,ks)=>{"use strict";var{tokenChars:Ln}=ne();function Pn(t){let e=new Set,s=-1,r=-1,n=0;for(n;n<t.length;n++){let i=t.charCodeAt(n);if(r===-1&&Ln[i]===1)s===-1&&(s=n);else if(n!==0&&(i===32||i===9))r===-1&&s!==-1&&(r=n);else if(i===44){if(s===-1)throw new SyntaxError(`Unexpected character at index ${n}`);r===-1&&(r=n);let f=t.slice(s,r);if(e.has(f))throw new SyntaxError(`The "${f}" subprotocol is duplicated`);e.add(f),s=r=-1}else throw new SyntaxError(`Unexpected character at index ${n}`)}if(s===-1||r!==-1)throw new SyntaxError("Unexpected end of input");let o=t.slice(s,n);if(e.has(o))throw new SyntaxError(`The "${o}" subprotocol is duplicated`);return e.add(o),e}ks.exports={parse:Pn}});var Bs=L((qo,Is)=>{"use strict";var $n=require("events"),De=require("http"),{Duplex:jo}=require("stream"),{createHash:In}=require("crypto"),Ns=Be(),Q=re(),Bn=yt(),Mn=Fe(),{CLOSE_TIMEOUT:An,GUID:Un,kWebSocket:Fn}=j(),Dn=/^[+/0-9A-Za-z]{22}==$/,Rs=0,Ls=1,$s=2,St=class extends $n{constructor(e,s){if(super(),e={allowSynchronousEvents:!0,autoPong:!0,maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:An,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:Mn,...e},e.port==null&&!e.server&&!e.noServer||e.port!=null&&(e.server||e.noServer)||e.server&&e.noServer)throw new TypeError('One and only one of the "port", "server", or "noServer" options must be specified');if(e.port!=null?(this._server=De.createServer((r,n)=>{let o=De.STATUS_CODES[426];n.writeHead(426,{"Content-Length":o.length,"Content-Type":"text/plain"}),n.end(o)}),this._server.listen(e.port,e.host,e.backlog,s)):e.server&&(this._server=e.server),this._server){let r=this.emit.bind(this,"connection");this._removeListeners=Wn(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(n,o,i)=>{this.handleUpgrade(n,o,i,r)}})}e.perMessageDeflate===!0&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=Rs}address(){if(this.options.noServer)throw new Error('The server is operating in "noServer" mode');return this._server?this._server.address():null}close(e){if(this._state===$s){e&&this.once("close",()=>{e(new Error("The server is not running"))}),process.nextTick(Se,this);return}if(e&&this.once("close",e),this._state!==Ls)if(this._state=Ls,this.options.noServer||this.options.server)this._server&&(this._removeListeners(),this._removeListeners=this._server=null),this.clients?this.clients.size?this._shouldEmitClose=!0:process.nextTick(Se,this):process.nextTick(Se,this);else{let s=this._server;this._removeListeners(),this._removeListeners=this._server=null,s.close(()=>{Se(this)})}}shouldHandle(e){if(this.options.path){let s=e.url.indexOf("?");if((s!==-1?e.url.slice(0,s):e.url)!==this.options.path)return!1}return!0}handleUpgrade(e,s,r,n){s.on("error",Ps);let o=e.headers["sec-websocket-key"],i=e.headers.upgrade,f=+e.headers["sec-websocket-version"];if(e.method!=="GET"){ee(this,e,s,405,"Invalid HTTP method");return}if(i===void 0||i.toLowerCase()!=="websocket"){ee(this,e,s,400,"Invalid Upgrade header");return}if(o===void 0||!Dn.test(o)){ee(this,e,s,400,"Missing or invalid Sec-WebSocket-Key header");return}if(f!==13&&f!==8){ee(this,e,s,400,"Missing or invalid Sec-WebSocket-Version header",{"Sec-WebSocket-Version":"13, 8"});return}if(!this.shouldHandle(e)){xe(s,400);return}let c=e.headers["sec-websocket-protocol"],u=new Set;if(c!==void 0)try{u=Bn.parse(c)}catch{ee(this,e,s,400,"Invalid Sec-WebSocket-Protocol header");return}let d=e.headers["sec-websocket-extensions"],p={};if(this.options.perMessageDeflate&&d!==void 0){let x=new Q({...this.options.perMessageDeflate,isServer:!0,maxPayload:this.options.maxPayload});try{let _=Ns.parse(d);_[Q.extensionName]&&(x.accept(_[Q.extensionName]),p[Q.extensionName]=x)}catch{ee(this,e,s,400,"Invalid or unacceptable Sec-WebSocket-Extensions header");return}}if(this.options.verifyClient){let x={origin:e.headers[`${f===8?"sec-websocket-origin":"origin"}`],secure:!!(e.socket.authorized||e.socket.encrypted),req:e};if(this.options.verifyClient.length===2){this.options.verifyClient(x,(_,S,y,g)=>{if(!_)return xe(s,S||401,y,g);this.completeUpgrade(p,o,u,e,s,r,n)});return}if(!this.options.verifyClient(x))return xe(s,401)}this.completeUpgrade(p,o,u,e,s,r,n)}completeUpgrade(e,s,r,n,o,i,f){if(!o.readable||!o.writable)return o.destroy();if(o[Fn])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>Rs)return xe(o,503);let u=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${In("sha1").update(s+Un).digest("base64")}`],d=new this.options.WebSocket(null,void 0,this.options);if(r.size){let p=this.options.handleProtocols?this.options.handleProtocols(r,n):r.values().next().value;p&&(u.push(`Sec-WebSocket-Protocol: ${p}`),d._protocol=p)}if(e[Q.extensionName]){let p=e[Q.extensionName].params,x=Ns.format({[Q.extensionName]:[p]});u.push(`Sec-WebSocket-Extensions: ${x}`),d._extensions=e}this.emit("headers",u,n),o.write(u.concat(`\r
3
3
  `).join(`\r
4
- `)),i.removeListener("error",xs),h.setSocket(i,o,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(h),h.on("close",()=>{this.clients.delete(h),this._shouldEmitClose&&!this.clients.size&&process.nextTick(pe,this)})),a(h,n)}};Es.exports=ft;function Rn(t,e){for(let s of Object.keys(e))t.on(s,e[s]);return function(){for(let r of Object.keys(e))t.removeListener(r,e[r])}}function pe(t){t._state=bs,t.emit("close")}function xs(){this.destroy()}function _e(t,e,s,r){s=s||Be.STATUS_CODES[e],r={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(s),...r},t.once("finish",t.destroy),t.end(`HTTP/1.1 ${e} ${Be.STATUS_CODES[e]}\r
4
+ `)),o.removeListener("error",Ps),d.setSocket(o,i,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(d),d.on("close",()=>{this.clients.delete(d),this._shouldEmitClose&&!this.clients.size&&process.nextTick(Se,this)})),f(d,n)}};Is.exports=St;function Wn(t,e){for(let s of Object.keys(e))t.on(s,e[s]);return function(){for(let r of Object.keys(e))t.removeListener(r,e[r])}}function Se(t){t._state=$s,t.emit("close")}function Ps(){this.destroy()}function xe(t,e,s,r){s=s||De.STATUS_CODES[e],r={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(s),...r},t.once("finish",t.destroy),t.end(`HTTP/1.1 ${e} ${De.STATUS_CODES[e]}\r
5
5
  `+Object.keys(r).map(n=>`${n}: ${r[n]}`).join(`\r
6
6
  `)+`\r
7
7
  \r
8
- `+s)}function K(t,e,s,r,n,i){if(t.listenerCount("wsClientError")){let o=new Error(n);Error.captureStackTrace(o,K),t.emit("wsClientError",o,s,e)}else _e(s,r,n,i)}});var Pn=x(_s(),1),Bn=x(Ce(),1),In=x(ee(),1),An=x(et(),1),Mn=x(rt(),1),$n=x(ct(),1),ws=x(Pe(),1),Fn=x(vs(),1);var Ts=ws.default;var nr=x(require("readline")),k=x(require("fs")),J=x(require("path"));var Os=(t=0)=>e=>`\x1B[${e+t}m`,ks=(t=0)=>e=>`\x1B[${38+t};5;${e}m`,Cs=(t=0)=>(e,s,r)=>`\x1B[${38+t};2;${e};${s};${r}m`,E={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},Ii=Object.keys(E.modifier),Un=Object.keys(E.color),Dn=Object.keys(E.bgColor),Ai=[...Un,...Dn];function Wn(){let t=new Map;for(let[e,s]of Object.entries(E)){for(let[r,n]of Object.entries(s))E[r]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},s[r]=E[r],t.set(n[0],n[1]);Object.defineProperty(E,e,{value:s,enumerable:!1})}return Object.defineProperty(E,"codes",{value:t,enumerable:!1}),E.color.close="\x1B[39m",E.bgColor.close="\x1B[49m",E.color.ansi=Os(),E.color.ansi256=ks(),E.color.ansi16m=Cs(),E.bgColor.ansi=Os(10),E.bgColor.ansi256=ks(10),E.bgColor.ansi16m=Cs(10),Object.defineProperties(E,{rgbToAnsi256:{value(e,s,r){return e===s&&s===r?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(s/255*5)+Math.round(r/255*5)},enumerable:!1},hexToRgb:{value(e){let s=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!s)return[0,0,0];let[r]=s;r.length===3&&(r=[...r].map(i=>i+i).join(""));let n=Number.parseInt(r,16);return[n>>16&255,n>>8&255,n&255]},enumerable:!1},hexToAnsi256:{value:e=>E.rgbToAnsi256(...E.hexToRgb(e)),enumerable:!1},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let s,r,n;if(e>=232)s=((e-232)*10+8)/255,r=s,n=s;else{e-=16;let a=e%36;s=Math.floor(e/36)/5,r=Math.floor(a/6)/5,n=a%6/5}let i=Math.max(s,r,n)*2;if(i===0)return 30;let o=30+(Math.round(n)<<2|Math.round(r)<<1|Math.round(s));return i===2&&(o+=60),o},enumerable:!1},rgbToAnsi:{value:(e,s,r)=>E.ansi256ToAnsi(E.rgbToAnsi256(e,s,r)),enumerable:!1},hexToAnsi:{value:e=>E.ansi256ToAnsi(E.hexToAnsi256(e)),enumerable:!1}}),E}var jn=Wn(),A=jn;var Ae=x(require("node:process"),1),Ls=x(require("node:os"),1),ut=x(require("node:tty"),1);function P(t,e=globalThis.Deno?globalThis.Deno.args:Ae.default.argv){let s=t.startsWith("-")?"":t.length===1?"-":"--",r=e.indexOf(s+t),n=e.indexOf("--");return r!==-1&&(n===-1||r<n)}var{env:v}=Ae.default,Ie;P("no-color")||P("no-colors")||P("color=false")||P("color=never")?Ie=0:(P("color")||P("colors")||P("color=true")||P("color=always"))&&(Ie=1);function qn(){if("FORCE_COLOR"in v)return v.FORCE_COLOR==="true"?1:v.FORCE_COLOR==="false"?0:v.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(v.FORCE_COLOR,10),3)}function Gn(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function Vn(t,{streamIsTTY:e,sniffFlags:s=!0}={}){let r=qn();r!==void 0&&(Ie=r);let n=s?Ie:r;if(n===0)return 0;if(s){if(P("color=16m")||P("color=full")||P("color=truecolor"))return 3;if(P("color=256"))return 2}if("TF_BUILD"in v&&"AGENT_NAME"in v)return 1;if(t&&!e&&n===void 0)return 0;let i=n||0;if(v.TERM==="dumb")return i;if(Ae.default.platform==="win32"){let o=Ls.default.release().split(".");return Number(o[0])>=10&&Number(o[2])>=10586?Number(o[2])>=14931?3:2:1}if("CI"in v)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(o=>o in v)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(o=>o in v)||v.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in v)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(v.TEAMCITY_VERSION)?1:0;if(v.COLORTERM==="truecolor"||v.TERM==="xterm-kitty"||v.TERM==="xterm-ghostty"||v.TERM==="wezterm")return 3;if("TERM_PROGRAM"in v){let o=Number.parseInt((v.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(v.TERM_PROGRAM){case"iTerm.app":return o>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(v.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(v.TERM)||"COLORTERM"in v?1:i}function Ns(t,e={}){let s=Vn(t,{streamIsTTY:t&&t.isTTY,...e});return Gn(s)}var Yn={stdout:Ns({isTTY:ut.default.isatty(1)}),stderr:Ns({isTTY:ut.default.isatty(2)})},Rs=Yn;function Ps(t,e,s){let r=t.indexOf(e);if(r===-1)return t;let n=e.length,i=0,o="";do o+=t.slice(i,r)+e+s,i=r+n,r=t.indexOf(e,i);while(r!==-1);return o+=t.slice(i),o}function Bs(t,e,s,r){let n=0,i="";do{let o=t[r-1]==="\r";i+=t.slice(n,o?r-1:r)+e+(o?`\r
8
+ `+s)}function ee(t,e,s,r,n,o){if(t.listenerCount("wsClientError")){let i=new Error(n);Error.captureStackTrace(i,ee),t.emit("wsClientError",i,s,e)}else xe(s,r,n,o)}});var jn=E(Cs(),1),qn=E(Be(),1),Gn=E(re(),1),Vn=E(ct(),1),Yn=E(ht(),1),zn=E(yt(),1),Ms=E(Fe(),1),Hn=E(Bs(),1);var As=Ms.default;var Lt=E(require("readline")),C=E(require("fs")),D=E(require("path"));var Us=(t=0)=>e=>`\x1B[${e+t}m`,Fs=(t=0)=>e=>`\x1B[${38+t};5;${e}m`,Ds=(t=0)=>(e,s,r)=>`\x1B[${38+t};2;${e};${s};${r}m`,v={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],overline:[53,55],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],gray:[90,39],grey:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgGray:[100,49],bgGrey:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}},Vo=Object.keys(v.modifier),Kn=Object.keys(v.color),Jn=Object.keys(v.bgColor),Yo=[...Kn,...Jn];function Xn(){let t=new Map;for(let[e,s]of Object.entries(v)){for(let[r,n]of Object.entries(s))v[r]={open:`\x1B[${n[0]}m`,close:`\x1B[${n[1]}m`},s[r]=v[r],t.set(n[0],n[1]);Object.defineProperty(v,e,{value:s,enumerable:!1})}return Object.defineProperty(v,"codes",{value:t,enumerable:!1}),v.color.close="\x1B[39m",v.bgColor.close="\x1B[49m",v.color.ansi=Us(),v.color.ansi256=Fs(),v.color.ansi16m=Ds(),v.bgColor.ansi=Us(10),v.bgColor.ansi256=Fs(10),v.bgColor.ansi16m=Ds(10),Object.defineProperties(v,{rgbToAnsi256:{value(e,s,r){return e===s&&s===r?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(s/255*5)+Math.round(r/255*5)},enumerable:!1},hexToRgb:{value(e){let s=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!s)return[0,0,0];let[r]=s;r.length===3&&(r=[...r].map(o=>o+o).join(""));let n=Number.parseInt(r,16);return[n>>16&255,n>>8&255,n&255]},enumerable:!1},hexToAnsi256:{value:e=>v.rgbToAnsi256(...v.hexToRgb(e)),enumerable:!1},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let s,r,n;if(e>=232)s=((e-232)*10+8)/255,r=s,n=s;else{e-=16;let f=e%36;s=Math.floor(e/36)/5,r=Math.floor(f/6)/5,n=f%6/5}let o=Math.max(s,r,n)*2;if(o===0)return 30;let i=30+(Math.round(n)<<2|Math.round(r)<<1|Math.round(s));return o===2&&(i+=60),i},enumerable:!1},rgbToAnsi:{value:(e,s,r)=>v.ansi256ToAnsi(v.rgbToAnsi256(e,s,r)),enumerable:!1},hexToAnsi:{value:e=>v.ansi256ToAnsi(v.hexToAnsi256(e)),enumerable:!1}}),v}var Zn=Xn(),A=Zn;var je=E(require("node:process"),1),js=E(require("node:os"),1),xt=E(require("node:tty"),1);function B(t,e=globalThis.Deno?globalThis.Deno.args:je.default.argv){let s=t.startsWith("-")?"":t.length===1?"-":"--",r=e.indexOf(s+t),n=e.indexOf("--");return r!==-1&&(n===-1||r<n)}var{env:T}=je.default,We;B("no-color")||B("no-colors")||B("color=false")||B("color=never")?We=0:(B("color")||B("colors")||B("color=true")||B("color=always"))&&(We=1);function Qn(){if("FORCE_COLOR"in T)return T.FORCE_COLOR==="true"?1:T.FORCE_COLOR==="false"?0:T.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(T.FORCE_COLOR,10),3)}function eo(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function to(t,{streamIsTTY:e,sniffFlags:s=!0}={}){let r=Qn();r!==void 0&&(We=r);let n=s?We:r;if(n===0)return 0;if(s){if(B("color=16m")||B("color=full")||B("color=truecolor"))return 3;if(B("color=256"))return 2}if("TF_BUILD"in T&&"AGENT_NAME"in T)return 1;if(t&&!e&&n===void 0)return 0;let o=n||0;if(T.TERM==="dumb")return o;if(je.default.platform==="win32"){let i=js.default.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in T)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(i=>i in T)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(i=>i in T)||T.CI_NAME==="codeship"?1:o;if("TEAMCITY_VERSION"in T)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(T.TEAMCITY_VERSION)?1:0;if(T.COLORTERM==="truecolor"||T.TERM==="xterm-kitty"||T.TERM==="xterm-ghostty"||T.TERM==="wezterm")return 3;if("TERM_PROGRAM"in T){let i=Number.parseInt((T.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(T.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(T.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(T.TERM)||"COLORTERM"in T?1:o}function Ws(t,e={}){let s=to(t,{streamIsTTY:t&&t.isTTY,...e});return eo(s)}var so={stdout:Ws({isTTY:xt.default.isatty(1)}),stderr:Ws({isTTY:xt.default.isatty(2)})},qs=so;function Gs(t,e,s){let r=t.indexOf(e);if(r===-1)return t;let n=e.length,o=0,i="";do i+=t.slice(o,r)+e+s,o=r+n,r=t.indexOf(e,o);while(r!==-1);return i+=t.slice(o),i}function Vs(t,e,s,r){let n=0,o="";do{let i=t[r-1]==="\r";o+=t.slice(n,i?r-1:r)+e+(i?`\r
9
9
  `:`
10
10
  `)+s,n=r+1,r=t.indexOf(`
11
- `,n)}while(r!==-1);return i+=t.slice(n),i}var{stdout:Is,stderr:As}=Rs,ht=Symbol("GENERATOR"),oe=Symbol("STYLER"),me=Symbol("IS_EMPTY"),Ms=["ansi","ansi","ansi256","ansi16m"],ae=Object.create(null),Hn=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let s=Is?Is.level:0;t.level=e.level===void 0?s:e.level};var zn=t=>{let e=(...s)=>s.join(" ");return Hn(e,t),Object.setPrototypeOf(e,ge.prototype),e};function ge(t){return zn(t)}Object.setPrototypeOf(ge.prototype,Function.prototype);for(let[t,e]of Object.entries(A))ae[t]={get(){let s=Me(this,pt(e.open,e.close,this[oe]),this[me]);return Object.defineProperty(this,t,{value:s}),s}};ae.visible={get(){let t=Me(this,this[oe],!0);return Object.defineProperty(this,"visible",{value:t}),t}};var dt=(t,e,s,...r)=>t==="rgb"?e==="ansi16m"?A[s].ansi16m(...r):e==="ansi256"?A[s].ansi256(A.rgbToAnsi256(...r)):A[s].ansi(A.rgbToAnsi(...r)):t==="hex"?dt("rgb",e,s,...A.hexToRgb(...r)):A[s][t](...r),Kn=["rgb","hex","ansi256"];for(let t of Kn){ae[t]={get(){let{level:s}=this;return function(...r){let n=pt(dt(t,Ms[s],"color",...r),A.color.close,this[oe]);return Me(this,n,this[me])}}};let e="bg"+t[0].toUpperCase()+t.slice(1);ae[e]={get(){let{level:s}=this;return function(...r){let n=pt(dt(t,Ms[s],"bgColor",...r),A.bgColor.close,this[oe]);return Me(this,n,this[me])}}}}var Jn=Object.defineProperties(()=>{},{...ae,level:{enumerable:!0,get(){return this[ht].level},set(t){this[ht].level=t}}}),pt=(t,e,s)=>{let r,n;return s===void 0?(r=t,n=e):(r=s.openAll+t,n=e+s.closeAll),{open:t,close:e,openAll:r,closeAll:n,parent:s}},Me=(t,e,s)=>{let r=(...n)=>Xn(r,n.length===1?""+n[0]:n.join(" "));return Object.setPrototypeOf(r,Jn),r[ht]=t,r[oe]=e,r[me]=s,r},Xn=(t,e)=>{if(t.level<=0||!e)return t[me]?"":e;let s=t[oe];if(s===void 0)return e;let{openAll:r,closeAll:n}=s;if(e.includes("\x1B"))for(;s!==void 0;)e=Ps(e,s.close,s.open),s=s.parent;let i=e.indexOf(`
12
- `);return i!==-1&&(e=Bs(e,n,r,i)),r+e+n};Object.defineProperties(ge.prototype,ae);var Zn=ge(),ji=ge({level:As?As.level:0});var u=Zn;var $e=require("child_process"),$=x(require("fs")),Fe=x(require("path")),Ue=process.cwd();async function _t(t,e){try{switch(t){case"read_file":return Qn(e);case"write_file":return ei(e);case"edit_file":return ti(e);case"grep":return si(e);case"glob":return ri(e);case"list_dir":return ni(e);case"bash":return ii(e);default:return{success:!1,output:`Unknown tool: ${t}`}}}catch(s){return{success:!1,output:s.message}}}function De(t){return Fe.resolve(Ue,t)}function Qn(t){return{success:!0,output:$.readFileSync(De(t.path),"utf-8")}}function ei(t){let e=De(t.path);return $.mkdirSync(Fe.dirname(e),{recursive:!0}),$.writeFileSync(e,t.content,"utf-8"),{success:!0,output:`Written ${t.path} (${t.content.length} chars)`}}function ti(t){let e=De(t.path),s=$.readFileSync(e,"utf-8");if(!s.includes(t.old_str))return{success:!1,output:`old_str not found in ${t.path}`};let r=s.split(t.old_str).length-1;return r>1?{success:!1,output:`old_str found ${r} times in ${t.path}, must be unique`}:($.writeFileSync(e,s.replace(t.old_str,t.new_str),"utf-8"),{success:!0,output:`Edited ${t.path}`})}function si(t){let e=t.path||".",s=`grep -rn --include='${t.include||"*"}' '${t.pattern}' ${e} 2>/dev/null | head -50`;return{success:!0,output:(0,$e.execSync)(s,{cwd:Ue,encoding:"utf-8",timeout:1e4})||"(no matches)"}}function ri(t){let e=`find . -name '${t.pattern}' -not -path '*/node_modules/*' -not -path '*/.git/*' 2>/dev/null | head -100`;return{success:!0,output:(0,$e.execSync)(e,{cwd:Ue,encoding:"utf-8",timeout:1e4})||"(no files found)"}}function ni(t){let e=De(t.path||".");return{success:!0,output:$.readdirSync(e,{withFileTypes:!0}).filter(n=>!n.name.startsWith(".")&&n.name!=="node_modules").map(n=>`${n.isDirectory()?"\u{1F4C1}":"\u{1F4C4}"} ${n.name}`).join(`
13
- `)||"(empty)"}}function ii(t){let e=t.command.trim();return[/\brm\s+-rf\s+[\/~]/,/\bmkfs\b/,/\bdd\s+if=/,/\b>\s*\/dev\/sd/,/\bchmod\s+-R\s+777\s+\//,/\bsudo\s+rm\b/].some(n=>n.test(e))?{success:!1,output:"Blocked: dangerous command detected"}:{success:!0,output:(0,$e.execSync)(e,{cwd:Ue,encoding:"utf-8",timeout:t.timeout||3e4,maxBuffer:1024*1024})}}var ye=x(require("path")),$s=x(require("fs")),Fs=x(require("readline")),We=process.cwd(),Us=new Set;function oi(t){let e=ye.resolve(We,t);return e.startsWith(We+ye.sep)||e===We}var ai=new Set(["read_file","grep","glob","list_dir"]);async function Ds(t,e,s){if(ai.has(t)){let r=e.path||e.pattern||".";if(oi(r))return"y"}return t!=="bash"&&Us.has(t)?"t":"ask"}async function Ws(t,e,s){let i=(await li(`
14
- `+(t==="bash"?"Allow this action? [y/n]: ":"Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]: "))).trim().toLowerCase()[0]||"n";return i==="t"&&t!=="bash"?(Us.add(t),"t"):i==="y"?"y":"n"}function js(t){try{let e=ye.resolve(We,t);return $s.readFileSync(e,"utf-8")}catch{return}}function li(t){return new Promise(e=>{let s=Fs.createInterface({input:process.stdin,output:process.stdout,terminal:!0});s.question(t,r=>{s.close(),e(r)})})}var Gs=x(require("fs")),Vs=x(require("path"));function ci(t){return t.replace(/\x1b\[[0-9;]*m/g,"")}function Ys(){let t=process.stdout.columns||60,e=Math.min(t-4,62),s=u.gray,r=u.cyan,n=u.cyanBright.bold,i=u.white,o=r("\u2502"),a=(l,h)=>l+" ".repeat(Math.max(0,h-ci(l).length)),c=l=>` ${o} ${a(l,e-4)} ${o}`;console.log(""),console.log(r(" \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(r(" \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2588\u2588\u2557 \u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D")),console.log(n(" \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u255A\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2588\u2588\u2588\u2557 ")),console.log(r(" \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551 \u255A\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u255D ")),console.log(n(" \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557")),console.log(r(" \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D")),console.log(""),console.log(` ${r("\u250C"+"\u2500".repeat(e-2)+"\u2510")}`),console.log(c(s("AI-powered coding assistant")+" ".repeat(Math.max(0,e-38))+s("v0.1.2"))),console.log(c("")),console.log(c(s("model ")+i("Kimi K2.5")+s(" context ")+i("256k"))),console.log(c(s("location ")+i(process.cwd()))),console.log(c("")),console.log(c(s("/save save session /load restore session"))),console.log(c(s("/compact compress history /context show usage"))),console.log(c(s("/tools list tools /quit exit"))),console.log(c("")),console.log(c(s("Powered by Cloudflare \xB7 Built by Bowen Liu"))),console.log(` ${r("\u2514"+"\u2500".repeat(e-2)+"\u2518")}`),console.log("")}function Hs(t){console.log(u.white(t))}function zs(t){console.log(u.gray(` \u{1F4AD} ${t}`))}function mt(t,e,s){if(s){console.log(u.yellow(`
15
- \u{1F527} `)+s+u.gray(` (using tool: ${t})`));return}let r="",n=e.path||e.pattern||"",i=n?u.cyan(n):"";switch(t){case"write_file":{r=n&&Gs.existsSync(Vs.resolve(process.cwd(),n))?`Updating ${i}`:`Creating ${i}`;break}case"edit_file":r=`Updating ${i}`;break;case"read_file":r=`Reading ${i}`;break;case"bash":r=`Running: ${u.cyan(e.command||"?")}`;break;case"web_search":r=`Searching: ${u.cyan(e.query||"?")}`;break;case"web_fetch":r=`Fetching: ${u.cyan(e.url||"?")}`;break;case"grep":r=`Searching '${e.pattern}' in ${i||"."}`;break;case"glob":r=`Finding files: ${e.pattern}`;break;case"list_dir":r=`Listing ${i||"."}`;break;default:r=`${t}`}console.log(u.yellow(`
16
- \u{1F527} `)+r)}function gt(t,e,s,r){let n=r!=null?u.gray(` - Completed in ${(r/1e3).toFixed(1)}s`):"",i=s.length;if(!e){console.log(u.red(" \u2717 Failed")+n),s.trim()&&console.log(u.gray(` ${s.slice(0,200)}`));return}if(t==="bash"){if(console.log(u.blue(" \u2713 Command executed")+n),s.trim()){let o=s.split(`
17
- `).map(a=>` ${a}`).join(`
18
- `);console.log(u.white(o))}}else if(t==="read_file")console.log(u.blue(` \u2713 Successfully read ${qs(i)}`)+n);else if(t==="write_file")console.log(u.blue(` \u2713 Successfully wrote ${qs(i)}`)+n);else if(t==="edit_file")console.log(u.blue(" \u2713 Successfully edited")+n);else if(t==="grep"){let o=s.trim()?s.split(`
19
- `).length:0;if(console.log(u.blue(` \u2713 ${o} matches found`)+n),s.trim()){let a=s.split(`
20
- `).slice(0,10).map(c=>` ${u.gray(c)}`).join(`
21
- `);console.log(a),o>10&&console.log(u.gray(` ... (${o} lines)`))}}else if(t==="glob"){let o=s.trim()?s.split(`
22
- `).length:0;console.log(u.blue(` \u2713 ${o} files found`)+n)}else if(t==="list_dir"){let o=s.trim()?s.split(`
23
- `).length:0;console.log(u.blue(` \u2713 ${o} entries`)+n)}else console.log(u.blue(" \u2713 Done")+n)}function qs(t){return t<1024?`${t} bytes`:t<1024*1024?`${(t/1024).toFixed(1)} KB`:`${(t/(1024*1024)).toFixed(1)} MB`}function Se(t){console.log(u.red(` \u274C ${t}`))}function Ks(t,e,s){let r=e?u.green("\u2713"):u.red("\u2717");if(t==="web_search"){let n=s.split(`
24
- `).find(i=>i.startsWith("["))||"";console.log(` ${r} ${u.gray(n.slice(0,120))}`)}else if(t==="web_fetch"){let n=s.split(`
25
- `)[0]?.slice(0,80)||"fetched";console.log(` ${r} ${u.gray(n)}`)}else console.log(` ${r}`)}function Js(t,e){console.log(u.cyan(`
11
+ `,n)}while(r!==-1);return o+=t.slice(n),o}var{stdout:Ys,stderr:zs}=qs,bt=Symbol("GENERATOR"),ce=Symbol("STYLER"),be=Symbol("IS_EMPTY"),Hs=["ansi","ansi","ansi256","ansi16m"],fe=Object.create(null),ro=(t,e={})=>{if(e.level&&!(Number.isInteger(e.level)&&e.level>=0&&e.level<=3))throw new Error("The `level` option should be an integer from 0 to 3");let s=Ys?Ys.level:0;t.level=e.level===void 0?s:e.level};var no=t=>{let e=(...s)=>s.join(" ");return ro(e,t),Object.setPrototypeOf(e,Ee.prototype),e};function Ee(t){return no(t)}Object.setPrototypeOf(Ee.prototype,Function.prototype);for(let[t,e]of Object.entries(A))fe[t]={get(){let s=qe(this,wt(e.open,e.close,this[ce]),this[be]);return Object.defineProperty(this,t,{value:s}),s}};fe.visible={get(){let t=qe(this,this[ce],!0);return Object.defineProperty(this,"visible",{value:t}),t}};var Et=(t,e,s,...r)=>t==="rgb"?e==="ansi16m"?A[s].ansi16m(...r):e==="ansi256"?A[s].ansi256(A.rgbToAnsi256(...r)):A[s].ansi(A.rgbToAnsi(...r)):t==="hex"?Et("rgb",e,s,...A.hexToRgb(...r)):A[s][t](...r),oo=["rgb","hex","ansi256"];for(let t of oo){fe[t]={get(){let{level:s}=this;return function(...r){let n=wt(Et(t,Hs[s],"color",...r),A.color.close,this[ce]);return qe(this,n,this[be])}}};let e="bg"+t[0].toUpperCase()+t.slice(1);fe[e]={get(){let{level:s}=this;return function(...r){let n=wt(Et(t,Hs[s],"bgColor",...r),A.bgColor.close,this[ce]);return qe(this,n,this[be])}}}}var io=Object.defineProperties(()=>{},{...fe,level:{enumerable:!0,get(){return this[bt].level},set(t){this[bt].level=t}}}),wt=(t,e,s)=>{let r,n;return s===void 0?(r=t,n=e):(r=s.openAll+t,n=e+s.closeAll),{open:t,close:e,openAll:r,closeAll:n,parent:s}},qe=(t,e,s)=>{let r=(...n)=>ao(r,n.length===1?""+n[0]:n.join(" "));return Object.setPrototypeOf(r,io),r[bt]=t,r[ce]=e,r[be]=s,r},ao=(t,e)=>{if(t.level<=0||!e)return t[be]?"":e;let s=t[ce];if(s===void 0)return e;let{openAll:r,closeAll:n}=s;if(e.includes("\x1B"))for(;s!==void 0;)e=Gs(e,s.close,s.open),s=s.parent;let o=e.indexOf(`
12
+ `);return o!==-1&&(e=Vs(e,n,r,o)),r+e+n};Object.defineProperties(Ee.prototype,fe);var lo=Ee(),Qo=Ee({level:zs?zs.level:0});var a=lo;var Ge=require("child_process"),R=E(require("fs")),Ve=E(require("path")),Ye=process.cwd();async function vt(t,e){try{switch(t){case"read_file":return co(e);case"write_file":return fo(e);case"edit_file":return uo(e);case"grep":return ho(e);case"glob":return po(e);case"list_dir":return _o(e);case"bash":return go(e);default:return{success:!1,output:`Unknown tool: ${t}`}}}catch(s){return{success:!1,output:s.message}}}function ze(t){return Ve.resolve(Ye,t)}var Ks=100*1024;function co(t){let e=ze(t.path),s=R.statSync(e);if(s.size>Ks){let n=R.readFileSync(e,"utf-8").slice(0,Ks),o=R.readFileSync(e,"utf-8").split(`
13
+ `).length,i=n.split(`
14
+ `).length;return{success:!0,output:`${n}
15
+
16
+ [FILE TRUNCATED: showing ${i}/${o} lines (${(s.size/1024).toFixed(0)}KB). Use grep to find specific sections.]`}}return{success:!0,output:R.readFileSync(e,"utf-8")}}function fo(t){let e=ze(t.path);return R.mkdirSync(Ve.dirname(e),{recursive:!0}),R.writeFileSync(e,t.content,"utf-8"),{success:!0,output:`Written ${t.path} (${t.content.length} chars)`}}function uo(t){let e=ze(t.path),s=R.readFileSync(e,"utf-8");if(!s.includes(t.old_str))return{success:!1,output:`old_str not found in ${t.path}`};let r=s.split(t.old_str).length-1;return r>1?{success:!1,output:`old_str found ${r} times in ${t.path}, must be unique`}:(R.writeFileSync(e,s.replace(t.old_str,t.new_str),"utf-8"),{success:!0,output:`Edited ${t.path}`})}function ho(t){let e=t.path||".",r=`grep -rn ${t.context_lines&&t.context_lines>0?`-C ${Math.min(t.context_lines,10)}`:""} --include='${t.include||"*"}' '${t.pattern}' ${e} 2>/dev/null | head -100`;return{success:!0,output:(0,Ge.execSync)(r,{cwd:Ye,encoding:"utf-8",timeout:1e4})||"(no matches)"}}function po(t){let e=`find . -name '${t.pattern}' -not -path '*/node_modules/*' -not -path '*/.git/*' 2>/dev/null | head -100`;return{success:!0,output:(0,Ge.execSync)(e,{cwd:Ye,encoding:"utf-8",timeout:1e4})||"(no files found)"}}function _o(t){let e=ze(t.path||".");return{success:!0,output:R.readdirSync(e,{withFileTypes:!0}).filter(n=>!n.name.startsWith(".")&&n.name!=="node_modules").map(n=>`${n.isDirectory()?"\u{1F4C1}":"\u{1F4C4}"} ${n.name}`).join(`
17
+ `)||"(empty)"}}function go(t){let e=t.command.trim();return[/\brm\s+-rf\s+[\/~]/,/\bmkfs\b/,/\bdd\s+if=/,/\b>\s*\/dev\/sd/,/\bchmod\s+-R\s+777\s+\//,/\bsudo\s+rm\b/].some(n=>n.test(e))?{success:!1,output:"Blocked: dangerous command detected"}:{success:!0,output:(0,Ge.execSync)(e,{cwd:Ye,encoding:"utf-8",timeout:t.timeout||3e4,maxBuffer:1024*1024})}}var we=E(require("path")),Js=E(require("fs")),Xs=E(require("readline"));var He=process.cwd(),Ke=new Set;function Zs(t){return Ke.has(t)}function Qs(){Ke.clear()}function mo(t){let e=we.resolve(He,t);return e.startsWith(He+we.sep)||e===He}var yo=new Set(["read_file","grep","glob","list_dir"]);async function er(t,e,s){if(yo.has(t)){let r=e.path||e.pattern||".";if(mo(r))return"y"}return t!=="bash"&&Ke.has(t)?"t":"ask"}async function tr(t,e,s){let r=t==="bash"?`Allow this action? [${a.cyan("y")}/${a.cyan("n")}]: `:`Allow this action? Use '${a.cyan("t")}' to trust (always allow) this tool for the session. [${a.cyan("y")}/${a.cyan("n")}/${a.cyan("t")}]: `,o=(await So(`
18
+ `+r)).trim().toLowerCase()[0]||"n";return o==="t"&&t!=="bash"?(Ke.add(t),"t"):o==="y"?"y":"n"}function Tt(t){try{let e=we.resolve(He,t);return Js.readFileSync(e,"utf-8")}catch{return}}function So(t){return new Promise(e=>{let s=Xs.createInterface({input:process.stdin,output:process.stdout,terminal:!0});s.on("SIGINT",()=>{s.close(),e("n")}),s.question(t,r=>{s.close(),e(r)})})}function sr(t){let e=t.split(`
19
+ `),s=[],r=!1,n="";for(let o of e){if(o.trimStart().startsWith("```")){r?(s.push(a.gray(" \u2514"+"\u2500".repeat(44))),r=!1,n=""):(n=o.trim().slice(3).trim(),s.push(a.gray(` \u250C\u2500 ${n||"code"} ${"\u2500".repeat(Math.max(0,40-(n||"code").length))}`)),r=!0);continue}if(r){s.push(a.green(" \u2502 ")+a.white(o));continue}let i=o.match(/^(#{1,3})\s+(.+)/);if(i){s.push(a.bold.cyan(i[2]));continue}if(/^\s*[-*]\s/.test(o)){s.push(o.replace(/^(\s*)[-*]\s/,"$1\u2022 ").replace(/`([^`]+)`/g,(f,c)=>a.cyan(c)).replace(/\*\*([^*]+)\*\*/g,(f,c)=>a.bold(c)));continue}if(/^\s*\d+\.\s/.test(o)){s.push(o.replace(/`([^`]+)`/g,(f,c)=>a.cyan(c)).replace(/\*\*([^*]+)\*\*/g,(f,c)=>a.bold(c)));continue}s.push(o.replace(/`([^`]+)`/g,(f,c)=>a.cyan(c)).replace(/\*\*([^*]+)\*\*/g,(f,c)=>a.bold(c)).replace(/\*([^*]+)\*/g,(f,c)=>a.italic(c)))}return r&&s.push(a.gray(" \u2514"+"\u2500".repeat(44))),s.join(`
20
+ `)}var rr=E(require("fs")),Je=E(require("path"));function xo(t){return t.replace(/\x1b\[[0-9;]*m/g,"")}function nr(){let t=process.stdout.columns||60,e=Math.min(t-4,62),s=a.gray,r=a.cyan,n=a.cyanBright.bold,o=a.white,i=r("\u2502"),f=(u,d)=>u+" ".repeat(Math.max(0,d-xo(u).length)),c=u=>` ${i} ${f(u,e-4)} ${i}`;console.log(""),console.log(r(" \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557\u2588\u2588\u2557 \u2588\u2588\u2557\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2557 ")),console.log(r(" \u2588\u2588\u2554\u2550\u2550\u2550\u2550\u255D\u255A\u2588\u2588\u2557 \u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2557")),console.log(n(" \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u255A\u2588\u2588\u2588\u2588\u2554\u255D \u2588\u2588\u2554\u2588\u2588\u2557 \u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255D\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551")),console.log(r(" \u255A\u2550\u2550\u2550\u2550\u2588\u2588\u2551 \u255A\u2588\u2588\u2554\u255D \u2588\u2588\u2551\u255A\u2588\u2588\u2557\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551\u2588\u2588\u2554\u2550\u2550\u2550\u255D \u2588\u2588\u2554\u2550\u2550\u2588\u2588\u2551")),console.log(n(" \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255A\u2588\u2588\u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551\u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551")),console.log(r(" \u255A\u2550\u2550\u2550\u2550\u2550\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u2550\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D\u255A\u2550\u255D \u255A\u2550\u255D \u255A\u2550\u255D")),console.log(""),console.log(` ${r("\u250C"+"\u2500".repeat(e-2)+"\u2510")}`),console.log(c(s("AI-powered coding assistant")+" ".repeat(Math.max(0,e-38))+s("v0.1.7"))),console.log(c("")),console.log(c(s("model ")+o("Kimi K2.5")+s(" context ")+o("256k"))),console.log(c(s("location ")+o(process.cwd()))),console.log(c("")),console.log(c(s("/help")+o(" commands")+s(" \\ + Enter")+o(" newline"))),console.log(c(s("Ctrl+C")+o(" cancel")+s(" Powered by Cloudflare"))),console.log(` ${r("\u2514"+"\u2500".repeat(e-2)+"\u2518")}`),console.log("")}function or(t){console.log(a.white(t))}function Ot(t,e,s){let r="";s&&s.includes("||")&&(r=s.split("||")[1]||"");let n="",o=e.path||e.pattern||"",i=a.blue(o);switch(t){case"write_file":n=`I will write to file: ${i}`;break;case"edit_file":n=`I will edit the file: ${i}`;break;case"read_file":n=`I will read the file: ${i}`;break;case"bash":n=`I will run the following command: ${a.blue(e.command||"?")}`;break;case"web_search":n=`I will search the web for: ${a.blue(e.query||"?")}`;break;case"web_fetch":n=`I will fetch URL: ${a.blue(e.url||"?")}`;break;case"grep":n=`I will search for '${a.blue(e.pattern)}' in ${i||"."}`;break;case"glob":n=`I will find files matching: ${a.blue(e.pattern)}`;break;case"list_dir":n=`I will list directory: ${i||"."}`;break;default:n=`${t}`}console.log(a.yellow(`
21
+ \u26A1 `)+n+a.gray(` (using tool: ${t})`)),r&&console.log(a.white(` Purpose: ${r}`))}function Ct(t,e,s,r,n){let o=r!=null?a.gray(` ${(r/1e3).toFixed(1)}s`):"",i=s.length;if(!e){console.log(a.red(" \u2717 Failed")),console.log(a.gray(` Completed in${o}`)),s.trim()&&console.log(a.gray(` ${s.slice(0,200)}`));return}let f=n?.path||"";if(t==="bash"){let c=(n?.command||"").slice(0,60);if(console.log(a.greenBright(" \u2713 Successfully")+a.white(` ran: ${c}`)),console.log(a.gray(` Completed in${o}`)),s.trim()){let u=s.split(`
22
+ `).slice(0,20).map(d=>` ${d}`).join(`
23
+ `);console.log(a.white(u)),s.split(`
24
+ `).length>20&&console.log(a.gray(` ... (${s.split(`
25
+ `).length} lines)`))}}else if(t==="read_file"){let c=Je.resolve(process.cwd(),n?.path||"");console.log(a.greenBright(" \u2713 Successfully")+a.white(` read ${i} bytes from ${c}`)),console.log(a.gray(` Completed in${o}`))}else if(t==="write_file"){let c=Je.resolve(process.cwd(),n?.path||""),u=n?.path&&rr.existsSync(c);console.log(a.greenBright(" \u2713 Successfully")+a.white(` wrote ${i} bytes to ${c}`)),console.log(a.gray(` Completed in${o}`))}else if(t==="edit_file"){let c=Je.resolve(process.cwd(),n?.path||"");console.log(a.greenBright(" \u2713 Successfully")+a.white(` edited ${c}`)),console.log(a.gray(` Completed in${o}`))}else if(t==="grep"){let c=s.trim()?s.split(`
26
+ `).length:0;if(console.log(a.green(` \u2713 Found ${c} matches`)),console.log(a.gray(` Completed in${o}`)),s.trim()){let u=s.split(`
27
+ `).slice(0,10).map(d=>` ${a.gray(d)}`).join(`
28
+ `);console.log(u),c>10&&console.log(a.gray(` ... (${c} lines)`))}}else t==="glob"?(console.log(a.green(` \u2713 Found ${s.trim()?s.split(`
29
+ `).length:0} files`)),console.log(a.gray(` Completed in${o}`))):t==="list_dir"?(console.log(a.green(` \u2713 Listed ${s.trim()?s.split(`
30
+ `).length:0} entries`)),console.log(a.gray(` Completed in${o}`))):(console.log(a.green(" \u2713 Done")),console.log(a.gray(` Completed in${o}`)))}function ve(t){console.log(a.red(` \u274C ${t}`))}function ir(t,e,s){let r=e?a.green("\u2713"):a.red("\u2717");if(t==="web_search"){let n=s.split(`
31
+ `).find(o=>o.startsWith("["))||"";console.log(` ${r} ${a.gray(n.slice(0,120))}`)}else if(t==="web_fetch"){let n=s.split(`
32
+ `)[0]?.slice(0,80)||"fetched";console.log(` ${r} ${a.gray(n)}`)}else console.log(` ${r}`)}function ar(t,e){console.log(a.cyan(`
26
33
  \u2500\u2500 ${t} \u2500\u2500`));let s=e.split(`
27
- `);for(let r=0;r<s.length;r++){let n=u.gray(String(r+1).padStart(4)+" \u2502 ");console.log(n+u.green("+ "+s[r]))}console.log(u.cyan(` \u2500\u2500 end \u2500\u2500
28
- `))}function Xs(t,e,s,r){console.log("");let n=t.split(`
29
- `),i=e.split(`
30
- `),o=0;if(r){let a=r.indexOf(t);a>=0&&(o=r.substring(0,a).split(`
31
- `).length)}if(r&&o>1){let a=r.split(`
32
- `),c=Math.max(0,o-1-3);for(let l=c;l<o-1;l++){let h=u.gray(String(l+1).padStart(4)+" \u2502 ");console.log(h+u.gray(" "+a[l]))}}for(let a=0;a<n.length;a++){let c=o>0?o+a:a+1,l=u.gray(String(c).padStart(4)+" \u2502 ");console.log(l+u.red("- "+n[a]))}for(let a=0;a<i.length;a++){let c=o>0?o+a:a+1,l=u.gray(String(c).padStart(4)+" \u2502 ");console.log(l+u.green("+ "+i[a]))}if(r&&o>0){let a=r.split(`
33
- `),c=o-1+n.length,l=Math.min(a.length,c+3);for(let h=c;h<l;h++){let p=u.gray(String(h+1).padStart(4)+" \u2502 ");console.log(p+u.gray(" "+a[h]))}}console.log("")}var le=x(require("fs")),yt=x(require("path")),Qs=x(require("readline"));var ui=process.env.SYNAPSE_API||"https://api.synapse.cloudc.top",er=yt.join(process.env.HOME||"~",".synapse"),tr=yt.join(er,"token");function Zs(t,e=!1){let s=Qs.createInterface({input:process.stdin,output:process.stderr});return new Promise(r=>{s.question(t,n=>{s.close(),r(n.trim())})})}async function sr(){console.log(u.cyan.bold(`
34
+ `);for(let r=0;r<s.length;r++){let n=a.gray(String(r+1).padStart(4)+" \u2502 ");console.log(n+a.green("+ "+s[r]))}console.log(a.cyan(` \u2500\u2500 end \u2500\u2500
35
+ `))}function kt(t,e,s,r){console.log("");let n=t.split(`
36
+ `),o=e.split(`
37
+ `),i=0;for(;i<n.length&&i<o.length&&n[i]===o[i];)i++;let f=0;for(;f<n.length-i&&f<o.length-i&&n[n.length-1-f]===o[o.length-1-f];)f++;let c=n.slice(i,n.length-f),u=o.slice(i,o.length-f),d=Math.max(0,i-3);for(let _=d;_<i;_++)console.log(a.gray(String(_+1).padStart(4)+" "+n[_]));for(let _=0;_<c.length;_++){let S=i+_+1;console.log(a.red(String(S).padStart(4)+" - "+c[_]))}for(let _=0;_<u.length;_++){let S=i+_+1;console.log(a.green(String(S).padStart(4)+" + "+u[_]))}let p=n.length-f,x=Math.min(n.length,p+3);for(let _=p;_<x;_++){let S=i+u.length+(_-p)+1;console.log(a.gray(String(S).padStart(4)+" "+n[_]))}console.log("")}var ue=E(require("fs")),Nt=E(require("path")),cr=E(require("readline"));var Eo=process.env.SYNAPSE_API||"https://api.synapse.cloudc.top",fr=Nt.join(process.env.HOME||"~",".synapse"),ur=Nt.join(fr,"token");function lr(t,e=!1){let s=cr.createInterface({input:process.stdin,output:process.stderr});return new Promise(r=>{s.question(t,n=>{s.close(),r(n.trim())})})}async function hr(){console.log(a.cyan.bold(`
34
38
  \u26A1 Synapse Login
35
- `));let t=await Zs(" Username: "),e=await Zs(" Password: ");try{let s=await fetch(`${ui}/api/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t,password:e})}),r=await s.json();(!s.ok||!r.token)&&(console.log(u.red(`
36
- \u274C ${r.error||"Login failed"}`)),process.exit(1)),le.mkdirSync(er,{recursive:!0}),le.writeFileSync(tr,r.token,{mode:384}),console.log(u.green(`
37
- \u2713 Logged in. Token saved to ~/.synapse/token`))}catch(s){console.log(u.red(`
38
- \u274C Connection failed: ${s.message}`)),process.exit(1)}}function rr(){try{le.unlinkSync(tr),console.log(u.green(" \u2713 Logged out."))}catch{console.log(u.gray(" Already logged out."))}}var hi=process.env.SYNAPSE_CLI_WS||"wss://cli.synapse.cloudc.top",di=J.join(process.env.HOME||"~",".synapse","token"),je=process.argv[2];(async()=>{je==="login"&&(await sr(),process.exit(0)),je==="logout"&&(await rr(),process.exit(0)),(je==="--help"||je==="-h")&&(console.log(`
39
- ${u.cyan.bold("\u26A1 Synapse CLI")} \u2014 AI coding assistant
39
+ `));let t=await lr(" Username: "),e=await lr(" Password: ");try{let s=await fetch(`${Eo}/api/login`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({username:t,password:e})}),r=await s.json();(!s.ok||!r.token)&&(console.log(a.red(`
40
+ \u274C ${r.error||"Login failed"}`)),process.exit(1)),ue.mkdirSync(fr,{recursive:!0}),ue.writeFileSync(ur,r.token,{mode:384}),console.log(a.green(`
41
+ \u2713 Logged in. Token saved to ~/.synapse/token`))}catch(s){console.log(a.red(`
42
+ \u274C Connection failed: ${s.message}`)),process.exit(1)}}function dr(){try{ue.unlinkSync(ur),console.log(a.green(" \u2713 Logged out."))}catch{console.log(a.gray(" Already logged out."))}}var wo=process.env.SYNAPSE_CLI_WS||"wss://cli.synapse.cloudc.top",vo=D.join(process.env.HOME||"~",".synapse","token"),he=[],pr=[],Te="idle",de=!1,_r=0,Rt=!1,Oe=[],Xe=process.argv[2];(async()=>{Xe==="login"&&(await hr(),process.exit(0)),Xe==="logout"&&(await dr(),process.exit(0)),(Xe==="--help"||Xe==="-h")&&(console.log(`
43
+ ${a.cyan.bold("\u26A1 Synara")} \u2014 AI coding assistant
40
44
 
41
- ${u.bold("Usage:")}
42
- synapse Start coding session in current directory
45
+ ${a.bold("Usage:")}
46
+ synara Start coding session in current directory
43
47
  synara login Login with username/password
44
48
  synara logout Remove stored credentials
45
49
 
46
- ${u.bold("Session commands:")}
50
+ ${a.bold("Session commands:")}
47
51
  /compact Compress conversation history
48
52
  /context Show context usage (tokens, messages)
53
+ /tools List available tools
54
+ /usage Show token consumption
55
+ /save [name] Save session locally
56
+ /load <name> Load a saved session
57
+ /sessions List saved sessions
58
+ /undo Undo last file change
59
+ /help Show this help
49
60
  /quit End session
50
61
 
51
- ${u.bold("Permission prompts:")}
52
- y Approve this operation
53
- n Deny this operation
54
- t Trust this tool type for the session
55
- `),process.exit(0));let t=null,e=null,s=null;function r(){let f=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],d=0;process.stdout.write(u.gray(`
56
- ${f[0]} Thinking...`)),s=setInterval(()=>{d=(d+1)%f.length,process.stdout.write(`\r ${u.gray(f[d]+" Thinking...")}`)},80)}function n(){s&&(clearInterval(s),s=null,process.stdout.write("\r"+" ".repeat(30)+"\r"))}function i(){try{return k.readFileSync(di,"utf-8").trim()}catch{return null}}function o(){for(let f of["SYNAPSE.md","synapse.md"]){let d=J.join(process.cwd(),f);if(k.existsSync(d))return k.readFileSync(d,"utf-8")}}async function a(){Ys();let f=i();f||(Se("Not logged in. Run: synara login"),process.exit(1));let d=`${hi}/ws?token=${encodeURIComponent(f)}`,S=new Ts(d);t=S,S.on("open",()=>{_({type:"auth",token:f,project:{path:process.cwd(),synapseMd:o()}})}),S.on("message",async T=>{let y=JSON.parse(T.toString());switch(y.type){case"session_ready":w();break;case"thinking":zs(y.content);break;case"reasoning_token":break;case"reasoning_end":break;case"content_token":n(),process.stdout.write(y.content);break;case"content_end":process.stdout.write(`
57
- `);break;case"turn_end":n(),m();break;case"assistant_message":n(),Hs(y.content),m();break;case"tool_request":n(),y.tool==="web_search"||y.tool==="web_fetch"?mt(y.tool,y.args):await c(y);break;case"tool_result_from_cloud":Ks(y.tool,y.success,y.output),r();break;case"session_save":n(),h(y),m();break;case"session_load":n(),p(y);break;case"session_list_request":n(),g(),m();break;case"error":n(),Se(y.message),m();break}}),S.on("close",()=>{console.log(u.gray(`
58
- Connection closed.`)),process.exit(0)}),S.on("error",T=>{Se(`Connection failed: ${T.message}`),process.exit(1)})}async function c(f){let d=f.description||`${f.tool}`;mt(f.tool,f.args,d);let S=await Ds(f.tool,f.args,d);if(S==="y"||S==="t"){let X=Date.now(),G=await _t(f.tool,f.args);gt(f.tool,G.success,G.output,Date.now()-X),_({type:"tool_result",call_id:f.call_id,...G}),r();return}if(f.tool==="write_file"&&f.args.content)Js(f.args.path,f.args.content);else if(f.tool==="edit_file"&&f.args.old_str&&f.args.new_str){let X=js(f.args.path);Xs(f.args.old_str,f.args.new_str,f.args.path,X)}if(e?.close(),e=null,await Ws(f.tool,f.args,d)==="n"){_({type:"tool_result",call_id:f.call_id,success:!1,output:"User denied"}),r();return}let y=Date.now(),B=await _t(f.tool,f.args);gt(f.tool,B.success,B.output,Date.now()-y),_({type:"tool_result",call_id:f.call_id,...B}),r()}let l=J.join(process.cwd(),".synapse","sessions");function h(f){k.mkdirSync(l,{recursive:!0});let d=f.name||new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),S=J.join(l,`${d}.json`);if(k.existsSync(S)&&!f.force){Se(`Session '${d}' already exists. Use /save ${d} --force to overwrite.`);return}let T={name:d,saved_at:new Date().toISOString(),messages:f.messages,meta:f.meta};k.writeFileSync(S,JSON.stringify(T,null,2),"utf-8"),console.log(u.blue(` \u2713 Session saved: ${d}`)+u.gray(` (${f.messages.length} messages, ${(Buffer.byteLength(JSON.stringify(T))/1024).toFixed(1)} KB)`))}function p(f){let d=f.name;if(!d){g(),_({type:"session_data",messages:null,error:"No session name provided. Use /sessions to list, then /load <name>."}),m();return}let S=J.join(l,`${d}.json`);if(!k.existsSync(S)){_({type:"session_data",messages:null,error:`Session '${d}' not found.`}),m();return}try{let T=JSON.parse(k.readFileSync(S,"utf-8"));_({type:"session_data",name:d,messages:T.messages,meta:T.meta||{}}),r()}catch(T){_({type:"session_data",messages:null,error:`Failed to read session: ${T}`}),m()}}function g(){if(!k.existsSync(l)){console.log(u.gray(" No saved sessions."));return}let f=k.readdirSync(l).filter(d=>d.endsWith(".json")).sort();if(f.length===0){console.log(u.gray(" No saved sessions."));return}console.log(u.white(`
59
- Saved sessions (${f.length}):`));for(let d of f)try{let S=JSON.parse(k.readFileSync(J.join(l,d),"utf-8")),T=d.replace(".json",""),y=S.messages?.length||0,B=S.saved_at?new Date(S.saved_at).toLocaleString():"?";console.log(u.cyan(` ${T}`)+u.gray(` \u2014 ${y} messages, saved ${B}`))}catch{console.log(u.cyan(` ${d.replace(".json","")}`)+u.gray(" \u2014 (unreadable)"))}console.log("")}function w(){m()}function m(){e&&(e.close(),e=null),e=nr.createInterface({input:process.stdin,output:process.stdout,terminal:!0}),e.question(u.cyan(`
60
- > `),f=>{e?.close(),e=null;let d=f.trim();if(!d){m();return}if((d==="/quit"||d==="/exit")&&process.exit(0),d==="/help"){console.log(u.gray(`
61
- /save [name] [--force] Save current session locally
62
- /load <name> Load a saved session
63
- /sessions List saved sessions
64
- /compact Compress conversation history
65
- /context Show context usage
66
- /usage Show token usage
67
- /tools List available tools
68
- /help Show this help
69
- /quit End session
70
- `)),m();return}if(d==="/sessions"){g(),m();return}if(d.startsWith("/save")){_({type:"user_message",content:d});return}if(d.startsWith("/load")){let T=d.split(/\s+/)[1]||"";if(!T){g(),console.log(u.gray(" Usage: /load <name>")),m();return}p({type:"session_load",name:T});return}_({type:"user_message",content:d}),r()})}function _(f){t?.send(JSON.stringify(f))}a().catch(f=>{console.error(f),process.exit(1)})})();
62
+ ${a.bold("Input:")}
63
+ \\ + Enter Multi-line continuation
64
+ Ctrl+C Cancel current operation
65
+ `),process.exit(0));let t=null,e=null,s=null;function r(){if(s)return;Te="active";let l=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],h=0;process.stdout.write(a.gray(`
66
+ ${l[0]} Thinking...`)),s=setInterval(()=>{h=(h+1)%l.length,process.stdout.write(`\r ${a.gray(l[h]+" Thinking...")}`)},80)}function n(){s&&(clearInterval(s),s=null,process.stdout.write("\r\x1B[2K"))}function o(){try{return C.readFileSync(vo,"utf-8").trim()}catch{return null}}function i(){for(let l of["SYNAPSE.md","synapse.md"]){let h=D.join(process.cwd(),l);if(C.existsSync(h))return C.readFileSync(h,"utf-8")}}async function f(){nr();let l=o();l||(ve("Not logged in. Run: synara login"),process.exit(1));let h=`${wo}/ws?token=${encodeURIComponent(l)}`,m=new As(h);t=m,process.on("SIGINT",()=>{Te==="idle"&&(console.log(a.gray(`
67
+ Bye!`)),process.exit(0)),n(),console.log(a.yellow(`
68
+ \u23F9 Cancelled`)),N({type:"cancel"}),Te="idle",de=!0;let b=_r;g()}),m.on("open",()=>{N({type:"auth",token:l,project:{path:process.cwd(),synapseMd:i()}})}),m.on("message",async b=>{let U=JSON.parse(b.toString());if(Rt){Oe.push(U);return}await O(U)});async function O(b){switch(b.type){case"session_ready":g();break;case"reasoning_token":case"reasoning_end":break;case"content_token":if(de)break;n(),process.stdout.write(b.content);break;case"content_end":if(de)break;process.stdout.write(`
69
+ `);break;case"turn_end":n(),Te="idle",de=!1,g();break;case"assistant_message":n(),or(sr(b.content)),g();break;case"tool_request":if(n(),de)break;b.tool==="web_search"||b.tool==="web_fetch"?Ot(b.tool,b.args):await c(b);break;case"tool_result_from_cloud":ir(b.tool,b.success,b.output),r();break;case"session_save":n(),p(b),g();break;case"session_load":n(),x(b);break;case"session_list_request":n(),_(),g();break;case"error":n(),ve(b.message),g();break}}m.on("close",()=>{console.log(a.gray(`
70
+ Connection closed.`)),process.exit(0)}),m.on("error",b=>{ve(`Connection failed: ${b.message}`),process.exit(1)})}async function c(l){let h=l.description||`${l.tool}`;Ot(l.tool,l.args,h);let m=await er(l.tool,l.args,h);if(m==="y"||m==="t"){u(l.tool,l.args);let z=Date.now(),Ze=await vt(l.tool,l.args);Ct(l.tool,Ze.success,Ze.output,Date.now()-z,l.args),N({type:"tool_result",call_id:l.call_id,...Ze}),r();return}if(l.tool==="write_file"&&l.args.content){let z=Tt(l.args.path);z?kt(z,l.args.content,l.args.path):ar(l.args.path,l.args.content)}else if(l.tool==="edit_file"&&l.args.old_str&&l.args.new_str){let z=Tt(l.args.path);kt(l.args.old_str,l.args.new_str,l.args.path,z)}e?.close(),e=null,Rt=!0;let O;try{O=await tr(l.tool,l.args,h)}catch{O="n"}if(Rt=!1,O==="n"){for(N({type:"tool_result",call_id:l.call_id,success:!1,output:"User denied"});Oe.length;)await handleMessage(Oe.shift());r();return}u(l.tool,l.args);let b=Date.now(),U=await vt(l.tool,l.args);for(Ct(l.tool,U.success,U.output,Date.now()-b,l.args),N({type:"tool_result",call_id:l.call_id,...U});Oe.length;)await handleMessage(Oe.shift());r()}function u(l,h){if(l!=="write_file"&&l!=="edit_file")return;let m=h.path;if(!m)return;let O=D.resolve(process.cwd(),m);try{C.existsSync(O)?he.push({tool:l,path:m,content:C.readFileSync(O,"utf-8")}):he.push({tool:l,path:m,content:""}),he.length>50&&he.shift()}catch{}}let d=D.join(process.cwd(),".synapse","sessions");function p(l){C.mkdirSync(d,{recursive:!0});let h=l.name||new Date().toISOString().replace(/[:.]/g,"-").slice(0,19),m=D.join(d,`${h}.json`);if(C.existsSync(m)&&!l.force){ve(`Session '${h}' already exists. Use /save ${h} --force to overwrite.`);return}let O={name:h,saved_at:new Date().toISOString(),messages:l.messages,meta:l.meta};C.writeFileSync(m,JSON.stringify(O,null,2),"utf-8"),console.log(a.blue(` \u2713 Session saved: ${h}`)+a.gray(` (${l.messages.length} messages)`))}function x(l){let h=l.name;if(!h){_(),N({type:"session_data",messages:null,error:"No name. Use /load <name>"}),g();return}let m=D.join(d,`${h}.json`);if(!C.existsSync(m)){N({type:"session_data",messages:null,error:`Session '${h}' not found.`}),g();return}try{let O=JSON.parse(C.readFileSync(m,"utf-8"));N({type:"session_data",name:h,messages:O.messages,meta:O.meta||{}}),r()}catch(O){N({type:"session_data",messages:null,error:`${O}`}),g()}}function _(){if(!C.existsSync(d)){console.log(a.gray(" No saved sessions."));return}let l=C.readdirSync(d).filter(h=>h.endsWith(".json")).sort();if(l.length===0){console.log(a.gray(" No saved sessions."));return}console.log(a.white(`
71
+ Saved sessions (${l.length}):`));for(let h of l)try{let m=JSON.parse(C.readFileSync(D.join(d,h),"utf-8")),O=h.replace(".json","");console.log(a.cyan(` ${O}`)+a.gray(` \u2014 ${m.messages?.length||0} messages`))}catch{console.log(a.cyan(` ${h.replace(".json","")}`))}console.log("")}function S(){let l=[{name:"read_file",desc:"Read a file",perm:"auto"},{name:"write_file",desc:"Create or overwrite a file",perm:"ask"},{name:"edit_file",desc:"Edit a file (string replace)",perm:"ask"},{name:"grep",desc:"Search for patterns in files",perm:"auto"},{name:"glob",desc:"Find files by name pattern",perm:"auto"},{name:"list_dir",desc:"List directory contents",perm:"auto"},{name:"bash",desc:"Execute shell command",perm:"always ask"},{name:"web_search",desc:"Search the web",perm:"auto"},{name:"web_fetch",desc:"Fetch URL content",perm:"auto"}];console.log(a.white(`
72
+ Available tools:
73
+ `));for(let h of l){let m=h.perm==="always ask"?a.red("always ask"):Zs(h.name)?a.cyan("trusted"):h.perm==="ask"?a.yellow("ask"):a.cyan("auto");console.log(` ${a.cyan(h.name.padEnd(12))} ${m.padEnd(20)} ${a.gray(h.desc)}`)}console.log(a.gray(`
74
+ Use /tools reset to restore default permissions.
75
+ `))}function y(){if(he.length===0){console.log(a.gray(" Nothing to undo."));return}let l=he.pop(),h=D.resolve(process.cwd(),l.path);try{l.content===""&&C.existsSync(h)?(C.unlinkSync(h),console.log(a.blue(` \u2713 Undo: deleted ${l.path} (was newly created)`))):(C.writeFileSync(h,l.content,"utf-8"),console.log(a.blue(` \u2713 Undo: restored ${l.path}`)))}catch(m){console.log(a.red(` \u2717 Undo failed: ${m.message}`))}}function g(){e&&(e.close(),e=null),Te="idle";let l=["/save","/load","/sessions","/compact","/context","/tools","/tools reset","/usage","/undo","/help","/quit"];e=Lt.createInterface({input:process.stdin,output:process.stdout,terminal:!0,completer:h=>{let m=l.filter(O=>O.startsWith(h));return[m.length?m:l,h]},history:pr.slice().reverse(),historySize:100}),e.question(a.cyan(`
76
+ > `),h=>{if(e?.close(),e=null,h.trimEnd().endsWith("\\")){W([h.trimEnd().slice(0,-1)]);return}Y(h)})}function W(l){e&&(e.close(),e=null),e=Lt.createInterface({input:process.stdin,output:process.stdout,terminal:!0}),e.question(a.gray("\u2026 "),h=>{e?.close(),e=null,h.trimEnd().endsWith("\\")?(l.push(h.trimEnd().slice(0,-1)),W(l)):(l.push(h),Y(l.join(`
77
+ `)))})}function Y(l){let h=l.trim();if(!h){g();return}if(h.startsWith("/")||pr.push(h),(h==="/quit"||h==="/exit")&&process.exit(0),h==="/undo"){y(),g();return}if(h==="/sessions"){_(),g();return}if(h==="/tools"){S(),g();return}if(h==="/tools reset"){Qs(),S(),g();return}if(h==="/help"){console.log(`
78
+ ${a.cyan("/save")} Save session ${a.cyan("/load")} Load session
79
+ ${a.cyan("/sessions")} List sessions ${a.cyan("/compact")} Compress history
80
+ ${a.cyan("/context")} Context usage ${a.cyan("/tools")} Tool permissions
81
+ ${a.cyan("/usage")} Token usage ${a.cyan("/undo")} Undo last change
82
+ ${a.cyan("/quit")} End session
83
+
84
+ ${a.gray("Type /command help for details. \\ + Enter for newline. Ctrl+C to cancel.")}
85
+ `),g();return}if(h==="/save help"){console.log(`
86
+ ${a.cyan("/save [name] [--force]")} Save current session locally
87
+ ${a.gray("name defaults to timestamp. --force overwrites existing.")}
88
+ `),g();return}if(h==="/load help"){console.log(`
89
+ ${a.cyan("/load <name>")} Load a previously saved session
90
+ ${a.gray("Use /sessions to see available names.")}
91
+ `),g();return}if(h==="/tools help"){console.log(`
92
+ ${a.cyan("/tools")} Show tools and current permissions
93
+ ${a.cyan("/tools reset")} Reset all trusted tools to default
94
+ `),g();return}if(h.startsWith("/save")){N({type:"user_message",content:h});return}if(h.startsWith("/load")){let m=h.split(/\s+/)[1]||"";if(!m){_(),console.log(a.gray(" Usage: /load <name>")),g();return}x({type:"session_load",name:m});return}N({type:"user_message",content:l}),_r++,de=!1,r()}function N(l){t?.send(JSON.stringify(l))}f().catch(l=>{console.error(l),process.exit(1)})})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "synara",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "description": "AI-powered coding assistant. Cloud brain, local hands.",
5
5
  "bin": {
6
6
  "synara": "dist/index.js"
@@ -27,12 +27,16 @@
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/node": "^20.0.0",
30
+ "@types/react": "^19.2.14",
30
31
  "@types/ws": "^8.5.0",
31
32
  "esbuild": "^0.28.0",
32
33
  "typescript": "^5.7.0"
33
34
  },
34
35
  "dependencies": {
35
36
  "chalk": "^5.4.0",
37
+ "ink": "^7.0.0",
38
+ "ink-text-input": "^6.0.0",
39
+ "react": "^19.2.5",
36
40
  "ws": "^8.18.0"
37
41
  }
38
42
  }