@sma1lboy/rove 0.9.258 → 0.9.263
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/cli/{chunk-x8rkpfqd.js → chunk-0079aw9z.js} +1 -1
- package/dist/cli/{chunk-xnaehfby.js → chunk-02f0matw.js} +1 -1
- package/dist/cli/chunk-09sfrqkr.js +2 -0
- package/dist/cli/{chunk-ke3t032y.js → chunk-0rrmz6k6.js} +1 -1
- package/dist/cli/{chunk-3q1rv3rm.js → chunk-1cmcaarg.js} +2 -2
- package/dist/cli/chunk-1gxb0bd3.js +3 -0
- package/dist/cli/{chunk-ebea569y.js → chunk-1h68wb7r.js} +1 -1
- package/dist/cli/chunk-26mf16v9.js +2 -0
- package/dist/cli/{chunk-1zqzqbek.js → chunk-27k612fg.js} +1 -1
- package/dist/cli/{chunk-jd02zgwf.js → chunk-2cbzp9t1.js} +1 -1
- package/dist/cli/{chunk-stcvcsfm.js → chunk-3ac75tqw.js} +1 -1
- package/dist/cli/{chunk-68113ts1.js → chunk-3zjdbdwy.js} +1 -1
- package/dist/cli/chunk-495kp7gj.js +16 -0
- package/dist/cli/{chunk-cq5qv93a.js → chunk-4gt375ve.js} +1 -1
- package/dist/cli/{chunk-sabpcket.js → chunk-4kzqv6rq.js} +1 -1
- package/dist/cli/{chunk-cewyvr3c.js → chunk-59g5tbc7.js} +1 -1
- package/dist/cli/chunk-5pkyrzfc.js +3 -0
- package/dist/cli/{chunk-yktnbb14.js → chunk-5v02t4pz.js} +37 -37
- package/dist/cli/{chunk-kgddz8pw.js → chunk-60ppphcx.js} +1 -1
- package/dist/cli/chunk-69dz852g.js +2 -0
- package/dist/cli/{chunk-8q1g1xq0.js → chunk-6qyd3ny6.js} +1 -1
- package/dist/cli/chunk-744netc1.js +55 -0
- package/dist/cli/chunk-7kwk5kxn.js +3 -0
- package/dist/cli/{chunk-rnxk3587.js → chunk-7y7v9x3n.js} +1 -1
- package/dist/cli/{chunk-9v18qy3s.js → chunk-87ar2d2r.js} +1 -1
- package/dist/cli/{chunk-r6f8h111.js → chunk-8mx0egn7.js} +2 -2
- package/dist/cli/{chunk-qpc8bv02.js → chunk-8p4ah1m9.js} +4 -4
- package/dist/cli/{chunk-zam29b9x.js → chunk-8vkma6c4.js} +1 -1
- package/dist/cli/chunk-98pfg06f.js +70 -0
- package/dist/cli/{chunk-edsm15ht.js → chunk-a2epp2ad.js} +1 -1
- package/dist/cli/{chunk-wyt2vgjv.js → chunk-a89xzxv2.js} +1 -1
- package/dist/cli/{chunk-0d57z680.js → chunk-aaz3wnp3.js} +1 -1
- package/dist/cli/{chunk-pw87thvf.js → chunk-asez7vm6.js} +1 -1
- package/dist/cli/{chunk-95jzkqp2.js → chunk-ax5c2qmv.js} +1 -1
- package/dist/cli/chunk-b2h6jfrg.js +3 -0
- package/dist/cli/{chunk-t25xke74.js → chunk-b3vz95wb.js} +1 -1
- package/dist/cli/{chunk-k2cnmb5q.js → chunk-bc72rgkm.js} +1 -1
- package/dist/cli/{chunk-eyzjma6q.js → chunk-bmk52w06.js} +1 -1
- package/dist/cli/{chunk-1egwgg6p.js → chunk-bntczetj.js} +1 -1
- package/dist/cli/chunk-bnv1mm5h.js +4 -0
- package/dist/cli/{chunk-hfvz23r6.js → chunk-c09jfhpp.js} +1 -1
- package/dist/cli/chunk-c0gvp57p.js +3 -0
- package/dist/cli/chunk-c6kw0s9a.js +4 -0
- package/dist/cli/{chunk-cqychwvw.js → chunk-ca4dvdj4.js} +1 -1
- package/dist/cli/chunk-cwk568n5.js +2 -0
- package/dist/cli/chunk-dnmq3c4k.js +11 -0
- package/dist/cli/chunk-dx12gkf5.js +2 -0
- package/dist/cli/{chunk-rx2604ry.js → chunk-efr0fy7z.js} +1 -1
- package/dist/cli/{chunk-80zzjcvp.js → chunk-f6tqc1cc.js} +1 -1
- package/dist/cli/{chunk-rc2nwsdd.js → chunk-fdexrh6h.js} +1 -1
- package/dist/cli/{chunk-jf46jsdp.js → chunk-fr4mwfe1.js} +1 -1
- package/dist/cli/{chunk-y0gybgba.js → chunk-gbbx9zpz.js} +1 -1
- package/dist/cli/chunk-gzj9nk7k.js +3 -0
- package/dist/cli/chunk-h8zvgpzd.js +82 -0
- package/dist/cli/{chunk-0604fza5.js → chunk-hk0s2bbn.js} +1 -1
- package/dist/cli/{chunk-y8xb4ys7.js → chunk-jqkzg4dd.js} +1 -1
- package/dist/cli/{chunk-hdnqq66w.js → chunk-jt994bhe.js} +1 -1
- package/dist/cli/chunk-jwqdhbe9.js +3 -0
- package/dist/cli/{chunk-s0jbtyd9.js → chunk-kmgheesn.js} +3 -2
- package/dist/cli/{chunk-jtpjdmb6.js → chunk-mccgj97d.js} +1 -1
- package/dist/cli/{chunk-pwbtezsa.js → chunk-mhbc490p.js} +1 -1
- package/dist/cli/{chunk-jv11f2c2.js → chunk-mqrn27h8.js} +3 -3
- package/dist/cli/{chunk-v7prawj1.js → chunk-n7vtv1rw.js} +1 -1
- package/dist/cli/chunk-ndrcjcv5.js +2 -0
- package/dist/cli/{chunk-t60qcvcj.js → chunk-ns2f9b6r.js} +1 -1
- package/dist/cli/chunk-nze6pmm7.js +2 -0
- package/dist/cli/{chunk-zqq3djrw.js → chunk-pdn1r8rf.js} +3 -3
- package/dist/cli/{chunk-1vwngrmf.js → chunk-qga9xd2f.js} +1 -1
- package/dist/cli/chunk-r1cvs8v1.js +2 -0
- package/dist/cli/chunk-r240tf5j.js +3 -0
- package/dist/cli/chunk-r3zkpbf5.js +9 -0
- package/dist/cli/chunk-r6nmjtze.js +2 -0
- package/dist/cli/{chunk-6p9yxt3q.js → chunk-re15t5r1.js} +1 -1
- package/dist/cli/{chunk-b47k0cnw.js → chunk-rtcevh2t.js} +1 -1
- package/dist/cli/{chunk-tpt3fn1q.js → chunk-s0x0yw8x.js} +1 -1
- package/dist/cli/chunk-s83qnstd.js +2 -0
- package/dist/cli/chunk-sgngkkp3.js +2 -0
- package/dist/cli/chunk-spt9e3zk.js +31 -0
- package/dist/cli/{chunk-yjyjg7sk.js → chunk-stng29vp.js} +2 -2
- package/dist/cli/{chunk-278sc87n.js → chunk-szjgjrar.js} +1 -1
- package/dist/cli/{chunk-6x0trw81.js → chunk-t6txrkad.js} +1 -1
- package/dist/cli/{chunk-kqf371ff.js → chunk-tgfn5ykb.js} +1 -1
- package/dist/cli/chunk-tjj9bt7n.js +3 -0
- package/dist/cli/chunk-tmr45c9p.js +3 -0
- package/dist/cli/chunk-w2d69c89.js +7 -0
- package/dist/cli/{chunk-mmc662x2.js → chunk-wkv4aw6c.js} +1 -1
- package/dist/cli/{chunk-tq6pq1ws.js → chunk-ws4cg819.js} +1 -1
- package/dist/cli/{chunk-ehb0hbrg.js → chunk-wv5hvxcd.js} +2 -2
- package/dist/cli/chunk-wv6d96t6.js +2 -0
- package/dist/cli/chunk-xkyf0ws5.js +20 -0
- package/dist/cli/{chunk-edpbz0gz.js → chunk-xn4494n9.js} +3 -3
- package/dist/cli/{chunk-pb5g6161.js → chunk-xt82hp6y.js} +1 -1
- package/dist/cli/{chunk-1xrbb7gf.js → chunk-xwyp7bvy.js} +1 -1
- package/dist/cli/{chunk-c8anewjn.js → chunk-y5p9wm83.js} +1 -1
- package/dist/cli/chunk-yhcsp07b.js +66 -0
- package/dist/cli/{chunk-cb7hc2xm.js → chunk-ymb3ag9d.js} +1 -1
- package/dist/cli/{chunk-7cd1epfw.js → chunk-yyjskza5.js} +1 -1
- package/dist/cli/{chunk-45thgqdr.js → chunk-zns1zx6s.js} +1 -1
- package/dist/cli/chunk-zr3kwred.js +3 -0
- package/dist/cli/index.js +4 -4
- package/dist/cli/pty-host-node.mjs +5 -0
- package/dist/cli/rove.js +1 -1
- package/dist/completions/rove.bash +3 -3
- package/dist/completions/rove.fish +3 -3
- package/dist/completions/rove.zsh +3 -3
- package/dist/skills/rove/SKILL.md +1 -1
- package/dist/skills/rove/references/api-flags.md +35 -16
- package/dist/web/assets/index-CdjFB6v7.css +1 -0
- package/dist/web/assets/index-bEO8TjwB.js +109 -0
- package/dist/web/index.html +2 -2
- package/package.json +3 -3
- package/dist/cli/chunk-1378mh2w.js +0 -3
- package/dist/cli/chunk-1qge84t7.js +0 -3
- package/dist/cli/chunk-1vxykwb9.js +0 -3
- package/dist/cli/chunk-2yjpqb47.js +0 -3
- package/dist/cli/chunk-4ab8y1yp.js +0 -15
- package/dist/cli/chunk-4d4d59vp.js +0 -20
- package/dist/cli/chunk-658859k9.js +0 -31
- package/dist/cli/chunk-6t5d02s4.js +0 -2
- package/dist/cli/chunk-79r3wbhh.js +0 -2
- package/dist/cli/chunk-7nr405tr.js +0 -9
- package/dist/cli/chunk-82zpp3yx.js +0 -4
- package/dist/cli/chunk-8dggnfaf.js +0 -2
- package/dist/cli/chunk-8gjpnb83.js +0 -41
- package/dist/cli/chunk-csdne12x.js +0 -3
- package/dist/cli/chunk-dd0mtzje.js +0 -3
- package/dist/cli/chunk-dqprpnd6.js +0 -3
- package/dist/cli/chunk-fehxbwcb.js +0 -6
- package/dist/cli/chunk-g846fbp7.js +0 -52
- package/dist/cli/chunk-hkv6t5v9.js +0 -2
- package/dist/cli/chunk-jetsx9zr.js +0 -3
- package/dist/cli/chunk-q301ewyq.js +0 -2
- package/dist/cli/chunk-qn04z4zb.js +0 -2
- package/dist/cli/chunk-rmk69hvh.js +0 -2
- package/dist/cli/chunk-s1rg1zae.js +0 -3
- package/dist/cli/chunk-skpkscne.js +0 -11
- package/dist/cli/chunk-sma961wh.js +0 -3
- package/dist/cli/chunk-x7cv6deh.js +0 -2
- package/dist/cli/chunk-y85e24s9.js +0 -2
- package/dist/cli/chunk-ya0h6hcd.js +0 -31
- package/dist/cli/chunk-yaqkajw4.js +0 -82
- package/dist/cli/chunk-yc9bytrj.js +0 -2
- package/dist/web/assets/index-BiUiNIOp.css +0 -1
- package/dist/web/assets/index-jy27XaL0.js +0 -109
package/dist/web/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
6
|
<meta name="referrer" content="no-referrer" />
|
|
7
7
|
<title>rove</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-bEO8TjwB.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-CdjFB6v7.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@sma1lboy/rove",
|
|
4
|
-
"version": "0.9.
|
|
4
|
+
"version": "0.9.263",
|
|
5
5
|
"description": "Rove — the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"terminal",
|
|
@@ -99,8 +99,8 @@
|
|
|
99
99
|
"@vitest/coverage-v8": "2.1.9",
|
|
100
100
|
"knip": "^6.14.2",
|
|
101
101
|
"react-devtools-core": "^7.0.1",
|
|
102
|
-
"rove-bridge": "0.0.
|
|
103
|
-
"rove-weixin": "0.0.
|
|
102
|
+
"rove-bridge": "0.0.24",
|
|
103
|
+
"rove-weixin": "0.0.24",
|
|
104
104
|
"typescript": "5.8.2",
|
|
105
105
|
"vitest": "2.1.9"
|
|
106
106
|
},
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{loadStateFile,updateStateFile}from"./chunk-g4281a0g.js";import{homeDir}from"./chunk-prqeddy7.js";import{shortHomeTag}from"./chunk-n0rtj4z7.js";var LOCAL_MACHINE_ID="local",ALIAS_RE=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function isValidMachineAlias(alias){return alias!==LOCAL_MACHINE_ID&&alias.length<=64&&ALIAS_RE.test(alias)}function parseSshTarget(target){let trimmed=target.trim();if(!trimmed)return null;let at=trimmed.lastIndexOf("@"),user=at>=0?trimmed.slice(0,at):void 0,rest=at>=0?trimmed.slice(at+1):trimmed;if(at>=0&&!user)return null;let bracketed=/^\[([^\]]+)\](?::(\d{1,5}))?$/.exec(rest),portMatch=bracketed?null:/^([^:]*):(\d{1,5})$/.exec(rest),host=bracketed?bracketed[1]??"":portMatch?portMatch[1]??"":rest,rawPort=bracketed?bracketed[2]:portMatch?.[2],port=rawPort?Number(rawPort):void 0;if(!host||/\s/.test(host))return null;if(port!==void 0&&(port<1||port>65535))return null;return{host,...user?{user}:{},...port?{port}:{}}}function defaultMachineAlias(args){let source=!args.typedUser&&args.port===void 0&&!isIpLiteral(args.typedHost)?args.typedHost:args.remoteHostname||args.typedHost;return sanitizeAlias(source)}function isIpLiteral(host){return host.includes(":")||/^\d{1,3}(\.\d{1,3}){3}$/.test(host)}function sanitizeAlias(raw){return(raw.split(".")[0]??raw).replace(/[^A-Za-z0-9._-]/g,"-").slice(0,64)}function sshTargetOf(config){return config.user?`${config.user}@${config.host}`:config.host}function readMachines(state){let raw=state.machines;if(!raw||typeof raw!=="object"||Array.isArray(raw))return{};return raw}function listMachines(){let machines=readMachines(loadStateFile());return Object.entries(machines).map(([alias,config])=>({alias,...config}))}function getMachine(alias){return readMachines(loadStateFile())[alias]??null}function addMachine(alias,config){let added=!1;return updateStateFile((state)=>{let machines={...readMachines(state)};added=machines[alias]===void 0,machines[alias]={...config,addedAt:config.addedAt??machines[alias]?.addedAt??new Date().toISOString()},state.machines=machines;return}),{added}}function updateMachine(alias,patch){updateStateFile((state)=>{let machines={...readMachines(state)},existing=machines[alias];if(!existing)return!1;machines[alias]={...existing,...patch},state.machines=machines;return})}function setMachineIdentity(alias,identity){updateMachine(alias,{identity})}function removeMachine(alias){let removed=!1;return updateStateFile((state)=>{let machines={...readMachines(state)};if(removed=machines[alias]!==void 0,!removed)return!1;delete machines[alias],state.machines=machines;return}),removed}function dedupeMachines(entries){let kept=[],seen=[];for(let entry of entries){let identity=entry.identity;if(identity){if(seen.some((other)=>sameMachine(other,identity)))continue;seen.push(identity)}kept.push(entry)}return kept}function sameMachine(a,b){return a.hostname===b.hostname&&a.homeDir===b.homeDir&&a.daemonPid===b.daemonPid}function duplicateAliasOf(machines,self,identity){for(let[alias,config]of Object.entries(machines)){if(alias===self)continue;let other=config.identity;if(!other)continue;if(other.hostname===identity.hostname&&other.homeDir===identity.homeDir&&other.daemonPid===identity.daemonPid)return alias}return null}import{tmpdir}from"os";import{join}from"path";var CONTROL_PERSIST_SECONDS=300;function machineSocketDir(alias,home=homeDir()){let natural=join(home,".rove","machines",alias);if(Buffer.byteLength(join(natural,"daemon.sock"),"utf8")<=SOCKET_PATH_LIMIT)return natural;return join(tmpdir(),`rove-m-${shortHomeTag(home)}-${shortHomeTag(alias)}`)}var SOCKET_PATH_LIMIT=100;function localDaemonSocketPath(alias,home=homeDir()){return join(machineSocketDir(alias,home),"daemon.sock")}function localPtySocketPath(alias,home=homeDir()){return join(machineSocketDir(alias,home),"pty.sock")}function controlPath(alias,home=homeDir()){return join(machineSocketDir(alias,home),"cm")}function machineSshArgs(alias,config,opts={}){let argv=["ssh"];if(opts.batch!==!1)argv.push("-o","BatchMode=yes");if(argv.push("-o","ControlMaster=auto","-o",`ControlPath=${controlPath(alias,opts.home)}`,"-o",`ControlPersist=${CONTROL_PERSIST_SECONDS}`,"-o","StrictHostKeyChecking=accept-new"),config.port)argv.push("-p",String(config.port));if(config.auth.kind==="key"&&config.auth.keyPath)argv.push("-i",config.auth.keyPath);return argv.push(sshTargetOf(config)),argv}
|
|
3
|
-
export{isValidMachineAlias,parseSshTarget,defaultMachineAlias,sanitizeAlias,sshTargetOf,readMachines,listMachines,getMachine,addMachine,updateMachine,setMachineIdentity,removeMachine,dedupeMachines,duplicateAliasOf,machineSocketDir,localDaemonSocketPath,localPtySocketPath,machineSshArgs};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
var TOP_LEVEL_SUBCOMMANDS=["completions","add","remove","adopt","export","repo","api","daemon","machine","weixin","doctor","config","reset","theme","skill","plugin","feedback","update"],SUBCOMMAND_VERBS={daemon:["status","start","stop","restart"],machine:["add","doctor","remove","list"],plugin:["install","link","list","search","outdated","update","enable","disable","unlink","uninstall","config-dir","log","action","pane"],repo:["show","set","unset"],skill:["install","status","command","print"],theme:["list","add","remove"],weixin:["login","logout","status","allow","deny"]};
|
|
3
|
-
export{TOP_LEVEL_SUBCOMMANDS,SUBCOMMAND_VERBS};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{localDaemonSocketPath,localPtySocketPath,machineSocketDir,machineSshArgs}from"./chunk-1378mh2w.js";import{homeDir}from"./chunk-prqeddy7.js";import{spawn}from"child_process";import{mkdirSync,rmSync}from"fs";import{connect as netConnect}from"net";var DIR_MODE=448,BACKOFF_START_MS=500,BACKOFF_MAX_MS=5000,HEALTH_INTERVAL_MS=1e4;function startTunnel(opts){let home=opts.home??homeDir(),daemonSocketPath=localDaemonSocketPath(opts.alias,home),ptySocketPath=localPtySocketPath(opts.alias,home),listeners=new Set,state="connecting",stopped=!1,backoff=BACKOFF_START_MS,setState=(next)=>{if(state===next)return;state=next;for(let listener of listeners)listener(next)},handle={alias:opts.alias,daemonSocketPath,ptySocketPath,state:()=>state,onState:(listener)=>{return listeners.add(listener),()=>listeners.delete(listener)},stop:()=>{stopped=!0}};if(process.platform==="win32")return setState("unsupported"),handle;let schedule=opts.setTimeoutFn??((fn,ms)=>setTimeout(fn,ms)),ensure=opts.ensureFn??(()=>ensureForwards({alias:opts.alias,config:opts.config,remoteDaemonSocket:opts.remoteDaemonSocket,remotePtySocket:opts.remotePtySocket,home})),check=opts.checkFn??(()=>socketAnswers(daemonSocketPath)),attempt=async()=>{if(stopped)return;let up=await ensure();if(stopped)return;if(up){backoff=BACKOFF_START_MS,setState("online"),schedule(()=>void health(),HEALTH_INTERVAL_MS);return}setState("offline");let wait=backoff;backoff=Math.min(backoff*2,BACKOFF_MAX_MS),schedule(()=>void attempt(),wait)},health=async()=>{if(stopped)return;if(await check()){if(!stopped)schedule(()=>void health(),HEALTH_INTERVAL_MS);return}setState("offline"),attempt()};return attempt(),handle}async function ensureForwards(args){if(process.platform==="win32")return!1;let home=args.home??homeDir(),daemonLocal=localDaemonSocketPath(args.alias,home),ptyLocal=localPtySocketPath(args.alias,home);try{mkdirSync(machineSocketDir(args.alias,home),{recursive:!0,mode:DIR_MODE})}catch{}if(await socketAnswers(daemonLocal))return!0;for(let path of[daemonLocal,ptyLocal])try{rmSync(path,{force:!0})}catch{}let base=machineSshArgs(args.alias,args.config,{home});if(await runSsh([...base,"true"])!==0)return!1;let target=base.at(-1)??args.alias,flags=base.slice(0,-1);return await runSsh([...flags,"-O","forward","-L",`${daemonLocal}:${args.remoteDaemonSocket}`,"-L",`${ptyLocal}:${args.remotePtySocket}`,target])===0&&await socketAnswers(daemonLocal)}function runSsh(argv){return new Promise((resolve)=>{let child=spawn(argv[0]??"ssh",argv.slice(1),{stdio:"ignore"});child.on("error",()=>resolve(-1)),child.on("close",(code)=>resolve(code??-1))})}function socketAnswers(path){return new Promise((resolve)=>{let socket=netConnect(path),done=(answer)=>{socket.destroy(),resolve(answer)};socket.once("connect",()=>done(!0)),socket.once("error",()=>done(!1)),socket.setTimeout(1500,()=>done(!1))})}
|
|
3
|
-
export{startTunnel,ensureForwards};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
// @bun
|
|
2
|
-
import{ensureForwards}from"./chunk-1vxykwb9.js";import{discoverMachine}from"./chunk-7nr405tr.js";import{dedupeMachines,listMachines,localDaemonSocketPath,updateMachine}from"./chunk-1378mh2w.js";import{ApiError}from"./chunk-x7r75e3p.js";import{errorMessage}from"./chunk-2brn8e1y.js";import{RoveDaemonClient}from"./chunk-s0jbtyd9.js";import{ROVE_API_VERSION}from"./chunk-278sc87n.js";var LOCAL_MACHINE="local";async function machineDaemonSocket(entry){let socketPath=localDaemonSocketPath(entry.alias);if(await answers(socketPath))return socketPath;if(!entry.sockets||!await forward(entry,entry.sockets))return null;if(await answers(socketPath))return socketPath;let found=await discoverMachine(entry.alias,entry);if(!found.ok)return null;let sockets={daemon:found.status.socketPath,pty:found.status.ptySocketPath};return updateMachine(entry.alias,{sockets,...found.roveBin?{roveBin:found.roveBin}:{}}),await forward(entry,sockets)&&await answers(socketPath)?socketPath:null}function forward(entry,sockets){return ensureForwards({alias:entry.alias,config:entry,remoteDaemonSocket:sockets.daemon,remotePtySocket:sockets.pty})}async function answers(socketPath){let client=new RoveDaemonClient(socketPath);try{return await client.request("hello",{}),!0}catch{return!1}finally{client.close()}}async function machineTasks(entry){let socketPath=await machineDaemonSocket(entry);if(!socketPath)return null;let client=new RoveDaemonClient(socketPath);try{return(await client.request("task.list")).tasks??[]}catch{return null}finally{client.close()}}function requireMachine(alias){let entry=listMachines().find((m)=>m.alias===alias);if(entry)return entry;throw new ApiError(`no machine named "${alias}"`,"UNKNOWN_MACHINE",{hint:"list the registered machines and retry with one of their aliases, or register it first",nextCommandArgs:["machine","list"]})}async function routeTarget(args){if(args.machine!==void 0&&args.machine!==LOCAL_MACHINE)return requireMachine(args.machine);if(args.machine===LOCAL_MACHINE||!args.taskId)return null;let machines=dedupeMachines(listMachines());if(machines.length===0||await args.isLocalTask(args.taskId))return null;for(let entry of machines)if((await machineTasks(entry))?.some((task)=>task.id===args.taskId))return entry;return null}async function forwardVerb(entry,verb,params,socketPath){let target=socketPath??await machineDaemonSocket(entry);if(!target)return offline(entry.alias);let client=new RoveDaemonClient(target);try{return await client.request("api.invoke",{verb,params,forwarded:!0})}catch(err){let message=errorMessage(err);if(/unknown daemon request:/i.test(message))return tooOld(entry.alias);return failure("MACHINE_UNREACHABLE",`machine "${entry.alias}": ${message}`,{hint:"check the machine is up and reachable over ssh, then retry",nextCommandArgs:["machine","list"]})}finally{client.close()}}function offline(alias){return failure("MACHINE_UNREACHABLE",`machine "${alias}" did not answer`,{hint:`check \`ssh ${alias} true\` works without a prompt, then retry`,nextCommandArgs:["machine","list"]})}function tooOld(alias){return failure("MACHINE_VERSION_SKEW",`machine "${alias}" runs a Rove too old to accept forwarded verbs`,{hint:`upgrade Rove on ${alias} (\`rove update\` there), then retry`})}function failure(code,message,data){return{apiVersion:ROVE_API_VERSION,ok:!1,error:{message,code,...data}}}async function invokeRouted(args){if(args.forwarded)return args.runHere();let taskId=args.params["task-id"],target;try{target=await routeTarget({machine:args.machine,taskId:typeof taskId==="string"?taskId:void 0,isLocalTask:args.isLocalTask})}catch(err){if(!(err instanceof ApiError))throw err;return failure(err.code,err.message,err.data??{})}return target?forwardVerb(target,args.verb,args.params):args.runHere()}
|
|
3
|
-
export{LOCAL_MACHINE,machineDaemonSocket,machineTasks,requireMachine,routeTarget,forwardVerb,invokeRouted};
|