@beachviber/agent 1.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,18 @@
1
+ # Changelog
2
+
3
+ ## 1.0.10
4
+
5
+ Initial open-source release.
6
+
7
+ ### Features
8
+
9
+ - **Remote Claude Code control** — send prompts and monitor sessions from your phone
10
+ - **End-to-end encryption** — NaCl public-key cryptography (Curve25519 + XSalsa20-Poly1305) between phone and desktop
11
+ - **QR code pairing** — scan to pair, verify with a code, reconnect automatically
12
+ - **Tool approval** — approve or deny Claude's file writes and shell commands from your phone
13
+ - **Multi-project support** — scan a directory tree for projects with `.git/` or `.claude/`
14
+ - **Session management** — create, resume, and browse Claude Code sessions remotely
15
+ - **Session history** — read Claude CLI transcripts with tool use details
16
+ - **Image attachments** — attach images from your phone to prompts
17
+ - **Auto-reconnect** — exponential backoff with automatic re-pairing on token revocation
18
+ - **Fail-closed security** — tool use denied if approval socket is unreachable or phone doesn't respond
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Matthew Krokosz
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # BeachViber
2
+
3
+ Control [Claude Code](https://docs.anthropic.com/en/docs/claude-code) from your phone. Send prompts, approve tools, and monitor sessions remotely through an end-to-end encrypted connection.
4
+
5
+ ```
6
+ Phone App ←—(encrypted)—→ Relay Server ←—(encrypted)—→ Computer Agent ←—→ Claude Code
7
+ ```
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install -g @beachviber/agent
13
+ ```
14
+
15
+ Requires Node.js 20+ and [Claude Code](https://docs.anthropic.com/en/docs/claude-code) on your PATH.
16
+
17
+ ## Quick Start
18
+
19
+ ```bash
20
+ beachviber
21
+ ```
22
+
23
+ On first run:
24
+
25
+ 1. A QR code appears — scan it with the [BeachViber App](https://app.beachviber.com)
26
+ 3. In your terminal, enter the verification code shown on your BeachViber App
27
+ 4. Done — you're paired and encrypted end-to-end
28
+
29
+ On subsequent runs, the agent reconnects automatically.
30
+
31
+ ## What You Can Do
32
+
33
+ From your phone:
34
+
35
+ - Browse projects on your machine
36
+ - Start Claude Code sessions and send prompts
37
+ - Approve or deny tool use (file writes, shell commands, etc.)
38
+ - View session history and transcripts
39
+ - Manage multiple desktops from one phone
40
+
41
+ ## Security
42
+
43
+ **End-to-end encrypted.** All sensitive messages (prompts, responses, tool approvals) are encrypted with X25519 + AES-256-GCM. The relay server cannot read message contents.
44
+
45
+ **Keys stay on your machine.** Private keys are stored in the OS keychain (macOS Keychain, Linux Secret Service, or Windows DPAPI fallback) as PKCS8 DER — never in plaintext config files.
46
+
47
+ **Tool approval.** A `PreToolUse` hook intercepts Claude Code tool calls. Tools already in your Claude allow list are auto-approved. Everything else is sent to your phone for approval. If the agent isn't running, the hook is a no-op.
48
+
49
+ ## Configuration
50
+
51
+ The agent stores config in `~/.beachviber/`.
52
+
53
+ ```
54
+ .beachviber/
55
+ ```
56
+
57
+ ## Uninstall
58
+
59
+ ```bash
60
+ npm uninstall -g @beachviber/agent
61
+ ```
62
+
63
+ This removes the `PreToolUse` hook from `~/.claude/settings.json` automatically.
64
+
65
+ ## Protocol
66
+
67
+ The agent communicates over WebSocket using JSON messages. Each message has a `type`, optional `sessionId`, `timestamp`, and `payload`. When paired, the `payload` is replaced with an `encrypted` field containing an AES-256-GCM envelope.
68
+
69
+ | Type | Direction | Description |
70
+ |------|-----------|-------------|
71
+ | `register` | Desktop → Relay | Register with device token and public key |
72
+ | `registered` | Relay → Desktop | Registration confirmed |
73
+ | `projects_request` | Phone → Desktop | List available projects |
74
+ | `projects_response` | Desktop → Phone | Project list with git info |
75
+ | `session_create` | Phone → Desktop | Start a Claude Code session |
76
+ | `session_created` | Desktop → Phone | Session started confirmation |
77
+ | `session_end` | Phone → Desktop | End a session |
78
+ | `prompt` | Phone → Desktop | Send a prompt to Claude |
79
+ | `stream_start` | Desktop → Phone | Claude started responding |
80
+ | `stream_delta` | Desktop → Phone | Streaming text/tool-use chunk |
81
+ | `stream_end` | Desktop → Phone | Claude finished responding |
82
+ | `tool_approval_request` | Desktop → Phone | Tool needs approval |
83
+ | `tool_approval_response` | Phone → Desktop | Approve/deny tool use |
84
+ | `sessions_request` | Phone → Desktop | List all sessions |
85
+ | `sessions_response` | Desktop → Phone | Session list with metadata |
86
+ | `session_history_request` | Phone → Desktop | Get session transcript |
87
+ | `session_history_response` | Desktop → Phone | Transcript messages |
88
+ | `verify_code` | Desktop → Phone | Pairing verification code |
89
+ | `verify_code_ack` | Phone → Desktop | Verification result + public key |
90
+ | `heartbeat` | Desktop → Relay | Keep-alive |
91
+
92
+ ## Learn More
93
+ https://www.beachviber.com
94
+
95
+ ## Contributing
96
+
97
+ See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup, project structure, and guidelines.
98
+
99
+ ## License
100
+
101
+ MIT
package/dist/index.js ADDED
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env node
2
+ import{createRequire as __cr}from"module";const require=__cr(import.meta.url);
3
+ var vu=Object.create;var Tr=Object.defineProperty;var Cu=Object.getOwnPropertyDescriptor;var Iu=Object.getOwnPropertyNames;var xu=Object.getPrototypeOf,Ru=Object.prototype.hasOwnProperty;var v=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var K=(t,e)=>()=>(t&&(e=t(t=0)),e);var S=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),Pu=(t,e)=>{for(var n in e)Tr(t,n,{get:e[n],enumerable:!0})},Au=(t,e,n,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Iu(e))!Ru.call(t,s)&&s!==n&&Tr(t,s,{get:()=>e[s],enumerable:!(r=Cu(e,s))||r.enumerable});return t};var st=(t,e,n)=>(n=t!=null?vu(xu(t)):{},Au(e||!t||!t.__esModule?Tr(n,"default",{value:t,enumerable:!0}):n,t));function Lu(){let t=new Map;for(let[e,n]of Object.entries(O)){for(let[r,s]of Object.entries(n))O[r]={open:`\x1B[${s[0]}m`,close:`\x1B[${s[1]}m`},n[r]=O[r],t.set(s[0],s[1]);Object.defineProperty(O,e,{value:n,enumerable:!1})}return Object.defineProperty(O,"codes",{value:t,enumerable:!1}),O.color.close="\x1B[39m",O.bgColor.close="\x1B[49m",O.color.ansi=ki(),O.color.ansi256=vi(),O.color.ansi16m=Ci(),O.bgColor.ansi=ki(10),O.bgColor.ansi256=vi(10),O.bgColor.ansi16m=Ci(10),Object.defineProperties(O,{rgbToAnsi256:{value(e,n,r){return e===n&&n===r?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(n/255*5)+Math.round(r/255*5)},enumerable:!1},hexToRgb:{value(e){let n=/[a-f\d]{6}|[a-f\d]{3}/i.exec(e.toString(16));if(!n)return[0,0,0];let[r]=n;r.length===3&&(r=[...r].map(i=>i+i).join(""));let s=Number.parseInt(r,16);return[s>>16&255,s>>8&255,s&255]},enumerable:!1},hexToAnsi256:{value:e=>O.rgbToAnsi256(...O.hexToRgb(e)),enumerable:!1},ansi256ToAnsi:{value(e){if(e<8)return 30+e;if(e<16)return 90+(e-8);let n,r,s;if(e>=232)n=((e-232)*10+8)/255,r=n,s=n;else{e-=16;let a=e%36;n=Math.floor(e/36)/5,r=Math.floor(a/6)/5,s=a%6/5}let i=Math.max(n,r,s)*2;if(i===0)return 30;let o=30+(Math.round(s)<<2|Math.round(r)<<1|Math.round(n));return i===2&&(o+=60),o},enumerable:!1},rgbToAnsi:{value:(e,n,r)=>O.ansi256ToAnsi(O.rgbToAnsi256(e,n,r)),enumerable:!1},hexToAnsi:{value:e=>O.ansi256ToAnsi(O.hexToAnsi256(e)),enumerable:!1}}),O}var ki,vi,Ci,O,ty,Ou,Nu,ny,Bu,se,Ii=K(()=>{ki=(t=0)=>e=>`\x1B[${e+t}m`,vi=(t=0)=>e=>`\x1B[${38+t};5;${e}m`,Ci=(t=0)=>(e,n,r)=>`\x1B[${38+t};2;${e};${n};${r}m`,O={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]}},ty=Object.keys(O.modifier),Ou=Object.keys(O.color),Nu=Object.keys(O.bgColor),ny=[...Ou,...Nu];Bu=Lu(),se=Bu});import kr from"node:process";import Mu from"node:os";import xi from"node:tty";function Z(t,e=globalThis.Deno?globalThis.Deno.args:kr.argv){let n=t.startsWith("-")?"":t.length===1?"-":"--",r=e.indexOf(n+t),s=e.indexOf("--");return r!==-1&&(s===-1||r<s)}function Du(){if("FORCE_COLOR"in N)return N.FORCE_COLOR==="true"?1:N.FORCE_COLOR==="false"?0:N.FORCE_COLOR.length===0?1:Math.min(Number.parseInt(N.FORCE_COLOR,10),3)}function $u(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function Uu(t,{streamIsTTY:e,sniffFlags:n=!0}={}){let r=Du();r!==void 0&&(wn=r);let s=n?wn:r;if(s===0)return 0;if(n){if(Z("color=16m")||Z("color=full")||Z("color=truecolor"))return 3;if(Z("color=256"))return 2}if("TF_BUILD"in N&&"AGENT_NAME"in N)return 1;if(t&&!e&&s===void 0)return 0;let i=s||0;if(N.TERM==="dumb")return i;if(kr.platform==="win32"){let o=Mu.release().split(".");return Number(o[0])>=10&&Number(o[2])>=10586?Number(o[2])>=14931?3:2:1}if("CI"in N)return["GITHUB_ACTIONS","GITEA_ACTIONS","CIRCLECI"].some(o=>o in N)?3:["TRAVIS","APPVEYOR","GITLAB_CI","BUILDKITE","DRONE"].some(o=>o in N)||N.CI_NAME==="codeship"?1:i;if("TEAMCITY_VERSION"in N)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(N.TEAMCITY_VERSION)?1:0;if(N.COLORTERM==="truecolor"||N.TERM==="xterm-kitty"||N.TERM==="xterm-ghostty"||N.TERM==="wezterm")return 3;if("TERM_PROGRAM"in N){let o=Number.parseInt((N.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(N.TERM_PROGRAM){case"iTerm.app":return o>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(N.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(N.TERM)||"COLORTERM"in N?1:i}function Ri(t,e={}){let n=Uu(t,{streamIsTTY:t&&t.isTTY,...e});return $u(n)}var N,wn,Fu,Pi,Ai=K(()=>{({env:N}=kr);Z("no-color")||Z("no-colors")||Z("color=false")||Z("color=never")?wn=0:(Z("color")||Z("colors")||Z("color=true")||Z("color=always"))&&(wn=1);Fu={stdout:Ri({isTTY:xi.isatty(1)}),stderr:Ri({isTTY:xi.isatty(2)})},Pi=Fu});function Oi(t,e,n){let r=t.indexOf(e);if(r===-1)return t;let s=e.length,i=0,o="";do o+=t.slice(i,r)+e+n,i=r+s,r=t.indexOf(e,i);while(r!==-1);return o+=t.slice(i),o}function Ni(t,e,n,r){let s=0,i="";do{let o=t[r-1]==="\r";i+=t.slice(s,o?r-1:r)+e+(o?`\r
4
+ `:`
5
+ `)+n,s=r+1,r=t.indexOf(`
6
+ `,s)}while(r!==-1);return i+=t.slice(s),i}var Li=K(()=>{});function Ut(t){return qu(t)}var Bi,Mi,vr,it,$t,Di,ot,ju,qu,Cr,Ku,Wu,Ir,Sn,Hu,Vu,fy,m,at=K(()=>{Ii();Ai();Li();({stdout:Bi,stderr:Mi}=Pi),vr=Symbol("GENERATOR"),it=Symbol("STYLER"),$t=Symbol("IS_EMPTY"),Di=["ansi","ansi","ansi256","ansi16m"],ot=Object.create(null),ju=(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 n=Bi?Bi.level:0;t.level=e.level===void 0?n:e.level},qu=t=>{let e=(...n)=>n.join(" ");return ju(e,t),Object.setPrototypeOf(e,Ut.prototype),e};Object.setPrototypeOf(Ut.prototype,Function.prototype);for(let[t,e]of Object.entries(se))ot[t]={get(){let n=Sn(this,Ir(e.open,e.close,this[it]),this[$t]);return Object.defineProperty(this,t,{value:n}),n}};ot.visible={get(){let t=Sn(this,this[it],!0);return Object.defineProperty(this,"visible",{value:t}),t}};Cr=(t,e,n,...r)=>t==="rgb"?e==="ansi16m"?se[n].ansi16m(...r):e==="ansi256"?se[n].ansi256(se.rgbToAnsi256(...r)):se[n].ansi(se.rgbToAnsi(...r)):t==="hex"?Cr("rgb",e,n,...se.hexToRgb(...r)):se[n][t](...r),Ku=["rgb","hex","ansi256"];for(let t of Ku){ot[t]={get(){let{level:n}=this;return function(...r){let s=Ir(Cr(t,Di[n],"color",...r),se.color.close,this[it]);return Sn(this,s,this[$t])}}};let e="bg"+t[0].toUpperCase()+t.slice(1);ot[e]={get(){let{level:n}=this;return function(...r){let s=Ir(Cr(t,Di[n],"bgColor",...r),se.bgColor.close,this[it]);return Sn(this,s,this[$t])}}}}Wu=Object.defineProperties(()=>{},{...ot,level:{enumerable:!0,get(){return this[vr].level},set(t){this[vr].level=t}}}),Ir=(t,e,n)=>{let r,s;return n===void 0?(r=t,s=e):(r=n.openAll+t,s=e+n.closeAll),{open:t,close:e,openAll:r,closeAll:s,parent:n}},Sn=(t,e,n)=>{let r=(...s)=>Hu(r,s.length===1?""+s[0]:s.join(" "));return Object.setPrototypeOf(r,Wu),r[vr]=t,r[it]=e,r[$t]=n,r},Hu=(t,e)=>{if(t.level<=0||!e)return t[$t]?"":e;let n=t[it];if(n===void 0)return e;let{openAll:r,closeAll:s}=n;if(e.includes("\x1B"))for(;n!==void 0;)e=Oi(e,n.close,n.open),n=n.parent;let i=e.indexOf(`
7
+ `);return i!==-1&&(e=Ni(e,s,r,i)),r+e+s};Object.defineProperties(Ut.prototype,ot);Vu=Ut(),fy=Ut({level:Mi?Mi.level:0}),m=Vu});var En,$i=K(()=>{"use strict";En=class{state="disconnected";context={consecutiveFailures:0,reconnectDelay:1e3,disconnectReason:"none",wasSleeping:!1};transition(e){let n=this.state,r=this._nextState(n,e);if(r===void 0)throw new Error(`Invalid transition: ${e.type} from state "${n}"`);return this.state=r,r}reset(){this.state="disconnected",this.context={consecutiveFailures:0,reconnectDelay:1e3,disconnectReason:"none",wasSleeping:!1}}get connectionPhase(){switch(this.state){case"disconnected":case"connecting":case"registering":return"registering";case"pairing":case"setup_reconnecting":case"setup_pairing":return"pairing";case"paired":return"paired";case"paired_sleeping":return"paired_sleeping";case"reconnecting":return"paired"}}get inSetupMode(){return this.state==="setup_reconnecting"||this.state==="setup_pairing"}get disconnectedByRemote(){return this.context.disconnectReason==="remote"}_nextState(e,n){switch(e){case"disconnected":return this._fromDisconnected(n);case"connecting":return this._fromConnecting(n);case"registering":return this._fromRegistering(n);case"pairing":return this._fromPairing(n);case"paired":return this._fromPaired(n);case"paired_sleeping":return this._fromPairedSleeping(n);case"reconnecting":return this._fromReconnecting(n);case"setup_reconnecting":return this._fromSetupReconnecting(n);case"setup_pairing":return this._fromSetupPairing(n)}}_fromDisconnected(e){switch(e.type){case"CONNECT":return this.context.disconnectReason="none","connecting";case"ENTER_SETUP":return this.context.disconnectReason="none",e.hasSavedState?"setup_reconnecting":"setup_pairing";case"FORCE_DISCONNECT":return"disconnected"}}_fromConnecting(e){switch(e.type){case"WS_OPEN":return this.context.consecutiveFailures=0,this.context.reconnectDelay=1e3,"registering";case"WS_CLOSE":return"reconnecting"}}_fromRegistering(e){switch(e.type){case"REGISTERED":return e.hasSharedSecret&&this.context.wasSleeping?(this.context.wasSleeping=!1,"paired_sleeping"):e.hasSharedSecret?"paired":"pairing";case"WS_CLOSE":return"reconnecting";case"FORCE_DISCONNECT":return this.context.disconnectReason="remote","disconnected"}}_fromPairing(e){switch(e.type){case"PAIRED":return"paired";case"FORCE_DISCONNECT":return this.context.disconnectReason="remote","disconnected";case"WS_CLOSE":return this.context.disconnectReason="network","disconnected"}}_fromPaired(e){switch(e.type){case"WS_CLOSE":return"reconnecting";case"FORCE_DISCONNECT":return this.context.disconnectReason="remote","disconnected";case"SLEEP":return"paired_sleeping"}}_fromPairedSleeping(e){switch(e.type){case"WAKE":return"paired";case"WS_CLOSE":return this.context.wasSleeping=!0,"reconnecting";case"FORCE_DISCONNECT":return this.context.disconnectReason="remote",this.context.wasSleeping=!1,"disconnected";case"SLEEP":return"paired_sleeping"}}_fromReconnecting(e){switch(e.type){case"RECONNECT_TIMER":return"connecting";case"FORCE_DISCONNECT":return this.context.disconnectReason="remote","disconnected"}}_fromSetupReconnecting(e){switch(e.type){case"PAIRED":return"paired";case"SETUP_RECONNECT_FAILED":return"setup_pairing";case"CONNECT":return"setup_reconnecting";case"WS_OPEN":return"setup_reconnecting";case"WS_CLOSE":return"setup_reconnecting";case"REGISTERED":return e.hasSharedSecret&&this.context.wasSleeping?(this.context.wasSleeping=!1,"paired_sleeping"):e.hasSharedSecret?"paired":"setup_pairing"}}_fromSetupPairing(e){switch(e.type){case"PAIRED":return"paired";case"FORCE_DISCONNECT":return this.context.disconnectReason="remote","disconnected";case"CONNECT":return"setup_pairing";case"WS_OPEN":return"setup_pairing";case"WS_CLOSE":return"setup_pairing";case"REGISTERED":return"setup_pairing"}}}});function Ui(t){xr=t}function ji(){d.machine.reset(),d.ws=null,d.heartbeatTimer=null,d.deviceId="",d.deviceToken="",d.ownKeyPair=null,d.peerPublicKey=null,d.sharedSecret=null,d.peerAppVersion=null,d.peerCapabilities=[],d.lastMessageAt=0,d.verifyCodeResolve=null,d.registeredResolve=null,d.shuttingDown=!1,d.wakeExpiresAt=null,d.wakeTimer=null,d.wakeLockout={failedAttempts:0,lockedUntil:null}}var z,xr,Fi,Rr,d,lt=K(()=>{"use strict";$i();z="1.10.2",xr="wss://relay.beachviber.com";Fi=3e4,Rr=3e4,d={machine:new En,ws:null,heartbeatTimer:null,projects:[],deviceId:"",deviceToken:"",get connectionPhase(){return this.machine.connectionPhase},get inSetupMode(){return this.machine.inSetupMode},get disconnectedByRemote(){return this.machine.disconnectedByRemote},get consecutiveFailures(){return this.machine.context.consecutiveFailures},get reconnectDelay(){return this.machine.context.reconnectDelay},ownKeyPair:null,peerPublicKey:null,sharedSecret:null,peerAppVersion:null,peerCapabilities:[],lastMessageAt:0,verifyCodeResolve:null,registeredResolve:null,enterSetupMode:null,shuttingDown:!1,get wakeState(){return this.machine.state==="paired_sleeping"?"sleeping":"awake"},wakeExpiresAt:null,wakeTimer:null,wakeLockout:{failedAttempts:0,lockedUntil:null},onSleepTransition:null}});var ye=S((yy,Wi)=>{"use strict";var qi=["nodebuffer","arraybuffer","fragments"],Ki=typeof Blob<"u";Ki&&qi.push("blob");Wi.exports={BINARY_TYPES:qi,CLOSE_TIMEOUT:3e4,EMPTY_BUFFER:Buffer.alloc(0),GUID:"258EAFA5-E914-47DA-95CA-C5AB0DC85B11",hasBlob:Ki,kForOnEventAttribute:Symbol("kIsForOnEventAttribute"),kListener:Symbol("kListener"),kStatusCode:Symbol("status-code"),kWebSocket:Symbol("websocket"),NOOP:()=>{}}});var Ft=S((_y,bn)=>{"use strict";var{EMPTY_BUFFER:Gu}=ye(),Pr=Buffer[Symbol.species];function Yu(t,e){if(t.length===0)return Gu;if(t.length===1)return t[0];let n=Buffer.allocUnsafe(e),r=0;for(let s=0;s<t.length;s++){let i=t[s];n.set(i,r),r+=i.length}return r<e?new Pr(n.buffer,n.byteOffset,r):n}function Hi(t,e,n,r,s){for(let i=0;i<s;i++)n[r+i]=t[i]^e[i&3]}function Vi(t,e){for(let n=0;n<t.length;n++)t[n]^=e[n&3]}function zu(t){return t.length===t.buffer.byteLength?t.buffer:t.buffer.slice(t.byteOffset,t.byteOffset+t.length)}function Ar(t){if(Ar.readOnly=!0,Buffer.isBuffer(t))return t;let e;return t instanceof ArrayBuffer?e=new Pr(t):ArrayBuffer.isView(t)?e=new Pr(t.buffer,t.byteOffset,t.byteLength):(e=Buffer.from(t),Ar.readOnly=!1),e}bn.exports={concat:Yu,mask:Hi,toArrayBuffer:zu,toBuffer:Ar,unmask:Vi};if(!process.env.WS_NO_BUFFER_UTIL)try{let t=v("bufferutil");bn.exports.mask=function(e,n,r,s,i){i<48?Hi(e,n,r,s,i):t.mask(e,n,r,s,i)},bn.exports.unmask=function(e,n){e.length<32?Vi(e,n):t.unmask(e,n)}}catch{}});var zi=S((wy,Yi)=>{"use strict";var Gi=Symbol("kDone"),Or=Symbol("kRun"),Nr=class{constructor(e){this[Gi]=()=>{this.pending--,this[Or]()},this.concurrency=e||1/0,this.jobs=[],this.pending=0}add(e){this.jobs.push(e),this[Or]()}[Or](){if(this.pending!==this.concurrency&&this.jobs.length){let e=this.jobs.shift();this.pending++,e(this[Gi])}}};Yi.exports=Nr});var qt=S((Sy,Xi)=>{"use strict";var jt=v("zlib"),Ji=Ft(),Ju=zi(),{kStatusCode:Qi}=ye(),Qu=Buffer[Symbol.species],Zu=Buffer.from([0,0,255,255]),kn=Symbol("permessage-deflate"),_e=Symbol("total-length"),ct=Symbol("callback"),ke=Symbol("buffers"),ut=Symbol("error"),Tn,Lr=class{constructor(e,n,r){if(this._maxPayload=r|0,this._options=e||{},this._threshold=this._options.threshold!==void 0?this._options.threshold:1024,this._isServer=!!n,this._deflate=null,this._inflate=null,this.params=null,!Tn){let s=this._options.concurrencyLimit!==void 0?this._options.concurrencyLimit:10;Tn=new Ju(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[ct];this._deflate.close(),this._deflate=null,e&&e(new Error("The deflate stream was closed while data was being processed"))}}acceptAsServer(e){let n=this._options,r=e.find(s=>!(n.serverNoContextTakeover===!1&&s.server_no_context_takeover||s.server_max_window_bits&&(n.serverMaxWindowBits===!1||typeof n.serverMaxWindowBits=="number"&&n.serverMaxWindowBits>s.server_max_window_bits)||typeof n.clientMaxWindowBits=="number"&&!s.client_max_window_bits));if(!r)throw new Error("None of the extension offers can be accepted");return n.serverNoContextTakeover&&(r.server_no_context_takeover=!0),n.clientNoContextTakeover&&(r.client_no_context_takeover=!0),typeof n.serverMaxWindowBits=="number"&&(r.server_max_window_bits=n.serverMaxWindowBits),typeof n.clientMaxWindowBits=="number"?r.client_max_window_bits=n.clientMaxWindowBits:(r.client_max_window_bits===!0||n.clientMaxWindowBits===!1)&&delete r.client_max_window_bits,r}acceptAsClient(e){let n=e[0];if(this._options.clientNoContextTakeover===!1&&n.client_no_context_takeover)throw new Error('Unexpected parameter "client_no_context_takeover"');if(!n.client_max_window_bits)typeof this._options.clientMaxWindowBits=="number"&&(n.client_max_window_bits=this._options.clientMaxWindowBits);else if(this._options.clientMaxWindowBits===!1||typeof this._options.clientMaxWindowBits=="number"&&n.client_max_window_bits>this._options.clientMaxWindowBits)throw new Error('Unexpected or invalid parameter "client_max_window_bits"');return n}normalizeParams(e){return e.forEach(n=>{Object.keys(n).forEach(r=>{let s=n[r];if(s.length>1)throw new Error(`Parameter "${r}" must have only a single value`);if(s=s[0],r==="client_max_window_bits"){if(s!==!0){let i=+s;if(!Number.isInteger(i)||i<8||i>15)throw new TypeError(`Invalid value for parameter "${r}": ${s}`);s=i}else if(!this._isServer)throw new TypeError(`Invalid value for parameter "${r}": ${s}`)}else if(r==="server_max_window_bits"){let i=+s;if(!Number.isInteger(i)||i<8||i>15)throw new TypeError(`Invalid value for parameter "${r}": ${s}`);s=i}else if(r==="client_no_context_takeover"||r==="server_no_context_takeover"){if(s!==!0)throw new TypeError(`Invalid value for parameter "${r}": ${s}`)}else throw new Error(`Unknown parameter "${r}"`);n[r]=s})}),e}decompress(e,n,r){Tn.add(s=>{this._decompress(e,n,(i,o)=>{s(),r(i,o)})})}compress(e,n,r){Tn.add(s=>{this._compress(e,n,(i,o)=>{s(),r(i,o)})})}_decompress(e,n,r){let s=this._isServer?"client":"server";if(!this._inflate){let i=`${s}_max_window_bits`,o=typeof this.params[i]!="number"?jt.Z_DEFAULT_WINDOWBITS:this.params[i];this._inflate=jt.createInflateRaw({...this._options.zlibInflateOptions,windowBits:o}),this._inflate[kn]=this,this._inflate[_e]=0,this._inflate[ke]=[],this._inflate.on("error",ed),this._inflate.on("data",Zi)}this._inflate[ct]=r,this._inflate.write(e),n&&this._inflate.write(Zu),this._inflate.flush(()=>{let i=this._inflate[ut];if(i){this._inflate.close(),this._inflate=null,r(i);return}let o=Ji.concat(this._inflate[ke],this._inflate[_e]);this._inflate._readableState.endEmitted?(this._inflate.close(),this._inflate=null):(this._inflate[_e]=0,this._inflate[ke]=[],n&&this.params[`${s}_no_context_takeover`]&&this._inflate.reset()),r(null,o)})}_compress(e,n,r){let s=this._isServer?"server":"client";if(!this._deflate){let i=`${s}_max_window_bits`,o=typeof this.params[i]!="number"?jt.Z_DEFAULT_WINDOWBITS:this.params[i];this._deflate=jt.createDeflateRaw({...this._options.zlibDeflateOptions,windowBits:o}),this._deflate[_e]=0,this._deflate[ke]=[],this._deflate.on("data",Xu)}this._deflate[ct]=r,this._deflate.write(e),this._deflate.flush(jt.Z_SYNC_FLUSH,()=>{if(!this._deflate)return;let i=Ji.concat(this._deflate[ke],this._deflate[_e]);n&&(i=new Qu(i.buffer,i.byteOffset,i.length-4)),this._deflate[ct]=null,this._deflate[_e]=0,this._deflate[ke]=[],n&&this.params[`${s}_no_context_takeover`]&&this._deflate.reset(),r(null,i)})}};Xi.exports=Lr;function Xu(t){this[ke].push(t),this[_e]+=t.length}function Zi(t){if(this[_e]+=t.length,this[kn]._maxPayload<1||this[_e]<=this[kn]._maxPayload){this[ke].push(t);return}this[ut]=new RangeError("Max payload size exceeded"),this[ut].code="WS_ERR_UNSUPPORTED_MESSAGE_LENGTH",this[ut][Qi]=1009,this.removeListener("data",Zi),this.reset()}function ed(t){if(this[kn]._inflate=null,this[ut]){this[ct](this[ut]);return}t[Qi]=1007,this[ct](t)}});var dt=S((Ey,vn)=>{"use strict";var{isUtf8:eo}=v("buffer"),{hasBlob:td}=ye(),nd=[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 rd(t){return t>=1e3&&t<=1014&&t!==1004&&t!==1005&&t!==1006||t>=3e3&&t<=4999}function Br(t){let e=t.length,n=0;for(;n<e;)if((t[n]&128)===0)n++;else if((t[n]&224)===192){if(n+1===e||(t[n+1]&192)!==128||(t[n]&254)===192)return!1;n+=2}else if((t[n]&240)===224){if(n+2>=e||(t[n+1]&192)!==128||(t[n+2]&192)!==128||t[n]===224&&(t[n+1]&224)===128||t[n]===237&&(t[n+1]&224)===160)return!1;n+=3}else if((t[n]&248)===240){if(n+3>=e||(t[n+1]&192)!==128||(t[n+2]&192)!==128||(t[n+3]&192)!==128||t[n]===240&&(t[n+1]&240)===128||t[n]===244&&t[n+1]>143||t[n]>244)return!1;n+=4}else return!1;return!0}function sd(t){return td&&typeof t=="object"&&typeof t.arrayBuffer=="function"&&typeof t.type=="string"&&typeof t.stream=="function"&&(t[Symbol.toStringTag]==="Blob"||t[Symbol.toStringTag]==="File")}vn.exports={isBlob:sd,isValidStatusCode:rd,isValidUTF8:Br,tokenChars:nd};if(eo)vn.exports.isValidUTF8=function(t){return t.length<24?Br(t):eo(t)};else if(!process.env.WS_NO_UTF_8_VALIDATE)try{let t=v("utf-8-validate");vn.exports.isValidUTF8=function(e){return e.length<32?Br(e):t(e)}}catch{}});var Fr=S((by,ao)=>{"use strict";var{Writable:id}=v("stream"),to=qt(),{BINARY_TYPES:od,EMPTY_BUFFER:no,kStatusCode:ad,kWebSocket:ld}=ye(),{concat:Mr,toArrayBuffer:cd,unmask:ud}=Ft(),{isValidStatusCode:dd,isValidUTF8:ro}=dt(),Cn=Buffer[Symbol.species],X=0,so=1,io=2,oo=3,Dr=4,$r=5,In=6,Ur=class extends id{constructor(e={}){super(),this._allowSynchronousEvents=e.allowSynchronousEvents!==void 0?e.allowSynchronousEvents:!0,this._binaryType=e.binaryType||od[0],this._extensions=e.extensions||{},this._isServer=!!e.isServer,this._maxPayload=e.maxPayload|0,this._skipUTF8Validation=!!e.skipUTF8Validation,this[ld]=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=X}_write(e,n,r){if(this._opcode===8&&this._state==X)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 Cn(r.buffer,r.byteOffset+e,r.length-e),new Cn(r.buffer,r.byteOffset,e)}let n=Buffer.allocUnsafe(e);do{let r=this._buffers[0],s=n.length-e;e>=r.length?n.set(this._buffers.shift(),s):(n.set(new Uint8Array(r.buffer,r.byteOffset,e),s),this._buffers[0]=new Cn(r.buffer,r.byteOffset+e,r.length-e)),e-=r.length}while(e>0);return n}startLoop(e){this._loop=!0;do switch(this._state){case X:this.getInfo(e);break;case so:this.getPayloadLength16(e);break;case io:this.getPayloadLength64(e);break;case oo:this.getMask();break;case Dr:this.getData(e);break;case $r:case In:this._loop=!1;return}while(this._loop);this._errored||e()}getInfo(e){if(this._bufferedBytes<2){this._loop=!1;return}let n=this.consume(2);if((n[0]&48)!==0){let s=this.createError(RangeError,"RSV2 and RSV3 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_2_3");e(s);return}let r=(n[0]&64)===64;if(r&&!this._extensions[to.extensionName]){let s=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(s);return}if(this._fin=(n[0]&128)===128,this._opcode=n[0]&15,this._payloadLength=n[1]&127,this._opcode===0){if(r){let s=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(s);return}if(!this._fragmented){let s=this.createError(RangeError,"invalid opcode 0",!0,1002,"WS_ERR_INVALID_OPCODE");e(s);return}this._opcode=this._fragmented}else if(this._opcode===1||this._opcode===2){if(this._fragmented){let s=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");e(s);return}this._compressed=r}else if(this._opcode>7&&this._opcode<11){if(!this._fin){let s=this.createError(RangeError,"FIN must be set",!0,1002,"WS_ERR_EXPECTED_FIN");e(s);return}if(r){let s=this.createError(RangeError,"RSV1 must be clear",!0,1002,"WS_ERR_UNEXPECTED_RSV_1");e(s);return}if(this._payloadLength>125||this._opcode===8&&this._payloadLength===1){let s=this.createError(RangeError,`invalid payload length ${this._payloadLength}`,!0,1002,"WS_ERR_INVALID_CONTROL_PAYLOAD_LENGTH");e(s);return}}else{let s=this.createError(RangeError,`invalid opcode ${this._opcode}`,!0,1002,"WS_ERR_INVALID_OPCODE");e(s);return}if(!this._fin&&!this._fragmented&&(this._fragmented=this._opcode),this._masked=(n[1]&128)===128,this._isServer){if(!this._masked){let s=this.createError(RangeError,"MASK must be set",!0,1002,"WS_ERR_EXPECTED_MASK");e(s);return}}else if(this._masked){let s=this.createError(RangeError,"MASK must be clear",!0,1002,"WS_ERR_UNEXPECTED_MASK");e(s);return}this._payloadLength===126?this._state=so:this._payloadLength===127?this._state=io: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 n=this.consume(8),r=n.readUInt32BE(0);if(r>Math.pow(2,21)-1){let s=this.createError(RangeError,"Unsupported WebSocket frame: payload length > 2^53 - 1",!1,1009,"WS_ERR_UNSUPPORTED_DATA_PAYLOAD_LENGTH");e(s);return}this._payloadLength=r*Math.pow(2,32)+n.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 n=this.createError(RangeError,"Max payload size exceeded",!1,1009,"WS_ERR_UNSUPPORTED_MESSAGE_LENGTH");e(n);return}this._masked?this._state=oo:this._state=Dr}getMask(){if(this._bufferedBytes<4){this._loop=!1;return}this._mask=this.consume(4),this._state=Dr}getData(e){let n=no;if(this._payloadLength){if(this._bufferedBytes<this._payloadLength){this._loop=!1;return}n=this.consume(this._payloadLength),this._masked&&(this._mask[0]|this._mask[1]|this._mask[2]|this._mask[3])!==0&&ud(n,this._mask)}if(this._opcode>7){this.controlMessage(n,e);return}if(this._compressed){this._state=$r,this.decompress(n,e);return}n.length&&(this._messageLength=this._totalPayloadLength,this._fragments.push(n)),this.dataMessage(e)}decompress(e,n){this._extensions[to.extensionName].decompress(e,this._fin,(s,i)=>{if(s)return n(s);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");n(o);return}this._fragments.push(i)}this.dataMessage(n),this._state===X&&this.startLoop(n)})}dataMessage(e){if(!this._fin){this._state=X;return}let n=this._messageLength,r=this._fragments;if(this._totalPayloadLength=0,this._messageLength=0,this._fragmented=0,this._fragments=[],this._opcode===2){let s;this._binaryType==="nodebuffer"?s=Mr(r,n):this._binaryType==="arraybuffer"?s=cd(Mr(r,n)):this._binaryType==="blob"?s=new Blob(r):s=r,this._allowSynchronousEvents?(this.emit("message",s,!0),this._state=X):(this._state=In,setImmediate(()=>{this.emit("message",s,!0),this._state=X,this.startLoop(e)}))}else{let s=Mr(r,n);if(!this._skipUTF8Validation&&!ro(s)){let i=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");e(i);return}this._state===$r||this._allowSynchronousEvents?(this.emit("message",s,!1),this._state=X):(this._state=In,setImmediate(()=>{this.emit("message",s,!1),this._state=X,this.startLoop(e)}))}}controlMessage(e,n){if(this._opcode===8){if(e.length===0)this._loop=!1,this.emit("conclude",1005,no),this.end();else{let r=e.readUInt16BE(0);if(!dd(r)){let i=this.createError(RangeError,`invalid status code ${r}`,!0,1002,"WS_ERR_INVALID_CLOSE_CODE");n(i);return}let s=new Cn(e.buffer,e.byteOffset+2,e.length-2);if(!this._skipUTF8Validation&&!ro(s)){let i=this.createError(Error,"invalid UTF-8 sequence",!0,1007,"WS_ERR_INVALID_UTF8");n(i);return}this._loop=!1,this.emit("conclude",r,s),this.end()}this._state=X;return}this._allowSynchronousEvents?(this.emit(this._opcode===9?"ping":"pong",e),this._state=X):(this._state=In,setImmediate(()=>{this.emit(this._opcode===9?"ping":"pong",e),this._state=X,this.startLoop(n)}))}createError(e,n,r,s,i){this._loop=!1,this._errored=!0;let o=new e(r?`Invalid WebSocket frame: ${n}`:n);return Error.captureStackTrace(o,this.createError),o.code=i,o[ad]=s,o}};ao.exports=Ur});var Kr=S((ky,uo)=>{"use strict";var{Duplex:Ty}=v("stream"),{randomFillSync:fd}=v("crypto"),lo=qt(),{EMPTY_BUFFER:pd,kWebSocket:hd,NOOP:gd}=ye(),{isBlob:ft,isValidStatusCode:md}=dt(),{mask:co,toBuffer:qe}=Ft(),ee=Symbol("kByteLength"),yd=Buffer.alloc(4),xn=8*1024,Ke,pt=xn,ie=0,_d=1,wd=2,jr=class t{constructor(e,n,r){this._extensions=n||{},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=ie,this.onerror=gd,this[hd]=void 0}static frame(e,n){let r,s=!1,i=2,o=!1;n.mask&&(r=n.maskBuffer||yd,n.generateMask?n.generateMask(r):(pt===xn&&(Ke===void 0&&(Ke=Buffer.alloc(xn)),fd(Ke,0,xn),pt=0),r[0]=Ke[pt++],r[1]=Ke[pt++],r[2]=Ke[pt++],r[3]=Ke[pt++]),o=(r[0]|r[1]|r[2]|r[3])===0,i=6);let a;typeof e=="string"?(!n.mask||o)&&n[ee]!==void 0?a=n[ee]:(e=Buffer.from(e),a=e.length):(a=e.length,s=n.mask&&n.readOnly&&!o);let l=a;a>=65536?(i+=8,l=127):a>125&&(i+=2,l=126);let c=Buffer.allocUnsafe(s?a+i:i);return c[0]=n.fin?n.opcode|128:n.opcode,n.rsv1&&(c[0]|=64),c[1]=l,l===126?c.writeUInt16BE(a,2):l===127&&(c[2]=c[3]=0,c.writeUIntBE(a,4,6)),n.mask?(c[1]|=128,c[i-4]=r[0],c[i-3]=r[1],c[i-2]=r[2],c[i-1]=r[3],o?[c,e]:s?(co(e,r,c,i,a),[c]):(co(e,r,e,0,a),[c,e])):[c,e]}close(e,n,r,s){let i;if(e===void 0)i=pd;else{if(typeof e!="number"||!md(e))throw new TypeError("First argument must be a valid error code number");if(n===void 0||!n.length)i=Buffer.allocUnsafe(2),i.writeUInt16BE(e,0);else{let a=Buffer.byteLength(n);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 n=="string"?i.write(n,2):i.set(n,2)}}let o={[ee]:i.length,fin:!0,generateMask:this._generateMask,mask:r,maskBuffer:this._maskBuffer,opcode:8,readOnly:!1,rsv1:!1};this._state!==ie?this.enqueue([this.dispatch,i,!1,o,s]):this.sendFrame(t.frame(i,o),s)}ping(e,n,r){let s,i;if(typeof e=="string"?(s=Buffer.byteLength(e),i=!1):ft(e)?(s=e.size,i=!1):(e=qe(e),s=e.length,i=qe.readOnly),s>125)throw new RangeError("The data size must not be greater than 125 bytes");let o={[ee]:s,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:9,readOnly:i,rsv1:!1};ft(e)?this._state!==ie?this.enqueue([this.getBlobData,e,!1,o,r]):this.getBlobData(e,!1,o,r):this._state!==ie?this.enqueue([this.dispatch,e,!1,o,r]):this.sendFrame(t.frame(e,o),r)}pong(e,n,r){let s,i;if(typeof e=="string"?(s=Buffer.byteLength(e),i=!1):ft(e)?(s=e.size,i=!1):(e=qe(e),s=e.length,i=qe.readOnly),s>125)throw new RangeError("The data size must not be greater than 125 bytes");let o={[ee]:s,fin:!0,generateMask:this._generateMask,mask:n,maskBuffer:this._maskBuffer,opcode:10,readOnly:i,rsv1:!1};ft(e)?this._state!==ie?this.enqueue([this.getBlobData,e,!1,o,r]):this.getBlobData(e,!1,o,r):this._state!==ie?this.enqueue([this.dispatch,e,!1,o,r]):this.sendFrame(t.frame(e,o),r)}send(e,n,r){let s=this._extensions[lo.extensionName],i=n.binary?2:1,o=n.compress,a,l;typeof e=="string"?(a=Buffer.byteLength(e),l=!1):ft(e)?(a=e.size,l=!1):(e=qe(e),a=e.length,l=qe.readOnly),this._firstFragment?(this._firstFragment=!1,o&&s&&s.params[s._isServer?"server_no_context_takeover":"client_no_context_takeover"]&&(o=a>=s._threshold),this._compress=o):(o=!1,i=0),n.fin&&(this._firstFragment=!0);let c={[ee]:a,fin:n.fin,generateMask:this._generateMask,mask:n.mask,maskBuffer:this._maskBuffer,opcode:i,readOnly:l,rsv1:o};ft(e)?this._state!==ie?this.enqueue([this.getBlobData,e,this._compress,c,r]):this.getBlobData(e,this._compress,c,r):this._state!==ie?this.enqueue([this.dispatch,e,this._compress,c,r]):this.dispatch(e,this._compress,c,r)}getBlobData(e,n,r,s){this._bufferedBytes+=r[ee],this._state=wd,e.arrayBuffer().then(i=>{if(this._socket.destroyed){let a=new Error("The socket was closed while the blob was being read");process.nextTick(qr,this,a,s);return}this._bufferedBytes-=r[ee];let o=qe(i);n?this.dispatch(o,n,r,s):(this._state=ie,this.sendFrame(t.frame(o,r),s),this.dequeue())}).catch(i=>{process.nextTick(Sd,this,i,s)})}dispatch(e,n,r,s){if(!n){this.sendFrame(t.frame(e,r),s);return}let i=this._extensions[lo.extensionName];this._bufferedBytes+=r[ee],this._state=_d,i.compress(e,r.fin,(o,a)=>{if(this._socket.destroyed){let l=new Error("The socket was closed while data was being compressed");qr(this,l,s);return}this._bufferedBytes-=r[ee],this._state=ie,r.readOnly=!1,this.sendFrame(t.frame(a,r),s),this.dequeue()})}dequeue(){for(;this._state===ie&&this._queue.length;){let e=this._queue.shift();this._bufferedBytes-=e[3][ee],Reflect.apply(e[0],this,e.slice(1))}}enqueue(e){this._bufferedBytes+=e[3][ee],this._queue.push(e)}sendFrame(e,n){e.length===2?(this._socket.cork(),this._socket.write(e[0]),this._socket.write(e[1],n),this._socket.uncork()):this._socket.write(e[0],n)}};uo.exports=jr;function qr(t,e,n){typeof n=="function"&&n(e);for(let r=0;r<t._queue.length;r++){let s=t._queue[r],i=s[s.length-1];typeof i=="function"&&i(e)}}function Sd(t,e,n){qr(t,e,n),t.onerror(e)}});var So=S((vy,wo)=>{"use strict";var{kForOnEventAttribute:Kt,kListener:Wr}=ye(),fo=Symbol("kCode"),po=Symbol("kData"),ho=Symbol("kError"),go=Symbol("kMessage"),mo=Symbol("kReason"),ht=Symbol("kTarget"),yo=Symbol("kType"),_o=Symbol("kWasClean"),we=class{constructor(e){this[ht]=null,this[yo]=e}get target(){return this[ht]}get type(){return this[yo]}};Object.defineProperty(we.prototype,"target",{enumerable:!0});Object.defineProperty(we.prototype,"type",{enumerable:!0});var We=class extends we{constructor(e,n={}){super(e),this[fo]=n.code===void 0?0:n.code,this[mo]=n.reason===void 0?"":n.reason,this[_o]=n.wasClean===void 0?!1:n.wasClean}get code(){return this[fo]}get reason(){return this[mo]}get wasClean(){return this[_o]}};Object.defineProperty(We.prototype,"code",{enumerable:!0});Object.defineProperty(We.prototype,"reason",{enumerable:!0});Object.defineProperty(We.prototype,"wasClean",{enumerable:!0});var gt=class extends we{constructor(e,n={}){super(e),this[ho]=n.error===void 0?null:n.error,this[go]=n.message===void 0?"":n.message}get error(){return this[ho]}get message(){return this[go]}};Object.defineProperty(gt.prototype,"error",{enumerable:!0});Object.defineProperty(gt.prototype,"message",{enumerable:!0});var Wt=class extends we{constructor(e,n={}){super(e),this[po]=n.data===void 0?null:n.data}get data(){return this[po]}};Object.defineProperty(Wt.prototype,"data",{enumerable:!0});var Ed={addEventListener(t,e,n={}){for(let s of this.listeners(t))if(!n[Kt]&&s[Wr]===e&&!s[Kt])return;let r;if(t==="message")r=function(i,o){let a=new Wt("message",{data:o?i:i.toString()});a[ht]=this,Rn(e,this,a)};else if(t==="close")r=function(i,o){let a=new We("close",{code:i,reason:o.toString(),wasClean:this._closeFrameReceived&&this._closeFrameSent});a[ht]=this,Rn(e,this,a)};else if(t==="error")r=function(i){let o=new gt("error",{error:i,message:i.message});o[ht]=this,Rn(e,this,o)};else if(t==="open")r=function(){let i=new we("open");i[ht]=this,Rn(e,this,i)};else return;r[Kt]=!!n[Kt],r[Wr]=e,n.once?this.once(t,r):this.on(t,r)},removeEventListener(t,e){for(let n of this.listeners(t))if(n[Wr]===e&&!n[Kt]){this.removeListener(t,n);break}}};wo.exports={CloseEvent:We,ErrorEvent:gt,Event:we,EventTarget:Ed,MessageEvent:Wt};function Rn(t,e,n){typeof t=="object"&&t.handleEvent?t.handleEvent.call(t,n):t.call(e,n)}});var Hr=S((Cy,Eo)=>{"use strict";var{tokenChars:Ht}=dt();function ce(t,e,n){t[e]===void 0?t[e]=[n]:t[e].push(n)}function bd(t){let e=Object.create(null),n=Object.create(null),r=!1,s=!1,i=!1,o,a,l=-1,c=-1,u=-1,p=0;for(;p<t.length;p++)if(c=t.charCodeAt(p),o===void 0)if(u===-1&&Ht[c]===1)l===-1&&(l=p);else if(p!==0&&(c===32||c===9))u===-1&&l!==-1&&(u=p);else if(c===59||c===44){if(l===-1)throw new SyntaxError(`Unexpected character at index ${p}`);u===-1&&(u=p);let f=t.slice(l,u);c===44?(ce(e,f,n),n=Object.create(null)):o=f,l=u=-1}else throw new SyntaxError(`Unexpected character at index ${p}`);else if(a===void 0)if(u===-1&&Ht[c]===1)l===-1&&(l=p);else if(c===32||c===9)u===-1&&l!==-1&&(u=p);else if(c===59||c===44){if(l===-1)throw new SyntaxError(`Unexpected character at index ${p}`);u===-1&&(u=p),ce(n,t.slice(l,u),!0),c===44&&(ce(e,o,n),n=Object.create(null),o=void 0),l=u=-1}else if(c===61&&l!==-1&&u===-1)a=t.slice(l,p),l=u=-1;else throw new SyntaxError(`Unexpected character at index ${p}`);else if(s){if(Ht[c]!==1)throw new SyntaxError(`Unexpected character at index ${p}`);l===-1?l=p:r||(r=!0),s=!1}else if(i)if(Ht[c]===1)l===-1&&(l=p);else if(c===34&&l!==-1)i=!1,u=p;else if(c===92)s=!0;else throw new SyntaxError(`Unexpected character at index ${p}`);else if(c===34&&t.charCodeAt(p-1)===61)i=!0;else if(u===-1&&Ht[c]===1)l===-1&&(l=p);else if(l!==-1&&(c===32||c===9))u===-1&&(u=p);else if(c===59||c===44){if(l===-1)throw new SyntaxError(`Unexpected character at index ${p}`);u===-1&&(u=p);let f=t.slice(l,u);r&&(f=f.replace(/\\/g,""),r=!1),ce(n,a,f),c===44&&(ce(e,o,n),n=Object.create(null),o=void 0),a=void 0,l=u=-1}else throw new SyntaxError(`Unexpected character at index ${p}`);if(l===-1||i||c===32||c===9)throw new SyntaxError("Unexpected end of input");u===-1&&(u=p);let g=t.slice(l,u);return o===void 0?ce(e,g,n):(a===void 0?ce(n,g,!0):r?ce(n,a,g.replace(/\\/g,"")):ce(n,a,g),ce(e,o,n)),e}function Td(t){return Object.keys(t).map(e=>{let n=t[e];return Array.isArray(n)||(n=[n]),n.map(r=>[e].concat(Object.keys(r).map(s=>{let i=r[s];return Array.isArray(i)||(i=[i]),i.map(o=>o===!0?s:`${s}=${o}`).join("; ")})).join("; ")).join(", ")}).join(", ")}Eo.exports={format:Td,parse:bd}});var Nn=S((Ry,No)=>{"use strict";var kd=v("events"),vd=v("https"),Cd=v("http"),ko=v("net"),Id=v("tls"),{randomBytes:xd,createHash:Rd}=v("crypto"),{Duplex:Iy,Readable:xy}=v("stream"),{URL:Vr}=v("url"),ve=qt(),Pd=Fr(),Ad=Kr(),{isBlob:Od}=dt(),{BINARY_TYPES:bo,CLOSE_TIMEOUT:Nd,EMPTY_BUFFER:Pn,GUID:Ld,kForOnEventAttribute:Gr,kListener:Bd,kStatusCode:Md,kWebSocket:j,NOOP:vo}=ye(),{EventTarget:{addEventListener:Dd,removeEventListener:$d}}=So(),{format:Ud,parse:Fd}=Hr(),{toBuffer:jd}=Ft(),Co=Symbol("kAborted"),Yr=[8,13],Se=["CONNECTING","OPEN","CLOSING","CLOSED"],qd=/^[!#$%&'*+\-.0-9A-Z^_`|a-z~]+$/,L=class t extends kd{constructor(e,n,r){super(),this._binaryType=bo[0],this._closeCode=1006,this._closeFrameReceived=!1,this._closeFrameSent=!1,this._closeMessage=Pn,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,n===void 0?n=[]:Array.isArray(n)||(typeof n=="object"&&n!==null?(r=n,n=[]):n=[n]),Io(this,e,n,r)):(this._autoPong=r.autoPong,this._closeTimeout=r.closeTimeout,this._isServer=!0)}get binaryType(){return this._binaryType}set binaryType(e){bo.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,n,r){let s=new Pd({allowSynchronousEvents:r.allowSynchronousEvents,binaryType:this.binaryType,extensions:this._extensions,isServer:this._isServer,maxPayload:r.maxPayload,skipUTF8Validation:r.skipUTF8Validation}),i=new Ad(e,this._extensions,r.generateMask);this._receiver=s,this._sender=i,this._socket=e,s[j]=this,i[j]=this,e[j]=this,s.on("conclude",Hd),s.on("drain",Vd),s.on("error",Gd),s.on("message",Yd),s.on("ping",zd),s.on("pong",Jd),i.onerror=Qd,e.setTimeout&&e.setTimeout(0),e.setNoDelay&&e.setNoDelay(),n.length>0&&e.unshift(n),e.on("close",Po),e.on("data",On),e.on("end",Ao),e.on("error",Oo),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[ve.extensionName]&&this._extensions[ve.extensionName].cleanup(),this._receiver.removeAllListeners(),this._readyState=t.CLOSED,this.emit("close",this._closeCode,this._closeMessage)}close(e,n){if(this.readyState!==t.CLOSED){if(this.readyState===t.CONNECTING){J(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,n,!this._isServer,r=>{r||(this._closeFrameSent=!0,(this._closeFrameReceived||this._receiver._writableState.errorEmitted)&&this._socket.end())}),Ro(this)}}pause(){this.readyState===t.CONNECTING||this.readyState===t.CLOSED||(this._paused=!0,this._socket.pause())}ping(e,n,r){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof e=="function"?(r=e,e=n=void 0):typeof n=="function"&&(r=n,n=void 0),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){zr(this,e,r);return}n===void 0&&(n=!this._isServer),this._sender.ping(e||Pn,n,r)}pong(e,n,r){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof e=="function"?(r=e,e=n=void 0):typeof n=="function"&&(r=n,n=void 0),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){zr(this,e,r);return}n===void 0&&(n=!this._isServer),this._sender.pong(e||Pn,n,r)}resume(){this.readyState===t.CONNECTING||this.readyState===t.CLOSED||(this._paused=!1,this._receiver._writableState.needDrain||this._socket.resume())}send(e,n,r){if(this.readyState===t.CONNECTING)throw new Error("WebSocket is not open: readyState 0 (CONNECTING)");if(typeof n=="function"&&(r=n,n={}),typeof e=="number"&&(e=e.toString()),this.readyState!==t.OPEN){zr(this,e,r);return}let s={binary:typeof e!="string",mask:!this._isServer,compress:!0,fin:!0,...n};this._extensions[ve.extensionName]||(s.compress=!1),this._sender.send(e||Pn,s,r)}terminate(){if(this.readyState!==t.CLOSED){if(this.readyState===t.CONNECTING){J(this,this._req,"WebSocket was closed before the connection was established");return}this._socket&&(this._readyState=t.CLOSING,this._socket.destroy())}}};Object.defineProperty(L,"CONNECTING",{enumerable:!0,value:Se.indexOf("CONNECTING")});Object.defineProperty(L.prototype,"CONNECTING",{enumerable:!0,value:Se.indexOf("CONNECTING")});Object.defineProperty(L,"OPEN",{enumerable:!0,value:Se.indexOf("OPEN")});Object.defineProperty(L.prototype,"OPEN",{enumerable:!0,value:Se.indexOf("OPEN")});Object.defineProperty(L,"CLOSING",{enumerable:!0,value:Se.indexOf("CLOSING")});Object.defineProperty(L.prototype,"CLOSING",{enumerable:!0,value:Se.indexOf("CLOSING")});Object.defineProperty(L,"CLOSED",{enumerable:!0,value:Se.indexOf("CLOSED")});Object.defineProperty(L.prototype,"CLOSED",{enumerable:!0,value:Se.indexOf("CLOSED")});["binaryType","bufferedAmount","extensions","isPaused","protocol","readyState","url"].forEach(t=>{Object.defineProperty(L.prototype,t,{enumerable:!0})});["open","error","close","message"].forEach(t=>{Object.defineProperty(L.prototype,`on${t}`,{enumerable:!0,get(){for(let e of this.listeners(t))if(e[Gr])return e[Bd];return null},set(e){for(let n of this.listeners(t))if(n[Gr]){this.removeListener(t,n);break}typeof e=="function"&&this.addEventListener(t,e,{[Gr]:!0})}})});L.prototype.addEventListener=Dd;L.prototype.removeEventListener=$d;No.exports=L;function Io(t,e,n,r){let s={allowSynchronousEvents:!0,autoPong:!0,closeTimeout:Nd,protocolVersion:Yr[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=s.autoPong,t._closeTimeout=s.closeTimeout,!Yr.includes(s.protocolVersion))throw new RangeError(`Unsupported protocol version: ${s.protocolVersion} (supported versions: ${Yr.join(", ")})`);let i;if(e instanceof Vr)i=e;else try{i=new Vr(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:",l;if(i.protocol!=="ws:"&&!o&&!a?l=`The URL's protocol must be one of "ws:", "wss:", "http:", "https:", or "ws+unix:"`:a&&!i.pathname?l="The URL's pathname is empty":i.hash&&(l="The URL contains a fragment identifier"),l){let y=new SyntaxError(l);if(t._redirects===0)throw y;An(t,y);return}let c=o?443:80,u=xd(16).toString("base64"),p=o?vd.request:Cd.request,g=new Set,f;if(s.createConnection=s.createConnection||(o?Wd:Kd),s.defaultPort=s.defaultPort||c,s.port=i.port||c,s.host=i.hostname.startsWith("[")?i.hostname.slice(1,-1):i.hostname,s.headers={...s.headers,"Sec-WebSocket-Version":s.protocolVersion,"Sec-WebSocket-Key":u,Connection:"Upgrade",Upgrade:"websocket"},s.path=i.pathname+i.search,s.timeout=s.handshakeTimeout,s.perMessageDeflate&&(f=new ve(s.perMessageDeflate!==!0?s.perMessageDeflate:{},!1,s.maxPayload),s.headers["Sec-WebSocket-Extensions"]=Ud({[ve.extensionName]:f.offer()})),n.length){for(let y of n){if(typeof y!="string"||!qd.test(y)||g.has(y))throw new SyntaxError("An invalid or duplicated subprotocol was specified");g.add(y)}s.headers["Sec-WebSocket-Protocol"]=n.join(",")}if(s.origin&&(s.protocolVersion<13?s.headers["Sec-WebSocket-Origin"]=s.origin:s.headers.Origin=s.origin),(i.username||i.password)&&(s.auth=`${i.username}:${i.password}`),a){let y=s.path.split(":");s.socketPath=y[0],s.path=y[1]}let h;if(s.followRedirects){if(t._redirects===0){t._originalIpc=a,t._originalSecure=o,t._originalHostOrSocketPath=a?s.socketPath:i.host;let y=r&&r.headers;if(r={...r,headers:{}},y)for(let[_,w]of Object.entries(y))r.headers[_.toLowerCase()]=w}else if(t.listenerCount("redirect")===0){let y=a?t._originalIpc?s.socketPath===t._originalHostOrSocketPath:!1:t._originalIpc?!1:i.host===t._originalHostOrSocketPath;(!y||t._originalSecure&&!o)&&(delete s.headers.authorization,delete s.headers.cookie,y||delete s.headers.host,s.auth=void 0)}s.auth&&!r.headers.authorization&&(r.headers.authorization="Basic "+Buffer.from(s.auth).toString("base64")),h=t._req=p(s),t._redirects&&t.emit("redirect",t.url,h)}else h=t._req=p(s);s.timeout&&h.on("timeout",()=>{J(t,h,"Opening handshake has timed out")}),h.on("error",y=>{h===null||h[Co]||(h=t._req=null,An(t,y))}),h.on("response",y=>{let _=y.headers.location,w=y.statusCode;if(_&&s.followRedirects&&w>=300&&w<400){if(++t._redirects>s.maxRedirects){J(t,h,"Maximum redirects exceeded");return}h.abort();let R;try{R=new Vr(_,e)}catch{let T=new SyntaxError(`Invalid URL: ${_}`);An(t,T);return}Io(t,R,n,r)}else t.emit("unexpected-response",h,y)||J(t,h,`Unexpected server response: ${y.statusCode}`)}),h.on("upgrade",(y,_,w)=>{if(t.emit("upgrade",y),t.readyState!==L.CONNECTING)return;h=t._req=null;let R=y.headers.upgrade;if(R===void 0||R.toLowerCase()!=="websocket"){J(t,_,"Invalid Upgrade header");return}let B=Rd("sha1").update(u+Ld).digest("base64");if(y.headers["sec-websocket-accept"]!==B){J(t,_,"Invalid Sec-WebSocket-Accept header");return}let T=y.headers["sec-websocket-protocol"],E;if(T!==void 0?g.size?g.has(T)||(E="Server sent an invalid subprotocol"):E="Server sent a subprotocol but none was requested":g.size&&(E="Server sent no subprotocol"),E){J(t,_,E);return}T&&(t._protocol=T);let b=y.headers["sec-websocket-extensions"];if(b!==void 0){if(!f){J(t,_,"Server sent a Sec-WebSocket-Extensions header but no extension was requested");return}let C;try{C=Fd(b)}catch{J(t,_,"Invalid Sec-WebSocket-Extensions header");return}let A=Object.keys(C);if(A.length!==1||A[0]!==ve.extensionName){J(t,_,"Server indicated an extension that was not requested");return}try{f.accept(C[ve.extensionName])}catch{J(t,_,"Invalid Sec-WebSocket-Extensions header");return}t._extensions[ve.extensionName]=f}t.setSocket(_,w,{allowSynchronousEvents:s.allowSynchronousEvents,generateMask:s.generateMask,maxPayload:s.maxPayload,skipUTF8Validation:s.skipUTF8Validation})}),s.finishRequest?s.finishRequest(h,t):h.end()}function An(t,e){t._readyState=L.CLOSING,t._errorEmitted=!0,t.emit("error",e),t.emitClose()}function Kd(t){return t.path=t.socketPath,ko.connect(t)}function Wd(t){return t.path=void 0,!t.servername&&t.servername!==""&&(t.servername=ko.isIP(t.host)?"":t.host),Id.connect(t)}function J(t,e,n){t._readyState=L.CLOSING;let r=new Error(n);Error.captureStackTrace(r,J),e.setHeader?(e[Co]=!0,e.abort(),e.socket&&!e.socket.destroyed&&e.socket.destroy(),process.nextTick(An,t,r)):(e.destroy(r),e.once("error",t.emit.bind(t,"error")),e.once("close",t.emitClose.bind(t)))}function zr(t,e,n){if(e){let r=Od(e)?e.size:jd(e).length;t._socket?t._sender._bufferedBytes+=r:t._bufferedAmount+=r}if(n){let r=new Error(`WebSocket is not open: readyState ${t.readyState} (${Se[t.readyState]})`);process.nextTick(n,r)}}function Hd(t,e){let n=this[j];n._closeFrameReceived=!0,n._closeMessage=e,n._closeCode=t,n._socket[j]!==void 0&&(n._socket.removeListener("data",On),process.nextTick(xo,n._socket),t===1005?n.close():n.close(t,e))}function Vd(){let t=this[j];t.isPaused||t._socket.resume()}function Gd(t){let e=this[j];e._socket[j]!==void 0&&(e._socket.removeListener("data",On),process.nextTick(xo,e._socket),e.close(t[Md])),e._errorEmitted||(e._errorEmitted=!0,e.emit("error",t))}function To(){this[j].emitClose()}function Yd(t,e){this[j].emit("message",t,e)}function zd(t){let e=this[j];e._autoPong&&e.pong(t,!this._isServer,vo),e.emit("ping",t)}function Jd(t){this[j].emit("pong",t)}function xo(t){t.resume()}function Qd(t){let e=this[j];e.readyState!==L.CLOSED&&(e.readyState===L.OPEN&&(e._readyState=L.CLOSING,Ro(e)),this._socket.end(),e._errorEmitted||(e._errorEmitted=!0,e.emit("error",t)))}function Ro(t){t._closeTimer=setTimeout(t._socket.destroy.bind(t._socket),t._closeTimeout)}function Po(){let t=this[j];if(this.removeListener("close",Po),this.removeListener("data",On),this.removeListener("end",Ao),t._readyState=L.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[j]=void 0,clearTimeout(t._closeTimer),t._receiver._writableState.finished||t._receiver._writableState.errorEmitted?t.emitClose():(t._receiver.on("error",To),t._receiver.on("finish",To))}function On(t){this[j]._receiver.write(t)||this.pause()}function Ao(){let t=this[j];t._readyState=L.CLOSING,t._receiver.end(),this.end()}function Oo(){let t=this[j];this.removeListener("error",Oo),this.on("error",vo),t&&(t._readyState=L.CLOSING,this.destroy())}});var Do=S((Ay,Mo)=>{"use strict";var Py=Nn(),{Duplex:Zd}=v("stream");function Lo(t){t.emit("close")}function Xd(){!this.destroyed&&this._writableState.finished&&this.destroy()}function Bo(t){this.removeListener("error",Bo),this.destroy(),this.listenerCount("error")===0&&this.emit("error",t)}function ef(t,e){let n=!0,r=new Zd({...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||(n=!1,r.destroy(i))}),t.once("close",function(){r.destroyed||r.push(null)}),r._destroy=function(s,i){if(t.readyState===t.CLOSED){i(s),process.nextTick(Lo,r);return}let o=!1;t.once("error",function(l){o=!0,i(l)}),t.once("close",function(){o||i(s),process.nextTick(Lo,r)}),n&&t.terminate()},r._final=function(s){if(t.readyState===t.CONNECTING){t.once("open",function(){r._final(s)});return}t._socket!==null&&(t._socket._writableState.finished?(s(),r._readableState.endEmitted&&r.destroy()):(t._socket.once("finish",function(){s()}),t.close()))},r._read=function(){t.isPaused&&t.resume()},r._write=function(s,i,o){if(t.readyState===t.CONNECTING){t.once("open",function(){r._write(s,i,o)});return}t.send(s,o)},r.on("end",Xd),r.on("error",Bo),r}Mo.exports=ef});var Uo=S((Oy,$o)=>{"use strict";var{tokenChars:tf}=dt();function nf(t){let e=new Set,n=-1,r=-1,s=0;for(s;s<t.length;s++){let o=t.charCodeAt(s);if(r===-1&&tf[o]===1)n===-1&&(n=s);else if(s!==0&&(o===32||o===9))r===-1&&n!==-1&&(r=s);else if(o===44){if(n===-1)throw new SyntaxError(`Unexpected character at index ${s}`);r===-1&&(r=s);let a=t.slice(n,r);if(e.has(a))throw new SyntaxError(`The "${a}" subprotocol is duplicated`);e.add(a),n=r=-1}else throw new SyntaxError(`Unexpected character at index ${s}`)}if(n===-1||r!==-1)throw new SyntaxError("Unexpected end of input");let i=t.slice(n,s);if(e.has(i))throw new SyntaxError(`The "${i}" subprotocol is duplicated`);return e.add(i),e}$o.exports={parse:nf}});var Vo=S((Ly,Ho)=>{"use strict";var rf=v("events"),Ln=v("http"),{Duplex:Ny}=v("stream"),{createHash:sf}=v("crypto"),Fo=Hr(),He=qt(),of=Uo(),af=Nn(),{CLOSE_TIMEOUT:lf,GUID:cf,kWebSocket:uf}=ye(),df=/^[+/0-9A-Za-z]{22}==$/,jo=0,qo=1,Wo=2,Jr=class extends rf{constructor(e,n){if(super(),e={allowSynchronousEvents:!0,autoPong:!0,maxPayload:100*1024*1024,skipUTF8Validation:!1,perMessageDeflate:!1,handleProtocols:null,clientTracking:!0,closeTimeout:lf,verifyClient:null,noServer:!1,backlog:null,server:null,host:null,path:null,port:null,WebSocket:af,...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=Ln.createServer((r,s)=>{let i=Ln.STATUS_CODES[426];s.writeHead(426,{"Content-Length":i.length,"Content-Type":"text/plain"}),s.end(i)}),this._server.listen(e.port,e.host,e.backlog,n)):e.server&&(this._server=e.server),this._server){let r=this.emit.bind(this,"connection");this._removeListeners=ff(this._server,{listening:this.emit.bind(this,"listening"),error:this.emit.bind(this,"error"),upgrade:(s,i,o)=>{this.handleUpgrade(s,i,o,r)}})}e.perMessageDeflate===!0&&(e.perMessageDeflate={}),e.clientTracking&&(this.clients=new Set,this._shouldEmitClose=!1),this.options=e,this._state=jo}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===Wo){e&&this.once("close",()=>{e(new Error("The server is not running"))}),process.nextTick(Vt,this);return}if(e&&this.once("close",e),this._state!==qo)if(this._state=qo,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(Vt,this):process.nextTick(Vt,this);else{let n=this._server;this._removeListeners(),this._removeListeners=this._server=null,n.close(()=>{Vt(this)})}}shouldHandle(e){if(this.options.path){let n=e.url.indexOf("?");if((n!==-1?e.url.slice(0,n):e.url)!==this.options.path)return!1}return!0}handleUpgrade(e,n,r,s){n.on("error",Ko);let i=e.headers["sec-websocket-key"],o=e.headers.upgrade,a=+e.headers["sec-websocket-version"];if(e.method!=="GET"){Ve(this,e,n,405,"Invalid HTTP method");return}if(o===void 0||o.toLowerCase()!=="websocket"){Ve(this,e,n,400,"Invalid Upgrade header");return}if(i===void 0||!df.test(i)){Ve(this,e,n,400,"Missing or invalid Sec-WebSocket-Key header");return}if(a!==13&&a!==8){Ve(this,e,n,400,"Missing or invalid Sec-WebSocket-Version header",{"Sec-WebSocket-Version":"13, 8"});return}if(!this.shouldHandle(e)){Gt(n,400);return}let l=e.headers["sec-websocket-protocol"],c=new Set;if(l!==void 0)try{c=of.parse(l)}catch{Ve(this,e,n,400,"Invalid Sec-WebSocket-Protocol header");return}let u=e.headers["sec-websocket-extensions"],p={};if(this.options.perMessageDeflate&&u!==void 0){let g=new He(this.options.perMessageDeflate,!0,this.options.maxPayload);try{let f=Fo.parse(u);f[He.extensionName]&&(g.accept(f[He.extensionName]),p[He.extensionName]=g)}catch{Ve(this,e,n,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,(f,h,y,_)=>{if(!f)return Gt(n,h||401,y,_);this.completeUpgrade(p,i,c,e,n,r,s)});return}if(!this.options.verifyClient(g))return Gt(n,401)}this.completeUpgrade(p,i,c,e,n,r,s)}completeUpgrade(e,n,r,s,i,o,a){if(!i.readable||!i.writable)return i.destroy();if(i[uf])throw new Error("server.handleUpgrade() was called more than once with the same socket, possibly due to a misconfiguration");if(this._state>jo)return Gt(i,503);let c=["HTTP/1.1 101 Switching Protocols","Upgrade: websocket","Connection: Upgrade",`Sec-WebSocket-Accept: ${sf("sha1").update(n+cf).digest("base64")}`],u=new this.options.WebSocket(null,void 0,this.options);if(r.size){let p=this.options.handleProtocols?this.options.handleProtocols(r,s):r.values().next().value;p&&(c.push(`Sec-WebSocket-Protocol: ${p}`),u._protocol=p)}if(e[He.extensionName]){let p=e[He.extensionName].params,g=Fo.format({[He.extensionName]:[p]});c.push(`Sec-WebSocket-Extensions: ${g}`),u._extensions=e}this.emit("headers",c,s),i.write(c.concat(`\r
8
+ `).join(`\r
9
+ `)),i.removeListener("error",Ko),u.setSocket(i,o,{allowSynchronousEvents:this.options.allowSynchronousEvents,maxPayload:this.options.maxPayload,skipUTF8Validation:this.options.skipUTF8Validation}),this.clients&&(this.clients.add(u),u.on("close",()=>{this.clients.delete(u),this._shouldEmitClose&&!this.clients.size&&process.nextTick(Vt,this)})),a(u,s)}};Ho.exports=Jr;function ff(t,e){for(let n of Object.keys(e))t.on(n,e[n]);return function(){for(let r of Object.keys(e))t.removeListener(r,e[r])}}function Vt(t){t._state=Wo,t.emit("close")}function Ko(){this.destroy()}function Gt(t,e,n,r){n=n||Ln.STATUS_CODES[e],r={Connection:"close","Content-Type":"text/html","Content-Length":Buffer.byteLength(n),...r},t.once("finish",t.destroy),t.end(`HTTP/1.1 ${e} ${Ln.STATUS_CODES[e]}\r
10
+ `+Object.keys(r).map(s=>`${s}: ${r[s]}`).join(`\r
11
+ `)+`\r
12
+ \r
13
+ `+n)}function Ve(t,e,n,r,s,i){if(t.listenerCount("wsClientError")){let o=new Error(s);Error.captureStackTrace(o,Ve),t.emit("wsClientError",o,n,e)}else Gt(n,r,s,i)}});import{appendFileSync as Jo,statSync as yf,renameSync as Yo,unlinkSync as _f,mkdirSync as wf}from"fs";import{join as Sf}from"path";function Xo(t,e){wf(t,{recursive:!0});let n=`beachviber${e}.log`;if(Ce=Sf(t,n),Qo=!0,Dn.length>0){let r=Dn.join("");Dn.length=0;try{Jo(Ce,r)}catch{}}}function ea(t){Zo=Qr[t]}function bf(){if(!Ce)return;let t;try{t=yf(Ce).size}catch{return}if(t<Ef)return;let e=Ce.lastIndexOf(".log"),n=Ce.slice(0,e),r=".log",s=`${n}.${zo}${r}`;try{_f(s)}catch{}for(let i=zo-1;i>=1;i--){let o=`${n}.${i}${r}`,a=`${n}.${i+1}${r}`;try{Yo(o,a)}catch{}}try{Yo(Ce,`${n}.1${r}`)}catch{}}function Bn(t,e,n){let r=new Date().toISOString(),s=t.padEnd(5);return`${r} [${s}] ${e} ${n}
14
+ `}function Mn(t){if(!Qo){Dn.push(t);return}try{bf(),Jo(Ce,t)}catch{}}function M(t){let e=`[${t}]`;return{debug(n){Zo>Qr.DEBUG||Mn(Bn("DEBUG",e,n))},info(n){Mn(Bn("INFO",e,n))},warn(n){Mn(Bn("WARN",e,n))},error(n,r){let s=r!==void 0?` ${r instanceof Error?r.stack||r.message:String(r)}`:"";Mn(Bn("ERROR",e,n+s))}}}var Ef,zo,Qr,Ce,Qo,Zo,Dn,oe=K(()=>{"use strict";Ef=5*1024*1024,zo=3,Qr={DEBUG:0,INFO:1,WARN:2,ERROR:3},Ce=null,Qo=!1,Zo=Qr.INFO,Dn=[]});import{execFile as Tf}from"child_process";import{readFileSync as kf,readdirSync as Xr,existsSync as vf,openSync as Cf,readSync as If,closeSync as xf}from"fs";import{basename as Rf,join as $n}from"path";import{homedir as Pf}from"os";function Zr(t,e){return new Promise((n,r)=>{Tf("git",t,{cwd:e,timeout:Af},(s,i)=>{if(s)return r(s);n(i.trim())})})}async function Of(t){try{let[e,n,r]=await Promise.all([Zr(["rev-parse","--abbrev-ref","HEAD"],t),Zr(["log","-1","--oneline"],t),Zr(["status","--porcelain"],t)]),s=r?r.split(`
15
+ `).length:0;return{branch:e,lastCommit:n,dirty:s>0,changedFiles:s}}catch{return null}}function es(t){return`proj_${t.toLowerCase().replace(/[^a-z0-9]/g,"_")}`}async function Un(t){let e=Rf(t),n=await Of(t)||{branch:"unknown",lastCommit:"",dirty:!1,changedFiles:0};return{id:es(e),name:e,path:t,git:n}}async function yt(){let t=$n(Pf(),".claude","projects");if(!vf(t))return[];let e;try{e=Xr(t,{withFileTypes:!0}).filter(s=>s.isDirectory()).map(s=>s.name)}catch{return[]}let n=new Set,r=[];for(let s of e){let i=$n(t,s),o=ts(i);if(o&&!n.has(o)){n.add(o);try{let a=await Un(o),l=Nf(i);r.push({...a,sessionCount:l})}catch{}}}ta.info(`Discovered ${r.length} projects from ~/.claude/projects/`);for(let s of r)ta.info(` ${s.name} -- ${s.sessionCount} sessions (${s.git.branch})`);return r}function Nf(t){try{return Xr(t).filter(e=>e.endsWith(".jsonl")).length}catch{return 0}}function ts(t){let e=$n(t,"sessions-index.json");try{let s=kf(e,"utf-8"),i=JSON.parse(s);if(i.originalPath)return i.originalPath}catch{}let n;try{n=Xr(t).filter(s=>s.endsWith(".jsonl"))}catch{return null}let r=Buffer.alloc(4096);for(let s of n)try{let i=Cf($n(t,s),"r"),o=If(i,r,0,4096,0);xf(i);let a=r.toString("utf-8",0,o);for(let l of a.split(`
16
+ `))if(l)try{let c=JSON.parse(l);if(c.type==="user"&&c.cwd)return c.cwd}catch{}}catch{continue}return null}function na(t,e){return t.find(n=>n.id===e)}var ta,Af,Fn=K(()=>{"use strict";oe();ta=M("scan"),Af=5e3});import{readFileSync as _t,writeFileSync as ia,mkdirSync as Lf,existsSync as Ie,statSync as oa,readdirSync as ra,openSync as Bf,readSync as Mf,closeSync as Df}from"fs";import{join as ae,basename as $f}from"path";import{homedir as xe}from"os";function Yt(t){if(!Re.test(t))throw new Error(`Invalid session ID format: ${t.slice(0,50)}`)}function jn(t){let e=qn(t),n=ae(xe(),".claude","projects",e,"sessions-index.json"),r=new Map;if(!Ie(n))return r;try{let s=_t(n,"utf-8"),i=JSON.parse(s);if(Array.isArray(i.entries))for(let o of i.entries)r.set(o.sessionId,o)}catch(s){ue.error(`Error reading session index: ${s}`)}return r}function wt(t,e){Yt(e);let n=qn(t),r=ae(xe(),".claude","projects",n,`${e}.jsonl`);try{return oa(r).mtimeMs}catch{return null}}function qn(t){return t.replace(/[/\\:]/g,"-")}function ns(t,e){Yt(e);let n=qn(t),r=ae(xe(),".claude","projects",n,`${e}.jsonl`);if(!Ie(r))return ue.info(`File not found: ${r}`),[];let s=[],i=[];try{let c=_t(r,"utf-8").split(`
17
+ `);for(let u of c){if(!u.trim())continue;let p;try{p=JSON.parse(u)}catch{continue}let g=p.type;if(g!=="user"&&g!=="assistant")continue;let f=p.message;if(!f)continue;let h=p.timestamp||"",y=f.content;if(g==="user"){let _="";if(typeof y=="string")_=y;else if(Array.isArray(y)){for(let w of y){let R=w;if(R.type==="tool_result"&&R.tool_use_id){let B=i.indexOf(R.tool_use_id);B!==-1&&i.splice(B,1);for(let T=s.length-1;T>=0;T--)if(s[T].role==="assistant"&&s[T].contentBlocks){let E=s[T].contentBlocks.find(b=>b.type==="tool_use"&&b.toolUseId===R.tool_use_id);if(E){let b="";if(typeof R.content=="string"?b=R.content:Array.isArray(R.content)&&(b=R.content.filter(C=>C.type==="text").map(C=>C.text).join("")),E.name==="Task"){let C=b.match(/agentId:\s*([a-f0-9]+)/);C&&(E.agentId=C[1])}E.result=b.length>2e3?b.slice(0,2e3):b}break}}}_=y.filter(w=>w.type==="text").map(w=>w.text).join("")}_&&s.push({role:"user",content:_,timestamp:h})}else if(g==="assistant"&&Array.isArray(y)){let w=y.filter(E=>E.type==="text").map(E=>E.text).join(""),B=y.filter(E=>E.type==="tool_use").map(E=>{let b=E.name||"unknown",C=E.input,A=b;return C&&(C.command?A=`${b}: ${String(C.command).slice(0,200)}`:C.file_path?A=`${b}: ${String(C.file_path)}`:C.pattern?A=`${b}: ${String(C.pattern).slice(0,200)}`:C.query?A=`${b}: ${String(C.query).slice(0,200)}`:C.url?A=`${b}: ${String(C.url).slice(0,200)}`:C.description&&(A=`${b}: ${String(C.description).slice(0,200)}`)),{tool:A,timestamp:h?new Date(h).getTime():Date.now()}}),T=[];for(let E of y){let b=E;if(b.type==="text")T.push({type:"text",text:b.text});else if(b.type==="tool_use"){let C;b.name==="Task"?i.push(b.id):i.length>0&&(C=i[i.length-1]);let A=b.input;if(A&&JSON.stringify(A).length>1e3){let _n={_truncated:!0};for(let br of["command","file_path","pattern","query","url","description"])typeof A[br]=="string"&&(_n[br]=A[br]);A=_n}T.push({type:"tool_use",toolUseId:b.id,name:b.name,input:A,...C?{parentToolUseId:C}:{}})}}(w||B.length>0)&&s.push({role:"assistant",content:w,timestamp:h,...B.length>0?{toolUses:B}:{},...T.length>0?{contentBlocks:T}:{}})}}}catch(l){ue.error(`Error reading transcript: ${l}`)}let o=[];for(let l of s){let c=o[o.length-1];c&&c.role==="assistant"&&l.role==="assistant"?(c.content+=l.content,c.timestamp=l.timestamp,l.toolUses?.length&&(c.toolUses=[...c.toolUses||[],...l.toolUses]),l.contentBlocks?.length&&(c.contentBlocks=[...c.contentBlocks||[],...l.contentBlocks])):o.push({...l})}let a=ae(xe(),".claude","projects",n,e,"subagents");if(Ie(a))for(let l of o){if(l.role!=="assistant"||!l.contentBlocks)continue;let c=[];for(let u of l.contentBlocks){if(c.push(u),u.type!=="tool_use"||u.name!=="Task"||!u.agentId)continue;let p=ae(a,`agent-${u.agentId}.jsonl`);if(Ie(p))try{let g=_t(p,"utf-8");for(let f of g.split(`
18
+ `)){if(!f.trim())continue;let h;try{h=JSON.parse(f)}catch{continue}if(h.type!=="assistant")continue;let y=h.timestamp,_=y?new Date(y).getTime():void 0,w=h.message;if(!(!w||!Array.isArray(w.content)))for(let R of w.content){if(R.type!=="tool_use")continue;let B=R.name||"unknown",E=R.input;if(E&&JSON.stringify(E).length>1e3){let C={_truncated:!0};for(let A of["command","file_path","pattern","query","url","description"])typeof E[A]=="string"&&(C[A]=E[A]);E=C}c.push({type:"tool_use",toolUseId:R.id,name:B,input:E,parentToolUseId:u.toolUseId,..._?{timestamp:_}:{}})}}}catch(g){ue.error(`Error reading subagent transcript ${p}: ${g}`)}}l.contentBlocks=c}return ue.info(`Read ${o.length} messages from ${e}`),o}function rs(){return ae(xe(),".beachviber",Uf)}function aa(){let t=new Map,e=rs();if(!Ie(e))return t;try{let n=_t(e,"utf-8"),r=JSON.parse(n);if(r&&typeof r=="object")for(let[s,i]of Object.entries(r))i&&typeof i=="object"&&t.set(s,i)}catch(n){ue.error(`Error reading session meta: ${n}`)}return t}function la(t,e){try{Yt(t)}catch{return{ok:!1,error:"Invalid session ID"}}if(typeof e!="string"||e.length===0)return{ok:!1,error:"Title must be a non-empty string"};let n=e.trim();if(n.length===0)return{ok:!1,error:"Title must not be blank"};if(n.length>sa)return{ok:!1,error:`Title must be at most ${sa} characters`};if(Ff.test(n)===!1)return{ok:!1,error:"Title contains invalid characters"};try{let r=rs(),s=ae(xe(),".beachviber"),i={};if(Ie(r))try{let o=JSON.parse(_t(r,"utf-8"));i=o&&typeof o=="object"&&!Array.isArray(o)?o:{}}catch{i={}}else Lf(s,{recursive:!0});return i[t]||(i[t]={}),i[t].title=n,ia(r,JSON.stringify(i,null,2)+`
19
+ `,{encoding:"utf-8"}),ue.info(`Renamed session ${t.slice(0,20)} to "${n.slice(0,50)}" in session-meta.json`),{ok:!0}}catch(r){return ue.error(`Failed to rename session ${t.slice(0,20)}: ${r}`),{ok:!1,error:"Failed to write session metadata"}}}function ca(t){try{Yt(t)}catch{return}let e=rs();if(Ie(e))try{let n=JSON.parse(_t(e,"utf-8"));n&&typeof n=="object"&&!Array.isArray(n)&&t in n&&(delete n[t],ia(e,JSON.stringify(n,null,2)+`
20
+ `,{encoding:"utf-8"}),ue.info(`Removed session-meta entry for ${t.slice(0,20)}`))}catch(n){ue.error(`Failed to delete session-meta for ${t.slice(0,20)}: ${n}`)}}function ua(t){try{let e=Bf(t,"r"),n=oa(t).size,r=Math.min(n,262144),s=Buffer.alloc(r),i=Mf(e,s,0,r,0);Df(e);let o=s.toString("utf-8",0,i);for(let a of o.split(`
21
+ `))if(a)try{let l=JSON.parse(a);if(l.type!=="user")continue;let c=l.message;if(!c)continue;let u="";if(typeof c.content=="string"?u=c.content:Array.isArray(c.content)&&(u=c.content.filter(p=>p.type==="text").map(p=>p.text).join("")),u=u.trim(),u)return u.length>120?u.slice(0,120)+"\u2026":u}catch{}}catch{}}function da(t,e){try{Yt(e)}catch{return}let n=qn(t),r=ae(xe(),".claude","projects",n,`${e}.jsonl`);return ua(r)}function ss(t){let e=ae(xe(),".claude","projects");if(!Ie(e))return[];let n=[],r=new Set,s;try{s=ra(e,{withFileTypes:!0}).filter(i=>i.isDirectory()).map(i=>i.name)}catch{return[]}for(let i of s){let o=ae(e,i),a=ts(o);if(!a)continue;let l=$f(a),c=jn(a),u;try{u=ra(o).filter(p=>p.endsWith(".jsonl"))}catch{continue}for(let p of u){let g=p.replace(".jsonl","");if(!Re.test(g)||t.has(g)||r.has(g))continue;r.add(g);let f=c.get(g),h,y,_,w;f&&(h=f.summary,w=f.firstPrompt,y=f.messageCount,_=f.modified?new Date(f.modified).getTime():void 0),_||(_=wt(a,g)??void 0),w||(w=ua(ae(o,p))),h||(h=w),n.push({claudeSessionId:g,projectPath:a,projectName:l,summary:h,firstPrompt:w,messageCount:y,lastMessageTime:_})}}return n.sort((i,o)=>(o.lastMessageTime??0)-(i.lastMessageTime??0)),n}var ue,Uf,sa,Ff,is=K(()=>{"use strict";St();Fn();oe();ue=M("transcripts");Uf="session-meta.json";sa=200,Ff=/^[\p{L}\p{N}\p{Zs}\-_.,:;!?'"()[\]{}&@#%+=/~`<>*^|$]+$/u});import{appendFileSync as ha,statSync as jf,renameSync as fa,unlinkSync as qf,mkdirSync as Kf}from"fs";import{join as Wf}from"path";function ma(t,e){try{Kf(t,{recursive:!0});let n=`audit${e}.log`;if(Pe=Wf(t,n),ga=!0,Kn.length>0){let r=Kn.join("");Kn.length=0;try{ha(Pe,r)}catch{}}}catch{}}function Vf(){if(!Pe)return;let t;try{t=jf(Pe).size}catch{return}if(t<Hf)return;let e=Pe.lastIndexOf(".log"),n=Pe.slice(0,e),r=".log",s=`${n}.${pa}${r}`;try{qf(s)}catch{}for(let i=pa-1;i>=1;i--){let o=`${n}.${i}${r}`,a=`${n}.${i+1}${r}`;try{fa(o,a)}catch{}}try{fa(Pe,`${n}.1${r}`)}catch{}}function U(t,e,n,r,s){try{let i={timestamp:new Date().toISOString(),event:t,category:e,severity:n,detail:r};s!==void 0&&(i.meta=s);let o=JSON.stringify(i)+`
22
+ `;if(!ga){Kn.push(o);return}Vf(),ha(Pe,o)}catch{}}var Hf,pa,Pe,ga,Kn,zt=K(()=>{"use strict";Hf=2*1024*1024,pa=5,Pe=null,ga=!1,Kn=[]});import{readFileSync as Gf,writeFileSync as Yf,mkdirSync as zf,existsSync as os,unlinkSync as Jf}from"fs";import{join as ya}from"path";import{homedir as Qf,hostname as Zf,platform as Xf}from"os";import{randomBytes as ep}from"crypto";import{execFileSync as tp}from"child_process";function _a(t){if(!rp.test(t))throw new Error(`Invalid profile name "${t}": must be 1-32 alphanumeric/hyphen chars, no leading/trailing hyphen`);Wn=t}function Jt(){return Wn}function Q(){return Wn?`-${Wn}`:""}function V(){return ya(Qf(),".beachviber")}function as(){return ya(V(),`config${Q()}.json`)}function D(){let t=as();if(!os(t))return null;try{return JSON.parse(Gf(t,"utf-8"))}catch{return null}}function G(t){let e=V();os(e)||zf(e,{recursive:!0,mode:448}),Yf(as(),JSON.stringify(t,null,2)+`
23
+ `,{mode:384})}function ls(t){let e=as();return os(e)?(np.warn(`Deleting config file (reason: ${t}): ${e}`),U("config_deleted","session","warn",`Config file deleted (reason: ${t})`,{reason:t}),Jf(e),!0):!1}function bt(){return`dev_${ep(6).toString("hex")}`}function Vn(){let t=D()?.deviceName;if(t)return t;if(Xf()==="darwin")try{return tp("scutil",["--get","ComputerName"],{encoding:"utf-8"}).trim()}catch{}return Zf()}function de(){return!!D()?.wakePasswordHash}function Qt(){return D()?.wakeSessionDuration??8}function Ae(t){let e=D();e&&(t!==null?e.wakeExpiresAt=t:delete e.wakeExpiresAt,G(e))}var np,Hn,Et,rp,Wn,fe=K(()=>{"use strict";oe();zt();np=M("config"),Hn="wss://relay.beachviber.com",Et="https://api.beachviber.com",rp=/^[a-zA-Z0-9]([a-zA-Z0-9-]{0,30}[a-zA-Z0-9])?$/,Wn=null});import{spawn as wa}from"child_process";import{readFileSync as Ta,writeFileSync as sp,mkdirSync as ip,existsSync as Sa}from"fs";import{join as Xt}from"path";import{tmpdir as op}from"os";function us(t){return t=t.replace(/[\r\n]+/g," "),/[\s"&|<>()^!%]/.test(t)?'"'+t.replace(/%/g,"%%").replace(/"/g,'""').replace(/\^/g,"^^").replace(/!/g,"^!")+'"':t}function lp(t){let e=t;for(let n of ap)n.lastIndex=0,e=e.replace(n,(r,...s)=>r.includes("=")&&s.length>=2?`${s[0]}=<redacted>`:r.startsWith("Bearer")?"Bearer <redacted>":`${r.slice(0,Math.min(6,r.length))}...<redacted>`);return e}function Ea(){return Xt(V(),`sessions${Q()}.json`)}function fp(t,e,n,r){let s=t.type;if(s==="system"&&t.subtype==="init"){e.claudeSessionId=t.session_id,t.model&&(e.model=t.model),I.info(`Claude session ID captured: ${e.claudeSessionId} model=${e.model||"unknown"} for session ${e.id}`);return}if(s==="system"&&t.subtype==="compact_boundary"){let i=e.currentMessageId||n,o=t.compact_metadata;I.info(`Compaction complete: trigger=${o?.trigger} pre_tokens=${o?.pre_tokens} session=${e.id}`),r({type:"stream_meta",sessionId:e.id,timestamp:Date.now(),payload:{messageId:i,status:"compacted"}});return}if(s==="system"&&(t.subtype==="informational"||t.subtype==="status")){let i=t.content??t.message??"";if(i&&i.toLowerCase().includes("compact")){let o=e.currentMessageId||n;I.info(`Compaction starting: session=${e.id}`),r({type:"stream_meta",sessionId:e.id,timestamp:Date.now(),payload:{messageId:o,status:"compacting"}});return}I.info(`system event subtype=${t.subtype} content=${String(t.content??t.message??"").slice(0,200)} session=${e.id}`)}if(s==="assistant"){let i=t.message;if(i&&Array.isArray(i.content)){let o=i.content.some(a=>a.type==="thinking");o&&!e.isThinking?(e.isThinking=!0,r({type:"stream_meta",sessionId:e.id,timestamp:Date.now(),payload:{messageId:n,status:"thinking"}})):!o&&e.isThinking&&(e.isThinking=!1);for(let a of i.content){if(a.type==="text"&&a.text){let l=kt.get(n)??0;kt.set(n,l+1),r({type:"stream_delta",sessionId:e.id,timestamp:Date.now(),payload:{messageId:n,delta:a.text,deltaType:"text",blockIndex:l}})}if(a.type==="tool_use"){let l=kt.get(n)??0;kt.set(n,l+1);let c=a.input,u=a.name;c&&(c.command?u=`Bash: ${c.command}`:c.file_path?u=`${a.name}: ${c.file_path}`:c.pattern?u=`${a.name}: ${c.pattern}`:c.query?u=`${a.name}: ${c.query}`:c.url?u=`${a.name}: ${c.url}`:c.description&&(u=`${a.name}: ${c.description}`));let p=c;if(c){let y=JSON.stringify(c);if(y.length>1e3){let _={_truncated:!0,_preview:y.slice(0,1e3)};for(let w of["command","file_path","pattern","query","url","description"])typeof c[w]=="string"&&(_[w]=c[w]);p=_}}let g=Ge.get(n)||[],f;a.name==="Task"?(g.push(a.id),Ge.set(n,g)):g.length>0&&(f=g[g.length-1]);let h={messageId:n,delta:u,deltaType:"tool_use",blockIndex:l,toolUseId:a.id,toolInput:p};f&&(h.parentToolUseId=f),r({type:"stream_delta",sessionId:e.id,timestamp:Date.now(),payload:h})}}}return}if(s==="user"){let i=t.message;if(i&&Array.isArray(i.content)){for(let o of i.content)if(o.type==="tool_result"&&o.content){let a=Ge.get(n)||[],l=o.tool_use_id,c=a.indexOf(l),u;c!==-1?(a.splice(c,1),a.length===0&&Ge.delete(n)):a.length>0&&(u=a[a.length-1]);let p={messageId:n,delta:String(o.content).slice(0,2e3),deltaType:"tool_result",toolUseId:l};u&&(p.parentToolUseId=u),r({type:"stream_delta",sessionId:e.id,timestamp:Date.now(),payload:p})}}return}}function pp(t){try{return JSON.parse(Ta(t,"utf-8"))}catch{return null}}function gp(t){let e=[],n=process.env.HOME||process.env.USERPROFILE||"",r=[Xt(n,".claude","settings.json"),Xt(t,".claude","settings.json"),Xt(t,".claude","settings.local.json")];for(let a of r){let c=pp(a)?.permissions;Array.isArray(c?.allow)&&e.push(...c.allow)}let s=new Set,i=[],o=0;for(let a of e)if(!s.has(a)&&!(a.includes(`
24
+ `)||a.length>200)){if(o+a.length>hp)break;s.add(a),i.push(a),o+=a.length}return i}function ka(){return Gn=new cs,Gn}function Oe(){if(!Gn)throw new Error("SessionManager not initialized \u2014 call initSessionManager first");return Gn}var I,Tt,Zt,ap,Re,ba,cp,up,dp,cs,hp,kt,Ge,Gn,St=K(()=>{"use strict";at();is();fe();oe();I=M("sessions"),Tt=M("prompt"),Zt=M("claude");ap=[/\b(sk-[a-zA-Z0-9]{20,})/g,/\b(bv_[a-f0-9]{20,})/g,/\b(ghp_[a-zA-Z0-9]{20,})/g,/\b(npm_[a-zA-Z0-9]{20,})/g,/\b([A-Z_]*(?:SECRET|TOKEN|KEY|PASSWORD|CREDENTIAL|AUTH)[A-Z_]*)=(\S+)/gi,/Bearer\s+\S+/gi];Re=/^[a-zA-Z0-9_-]{1,128}$/,ba=5,cp=3e5,up=10*6e4,dp=6e4,cs=class{sessions=new Map;pendingApprovals=new Map;approvalTimeouts=new Map;lastPhoneReplyTo=null;phoneSendFn=null;stickyApprovals=new Map;stickyCleanupTimer=null;idleReaperTimer=null;constructor(){this.loadPersistedSessions()}setPhoneSendFn(e){this.phoneSendFn=e}loadPersistedSessions(){try{let e=Ea();if(!Sa(e))return;let n=Ta(e,"utf-8"),r=JSON.parse(n),s=0;for(let i of r){if(i.claudeSessionId)try{if(wt(i.projectPath,i.claudeSessionId)===null){s++;continue}}catch{s++;continue}let o={id:i.id,projectId:i.projectId,projectPath:i.projectPath,projectName:i.projectName,claudeSessionId:i.claudeSessionId,resolvedApprovals:i.resolvedApprovals||[],busy:!1,promptQueue:[],lastActivityAt:Date.now()};this.sessions.set(o.id,o)}s>0&&(I.info(`Pruned ${s} orphan session(s) with no matching transcript`),this.persistSessions()),I.info(`Loaded ${this.sessions.size} persisted sessions`)}catch(e){I.error(`Failed to load persisted sessions: ${e}`)}}persistSessions(){try{let e=V();Sa(e)||ip(e,{recursive:!0});let n=Array.from(this.sessions.values()).map(r=>({id:r.id,projectId:r.projectId,projectPath:r.projectPath,projectName:r.projectName,claudeSessionId:r.claudeSessionId,resolvedApprovals:r.resolvedApprovals.length>0?r.resolvedApprovals:void 0}));sp(Ea(),JSON.stringify(n,null,2),{encoding:"utf-8",mode:384})}catch(e){I.error(`Failed to persist sessions: ${e}`)}}getAllSessions(){return Array.from(this.sessions.values())}createSession(e,n){let r={id:e,projectId:n.id,projectPath:n.path,projectName:n.name,resolvedApprovals:[],busy:!1,promptQueue:[],lastActivityAt:Date.now()};return this.sessions.set(e,r),this.persistSessions(),I.info(`Created session ${e} for project ${n.name}`),r}getSession(e){return this.sessions.get(e)}stopProcess(e,n){let r=this.sessions.get(e);if(!r)return!1;let s=r.busy,i=r.currentMessageId;r.promptQueue.length=0,r.busy=!1,r.currentMessageId=void 0;for(let[a,l]of this.pendingApprovals)if(l.sessionId===e){this.pendingApprovals.delete(a);let c=this.approvalTimeouts.get(a);c&&(clearTimeout(c),this.approvalTimeouts.delete(a))}if(!r.process)return!1;n&&s&&i&&n({type:"stream_end",sessionId:r.id,timestamp:Date.now(),payload:{messageId:i,exitCode:null}});let o=r.process;return r.process=void 0,o.kill(),!0}endSession(e){let n=this.sessions.get(e);if(!n)return!1;n.process&&n.process.kill(),n.promptQueue.length=0;for(let[r,s]of this.pendingApprovals)if(s.sessionId===e){this.pendingApprovals.delete(r);let i=this.approvalTimeouts.get(r);i&&(clearTimeout(i),this.approvalTimeouts.delete(r))}return this.clearStickyApprovals(e),this.sessions.delete(e),this.persistSessions(),I.info(`Ended session ${e}`),!0}getActiveSessions(){return Array.from(this.sessions.keys())}handleControlRequest(e,n,r){let s=e.request_id,i=e.request;if(i?.subtype!=="can_use_tool"){I.warn(`Unknown control_request subtype: ${i?.subtype}`),this.writeControlResponse(n,s,!1,"",void 0,`Unsupported request: ${i?.subtype}`);return}let o=i.tool_name,a=i.input||{},l=i.tool_use_id||"",c=o,u;o==="Bash"&&a.command?(c=`Run: ${a.command}`,u=a.command):a.file_path?c=`${o}: ${a.file_path}`:a.pattern?c=`${o}: ${a.pattern}`:a.query?c=`${o}: ${a.query}`:a.url?c=`${o}: ${a.url}`:a.description&&(c=`${o}: ${a.description}`);let p={approvalId:s,sessionId:n.id,tool:o,toolInput:a,toolUseId:l,description:c,command:u};if(o==="AskUserQuestion"&&Array.isArray(a.questions)&&(p.questions=a.questions),o!=="AskUserQuestion"&&this.hasStickyApproval(n.id,o)){I.info(`Sticky auto-approve: requestId=${s} tool=${o} session=${n.id}`),this.writeControlResponse(n,s,!0,l,a),n.resolvedApprovals.push({approvalId:s,tool:o,description:c,command:u,approved:!0,timestamp:Date.now()}),this.persistSessions();return}this.pendingApprovals.set(s,p),I.info(`control_request: requestId=${s} tool=${o} session=${n.id}`);let g={approvalId:s,tool:o,description:c};if(u&&(g.command=u),p.questions&&(g.questions=p.questions),n.currentMessageId){let w=Ge.get(n.currentMessageId);w&&w.length>0&&(g.parentToolUseId=w[w.length-1])}let f=this.phoneSendFn||r,h=this.lastPhoneReplyTo;if(!f({type:"tool_approval_request",sessionId:n.id,timestamp:Date.now(),payload:g,...h?{_replyTo:h}:{}})){I.warn(`Phone not connected -- auto-denying requestId=${s}`),this.writeControlResponse(n,s,!1,l,a,"Phone not connected"),this.pendingApprovals.delete(s);return}let _=setTimeout(()=>{this.pendingApprovals.has(s)&&(I.warn(`Approval timeout for requestId=${s}`),this.resolveApproval(s,!1))},cp);this.approvalTimeouts.set(s,_)}writeControlResponse(e,n,r,s,i,o,a){if(!e.process?.stdin?.writable){I.error(`Cannot write control_response for ${n} -- stdin not writable`);return}let l={behavior:r?"allow":"deny"};r&&(l.updatedInput=a||i||{},l.toolUseID=s),o&&(l.message=o);let c={type:"control_response",response:{subtype:"success",request_id:n,response:l}};e.process.stdin.write(JSON.stringify(c)+`
25
+ `),I.info(`control_response: requestId=${n} approved=${r}`)}resolveApproval(e,n,r,s){let i=this.pendingApprovals.get(e);if(!i)return!1;let o=this.sessions.get(i.sessionId);if(!o)return!1;o.lastActivityAt=Date.now();let a=this.approvalTimeouts.get(e);a&&(clearTimeout(a),this.approvalTimeouts.delete(e));let l;return n&&r&&i.tool==="AskUserQuestion"&&(l={...i.toolInput,answers:r}),this.writeControlResponse(o,e,n,i.toolUseId,i.toolInput,n?void 0:"Denied by user",l),I.info(`Approval resolved: approvalId=${e} approved=${n}`),o.resolvedApprovals.push({approvalId:e,tool:i.tool,description:i.description,command:i.command,approved:n,timestamp:Date.now()}),this.persistSessions(),this.pendingApprovals.delete(e),s&&n&&(this.addStickyApproval(i.sessionId,i.tool,s.durationMinutes),this.autoResolvePendingForTool(i.sessionId,i.tool)),!0}hasStickyApproval(e,n){let r=`${e}:${n}`,s=this.stickyApprovals.get(r);return s?Date.now()>=s.expiresAt?(this.stickyApprovals.delete(r),!1):!0:!1}addStickyApproval(e,n,r){let s=Math.max(1,Math.min(r||0,480)),i=`${e}:${n}`;this.stickyApprovals.set(i,{tool:n,sessionId:e,expiresAt:Date.now()+s*6e4}),I.info(`Sticky approval added: ${i} for ${s}m`),this.stickyCleanupTimer||(this.stickyCleanupTimer=setInterval(()=>this.pruneSticky(),6e4),this.stickyCleanupTimer.unref())}pruneSticky(){let e=Date.now();for(let[n,r]of this.stickyApprovals)e>=r.expiresAt&&(this.stickyApprovals.delete(n),I.info(`Sticky approval expired: ${n}`));this.stickyApprovals.size===0&&this.stickyCleanupTimer&&(clearInterval(this.stickyCleanupTimer),this.stickyCleanupTimer=null)}autoResolvePendingForTool(e,n){let r=[];for(let[s,i]of this.pendingApprovals)i.sessionId===e&&i.tool===n&&r.push(s);for(let s of r)I.info(`Auto-resolving pending approval ${s} via sticky rule (${n})`),this.resolveApproval(s,!0)}clearStickyApprovals(e){let n=0;for(let[r]of this.stickyApprovals)r.startsWith(`${e}:`)&&(this.stickyApprovals.delete(r),n++);n>0&&I.info(`Cleared ${n} sticky approval(s) for session ${e}`),this.stickyApprovals.size===0&&this.stickyCleanupTimer&&(clearInterval(this.stickyCleanupTimer),this.stickyCleanupTimer=null)}startIdleReaper(){this.idleReaperTimer||(this.idleReaperTimer=setInterval(()=>this.reapIdleSessions(),dp),this.idleReaperTimer.unref())}reapIdleSessions(){let e=Date.now(),n=0;for(let r of this.sessions.values()){if(!r.process||r.process.exitCode!==null||(n++,r.busy)||this.hasPendingApprovalsForSession(r.id)||r.promptQueue.length>0)continue;let s=e-(r.lastActivityAt||0);if(s>=up){I.info(`Reaping idle process for session ${r.id} (idle ${Math.round(s/1e3)}s)`);let i=r.process;r.process=void 0,i.kill()}}n===0&&this.idleReaperTimer&&(clearInterval(this.idleReaperTimer),this.idleReaperTimer=null)}hasPendingApprovalsForSession(e){for(let n of this.pendingApprovals.values())if(n.sessionId===e)return!0;return!1}getPendingApprovals(){return Array.from(this.pendingApprovals.values())}getResolvedApprovals(e){return this.sessions.get(e)?.resolvedApprovals||[]}_testRouteClaudeEvent(e,n,r){this.routeClaudeEvent(e,n,r)}ensureProcess(e,n){if(e.process&&e.process.exitCode===null)return e.process;let r=["-p","--input-format","stream-json","--output-format","stream-json","--verbose","--permission-prompt-tool","stdio","--permission-mode","default","--settings",JSON.stringify({hooks:{PreCompact:[{hooks:[{type:"command",command:`node -e "process.stderr.write(JSON.stringify({beachviber:'compact_start'})+'\\n')"`}]}]}})],s=gp(e.projectPath);s.length>0&&r.push("--allowedTools",...s),e.claudeSessionId&&(r.push("--resume",e.claudeSessionId),Tt.info(`Resuming Claude session ${e.claudeSessionId}`));let i=Xt(op(),"beachviber-images");r.push("--add-dir",i);let o={...process.env};delete o.CLAUDECODE;let a=r.map(p=>p.length>100?`"<${p.length} chars>"`:p);Tt.info(`Spawning: claude ${a.join(" ")}`),Tt.info(`CWD: ${e.projectPath}`);let l=process.platform==="win32"?wa("claude "+r.map(us).join(" "),[],{cwd:e.projectPath,env:o,stdio:["pipe","pipe","pipe"],shell:!0}):wa("claude",r,{cwd:e.projectPath,env:o,stdio:["pipe","pipe","pipe"]});if(e.process=l,this.startIdleReaper(),Tt.info(`Claude process spawned (PID: ${l.pid})`),!l.pid)return Tt.error("Claude process failed to spawn (PID undefined)"),e.busy=!1,e.process=void 0,n({type:"error",sessionId:e.id,timestamp:Date.now(),payload:{code:"SPAWN_FAILED",message:"Claude process failed to start \u2014 try again or restart the desktop agent"}}),this.drainQueue(e),l;n({type:"process_spawned",sessionId:e.id,timestamp:Date.now(),payload:{hasProcess:!0}});let c=p=>{let g=this.phoneSendFn,f=this.lastPhoneReplyTo;return g&&f?g({...p,_replyTo:f}):n(p)},u="";return l.stdout?.on("data",p=>{u+=p.toString();let g=u.split(`
26
+ `);u=g.pop()||"";for(let f of g)if(f.trim()){Zt.debug(`raw stdout: ${f.slice(0,300)}`);try{let h=JSON.parse(f);this.routeClaudeEvent(h,e,c)}catch{Zt.warn(`non-JSON stdout line: ${f.slice(0,200)}`)}}}),l.stdout?.on("end",()=>{Zt.info(`stdout ended for session ${e.id}`)}),l.stderr?.on("data",p=>{let g=p.toString().trim();g&&(g.includes('"beachviber":"compact_start"')&&e.currentMessageId&&(I.info(`Compaction starting (via hook): session=${e.id}`),c({type:"stream_meta",sessionId:e.id,timestamp:Date.now(),payload:{messageId:e.currentMessageId,status:"compacting"}})),Zt.info(`stderr: ${lp(g)}`))}),l.on("close",p=>{if(u.trim())try{let h=JSON.parse(u);this.routeClaudeEvent(h,e,c)}catch{}if(e.process!==void 0&&e.process!==l){I.info(`Stale close event for ${e.id} (new process already running), skipping cleanup`);return}e.currentMessageId&&(kt.delete(e.currentMessageId),Ge.delete(e.currentMessageId));let f=e.busy;e.busy=!1,e.process=void 0,I.info(`Process closed for ${e.id}, code=${p} claudeSessionId=${e.claudeSessionId||"NOT SET"}`),this.persistSessions(),c({type:"process_ended",sessionId:e.id,timestamp:Date.now(),payload:{exitCode:p}}),f&&e.currentMessageId&&(c({type:"stream_end",sessionId:e.id,timestamp:Date.now(),payload:{messageId:e.currentMessageId,exitCode:p}}),e.currentMessageId=void 0);for(let[h,y]of this.pendingApprovals)if(y.sessionId===e.id){this.pendingApprovals.delete(h);let _=this.approvalTimeouts.get(h);_&&(clearTimeout(_),this.approvalTimeouts.delete(h))}I.info(`Claude process exited with code ${p} for session ${e.id}`),this.drainQueue(e)}),l.on("error",p=>{e.busy=!1,e.process=void 0,c({type:"error",sessionId:e.id,timestamp:Date.now(),payload:{code:"CLAUDE_ERROR",message:`Failed to start Claude: ${p.message}`}}),this.drainQueue(e)}),l}routeClaudeEvent(e,n,r){let s=e.type,i=e.subtype;if(Zt.info(`event type=${s} subtype=${i||""} session=${n.id}`),s==="control_request"){this.handleControlRequest(e,n,r);return}if(s==="result"){n.lastActivityAt=Date.now();let a=n.currentMessageId;if(a){kt.delete(a),Ge.delete(a),n.busy=!1;let l=e.usage,c={messageId:a};e.duration_ms!=null&&(c.durationMs=e.duration_ms),e.duration_api_ms!=null&&(c.durationApiMs=e.duration_api_ms),e.total_cost_usd!=null&&(c.totalCostUsd=e.total_cost_usd),e.num_turns!=null&&(c.numTurns=e.num_turns),l&&(c.usage={inputTokens:l.input_tokens,outputTokens:l.output_tokens}),Object.keys(c).length>1&&r({type:"stream_meta",sessionId:n.id,timestamp:Date.now(),payload:c}),n.isThinking=!1,r({type:"stream_end",sessionId:n.id,timestamp:Date.now(),payload:{messageId:a,exitCode:0}}),console.log(m.green(" Response sent")),n.currentMessageId=void 0}this.drainQueue(n);return}let o=n.currentMessageId||`msg_${Date.now()}`;fp(e,n,o,r)}drainQueue(e){let n=e.promptQueue.shift();n&&(I.info(`Draining queue for session ${e.id} (${e.promptQueue.length} remaining)`),this.runPrompt(e,n.message,n.send))}runPrompt(e,n,r){if(e.lastActivityAt=Date.now(),e.busy){if(e.promptQueue.length>=ba){r({type:"error",sessionId:e.id,timestamp:Date.now(),payload:{code:"QUEUE_FULL",message:`Prompt queue is full (max ${ba})`}});return}e.promptQueue.push({message:n,send:r}),I.info(`Queued prompt for session ${e.id} (queue size: ${e.promptQueue.length})`),r({type:"prompt_queued",sessionId:e.id,timestamp:Date.now(),payload:{position:e.promptQueue.length}});return}e.busy=!0;let s=`msg_${Date.now()}`;e.currentMessageId=s,Tt.info(`Session ${e.id} | Project: ${e.projectName} | Message: <${n.length} chars>`),r({type:"stream_start",sessionId:e.id,timestamp:Date.now(),payload:{messageId:s}}),e.streamStartedAt=Date.now(),e.model&&r({type:"stream_meta",sessionId:e.id,timestamp:Date.now(),payload:{messageId:s,model:e.model}});let i=this.ensureProcess(e,r),o=JSON.stringify({type:"user",message:{role:"user",content:n}})+`
27
+ `;i.stdin?.write(o,a=>{a&&(I.error(`Failed to write to stdin for session ${e.id}: ${a.message}`),e.busy=!1,e.currentMessageId=void 0,r({type:"stream_end",sessionId:e.id,timestamp:Date.now(),payload:{messageId:s,exitCode:1}}),this.drainQueue(e))})}};hp=6e3;kt=new Map,Ge=new Map,Gn=null});import{execFileSync as Ne,spawnSync as mp}from"child_process";import{readFileSync as va,writeFileSync as Ca,mkdirSync as Ia,existsSync as Yn,unlinkSync as xa}from"fs";import{join as ps}from"path";import{platform as hs}from"os";function Jn(){return ps(V(),"secrets")}function ds(t,e){let n=`${t}_${e}`.replace(/[^a-zA-Z0-9_-]/g,"_");return ps(Jn(),`${n}.dpapi`)}function fs(t,e){let n=`${t}_${e}`.replace(/[^a-zA-Z0-9_-]/g,"_");return ps(Jn(),`${n}.key`)}function Qn(){return vt!==void 0||(vt=Ep.find(t=>t.isAvailable())??null,vt?zn.info(`Using ${vt.name} for secret storage`):zn.warn("No OS secret store available -- secret key will not be persisted")),vt}function Ra(t,e){let n=Qn();if(!n)return!1;try{return n.store(gs,t,e),!0}catch(r){return zn.warn(`Failed to store secret: ${r}`),!1}}function Pa(t){let e=Qn();if(!e)return null;try{return e.load(gs,t)}catch(n){return zn.warn(`Failed to load secret: ${n}`),null}}function Zn(t){let e=Qn();if(e)try{e.remove(gs,t)}catch{}}function Aa(){return Qn()?.name??null}var zn,yp,_p,wp,Sp,gs,Ep,vt,ms=K(()=>{"use strict";fe();oe();zn=M("secrets"),yp={name:"macOS Keychain",isAvailable(){return hs()==="darwin"},store(t,e,n){Ne("security",["add-generic-password","-s",t,"-a",e,"-w",n,"-U"],{stdio:"ignore"})},load(t,e){try{return Ne("security",["find-generic-password","-s",t,"-a",e,"-w"],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}},remove(t,e){try{Ne("security",["delete-generic-password","-s",t,"-a",e],{stdio:"ignore"})}catch{}}};_p={name:"Windows DPAPI",isAvailable(){return hs()==="win32"},store(t,e,n){let r=Jn();Yn(r)||Ia(r,{recursive:!0});let i=Ne("powershell.exe",["-NoProfile","-NonInteractive","-Command",`
28
+ Add-Type -AssemblyName System.Security
29
+ $secret = [Console]::In.ReadToEnd()
30
+ $bytes = [System.Text.Encoding]::UTF8.GetBytes($secret)
31
+ $enc = [System.Security.Cryptography.ProtectedData]::Protect($bytes, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)
32
+ [Convert]::ToBase64String($enc)
33
+ `],{input:n,encoding:"utf-8",windowsHide:!0}).trim();Ca(ds(t,e),i)},load(t,e){let n=ds(t,e);if(!Yn(n))return null;try{let r=va(n,"utf-8").trim();return Ne("powershell.exe",["-NoProfile","-NonInteractive","-Command",`
34
+ Add-Type -AssemblyName System.Security
35
+ $b64 = [Console]::In.ReadToEnd()
36
+ $enc = [Convert]::FromBase64String($b64)
37
+ $dec = [System.Security.Cryptography.ProtectedData]::Unprotect($enc, $null, [System.Security.Cryptography.DataProtectionScope]::CurrentUser)
38
+ [System.Text.Encoding]::UTF8.GetString($dec)
39
+ `],{input:r,encoding:"utf-8",windowsHide:!0}).trim()||null}catch{return null}},remove(t,e){let n=ds(t,e);try{xa(n)}catch{}}},wp={name:"Linux Secret Service",isAvailable(){return hs()!=="linux"||!process.env.DBUS_SESSION_BUS_ADDRESS?!1:!mp("secret-tool",["--help"],{stdio:"ignore",timeout:3e3}).error},store(t,e,n){Ne("secret-tool",["store","--label",`${t}:${e}`,"service",t,"account",e],{input:n,stdio:["pipe","ignore","ignore"]})},load(t,e){try{return Ne("secret-tool",["lookup","service",t,"account",e],{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).trim()||null}catch{return null}},remove(t,e){try{Ne("secret-tool",["clear","service",t,"account",e],{stdio:"ignore"})}catch{}}};Sp={name:"file storage",isAvailable(){return!0},store(t,e,n){let r=Jn();Yn(r)||Ia(r,{recursive:!0,mode:448}),Ca(fs(t,e),n,{mode:384})},load(t,e){let n=fs(t,e);if(!Yn(n))return null;try{return va(n,"utf-8").trim()||null}catch{return null}},remove(t,e){try{xa(fs(t,e))}catch{}}},gs="beachviber",Ep=[yp,_p,wp,Sp]});import Ee from"crypto";import{deflateRawSync as bp,inflateRawSync as Tp}from"node:zlib";function en(){let{publicKey:t,privateKey:e}=Ee.generateKeyPairSync("x25519");return{publicKey:t,secretKey:e}}function pe(t){let e=t.export({format:"jwk"});return Buffer.from(e.x,"base64url")}function tn(t){let e=t.toString("base64url");return Ee.createPublicKey({format:"jwk",key:{kty:"OKP",crv:"X25519",x:e}})}function er(t,e){return Ee.diffieHellman({publicKey:t,privateKey:e})}function Oa(t,e,n){let r=Ee.randomBytes(12),s=Ee.createCipheriv("aes-256-gcm",e,r),i=Buffer.from(JSON.stringify(t)),o=n&&i.length>=kp,a=o?bp(i):i;if(o){let p=(i.length/a.length).toFixed(1);Xn.debug(`deflate: ${i.length}B \u2192 ${a.length}B (${p}x)`)}let l=Buffer.concat([s.update(a),s.final()]),c=s.getAuthTag(),u=Buffer.concat([l,c]);return{nonce:r.toString("base64"),ciphertext:u.toString("base64"),...o?{compressed:!0}:{}}}function Na(t,e){let n=Buffer.from(t.nonce,"base64"),r=Buffer.from(t.ciphertext,"base64"),s=r.subarray(0,r.length-16),i=r.subarray(r.length-16),o=Ee.createDecipheriv("aes-256-gcm",e,n);o.setAuthTag(i);let a=Buffer.concat([o.update(s),o.final()]);if(t.compressed){let l=a.length;a=Tp(a),Xn.info(`inflate: ${l}B \u2192 ${a.length}B`)}return JSON.parse(a.toString("utf-8"))}function La(t,e){let n=t.subarray(0,12),r=t.subarray(t.length-16),s=t.subarray(12,t.length-16),i=Ee.createDecipheriv("aes-256-gcm",e,n);return i.setAuthTag(r),Buffer.concat([i.update(s),i.final()])}function Y(t){return Buffer.from(t).toString("base64")}function Ct(t){return Buffer.from(t,"base64")}function Ba(){return`default${Q()}`}function Ma(){let t=D();if(!t||!t.publicKey)return null;let e=Pa(Ba());return e?{publicKey:t.publicKey,secretKey:e,peerPublicKey:t.peerPublicKey}:null}function It(t){let e=D();Ra(Ba(),t.secretKey)||Xn.warn("OS secret store unavailable -- secret key will not be persisted");let n=!!e?.deviceToken;Xn.info(`saveKeys: writing config (deviceToken ${n?`preserved, len=${e.deviceToken.length}`:"absent"})`),G({...e,deviceId:e?.deviceId||"",deviceToken:e?.deviceToken,publicKey:t.publicKey,peerPublicKey:t.peerPublicKey??e?.peerPublicKey})}function ys(t,e){return new Promise((n,r)=>{Ee.pbkdf2(t,e,1e5,32,"sha512",(s,i)=>{s?r(s):n(i.toString("hex"))})})}function tr(t,e){let n=Buffer.from(t,"hex"),r=Buffer.from(e,"hex");return n.length!==r.length?!1:Ee.timingSafeEqual(n,r)}var Xn,kp,Ye,xt=K(()=>{"use strict";fe();ms();oe();Xn=M("crypto"),kp=1024;Ye=new Set(["verify_code","verify_code_ack","hello","hello_ack","prompt","stream_start","stream_delta","stream_end","stream_meta","session_create","session_created","session_end","rename_session","projects_request","projects_response","tool_approval_request","tool_approval_response","sessions_request","sessions_response","session_history_request","session_history_response","sticky_approvals_clear","prompt_ack","error","wake","wake_ack","sleep_notify","force_sleep","session_delete","session_delete_response","process_stop","process_stop_ack","session_status_request","session_status_response","process_spawned","process_ended"])});import{mkdirSync as vp,existsSync as Da,readdirSync as Cp,statSync as Ip,unlinkSync as xp,writeFileSync as Rp}from"fs";import{join as _s}from"path";import{tmpdir as Pp}from"os";import{randomUUID as Ap}from"crypto";function Lp(){Da(Rt)||vp(Rt,{recursive:!0,mode:448})}function Bp(t){try{let n=new URL(t).pathname.match(/\.(\w+)(?:\?|$)/);if(n&&Op.has(n[1].toLowerCase()))return n[1].toLowerCase()}catch{}return"png"}async function $a(t,e){let n=new URL(t);if(n.protocol!=="https:")throw new Error(`Image download blocked: only HTTPS URLs are allowed (got ${n.protocol})`);if(!Mp.test(n.hostname))throw new Error(`Image download blocked: hostname "${n.hostname}" is not an allowed S3 host`);Lp();let r=e?.encrypted&&e.contentType?Dp[e.contentType]??"png":Bp(t),s=`${Ap()}.${r}`,i=_s(Rt,s),o=await fetch(t,{signal:AbortSignal.timeout($p)});if(!o.ok)throw new Error(`Failed to download image: ${o.status} ${o.statusText}`);if(!e?.encrypted){let f=(o.headers.get("content-type")||"").split(";")[0].trim().toLowerCase();if(f&&!Np.has(f))throw new Error(`Image download blocked: unexpected Content-Type "${f}"`)}let a=Number(o.headers.get("content-length")||0);if(a>nr)throw new Error(`Image too large: ${a} bytes (max ${nr})`);let l=[],c=0,u=o.body?.getReader();if(!u)throw new Error("No response body");for(;;){let{done:f,value:h}=await u.read();if(f)break;if(c+=h.byteLength,c>nr)throw u.cancel(),new Error(`Image too large: exceeded ${nr} bytes during download`);l.push(Buffer.from(h))}let p=Buffer.concat(l),g=e?.encrypted&&e.sharedSecret?La(Buffer.from(p),e.sharedSecret):p;return Rp(i,g,{mode:384}),i}function Ua(){if(!Da(Rt))return;let t=Date.now(),e=3600*1e3;try{for(let n of Cp(Rt)){let r=_s(Rt,n);try{let s=Ip(r);t-s.mtimeMs>e&&xp(r)}catch{}}}catch{}}var Rt,Op,Np,Mp,Dp,nr,$p,ws=K(()=>{"use strict";xt();Rt=_s(Pp(),"beachviber-images"),Op=new Set(["png","jpg","jpeg","gif","webp","svg","bmp","heic"]),Np=new Set(["image/png","image/jpeg","image/gif","image/webp","image/svg+xml","image/bmp","image/heic"]);Mp=/^beachviber-uploads-\w+\.s3[\w.-]*\.amazonaws\.com$/,Dp={"image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","image/svg+xml":"svg","image/bmp":"bmp","image/heic":"heic"},nr=50*1024*1024,$p=3e4});var rr={};Pu(rr,{buildHistoryBatches:()=>Ha,computeReconnectDelay:()=>Cs,handleMessage:()=>ks,printBanner:()=>Le,sendPostPairingData:()=>vs,transitionToSleep:()=>Ts});import qa from"crypto";import{createDeflateRaw as Up,constants as Fp}from"node:zlib";import{spawn as Fa}from"child_process";function jp(t){return t?qa.createHash("sha256").update(t).digest("hex").slice(0,12):"null"}function Le(t,e){let n=Math.max(...t.map(s=>s.length)),r=n+2;console.log(),console.log(e(` \u2554${"\u2550".repeat(r)}\u2557`));for(let s of t)console.log(e(` \u2551 ${s.padEnd(n)} \u2551`));console.log(e(` \u255A${"\u2550".repeat(r)}\u255D`))}function Ka(t){return Re.test(t)}function Kp(t){return Hp(),nn.has(t)}function Wp(t){nn.set(t,Date.now()+qp)}function Hp(){if(nn.size<100)return;let t=Date.now();for(let[e,n]of nn)n<t&&nn.delete(e)}function Wa(){let t=Up(),e=0;return t.on("data",n=>{e+=n.length}),{write(n){t.write(n)},flush(){return new Promise(n=>{t.flush(Fp.Z_SYNC_FLUSH,()=>n(e))})},destroy(){t.destroy()}}}async function Ha(t,e){if(t.length===0)return[];if(!e){let s=[],i=[],o=2;for(let a of t){let l=Buffer.byteLength(JSON.stringify(a)),c=i.length===0?l:l+1;o+c>bs&&i.length>0?(s.push(i),i=[a],o=2+l):(i.push(a),o+=c)}return i.length>0&&s.push(i),s}let n=[],r=0;for(;r<t.length;){let s=Wa(),i=0,o=0,a=!1;for(s.write("[");r+o<t.length;){let l=o,c=Math.min(o+Gp,t.length-r);for(let p=l;p<c;p++){let g=p===0?"":",";s.write(g+JSON.stringify(t[r+p]))}if(o=c,await s.flush()>bs){a=!0;break}i=o}if(s.destroy(),!a)n.push(t.slice(r,r+o)),r+=o;else if(i>0)n.push(t.slice(r,r+i)),r+=i;else{let l=await Yp(t,r,o);n.push(t.slice(r,r+l)),r+=l}}return n}async function Yp(t,e,n){let r=Wa();r.write("[");let s=0;for(let i=0;i<n;i++){let o=i===0?"":",";if(r.write(o+JSON.stringify(t[e+i])),await r.flush()>bs)break;s=i+1}return r.destroy(),Math.max(s,1)}function Va(t,e){let n=e.map(r=>({id:r.id,name:r.name,path:r.path,git:r.git,sessionCount:r.sessionCount}));k.info(`Sending ${n.length} projects to app:`);for(let r of n)k.info(` id=${r.id} name="${r.name}" path="${r.path}" branch=${r.git.branch} sessions=${r.sessionCount}`);if(n.length===0){t({type:"projects_response",sessionId:null,timestamp:Date.now(),payload:{projects:[],done:!0}});return}for(let r=0;r<n.length;r+=Ss){let s=n.slice(r,r+Ss),i=r+Ss>=n.length;t({type:"projects_response",sessionId:null,timestamp:Date.now(),payload:{projects:s,done:i}})}}function ja(t,e){let r=jn(t).get(e);return r?.modified?new Date(r.modified).getTime():wt(t,e)??void 0}async function zp(t){let e=await yt();return Va(t.sendFn,e),console.log(m.dim(` Synced ${e.length} project${e.length!==1?"s":""} with app`)),e}async function Jp(t){let e=t.payload.projectId,n=na(t.projects,e);if(!n){t.sendFn({type:"error",sessionId:t.sessionId,timestamp:Date.now(),payload:{code:"PROJECT_NOT_FOUND",message:`Project ${e} is not registered on this device`}});return}let r=t.sessionMgr.createSession(t.sessionId,n),s=t.payload.claudeSessionId;if(s&&Re.test(s)){let l=t.sessionMgr.getAllSessions().find(c=>c.claudeSessionId===s&&c.id!==r.id);if(l){t.sessionMgr.endSession(r.id),console.log(m.dim(` CLI session ${s.slice(0,8)}... already adopted as ${l.id}`));let u=(await Un(n.path))?.git||n.git,p=ja(n.path,s);t.sendFn({type:"session_created",sessionId:l.id,timestamp:Date.now(),payload:{projectId:n.id,projectName:n.name,cwd:n.path,git:u,lastMessageTime:p,claudeSessionId:s}});return}r.claudeSessionId=s,t.sessionMgr.persistSessions(),console.log(m.green(` Adopted CLI session: ${s.slice(0,8)}...`))}console.log(m.green(` Session started: ${n.name}/${n.git.branch}`));let o=(await Un(n.path))?.git||n.git,a=r.claudeSessionId?ja(n.path,r.claudeSessionId):void 0;t.sendFn({type:"session_created",sessionId:r.id,timestamp:Date.now(),payload:{projectId:n.id,projectName:n.name,cwd:n.path,git:o,lastMessageTime:a,...r.claudeSessionId?{claudeSessionId:r.claudeSessionId}:{}}})}function Qp(t){t.sessionId&&(t.sessionMgr.endSession(t.sessionId),console.log(m.dim(" Session ended")))}async function Zp(t){let e=t.payload?.sessionId;if(!e){k.warn("session_delete: missing sessionId");return}let n=t.sessionMgr.getSession(e),r=n?.claudeSessionId,s=n?.projectPath;if(n&&t.sessionMgr.endSession(e),r&&s)try{await Xp(r,s)}catch(i){k.error(`session_delete: failed to clear Claude session ${r.slice(0,20)}: ${i}`)}r&&ca(r),k.info(`session_delete: deleted session ${e.slice(0,20)}`),t.sendFn({type:"session_delete_response",sessionId:null,timestamp:Date.now(),payload:{sessionId:e}})}function Xp(t,e){return new Promise((n,r)=>{let s=["-p","/clear","--resume",t],i={...process.env};delete i.CLAUDECODE,k.info(`Clearing Claude session: claude ${s.join(" ")}`);let o=process.platform==="win32"?Fa("claude "+s.map(us).join(" "),[],{cwd:e,env:i,stdio:["ignore","pipe","pipe"],shell:!0}):Fa("claude",s,{cwd:e,env:i,stdio:["ignore","pipe","pipe"]}),a=setTimeout(()=>{o.kill(),r(new Error("claude /clear timed out"))},15e3);o.on("close",l=>{clearTimeout(a),l===0?(k.info(`Claude session ${t.slice(0,20)} cleared`),n()):r(new Error(`claude /clear exited with code ${l}`))}),o.on("error",l=>{clearTimeout(a),r(l)})})}function eh(t){let e=t.payload,n=e?.claudeSessionId,r=e?.title;if(!n||!r){k.warn("rename_session: missing claudeSessionId or title");return}let s=la(n,r);s.ok?k.info(`rename_session: renamed ${n.slice(0,20)} to "${r.slice(0,50)}"`):k.warn(`rename_session: failed -- ${s.error}`)}async function th(t){if(!t.sessionId){t.sendFn({type:"error",sessionId:null,timestamp:Date.now(),payload:{code:"SESSION_NOT_FOUND",message:"No sessionId provided"}});return}let e=t.sessionMgr.getSession(t.sessionId);if(!e){t.sendFn({type:"error",sessionId:t.sessionId,timestamp:Date.now(),payload:{code:"SESSION_NOT_FOUND",message:`Session ${t.sessionId} doesn't exist`}});return}let n=t.payload._msgId;n&&t.sendFn({type:"prompt_ack",sessionId:t.sessionId,timestamp:Date.now(),payload:{_msgId:n}});let r=t.payload.message;if(!r)return;let s=t.payload.imageGetUrl;if(s)try{let i=t.payload.imageEncrypted,o=t.payload.imageContentType,a=await $a(s,i?{encrypted:!0,contentType:o,sharedSecret:d.sharedSecret??void 0}:void 0);r=`[The user attached an image at: ${a}]
40
+
41
+ ${r}`,console.log(m.dim(` Image downloaded: ${a}${i?" (decrypted)":""}`))}catch(i){let o=i instanceof Error&&i.cause?` cause: ${i.cause}`:"";console.error(m.red(` Failed to download image: ${i}${o}`))}console.log(m.blue(" Prompt received \u2014 Claude is working...")),t.sessionMgr.runPrompt(e,r,t.sendFn)}function nh(t){let e=t.payload.approvalId,n=t.payload.approved,r=t.payload.answers,s=t.payload.sticky;k.info(`tool_approval_response received: approvalId=${e} approved=${n} hasAnswers=${!!r} sticky=${s?`${s.tool}/${s.durationMinutes}m`:"none"}`),e?t.sessionMgr.resolveApproval(e,n,r,s):k.warn("tool_approval_response missing approvalId -- ignored")}function rh(t){t.sessionId?(t.sessionMgr.clearStickyApprovals(t.sessionId),k.info(`sticky_approvals_clear: cleared rules for session ${t.sessionId}`)):k.warn("sticky_approvals_clear: no sessionId provided -- ignored")}function sh(t){if(t.sessionId){let e=t.sessionMgr.stopProcess(t.sessionId,t.sendFn);k.info(`process_stop: session ${t.sessionId} \u2014 ${e?"process killed":"no process running"}`),U("process_stop","session","info",`Process stop: session ${t.sessionId} \u2014 ${e?"killed":"no process"}`,{sessionId:t.sessionId,stopped:e}),t.sendFn({type:"process_stop_ack",sessionId:t.sessionId,timestamp:Date.now(),payload:{stopped:e,hasProcess:!1}})}else k.warn("process_stop: no sessionId provided -- ignored")}function ih(t){if(!t.sessionId){k.warn("session_status_request: no sessionId provided -- ignored");return}let e=t.sessionMgr.getSession(t.sessionId);t.sendFn({type:"session_status_response",sessionId:t.sessionId,timestamp:Date.now(),payload:{hasProcess:!!e?.process,busy:!!e?.busy,queuePosition:e?.promptQueue.length??0}})}function Ga(t){let e=new Set,n=t.sessionMgr.getAllSessions().filter(f=>!f.claudeSessionId||e.has(f.claudeSessionId)?!1:(e.add(f.claudeSessionId),!0)),r=new Set(n.map(f=>f.claudeSessionId).filter(Boolean)),s=aa(),i=new Map;for(let f of n)i.has(f.projectPath)||i.set(f.projectPath,jn(f.projectPath));let o=n.map(f=>{let h=f.claudeSessionId?i.get(f.projectPath)?.get(f.claudeSessionId):void 0,y=f.claudeSessionId?s.get(f.claudeSessionId):void 0,_=h?.messageCount??(f.claudeSessionId?ns(f.projectPath,f.claudeSessionId).length:0);return{id:f.id,projectId:f.projectId,projectName:f.projectName,projectPath:f.projectPath,claudeSessionId:f.claudeSessionId,summary:y?.title??h?.summary,firstPrompt:h?.firstPrompt||(f.claudeSessionId?da(f.projectPath,f.claudeSessionId):void 0),messageCount:_,lastMessageTime:h?.modified?new Date(h.modified).getTime():f.claudeSessionId?wt(f.projectPath,f.claudeSessionId)??void 0:void 0,type:"beachviber",...f.busy?{busy:!0}:{},hasProcess:!!f.process}}),l=ss(r).map(f=>{let h=s.get(f.claudeSessionId);return{id:f.claudeSessionId,projectId:es(f.projectName),projectName:f.projectName,projectPath:f.projectPath,claudeSessionId:f.claudeSessionId,summary:h?.title??f.summary,firstPrompt:f.firstPrompt,messageCount:f.messageCount??0,lastMessageTime:f.lastMessageTime,type:"cli",hasProcess:!1}}),u=[...o,...l].filter(f=>f.claudeSessionId).sort((f,h)=>(h.lastMessageTime??0)-(f.lastMessageTime??0)).slice(0,100),p=u.filter((f,h,y)=>y.findIndex(_=>_.claudeSessionId===f.claudeSessionId)!==h);p.length>0&&k.error(`Duplicate sessions detected: ${p.map(f=>`${f.claudeSessionId?.slice(0,8)} via ${f.projectPath}`).join(", ")}`);let g=new Map;for(let f of u){let h=f.projectName;g.set(h,(g.get(h)??0)+1)}k.info(`Sessions response: ${u.length} total (${o.length} managed, ${l.length} CLI)`);for(let[f,h]of g)k.info(` ${f} -- ${h} sessions`);console.log(m.dim(` Synced ${u.length} session${u.length!==1?"s":""} with app`));for(let f=0;f<u.length;f+=Es){let h=u.slice(f,f+Es),y=f+Es>=u.length;t.sendFn({type:"sessions_response",sessionId:null,timestamp:Date.now(),payload:{sessions:h,done:y}})}u.length===0&&t.sendFn({type:"sessions_response",sessionId:null,timestamp:Date.now(),payload:{sessions:[],done:!0}});for(let f of t.sessionMgr.getPendingApprovals())t.sendFn({type:"tool_approval_request",sessionId:f.sessionId,timestamp:Date.now(),payload:{approvalId:f.approvalId,tool:f.tool,description:f.description,command:f.command}})}async function oh(t){let e=t.payload.sessionId;if(!e||!Ka(e)){t.sendFn({type:"error",sessionId:null,timestamp:Date.now(),payload:{code:"INVALID_REQUEST",message:"No sessionId provided for history request"}});return}let n=t.sessionMgr.getSession(e),r,s;if(n?.claudeSessionId?(r=n.projectPath,s=n.claudeSessionId,k.info(`History: managed session ${e} \u2192 claude=${s?.slice(0,8)} path=${r}`)):(s=t.payload.claudeSessionId,s&&Re.test(s)&&(r=ss(new Set).find(y=>y.claudeSessionId===s)?.projectPath),k.info(`History: CLI session ${e} \u2192 claude=${s?.slice(0,8)} path=${r??"not found"}`)),!r||!s||!Re.test(s)){t.sendFn({type:"session_history_response",sessionId:e,timestamp:Date.now(),payload:{sessionId:e,messages:[]}});return}k.info(`History: reading transcript for ${s?.slice(0,8)} at ${r}`);let o=ns(r,s).map(f=>{let h=f.timestamp?new Date(f.timestamp).getTime():0;return{id:`hist_${qa.createHash("sha256").update(`${f.role}
42
+ ${h}
43
+ ${(f.content??"").slice(0,200)}`).digest("hex").slice(0,12)}`,role:f.role,content:f.content,timestamp:h||Date.now(),...f.toolUses?.length?{toolUses:f.toolUses}:{},...f.contentBlocks?.length?{contentBlocks:f.contentBlocks}:{}}}),a=t.sessionMgr.getResolvedApprovals(e);for(let f of a)o.push({id:`hist-approval-${f.approvalId}`,role:"assistant",content:"",timestamp:f.timestamp,toolApproval:{approvalId:f.approvalId,tool:f.tool,description:f.description,command:f.command,resolved:!0,approved:f.approved}});o.sort((f,h)=>h.timestamp-f.timestamp);let l=new Set,c=[];for(let f of o){let h=f.id;l.has(h)||(l.add(h),c.push(f))}let u=4e3;for(let f of c)typeof f.content=="string"&&f.content.length>u&&(f.content=f.content.slice(0,u)+`
44
+
45
+ \u2026(truncated)`);let p=await Ha(c,!0),g=c.length;k.info(`History: sending ${g} messages in ${p.length} batch(es) (deflate) for ${s?.slice(0,8)}`);for(let f=0;f<p.length;f++){let h=f===p.length-1;t.sendFn({type:"session_history_response",sessionId:e,timestamp:Date.now(),payload:{sessionId:e,messages:p[f],done:h}})}g===0&&t.sendFn({type:"session_history_response",sessionId:e,timestamp:Date.now(),payload:{sessionId:e,messages:[],done:!0}})}function ah(t){d.verifyCodeResolve&&(d.verifyCodeResolve(t),d.verifyCodeResolve=null)}function lh(t){t({type:"hello",sessionId:null,timestamp:Date.now(),payload:{appVersion:z,protocolVersion:3,capabilities:["deflate",...de()?["wake"]:[]]}})}function ch(t){let{appVersion:e,protocolVersion:n,capabilities:r}=t.payload;e&&(d.peerAppVersion=e),r&&(d.peerCapabilities=r),k.info(`hello received: appVersion=${e} proto=${n} caps=${(r??[]).join(",")}`),console.log(m.dim(` App connected (v${e||"unknown"})`)),t.sendFn({type:"hello_ack",sessionId:null,timestamp:Date.now(),payload:{appVersion:z,protocolVersion:3,capabilities:["deflate",...de()?["wake"]:[]],...de()?{wakeState:d.wakeState,...d.wakeState==="awake"&&d.wakeExpiresAt?{expiresAt:d.wakeExpiresAt}:{}}:{}}})}function uh(t){let{appVersion:e,capabilities:n}=t;e&&(d.peerAppVersion=e),n&&(d.peerCapabilities=n),k.info(`hello_ack received: appVersion=${e} caps=${(n??[]).join(",")}`)}async function dh(t){let{wakeLockout:e}=d;if(e.lockedUntil){if(Date.now()<e.lockedUntil){t.sendFn({type:"wake_ack",sessionId:null,timestamp:Date.now(),payload:{success:!1,reason:"locked_out",lockoutExpiresAt:e.lockedUntil}});return}e.failedAttempts=0,e.lockedUntil=null}let n=D();if(!n?.wakePasswordHash){k.warn("wake message received but no wakePasswordHash configured");return}let r=t.payload.passwordHash;if(!r||!tr(r,n.wakePasswordHash)){e.failedAttempts++,k.warn(`Wake auth failed (attempt ${e.failedAttempts})`),console.log(m.yellow(` Wake auth failed (attempt ${e.failedAttempts})`));let u=e.failedAttempts;if(u>=6&&u<=9){let p=Math.pow(2,u-5)*1e3;await new Promise(g=>setTimeout(g,p))}if(u>=10){e.lockedUntil=Date.now()+1800*1e3,console.log(m.red(" Too many failed wake attempts \u2014 locked out for 30 minutes")),t.sendFn({type:"wake_ack",sessionId:null,timestamp:Date.now(),payload:{success:!1,reason:"locked_out",lockoutExpiresAt:e.lockedUntil}});return}t.sendFn({type:"wake_ack",sessionId:null,timestamp:Date.now(),payload:{success:!1,reason:"invalid_password",remainingAttempts:10-e.failedAttempts}});return}e.failedAttempts=0,e.lockedUntil=null;let s=72,i=t.payload.requestedDuration,o=typeof i=="number"&&i>0&&isFinite(i)?Math.min(i,s):Qt(),a=o*60*60*1e3,l=Date.now()+a;d.machine.state==="paired_sleeping"&&d.machine.transition({type:"WAKE"}),d.wakeExpiresAt=l,Ae(l),d.wakeTimer&&clearTimeout(d.wakeTimer),d.wakeTimer=setTimeout(()=>{Ts("timer_expired",t.sendFn)},a);let c=new Date().toLocaleTimeString();Le(["UNLOCKED",`Unlocked for ${o} hours.`],u=>m.green(u)),console.log(m.dim(` ${c}`)),console.log(),t.sendFn({type:"wake_ack",sessionId:null,timestamp:Date.now(),payload:{success:!0,expiresAt:l,duration:o}})}function Ts(t,e){d.machine.state==="paired"&&d.machine.transition({type:"SLEEP"}),d.wakeExpiresAt=null,Ae(null),d.wakeTimer&&(clearTimeout(d.wakeTimer),d.wakeTimer=null);let n=new Date().toLocaleTimeString();Le(["LOCKED","Remote access is locked.","Unlock from app or terminal."],r=>m.yellow(r)),console.log(m.dim(` ${n} \u2014 ${t}`)),console.log(),e({type:"sleep_notify",sessionId:null,timestamp:Date.now(),payload:{reason:t}}),d.onSleepTransition?.()}function fh(t){if(d.machine.transition({type:"REGISTERED",hasSharedSecret:!!d.sharedSecret}),d.inSetupMode){d.registeredResolve&&(d.registeredResolve(),d.registeredResolve=null);return}console.log(m.green(" Connected to relay".padEnd(50))+m.green("[connected]")),d.sharedSecret?(console.log(m.green(" Paired with BeachViber App".padEnd(50))+m.green("[encrypted]")),d.machine.state==="paired"&&de()&&!d.wakeExpiresAt&&(d.machine.transition({type:"SLEEP"}),d.onSleepTransition?.()),console.log(),console.log(m.bold.green(" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")),console.log(m.bold.green(" \u2502 \u{1F512} End-to-end encryption active \u2502")),console.log(m.bold.green(" \u2502 \u2502")),console.log(m.bold.green(" \u2502")+m.dim(" All messages between this device and your ")+m.bold.green("\u2502")),console.log(m.bold.green(" \u2502")+m.dim(" phone are encrypted. No one \u2014 not even the ")+m.bold.green("\u2502")),console.log(m.bold.green(" \u2502")+m.dim(" relay server \u2014 can read them. ")+m.bold.green("\u2502")),console.log(m.bold.green(" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"))):console.log(m.yellow(" Waiting for phone to pair...".padEnd(50))+m.yellow("[pairing]")),console.log(),d.registeredResolve&&(d.registeredResolve(),d.registeredResolve=null)}function ph(t){let e=t.reason||"none";if(k.warn(`force_disconnect received (reason=${e})`),U("force_disconnect","session","warn",`Force disconnect received (reason=${e})`,{reason:e}),e==="device_id_conflict"){console.log(m.yellow(" Another instance connected \u2014 will reconnect..."));return}console.log(),console.log(m.yellow(" Disconnected by remote \u2014 session ended.")),console.log(m.dim(" Will re-authenticate on next connection.")),console.log(),d.machine.transition({type:"FORCE_DISCONNECT"}),d.deviceToken=""}function hh(t){if(console.error(m.red(` Error: ${t.code} \u2014 ${t.message}`)),t.code==="NOT_REGISTERED"){k.warn("Clearing deviceToken (reason: relay error NOT_REGISTERED -- token no longer valid)"),U("token_cleared","authentication","warn","Token cleared -- relay returned NOT_REGISTERED",{reason:"NOT_REGISTERED"}),d.machine.transition({type:"FORCE_DISCONNECT"});let e=D();e&&(delete e.deviceToken,G(e)),d.deviceToken=""}}async function ks(t,e,n,r){let s;try{s=JSON.parse(t)}catch{return k.error("Failed to parse message"),{projects:n}}let i=!1,o;s.type==="relay"&&s.payload&&(o=s._replyTo,s=s.payload,i=!0);let a=s.type;if(!Vp[d.connectionPhase].has(a))return d.connectionPhase==="paired_sleeping"&&i&&Ye.has(a)&&(o?_=>e({..._,_replyTo:o}):e)({type:"error",sessionId:s.sessionId??null,timestamp:Date.now(),payload:{code:"DESKTOP_SLEEPING",message:"Remote access is locked \u2014 unlock it first"}}),k.error(`Rejected message type "${a}" in ${d.connectionPhase} phase`),U("phase_gate_rejected","rejection","warn",`Rejected "${a}" in ${d.connectionPhase} phase`,{messageType:a,phase:d.connectionPhase}),{projects:n};if(!i&&!new Set(["registered","error","force_disconnect","heartbeat_ack"]).has(a))return k.error(`Rejected non-relayed "${a}" message`),U("non_relayed_rejected","rejection","warn",`Rejected non-relayed "${a}" message`,{messageType:a}),{projects:n};if(d.sharedSecret&&i&&Ye.has(a)&&!s.encrypted)return k.error(`Rejected unencrypted peer message "${a}" (shared secret exists)`),U("unencrypted_rejected","rejection","critical",`Rejected unencrypted peer message "${a}"`,{messageType:a}),{projects:n};if(s.encrypted){if(!d.sharedSecret)return k.error("Received encrypted message but no shared secret is available"),U("missing_shared_secret","crypto","critical","Received encrypted message but no shared secret",{messageType:a}),{projects:n};let y=s.encrypted;if(Kp(y.nonce))return k.error(`Rejected duplicate nonce for "${a}" (replay detected)`),U("nonce_replay_detected","crypto","critical",`Rejected duplicate nonce for "${a}"`,{messageType:a,noncePrefix:y.nonce.slice(0,8)}),{projects:n};try{s.payload=Na(y,d.sharedSecret),delete s.encrypted}catch(R){return k.error(`Decryption failed for "${a}" (key=${jp(d.sharedSecret)}, nonce=${y.nonce.slice(0,8)}\u2026, ct_len=${y.ciphertext.length}):`,R),U("decryption_failed","crypto","critical",`Decryption failed for "${a}"`,{messageType:a,noncePrefix:y.nonce.slice(0,8),ciphertextLength:y.ciphertext.length}),{projects:n}}Wp(y.nonce);let _=s.payload;if(!_||typeof _._ts!="number")return k.error(`Rejected encrypted message "${a}" -- missing mandatory _ts timestamp`),U("missing_timestamp","crypto","critical",`Rejected "${a}" -- missing mandatory _ts timestamp`,{messageType:a}),{projects:n};let w=Date.now()-_._ts;if(w>6e4||w<-3e4)return k.error(`Rejected replayed message "${a}" (age: ${w}ms)`),U("replayed_message","crypto","critical",`Rejected replayed message "${a}" (age: ${w}ms)`,{messageType:a,ageMs:w}),{projects:n};delete _._ts}let u=s.sessionId,p=u&&Ka(u)?u:null,g=s.payload||{},f=o?y=>e({...y,_replyTo:o}):e;o&&(r.lastPhoneReplyTo=o),r.setPhoneSendFn(e);let h={sendFn:f,sessionMgr:r,sessionId:p,payload:g,projects:n};if(a!=="heartbeat_ack"&&a!=="registered"&&k.info(`MSG type="${a}" sessionId=${p||"null"} payloadKeys=${Object.keys(g).join(",")||"none"}`),a==="wake")return await dh(h),{projects:h.projects};if(a==="force_sleep")return Ts("force_sleep",f),{projects:h.projects};switch(a){case"projects_request":return{projects:await zp(h)};case"session_create":await Jp(h);break;case"session_end":Qp(h);break;case"session_delete":await Zp(h);break;case"rename_session":eh(h);break;case"prompt":await th(h);break;case"tool_approval_response":nh(h);break;case"sticky_approvals_clear":rh(h);break;case"process_stop":sh(h);break;case"sessions_request":Ga(h);break;case"session_status_request":ih(h);break;case"session_history_request":await oh(h);break;case"verify_code_ack":ah(g);break;case"hello":ch(h);break;case"hello_ack":uh(g);break;case"wake":case"wake_ack":case"sleep_notify":break;case"registered":fh(h);break;case"force_disconnect":ph(g);break;case"error":hh(g);break;default:break}return{projects:h.projects}}async function vs(t){lh(t);let e=await yt();d.projects=e,Va(t,e);let n=Oe();Ga({sendFn:t,sessionMgr:n,sessionId:null,payload:{},projects:e})}function Cs(t,e){return Math.min(t*2,e)}var k,qp,nn,Vp,Ss,Es,bs,Gp,ze=K(()=>{"use strict";at();Fn();St();is();St();fe();xt();lt();ws();oe();zt();k=M("ws");qp=9e4,nn=new Map;Vp={registering:new Set(["registered","error","force_disconnect"]),pairing:new Set(["registered","verify_code_ack","error","force_disconnect","heartbeat_ack"]),paired:new Set([...Ye,"error","force_disconnect","heartbeat_ack"]),paired_sleeping:new Set(["wake","force_sleep","error","force_disconnect","heartbeat_ack","hello","hello_ack"])},Ss=10,Es=15,bs=1e4,Gp=5});var xs=S((a0,za)=>{za.exports=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then}});var Be=S(Qe=>{var Rs,Sh=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];Qe.getSymbolSize=function(e){if(!e)throw new Error('"version" cannot be null or undefined');if(e<1||e>40)throw new Error('"version" should be in range from 1 to 40');return e*4+17};Qe.getSymbolTotalCodewords=function(e){return Sh[e]};Qe.getBCHDigit=function(t){let e=0;for(;t!==0;)e++,t>>>=1;return e};Qe.setToSJISFunction=function(e){if(typeof e!="function")throw new Error('"toSJISFunc" is not a valid function.');Rs=e};Qe.isKanjiModeEnabled=function(){return typeof Rs<"u"};Qe.toSJIS=function(e){return Rs(e)}});var ir=S(ne=>{ne.L={bit:1};ne.M={bit:0};ne.Q={bit:3};ne.H={bit:2};function Eh(t){if(typeof t!="string")throw new Error("Param is not a string");switch(t.toLowerCase()){case"l":case"low":return ne.L;case"m":case"medium":return ne.M;case"q":case"quartile":return ne.Q;case"h":case"high":return ne.H;default:throw new Error("Unknown EC Level: "+t)}}ne.isValid=function(e){return e&&typeof e.bit<"u"&&e.bit>=0&&e.bit<4};ne.from=function(e,n){if(ne.isValid(e))return e;try{return Eh(e)}catch{return n}}});var Za=S((u0,Qa)=>{function Ja(){this.buffer=[],this.length=0}Ja.prototype={get:function(t){let e=Math.floor(t/8);return(this.buffer[e]>>>7-t%8&1)===1},put:function(t,e){for(let n=0;n<e;n++)this.putBit((t>>>e-n-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(t){let e=Math.floor(this.length/8);this.buffer.length<=e&&this.buffer.push(0),t&&(this.buffer[e]|=128>>>this.length%8),this.length++}};Qa.exports=Ja});var el=S((d0,Xa)=>{function rn(t){if(!t||t<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=t,this.data=new Uint8Array(t*t),this.reservedBit=new Uint8Array(t*t)}rn.prototype.set=function(t,e,n,r){let s=t*this.size+e;this.data[s]=n,r&&(this.reservedBit[s]=!0)};rn.prototype.get=function(t,e){return this.data[t*this.size+e]};rn.prototype.xor=function(t,e,n){this.data[t*this.size+e]^=n};rn.prototype.isReserved=function(t,e){return this.reservedBit[t*this.size+e]};Xa.exports=rn});var tl=S(or=>{var bh=Be().getSymbolSize;or.getRowColCoords=function(e){if(e===1)return[];let n=Math.floor(e/7)+2,r=bh(e),s=r===145?26:Math.ceil((r-13)/(2*n-2))*2,i=[r-7];for(let o=1;o<n-1;o++)i[o]=i[o-1]-s;return i.push(6),i.reverse()};or.getPositions=function(e){let n=[],r=or.getRowColCoords(e),s=r.length;for(let i=0;i<s;i++)for(let o=0;o<s;o++)i===0&&o===0||i===0&&o===s-1||i===s-1&&o===0||n.push([r[i],r[o]]);return n}});var sl=S(rl=>{var Th=Be().getSymbolSize,nl=7;rl.getPositions=function(e){let n=Th(e);return[[0,0],[n-nl,0],[0,n-nl]]}});var il=S(P=>{P.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var Ze={N1:3,N2:3,N3:40,N4:10};P.isValid=function(e){return e!=null&&e!==""&&!isNaN(e)&&e>=0&&e<=7};P.from=function(e){return P.isValid(e)?parseInt(e,10):void 0};P.getPenaltyN1=function(e){let n=e.size,r=0,s=0,i=0,o=null,a=null;for(let l=0;l<n;l++){s=i=0,o=a=null;for(let c=0;c<n;c++){let u=e.get(l,c);u===o?s++:(s>=5&&(r+=Ze.N1+(s-5)),o=u,s=1),u=e.get(c,l),u===a?i++:(i>=5&&(r+=Ze.N1+(i-5)),a=u,i=1)}s>=5&&(r+=Ze.N1+(s-5)),i>=5&&(r+=Ze.N1+(i-5))}return r};P.getPenaltyN2=function(e){let n=e.size,r=0;for(let s=0;s<n-1;s++)for(let i=0;i<n-1;i++){let o=e.get(s,i)+e.get(s,i+1)+e.get(s+1,i)+e.get(s+1,i+1);(o===4||o===0)&&r++}return r*Ze.N2};P.getPenaltyN3=function(e){let n=e.size,r=0,s=0,i=0;for(let o=0;o<n;o++){s=i=0;for(let a=0;a<n;a++)s=s<<1&2047|e.get(o,a),a>=10&&(s===1488||s===93)&&r++,i=i<<1&2047|e.get(a,o),a>=10&&(i===1488||i===93)&&r++}return r*Ze.N3};P.getPenaltyN4=function(e){let n=0,r=e.data.length;for(let i=0;i<r;i++)n+=e.data[i];return Math.abs(Math.ceil(n*100/r/5)-10)*Ze.N4};function kh(t,e,n){switch(t){case P.Patterns.PATTERN000:return(e+n)%2===0;case P.Patterns.PATTERN001:return e%2===0;case P.Patterns.PATTERN010:return n%3===0;case P.Patterns.PATTERN011:return(e+n)%3===0;case P.Patterns.PATTERN100:return(Math.floor(e/2)+Math.floor(n/3))%2===0;case P.Patterns.PATTERN101:return e*n%2+e*n%3===0;case P.Patterns.PATTERN110:return(e*n%2+e*n%3)%2===0;case P.Patterns.PATTERN111:return(e*n%3+(e+n)%2)%2===0;default:throw new Error("bad maskPattern:"+t)}}P.applyMask=function(e,n){let r=n.size;for(let s=0;s<r;s++)for(let i=0;i<r;i++)n.isReserved(i,s)||n.xor(i,s,kh(e,i,s))};P.getBestMask=function(e,n){let r=Object.keys(P.Patterns).length,s=0,i=1/0;for(let o=0;o<r;o++){n(o),P.applyMask(o,e);let a=P.getPenaltyN1(e)+P.getPenaltyN2(e)+P.getPenaltyN3(e)+P.getPenaltyN4(e);P.applyMask(o,e),a<i&&(i=a,s=o)}return s}});var As=S(Ps=>{var Me=ir(),ar=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],lr=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];Ps.getBlocksCount=function(e,n){switch(n){case Me.L:return ar[(e-1)*4+0];case Me.M:return ar[(e-1)*4+1];case Me.Q:return ar[(e-1)*4+2];case Me.H:return ar[(e-1)*4+3];default:return}};Ps.getTotalCodewordsCount=function(e,n){switch(n){case Me.L:return lr[(e-1)*4+0];case Me.M:return lr[(e-1)*4+1];case Me.Q:return lr[(e-1)*4+2];case Me.H:return lr[(e-1)*4+3];default:return}}});var ol=S(ur=>{var sn=new Uint8Array(512),cr=new Uint8Array(256);(function(){let e=1;for(let n=0;n<255;n++)sn[n]=e,cr[e]=n,e<<=1,e&256&&(e^=285);for(let n=255;n<512;n++)sn[n]=sn[n-255]})();ur.log=function(e){if(e<1)throw new Error("log("+e+")");return cr[e]};ur.exp=function(e){return sn[e]};ur.mul=function(e,n){return e===0||n===0?0:sn[cr[e]+cr[n]]}});var al=S(on=>{var Os=ol();on.mul=function(e,n){let r=new Uint8Array(e.length+n.length-1);for(let s=0;s<e.length;s++)for(let i=0;i<n.length;i++)r[s+i]^=Os.mul(e[s],n[i]);return r};on.mod=function(e,n){let r=new Uint8Array(e);for(;r.length-n.length>=0;){let s=r[0];for(let o=0;o<n.length;o++)r[o]^=Os.mul(n[o],s);let i=0;for(;i<r.length&&r[i]===0;)i++;r=r.slice(i)}return r};on.generateECPolynomial=function(e){let n=new Uint8Array([1]);for(let r=0;r<e;r++)n=on.mul(n,new Uint8Array([1,Os.exp(r)]));return n}});var ul=S((_0,cl)=>{var ll=al();function Ns(t){this.genPoly=void 0,this.degree=t,this.degree&&this.initialize(this.degree)}Ns.prototype.initialize=function(e){this.degree=e,this.genPoly=ll.generateECPolynomial(this.degree)};Ns.prototype.encode=function(e){if(!this.genPoly)throw new Error("Encoder not initialized");let n=new Uint8Array(e.length+this.degree);n.set(e);let r=ll.mod(n,this.genPoly),s=this.degree-r.length;if(s>0){let i=new Uint8Array(this.degree);return i.set(r,s),i}return r};cl.exports=Ns});var Ls=S(dl=>{dl.isValid=function(e){return!isNaN(e)&&e>=1&&e<=40}});var Bs=S(be=>{var fl="[0-9]+",vh="[A-Z $%*+\\-./:]+",an="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";an=an.replace(/u/g,"\\u");var Ch="(?:(?![A-Z0-9 $%*+\\-./:]|"+an+`)(?:.|[\r
46
+ ]))+`;be.KANJI=new RegExp(an,"g");be.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g");be.BYTE=new RegExp(Ch,"g");be.NUMERIC=new RegExp(fl,"g");be.ALPHANUMERIC=new RegExp(vh,"g");var Ih=new RegExp("^"+an+"$"),xh=new RegExp("^"+fl+"$"),Rh=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");be.testKanji=function(e){return Ih.test(e)};be.testNumeric=function(e){return xh.test(e)};be.testAlphanumeric=function(e){return Rh.test(e)}});var De=S($=>{var Ph=Ls(),Ms=Bs();$.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]};$.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]};$.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]};$.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]};$.MIXED={bit:-1};$.getCharCountIndicator=function(e,n){if(!e.ccBits)throw new Error("Invalid mode: "+e);if(!Ph.isValid(n))throw new Error("Invalid version: "+n);return n>=1&&n<10?e.ccBits[0]:n<27?e.ccBits[1]:e.ccBits[2]};$.getBestModeForData=function(e){return Ms.testNumeric(e)?$.NUMERIC:Ms.testAlphanumeric(e)?$.ALPHANUMERIC:Ms.testKanji(e)?$.KANJI:$.BYTE};$.toString=function(e){if(e&&e.id)return e.id;throw new Error("Invalid mode")};$.isValid=function(e){return e&&e.bit&&e.ccBits};function Ah(t){if(typeof t!="string")throw new Error("Param is not a string");switch(t.toLowerCase()){case"numeric":return $.NUMERIC;case"alphanumeric":return $.ALPHANUMERIC;case"kanji":return $.KANJI;case"byte":return $.BYTE;default:throw new Error("Unknown mode: "+t)}}$.from=function(e,n){if($.isValid(e))return e;try{return Ah(e)}catch{return n}}});var yl=S(Xe=>{var dr=Be(),Oh=As(),pl=ir(),$e=De(),Ds=Ls(),gl=7973,hl=dr.getBCHDigit(gl);function Nh(t,e,n){for(let r=1;r<=40;r++)if(e<=Xe.getCapacity(r,n,t))return r}function ml(t,e){return $e.getCharCountIndicator(t,e)+4}function Lh(t,e){let n=0;return t.forEach(function(r){let s=ml(r.mode,e);n+=s+r.getBitsLength()}),n}function Bh(t,e){for(let n=1;n<=40;n++)if(Lh(t,n)<=Xe.getCapacity(n,e,$e.MIXED))return n}Xe.from=function(e,n){return Ds.isValid(e)?parseInt(e,10):n};Xe.getCapacity=function(e,n,r){if(!Ds.isValid(e))throw new Error("Invalid QR Code version");typeof r>"u"&&(r=$e.BYTE);let s=dr.getSymbolTotalCodewords(e),i=Oh.getTotalCodewordsCount(e,n),o=(s-i)*8;if(r===$e.MIXED)return o;let a=o-ml(r,e);switch(r){case $e.NUMERIC:return Math.floor(a/10*3);case $e.ALPHANUMERIC:return Math.floor(a/11*2);case $e.KANJI:return Math.floor(a/13);case $e.BYTE:default:return Math.floor(a/8)}};Xe.getBestVersionForData=function(e,n){let r,s=pl.from(n,pl.M);if(Array.isArray(e)){if(e.length>1)return Bh(e,s);if(e.length===0)return 1;r=e[0]}else r=e;return Nh(r.mode,r.getLength(),s)};Xe.getEncodedBits=function(e){if(!Ds.isValid(e)||e<7)throw new Error("Invalid QR Code version");let n=e<<12;for(;dr.getBCHDigit(n)-hl>=0;)n^=gl<<dr.getBCHDigit(n)-hl;return e<<12|n}});var El=S(Sl=>{var $s=Be(),wl=1335,Mh=21522,_l=$s.getBCHDigit(wl);Sl.getEncodedBits=function(e,n){let r=e.bit<<3|n,s=r<<10;for(;$s.getBCHDigit(s)-_l>=0;)s^=wl<<$s.getBCHDigit(s)-_l;return(r<<10|s)^Mh}});var Tl=S((k0,bl)=>{var Dh=De();function Pt(t){this.mode=Dh.NUMERIC,this.data=t.toString()}Pt.getBitsLength=function(e){return 10*Math.floor(e/3)+(e%3?e%3*3+1:0)};Pt.prototype.getLength=function(){return this.data.length};Pt.prototype.getBitsLength=function(){return Pt.getBitsLength(this.data.length)};Pt.prototype.write=function(e){let n,r,s;for(n=0;n+3<=this.data.length;n+=3)r=this.data.substr(n,3),s=parseInt(r,10),e.put(s,10);let i=this.data.length-n;i>0&&(r=this.data.substr(n),s=parseInt(r,10),e.put(s,i*3+1))};bl.exports=Pt});var vl=S((v0,kl)=>{var $h=De(),Us=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function At(t){this.mode=$h.ALPHANUMERIC,this.data=t}At.getBitsLength=function(e){return 11*Math.floor(e/2)+6*(e%2)};At.prototype.getLength=function(){return this.data.length};At.prototype.getBitsLength=function(){return At.getBitsLength(this.data.length)};At.prototype.write=function(e){let n;for(n=0;n+2<=this.data.length;n+=2){let r=Us.indexOf(this.data[n])*45;r+=Us.indexOf(this.data[n+1]),e.put(r,11)}this.data.length%2&&e.put(Us.indexOf(this.data[n]),6)};kl.exports=At});var Il=S((C0,Cl)=>{var Uh=De();function Ot(t){this.mode=Uh.BYTE,typeof t=="string"?this.data=new TextEncoder().encode(t):this.data=new Uint8Array(t)}Ot.getBitsLength=function(e){return e*8};Ot.prototype.getLength=function(){return this.data.length};Ot.prototype.getBitsLength=function(){return Ot.getBitsLength(this.data.length)};Ot.prototype.write=function(t){for(let e=0,n=this.data.length;e<n;e++)t.put(this.data[e],8)};Cl.exports=Ot});var Rl=S((I0,xl)=>{var Fh=De(),jh=Be();function Nt(t){this.mode=Fh.KANJI,this.data=t}Nt.getBitsLength=function(e){return e*13};Nt.prototype.getLength=function(){return this.data.length};Nt.prototype.getBitsLength=function(){return Nt.getBitsLength(this.data.length)};Nt.prototype.write=function(t){let e;for(e=0;e<this.data.length;e++){let n=jh.toSJIS(this.data[e]);if(n>=33088&&n<=40956)n-=33088;else if(n>=57408&&n<=60351)n-=49472;else throw new Error("Invalid SJIS character: "+this.data[e]+`
47
+ Make sure your charset is UTF-8`);n=(n>>>8&255)*192+(n&255),t.put(n,13)}};xl.exports=Nt});var Pl=S((x0,Fs)=>{"use strict";var ln={single_source_shortest_paths:function(t,e,n){var r={},s={};s[e]=0;var i=ln.PriorityQueue.make();i.push(e,0);for(var o,a,l,c,u,p,g,f,h;!i.empty();){o=i.pop(),a=o.value,c=o.cost,u=t[a]||{};for(l in u)u.hasOwnProperty(l)&&(p=u[l],g=c+p,f=s[l],h=typeof s[l]>"u",(h||f>g)&&(s[l]=g,i.push(l,g),r[l]=a))}if(typeof n<"u"&&typeof s[n]>"u"){var y=["Could not find a path from ",e," to ",n,"."].join("");throw new Error(y)}return r},extract_shortest_path_from_predecessor_list:function(t,e){for(var n=[],r=e,s;r;)n.push(r),s=t[r],r=t[r];return n.reverse(),n},find_path:function(t,e,n){var r=ln.single_source_shortest_paths(t,e,n);return ln.extract_shortest_path_from_predecessor_list(r,n)},PriorityQueue:{make:function(t){var e=ln.PriorityQueue,n={},r;t=t||{};for(r in e)e.hasOwnProperty(r)&&(n[r]=e[r]);return n.queue=[],n.sorter=t.sorter||e.default_sorter,n},default_sorter:function(t,e){return t.cost-e.cost},push:function(t,e){var n={value:t,cost:e};this.queue.push(n),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};typeof Fs<"u"&&(Fs.exports=ln)});var $l=S(Lt=>{var x=De(),Nl=Tl(),Ll=vl(),Bl=Il(),Ml=Rl(),cn=Bs(),fr=Be(),qh=Pl();function Al(t){return unescape(encodeURIComponent(t)).length}function un(t,e,n){let r=[],s;for(;(s=t.exec(n))!==null;)r.push({data:s[0],index:s.index,mode:e,length:s[0].length});return r}function Dl(t){let e=un(cn.NUMERIC,x.NUMERIC,t),n=un(cn.ALPHANUMERIC,x.ALPHANUMERIC,t),r,s;return fr.isKanjiModeEnabled()?(r=un(cn.BYTE,x.BYTE,t),s=un(cn.KANJI,x.KANJI,t)):(r=un(cn.BYTE_KANJI,x.BYTE,t),s=[]),e.concat(n,r,s).sort(function(o,a){return o.index-a.index}).map(function(o){return{data:o.data,mode:o.mode,length:o.length}})}function js(t,e){switch(e){case x.NUMERIC:return Nl.getBitsLength(t);case x.ALPHANUMERIC:return Ll.getBitsLength(t);case x.KANJI:return Ml.getBitsLength(t);case x.BYTE:return Bl.getBitsLength(t)}}function Kh(t){return t.reduce(function(e,n){let r=e.length-1>=0?e[e.length-1]:null;return r&&r.mode===n.mode?(e[e.length-1].data+=n.data,e):(e.push(n),e)},[])}function Wh(t){let e=[];for(let n=0;n<t.length;n++){let r=t[n];switch(r.mode){case x.NUMERIC:e.push([r,{data:r.data,mode:x.ALPHANUMERIC,length:r.length},{data:r.data,mode:x.BYTE,length:r.length}]);break;case x.ALPHANUMERIC:e.push([r,{data:r.data,mode:x.BYTE,length:r.length}]);break;case x.KANJI:e.push([r,{data:r.data,mode:x.BYTE,length:Al(r.data)}]);break;case x.BYTE:e.push([{data:r.data,mode:x.BYTE,length:Al(r.data)}])}}return e}function Hh(t,e){let n={},r={start:{}},s=["start"];for(let i=0;i<t.length;i++){let o=t[i],a=[];for(let l=0;l<o.length;l++){let c=o[l],u=""+i+l;a.push(u),n[u]={node:c,lastCount:0},r[u]={};for(let p=0;p<s.length;p++){let g=s[p];n[g]&&n[g].node.mode===c.mode?(r[g][u]=js(n[g].lastCount+c.length,c.mode)-js(n[g].lastCount,c.mode),n[g].lastCount+=c.length):(n[g]&&(n[g].lastCount=c.length),r[g][u]=js(c.length,c.mode)+4+x.getCharCountIndicator(c.mode,e))}}s=a}for(let i=0;i<s.length;i++)r[s[i]].end=0;return{map:r,table:n}}function Ol(t,e){let n,r=x.getBestModeForData(t);if(n=x.from(e,r),n!==x.BYTE&&n.bit<r.bit)throw new Error('"'+t+'" cannot be encoded with mode '+x.toString(n)+`.
48
+ Suggested mode is: `+x.toString(r));switch(n===x.KANJI&&!fr.isKanjiModeEnabled()&&(n=x.BYTE),n){case x.NUMERIC:return new Nl(t);case x.ALPHANUMERIC:return new Ll(t);case x.KANJI:return new Ml(t);case x.BYTE:return new Bl(t)}}Lt.fromArray=function(e){return e.reduce(function(n,r){return typeof r=="string"?n.push(Ol(r,null)):r.data&&n.push(Ol(r.data,r.mode)),n},[])};Lt.fromString=function(e,n){let r=Dl(e,fr.isKanjiModeEnabled()),s=Wh(r),i=Hh(s,n),o=qh.find_path(i.map,"start","end"),a=[];for(let l=1;l<o.length-1;l++)a.push(i.table[o[l]].node);return Lt.fromArray(Kh(a))};Lt.rawSplit=function(e){return Lt.fromArray(Dl(e,fr.isKanjiModeEnabled()))}});var Gs=S(Ul=>{var hr=Be(),qs=ir(),Vh=Za(),Gh=el(),Yh=tl(),zh=sl(),Hs=il(),Vs=As(),Jh=ul(),pr=yl(),Qh=El(),Zh=De(),Ks=$l();function Xh(t,e){let n=t.size,r=zh.getPositions(e);for(let s=0;s<r.length;s++){let i=r[s][0],o=r[s][1];for(let a=-1;a<=7;a++)if(!(i+a<=-1||n<=i+a))for(let l=-1;l<=7;l++)o+l<=-1||n<=o+l||(a>=0&&a<=6&&(l===0||l===6)||l>=0&&l<=6&&(a===0||a===6)||a>=2&&a<=4&&l>=2&&l<=4?t.set(i+a,o+l,!0,!0):t.set(i+a,o+l,!1,!0))}}function eg(t){let e=t.size;for(let n=8;n<e-8;n++){let r=n%2===0;t.set(n,6,r,!0),t.set(6,n,r,!0)}}function tg(t,e){let n=Yh.getPositions(e);for(let r=0;r<n.length;r++){let s=n[r][0],i=n[r][1];for(let o=-2;o<=2;o++)for(let a=-2;a<=2;a++)o===-2||o===2||a===-2||a===2||o===0&&a===0?t.set(s+o,i+a,!0,!0):t.set(s+o,i+a,!1,!0)}}function ng(t,e){let n=t.size,r=pr.getEncodedBits(e),s,i,o;for(let a=0;a<18;a++)s=Math.floor(a/3),i=a%3+n-8-3,o=(r>>a&1)===1,t.set(s,i,o,!0),t.set(i,s,o,!0)}function Ws(t,e,n){let r=t.size,s=Qh.getEncodedBits(e,n),i,o;for(i=0;i<15;i++)o=(s>>i&1)===1,i<6?t.set(i,8,o,!0):i<8?t.set(i+1,8,o,!0):t.set(r-15+i,8,o,!0),i<8?t.set(8,r-i-1,o,!0):i<9?t.set(8,15-i-1+1,o,!0):t.set(8,15-i-1,o,!0);t.set(r-8,8,1,!0)}function rg(t,e){let n=t.size,r=-1,s=n-1,i=7,o=0;for(let a=n-1;a>0;a-=2)for(a===6&&a--;;){for(let l=0;l<2;l++)if(!t.isReserved(s,a-l)){let c=!1;o<e.length&&(c=(e[o]>>>i&1)===1),t.set(s,a-l,c),i--,i===-1&&(o++,i=7)}if(s+=r,s<0||n<=s){s-=r,r=-r;break}}}function sg(t,e,n){let r=new Vh;n.forEach(function(l){r.put(l.mode.bit,4),r.put(l.getLength(),Zh.getCharCountIndicator(l.mode,t)),l.write(r)});let s=hr.getSymbolTotalCodewords(t),i=Vs.getTotalCodewordsCount(t,e),o=(s-i)*8;for(r.getLengthInBits()+4<=o&&r.put(0,4);r.getLengthInBits()%8!==0;)r.putBit(0);let a=(o-r.getLengthInBits())/8;for(let l=0;l<a;l++)r.put(l%2?17:236,8);return ig(r,t,e)}function ig(t,e,n){let r=hr.getSymbolTotalCodewords(e),s=Vs.getTotalCodewordsCount(e,n),i=r-s,o=Vs.getBlocksCount(e,n),a=r%o,l=o-a,c=Math.floor(r/o),u=Math.floor(i/o),p=u+1,g=c-u,f=new Jh(g),h=0,y=new Array(o),_=new Array(o),w=0,R=new Uint8Array(t.buffer);for(let C=0;C<o;C++){let A=C<l?u:p;y[C]=R.slice(h,h+A),_[C]=f.encode(y[C]),h+=A,w=Math.max(w,A)}let B=new Uint8Array(r),T=0,E,b;for(E=0;E<w;E++)for(b=0;b<o;b++)E<y[b].length&&(B[T++]=y[b][E]);for(E=0;E<g;E++)for(b=0;b<o;b++)B[T++]=_[b][E];return B}function og(t,e,n,r){let s;if(Array.isArray(t))s=Ks.fromArray(t);else if(typeof t=="string"){let c=e;if(!c){let u=Ks.rawSplit(t);c=pr.getBestVersionForData(u,n)}s=Ks.fromString(t,c||40)}else throw new Error("Invalid data");let i=pr.getBestVersionForData(s,n);if(!i)throw new Error("The amount of data is too big to be stored in a QR Code");if(!e)e=i;else if(e<i)throw new Error(`
49
+ The chosen QR Code version cannot contain this amount of data.
50
+ Minimum version required to store current data is: `+i+`.
51
+ `);let o=sg(e,n,s),a=hr.getSymbolSize(e),l=new Gh(a);return Xh(l,e),eg(l),tg(l,e),Ws(l,n,0),e>=7&&ng(l,e),rg(l,o),isNaN(r)&&(r=Hs.getBestMask(l,Ws.bind(null,l,n))),Hs.applyMask(r,l),Ws(l,n,r),{modules:l,version:e,errorCorrectionLevel:n,maskPattern:r,segments:s}}Ul.create=function(e,n){if(typeof e>"u"||e==="")throw new Error("No input text");let r=qs.M,s,i;return typeof n<"u"&&(r=qs.from(n.errorCorrectionLevel,qs.M),s=pr.from(n.version),i=Hs.from(n.maskPattern),n.toSJISFunc&&hr.setToSJISFunction(n.toSJISFunc)),og(e,s,r,i)}});var Ys=S((A0,jl)=>{"use strict";var ag=v("util"),Fl=v("stream"),le=jl.exports=function(){Fl.call(this),this._buffers=[],this._buffered=0,this._reads=[],this._paused=!1,this._encoding="utf8",this.writable=!0};ag.inherits(le,Fl);le.prototype.read=function(t,e){this._reads.push({length:Math.abs(t),allowLess:t<0,func:e}),process.nextTick(function(){this._process(),this._paused&&this._reads&&this._reads.length>0&&(this._paused=!1,this.emit("drain"))}.bind(this))};le.prototype.write=function(t,e){if(!this.writable)return this.emit("error",new Error("Stream not writable")),!1;let n;return Buffer.isBuffer(t)?n=t:n=Buffer.from(t,e||this._encoding),this._buffers.push(n),this._buffered+=n.length,this._process(),this._reads&&this._reads.length===0&&(this._paused=!0),this.writable&&!this._paused};le.prototype.end=function(t,e){t&&this.write(t,e),this.writable=!1,this._buffers&&(this._buffers.length===0?this._end():(this._buffers.push(null),this._process()))};le.prototype.destroySoon=le.prototype.end;le.prototype._end=function(){this._reads.length>0&&this.emit("error",new Error("Unexpected end of input")),this.destroy()};le.prototype.destroy=function(){this._buffers&&(this.writable=!1,this._reads=null,this._buffers=null,this.emit("close"))};le.prototype._processReadAllowingLess=function(t){this._reads.shift();let e=this._buffers[0];e.length>t.length?(this._buffered-=t.length,this._buffers[0]=e.slice(t.length),t.func.call(this,e.slice(0,t.length))):(this._buffered-=e.length,this._buffers.shift(),t.func.call(this,e))};le.prototype._processRead=function(t){this._reads.shift();let e=0,n=0,r=Buffer.alloc(t.length);for(;e<t.length;){let s=this._buffers[n++],i=Math.min(s.length,t.length-e);s.copy(r,e,0,i),e+=i,i!==s.length&&(this._buffers[--n]=s.slice(i))}n>0&&this._buffers.splice(0,n),this._buffered-=t.length,t.func.call(this,r)};le.prototype._process=function(){try{for(;this._buffered>0&&this._reads&&this._reads.length>0;){let t=this._reads[0];if(t.allowLess)this._processReadAllowingLess(t);else if(this._buffered>=t.length)this._processRead(t);else break}this._buffers&&!this.writable&&this._end()}catch(t){this.emit("error",t)}}});var Js=S(zs=>{"use strict";var Ue=[{x:[0],y:[0]},{x:[4],y:[0]},{x:[0,4],y:[4]},{x:[2,6],y:[0,4]},{x:[0,2,4,6],y:[2,6]},{x:[1,3,5,7],y:[0,2,4,6]},{x:[0,1,2,3,4,5,6,7],y:[1,3,5,7]}];zs.getImagePasses=function(t,e){let n=[],r=t%8,s=e%8,i=(t-r)/8,o=(e-s)/8;for(let a=0;a<Ue.length;a++){let l=Ue[a],c=i*l.x.length,u=o*l.y.length;for(let p=0;p<l.x.length&&l.x[p]<r;p++)c++;for(let p=0;p<l.y.length&&l.y[p]<s;p++)u++;c>0&&u>0&&n.push({width:c,height:u,index:a})}return n};zs.getInterlaceIterator=function(t){return function(e,n,r){let s=e%Ue[r].x.length,i=(e-s)/Ue[r].x.length*8+Ue[r].x[s],o=n%Ue[r].y.length,a=(n-o)/Ue[r].y.length*8+Ue[r].y[o];return i*4+a*t*4}}});var Qs=S((N0,ql)=>{"use strict";ql.exports=function(e,n,r){let s=e+n-r,i=Math.abs(s-e),o=Math.abs(s-n),a=Math.abs(s-r);return i<=o&&i<=a?e:o<=a?n:r}});var Zs=S((L0,Wl)=>{"use strict";var lg=Js(),cg=Qs();function Kl(t,e,n){let r=t*e;return n!==8&&(r=Math.ceil(r/(8/n))),r}var Bt=Wl.exports=function(t,e){let n=t.width,r=t.height,s=t.interlace,i=t.bpp,o=t.depth;if(this.read=e.read,this.write=e.write,this.complete=e.complete,this._imageIndex=0,this._images=[],s){let a=lg.getImagePasses(n,r);for(let l=0;l<a.length;l++)this._images.push({byteWidth:Kl(a[l].width,i,o),height:a[l].height,lineIndex:0})}else this._images.push({byteWidth:Kl(n,i,o),height:r,lineIndex:0});o===8?this._xComparison=i:o===16?this._xComparison=i*2:this._xComparison=1};Bt.prototype.start=function(){this.read(this._images[this._imageIndex].byteWidth+1,this._reverseFilterLine.bind(this))};Bt.prototype._unFilterType1=function(t,e,n){let r=this._xComparison,s=r-1;for(let i=0;i<n;i++){let o=t[1+i],a=i>s?e[i-r]:0;e[i]=o+a}};Bt.prototype._unFilterType2=function(t,e,n){let r=this._lastLine;for(let s=0;s<n;s++){let i=t[1+s],o=r?r[s]:0;e[s]=i+o}};Bt.prototype._unFilterType3=function(t,e,n){let r=this._xComparison,s=r-1,i=this._lastLine;for(let o=0;o<n;o++){let a=t[1+o],l=i?i[o]:0,c=o>s?e[o-r]:0,u=Math.floor((c+l)/2);e[o]=a+u}};Bt.prototype._unFilterType4=function(t,e,n){let r=this._xComparison,s=r-1,i=this._lastLine;for(let o=0;o<n;o++){let a=t[1+o],l=i?i[o]:0,c=o>s?e[o-r]:0,u=o>s&&i?i[o-r]:0,p=cg(c,l,u);e[o]=a+p}};Bt.prototype._reverseFilterLine=function(t){let e=t[0],n,r=this._images[this._imageIndex],s=r.byteWidth;if(e===0)n=t.slice(1,s+1);else switch(n=Buffer.alloc(s),e){case 1:this._unFilterType1(t,n,s);break;case 2:this._unFilterType2(t,n,s);break;case 3:this._unFilterType3(t,n,s);break;case 4:this._unFilterType4(t,n,s);break;default:throw new Error("Unrecognised filter type - "+e)}this.write(n),r.lineIndex++,r.lineIndex>=r.height?(this._lastLine=null,this._imageIndex++,r=this._images[this._imageIndex]):this._lastLine=n,r?this.read(r.byteWidth+1,this._reverseFilterLine.bind(this)):(this._lastLine=null,this.complete())}});var Gl=S((B0,Vl)=>{"use strict";var ug=v("util"),Hl=Ys(),dg=Zs(),fg=Vl.exports=function(t){Hl.call(this);let e=[],n=this;this._filter=new dg(t,{read:this.read.bind(this),write:function(r){e.push(r)},complete:function(){n.emit("complete",Buffer.concat(e))}}),this._filter.start()};ug.inherits(fg,Hl)});var Mt=S((M0,Yl)=>{"use strict";Yl.exports={PNG_SIGNATURE:[137,80,78,71,13,10,26,10],TYPE_IHDR:1229472850,TYPE_IEND:1229278788,TYPE_IDAT:1229209940,TYPE_PLTE:1347179589,TYPE_tRNS:1951551059,TYPE_gAMA:1732332865,COLORTYPE_GRAYSCALE:0,COLORTYPE_PALETTE:1,COLORTYPE_COLOR:2,COLORTYPE_ALPHA:4,COLORTYPE_PALETTE_COLOR:3,COLORTYPE_COLOR_ALPHA:6,COLORTYPE_TO_BPP_MAP:{0:1,2:3,3:1,4:2,6:4},GAMMA_DIVISION:1e5}});var ti=S((D0,zl)=>{"use strict";var Xs=[];(function(){for(let t=0;t<256;t++){let e=t;for(let n=0;n<8;n++)e&1?e=3988292384^e>>>1:e=e>>>1;Xs[t]=e}})();var ei=zl.exports=function(){this._crc=-1};ei.prototype.write=function(t){for(let e=0;e<t.length;e++)this._crc=Xs[(this._crc^t[e])&255]^this._crc>>>8;return!0};ei.prototype.crc32=function(){return this._crc^-1};ei.crc32=function(t){let e=-1;for(let n=0;n<t.length;n++)e=Xs[(e^t[n])&255]^e>>>8;return e^-1}});var ni=S(($0,Jl)=>{"use strict";var F=Mt(),pg=ti(),q=Jl.exports=function(t,e){this._options=t,t.checkCRC=t.checkCRC!==!1,this._hasIHDR=!1,this._hasIEND=!1,this._emittedHeadersFinished=!1,this._palette=[],this._colorType=0,this._chunks={},this._chunks[F.TYPE_IHDR]=this._handleIHDR.bind(this),this._chunks[F.TYPE_IEND]=this._handleIEND.bind(this),this._chunks[F.TYPE_IDAT]=this._handleIDAT.bind(this),this._chunks[F.TYPE_PLTE]=this._handlePLTE.bind(this),this._chunks[F.TYPE_tRNS]=this._handleTRNS.bind(this),this._chunks[F.TYPE_gAMA]=this._handleGAMA.bind(this),this.read=e.read,this.error=e.error,this.metadata=e.metadata,this.gamma=e.gamma,this.transColor=e.transColor,this.palette=e.palette,this.parsed=e.parsed,this.inflateData=e.inflateData,this.finished=e.finished,this.simpleTransparency=e.simpleTransparency,this.headersFinished=e.headersFinished||function(){}};q.prototype.start=function(){this.read(F.PNG_SIGNATURE.length,this._parseSignature.bind(this))};q.prototype._parseSignature=function(t){let e=F.PNG_SIGNATURE;for(let n=0;n<e.length;n++)if(t[n]!==e[n]){this.error(new Error("Invalid file signature"));return}this.read(8,this._parseChunkBegin.bind(this))};q.prototype._parseChunkBegin=function(t){let e=t.readUInt32BE(0),n=t.readUInt32BE(4),r="";for(let i=4;i<8;i++)r+=String.fromCharCode(t[i]);let s=!!(t[4]&32);if(!this._hasIHDR&&n!==F.TYPE_IHDR){this.error(new Error("Expected IHDR on beggining"));return}if(this._crc=new pg,this._crc.write(Buffer.from(r)),this._chunks[n])return this._chunks[n](e);if(!s){this.error(new Error("Unsupported critical chunk type "+r));return}this.read(e+4,this._skipChunk.bind(this))};q.prototype._skipChunk=function(){this.read(8,this._parseChunkBegin.bind(this))};q.prototype._handleChunkEnd=function(){this.read(4,this._parseChunkEnd.bind(this))};q.prototype._parseChunkEnd=function(t){let e=t.readInt32BE(0),n=this._crc.crc32();if(this._options.checkCRC&&n!==e){this.error(new Error("Crc error - "+e+" - "+n));return}this._hasIEND||this.read(8,this._parseChunkBegin.bind(this))};q.prototype._handleIHDR=function(t){this.read(t,this._parseIHDR.bind(this))};q.prototype._parseIHDR=function(t){this._crc.write(t);let e=t.readUInt32BE(0),n=t.readUInt32BE(4),r=t[8],s=t[9],i=t[10],o=t[11],a=t[12];if(r!==8&&r!==4&&r!==2&&r!==1&&r!==16){this.error(new Error("Unsupported bit depth "+r));return}if(!(s in F.COLORTYPE_TO_BPP_MAP)){this.error(new Error("Unsupported color type"));return}if(i!==0){this.error(new Error("Unsupported compression method"));return}if(o!==0){this.error(new Error("Unsupported filter method"));return}if(a!==0&&a!==1){this.error(new Error("Unsupported interlace method"));return}this._colorType=s;let l=F.COLORTYPE_TO_BPP_MAP[this._colorType];this._hasIHDR=!0,this.metadata({width:e,height:n,depth:r,interlace:!!a,palette:!!(s&F.COLORTYPE_PALETTE),color:!!(s&F.COLORTYPE_COLOR),alpha:!!(s&F.COLORTYPE_ALPHA),bpp:l,colorType:s}),this._handleChunkEnd()};q.prototype._handlePLTE=function(t){this.read(t,this._parsePLTE.bind(this))};q.prototype._parsePLTE=function(t){this._crc.write(t);let e=Math.floor(t.length/3);for(let n=0;n<e;n++)this._palette.push([t[n*3],t[n*3+1],t[n*3+2],255]);this.palette(this._palette),this._handleChunkEnd()};q.prototype._handleTRNS=function(t){this.simpleTransparency(),this.read(t,this._parseTRNS.bind(this))};q.prototype._parseTRNS=function(t){if(this._crc.write(t),this._colorType===F.COLORTYPE_PALETTE_COLOR){if(this._palette.length===0){this.error(new Error("Transparency chunk must be after palette"));return}if(t.length>this._palette.length){this.error(new Error("More transparent colors than palette size"));return}for(let e=0;e<t.length;e++)this._palette[e][3]=t[e];this.palette(this._palette)}this._colorType===F.COLORTYPE_GRAYSCALE&&this.transColor([t.readUInt16BE(0)]),this._colorType===F.COLORTYPE_COLOR&&this.transColor([t.readUInt16BE(0),t.readUInt16BE(2),t.readUInt16BE(4)]),this._handleChunkEnd()};q.prototype._handleGAMA=function(t){this.read(t,this._parseGAMA.bind(this))};q.prototype._parseGAMA=function(t){this._crc.write(t),this.gamma(t.readUInt32BE(0)/F.GAMMA_DIVISION),this._handleChunkEnd()};q.prototype._handleIDAT=function(t){this._emittedHeadersFinished||(this._emittedHeadersFinished=!0,this.headersFinished()),this.read(-t,this._parseIDAT.bind(this,t))};q.prototype._parseIDAT=function(t,e){if(this._crc.write(e),this._colorType===F.COLORTYPE_PALETTE_COLOR&&this._palette.length===0)throw new Error("Expected palette not found");this.inflateData(e);let n=t-e.length;n>0?this._handleIDAT(n):this._handleChunkEnd()};q.prototype._handleIEND=function(t){this.read(t,this._parseIEND.bind(this))};q.prototype._parseIEND=function(t){this._crc.write(t),this._hasIEND=!0,this._handleChunkEnd(),this.finished&&this.finished()}});var ri=S(Zl=>{"use strict";var Ql=Js(),hg=[function(){},function(t,e,n,r){if(r===e.length)throw new Error("Ran out of data");let s=e[r];t[n]=s,t[n+1]=s,t[n+2]=s,t[n+3]=255},function(t,e,n,r){if(r+1>=e.length)throw new Error("Ran out of data");let s=e[r];t[n]=s,t[n+1]=s,t[n+2]=s,t[n+3]=e[r+1]},function(t,e,n,r){if(r+2>=e.length)throw new Error("Ran out of data");t[n]=e[r],t[n+1]=e[r+1],t[n+2]=e[r+2],t[n+3]=255},function(t,e,n,r){if(r+3>=e.length)throw new Error("Ran out of data");t[n]=e[r],t[n+1]=e[r+1],t[n+2]=e[r+2],t[n+3]=e[r+3]}],gg=[function(){},function(t,e,n,r){let s=e[0];t[n]=s,t[n+1]=s,t[n+2]=s,t[n+3]=r},function(t,e,n){let r=e[0];t[n]=r,t[n+1]=r,t[n+2]=r,t[n+3]=e[1]},function(t,e,n,r){t[n]=e[0],t[n+1]=e[1],t[n+2]=e[2],t[n+3]=r},function(t,e,n){t[n]=e[0],t[n+1]=e[1],t[n+2]=e[2],t[n+3]=e[3]}];function mg(t,e){let n=[],r=0;function s(){if(r===t.length)throw new Error("Ran out of data");let i=t[r];r++;let o,a,l,c,u,p,g,f;switch(e){default:throw new Error("unrecognised depth");case 16:g=t[r],r++,n.push((i<<8)+g);break;case 4:g=i&15,f=i>>4,n.push(f,g);break;case 2:u=i&3,p=i>>2&3,g=i>>4&3,f=i>>6&3,n.push(f,g,p,u);break;case 1:o=i&1,a=i>>1&1,l=i>>2&1,c=i>>3&1,u=i>>4&1,p=i>>5&1,g=i>>6&1,f=i>>7&1,n.push(f,g,p,u,c,l,a,o);break}}return{get:function(i){for(;n.length<i;)s();let o=n.slice(0,i);return n=n.slice(i),o},resetAfterLine:function(){n.length=0},end:function(){if(r!==t.length)throw new Error("extra data found")}}}function yg(t,e,n,r,s,i){let o=t.width,a=t.height,l=t.index;for(let c=0;c<a;c++)for(let u=0;u<o;u++){let p=n(u,c,l);hg[r](e,s,p,i),i+=r}return i}function _g(t,e,n,r,s,i){let o=t.width,a=t.height,l=t.index;for(let c=0;c<a;c++){for(let u=0;u<o;u++){let p=s.get(r),g=n(u,c,l);gg[r](e,p,g,i)}s.resetAfterLine()}}Zl.dataToBitMap=function(t,e){let n=e.width,r=e.height,s=e.depth,i=e.bpp,o=e.interlace,a;s!==8&&(a=mg(t,s));let l;s<=8?l=Buffer.alloc(n*r*4):l=new Uint16Array(n*r*4);let c=Math.pow(2,s)-1,u=0,p,g;if(o)p=Ql.getImagePasses(n,r),g=Ql.getInterlaceIterator(n,r);else{let f=0;g=function(){let h=f;return f+=4,h},p=[{width:n,height:r}]}for(let f=0;f<p.length;f++)s===8?u=yg(p[f],l,g,i,t,u):_g(p[f],l,g,i,a,c);if(s===8){if(u!==t.length)throw new Error("extra data found")}else a.end();return l}});var si=S((F0,Xl)=>{"use strict";function wg(t,e,n,r,s){let i=0;for(let o=0;o<r;o++)for(let a=0;a<n;a++){let l=s[t[i]];if(!l)throw new Error("index "+t[i]+" not in palette");for(let c=0;c<4;c++)e[i+c]=l[c];i+=4}}function Sg(t,e,n,r,s){let i=0;for(let o=0;o<r;o++)for(let a=0;a<n;a++){let l=!1;if(s.length===1?s[0]===t[i]&&(l=!0):s[0]===t[i]&&s[1]===t[i+1]&&s[2]===t[i+2]&&(l=!0),l)for(let c=0;c<4;c++)e[i+c]=0;i+=4}}function Eg(t,e,n,r,s){let i=255,o=Math.pow(2,s)-1,a=0;for(let l=0;l<r;l++)for(let c=0;c<n;c++){for(let u=0;u<4;u++)e[a+u]=Math.floor(t[a+u]*i/o+.5);a+=4}}Xl.exports=function(t,e){let n=e.depth,r=e.width,s=e.height,i=e.colorType,o=e.transColor,a=e.palette,l=t;return i===3?wg(t,l,r,s,a):(o&&Sg(t,l,r,s,o),n!==8&&(n===16&&(l=Buffer.alloc(r*s*4)),Eg(t,l,r,s,n))),l}});var nc=S((j0,tc)=>{"use strict";var bg=v("util"),ii=v("zlib"),ec=Ys(),Tg=Gl(),kg=ni(),vg=ri(),Cg=si(),he=tc.exports=function(t){ec.call(this),this._parser=new kg(t,{read:this.read.bind(this),error:this._handleError.bind(this),metadata:this._handleMetaData.bind(this),gamma:this.emit.bind(this,"gamma"),palette:this._handlePalette.bind(this),transColor:this._handleTransColor.bind(this),finished:this._finished.bind(this),inflateData:this._inflateData.bind(this),simpleTransparency:this._simpleTransparency.bind(this),headersFinished:this._headersFinished.bind(this)}),this._options=t,this.writable=!0,this._parser.start()};bg.inherits(he,ec);he.prototype._handleError=function(t){this.emit("error",t),this.writable=!1,this.destroy(),this._inflate&&this._inflate.destroy&&this._inflate.destroy(),this._filter&&(this._filter.destroy(),this._filter.on("error",function(){})),this.errord=!0};he.prototype._inflateData=function(t){if(!this._inflate)if(this._bitmapInfo.interlace)this._inflate=ii.createInflate(),this._inflate.on("error",this.emit.bind(this,"error")),this._filter.on("complete",this._complete.bind(this)),this._inflate.pipe(this._filter);else{let n=((this._bitmapInfo.width*this._bitmapInfo.bpp*this._bitmapInfo.depth+7>>3)+1)*this._bitmapInfo.height,r=Math.max(n,ii.Z_MIN_CHUNK);this._inflate=ii.createInflate({chunkSize:r});let s=n,i=this.emit.bind(this,"error");this._inflate.on("error",function(a){s&&i(a)}),this._filter.on("complete",this._complete.bind(this));let o=this._filter.write.bind(this._filter);this._inflate.on("data",function(a){s&&(a.length>s&&(a=a.slice(0,s)),s-=a.length,o(a))}),this._inflate.on("end",this._filter.end.bind(this._filter))}this._inflate.write(t)};he.prototype._handleMetaData=function(t){this._metaData=t,this._bitmapInfo=Object.create(t),this._filter=new Tg(this._bitmapInfo)};he.prototype._handleTransColor=function(t){this._bitmapInfo.transColor=t};he.prototype._handlePalette=function(t){this._bitmapInfo.palette=t};he.prototype._simpleTransparency=function(){this._metaData.alpha=!0};he.prototype._headersFinished=function(){this.emit("metadata",this._metaData)};he.prototype._finished=function(){this.errord||(this._inflate?this._inflate.end():this.emit("error","No Inflate block"))};he.prototype._complete=function(t){if(this.errord)return;let e;try{let n=vg.dataToBitMap(t,this._bitmapInfo);e=Cg(n,this._bitmapInfo),n=null}catch(n){this._handleError(n);return}this.emit("parsed",e)}});var sc=S((q0,rc)=>{"use strict";var re=Mt();rc.exports=function(t,e,n,r){let s=[re.COLORTYPE_COLOR_ALPHA,re.COLORTYPE_ALPHA].indexOf(r.colorType)!==-1;if(r.colorType===r.inputColorType){let h=(function(){let y=new ArrayBuffer(2);return new DataView(y).setInt16(0,256,!0),new Int16Array(y)[0]!==256})();if(r.bitDepth===8||r.bitDepth===16&&h)return t}let i=r.bitDepth!==16?t:new Uint16Array(t.buffer),o=255,a=re.COLORTYPE_TO_BPP_MAP[r.inputColorType];a===4&&!r.inputHasAlpha&&(a=3);let l=re.COLORTYPE_TO_BPP_MAP[r.colorType];r.bitDepth===16&&(o=65535,l*=2);let c=Buffer.alloc(e*n*l),u=0,p=0,g=r.bgColor||{};g.red===void 0&&(g.red=o),g.green===void 0&&(g.green=o),g.blue===void 0&&(g.blue=o);function f(){let h,y,_,w=o;switch(r.inputColorType){case re.COLORTYPE_COLOR_ALPHA:w=i[u+3],h=i[u],y=i[u+1],_=i[u+2];break;case re.COLORTYPE_COLOR:h=i[u],y=i[u+1],_=i[u+2];break;case re.COLORTYPE_ALPHA:w=i[u+1],h=i[u],y=h,_=h;break;case re.COLORTYPE_GRAYSCALE:h=i[u],y=h,_=h;break;default:throw new Error("input color type:"+r.inputColorType+" is not supported at present")}return r.inputHasAlpha&&(s||(w/=o,h=Math.min(Math.max(Math.round((1-w)*g.red+w*h),0),o),y=Math.min(Math.max(Math.round((1-w)*g.green+w*y),0),o),_=Math.min(Math.max(Math.round((1-w)*g.blue+w*_),0),o))),{red:h,green:y,blue:_,alpha:w}}for(let h=0;h<n;h++)for(let y=0;y<e;y++){let _=f(i,u);switch(r.colorType){case re.COLORTYPE_COLOR_ALPHA:case re.COLORTYPE_COLOR:r.bitDepth===8?(c[p]=_.red,c[p+1]=_.green,c[p+2]=_.blue,s&&(c[p+3]=_.alpha)):(c.writeUInt16BE(_.red,p),c.writeUInt16BE(_.green,p+2),c.writeUInt16BE(_.blue,p+4),s&&c.writeUInt16BE(_.alpha,p+6));break;case re.COLORTYPE_ALPHA:case re.COLORTYPE_GRAYSCALE:{let w=(_.red+_.green+_.blue)/3;r.bitDepth===8?(c[p]=w,s&&(c[p+1]=_.alpha)):(c.writeUInt16BE(w,p),s&&c.writeUInt16BE(_.alpha,p+2));break}default:throw new Error("unrecognised color Type "+r.colorType)}u+=a,p+=l}return c}});var ac=S((K0,oc)=>{"use strict";var ic=Qs();function Ig(t,e,n,r,s){for(let i=0;i<n;i++)r[s+i]=t[e+i]}function xg(t,e,n){let r=0,s=e+n;for(let i=e;i<s;i++)r+=Math.abs(t[i]);return r}function Rg(t,e,n,r,s,i){for(let o=0;o<n;o++){let a=o>=i?t[e+o-i]:0,l=t[e+o]-a;r[s+o]=l}}function Pg(t,e,n,r){let s=0;for(let i=0;i<n;i++){let o=i>=r?t[e+i-r]:0,a=t[e+i]-o;s+=Math.abs(a)}return s}function Ag(t,e,n,r,s){for(let i=0;i<n;i++){let o=e>0?t[e+i-n]:0,a=t[e+i]-o;r[s+i]=a}}function Og(t,e,n){let r=0,s=e+n;for(let i=e;i<s;i++){let o=e>0?t[i-n]:0,a=t[i]-o;r+=Math.abs(a)}return r}function Ng(t,e,n,r,s,i){for(let o=0;o<n;o++){let a=o>=i?t[e+o-i]:0,l=e>0?t[e+o-n]:0,c=t[e+o]-(a+l>>1);r[s+o]=c}}function Lg(t,e,n,r){let s=0;for(let i=0;i<n;i++){let o=i>=r?t[e+i-r]:0,a=e>0?t[e+i-n]:0,l=t[e+i]-(o+a>>1);s+=Math.abs(l)}return s}function Bg(t,e,n,r,s,i){for(let o=0;o<n;o++){let a=o>=i?t[e+o-i]:0,l=e>0?t[e+o-n]:0,c=e>0&&o>=i?t[e+o-(n+i)]:0,u=t[e+o]-ic(a,l,c);r[s+o]=u}}function Mg(t,e,n,r){let s=0;for(let i=0;i<n;i++){let o=i>=r?t[e+i-r]:0,a=e>0?t[e+i-n]:0,l=e>0&&i>=r?t[e+i-(n+r)]:0,c=t[e+i]-ic(o,a,l);s+=Math.abs(c)}return s}var Dg={0:Ig,1:Rg,2:Ag,3:Ng,4:Bg},$g={0:xg,1:Pg,2:Og,3:Lg,4:Mg};oc.exports=function(t,e,n,r,s){let i;if(!("filterType"in r)||r.filterType===-1)i=[0,1,2,3,4];else if(typeof r.filterType=="number")i=[r.filterType];else throw new Error("unrecognised filter types");r.bitDepth===16&&(s*=2);let o=e*s,a=0,l=0,c=Buffer.alloc((o+1)*n),u=i[0];for(let p=0;p<n;p++){if(i.length>1){let g=1/0;for(let f=0;f<i.length;f++){let h=$g[i[f]](t,l,o,s);h<g&&(u=i[f],g=h)}}c[a]=u,a++,Dg[u](t,l,o,c,a,s),a+=o,l+=o}return c}});var oi=S((W0,lc)=>{"use strict";var W=Mt(),Ug=ti(),Fg=sc(),jg=ac(),qg=v("zlib"),Fe=lc.exports=function(t){if(this._options=t,t.deflateChunkSize=t.deflateChunkSize||32*1024,t.deflateLevel=t.deflateLevel!=null?t.deflateLevel:9,t.deflateStrategy=t.deflateStrategy!=null?t.deflateStrategy:3,t.inputHasAlpha=t.inputHasAlpha!=null?t.inputHasAlpha:!0,t.deflateFactory=t.deflateFactory||qg.createDeflate,t.bitDepth=t.bitDepth||8,t.colorType=typeof t.colorType=="number"?t.colorType:W.COLORTYPE_COLOR_ALPHA,t.inputColorType=typeof t.inputColorType=="number"?t.inputColorType:W.COLORTYPE_COLOR_ALPHA,[W.COLORTYPE_GRAYSCALE,W.COLORTYPE_COLOR,W.COLORTYPE_COLOR_ALPHA,W.COLORTYPE_ALPHA].indexOf(t.colorType)===-1)throw new Error("option color type:"+t.colorType+" is not supported at present");if([W.COLORTYPE_GRAYSCALE,W.COLORTYPE_COLOR,W.COLORTYPE_COLOR_ALPHA,W.COLORTYPE_ALPHA].indexOf(t.inputColorType)===-1)throw new Error("option input color type:"+t.inputColorType+" is not supported at present");if(t.bitDepth!==8&&t.bitDepth!==16)throw new Error("option bit depth:"+t.bitDepth+" is not supported at present")};Fe.prototype.getDeflateOptions=function(){return{chunkSize:this._options.deflateChunkSize,level:this._options.deflateLevel,strategy:this._options.deflateStrategy}};Fe.prototype.createDeflate=function(){return this._options.deflateFactory(this.getDeflateOptions())};Fe.prototype.filterData=function(t,e,n){let r=Fg(t,e,n,this._options),s=W.COLORTYPE_TO_BPP_MAP[this._options.colorType];return jg(r,e,n,this._options,s)};Fe.prototype._packChunk=function(t,e){let n=e?e.length:0,r=Buffer.alloc(n+12);return r.writeUInt32BE(n,0),r.writeUInt32BE(t,4),e&&e.copy(r,8),r.writeInt32BE(Ug.crc32(r.slice(4,r.length-4)),r.length-4),r};Fe.prototype.packGAMA=function(t){let e=Buffer.alloc(4);return e.writeUInt32BE(Math.floor(t*W.GAMMA_DIVISION),0),this._packChunk(W.TYPE_gAMA,e)};Fe.prototype.packIHDR=function(t,e){let n=Buffer.alloc(13);return n.writeUInt32BE(t,0),n.writeUInt32BE(e,4),n[8]=this._options.bitDepth,n[9]=this._options.colorType,n[10]=0,n[11]=0,n[12]=0,this._packChunk(W.TYPE_IHDR,n)};Fe.prototype.packIDAT=function(t){return this._packChunk(W.TYPE_IDAT,t)};Fe.prototype.packIEND=function(){return this._packChunk(W.TYPE_IEND,null)}});var fc=S((H0,dc)=>{"use strict";var Kg=v("util"),cc=v("stream"),Wg=Mt(),Hg=oi(),uc=dc.exports=function(t){cc.call(this);let e=t||{};this._packer=new Hg(e),this._deflate=this._packer.createDeflate(),this.readable=!0};Kg.inherits(uc,cc);uc.prototype.pack=function(t,e,n,r){this.emit("data",Buffer.from(Wg.PNG_SIGNATURE)),this.emit("data",this._packer.packIHDR(e,n)),r&&this.emit("data",this._packer.packGAMA(r));let s=this._packer.filterData(t,e,n);this._deflate.on("error",this.emit.bind(this,"error")),this._deflate.on("data",function(i){this.emit("data",this._packer.packIDAT(i))}.bind(this)),this._deflate.on("end",function(){this.emit("data",this._packer.packIEND()),this.emit("end")}.bind(this)),this._deflate.end(s)}});var _c=S((dn,yc)=>{"use strict";var pc=v("assert").ok,Dt=v("zlib"),Vg=v("util"),hc=v("buffer").kMaxLength;function et(t){if(!(this instanceof et))return new et(t);t&&t.chunkSize<Dt.Z_MIN_CHUNK&&(t.chunkSize=Dt.Z_MIN_CHUNK),Dt.Inflate.call(this,t),this._offset=this._offset===void 0?this._outOffset:this._offset,this._buffer=this._buffer||this._outBuffer,t&&t.maxLength!=null&&(this._maxLength=t.maxLength)}function Gg(t){return new et(t)}function gc(t,e){e&&process.nextTick(e),t._handle&&(t._handle.close(),t._handle=null)}et.prototype._processChunk=function(t,e,n){if(typeof n=="function")return Dt.Inflate._processChunk.call(this,t,e,n);let r=this,s=t&&t.length,i=this._chunkSize-this._offset,o=this._maxLength,a=0,l=[],c=0,u;this.on("error",function(h){u=h});function p(h,y){if(r._hadError)return;let _=i-y;if(pc(_>=0,"have should not go down"),_>0){let w=r._buffer.slice(r._offset,r._offset+_);if(r._offset+=_,w.length>o&&(w=w.slice(0,o)),l.push(w),c+=w.length,o-=w.length,o===0)return!1}return(y===0||r._offset>=r._chunkSize)&&(i=r._chunkSize,r._offset=0,r._buffer=Buffer.allocUnsafe(r._chunkSize)),y===0?(a+=s-h,s=h,!0):!1}pc(this._handle,"zlib binding closed");let g;do g=this._handle.writeSync(e,t,a,s,this._buffer,this._offset,i),g=g||this._writeState;while(!this._hadError&&p(g[0],g[1]));if(this._hadError)throw u;if(c>=hc)throw gc(this),new RangeError("Cannot create final Buffer. It would be larger than 0x"+hc.toString(16)+" bytes");let f=Buffer.concat(l,c);return gc(this),f};Vg.inherits(et,Dt.Inflate);function Yg(t,e){if(typeof e=="string"&&(e=Buffer.from(e)),!(e instanceof Buffer))throw new TypeError("Not a string or buffer");let n=t._finishFlushFlag;return n==null&&(n=Dt.Z_FINISH),t._processChunk(e,n)}function mc(t,e){return Yg(new et(e),t)}yc.exports=dn=mc;dn.Inflate=et;dn.createInflate=Gg;dn.inflateSync=mc});var ai=S((V0,Sc)=>{"use strict";var wc=Sc.exports=function(t){this._buffer=t,this._reads=[]};wc.prototype.read=function(t,e){this._reads.push({length:Math.abs(t),allowLess:t<0,func:e})};wc.prototype.process=function(){for(;this._reads.length>0&&this._buffer.length;){let t=this._reads[0];if(this._buffer.length&&(this._buffer.length>=t.length||t.allowLess)){this._reads.shift();let e=this._buffer;this._buffer=e.slice(t.length),t.func.call(this,e.slice(0,t.length))}else break}if(this._reads.length>0)return new Error("There are some read requests waitng on finished stream");if(this._buffer.length>0)return new Error("unrecognised content at end of stream")}});var bc=S(Ec=>{"use strict";var zg=ai(),Jg=Zs();Ec.process=function(t,e){let n=[],r=new zg(t);return new Jg(e,{read:r.read.bind(r),write:function(i){n.push(i)},complete:function(){}}).start(),r.process(),Buffer.concat(n)}});var Cc=S((Y0,vc)=>{"use strict";var Tc=!0,kc=v("zlib"),Qg=_c();kc.deflateSync||(Tc=!1);var Zg=ai(),Xg=bc(),em=ni(),tm=ri(),nm=si();vc.exports=function(t,e){if(!Tc)throw new Error("To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0");let n;function r(T){n=T}let s;function i(T){s=T}function o(T){s.transColor=T}function a(T){s.palette=T}function l(){s.alpha=!0}let c;function u(T){c=T}let p=[];function g(T){p.push(T)}let f=new Zg(t);if(new em(e,{read:f.read.bind(f),error:r,metadata:i,gamma:u,palette:a,transColor:o,inflateData:g,simpleTransparency:l}).start(),f.process(),n)throw n;let y=Buffer.concat(p);p.length=0;let _;if(s.interlace)_=kc.inflateSync(y);else{let E=((s.width*s.bpp*s.depth+7>>3)+1)*s.height;_=Qg(y,{chunkSize:E,maxLength:E})}if(y=null,!_||!_.length)throw new Error("bad png - invalid inflate data response");let w=Xg.process(_,s);y=null;let R=tm.dataToBitMap(w,s);w=null;let B=nm(R,s);return s.data=B,s.gamma=c||0,s}});var Pc=S((z0,Rc)=>{"use strict";var Ic=!0,xc=v("zlib");xc.deflateSync||(Ic=!1);var rm=Mt(),sm=oi();Rc.exports=function(t,e){if(!Ic)throw new Error("To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0");let n=e||{},r=new sm(n),s=[];s.push(Buffer.from(rm.PNG_SIGNATURE)),s.push(r.packIHDR(t.width,t.height)),t.gamma&&s.push(r.packGAMA(t.gamma));let i=r.filterData(t.data,t.width,t.height),o=xc.deflateSync(i,r.getDeflateOptions());if(i=null,!o||!o.length)throw new Error("bad png - invalid compressed data response");return s.push(r.packIDAT(o)),s.push(r.packIEND()),Buffer.concat(s)}});var Ac=S(li=>{"use strict";var im=Cc(),om=Pc();li.read=function(t,e){return im(t,e||{})};li.write=function(t,e){return om(t,e)}});var Lc=S(Nc=>{"use strict";var am=v("util"),Oc=v("stream"),lm=nc(),cm=fc(),um=Ac(),H=Nc.PNG=function(t){Oc.call(this),t=t||{},this.width=t.width|0,this.height=t.height|0,this.data=this.width>0&&this.height>0?Buffer.alloc(4*this.width*this.height):null,t.fill&&this.data&&this.data.fill(0),this.gamma=0,this.readable=this.writable=!0,this._parser=new lm(t),this._parser.on("error",this.emit.bind(this,"error")),this._parser.on("close",this._handleClose.bind(this)),this._parser.on("metadata",this._metadata.bind(this)),this._parser.on("gamma",this._gamma.bind(this)),this._parser.on("parsed",function(e){this.data=e,this.emit("parsed",e)}.bind(this)),this._packer=new cm(t),this._packer.on("data",this.emit.bind(this,"data")),this._packer.on("end",this.emit.bind(this,"end")),this._parser.on("close",this._handleClose.bind(this)),this._packer.on("error",this.emit.bind(this,"error"))};am.inherits(H,Oc);H.sync=um;H.prototype.pack=function(){return!this.data||!this.data.length?(this.emit("error","No data provided"),this):(process.nextTick(function(){this._packer.pack(this.data,this.width,this.height,this.gamma)}.bind(this)),this)};H.prototype.parse=function(t,e){if(e){let n,r;n=function(s){this.removeListener("error",r),this.data=s,e(null,this)}.bind(this),r=function(s){this.removeListener("parsed",n),e(s,null)}.bind(this),this.once("parsed",n),this.once("error",r)}return this.end(t),this};H.prototype.write=function(t){return this._parser.write(t),!0};H.prototype.end=function(t){this._parser.end(t)};H.prototype._metadata=function(t){this.width=t.width,this.height=t.height,this.emit("metadata",t)};H.prototype._gamma=function(t){this.gamma=t};H.prototype._handleClose=function(){!this._parser.writable&&!this._packer.readable&&this.emit("close")};H.bitblt=function(t,e,n,r,s,i,o,a){if(n|=0,r|=0,s|=0,i|=0,o|=0,a|=0,n>t.width||r>t.height||n+s>t.width||r+i>t.height)throw new Error("bitblt reading outside image");if(o>e.width||a>e.height||o+s>e.width||a+i>e.height)throw new Error("bitblt writing outside image");for(let l=0;l<i;l++)t.data.copy(e.data,(a+l)*e.width+o<<2,(r+l)*t.width+n<<2,(r+l)*t.width+n+s<<2)};H.prototype.bitblt=function(t,e,n,r,s,i,o){return H.bitblt(this,t,e,n,r,s,i,o),this};H.adjustGamma=function(t){if(t.gamma){for(let e=0;e<t.height;e++)for(let n=0;n<t.width;n++){let r=t.width*e+n<<2;for(let s=0;s<3;s++){let i=t.data[r+s]/255;i=Math.pow(i,1/2.2/t.gamma),t.data[r+s]=Math.round(i*255)}}t.gamma=0}};H.prototype.adjustGamma=function(){H.adjustGamma(this)}});var fn=S(tt=>{function Bc(t){if(typeof t=="number"&&(t=t.toString()),typeof t!="string")throw new Error("Color should be defined as hex string");let e=t.slice().replace("#","").split("");if(e.length<3||e.length===5||e.length>8)throw new Error("Invalid hex color: "+t);(e.length===3||e.length===4)&&(e=Array.prototype.concat.apply([],e.map(function(r){return[r,r]}))),e.length===6&&e.push("F","F");let n=parseInt(e.join(""),16);return{r:n>>24&255,g:n>>16&255,b:n>>8&255,a:n&255,hex:"#"+e.slice(0,6).join("")}}tt.getOptions=function(e){e||(e={}),e.color||(e.color={});let n=typeof e.margin>"u"||e.margin===null||e.margin<0?4:e.margin,r=e.width&&e.width>=21?e.width:void 0,s=e.scale||4;return{width:r,scale:r?4:s,margin:n,color:{dark:Bc(e.color.dark||"#000000ff"),light:Bc(e.color.light||"#ffffffff")},type:e.type,rendererOpts:e.rendererOpts||{}}};tt.getScale=function(e,n){return n.width&&n.width>=e+n.margin*2?n.width/(e+n.margin*2):n.scale};tt.getImageWidth=function(e,n){let r=tt.getScale(e,n);return Math.floor((e+n.margin*2)*r)};tt.qrToImageData=function(e,n,r){let s=n.modules.size,i=n.modules.data,o=tt.getScale(s,r),a=Math.floor((s+r.margin*2)*o),l=r.margin*o,c=[r.color.light,r.color.dark];for(let u=0;u<a;u++)for(let p=0;p<a;p++){let g=(u*a+p)*4,f=r.color.light;if(u>=l&&p>=l&&u<a-l&&p<a-l){let h=Math.floor((u-l)/o),y=Math.floor((p-l)/o);f=c[i[h*s+y]?1:0]}e[g++]=f.r,e[g++]=f.g,e[g++]=f.b,e[g]=f.a}}});var Mc=S(ge=>{var dm=v("fs"),fm=Lc().PNG,ci=fn();ge.render=function(e,n){let r=ci.getOptions(n),s=r.rendererOpts,i=ci.getImageWidth(e.modules.size,r);s.width=i,s.height=i;let o=new fm(s);return ci.qrToImageData(o.data,e,r),o};ge.renderToDataURL=function(e,n,r){typeof r>"u"&&(r=n,n=void 0),ge.renderToBuffer(e,n,function(s,i){s&&r(s);let o="data:image/png;base64,";o+=i.toString("base64"),r(null,o)})};ge.renderToBuffer=function(e,n,r){typeof r>"u"&&(r=n,n=void 0);let s=ge.render(e,n),i=[];s.on("error",r),s.on("data",function(o){i.push(o)}),s.on("end",function(){r(null,Buffer.concat(i))}),s.pack()};ge.renderToFile=function(e,n,r,s){typeof s>"u"&&(s=r,r=void 0);let i=!1,o=(...l)=>{i||(i=!0,s.apply(null,l))},a=dm.createWriteStream(e);a.on("error",o),a.on("close",o),ge.renderToFileStream(a,n,r)};ge.renderToFileStream=function(e,n,r){ge.render(n,r).pack().pipe(e)}});var Dc=S(gr=>{var pm=fn(),hm={WW:" ",WB:"\u2584",BB:"\u2588",BW:"\u2580"},gm={BB:" ",BW:"\u2584",WW:"\u2588",WB:"\u2580"};function mm(t,e,n){return t&&e?n.BB:t&&!e?n.BW:!t&&e?n.WB:n.WW}gr.render=function(t,e,n){let r=pm.getOptions(e),s=hm;(r.color.dark.hex==="#ffffff"||r.color.light.hex==="#000000")&&(s=gm);let i=t.modules.size,o=t.modules.data,a="",l=Array(i+r.margin*2+1).join(s.WW);l=Array(r.margin/2+1).join(l+`
52
+ `);let c=Array(r.margin+1).join(s.WW);a+=l;for(let u=0;u<i;u+=2){a+=c;for(let p=0;p<i;p++){let g=o[u*i+p],f=o[(u+1)*i+p];a+=mm(g,f,s)}a+=c+`
53
+ `}return a+=l.slice(0,-1),typeof n=="function"&&n(null,a),a};gr.renderToFile=function(e,n,r,s){typeof s>"u"&&(s=r,r=void 0);let i=v("fs"),o=gr.render(n,r);i.writeFile(e,o,s)}});var Uc=S($c=>{$c.render=function(t,e,n){let r=t.modules.size,s=t.modules.data,i="\x1B[40m \x1B[0m",o="\x1B[47m \x1B[0m",a="",l=Array(r+3).join(o),c=Array(2).join(o);a+=l+`
54
+ `;for(let u=0;u<r;++u){a+=o;for(let p=0;p<r;p++)a+=s[u*r+p]?i:o;a+=c+`
55
+ `}return a+=l+`
56
+ `,typeof n=="function"&&n(null,a),a}});var Kc=S(qc=>{var ym="\x1B[47m",_m="\x1B[40m",ui="\x1B[37m",di="\x1B[30m",nt="\x1B[0m",wm=ym+di,Sm=_m+ui,Em=function(t,e,n){return{"00":nt+" "+t,"01":nt+e+"\u2584"+t,"02":nt+n+"\u2584"+t,10:nt+e+"\u2580"+t,11:" ",12:"\u2584",20:nt+n+"\u2580"+t,21:"\u2580",22:"\u2588"}},Fc=function(t,e,n,r){let s=e+1;if(n>=s||r>=s||r<-1||n<-1)return"0";if(n>=e||r>=e||r<0||n<0)return"1";let i=r*e+n;return t[i]?"2":"1"},jc=function(t,e,n,r){return Fc(t,e,n,r)+Fc(t,e,n,r+1)};qc.render=function(t,e,n){let r=t.modules.size,s=t.modules.data,i=!!(e&&e.inverse),o=e&&e.inverse?Sm:wm,c=Em(o,i?di:ui,i?ui:di),u=nt+`
57
+ `+o,p=o;for(let g=-1;g<r+1;g+=2){for(let f=-1;f<r;f++)p+=c[jc(s,r,f,g)];p+=c[jc(s,r,r,g)]+u}return p+=nt,typeof n=="function"&&n(null,p),p}});var Hc=S(Wc=>{var bm=Uc(),Tm=Kc();Wc.render=function(t,e,n){return e&&e.small?Tm.render(t,e,n):bm.render(t,e,n)}});var pi=S(Gc=>{var km=fn();function Vc(t,e){let n=t.a/255,r=e+'="'+t.hex+'"';return n<1?r+" "+e+'-opacity="'+n.toFixed(2).slice(1)+'"':r}function fi(t,e,n){let r=t+e;return typeof n<"u"&&(r+=" "+n),r}function vm(t,e,n){let r="",s=0,i=!1,o=0;for(let a=0;a<t.length;a++){let l=Math.floor(a%e),c=Math.floor(a/e);!l&&!i&&(i=!0),t[a]?(o++,a>0&&l>0&&t[a-1]||(r+=i?fi("M",l+n,.5+c+n):fi("m",s,0),s=0,i=!1),l+1<e&&t[a+1]||(r+=fi("h",o),o=0)):s++}return r}Gc.render=function(e,n,r){let s=km.getOptions(n),i=e.modules.size,o=e.modules.data,a=i+s.margin*2,l=s.color.light.a?"<path "+Vc(s.color.light,"fill")+' d="M0 0h'+a+"v"+a+'H0z"/>':"",c="<path "+Vc(s.color.dark,"stroke")+' d="'+vm(o,i,s.margin)+'"/>',u='viewBox="0 0 '+a+" "+a+'"',g='<svg xmlns="http://www.w3.org/2000/svg" '+(s.width?'width="'+s.width+'" height="'+s.width+'" ':"")+u+' shape-rendering="crispEdges">'+l+c+`</svg>
58
+ `;return typeof r=="function"&&r(null,g),g}});var Yc=S(mr=>{var Cm=pi();mr.render=Cm.render;mr.renderToFile=function(e,n,r,s){typeof s>"u"&&(s=r,r=void 0);let i=v("fs"),a='<?xml version="1.0" encoding="utf-8"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">'+mr.render(n,r);i.writeFile(e,a,s)}});var zc=S(yr=>{var hi=fn();function Im(t,e,n){t.clearRect(0,0,e.width,e.height),e.style||(e.style={}),e.height=n,e.width=n,e.style.height=n+"px",e.style.width=n+"px"}function xm(){try{return document.createElement("canvas")}catch{throw new Error("You need to specify a canvas element")}}yr.render=function(e,n,r){let s=r,i=n;typeof s>"u"&&(!n||!n.getContext)&&(s=n,n=void 0),n||(i=xm()),s=hi.getOptions(s);let o=hi.getImageWidth(e.modules.size,s),a=i.getContext("2d"),l=a.createImageData(o,o);return hi.qrToImageData(l.data,e,s),Im(a,i,o),a.putImageData(l,0,0),i};yr.renderToDataURL=function(e,n,r){let s=r;typeof s>"u"&&(!n||!n.getContext)&&(s=n,n=void 0),s||(s={});let i=yr.render(e,n,s),o=s.type||"image/png",a=s.rendererOpts||{};return i.toDataURL(o,a.quality)}});var Qc=S(pn=>{var Rm=xs(),gi=Gs(),Jc=zc(),Pm=pi();function mi(t,e,n,r,s){let i=[].slice.call(arguments,1),o=i.length,a=typeof i[o-1]=="function";if(!a&&!Rm())throw new Error("Callback required as last argument");if(a){if(o<2)throw new Error("Too few arguments provided");o===2?(s=n,n=e,e=r=void 0):o===3&&(e.getContext&&typeof s>"u"?(s=r,r=void 0):(s=r,r=n,n=e,e=void 0))}else{if(o<1)throw new Error("Too few arguments provided");return o===1?(n=e,e=r=void 0):o===2&&!e.getContext&&(r=n,n=e,e=void 0),new Promise(function(l,c){try{let u=gi.create(n,r);l(t(u,e,r))}catch(u){c(u)}})}try{let l=gi.create(n,r);s(null,t(l,e,r))}catch(l){s(l)}}pn.create=gi.create;pn.toCanvas=mi.bind(null,Jc.render);pn.toDataURL=mi.bind(null,Jc.renderToDataURL);pn.toString=mi.bind(null,function(t,e,n){return Pm.render(t,n)})});var tu=S(je=>{var Zc=xs(),yi=Gs(),Am=Mc(),Xc=Dc(),Om=Hc(),eu=Yc();function hn(t,e,n){if(typeof t>"u")throw new Error("String required as first argument");if(typeof n>"u"&&(n=e,e={}),typeof n!="function")if(Zc())e=n||{},n=null;else throw new Error("Callback required as last argument");return{opts:e,cb:n}}function Nm(t){return t.slice((t.lastIndexOf(".")-1>>>0)+2).toLowerCase()}function _r(t){switch(t){case"svg":return eu;case"txt":case"utf8":return Xc;default:return Am}}function Lm(t){switch(t){case"svg":return eu;case"terminal":return Om;default:return Xc}}function gn(t,e,n){if(!n.cb)return new Promise(function(r,s){try{let i=yi.create(e,n.opts);return t(i,n.opts,function(o,a){return o?s(o):r(a)})}catch(i){s(i)}});try{let r=yi.create(e,n.opts);return t(r,n.opts,n.cb)}catch(r){n.cb(r)}}je.create=yi.create;je.toCanvas=Qc().toCanvas;je.toString=function(e,n,r){let s=hn(e,n,r),i=s.opts?s.opts.type:void 0,o=Lm(i);return gn(o.render,e,s)};je.toDataURL=function(e,n,r){let s=hn(e,n,r),i=_r(s.opts.type);return gn(i.renderToDataURL,e,s)};je.toBuffer=function(e,n,r){let s=hn(e,n,r),i=_r(s.opts.type);return gn(i.renderToBuffer,e,s)};je.toFile=function(e,n,r,s){if(typeof e!="string"||!(typeof n=="string"||typeof n=="object"))throw new Error("Invalid argument");if(arguments.length<3&&!Zc())throw new Error("Too few arguments provided");let i=hn(n,r,s),o=i.opts.type||Nm(e),l=_r(o).renderToFile.bind(null,e);return gn(l,n,i)};je.toFileStream=function(e,n,r){if(arguments.length<2)throw new Error("Too few arguments provided");let s=hn(n,r,e.emit.bind(e,"error")),o=_r("png").renderToFileStream.bind(null,e);gn(o,n,s)}});var ru=S((cw,nu)=>{nu.exports=tu()});at();lt();import Zm from"crypto";import{execFile as bu}from"child_process";var pf=st(Do(),1),hf=st(Fr(),1),gf=st(Kr(),1),Go=st(Nn(),1),mf=st(Vo(),1);var mt=Go.default;at();lt();ze();xt();St();fe();var gh=new Set(["session_history_response","sessions_response","projects_response"]);function mh(){return!0}function te(t){if(d.ws&&d.ws.readyState===mt.OPEN){let e=t;if(d.sharedSecret&&Ye.has(t.type)&&t.payload){let{payload:r,...s}=t,i={...r,_ts:Date.now()},o=mh()&&gh.has(t.type);e={...s,encrypted:Oa(i,d.sharedSecret,o)}}else if(!d.sharedSecret&&Ye.has(t.type)&&t.payload)return console.warn(m.yellow(` Dropped ${t.type}: no encryption key available`)),!1;let n=JSON.stringify({...e,version:z});return d.ws.send(n),!0}else return console.error(m.red(` Message dropped (not connected): ${t.type}`)),!1}function sr(t=1e4){return new Promise(e=>{if(d.ws&&d.ws.readyState===mt.OPEN){e(!0);return}let n=setInterval(()=>{d.ws&&d.ws.readyState===mt.OPEN&&(clearInterval(n),clearTimeout(r),e(!0))},100),r=setTimeout(()=>{clearInterval(n),e(!1)},t)})}function Is(t=1e4){return new Promise(e=>{let n=setTimeout(()=>{d.registeredResolve=null,e(!1)},t);d.registeredResolve=()=>{clearTimeout(n),e(!0)}})}var yh=Rr*2.5;function _h(){Ya(),d.lastMessageAt=Date.now(),d.heartbeatTimer=setInterval(()=>{if(d.lastMessageAt&&Date.now()-d.lastMessageAt>yh){console.log(m.yellow(" Relay unresponsive \u2014 forcing reconnect")),d.ws?.close();return}te({type:"heartbeat",sessionId:null,timestamp:Date.now(),payload:{activeSessions:Oe().getActiveSessions()}})},Rr)}function Ya(){d.heartbeatTimer&&(clearInterval(d.heartbeatTimer),d.heartbeatTimer=null)}function Je(){if(d.shuttingDown)return;d.machine.state==="disconnected"&&d.machine.transition({type:"CONNECT"});let t=xr,e={};d.deviceToken&&(e.Authorization=`Bearer ${d.deviceToken}`),d.ws=new mt(t,{headers:e});let n=!1;d.ws.on("open",()=>{d.machine.transition({type:"WS_OPEN"}),te({type:"register",payload:{role:"desktop",deviceId:d.deviceId,projectName:Vn(),projects:d.projects.map(r=>({name:r.name})),publicKey:Y(pe(d.ownKeyPair.publicKey))}}),_h()}),d.ws.on("message",async r=>{d.lastMessageAt=Date.now();let s=await ks(r.toString(),te,d.projects,Oe());s.projects.length>0&&(d.projects=s.projects),d.disconnectedByRemote&&d.ws?.readyState===mt.OPEN&&d.ws.close()}),d.ws.on("close",(r,s)=>{if(Ya(),d.shuttingDown)return;let i=s?.toString()||"";if(console.log(m.dim(` WS close: code=${r} reason="${i}" machine=${d.machine.state}`)),d.inSetupMode){setTimeout(()=>Je(),1e3);return}if(d.machine.state==="disconnected"){d.enterSetupMode?.();return}d.machine.transition({type:"WS_CLOSE",networkError:n})==="reconnecting"&&(console.log(m.yellow(" Disconnected from relay")),wh())}),d.ws.on("error",r=>{if(d.shuttingDown)return;let s=r.message||"";(s.includes("ENOTFOUND")||s.includes("ETIMEDOUT")||s.includes("ENETUNREACH")||s.includes("ECONNREFUSED")||s.includes("EAI_AGAIN"))&&(n=!0),console.error(m.red(` Connection error: ${r.message}`))})}function wh(){let t=d.reconnectDelay;console.log(m.dim(` Reconnecting in ${t/1e3}s...`)),setTimeout(()=>{d.machine.context.reconnectDelay=Cs(d.machine.context.reconnectDelay,Fi),d.machine.transition({type:"RECONNECT_TIMER"}),Je()},t)}at();var au=st(ru(),1);lt();import{createInterface as Mm}from"readline";xt();fe();fe();lt();var _i=Et;function su(t){_i=t}async function iu(t,e){let n=await fetch(`${_i}/v1/pairing/request`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({publicKey:t,deviceId:e,version:z}),signal:AbortSignal.timeout(15e3)});if(!n.ok)throw new Error(`Pairing request failed: ${n.status} ${n.statusText}`);return n.json()}async function ou(t,e){let n=await fetch(`${_i}/v1/pairing/status?code=${encodeURIComponent(t)}&token=${encodeURIComponent(e)}`,{signal:AbortSignal.timeout(1e4)});if(!n.ok)throw new Error(`Pairing status check failed: ${n.status} ${n.statusText}`);return n.json()}ze();oe();zt();function Bm(t){let e=au.default.create(t,{errorCorrectionLevel:"M"}),n=e.modules.size,r=e.modules.data,s=(l,c)=>l>=0&&l<n&&c>=0&&c<n&&!!r[c*n+l],i=(l,c)=>`\x1B[${l?"30":"37"};${c?"40":"47"}m\u2580\x1B[0m`,o=[],a=1;for(let l=-a;l<n+a;l+=2){let c="";for(let u=-a;u<n+a;u++)c+=i(s(u,l),s(u,l+1));o.push(c)}return o.join(`
59
+ `)}var wi=M("pairing");function lu(t){return new Promise(e=>{if(!process.stdin.isTTY){let s=Mm({input:process.stdin,output:process.stdout});s.question(t,i=>{s.close(),e(i.trim())});return}process.stdout.write(t),process.stdin.removeAllListeners("data"),process.stdin.setRawMode(!0),process.stdin.resume(),process.stdin.setEncoding("utf8");let n="",r=s=>{let i=s.charCodeAt(0);s==="\r"||s===`
60
+ `?(process.stdin.setRawMode(!1),process.stdin.pause(),process.stdin.removeListener("data",r),process.stdout.write(`
61
+ `),e(n.trim())):i===127||i===8?n.length>0&&(n=n.slice(0,-1),process.stdout.write("\b \b")):i===3?(process.stdin.setRawMode(!1),process.stdin.pause(),process.stdin.removeListener("data",r),process.stdout.write(`
62
+ `),process.emit("SIGINT")):i>=32&&(n+=s,process.stdout.write("*"))};process.stdin.on("data",r)})}function Dm(t=3e4){return new Promise((e,n)=>{d.verifyCodeResolve=e,setTimeout(()=>{d.verifyCodeResolve===e&&(d.verifyCodeResolve=null,n(new Error("timeout")))},t)})}async function wr(){if(d.inSetupMode)return;let t=!!(d.deviceToken&&d.sharedSecret&&d.peerPublicKey);d.machine.transition({type:"ENTER_SETUP",hasSavedState:t}),await $m()}async function $m(){if(d.deviceToken&&d.sharedSecret&&d.peerPublicKey){console.log(m.yellow(" Attempting to reconnect with saved pairing..."));let e=5,n=2e3;for(let r=1;r<=e;r++){if(await new Promise(i=>setTimeout(i,n)),n=Math.min(n*2,3e4),Je(),await sr(15e3)&&await Is(1e4)){console.log(m.green(" Reconnected with saved pairing!"));return}try{d.ws?.close()}catch{}r<e&&console.log(m.dim(` Reconnect attempt ${r}/${e} failed, retrying in ${n/1e3}s...`))}d.machine.transition({type:"SETUP_RECONNECT_FAILED"}),console.log(m.yellow(" Could not reconnect \u2014 starting fresh pairing...")),console.log()}let t=5e3;for(;;){let e=D();e&&e.deviceToken&&(wi.warn("Clearing deviceToken from config (reason: fresh pairing after reconnect failure)"),U("token_cleared","authentication","warn","Token cleared for fresh pairing after reconnect failure",{reason:"fresh_pairing_after_reconnect_failure"}),delete e.deviceToken,G(e)),d.deviceToken="",wi.warn("Clearing peerPublicKey and sharedSecret (reason: fresh pairing after reconnect failure)"),U("crypto_state_cleared","crypto","warn","Cleared peerPublicKey and sharedSecret for fresh pairing",{reason:"fresh_pairing"}),d.peerPublicKey=null,d.sharedSecret=null,d.ownKeyPair||(d.ownKeyPair=en(),It({publicKey:Y(pe(d.ownKeyPair.publicKey)),secretKey:Y(d.ownKeyPair.secretKey.export({format:"der",type:"pkcs8"}))}));let n=Y(pe(d.ownKeyPair.publicKey)),r,s;try{let h=await iu(n,d.deviceId);r=h.pairingCode,s=h.pollToken,t=5e3}catch(h){console.error(m.red(` Pairing request failed: ${h}`)),console.log(m.dim(` Retrying in ${t/1e3}s...`)),await new Promise(y=>setTimeout(y,t)),t=Math.min(t*2,6e4);continue}let i=JSON.stringify({c:r,k:n});console.log(),console.log(" Scan this QR code in your BeachViber App (app.beachviber.com) to pair:"),console.log();try{let y=(await Bm(i)).split(`
63
+ `).map(_=>" "+_).join(`
64
+ `);console.log(y)}catch{}console.log(m.bold(" Sign-Up at app.beachviber.com \u2192 Add Computer \u2192 Scan QR Code")),console.log(" Or enter code manually: "+m.cyan(r)),console.log();let o=3e3,a=600*1e3,l=Date.now(),c=!1;for(;Date.now()-l<a;){try{let h=await ou(r,s);if(h.status==="claimed"&&h.deviceToken){d.deviceToken=h.deviceToken;let y=D()||{deviceId:bt()};y.deviceToken=d.deviceToken,wi.info(`Saving deviceToken to config (reason: pairing claimed, len=${d.deviceToken.length})`),U("pairing_claimed","pairing","info","Pairing claimed - device token received",{tokenLength:d.deviceToken.length}),G(y),h.claimerPublicKey&&d.ownKeyPair&&(d.peerPublicKey=tn(Ct(h.claimerPublicKey)),d.sharedSecret=er(d.peerPublicKey,d.ownKeyPair.secretKey)),console.log(m.green(" Phone scanned QR code")+" "+m.green("[claimed]"));break}if(h.status==="expired"){console.log(m.yellow(" Pairing code expired.")),c=!0;break}}catch(h){console.error(m.red(` Poll error: ${h}`))}await new Promise(h=>setTimeout(h,o))}if(c)continue;if(!d.deviceToken){console.log(m.yellow(" Pairing timed out."));continue}if(Je(),!await sr()){console.log(m.red(" Failed to connect to relay. Retrying setup..."));continue}if(!await Is()){console.log(m.red(" Registration timed out. Retrying setup..."));continue}let g=3,f=!1;for(let h=1;h<=g;h++){console.log();let y=await lu(m.bold(" Enter the connection password from your BeachViber App: "));if(!y)continue;console.log(m.dim(" Verifying..."));let _=null,w,R=3;for(let B=0;B<R;B++)if(!((!d.ws||d.ws.readyState!==1)&&(console.log(m.dim(" Reconnecting to relay...")),!await sr(5e3)))){w=await ys(y,d.deviceId),te({type:"verify_code",sessionId:null,timestamp:Date.now(),payload:{code:y,codeHash:w,protocolVersion:3,appVersion:z,capabilities:["wake"],deviceMeta:{name:Vn(),projectCount:d.projects.length,sessionCount:d.projects.reduce((T,E)=>T+E.sessionCount,0)}}});try{_=await Dm(15e3);break}catch{B<R-1&&console.log(m.dim(" No response from phone, retrying..."))}}if(!_){console.log(m.yellow(" Phone did not respond. Check your webapp connection and try again."));continue}if(_.success){if(typeof _.appVersion=="string"&&(d.peerAppVersion=_.appVersion),Array.isArray(_.capabilities)&&(d.peerCapabilities=_.capabilities),!d.sharedSecret){console.log(m.red(" Key exchange failed \u2014 shared secret was not established during pairing claim.")),console.log(m.red(" Ensure your BeachViber App is up to date (protocol v3 required)."));break}d.machine.transition({type:"PAIRED"}),U("pairing_completed","pairing","info","Pairing completed - end-to-end encryption active",{});let B=Y(pe(d.peerPublicKey));if(It({publicKey:Y(pe(d.ownKeyPair.publicKey)),secretKey:Y(d.ownKeyPair.secretKey.export({format:"der",type:"pkcs8"})),peerPublicKey:B}),w){let T=D();T&&(T.wakePasswordHash=w,G(T));let E=Qt();d.wakeExpiresAt=Date.now()+E*36e5,Ae(d.wakeExpiresAt),d.wakeTimer=setTimeout(()=>{Promise.resolve().then(()=>(ze(),rr)).then(({transitionToSleep:b})=>{b("timer_expired",te)})},E*36e5)}console.log(m.green(" Paired with BeachViber App".padEnd(50))+m.green("[encrypted]")),w&&console.log(m.green(" Wake password set \u2014 awake session started")),console.log(),console.log(m.bold.green(" \u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")),console.log(m.bold.green(" \u2502 \u{1F512} End-to-end encryption active \u2502")),console.log(m.bold.green(" \u2502 \u2502")),console.log(m.bold.green(" \u2502")+m.dim(" All messages between this device and your ")+m.bold.green("\u2502")),console.log(m.bold.green(" \u2502")+m.dim(" phone are encrypted. No one \u2014 not even the ")+m.bold.green("\u2502")),console.log(m.bold.green(" \u2502")+m.dim(" relay server \u2014 can read them. ")+m.bold.green("\u2502")),console.log(m.bold.green(" \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518")),console.log(),await vs(te),f=!0;break}h<g?console.log(m.red(" Password didn't match. Please try again.")):console.log(m.red(" Password didn't match after 3 attempts. Restarting setup..."))}if(f)return}}var rt=!1;function cu(){if(rt||d.wakeState!=="sleeping"||!de()||!process.stdin.isTTY)return;rt=!0,console.log(m.dim(" Type your connection password to unlock, or unlock from the app."));let{wakeLockout:t}=d,e=()=>{if(t.lockedUntil){if(Date.now()<t.lockedUntil){let n=Math.ceil((t.lockedUntil-Date.now())/6e4);console.log(m.red(` Locked out. Try again in ${n} minute${n!==1?"s":""}.`));let r=t.lockedUntil-Date.now();setTimeout(()=>{d.wakeState==="sleeping"?e():rt=!1},r+1e3);return}t.failedAttempts=0,t.lockedUntil=null}lu(m.dim(" Password: ")).then(async n=>{if(d.wakeState!=="sleeping"){rt=!1;return}if(!n){e();return}let r=D();if(!r?.wakePasswordHash){rt=!1;return}let s=await ys(n,d.deviceId);if(n="",tr(s,r.wakePasswordHash)){let i=Qt(),o=i*60*60*1e3,a=Date.now()+o;d.machine.state==="paired_sleeping"&&d.machine.transition({type:"WAKE"}),d.wakeExpiresAt=a,Ae(a),t.failedAttempts=0,t.lockedUntil=null,d.wakeTimer&&clearTimeout(d.wakeTimer),d.wakeTimer=setTimeout(()=>{Promise.resolve().then(()=>(ze(),rr)).then(({transitionToSleep:c})=>{c("timer_expired",te)})},o);let l=new Date().toLocaleTimeString();Le(["UNLOCKED",`Unlocked for ${i} hours.`],c=>m.green(c)),console.log(m.dim(` ${l}`)),console.log(),te({type:"wake_ack",sessionId:null,timestamp:Date.now(),payload:{success:!0,expiresAt:a,duration:i}}),rt=!1}else{t.failedAttempts++;let i=t.failedAttempts;if(i>=10){t.lockedUntil=Date.now()+1800*1e3,console.log(m.red(" Too many failed attempts \u2014 locked out for 30 minutes."));let a=t.lockedUntil-Date.now();setTimeout(()=>{d.wakeState==="sleeping"?e():rt=!1},a+1e3);return}let o=10-i;if(console.log(m.red(` Wrong password. ${o} attempt${o!==1?"s":""} remaining.`)),i>=6){let a=Math.pow(2,i-5)*1e3;await new Promise(l=>setTimeout(l,a))}e()}})};e()}ze();Fn();fe();xt();St();oe();zt();ws();ms();import{execFileSync as Um}from"child_process";var uu="2.0.0";function du(t){let e=t.trim().match(/^(\d+)\.(\d+)\.(\d+)/);return e?{raw:e[0],major:parseInt(e[1],10),minor:parseInt(e[2],10),patch:parseInt(e[3],10)}:null}function Fm(t,e){return t.major!==e.major?t.major<e.major?-1:1:t.minor!==e.minor?t.minor<e.minor?-1:1:t.patch!==e.patch?t.patch<e.patch?-1:1:0}function fu(){let t=du(uu),e;try{e=Um("claude",["--version"],{encoding:"utf-8",timeout:5e3,shell:process.platform==="win32",env:{...process.env,CLAUDECODE:""}}).trim()}catch(r){let s=r.message||String(r);return s.includes("ENOENT")?{ok:!1,installed:null,required:t,error:"Claude Code CLI not found. Install it: npm install -g @anthropic-ai/claude-code"}:{ok:!1,installed:null,required:t,error:`Failed to check Claude version: ${s}`}}let n=du(e);return n?Fm(n,t)<0?{ok:!1,installed:n,required:t,error:`Claude Code CLI ${n.raw} is too old. BeachViber requires ${uu}+ for remote tool approvals. Update with: claude update`}:{ok:!0,installed:n,required:t}:{ok:!1,installed:null,required:t,error:`Could not parse Claude version from: "${e}"`}}import{readFileSync as jm}from"fs";import{dirname as qm,join as Km}from"path";import{fileURLToPath as Wm}from"url";var Hm=1e4,Vm=Km(qm(Wm(import.meta.url)),"..","package.json"),mn=null;function pu(){try{let t=jm(Vm,"utf-8");return JSON.parse(t).version}catch{return null}}function hu(t){if(!process.env.BEACHVIBER_MANAGED)return;let e=pu();if(!e){console.log(" Updates disabled (could not read package.json)");return}console.log(` Updates polling (v${e})`),mn=setInterval(()=>{let n=pu();n&&n!==e&&(console.log(`
65
+ Update detected: v${e} \u2192 v${n}`),t(42))},Hm),mn.unref()}function gu(){mn&&(clearInterval(mn),mn=null)}fe();oe();import Si from"net";import Gm from"crypto";import Ei from"fs";import Ym from"path";var Sr=M("ipc-control"),zm=64*1024,Jm=5e3,Qm=10,Er=process.platform==="win32",Te=null,me="";function mu(){let t=Q();return Er?`\\\\.\\pipe\\beachviber-control-${Gm.createHash("sha256").update(V()).digest("hex").slice(0,8)}${t}`:Ym.join(V(),`control${t}.sock`)}function yu(t){if(Te)return;if(me=mu(),!Er){let n=V();Ei.mkdirSync(n,{recursive:!0,mode:448});try{Ei.unlinkSync(me)}catch{}}let e=new Set;if(Te=Si.createServer({allowHalfOpen:!0},n=>{if(e.size>=Qm){n.destroy();return}e.add(n),n.on("close",()=>e.delete(n));let r="",s=0,i=!1;n.setTimeout(Jm,()=>{n.destroy()});let o=async()=>{if(i)return;i=!0;let a;try{a=JSON.parse(r)}catch{n.write(JSON.stringify({ok:!1,message:"Invalid JSON"})+`
66
+ `),n.end();return}if(!a.type||typeof a.type!="string"){n.write(JSON.stringify({ok:!1,message:"Missing command type"})+`
67
+ `),n.end();return}try{let l=await t(a);n.write(JSON.stringify(l)+`
68
+ `)}catch(l){Sr.error(`Command handler error: ${l}`),n.write(JSON.stringify({ok:!1,message:"Internal error"})+`
69
+ `)}n.end()};n.on("data",a=>{if(s+=a.length,s>zm){n.write(JSON.stringify({ok:!1,message:"Request too large"})+`
70
+ `),n.end();return}r+=a.toString(),r.includes(`
71
+ `)&&(r=r.trim(),o())}),n.on("end",()=>{r=r.trim(),o()}),n.on("error",()=>{})}),Er)Te.on("error",n=>{if(n.code!=="EADDRINUSE")throw n;let r=Si.createConnection(me,()=>{r.destroy(),Sr.error("Another instance is already running (pipe in use).")});r.on("error",()=>{Sr.info("Stale pipe detected, retrying..."),setTimeout(()=>Te?.listen(me),500)})}),Te.listen(me);else{let n=process.umask(127);Te.listen(me,()=>{process.umask(n)})}Sr.info(`Control server listening on ${me}`)}function bi(t,e=5e3){let n=mu();return new Promise((r,s)=>{let i=Si.createConnection(n,()=>{i.write(JSON.stringify(t)+`
72
+ `)}),o="",a=setTimeout(()=>{i.destroy(),s(new Error("IPC timeout"))},e);i.on("data",l=>{o+=l.toString()}),i.on("end",()=>{clearTimeout(a);try{r(JSON.parse(o.trim()))}catch{s(new Error("Invalid response from control server"))}}),i.on("error",l=>{clearTimeout(a),s(l)})})}function _u(){if(Te&&(Te.close(),Te=null),!Er&&me)try{Ei.unlinkSync(me)}catch{}me=""}var Tu=process.argv.slice(2),wu=Tu.indexOf("--profile");if(wu!==-1){let t=Tu[wu+1];(!t||t.startsWith("--"))&&(console.error("Error: --profile requires a name argument"),process.exit(1));try{_a(t)}catch(e){console.error(`Error: ${e.message}`),process.exit(1)}}Xo(V(),Q());ma(V(),Q());var Su=D()?.logLevel;Su&&ea(Su);(process.argv.includes("--help")||process.argv.includes("-h"))&&(console.log(`
73
+ ${m.bold("BeachViber Desktop")} v${z}
74
+
75
+ ${m.bold("Usage:")} beachviber [options]
76
+
77
+ ${m.bold("Options:")}
78
+ --profile <name> Use a named profile
79
+ --reset Delete config and keys, then exit
80
+ --soft-reset Clear pairing state and keys, keep API/relay URLs
81
+ -v, --version Show version
82
+ -h, --help Show this help
83
+ `),process.exit(0));(process.argv.includes("--version")||process.argv.includes("-v"))&&(console.log(z),process.exit(0));if(process.argv.includes("--reset")){try{let s=await bi({type:"reset"});s.ok&&(console.log(m.green(` ${s.message}`)),process.exit(0))}catch{}let t=Jt(),e=t?`profile "${t}"`:"default profile",n=`default${Q()}`;try{console.log(`[reset] Removing keychain secret for account "${n}"`),Zn(n)}catch{}let r=ls("--reset CLI flag");console.log(r?m.green(` Settings reset for ${e}. Config file and keys removed.`):m.yellow(` No config found for ${e}. Nothing to reset.`)),process.exit(0)}if(process.argv.includes("--soft-reset")){try{let s=await bi({type:"soft-reset"});s.ok&&(console.log(m.green(` ${s.message}`)),process.exit(0))}catch{}let t=Jt(),e=t?`profile "${t}"`:"default profile",n=`default${Q()}`;try{Zn(n)}catch{}let r=D();if(r){let s={deviceId:bt(),...r.relayUrl?{relayUrl:r.relayUrl}:{},...r.apiUrl?{apiUrl:r.apiUrl}:{},...r.deviceName?{deviceName:r.deviceName}:{}};G(s),console.log(m.green(` Soft reset for ${e}. Pairing state and keys cleared; URLs preserved.`))}else console.log(m.yellow(` No config found for ${e}. Nothing to reset.`));process.exit(0)}d.enterSetupMode=()=>wr();d.onSleepTransition=()=>cu();function Ti(t=0){if(!d.shuttingDown){d.shuttingDown=!0,console.log(m.dim(`
84
+ Shutting down...`)),_u(),gu();try{d.ws?.close()}catch{}d.heartbeatTimer&&(clearInterval(d.heartbeatTimer),d.heartbeatTimer=null);try{for(let e of Oe().getAllSessions())e.process?.pid&&e.process.exitCode===null&&(process.platform==="win32"?bu("taskkill",["/pid",String(e.process.pid),"/T","/F"],()=>{}):e.process.kill())}catch{}setTimeout(()=>process.exit(t),500).unref()}}process.on("SIGINT",()=>Ti());process.on("SIGTERM",()=>Ti());function ku(){let t=Ma();if(t)try{let e=Zm.createPrivateKey({format:"der",type:"pkcs8",key:Ct(t.secretKey)}),n=tn(Ct(t.publicKey));d.ownKeyPair={publicKey:n,secretKey:e},t.peerPublicKey&&(d.peerPublicKey=tn(Ct(t.peerPublicKey)),d.sharedSecret=er(d.peerPublicKey,d.ownKeyPair.secretKey))}catch{d.ownKeyPair=en(),It({publicKey:Y(pe(d.ownKeyPair.publicKey)),secretKey:Y(d.ownKeyPair.secretKey.export({format:"der",type:"pkcs8"}))})}else d.ownKeyPair=en(),It({publicKey:Y(pe(d.ownKeyPair.publicKey)),secretKey:Y(d.ownKeyPair.secretKey.export({format:"der",type:"pkcs8"}))})}async function Eu(t){let e=`default${Q()}`;try{for(let n of Oe().getAllSessions())n.process?.pid&&n.process.exitCode===null&&(process.platform==="win32"?bu("taskkill",["/pid",String(n.process.pid),"/T","/F"],()=>{}):n.process.kill())}catch{}try{d.ws?.close()}catch{}d.heartbeatTimer&&clearInterval(d.heartbeatTimer),d.wakeTimer&&clearTimeout(d.wakeTimer),ji();try{Zn(e)}catch{}if(t==="reset")ls("IPC reset command");else{let n=D();if(n){let r={deviceId:bt(),...n.relayUrl?{relayUrl:n.relayUrl}:{},...n.apiUrl?{apiUrl:n.apiUrl}:{},...n.deviceName?{deviceName:n.deviceName}:{}};G(r),d.deviceId=r.deviceId}}ku(),d.projects=await yt(),console.log(m.yellow(`
85
+ [${t}] Reset via IPC \u2014 re-entering setup mode...`)),wr()}async function Xm(t){switch(t.type){case"reset":return await Eu("reset"),{ok:!0,message:"Full reset complete. Agent re-entering setup mode."};case"soft-reset":return await Eu("soft-reset"),{ok:!0,message:"Soft reset complete. URLs preserved. Re-entering setup mode."};default:return{ok:!1,message:`Unknown command: ${t.type}`}}}(async()=>{Ua(),d.projects=await yt();let t=D();if(!t)d.deviceId=bt(),t={deviceId:d.deviceId,relayUrl:Hn,apiUrl:Et},G(t);else{d.deviceId=t.deviceId;let l=!1;t.relayUrl||(t.relayUrl=Hn,l=!0),t.apiUrl||(t.apiUrl=Et,l=!0),l&&G(t)}Ui(process.env.RELAY_URL||t?.relayUrl||Hn),su(process.env.API_URL||t?.apiUrl||Et),d.deviceToken=process.env.BV_DEVICE_TOKEN||t?.deviceToken||"",ku();let e=t?.wakeExpiresAt;if(e&&e>Date.now()){d.wakeExpiresAt=e;let l=e-Date.now();d.wakeTimer=setTimeout(()=>{Promise.resolve().then(()=>(ze(),rr)).then(({transitionToSleep:c})=>{c("timer_expired",te)})},l)}else e&&Ae(null);let n=!!(d.deviceToken&&d.sharedSecret&&d.peerPublicKey);console.log(),console.log(m.bold(" BeachViber Agent")+m.dim(` v${z}`)),Jt()&&console.log(m.dim(" Profile ")+m.bold(Jt())),console.log();let r=d.projects.reduce((l,c)=>l+c.sessionCount,0);console.log(m.dim(" Projects ")+m.bold(String(d.projects.length))+m.dim(` (${r} sessions)`));for(let l of d.projects){let c=l.git.branch!=="unknown"?m.dim(` (${l.git.branch})`):"",u=m.dim(` \u2014 ${l.sessionCount} sessions`);console.log(m.dim(" ")+l.name+c+u)}let s=fu();s.installed&&console.log(m.dim(" Claude ")+m.bold(`v${s.installed.raw}`)),s.ok||(console.log(),console.log(m.red(` ERROR: ${s.error}`)),console.log(),process.exit(1));let i=Aa(),o=i?.includes("file")?m.yellow:m.green;if(console.log(m.dim(" Secrets ")+(i?o(i):m.yellow("plaintext (no OS store available)"))),de()&&!d.wakeExpiresAt){let l=new Date().toLocaleTimeString();Le(["LOCKED","Remote access is locked.","Unlock from app or terminal."],c=>m.yellow(c)),console.log(m.dim(` ${l}`)),console.log()}else if(de()&&d.wakeExpiresAt){let l=Math.ceil((d.wakeExpiresAt-Date.now())/36e5),c=new Date().toLocaleTimeString();Le(["UNLOCKED",`Unlocked for ~${l} more hour${l!==1?"s":""}.`],u=>m.green(u)),console.log(m.dim(` ${c}`)),console.log()}n?console.log(m.dim(" State ")+m.green("Saved pairing found \u2014 reconnecting...")):d.deviceToken?console.log(m.dim(" State ")+m.yellow("Incomplete pairing \u2014 re-entering setup")):console.log(m.dim(" State ")+m.yellow("New \u2014 pairing required")),console.log(),ka().setPhoneSendFn(te),yu(Xm),hu(Ti),n?(console.log(m.green(" Reconnecting with saved pairing...".padEnd(50))+m.green("[encrypted]")),console.log(),Je()):wr()})().catch(t=>{console.error(m.red(` Fatal error: ${t}`)),process.exit(1)});
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "child_process";
3
+ import { fileURLToPath } from "url";
4
+ import { dirname, join } from "path";
5
+
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const entry = join(__dirname, "index.js");
8
+ const args = process.argv.slice(2);
9
+
10
+ function launch() {
11
+ const child = spawn(process.execPath, [entry, ...args], {
12
+ stdio: "inherit",
13
+ env: { ...process.env, BEACHVIBER_MANAGED: "1" },
14
+ });
15
+
16
+ // The child shares the console (stdio: "inherit") so it receives Ctrl+C
17
+ // natively from the terminal. We just need to prevent the launcher from
18
+ // exiting on SIGINT so it can wait for the child to exit gracefully.
19
+ // DO NOT forward SIGINT via child.kill() — on Windows that calls
20
+ // TerminateProcess() which kills the child immediately without allowing
21
+ // graceful WebSocket shutdown.
22
+ process.on("SIGINT", () => {});
23
+ process.on("SIGTERM", () => child.kill("SIGTERM"));
24
+
25
+ child.on("exit", (code) => {
26
+ if (code === 42) {
27
+ console.log("\n Update detected — restarting BeachViber...\n");
28
+ launch();
29
+ } else {
30
+ process.exit(code ?? 0);
31
+ }
32
+ });
33
+ }
34
+
35
+ launch();
package/package.json ADDED
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "@beachviber/agent",
3
+ "version": "1.10.2",
4
+ "description": "BeachViber Agent — control Claude Code remotely from your phone",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/Beach-Viber/beachviber-desktop.git"
10
+ },
11
+ "keywords": [
12
+ "beachviber",
13
+ "claude",
14
+ "claude-code",
15
+ "agent",
16
+ "cli",
17
+ "remote",
18
+ "vibe-coding",
19
+ "terminal",
20
+ "mobile"
21
+ ],
22
+ "engines": {
23
+ "node": ">=20"
24
+ },
25
+ "bin": {
26
+ "beachviber": "./dist/launcher.mjs"
27
+ },
28
+ "files": [
29
+ "dist/index.js",
30
+ "dist/launcher.mjs",
31
+ "scripts",
32
+ "README.md",
33
+ "LICENSE",
34
+ "CHANGELOG.md"
35
+ ],
36
+ "scripts": {
37
+ "dev": "tsx watch --env-file=.env src/index.ts",
38
+ "start": "tsx --env-file=.env src/index.ts",
39
+ "build": "node esbuild.config.mjs",
40
+ "build:check": "tsc --noEmit",
41
+ "test": "vitest run",
42
+ "postinstall": "node scripts/postinstall.mjs",
43
+ "prepublishOnly": "npm run build:check && npm run build && npm test"
44
+ },
45
+ "dependencies": {},
46
+ "devDependencies": {
47
+ "@types/node": "^22.0.0",
48
+ "@types/qrcode": "^1.5.6",
49
+ "@types/ws": "^8.5.13",
50
+ "chalk": "^5.6.2",
51
+ "esbuild": "^0.27.3",
52
+ "qrcode": "^1.5.4",
53
+ "tsx": "^4.19.0",
54
+ "typescript": "^5.7.0",
55
+ "vitest": "^3.0.0",
56
+ "ws": "^8.18.0"
57
+ }
58
+ }
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ // Prints getting-started instructions after npm install -g @beachviber/agent
3
+
4
+ console.log();
5
+ console.log(" \x1b[1mBeach Viber installed!\x1b[0m");
6
+ console.log();
7
+ console.log(" To get started, open a terminal and run:");
8
+ console.log();
9
+ console.log(" \x1b[36mcd ~/path/to/your/projects\x1b[0m");
10
+ console.log(" \x1b[36mbeachviber\x1b[0m");
11
+ console.log();
12
+ console.log(" The directory should contain one or more Git repositories");
13
+ console.log(" or Claude Code projects. The agent will scan for them");
14
+ console.log(" automatically and display a QR code to pair with your phone.");
15
+ console.log();