@sma1lboy/rove 0.9.248 → 0.9.249

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/dist/cli/{chunk-ysfe09dd.js → chunk-0hkqt7nn.js} +2 -2
  2. package/dist/cli/{chunk-empeprq2.js → chunk-1qxr6wsw.js} +1 -1
  3. package/dist/cli/{chunk-e6w94amk.js → chunk-1xtmkdyn.js} +1 -1
  4. package/dist/cli/{chunk-ztcxkm24.js → chunk-21xgqgmv.js} +1 -1
  5. package/dist/cli/{chunk-043hdsx6.js → chunk-27sfb204.js} +1 -1
  6. package/dist/cli/{chunk-5nfdpc9j.js → chunk-4m18vee4.js} +1 -1
  7. package/dist/cli/{chunk-3b52kybr.js → chunk-4qwkxe0d.js} +1 -1
  8. package/dist/cli/{chunk-kxzv662p.js → chunk-544bbk17.js} +1 -1
  9. package/dist/cli/{chunk-8shm2q5k.js → chunk-5yb2rehg.js} +1 -1
  10. package/dist/cli/{chunk-esz0pj68.js → chunk-6fr3dfhy.js} +1 -1
  11. package/dist/cli/{chunk-xpt1rabn.js → chunk-7f1g1kxp.js} +1 -1
  12. package/dist/cli/{chunk-dhnbgfhh.js → chunk-7fc1ndtk.js} +1 -1
  13. package/dist/cli/{chunk-hmm0z8x9.js → chunk-7w9wkv9a.js} +1 -1
  14. package/dist/cli/{chunk-89ag6mab.js → chunk-7xttx9m1.js} +11 -11
  15. package/dist/cli/{chunk-7mxd2n7q.js → chunk-8gmxg77t.js} +1 -1
  16. package/dist/cli/{chunk-jjwxx8yp.js → chunk-8mfpv3fh.js} +1 -1
  17. package/dist/cli/{chunk-k4374n9t.js → chunk-99n8qsw9.js} +2 -2
  18. package/dist/cli/{chunk-761w6mbm.js → chunk-9mvm5zp2.js} +1 -1
  19. package/dist/cli/{chunk-v4fa5ycf.js → chunk-a0kyf848.js} +2 -2
  20. package/dist/cli/{chunk-ncxhtx5a.js → chunk-a97jt3kh.js} +1 -1
  21. package/dist/cli/{chunk-knpr38z6.js → chunk-b13q90ha.js} +1 -1
  22. package/dist/cli/{chunk-hfjd4j5b.js → chunk-c9m63446.js} +1 -1
  23. package/dist/cli/{chunk-ha09kd22.js → chunk-cg072925.js} +1 -1
  24. package/dist/cli/{chunk-jj640vvr.js → chunk-cm1ykwbs.js} +1 -1
  25. package/dist/cli/{chunk-twa07m8w.js → chunk-dbsmf3ce.js} +1 -1
  26. package/dist/cli/{chunk-dk3g9ynd.js → chunk-djvfxx5t.js} +16 -16
  27. package/dist/cli/{chunk-dmecdp9c.js → chunk-dzm8f4hx.js} +1 -1
  28. package/dist/cli/{chunk-9d2p1h1b.js → chunk-e8e9f42k.js} +1 -1
  29. package/dist/cli/{chunk-jxyvk9c0.js → chunk-eyxmdn3h.js} +1 -1
  30. package/dist/cli/{chunk-5ftfwgnj.js → chunk-fts71ez1.js} +1 -1
  31. package/dist/cli/{chunk-sxtxxd65.js → chunk-g4jd8vvb.js} +1 -1
  32. package/dist/cli/{chunk-n4f4xxhr.js → chunk-hd5vbg8d.js} +1 -1
  33. package/dist/cli/{chunk-2rve8y8t.js → chunk-j0eh1ve1.js} +1 -1
  34. package/dist/cli/{chunk-y79j580z.js → chunk-j4cqwqnc.js} +1 -1
  35. package/dist/cli/{chunk-frtdk8ha.js → chunk-j9m9zr27.js} +1 -1
  36. package/dist/cli/{chunk-q2177zrc.js → chunk-myzsv53b.js} +1 -1
  37. package/dist/cli/{chunk-5xh7ee2k.js → chunk-nh1g9yw6.js} +1 -1
  38. package/dist/cli/{chunk-09y7gspe.js → chunk-nqsf6j0s.js} +1 -1
  39. package/dist/cli/{chunk-cbhzyn31.js → chunk-ntrwd6ks.js} +1 -1
  40. package/dist/cli/{chunk-62wgn4br.js → chunk-nz084jp5.js} +1 -1
  41. package/dist/cli/{chunk-nz1436cx.js → chunk-ptb83b12.js} +1 -1
  42. package/dist/cli/{chunk-nra5y7r7.js → chunk-pyy41pch.js} +1 -1
  43. package/dist/cli/{chunk-y7xzcxb3.js → chunk-qrb2eqm5.js} +1 -1
  44. package/dist/cli/{chunk-ncxkn8gy.js → chunk-rr08hsha.js} +2 -2
  45. package/dist/cli/{chunk-ypjca5g3.js → chunk-rtcxzve2.js} +1 -1
  46. package/dist/cli/{chunk-30fygd49.js → chunk-rvqse0aa.js} +1 -1
  47. package/dist/cli/{chunk-ppj32x3a.js → chunk-s3md5y0b.js} +1 -1
  48. package/dist/cli/{chunk-55rpt311.js → chunk-s87vbwxy.js} +3 -3
  49. package/dist/cli/{chunk-b27fyc2m.js → chunk-sbgtbxhc.js} +1 -1
  50. package/dist/cli/{chunk-hdbj5yaz.js → chunk-sr9fd2qp.js} +2 -2
  51. package/dist/cli/{chunk-kcb75khv.js → chunk-twc7bdag.js} +1 -1
  52. package/dist/cli/{chunk-mra8t9tk.js → chunk-tydzne5g.js} +1 -1
  53. package/dist/cli/chunk-v59nnam9.js +3 -0
  54. package/dist/cli/{chunk-91gkmv3b.js → chunk-vaydxhdd.js} +1 -1
  55. package/dist/cli/{chunk-shdzs3kz.js → chunk-w0qy9ybf.js} +1 -1
  56. package/dist/cli/{chunk-wvwkmj3t.js → chunk-w6y3ksqa.js} +1 -1
  57. package/dist/cli/{chunk-bqthw6ce.js → chunk-wkt6h5cf.js} +1 -1
  58. package/dist/cli/{chunk-32zj8r86.js → chunk-wn4agkek.js} +1 -1
  59. package/dist/cli/{chunk-89ze9jc2.js → chunk-wtdj8n93.js} +1 -1
  60. package/dist/cli/{chunk-3y2tv956.js → chunk-x2gc4vx0.js} +3 -3
  61. package/dist/cli/chunk-x33sm4rp.js +5 -0
  62. package/dist/cli/{chunk-0qh9w2sc.js → chunk-y7mg74jx.js} +1 -1
  63. package/dist/cli/{chunk-wy7qtcym.js → chunk-yc4x46ha.js} +2 -2
  64. package/dist/cli/{chunk-taa06w9e.js → chunk-ydm5scdn.js} +1 -1
  65. package/dist/cli/{chunk-ekknb5ft.js → chunk-zh2t2wa9.js} +1 -1
  66. package/dist/cli/{chunk-9wfdzbnr.js → chunk-zpxjbrzt.js} +1 -1
  67. package/dist/cli/index.js +4 -4
  68. package/dist/cli/rove.js +1 -1
  69. package/dist/web/assets/{index-BC558ZDT.js → index-DgsWPjvG.js} +1 -1
  70. package/dist/web/index.html +1 -1
  71. package/package.json +3 -3
  72. package/dist/cli/chunk-b9t4vq5j.js +0 -3
  73. package/dist/cli/chunk-znjcesdr.js +0 -5
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{discoverMachine}from"./chunk-wtb8cycx.js";import{RemoteOrchestrator}from"./chunk-32zj8r86.js";import{startTunnel}from"./chunk-9jsm6h5y.js";import{dedupeMachines,duplicateAliasOf,listMachines,readMachines,setMachineIdentity,updateMachine}from"./chunk-9aydqazr.js";import{loadStateFile}from"./chunk-7q43tysm.js";import{createStateCell}from"./chunk-nhakrm1f.js";import{RoveDaemonClient}from"./chunk-0vpn32r6.js";import{logClient,logClientError}from"./chunk-hq9tbzqa.js";class MachineHub{local;slots=new Map;machinesAcc=createStateCell([],"machines.status");mergedAcc=createStateCell([],"machines.tasks");localUnsubscribe=null;disposed=!1;constructor(local){this.local=local}machinesSignal(){return this.machinesAcc}tasksSignal(){if(this.slots.size===0)return this.local.tasksSignal();return this.mergedAcc}remoteTaskIds(){let ids=new Set;for(let slot of this.slots.values())for(let task of slot.tasks)ids.add(String(task.id));return ids}attach(){let entries=dedupeMachines(listMachines());if(entries.length===0)return;for(let entry of entries)this.slots.set(entry.alias,{entry,tasks:[]});this.publishStatuses(),this.localUnsubscribe=this.local.tasksSignal().subscribe(()=>this.republishTasks()),this.republishTasks();for(let entry of entries)this.connect(entry)}async connect(entry){let slot=this.slots.get(entry.alias);if(!slot||this.disposed)return;let found=await discoverMachine(entry.alias,entry);if(this.disposed)return;let sockets=found.ok?{daemon:found.status.socketPath,pty:found.status.ptySocketPath}:entry.sockets;if(!sockets){this.setStatus(entry.alias,{state:"offline",error:found.ok?void 0:found.message});return}if(found.ok)updateMachine(entry.alias,{sockets});let tunnel=startTunnel({alias:entry.alias,config:entry,remoteDaemonSocket:sockets.daemon,remotePtySocket:sockets.pty});if(slot.tunnel=tunnel,tunnel.state()==="unsupported"){this.setStatus(entry.alias,{state:"unsupported",error:"SSH unix-socket forwarding is not available on Windows"});return}if(tunnel.onState((state)=>{if(state==="online")this.openOrchestrator(entry,tunnel);else if(state==="offline")this.setStatus(entry.alias,{state:"offline"}),this.republishTasks()}),tunnel.state()==="online")await this.openOrchestrator(entry,tunnel)}async openOrchestrator(entry,tunnel){let slot=this.slots.get(entry.alias);if(!slot||this.disposed||slot.orchestrator)return;let client=new RoveDaemonClient(tunnel.daemonSocketPath),orchestrator=new RemoteOrchestrator(client,{role:"gui",expectForeignHome:!0,onPeerIdentity:(peer)=>this.onPeerIdentity(entry.alias,peer)});slot.orchestrator=orchestrator;try{await orchestrator.init()}catch(err){let message=err instanceof Error?err.message:String(err);this.setStatus(entry.alias,{state:classifyHandshakeFailure(message),error:message}),logClientError("machines",err);return}let stopTasks=orchestrator.tasksSignal().subscribe(()=>{slot.tasks=orchestrator.tasksSignal().get(),this.republishTasks()}),stopConnection=orchestrator.connectionStateSignal().subscribe(()=>{let connected=orchestrator.connectionStateSignal().get()==="online";if(this.slots.get(entry.alias)!==slot)return;this.setStatus(entry.alias,{state:connected?"online":"offline"}),this.republishTasks()});slot.unsubscribe=()=>{stopTasks(),stopConnection()},slot.tasks=orchestrator.tasksSignal().get(),this.setStatus(entry.alias,{state:"online",version:orchestrator.daemonVersionSignal().get()??void 0}),this.republishTasks(),logClient("machines",`${entry.alias} online (${slot.tasks.length} tasks)`)}onPeerIdentity(alias,peer){if(!peer.hostname&&!peer.homeDir)return;let identity={hostname:peer.hostname,homeDir:peer.homeDir,daemonPid:peer.daemonPid};setMachineIdentity(alias,identity);let duplicate=duplicateAliasOf(readMachines(loadStateFile()),alias,identity);this.setStatus(alias,{hostname:peer.hostname||void 0,version:peer.roveVersion||void 0,...duplicate?{duplicateOf:duplicate}:{}})}setStatus(alias,patch){let next=this.machinesAcc.get().map((row)=>row.alias===alias?{...row,...patch}:row);this.machinesAcc.set(next)}publishStatuses(){this.machinesAcc.set([...this.slots.values()].map((slot)=>({alias:slot.entry.alias,hostLabel:slot.entry.alias,state:"connecting"})))}republishTasks(){let merged=this.local.tasksSignal().get().map((task)=>stampOrigin(task,"local","local"));for(let slot of this.slots.values()){let status=this.machinesAcc.get().find((row)=>row.alias===slot.entry.alias);if(status?.duplicateOf)continue;let hostLabel=status?.hostLabel||slot.entry.alias,stale=status?.state!=="online";for(let task of slot.tasks)merged.push(stampOrigin(task,slot.entry.alias,hostLabel,stale))}this.mergedAcc.set(merged)}dispose(){this.disposed=!0,this.localUnsubscribe?.();for(let slot of this.slots.values())slot.unsubscribe?.(),slot.orchestrator?.dispose(),slot.tunnel?.stop();this.slots.clear()}}function classifyHandshakeFailure(message){return/protocol v\d/i.test(message)?"mismatch":"offline"}function stampOrigin(task,machineId,hostLabel,stale=!1){return{...task,origin:{machineId,hostLabel,...stale?{stale:!0}:{}}}}
2
+ import{discoverMachine}from"./chunk-wtb8cycx.js";import{RemoteOrchestrator}from"./chunk-wn4agkek.js";import{startTunnel}from"./chunk-9jsm6h5y.js";import{dedupeMachines,duplicateAliasOf,listMachines,readMachines,setMachineIdentity,updateMachine}from"./chunk-9aydqazr.js";import{loadStateFile}from"./chunk-7q43tysm.js";import{createStateCell}from"./chunk-nhakrm1f.js";import{RoveDaemonClient}from"./chunk-0vpn32r6.js";import{logClient,logClientError}from"./chunk-hq9tbzqa.js";class MachineHub{local;slots=new Map;machinesAcc=createStateCell([],"machines.status");mergedAcc=createStateCell([],"machines.tasks");localUnsubscribe=null;disposed=!1;constructor(local){this.local=local}machinesSignal(){return this.machinesAcc}tasksSignal(){if(this.slots.size===0)return this.local.tasksSignal();return this.mergedAcc}remoteTaskIds(){let ids=new Set;for(let slot of this.slots.values())for(let task of slot.tasks)ids.add(String(task.id));return ids}attach(){let entries=dedupeMachines(listMachines());if(entries.length===0)return;for(let entry of entries)this.slots.set(entry.alias,{entry,tasks:[]});this.publishStatuses(),this.localUnsubscribe=this.local.tasksSignal().subscribe(()=>this.republishTasks()),this.republishTasks();for(let entry of entries)this.connect(entry)}async connect(entry){let slot=this.slots.get(entry.alias);if(!slot||this.disposed)return;let found=await discoverMachine(entry.alias,entry);if(this.disposed)return;let sockets=found.ok?{daemon:found.status.socketPath,pty:found.status.ptySocketPath}:entry.sockets;if(!sockets){this.setStatus(entry.alias,{state:"offline",error:found.ok?void 0:found.message});return}if(found.ok)updateMachine(entry.alias,{sockets});let tunnel=startTunnel({alias:entry.alias,config:entry,remoteDaemonSocket:sockets.daemon,remotePtySocket:sockets.pty});if(slot.tunnel=tunnel,tunnel.state()==="unsupported"){this.setStatus(entry.alias,{state:"unsupported",error:"SSH unix-socket forwarding is not available on Windows"});return}if(tunnel.onState((state)=>{if(state==="online")this.openOrchestrator(entry,tunnel);else if(state==="offline")this.setStatus(entry.alias,{state:"offline"}),this.republishTasks()}),tunnel.state()==="online")await this.openOrchestrator(entry,tunnel)}async openOrchestrator(entry,tunnel){let slot=this.slots.get(entry.alias);if(!slot||this.disposed||slot.orchestrator)return;let client=new RoveDaemonClient(tunnel.daemonSocketPath),orchestrator=new RemoteOrchestrator(client,{role:"gui",expectForeignHome:!0,onPeerIdentity:(peer)=>this.onPeerIdentity(entry.alias,peer)});slot.orchestrator=orchestrator;try{await orchestrator.init()}catch(err){let message=err instanceof Error?err.message:String(err);this.setStatus(entry.alias,{state:classifyHandshakeFailure(message),error:message}),logClientError("machines",err);return}let stopTasks=orchestrator.tasksSignal().subscribe(()=>{slot.tasks=orchestrator.tasksSignal().get(),this.republishTasks()}),stopConnection=orchestrator.connectionStateSignal().subscribe(()=>{let connected=orchestrator.connectionStateSignal().get()==="online";if(this.slots.get(entry.alias)!==slot)return;this.setStatus(entry.alias,{state:connected?"online":"offline"}),this.republishTasks()});slot.unsubscribe=()=>{stopTasks(),stopConnection()},slot.tasks=orchestrator.tasksSignal().get(),this.setStatus(entry.alias,{state:"online",version:orchestrator.daemonVersionSignal().get()??void 0}),this.republishTasks(),logClient("machines",`${entry.alias} online (${slot.tasks.length} tasks)`)}onPeerIdentity(alias,peer){if(!peer.hostname&&!peer.homeDir)return;let identity={hostname:peer.hostname,homeDir:peer.homeDir,daemonPid:peer.daemonPid};setMachineIdentity(alias,identity);let duplicate=duplicateAliasOf(readMachines(loadStateFile()),alias,identity);this.setStatus(alias,{hostname:peer.hostname||void 0,version:peer.roveVersion||void 0,...duplicate?{duplicateOf:duplicate}:{}})}setStatus(alias,patch){let next=this.machinesAcc.get().map((row)=>row.alias===alias?{...row,...patch}:row);this.machinesAcc.set(next)}publishStatuses(){this.machinesAcc.set([...this.slots.values()].map((slot)=>({alias:slot.entry.alias,hostLabel:slot.entry.alias,state:"connecting"})))}republishTasks(){let merged=this.local.tasksSignal().get().map((task)=>stampOrigin(task,"local","local"));for(let slot of this.slots.values()){let status=this.machinesAcc.get().find((row)=>row.alias===slot.entry.alias);if(status?.duplicateOf)continue;let hostLabel=status?.hostLabel||slot.entry.alias,stale=status?.state!=="online";for(let task of slot.tasks)merged.push(stampOrigin(task,slot.entry.alias,hostLabel,stale))}this.mergedAcc.set(merged)}dispose(){this.disposed=!0,this.localUnsubscribe?.();for(let slot of this.slots.values())slot.unsubscribe?.(),slot.orchestrator?.dispose(),slot.tunnel?.stop();this.slots.clear()}}function classifyHandshakeFailure(message){return/protocol v\d/i.test(message)?"mismatch":"offline"}function stampOrigin(task,machineId,hostLabel,stale=!1){return{...task,origin:{machineId,hostLabel,...stale?{stale:!0}:{}}}}
3
3
  export{MachineHub,classifyHandshakeFailure};