@naarang/ccc 2.0.0-alpha.7 → 2.0.0-alpha.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -15,7 +15,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
15
15
|
`;for(var U=0;U<H;U+=2){L+=K.WHITE_ALL;for(var V=0;V<H;V++)if(Z[U][V]===X&&Z[U+1][V]===X)L+=K.WHITE_ALL;else if(Z[U][V]===X&&Z[U+1][V]===J)L+=K.WHITE_BLACK;else if(Z[U][V]===J&&Z[U+1][V]===X)L+=K.BLACK_WHITE;else L+=K.BLACK_ALL;L+=K.WHITE_ALL+`
|
|
16
16
|
`}if(!Y)L+=G}else{var N=E9(z5).times(E.getModuleCount()+3);L+=N+`
|
|
17
17
|
`,E.modules.forEach(function(z){L+=z5,L+=z.map(xh).join(""),L+=z5+`
|
|
18
|
-
`}),L+=N}if(A)A(L);else console.log(L)},setErrorLevel:function(_){this.error=CW[_]||this.error}}});import{readFileSync as M9}from"fs";import{join as V9}from"path";function G1(){return"2.0.0-alpha.
|
|
18
|
+
`}),L+=N}if(A)A(L);else console.log(L)},setErrorLevel:function(_){this.error=CW[_]||this.error}}});import{readFileSync as M9}from"fs";import{join as V9}from"path";function G1(){return"2.0.0-alpha.8"}function k5(_){let[T,A]=_.split("-"),E=(T||"0.0.0").split(".").map(Number);return{major:E[0]||0,minor:E[1]||0,patch:E[2]||0,preRelease:A||null}}function XT(_){let T=k5(_);if(!T.preRelease)return"stable";if(T.preRelease.startsWith("alpha"))return"alpha";return"beta"}function f5(_,T){try{let A=k5(_),E=k5(T);if(A.major>E.major)return!1;if(A.major<E.major)return!1;if(E.preRelease&&!A.preRelease)return!1;if(!E.preRelease&&A.preRelease)return!1;if(E.preRelease&&A.preRelease){if(A.minor<E.minor)return!1;if(A.minor===E.minor&&A.patch===E.patch)return A.preRelease>E.preRelease;if(A.minor>E.minor||A.patch>E.patch)return!0;return!1}if(A.minor>E.minor)return!0;if(A.minor<E.minor)return!1;if(A.patch>E.patch)return!0;return!1}catch(A){return!1}}import{parseArgs as PN}from"util";var jN={debug:{type:"boolean",short:"d",default:!1,description:"Enable debug logging"},"mqtt-port":{type:"string",default:"8884",description:"MQTT broker port"},"terminal-port":{type:"string",default:"3001",description:"Terminal server port"},"router-port":{type:"string",default:"8883",description:"Router port"},username:{type:"string",description:"MQTT broker username (optional)"},password:{type:"string",description:"MQTT broker password (optional)"},"ngrok-token":{type:"string",description:"ngrok authentication token (optional)"},"ngrok-domain":{type:"string",description:"ngrok static domain (optional, paid plan)"},"no-auto-update":{type:"boolean",default:!1,description:"Disable auto-update checking"},"auto-update-check-interval":{type:"string",default:"60",description:"Auto-update check interval in minutes (default: 60)"},help:{type:"boolean",short:"h",default:!1,description:"Show help message"},version:{type:"boolean",short:"v",default:!1,description:"Show version"}};function z9(){let _=PN({options:jN,allowPositionals:!1,strict:!0});if(_.values.version)console.log(`ccc v${G1()}`),process.exit(0);if(_.values.help)xN(),process.exit(0);return{debug:_.values.debug,mqttPort:parseInt(_.values["mqtt-port"],10),terminalPort:parseInt(_.values["terminal-port"],10),routerPort:parseInt(_.values["router-port"],10),username:_.values.username,password:_.values.password,ngrokToken:_.values["ngrok-token"],ngrokDomain:_.values["ngrok-domain"],autoUpdate:!_.values["no-auto-update"],autoUpdateCheckInterval:parseInt(_.values["auto-update-check-interval"],10)}}function xN(){console.log(`
|
|
19
19
|
Backend v2 - Clean modular architecture
|
|
20
20
|
|
|
21
21
|
Usage:
|
|
@@ -34,7 +34,7 @@ Options:
|
|
|
34
34
|
--auto-update-check-interval <min> Check interval in minutes (default: 60)
|
|
35
35
|
-v, --version Show version
|
|
36
36
|
-h, --help Show this help message
|
|
37
|
-
`)}class B4 extends Error{code;statusCode;constructor(_,T="SERVICE_ERROR",A=500){super(_);this.code=T;this.statusCode=A;this.name="ServiceError"}}class q4 extends Error{constructor(_){super(_);this.name="ConfigError"}}class h8 extends B4{constructor(_){super(_,"MQTT_BROKER_ERROR",500);this.name="MQTTBrokerError"}}class HT extends B4{constructor(_){super(_,"TERMINAL_SERVER_ERROR",500);this.name="TerminalServerError"}}class b5 extends B4{constructor(_){super(_,"ROUTER_ERROR",500);this.name="RouterError"}}class k8 extends B4{constructor(_="Authentication failed"){super(_,"AUTH_ERROR",401);this.name="AuthenticationError"}}function F9(_){return wN(_),SN(_),{debug:_.debug,mqtt:{port:_.mqttPort,heartbeatInterval:30000,connectTimeout:30000,debug:_.debug,..._.username&&_.password&&{auth:{username:_.username,password:_.password}}},terminal:{port:_.terminalPort,debug:_.debug},router:{port:_.routerPort,debug:_.debug},..._.ngrokToken&&{ngrok:{authToken:_.ngrokToken,routerPort:_.routerPort,..._.ngrokDomain&&{domain:_.ngrokDomain},debug:_.debug}},qrcode:{username:_.username,password:_.password,profileName:"",debug:_.debug},autoUpdate:{enabled:_.autoUpdate,packageName:"@naarang/ccc",checkIntervalMinutes:_.autoUpdateCheckInterval,debug:_.debug},claudeAgent:{maxConcurrentSessions:10,sessionTimeoutMs:1800000}}}function wN(_){let T={"MQTT port":_.mqttPort,"Terminal port":_.terminalPort,"Router port":_.routerPort};for(let[L,J]of Object.entries(T))if(isNaN(J)||J<1024||J>65535)throw new q4(`Invalid ${L}: ${J}. Must be between 1024 and 65535`);let A=Object.values(T);if(new Set(A).size!==A.length)throw new q4("Port conflict: Each service must use a different port")}function SN(_){if(_.ngrokToken&&(!_.username||!_.password))throw new q4("Error: MQTT authentication (--username and --password) is required when using ngrok tunnels for security.")}class g5{isDev;constructor(_=!1){this.isDev=_}debug(_,T){if(this.isDev)console.log(`[DEBUG] ${_}`,T||"")}info(_,T){console.log(`[INFO] ${_}`,T||"")}warn(_,T){console.warn(`[WARN] ${_}`,T||"")}error(_,T){console.error(`[ERROR] ${_}`,T||"")}}var I4=null;function C9(_=!1){return I4=new g5(_),I4}function k(){if(!I4)I4=new g5(!1);return I4}import*as d0 from"fs";import*as mT from"path";var yN={FULL_WIDTH:0,FITTING:1,SMUSHING:2,CONTROLLED_SMUSHING:3};class O9{constructor(){this.comment="",this.numChars=0,this.options={}}}var m5=["1Row","3-D","3D Diagonal","3D-ASCII","3x5","4Max","5 Line Oblique","AMC 3 Line","AMC 3 Liv1","AMC AAA01","AMC Neko","AMC Razor","AMC Razor2","AMC Slash","AMC Slider","AMC Thin","AMC Tubes","AMC Untitled","ANSI Regular","ANSI Shadow","ANSI-Compact","ASCII 12","ASCII 9","ASCII New Roman","Acrobatic","Alligator","Alligator2","Alpha","Alphabet","Arrows","Avatar","B1FF","Babyface Lame","Babyface Leet","Banner","Banner3-D","Banner3","Banner4","Barbwire","Basic","Bear","Bell","Benjamin","Big ASCII 12","Big ASCII 9","Big Chief","Big Money-ne","Big Money-nw","Big Money-se","Big Money-sw","Big Mono 12","Big Mono 9","Big","Bigfig","Binary","Block","Blocks","Bloody","BlurVision ASCII","Bolger","Braced","Bright","Broadway KB","Broadway","Bubble","Bulbhead","Caligraphy","Caligraphy2","Calvin S","Cards","Catwalk","Chiseled","Chunky","Circle","Coinstak","Cola","Colossal","Computer","Contessa","Contrast","Cosmike","Cosmike2","Crawford","Crawford2","Crazy","Cricket","Cursive","Cyberlarge","Cybermedium","Cybersmall","Cygnet","DANC4","DOS Rebel","DWhistled","Dancing Font","Decimal","Def Leppard","Delta Corps Priest 1","DiamFont","Diamond","Diet Cola","Digital","Doh","Doom","Dot Matrix","Double Shorts","Double","Dr Pepper","Efti Chess","Efti Font","Efti Italic","Efti Piti","Efti Robot","Efti Wall","Efti Water","Electronic","Elite","Emboss 2","Emboss","Epic","Fender","Filter","Fire Font-k","Fire Font-s","Flipped","Flower Power","Four Tops","Fraktur","Fun Face","Fun Faces","Future","Fuzzy","Georgi16","Georgia11","Ghost","Ghoulish","Glenyn","Goofy","Gothic","Graceful","Gradient","Graffiti","Greek","Heart Left","Heart Right","Henry 3D","Hex","Hieroglyphs","Hollywood","Horizontal Left","Horizontal Right","ICL-1900","Impossible","Invita","Isometric1","Isometric2","Isometric3","Isometric4","Italic","Ivrit","JS Block Letters","JS Bracket Letters","JS Capital Curves","JS Cursive","JS Stick Letters","Jacky","Jazmine","Jerusalem","Katakana","Kban","Keyboard","Knob","Konto Slant","Konto","LCD","Larry 3D 2","Larry 3D","Lean","Letter","Letters","Lil Devil","Line Blocks","Linux","Lockergnome","Madrid","Marquee","Maxfour","Merlin1","Merlin2","Mike","Mini","Mirror","Mnemonic","Modular","Mono 12","Mono 9","Morse","Morse2","Moscow","Mshebrew210","Muzzle","NScript","NT Greek","NV Script","Nancyj-Fancy","Nancyj-Improved","Nancyj-Underlined","Nancyj","Nipples","O8","OS2","Octal","Ogre","Old Banner","Pagga","Patorjk's Cheese","Patorjk-HeX","Pawp","Peaks Slant","Peaks","Pebbles","Pepper","Poison","Puffy","Puzzle","Pyramid","Rammstein","Rebel","Rectangles","Red Phoenix","Relief","Relief2","Reverse","Roman","Rot13","Rotated","Rounded","Rowan Cap","Rozzo","RubiFont","Runic","Runyc","S Blood","SL Script","Santa Clara","Script","Serifcap","Shaded Blocky","Shadow","Shimrod","Short","Slant Relief","Slant","Slide","Small ASCII 12","Small ASCII 9","Small Block","Small Braille","Small Caps","Small Isometric1","Small Keyboard","Small Mono 12","Small Mono 9","Small Poison","Small Script","Small Shadow","Small Slant","Small Tengwar","Small","Soft","Speed","Spliff","Stacey","Stampate","Stampatello","Standard","Star Strips","Star Wars","Stellar","Stforek","Stick Letters","Stop","Straight","Stronger Than All","Sub-Zero","Swamp Land","Swan","Sweet","THIS","Tanja","Tengwar","Term","Terrace","Test1","The Edge","Thick","Thin","Thorned","Three Point","Ticks Slant","Ticks","Tiles","Tinker-Toy","Tmplr","Tombstone","Train","Trek","Tsalagi","Tubular","Twisted","Two Point","USA Flag","Univers","Upside Down Text","Varsity","Wavescape","Wavy","Weird","Wet Letter","Whimsy","WideTerm","Wow","miniwi"];function vN(_){return/[.*+?^${}()|[\]\\]/.test(_)?"\\"+_:_}var R9=(()=>{let{FULL_WIDTH:_=0,FITTING:T,SMUSHING:A,CONTROLLED_SMUSHING:E}=yN,L={},J={font:"Standard",fontPath:"./fonts",fetchFontIfMissing:!0};function X(O,D,M){let C=vN(O.trim().slice(-1))||"@",j=D===M-1?new RegExp(C+C+"?\\s*$"):new RegExp(C+"\\s*$");return O.replace(j,"")}function H(O=-1,D=null){let M={},C,j=[[16384,"vLayout",A],[8192,"vLayout",T],[4096,"vRule5",!0],[2048,"vRule4",!0],[1024,"vRule3",!0],[512,"vRule2",!0],[256,"vRule1",!0],[128,"hLayout",A],[64,"hLayout",T],[32,"hRule6",!0],[16,"hRule5",!0],[8,"hRule4",!0],[4,"hRule3",!0],[2,"hRule2",!0],[1,"hRule1",!0]];C=D!==null?D:O;for(let[w,v,y]of j)if(C>=w){if(C-=w,M[v]===void 0)M[v]=y}else if(v!=="vLayout"&&v!=="hLayout")M[v]=!1;if(typeof M.hLayout>"u")if(O===0)M.hLayout=T;else if(O===-1)M.hLayout=_;else if(M.hRule1||M.hRule2||M.hRule3||M.hRule4||M.hRule5||M.hRule6)M.hLayout=E;else M.hLayout=A;else if(M.hLayout===A){if(M.hRule1||M.hRule2||M.hRule3||M.hRule4||M.hRule5||M.hRule6)M.hLayout=E}if(typeof M.vLayout>"u")if(M.vRule1||M.vRule2||M.vRule3||M.vRule4||M.vRule5)M.vLayout=E;else M.vLayout=_;else if(M.vLayout===A){if(M.vRule1||M.vRule2||M.vRule3||M.vRule4||M.vRule5)M.vLayout=E}return M}function Z(O,D,M=""){if(O===D&&O!==M)return O;return!1}function Y(O,D){let M="|/\\[]{}()<>";if(O==="_"){if(M.indexOf(D)!==-1)return D}else if(D==="_"){if(M.indexOf(O)!==-1)return O}return!1}function K(O,D){let M="| /\\ [] {} () <>",C=M.indexOf(O),j=M.indexOf(D);if(C!==-1&&j!==-1){if(C!==j&&Math.abs(C-j)!==1){let w=Math.max(C,j),v=w+1;return M.substring(w,v)}}return!1}function $(O,D){let M="[] {} ()",C=M.indexOf(O),j=M.indexOf(D);if(C!==-1&&j!==-1){if(Math.abs(C-j)<=1)return"|"}return!1}function G(O,D){return{"/\\":"|","\\/":"Y","><":"X"}[O+D]||!1}function U(O,D,M=""){if(O===M&&D===M)return M;return!1}function V(O,D){if(O===D)return O;return!1}function N(O,D){return Y(O,D)}function z(O,D){return K(O,D)}function Q(O,D){if(O==="-"&&D==="_"||O==="_"&&D==="-")return"=";return!1}function F(O,D){if(O==="|"&&D==="|")return"|";return!1}function R(O,D,M){if(D===" "||D==="")return O;else if(D===M&&O!==" ")return O;else return D}function q(O,D,M){if(M.fittingRules&&M.fittingRules.vLayout===_)return"invalid";let C,j=Math.min(O.length,D.length),w,v,y=!1,b;if(j===0)return"invalid";for(C=0;C<j;C++)if(w=O.substring(C,C+1),v=D.substring(C,C+1),w!==" "&&v!==" ")if(M.fittingRules&&M.fittingRules.vLayout===T)return"invalid";else if(M.fittingRules&&M.fittingRules.vLayout===A)return"end";else{if(F(w,v)){y=y||!1;continue}if(b=!1,b=M.fittingRules&&M.fittingRules.vRule1?V(w,v):b,b=!b&&M.fittingRules&&M.fittingRules.vRule2?N(w,v):b,b=!b&&M.fittingRules&&M.fittingRules.vRule3?z(w,v):b,b=!b&&M.fittingRules&&M.fittingRules.vRule4?Q(w,v):b,y=!0,!b)return"invalid"}if(y)return"end";else return"valid"}function f(O,D,M){let{length:C,length:j}=O,w,v,y,b=1,d,o,a;while(b<=C){w=O.slice(Math.max(0,j-b),j),v=D.slice(0,Math.min(C,b)),y=v.length,a="";for(d=0;d<y;d++)if(o=q(w[d],v[d],M),o==="end")a=o;else if(o==="invalid"){a=o;break}else if(a==="")a="valid";if(a==="invalid"){b--;break}if(a==="end")break;if(a==="valid")b++}return Math.min(C,b)}function S(O,D,M){let C,j=Math.min(O.length,D.length),w,v,y="",b,d=M.fittingRules||{};for(C=0;C<j;C++)if(w=O.substring(C,C+1),v=D.substring(C,C+1),w!==" "&&v!==" ")if(d.vLayout===T)y+=R(w,v);else if(d.vLayout===A)y+=R(w,v);else b=!1,b=d.vRule5?F(w,v):b,b=!b&&d.vRule1?V(w,v):b,b=!b&&d.vRule2?N(w,v):b,b=!b&&d.vRule3?z(w,v):b,b=!b&&d.vRule4?Q(w,v):b,y+=b;else y+=R(w,v);return y}function g(O,D,M,C){let j=O.length,w=D.length,v=O.slice(0,Math.max(0,j-M)),y=O.slice(Math.max(0,j-M),j),b=D.slice(0,Math.min(M,w)),d,o,a,s=[],T_;o=y.length;for(d=0;d<o;d++){if(d>=w)a=y[d];else a=S(y[d],b[d],C);s.push(a)}return T_=D.slice(Math.min(M,w),w),[...v,...s,...T_]}function l(O,D){let M=" ".repeat(D);return O.map((C)=>C+M)}function c(O,D,M){let C=O[0].length,j=D[0].length,w;if(C>j)D=l(D,C-j);else if(j>C)O=l(O,j-C);return w=f(O,D,M),g(O,D,w,M)}function W_(O,D,M){let C=M.fittingRules||{};if(C.hLayout===_)return 0;let j,w=O.length,v=D.length,y=w,b=1,d=!1,o,a,s,T_;if(w===0)return 0;_:while(b<=y){let v1=w-b;o=O.substring(v1,v1+b),a=D.substring(0,Math.min(b,v));for(j=0;j<Math.min(b,v);j++)if(s=o.substring(j,j+1),T_=a.substring(j,j+1),s!==" "&&T_!==" "){if(C.hLayout===T){b=b-1;break _}else if(C.hLayout===A){if(s===M.hardBlank||T_===M.hardBlank)b=b-1;break _}else if(d=!0,!(C.hRule1&&Z(s,T_,M.hardBlank)||C.hRule2&&Y(s,T_)||C.hRule3&&K(s,T_)||C.hRule4&&$(s,T_)||C.hRule5&&G(s,T_)||C.hRule6&&U(s,T_,M.hardBlank))){b=b-1;break _}}if(d)break;b++}return Math.min(y,b)}function p_(O,D,M,C){let j,w,v=[],y,b,d,o,a,s,T_,v1,E1=C.fittingRules||{};if(typeof C.height!=="number")throw Error("height is not defined.");for(j=0;j<C.height;j++){T_=O[j],v1=D[j],a=T_.length,s=v1.length,y=a-M,b=T_.slice(0,Math.max(0,y)),d="";let D4=Math.max(0,a-M),h1=T_.substring(D4,D4+M),JT=v1.substring(0,Math.min(M,s));for(w=0;w<M;w++){let Q1=w<a?h1.substring(w,w+1):" ",L1=w<s?JT.substring(w,w+1):" ";if(Q1!==" "&&L1!==" ")if(E1.hLayout===T||E1.hLayout===A)d+=R(Q1,L1,C.hardBlank);else{let RN=E1.hRule1&&Z(Q1,L1,C.hardBlank)||E1.hRule2&&Y(Q1,L1)||E1.hRule3&&K(Q1,L1)||E1.hRule4&&$(Q1,L1)||E1.hRule5&&G(Q1,L1)||E1.hRule6&&U(Q1,L1,C.hardBlank)||R(Q1,L1,C.hardBlank);d+=RN}else d+=R(Q1,L1,C.hardBlank)}if(M>=s)o="";else o=v1.substring(M,M+Math.max(0,s-M));v[j]=b+d+o}return v}function q_(O){return Array(O).fill("")}let C_=function(O){return Math.max(...O.map((D)=>D.length))};function K_(O,D,M){return O.reduce(function(C,j){return p_(C,j.fig,j.overlap||0,M)},q_(D))}function M_(O,D,M){for(let C=O.length-1;C>0;C--){let j=K_(O.slice(0,C),D,M);if(C_(j)<=M.width)return{outputFigText:j,chars:O.slice(C)}}return{outputFigText:q_(D),chars:O}}function I_(O,D,M){let C,j,w=0,v,y,b,d=M.height,o=[],a,s={chars:[],overlap:w},T_=[],v1,E1,D4,h1,JT;if(typeof d!=="number")throw Error("height is not defined.");y=q_(d);let Q1=M.fittingRules||{};if(M.printDirection===1)O=O.split("").reverse().join("");b=O.length;for(C=0;C<b;C++)if(v1=O.substring(C,C+1),E1=v1.match(/\s/),j=D[v1.charCodeAt(0)],h1=null,j){if(Q1.hLayout!==_){w=1e4;for(v=0;v<d;v++)w=Math.min(w,W_(y[v],j[v],M));w=w===1e4?0:w}if(M.width>0){if(M.whitespaceBreak)D4=K_(s.chars.concat([{fig:j,overlap:w}]),d,M),h1=K_(T_.concat([{fig:D4,overlap:s.overlap}]),d,M),a=C_(h1);else h1=p_(y,j,w,M),a=C_(h1);if(a>=M.width&&C>0)if(M.whitespaceBreak){if(y=K_(T_.slice(0,-1),d,M),T_.length>1)o.push(y),y=q_(d);T_=[]}else o.push(y),y=q_(d)}if(M.width>0&&M.whitespaceBreak){if(!E1||C===b-1)s.chars.push({fig:j,overlap:w});if(E1||C===b-1){JT=null;while(!0)if(h1=K_(s.chars,d,M),a=C_(h1),a>=M.width)JT=M_(s.chars,d,M),s={chars:JT.chars},o.push(JT.outputFigText);else break;if(a>0)if(JT)T_.push({fig:h1,overlap:1});else T_.push({fig:h1,overlap:s.overlap});if(E1)T_.push({fig:j,overlap:w}),y=q_(d);if(C===b-1)y=K_(T_,d,M);s={chars:[],overlap:w};continue}}y=p_(y,j,w,M)}if(C_(y)>0)o.push(y);if(!M.showHardBlanks)o.forEach(function(L1){b=L1.length;for(v=0;v<b;v++)L1[v]=L1[v].replace(new RegExp("\\"+M.hardBlank,"g")," ")});if(O===""&&o.length===0)o.push(Array(d).fill(""));return o}let j_=function(O,D){let M,C=D.fittingRules||{};if(O==="default")M={hLayout:C.hLayout,hRule1:C.hRule1,hRule2:C.hRule2,hRule3:C.hRule3,hRule4:C.hRule4,hRule5:C.hRule5,hRule6:C.hRule6};else if(O==="full")M={hLayout:_,hRule1:!1,hRule2:!1,hRule3:!1,hRule4:!1,hRule5:!1,hRule6:!1};else if(O==="fitted")M={hLayout:T,hRule1:!1,hRule2:!1,hRule3:!1,hRule4:!1,hRule5:!1,hRule6:!1};else if(O==="controlled smushing")M={hLayout:E,hRule1:!0,hRule2:!0,hRule3:!0,hRule4:!0,hRule5:!0,hRule6:!0};else if(O==="universal smushing")M={hLayout:A,hRule1:!1,hRule2:!1,hRule3:!1,hRule4:!1,hRule5:!1,hRule6:!1};else return;return M},R0=function(O,D){let M={},C=D.fittingRules||{};if(O==="default")M={vLayout:C.vLayout,vRule1:C.vRule1,vRule2:C.vRule2,vRule3:C.vRule3,vRule4:C.vRule4,vRule5:C.vRule5};else if(O==="full")M={vLayout:_,vRule1:!1,vRule2:!1,vRule3:!1,vRule4:!1,vRule5:!1};else if(O==="fitted")M={vLayout:T,vRule1:!1,vRule2:!1,vRule3:!1,vRule4:!1,vRule5:!1};else if(O==="controlled smushing")M={vLayout:E,vRule1:!0,vRule2:!0,vRule3:!0,vRule4:!0,vRule5:!0};else if(O==="universal smushing")M={vLayout:A,vRule1:!1,vRule2:!1,vRule3:!1,vRule4:!1,vRule5:!1};else return;return M},y1=function(O,D,M){M=M.replace(/\r\n/g,`
|
|
37
|
+
`)}class B4 extends Error{code;statusCode;constructor(_,T="SERVICE_ERROR",A=500){super(_);this.code=T;this.statusCode=A;this.name="ServiceError"}}class q4 extends Error{constructor(_){super(_);this.name="ConfigError"}}class h8 extends B4{constructor(_){super(_,"MQTT_BROKER_ERROR",500);this.name="MQTTBrokerError"}}class HT extends B4{constructor(_){super(_,"TERMINAL_SERVER_ERROR",500);this.name="TerminalServerError"}}class b5 extends B4{constructor(_){super(_,"ROUTER_ERROR",500);this.name="RouterError"}}class k8 extends B4{constructor(_="Authentication failed"){super(_,"AUTH_ERROR",401);this.name="AuthenticationError"}}function F9(_){return wN(_),SN(_),{debug:_.debug,mqtt:{port:_.mqttPort,heartbeatInterval:30000,connectTimeout:30000,debug:_.debug,..._.username&&_.password&&{auth:{username:_.username,password:_.password}}},terminal:{port:_.terminalPort,debug:_.debug},router:{port:_.routerPort,mqttPort:_.mqttPort,terminalPort:_.terminalPort,debug:_.debug},..._.ngrokToken&&{ngrok:{authToken:_.ngrokToken,routerPort:_.routerPort,..._.ngrokDomain&&{domain:_.ngrokDomain},debug:_.debug}},qrcode:{username:_.username,password:_.password,profileName:"",debug:_.debug},autoUpdate:{enabled:_.autoUpdate,packageName:"@naarang/ccc",checkIntervalMinutes:_.autoUpdateCheckInterval,debug:_.debug},claudeAgent:{maxConcurrentSessions:10,sessionTimeoutMs:1800000}}}function wN(_){let T={"MQTT port":_.mqttPort,"Terminal port":_.terminalPort,"Router port":_.routerPort};for(let[L,J]of Object.entries(T))if(isNaN(J)||J<1024||J>65535)throw new q4(`Invalid ${L}: ${J}. Must be between 1024 and 65535`);let A=Object.values(T);if(new Set(A).size!==A.length)throw new q4("Port conflict: Each service must use a different port")}function SN(_){if(_.ngrokToken&&(!_.username||!_.password))throw new q4("Error: MQTT authentication (--username and --password) is required when using ngrok tunnels for security.")}class g5{isDev;constructor(_=!1){this.isDev=_}debug(_,T){if(this.isDev)console.log(`[DEBUG] ${_}`,T||"")}info(_,T){console.log(`[INFO] ${_}`,T||"")}warn(_,T){console.warn(`[WARN] ${_}`,T||"")}error(_,T){console.error(`[ERROR] ${_}`,T||"")}}var I4=null;function C9(_=!1){return I4=new g5(_),I4}function k(){if(!I4)I4=new g5(!1);return I4}import*as d0 from"fs";import*as mT from"path";var yN={FULL_WIDTH:0,FITTING:1,SMUSHING:2,CONTROLLED_SMUSHING:3};class O9{constructor(){this.comment="",this.numChars=0,this.options={}}}var m5=["1Row","3-D","3D Diagonal","3D-ASCII","3x5","4Max","5 Line Oblique","AMC 3 Line","AMC 3 Liv1","AMC AAA01","AMC Neko","AMC Razor","AMC Razor2","AMC Slash","AMC Slider","AMC Thin","AMC Tubes","AMC Untitled","ANSI Regular","ANSI Shadow","ANSI-Compact","ASCII 12","ASCII 9","ASCII New Roman","Acrobatic","Alligator","Alligator2","Alpha","Alphabet","Arrows","Avatar","B1FF","Babyface Lame","Babyface Leet","Banner","Banner3-D","Banner3","Banner4","Barbwire","Basic","Bear","Bell","Benjamin","Big ASCII 12","Big ASCII 9","Big Chief","Big Money-ne","Big Money-nw","Big Money-se","Big Money-sw","Big Mono 12","Big Mono 9","Big","Bigfig","Binary","Block","Blocks","Bloody","BlurVision ASCII","Bolger","Braced","Bright","Broadway KB","Broadway","Bubble","Bulbhead","Caligraphy","Caligraphy2","Calvin S","Cards","Catwalk","Chiseled","Chunky","Circle","Coinstak","Cola","Colossal","Computer","Contessa","Contrast","Cosmike","Cosmike2","Crawford","Crawford2","Crazy","Cricket","Cursive","Cyberlarge","Cybermedium","Cybersmall","Cygnet","DANC4","DOS Rebel","DWhistled","Dancing Font","Decimal","Def Leppard","Delta Corps Priest 1","DiamFont","Diamond","Diet Cola","Digital","Doh","Doom","Dot Matrix","Double Shorts","Double","Dr Pepper","Efti Chess","Efti Font","Efti Italic","Efti Piti","Efti Robot","Efti Wall","Efti Water","Electronic","Elite","Emboss 2","Emboss","Epic","Fender","Filter","Fire Font-k","Fire Font-s","Flipped","Flower Power","Four Tops","Fraktur","Fun Face","Fun Faces","Future","Fuzzy","Georgi16","Georgia11","Ghost","Ghoulish","Glenyn","Goofy","Gothic","Graceful","Gradient","Graffiti","Greek","Heart Left","Heart Right","Henry 3D","Hex","Hieroglyphs","Hollywood","Horizontal Left","Horizontal Right","ICL-1900","Impossible","Invita","Isometric1","Isometric2","Isometric3","Isometric4","Italic","Ivrit","JS Block Letters","JS Bracket Letters","JS Capital Curves","JS Cursive","JS Stick Letters","Jacky","Jazmine","Jerusalem","Katakana","Kban","Keyboard","Knob","Konto Slant","Konto","LCD","Larry 3D 2","Larry 3D","Lean","Letter","Letters","Lil Devil","Line Blocks","Linux","Lockergnome","Madrid","Marquee","Maxfour","Merlin1","Merlin2","Mike","Mini","Mirror","Mnemonic","Modular","Mono 12","Mono 9","Morse","Morse2","Moscow","Mshebrew210","Muzzle","NScript","NT Greek","NV Script","Nancyj-Fancy","Nancyj-Improved","Nancyj-Underlined","Nancyj","Nipples","O8","OS2","Octal","Ogre","Old Banner","Pagga","Patorjk's Cheese","Patorjk-HeX","Pawp","Peaks Slant","Peaks","Pebbles","Pepper","Poison","Puffy","Puzzle","Pyramid","Rammstein","Rebel","Rectangles","Red Phoenix","Relief","Relief2","Reverse","Roman","Rot13","Rotated","Rounded","Rowan Cap","Rozzo","RubiFont","Runic","Runyc","S Blood","SL Script","Santa Clara","Script","Serifcap","Shaded Blocky","Shadow","Shimrod","Short","Slant Relief","Slant","Slide","Small ASCII 12","Small ASCII 9","Small Block","Small Braille","Small Caps","Small Isometric1","Small Keyboard","Small Mono 12","Small Mono 9","Small Poison","Small Script","Small Shadow","Small Slant","Small Tengwar","Small","Soft","Speed","Spliff","Stacey","Stampate","Stampatello","Standard","Star Strips","Star Wars","Stellar","Stforek","Stick Letters","Stop","Straight","Stronger Than All","Sub-Zero","Swamp Land","Swan","Sweet","THIS","Tanja","Tengwar","Term","Terrace","Test1","The Edge","Thick","Thin","Thorned","Three Point","Ticks Slant","Ticks","Tiles","Tinker-Toy","Tmplr","Tombstone","Train","Trek","Tsalagi","Tubular","Twisted","Two Point","USA Flag","Univers","Upside Down Text","Varsity","Wavescape","Wavy","Weird","Wet Letter","Whimsy","WideTerm","Wow","miniwi"];function vN(_){return/[.*+?^${}()|[\]\\]/.test(_)?"\\"+_:_}var R9=(()=>{let{FULL_WIDTH:_=0,FITTING:T,SMUSHING:A,CONTROLLED_SMUSHING:E}=yN,L={},J={font:"Standard",fontPath:"./fonts",fetchFontIfMissing:!0};function X(O,D,M){let C=vN(O.trim().slice(-1))||"@",j=D===M-1?new RegExp(C+C+"?\\s*$"):new RegExp(C+"\\s*$");return O.replace(j,"")}function H(O=-1,D=null){let M={},C,j=[[16384,"vLayout",A],[8192,"vLayout",T],[4096,"vRule5",!0],[2048,"vRule4",!0],[1024,"vRule3",!0],[512,"vRule2",!0],[256,"vRule1",!0],[128,"hLayout",A],[64,"hLayout",T],[32,"hRule6",!0],[16,"hRule5",!0],[8,"hRule4",!0],[4,"hRule3",!0],[2,"hRule2",!0],[1,"hRule1",!0]];C=D!==null?D:O;for(let[w,v,y]of j)if(C>=w){if(C-=w,M[v]===void 0)M[v]=y}else if(v!=="vLayout"&&v!=="hLayout")M[v]=!1;if(typeof M.hLayout>"u")if(O===0)M.hLayout=T;else if(O===-1)M.hLayout=_;else if(M.hRule1||M.hRule2||M.hRule3||M.hRule4||M.hRule5||M.hRule6)M.hLayout=E;else M.hLayout=A;else if(M.hLayout===A){if(M.hRule1||M.hRule2||M.hRule3||M.hRule4||M.hRule5||M.hRule6)M.hLayout=E}if(typeof M.vLayout>"u")if(M.vRule1||M.vRule2||M.vRule3||M.vRule4||M.vRule5)M.vLayout=E;else M.vLayout=_;else if(M.vLayout===A){if(M.vRule1||M.vRule2||M.vRule3||M.vRule4||M.vRule5)M.vLayout=E}return M}function Z(O,D,M=""){if(O===D&&O!==M)return O;return!1}function Y(O,D){let M="|/\\[]{}()<>";if(O==="_"){if(M.indexOf(D)!==-1)return D}else if(D==="_"){if(M.indexOf(O)!==-1)return O}return!1}function K(O,D){let M="| /\\ [] {} () <>",C=M.indexOf(O),j=M.indexOf(D);if(C!==-1&&j!==-1){if(C!==j&&Math.abs(C-j)!==1){let w=Math.max(C,j),v=w+1;return M.substring(w,v)}}return!1}function $(O,D){let M="[] {} ()",C=M.indexOf(O),j=M.indexOf(D);if(C!==-1&&j!==-1){if(Math.abs(C-j)<=1)return"|"}return!1}function G(O,D){return{"/\\":"|","\\/":"Y","><":"X"}[O+D]||!1}function U(O,D,M=""){if(O===M&&D===M)return M;return!1}function V(O,D){if(O===D)return O;return!1}function N(O,D){return Y(O,D)}function z(O,D){return K(O,D)}function Q(O,D){if(O==="-"&&D==="_"||O==="_"&&D==="-")return"=";return!1}function F(O,D){if(O==="|"&&D==="|")return"|";return!1}function R(O,D,M){if(D===" "||D==="")return O;else if(D===M&&O!==" ")return O;else return D}function q(O,D,M){if(M.fittingRules&&M.fittingRules.vLayout===_)return"invalid";let C,j=Math.min(O.length,D.length),w,v,y=!1,b;if(j===0)return"invalid";for(C=0;C<j;C++)if(w=O.substring(C,C+1),v=D.substring(C,C+1),w!==" "&&v!==" ")if(M.fittingRules&&M.fittingRules.vLayout===T)return"invalid";else if(M.fittingRules&&M.fittingRules.vLayout===A)return"end";else{if(F(w,v)){y=y||!1;continue}if(b=!1,b=M.fittingRules&&M.fittingRules.vRule1?V(w,v):b,b=!b&&M.fittingRules&&M.fittingRules.vRule2?N(w,v):b,b=!b&&M.fittingRules&&M.fittingRules.vRule3?z(w,v):b,b=!b&&M.fittingRules&&M.fittingRules.vRule4?Q(w,v):b,y=!0,!b)return"invalid"}if(y)return"end";else return"valid"}function f(O,D,M){let{length:C,length:j}=O,w,v,y,b=1,d,o,a;while(b<=C){w=O.slice(Math.max(0,j-b),j),v=D.slice(0,Math.min(C,b)),y=v.length,a="";for(d=0;d<y;d++)if(o=q(w[d],v[d],M),o==="end")a=o;else if(o==="invalid"){a=o;break}else if(a==="")a="valid";if(a==="invalid"){b--;break}if(a==="end")break;if(a==="valid")b++}return Math.min(C,b)}function S(O,D,M){let C,j=Math.min(O.length,D.length),w,v,y="",b,d=M.fittingRules||{};for(C=0;C<j;C++)if(w=O.substring(C,C+1),v=D.substring(C,C+1),w!==" "&&v!==" ")if(d.vLayout===T)y+=R(w,v);else if(d.vLayout===A)y+=R(w,v);else b=!1,b=d.vRule5?F(w,v):b,b=!b&&d.vRule1?V(w,v):b,b=!b&&d.vRule2?N(w,v):b,b=!b&&d.vRule3?z(w,v):b,b=!b&&d.vRule4?Q(w,v):b,y+=b;else y+=R(w,v);return y}function g(O,D,M,C){let j=O.length,w=D.length,v=O.slice(0,Math.max(0,j-M)),y=O.slice(Math.max(0,j-M),j),b=D.slice(0,Math.min(M,w)),d,o,a,s=[],T_;o=y.length;for(d=0;d<o;d++){if(d>=w)a=y[d];else a=S(y[d],b[d],C);s.push(a)}return T_=D.slice(Math.min(M,w),w),[...v,...s,...T_]}function l(O,D){let M=" ".repeat(D);return O.map((C)=>C+M)}function c(O,D,M){let C=O[0].length,j=D[0].length,w;if(C>j)D=l(D,C-j);else if(j>C)O=l(O,j-C);return w=f(O,D,M),g(O,D,w,M)}function W_(O,D,M){let C=M.fittingRules||{};if(C.hLayout===_)return 0;let j,w=O.length,v=D.length,y=w,b=1,d=!1,o,a,s,T_;if(w===0)return 0;_:while(b<=y){let v1=w-b;o=O.substring(v1,v1+b),a=D.substring(0,Math.min(b,v));for(j=0;j<Math.min(b,v);j++)if(s=o.substring(j,j+1),T_=a.substring(j,j+1),s!==" "&&T_!==" "){if(C.hLayout===T){b=b-1;break _}else if(C.hLayout===A){if(s===M.hardBlank||T_===M.hardBlank)b=b-1;break _}else if(d=!0,!(C.hRule1&&Z(s,T_,M.hardBlank)||C.hRule2&&Y(s,T_)||C.hRule3&&K(s,T_)||C.hRule4&&$(s,T_)||C.hRule5&&G(s,T_)||C.hRule6&&U(s,T_,M.hardBlank))){b=b-1;break _}}if(d)break;b++}return Math.min(y,b)}function p_(O,D,M,C){let j,w,v=[],y,b,d,o,a,s,T_,v1,E1=C.fittingRules||{};if(typeof C.height!=="number")throw Error("height is not defined.");for(j=0;j<C.height;j++){T_=O[j],v1=D[j],a=T_.length,s=v1.length,y=a-M,b=T_.slice(0,Math.max(0,y)),d="";let D4=Math.max(0,a-M),h1=T_.substring(D4,D4+M),JT=v1.substring(0,Math.min(M,s));for(w=0;w<M;w++){let Q1=w<a?h1.substring(w,w+1):" ",L1=w<s?JT.substring(w,w+1):" ";if(Q1!==" "&&L1!==" ")if(E1.hLayout===T||E1.hLayout===A)d+=R(Q1,L1,C.hardBlank);else{let RN=E1.hRule1&&Z(Q1,L1,C.hardBlank)||E1.hRule2&&Y(Q1,L1)||E1.hRule3&&K(Q1,L1)||E1.hRule4&&$(Q1,L1)||E1.hRule5&&G(Q1,L1)||E1.hRule6&&U(Q1,L1,C.hardBlank)||R(Q1,L1,C.hardBlank);d+=RN}else d+=R(Q1,L1,C.hardBlank)}if(M>=s)o="";else o=v1.substring(M,M+Math.max(0,s-M));v[j]=b+d+o}return v}function q_(O){return Array(O).fill("")}let C_=function(O){return Math.max(...O.map((D)=>D.length))};function K_(O,D,M){return O.reduce(function(C,j){return p_(C,j.fig,j.overlap||0,M)},q_(D))}function M_(O,D,M){for(let C=O.length-1;C>0;C--){let j=K_(O.slice(0,C),D,M);if(C_(j)<=M.width)return{outputFigText:j,chars:O.slice(C)}}return{outputFigText:q_(D),chars:O}}function I_(O,D,M){let C,j,w=0,v,y,b,d=M.height,o=[],a,s={chars:[],overlap:w},T_=[],v1,E1,D4,h1,JT;if(typeof d!=="number")throw Error("height is not defined.");y=q_(d);let Q1=M.fittingRules||{};if(M.printDirection===1)O=O.split("").reverse().join("");b=O.length;for(C=0;C<b;C++)if(v1=O.substring(C,C+1),E1=v1.match(/\s/),j=D[v1.charCodeAt(0)],h1=null,j){if(Q1.hLayout!==_){w=1e4;for(v=0;v<d;v++)w=Math.min(w,W_(y[v],j[v],M));w=w===1e4?0:w}if(M.width>0){if(M.whitespaceBreak)D4=K_(s.chars.concat([{fig:j,overlap:w}]),d,M),h1=K_(T_.concat([{fig:D4,overlap:s.overlap}]),d,M),a=C_(h1);else h1=p_(y,j,w,M),a=C_(h1);if(a>=M.width&&C>0)if(M.whitespaceBreak){if(y=K_(T_.slice(0,-1),d,M),T_.length>1)o.push(y),y=q_(d);T_=[]}else o.push(y),y=q_(d)}if(M.width>0&&M.whitespaceBreak){if(!E1||C===b-1)s.chars.push({fig:j,overlap:w});if(E1||C===b-1){JT=null;while(!0)if(h1=K_(s.chars,d,M),a=C_(h1),a>=M.width)JT=M_(s.chars,d,M),s={chars:JT.chars},o.push(JT.outputFigText);else break;if(a>0)if(JT)T_.push({fig:h1,overlap:1});else T_.push({fig:h1,overlap:s.overlap});if(E1)T_.push({fig:j,overlap:w}),y=q_(d);if(C===b-1)y=K_(T_,d,M);s={chars:[],overlap:w};continue}}y=p_(y,j,w,M)}if(C_(y)>0)o.push(y);if(!M.showHardBlanks)o.forEach(function(L1){b=L1.length;for(v=0;v<b;v++)L1[v]=L1[v].replace(new RegExp("\\"+M.hardBlank,"g")," ")});if(O===""&&o.length===0)o.push(Array(d).fill(""));return o}let j_=function(O,D){let M,C=D.fittingRules||{};if(O==="default")M={hLayout:C.hLayout,hRule1:C.hRule1,hRule2:C.hRule2,hRule3:C.hRule3,hRule4:C.hRule4,hRule5:C.hRule5,hRule6:C.hRule6};else if(O==="full")M={hLayout:_,hRule1:!1,hRule2:!1,hRule3:!1,hRule4:!1,hRule5:!1,hRule6:!1};else if(O==="fitted")M={hLayout:T,hRule1:!1,hRule2:!1,hRule3:!1,hRule4:!1,hRule5:!1,hRule6:!1};else if(O==="controlled smushing")M={hLayout:E,hRule1:!0,hRule2:!0,hRule3:!0,hRule4:!0,hRule5:!0,hRule6:!0};else if(O==="universal smushing")M={hLayout:A,hRule1:!1,hRule2:!1,hRule3:!1,hRule4:!1,hRule5:!1,hRule6:!1};else return;return M},R0=function(O,D){let M={},C=D.fittingRules||{};if(O==="default")M={vLayout:C.vLayout,vRule1:C.vRule1,vRule2:C.vRule2,vRule3:C.vRule3,vRule4:C.vRule4,vRule5:C.vRule5};else if(O==="full")M={vLayout:_,vRule1:!1,vRule2:!1,vRule3:!1,vRule4:!1,vRule5:!1};else if(O==="fitted")M={vLayout:T,vRule1:!1,vRule2:!1,vRule3:!1,vRule4:!1,vRule5:!1};else if(O==="controlled smushing")M={vLayout:E,vRule1:!0,vRule2:!0,vRule3:!0,vRule4:!0,vRule5:!0};else if(O==="universal smushing")M={vLayout:A,vRule1:!1,vRule2:!1,vRule3:!1,vRule4:!1,vRule5:!1};else return;return M},y1=function(O,D,M){M=M.replace(/\r\n/g,`
|
|
38
38
|
`).replace(/\r/g,`
|
|
39
39
|
`);let C=M.split(`
|
|
40
40
|
`),j=[],w,v,y;v=C.length;for(w=0;w<v;w++)j=j.concat(I_(C[w],L[O],D));v=j.length,y=j[0];for(w=1;w<v;w++)y=c(y,j[w],D);return y?y.join(`
|
|
@@ -2609,7 +2609,7 @@ Font modified May 20, 2012 by patorjk to add the 0xCA0 character
|
|
|
2609
2609
|
</html>`}class U5{server=null;authenticator;ptyManager;running=!1;startedAt;config;logger=k();sessionMap=new Map;name="CCC Terminal Service";constructor(_){this.config=_,this.authenticator=new rL,this.ptyManager=new sL}async start(){try{this.server=Bun.serve({hostname:"localhost",port:this.config.port,fetch:(_,T)=>this.handleRequest(_,T),websocket:{open:(_)=>this.handleWebSocketOpen(_),message:(_,T)=>this.handleWebSocketMessage(_,T),close:(_)=>this.handleWebSocketClose(_)}}),this.running=!0,this.startedAt=new Date,this.logger.debug(`Terminal Server started on localhost:${this.config.port}`)}catch(_){throw new HT(`Failed to start terminal server: ${_ instanceof Error?_.message:String(_)}`)}}async stop(){try{if(!this.running)return;if(this.ptyManager.closeAllSessions(),this.server)this.server.stop();this.running=!1,this.logger.debug("Terminal Server stopped")}catch(_){throw new HT(`Failed to stop terminal server: ${_ instanceof Error?_.message:String(_)}`)}}getStatus(){return{name:"Terminal Server",running:this.running,port:this.config.port,startedAt:this.startedAt,credentials:this.authenticator.getCredentials(),activeSessions:this.ptyManager.getActiveSessionCount()}}setProjectPath(_){this.ptyManager.setProjectPath(_)}findSessionByProjectPath(_){return this.ptyManager.findSessionByCwd(_)}getSessionInfo(_){return this.ptyManager.getSessionInfo(_)}authenticateRequest(_){let T=new URL(_.url),A="unknown",E=T.searchParams.get("auth");if(E)try{let J=Buffer.from(E,"base64").toString("utf-8"),X=J.indexOf(":");if(X===-1)return this.logger.debug("Auth param missing colon delimiter"),!1;let H=J.substring(0,X),Z=J.substring(X+1);return this.logger.debug("Auth via query param",{username:H.substring(0,8)+"..."}),this.authenticator.authenticate(H,Z,"unknown")}catch(J){return this.logger.debug("Auth param error",{error:String(J)}),!1}let L=_.headers.get("authorization");if(L?.startsWith("Basic "))try{let J=L.slice(6),X=Buffer.from(J,"base64").toString("utf-8"),H=X.indexOf(":");if(H===-1)return this.logger.debug("Auth header missing colon delimiter"),!1;let Z=X.substring(0,H),Y=X.substring(H+1);return this.logger.debug("Auth via header",{username:Z.substring(0,8)+"..."}),this.authenticator.authenticate(Z,Y,"unknown")}catch(J){return this.logger.debug("Auth header error",{error:String(J)}),!1}return this.logger.debug("No auth credentials provided",{hasAuthParam:!!E,hasAuthHeader:!!L}),!1}handleRequest(_,T){let A=new URL(_.url);if(A.pathname==="/terminal/ws"||A.pathname==="/terminal"){if(_.headers.get("upgrade")?.toLowerCase()==="websocket"){if(!this.authenticateRequest(_))return new Response("Unauthorized",{status:401});if(T.upgrade(_,{data:{type:"terminal-ws",url:A.toString(),authenticated:!0}}))return new Response;return new Response("WebSocket upgrade failed",{status:400})}}if(A.pathname==="/terminal"&&_.method==="GET"){if(!this.authenticateRequest(_))return new Response("Authentication required",{status:401,headers:{"WWW-Authenticate":'Basic realm="Terminal"',"Content-Type":"text/plain"}});let E=this.authenticator.getCredentials(),L=sU(E);return new Response(L,{headers:{"Content-Type":"text/html; charset=utf-8","Content-Length":Buffer.byteLength(L).toString(),"Cache-Control":"no-cache, no-store, must-revalidate"}})}return new Response("Not Found",{status:404})}handleWebSocketOpen(_){this.logger.debug("WebSocket connection opened (authenticated)")}async handleWebSocketMessage(_,T){try{let A;if(typeof T==="string")A=T;else if(T instanceof ArrayBuffer)A=new TextDecoder().decode(T);else if(T instanceof Uint8Array)A=new TextDecoder().decode(T);else return;let E=this.sessionMap.get(_);if(A.startsWith("INIT:")||A.startsWith("RESIZE:")||A.startsWith("RESUME:")){let L=A.startsWith("INIT:")?"INIT:":A.startsWith("RESUME:")?"RESUME:":"RESIZE:",J=JSON.parse(A.substring(L.length)),{cols:X,rows:H,cwd:Z,sessionId:Y}=J;if(!X||!H){this.logger.warn("Invalid dimensions received",{cols:X,rows:H});return}if(L==="RESUME:"&&Y){if(this.ptyManager.canResumeSession(Y)){this.logger.debug(`Resuming session: ${Y}`),this.sessionMap.set(_,Y),this.ptyManager.updateDataHandler(Y,($)=>{try{if(_.readyState===1)_.send($)}catch(G){}});let K=this.ptyManager.resumeSession(Y,X,H);if(_.send(`SESSION:${Y}`),K&&K.length>0)for(let $ of K)try{if(_.readyState===1)_.send($)}catch(G){break}_.send(`\x1B[38;5;209m\u2713 Session resumed\x1B[0m\r
|
|
2610
2610
|
`)}else this.logger.debug(`Session not found for resume: ${Y}`),_.send("SESSION_NOT_FOUND");return}if(!E&&L==="INIT:"){if(Z)this.ptyManager.setProjectPath(Z),this.logger.debug(`Terminal working directory set to: ${Z}`);let K=crypto.randomUUID();await this.ptyManager.createSession(K,X,H),this.sessionMap.set(_,K),this.ptyManager.setupDataHandler(K,($)=>{try{if(_.readyState===1)_.send($)}catch(G){}}),_.send(`SESSION:${K}`),_.send(`\x1B[38;5;209m\u2713 Connected to CCC Terminal\x1B[0m\r
|
|
2611
2611
|
\r
|
|
2612
|
-
`)}else if(E&&L==="RESIZE:")this.ptyManager.resizeSession(E,X,H);return}if(E)if(this.ptyManager.getSession(E))this.ptyManager.writeToSession(E,A);else this.logger.warn("PTY session not found",{sessionId:E})}catch(A){this.logger.error("Error handling WebSocket message",A)}}handleWebSocketClose(_){let T=this.sessionMap.get(_);if(T)this.sessionMap.delete(_),this.ptyManager.disconnectSession(T)}}import*as W5 from"http";import*as eU from"net";import{WebSocketServer as Oh,WebSocket as tU}from"ws";class N5{server=null;wss=null;running=!1;startedAt;config;logger=k();routes
|
|
2612
|
+
`)}else if(E&&L==="RESIZE:")this.ptyManager.resizeSession(E,X,H);return}if(E)if(this.ptyManager.getSession(E))this.ptyManager.writeToSession(E,A);else this.logger.warn("PTY session not found",{sessionId:E})}catch(A){this.logger.error("Error handling WebSocket message",A)}}handleWebSocketClose(_){let T=this.sessionMap.get(_);if(T)this.sessionMap.delete(_),this.ptyManager.disconnectSession(T)}}import*as W5 from"http";import*as eU from"net";import{WebSocketServer as Oh,WebSocket as tU}from"ws";class N5{server=null;wss=null;running=!1;startedAt;config;logger=k();routes;activeBrokerSockets=new Set;name="CCC Router Service";constructor(_){this.config=_,this.routes=[{path:"/mqtt",target:`localhost:${_.mqttPort}`},{path:"/terminal",target:`localhost:${_.terminalPort}`}]}async start(){return new Promise((_,T)=>{try{this.server=W5.createServer((A,E)=>{this.handleHttpRequest(A,E)}),this.wss=new Oh({noServer:!0}),this.server.on("upgrade",(A,E,L)=>{this.handleWebSocketUpgrade(A,E,L)}),this.server.on("error",(A)=>{this.logger.error("Router error",{error:A instanceof Error?A.message:String(A)}),T(A)}),this.server.listen(this.config.port,"0.0.0.0",()=>{this.running=!0,this.startedAt=new Date,this.logger.debug(`Router started on 0.0.0.0:${this.config.port}`),this.logger.debug(`Routes: ${this.routes.map((A)=>`${A.path} -> ${A.target}`).join(", ")}`),_()})}catch(A){T(new b5(`Failed to start router: ${A instanceof Error?A.message:String(A)}`))}})}handleHttpRequest(_,T){let A=_.url||"/",E=this.findRoute(A);if(!E){T.writeHead(404,{"Content-Type":"text/plain"}),T.end("Not Found");return}this.forwardHttpRequest(_,T,E)}forwardHttpRequest(_,T,A){let[E,L]=A.target.split(":"),J=parseInt(L||"8883",10),X={hostname:E||"localhost",port:J,path:_.url,method:_.method,headers:_.headers},H=W5.request(X,(Z)=>{T.writeHead(Z.statusCode||200,Z.headers),Z.pipe(T)});H.on("error",(Z)=>{this.logger.error("HTTP proxy error",{error:Z instanceof Error?Z.message:String(Z),target:A.target,path:_.url,method:_.method,code:Z.code}),T.writeHead(502,{"Content-Type":"text/plain"}),T.end(`Bad Gateway - Unable to connect to backend service
|
|
2613
2613
|
`)}),_.pipe(H)}async stop(){if(!this.server&&!this.wss)return;return new Promise((_)=>{for(let T of this.activeBrokerSockets)try{T.destroy()}catch(A){this.logger.debug("Error destroying broker socket",{error:A})}if(this.activeBrokerSockets.clear(),this.wss)this.wss.clients?.forEach((T)=>{T.close(1000,"Server shutting down")}),this.wss.close(),this.wss=null;if(this.server){let T=setTimeout(()=>{this.logger.warn("Server close timeout, forcing shutdown"),this.running=!1,this.server=null,_()},500);this.server.close(()=>{clearTimeout(T),this.logger.debug("Router stopped"),this.running=!1,this.server=null,_()})}else _()})}getStatus(){return{name:"Router",running:this.running,port:this.config.port,startedAt:this.startedAt,routes:this.routes}}addRoute(_,T){let A=this.routes.findIndex((E)=>E.path===_);if(A>=0&&this.routes[A])this.routes[A].target=T;else this.routes.push({path:_,target:T});if(this.config.debug)this.logger.debug(`Route added: ${_} -> ${T}`)}handleWebSocketUpgrade(_,T,A){let E=_.url||"/";this.logger.debug("WebSocket upgrade request",{url:E});let L=this.findRoute(E);if(!L){this.logger.warn("WebSocket upgrade to unknown path",{url:E}),T.destroy();return}this.wss?.handleUpgrade(_,T,A,(J)=>{if(E.startsWith("/mqtt"))this.bridgeWebSocketToTcp(J,L);else this.bridgeWebSocketToWebSocket(J,L,E)})}bridgeWebSocketToTcp(_,T){let[A,E]=T.target.split(":"),L=parseInt(E||"8883",10);this.logger.debug("WebSocket-to-TCP bridge established",{target:T.target});let J=eU.connect(L,A||"localhost",()=>{this.logger.debug("Connected to MQTT broker",{target:T.target})});this.activeBrokerSockets.add(J),_.on("message",(X)=>{if(!J.destroyed&&J.writable)J.write(X);else this.logger.warn("Broker socket not writable")}),J.on("data",(X)=>{_.send(X,(H)=>{if(H)this.logger.error("Error sending WebSocket message",{error:H instanceof Error?H.message:String(H)})})}),_.on("close",()=>{this.logger.debug("WebSocket client closed"),J.destroy()}),_.on("error",(X)=>{this.logger.error("WebSocket error",{error:X.message}),J.destroy()}),J.on("close",()=>{this.logger.debug("MQTT broker connection closed"),this.activeBrokerSockets.delete(J),_.close()}),J.on("error",(X)=>{this.logger.error("MQTT broker error",{error:X.message,target:T.target}),this.activeBrokerSockets.delete(J),_.close()})}bridgeWebSocketToWebSocket(_,T,A){let[E,L]=T.target.split(":"),J=parseInt(L||"3001",10),H=`ws://${E||"localhost"}:${J}${A}`;this.logger.debug("WebSocket-to-WebSocket bridge connecting",{target:H});let Z=new tU(H),Y=[],K=!1;Z.on("open",()=>{K=!0;while(Y.length>0){let $=Y.shift();Z.send($)}}),_.on("message",($)=>{let G=typeof $==="string"?$:$.toString("utf-8");if(K&&Z.readyState===tU.OPEN)Z.send(G);else Y.push(G)}),Z.on("message",($)=>{let G=typeof $==="string"?$:$.toString("utf-8");if(_.readyState===1)_.send(G)}),_.on("close",()=>{Z.close()}),_.on("error",($)=>{this.logger.error("Client WebSocket error",{error:$.message}),Z.close()}),Z.on("close",()=>{_.close()}),Z.on("error",($)=>{this.logger.error("Target WebSocket error",{error:$.message}),_.close()})}findRoute(_){let T=_.split("?")[0]||_,A=this.routes.find((E)=>E.path===T);if(A)return A;return this.routes.find((E)=>T.startsWith(E.path+"/")||T===E.path)}}var tL=null;async function Rh(){if(!tL)tL=await import("@ngrok/ngrok");return tL.default}class Q5{listener;tunnelUrl=null;running=!1;startedAt;config;name="CCC Ngrok Service";constructor(_){this.config=_}async start(){try{let _=k();_.debug("Starting ngrok tunnel",{port:this.config.routerPort,domain:this.config.domain||"(auto)"});let T={authtoken:this.config.authToken,addr:`localhost:${this.config.routerPort}`};if(this.config.domain)T.domain=this.config.domain;let A=await Rh();this.listener=await A.forward(T),this.tunnelUrl=this.listener.url(),this.running=!0,this.startedAt=new Date;let E=this.tunnelUrl?.replace(/^https?:\/\//,"");_.debug("ngrok tunnel established",{url:E,fullUrl:this.tunnelUrl})}catch(_){let T=k(),A=_ instanceof Error?_.message:String(_);throw T.error("Failed to start ngrok tunnel",_),Error(`ngrok tunnel failed: ${A}`)}}async stop(){try{let _=k();if(!this.running)return;if(_.debug("Stopping ngrok tunnel"),this.listener)await Promise.race([this.listener.close(),new Promise((T)=>{setTimeout(()=>{_.warn("ngrok listener close timeout, forcing shutdown"),T()},3000)})]);this.running=!1,this.tunnelUrl=null,_.debug("ngrok tunnel closed")}catch(_){k().error("Error stopping ngrok tunnel",_)}}getStatus(){return{name:this.name,running:this.running,active:this.isActive(),tunnelUrl:this.tunnelUrl?this.tunnelUrl.replace(/^https?:\/\//,""):void 0,routerPort:this.config.routerPort,startedAt:this.startedAt}}getUrl(){return this.tunnelUrl}isActive(){return!!this.listener&&!!this.tunnelUrl}}var DW=B_(RW(),1);class F5{running=!1;startedAt;config;codesGenerated=0;name="CCC QR Code Service";constructor(_){this.config=_}async start(){try{let _=k();_.debug("QR Code Service starting"),this.running=!0,this.startedAt=new Date,this.display(),_.debug("QR Code Service started")}catch(_){throw k().error("Failed to start QR Code service",_),this.running=!1,_}}async stop(){try{let _=k();if(!this.running)return;this.running=!1,_.debug("QR Code Service stopped")}catch(_){k().error("Error stopping QR Code service",_)}}getStatus(){return{name:this.name,running:this.running,codesGenerated:this.codesGenerated,urls:{mdns:this.config.mdnsUrl,ipBased:this.config.ipBasedUrl,ngrok:this.config.ngrokUrl},startedAt:this.startedAt}}display(){let _=k();try{if(this.codesGenerated=0,console.log(`
|
|
2614
2614
|
`),this.config.mdnsUrl)this.displayQRCode(this.config.mdnsUrl,this.config.username,this.config.password,!1,this.config.profileName),this.codesGenerated++,console.log("");if(this.config.ipBasedUrl&&this.config.ipBasedUrl!==this.config.mdnsUrl)this.displayQRCode(this.config.ipBasedUrl,this.config.username,this.config.password,!1,this.config.profileName),this.codesGenerated++,console.log("");if(this.config.ngrokUrl)this.displayQRCode(this.config.ngrokUrl,this.config.username,this.config.password,!0,this.config.profileName),this.codesGenerated++,console.log("");if(this.codesGenerated===0)_.warn("No connection URLs available for QR codes");else _.debug(`Displayed ${this.codesGenerated} QR code(s)`);console.log(`Press "q" to redisplay QR codes
|
|
2615
2615
|
`)}catch(T){_.error("Error displaying QR codes",T)}}updateConfig(_){if(this.config={...this.config,..._},this.running)this.display()}displayQRCode(_,T,A,E,L){let J={serverUrl:_,useSSL:E,profileName:L};if(T)J.username=T;if(A)J.password=A;let X=JSON.stringify(J);DW.default.generate(X,{small:!0});let H=this.getLabel(_,E);console.log(`${H}`),console.log(` Server: ${_}`),console.log(` Profile: ${L}`),console.log(` Username: ${T?`${T.substring(0,8)}...`:"(none)"}`),console.log(` Password: ${A?"***":"(none)"}`),console.log(` SSL/TLS: ${E?"Yes (wss)":"No (ws)"}`)}getLabel(_,T){if(_.includes("ngrok"))return"\uD83C\uDF10 REMOTE CONNECTION (ngrok)";if(_.includes(".")){let A=_?.split(":")[0]?.split(".")||[];if(A.length===4&&A.every((E)=>!isNaN(Number(E))))return"\uD83D\uDD04 IP-BASED CONNECTION"}return"\uD83D\uDCF1 LOCAL NETWORK CONNECTION (mDNS)"}}var j1=k();function BW(_){switch(_){case"alpha":return"alpha";case"beta":return"beta";default:return"latest"}}async function qW(_){let T=G1(),A=XT(T);j1.debug("Checking for updates",{currentVersion:T,releaseChannel:A,packageName:_});try{let E=BW(A),L=await fetch(`https://registry.npmjs.org/${_}`,{headers:{Accept:"application/json"}});if(!L.ok)return j1.warn("Failed to check for updates",{status:L.status,statusText:L.statusText}),{updateAvailable:!1,currentVersion:T,latestVersion:T,releaseChannel:A};let J=await L.json(),X=J["dist-tags"]?.[E]||J["dist-tags"]?.latest;if(j1.debug("NPM registry response",{distTags:J["dist-tags"],requestedTag:E,latestVersion:X}),!X)return j1.warn("Could not determine latest version from npm registry"),{updateAvailable:!1,currentVersion:T,latestVersion:T,releaseChannel:A};let H=f5(X,T);return j1.debug("Version comparison result",{currentVersion:T,latestVersion:X,updateAvailable:H,isNewer:f5(X,T)}),j1.debug("Update check completed",{currentVersion:T,latestVersion:X,updateAvailable:H,releaseChannel:A,distTag:E}),{updateAvailable:H,currentVersion:T,latestVersion:X,releaseChannel:A}}catch(E){return j1.error("Error checking for updates",{error:E}),{updateAvailable:!1,currentVersion:T,latestVersion:T,releaseChannel:A}}}async function IW(_){let T=G1(),A=XT(T),E=BW(A);j1.debug("Starting package update",{packageName:_,currentVersion:T,distTag:E});try{let L=Bun.spawn(["bun","install","-g",`${_}@${E}`],{stdout:"pipe",stderr:"pipe"}),J=await new Response(L.stdout).text(),X=await new Response(L.stderr).text(),H=await L.exited;if(H!==0)return j1.error("Package update failed",{error:X,packageName:_,exitCode:H}),!1;if(j1.debug("Package updated successfully",{packageName:_,distTag:E}),J)j1.debug("bun install output",{output:J.trim()});return!0}catch(L){return j1.error("Package update error",{error:L}),!1}}class C5{name="CCC Auto-Update Service";config;running=!1;enabled=!1;logger=k();checkInterval=null;lastCheckTime;nextCheckTime;updateAvailable=!1;latestVersion;startedAt;constructor(_){this.config={checkIntervalMinutes:60,..._},this.enabled=_.enabled}async start(){try{if(this.logger.debug("Starting Auto-Update Service",{enabled:this.enabled,packageName:this.config.packageName,checkIntervalMinutes:this.config.checkIntervalMinutes}),!this.enabled){this.logger.info("Auto-Update Service disabled"),this.running=!1;return}this.running=!0,this.startedAt=new Date,this.logger.info("Performing initial update check"),await this.performUpdateCheck(),this.scheduleNextCheck(),this.logger.info("Auto-Update Service started",{nextCheckTime:this.nextCheckTime})}catch(_){throw this.logger.error("Failed to start Auto-Update Service",_),_}}async stop(){try{if(!this.running)return;if(this.checkInterval)clearInterval(this.checkInterval),this.checkInterval=null;this.running=!1,this.logger.debug("Auto-Update Service stopped")}catch(_){throw this.logger.error("Failed to stop Auto-Update Service",_),_}}getStatus(){return{name:this.name,running:this.running,enabled:this.enabled,lastCheckTime:this.lastCheckTime,nextCheckTime:this.nextCheckTime,currentVersion:G1(),updateAvailable:this.updateAvailable,latestVersion:this.latestVersion,releaseChannel:XT(G1()),startedAt:this.startedAt}}scheduleNextCheck(){if(!this.enabled)return;let _=(this.config.checkIntervalMinutes||60)*60*1000;if(this.nextCheckTime=new Date(Date.now()+_),this.checkInterval)clearInterval(this.checkInterval);this.checkInterval=setInterval(async()=>{try{await this.performUpdateCheck(),this.scheduleNextCheck()}catch(T){this.logger.error("Error in scheduled update check",T)}},_),this.logger.debug("Next update check scheduled",{nextCheckTime:this.nextCheckTime,intervalMinutes:this.config.checkIntervalMinutes})}async performUpdateCheck(){this.lastCheckTime=new Date;try{this.logger.debug("Performing update check",{packageName:this.config.packageName,currentVersion:G1()});let{updateAvailable:_,latestVersion:T,currentVersion:A,releaseChannel:E}=await qW(this.config.packageName);if(this.updateAvailable=_,this.latestVersion=T,_)this.logger.info("Update available",{current:A,latest:T,channel:E}),await this.performAutoUpdate();else this.logger.debug("Already running latest version",{version:A,channel:E})}catch(_){this.logger.error("Error during update check",_)}}async performAutoUpdate(){try{if(this.logger.info("Starting auto-update",{packageName:this.config.packageName}),await IW(this.config.packageName))this.logger.info("Package update installed successfully",{newVersion:this.latestVersion,packageName:this.config.packageName});else this.logger.warn("Package update failed",{packageName:this.config.packageName})}catch(_){this.logger.error("Error during auto-update",_)}}}import{watch as vh,readdirSync as hh,existsSync as kh}from"fs";import{stat as SW}from"fs/promises";import{join as gT,basename as fh}from"path";import{homedir as yW}from"os";import*as d_ from"path";import*as O5 from"os";var M4=k();class PW{async parseSessionFile(_,T,A=50){let E=!1;try{let L=Bun.file(_);if(!await L.exists())return M4.warn("[SessionMessageParser] Session file not found:",_),{messages:[],hasMore:!1};let H=(await L.text()).trim().split(`
|