@termiq/cli 1.13.3 → 1.14.0
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/bin.js +2 -2
- package/package.json +1 -1
package/dist/bin.js
CHANGED
|
@@ -44,8 +44,8 @@ tell application "System Events" to get value of property list item "CFBundleNam
|
|
|
44
44
|
|
|
45
45
|
`),!1)}catch(n){return t.error("Login error",n),process.stderr.write(`Login error: ${n instanceof Error?n.message:String(n)}
|
|
46
46
|
`),!1}}var $i=ae(hr());function Bv(r){switch(r){case"numbered-choice":return"select";case"free-input":return"input";default:return"confirmation"}}function Fd(r,e,t){let i=new Date().toISOString();switch(r){case"working":return e==="idle"?{type:$i.TerminalEventType.SESSION_START,timestamp:i}:null;case"waiting":return{type:$i.TerminalEventType.WAITING_INPUT,timestamp:i,promptType:Bv(t?.type),question:t?.question||"Confirm action?",options:t?.choices?.map(n=>n.label)};case"completed":return{type:$i.TerminalEventType.SESSION_END,timestamp:i,status:"success"};case"error":return e==="working"?{type:$i.TerminalEventType.SESSION_END,timestamp:i,status:"error"}:{type:$i.TerminalEventType.ERROR,timestamp:i,severity:"error",message:"Command failed"};default:return null}}async function jd(r){let{storage:e,config:t,logger:i,machineId:n,notification:s,browser:a,cwd:c,watch:u,statusLine:d,multiViewer:g}=r,m=new go(i);d&&m.enable();let y=t.getServerUrl(),b=new URL(y).host,T=await n.getMachineId(),C=new yt.CryptoService(e,i,b,T);await C.initialize();let H=new yt.AuthService(e,C,n,t,i,s,a,b,T),ge=await H.hasValidToken();ge||await H.refreshAccessToken()||(process.stderr.write(`Not logged in. Starting login flow...
|
|
47
|
-
`),await mo(H,a,i)||process.exit(1),ge=!0);let Y;try{let{machineIdSync:w}=await Promise.resolve().then(()=>ae(bc()));Y=w()}catch{Y=`cli_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}let P,j=new yt.StatusDetector((w,L,O)=>{if(!I.getStatus().connected)return;let J=P;P=L,I.updateStatus({instanceId:ee,terminalId:w,status:L,prompt:O||void 0,encryptedPrompt:O&&C.encryptPromptInfo(O)||void 0}).catch(()=>{});let Pe=Fd(L,J,O);Pe&&I.sendTerminalEvent(ee,w,Pe)}),Q=g?[Bd.Capability.MULTI_VIEWER_RENDER]:[],I=new yt.WebSocketService(H,C,t,i,s,Y,"cli",Q);g&&i.info("Multi-viewer rendering capability advertised");let oe=!1;I.onStatusChange(w=>{w==="connected"
|
|
48
|
-
`),oe=!0
|
|
47
|
+
`),await mo(H,a,i)||process.exit(1),ge=!0);let Y;try{let{machineIdSync:w}=await Promise.resolve().then(()=>ae(bc()));Y=w()}catch{Y=`cli_${Date.now()}_${Math.random().toString(36).slice(2,9)}`}let P,j=new yt.StatusDetector((w,L,O)=>{if(!I.getStatus().connected)return;let J=P;P=L,I.updateStatus({instanceId:ee,terminalId:w,status:L,prompt:O||void 0,encryptedPrompt:O&&C.encryptPromptInfo(O)||void 0}).catch(()=>{});let Pe=Fd(L,J,O);Pe&&I.sendTerminalEvent(ee,w,Pe)}),Q=g?[Bd.Capability.MULTI_VIEWER_RENDER]:[],I=new yt.WebSocketService(H,C,t,i,s,Y,"cli",Q);g&&i.info("Multi-viewer rendering capability advertised");let oe=!1;I.onStatusChange(w=>{if(w==="connected"){if(oe)i.info("Reconnected to termiq.io");else{let L=g?" (multi-viewer mode)":"";process.stderr.write(`Connected to termiq.io${L}
|
|
48
|
+
`),oe=!0}m.update({online:!0})}else w==="disconnected"&&(i.info("Disconnected from termiq.io (will retry)"),m.update({online:!1}))}),I.onAuthFailure(()=>{process.stderr.write(`Session expired. Please run "termiq login" again.
|
|
49
49
|
`),ut(),process.exit(1)});try{await I.connect()}catch(w){process.stderr.write(`Connection failed: ${w instanceof Error?w.message:String(w)}
|
|
50
50
|
`),process.exit(1)}let fe=Md.basename(c),ee=`cli_${Date.now()}`,Oe=C.encryptWorkspaceInfo({name:fe,path:c});await I.registerWorkspace({instanceId:ee,name:Oe?void 0:fe,path:Oe?void 0:c,encryptedInfo:Oe||void 0});let ke=new no(i);ke.setPreWriteHook(w=>m.inspectPtyOutput(w)),ke.setOnResize((w,L)=>{m.update({ptyCols:w,ptyRows:L})});let be=ke.spawn(c,m.reservedRows()),xe=`CLI: ${fe}`,Ge=process.env.SHELL||"/bin/bash",Ie=C.encryptTerminalInfo({name:xe,command:Ge,cwd:c});await I.terminalCreated({instanceId:ee,terminalId:be,name:Ie?void 0:xe,command:Ie?void 0:Ge,cwd:Ie?void 0:c,encryptedInfo:Ie||void 0,streamId:ke.getStreamId()??void 0});let Ye=new yt.FileTransferService(i),Ue=new yt.FileTrackerService(i,c),Ae=new yt.FileListService(i,c),et=u?new po(i,c):null,Xe=I.getSocket();Xe&&Ye.attach(Xe,ee),Ue.onFileChanged((w,L)=>{I.sendFileChangedEvent(ee,w,L)}),Ue.onFileViewTransfer(async(w,L,O)=>{try{await Ye.sendBuffer(w,L,O.path.split("/").pop()||"view",O.mimeType||"text/plain",{purpose:"view",viewMetadata:O})}catch(J){i.error("File view transfer failed",J)}}),I.onFileViewRequest((w,L)=>{Ue.handleViewRequest(w,L)}),I.onFileListRequest((w,L)=>{Ae.handleListRequest(L)}),Ae.onResponse(w=>{I.sendFileListResponse(ee,w)}),I.onFileDownloadRequest(async(w,L,O)=>{try{await Ye.sendFile(w,L,void 0,void 0,O)}catch(J){i.error("File download failed",J)}}),et&&(et.onFileChanged(w=>{I.sendFileChangedEvent(ee,be,w)}),et.start()),j.startTracking(be),ke.setOnOutput(w=>{I.sendOutput(ee,be,w),j.processOutput(be,w),Ue.processOutput(be,w)}),I.onInput((w,L,O,J)=>{w===be&&ke.write(L,J)}),I.setTerminalActiveCheck(w=>w===be&&ke.isAlive()),I.onResizeRequest((w,L,O)=>{w===be&&(i.info("Remote resize received",{terminalId:w,cols:L,rows:O}),ke.resize(L,O))}),I.onClientAttached(({clientCount:w})=>{ke.setSigwinchEnabled(!1),m.update({viewerCount:w}),I.sendInputResume(be)}),I.onClientDetached(({clientCount:w})=>{w===0&&ke.setSigwinchEnabled(!0),m.update({viewerCount:w})}),I.onGetBufferRequest(w=>w===be?ke.getBuffer():null),I.onRedrawRequest(w=>{w===be&&ke.redrawNoResize()}),I.onReconnect(async()=>{try{await I.registerWorkspace({instanceId:ee,name:Oe?void 0:fe,path:Oe?void 0:c,encryptedInfo:Oe||void 0}),await I.terminalCreated({instanceId:ee,terminalId:be,name:Ie?void 0:xe,command:Ie?void 0:Ge,cwd:Ie?void 0:c,encryptedInfo:Ie||void 0});let w=I.getSocket();w&&Ye.attach(w,ee)}catch(w){i.error("Failed to re-register on reconnect",w)}});function ut(){et?.dispose(),Ye.detach(),Ue.dispose(),Ae.dispose(),j.stopTracking(be),j.dispose(),I.disposeInputStream(be),I.terminalClosed({instanceId:ee,terminalId:be}).catch(()=>{}),I.unregisterWorkspace(ee).catch(()=>{}),I.disconnect(),ke.dispose()}ke.setOnExit(()=>{m.disable(),process.stderr.write(`Session ended.
|
|
51
51
|
`),ut(),process.exit(0)}),process.on("SIGINT",()=>{m.disable(),process.stderr.write(`Session ended.
|