@sma1lboy/rove 0.9.253 → 0.9.254

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 (110) hide show
  1. package/dist/cli/chunk-0g1me47p.js +2 -0
  2. package/dist/cli/{chunk-7hkkjx6g.js → chunk-13msr643.js} +1 -1
  3. package/dist/cli/{chunk-t6j3pmpp.js → chunk-18dpws0y.js} +1 -1
  4. package/dist/cli/{chunk-19h18xca.js → chunk-1e6jbj70.js} +1 -1
  5. package/dist/cli/{chunk-avdg2rrh.js → chunk-1yzg4hzy.js} +1 -1
  6. package/dist/cli/{chunk-yq99x0r6.js → chunk-3r8v2gza.js} +1 -1
  7. package/dist/cli/{chunk-mrtfvgb2.js → chunk-4mxn5jg6.js} +1 -1
  8. package/dist/cli/{chunk-mw35vd6g.js → chunk-4myck788.js} +1 -1
  9. package/dist/cli/{chunk-zy20hzvh.js → chunk-5a6b4kv9.js} +1 -1
  10. package/dist/cli/{chunk-xmf4053m.js → chunk-5b7pd8j5.js} +1 -1
  11. package/dist/cli/{chunk-3j1x55tc.js → chunk-5d0vb6v9.js} +1 -1
  12. package/dist/cli/{chunk-jk9b9ztf.js → chunk-5fhrns31.js} +1 -1
  13. package/dist/cli/{chunk-c3d36ryd.js → chunk-5j6z32fh.js} +1 -1
  14. package/dist/cli/{chunk-8je3dmzq.js → chunk-5s4g1bkx.js} +1 -1
  15. package/dist/cli/{chunk-3r4ekafa.js → chunk-68pcd00x.js} +1 -1
  16. package/dist/cli/{chunk-34vpdm19.js → chunk-6d5csfp4.js} +1 -1
  17. package/dist/cli/{chunk-hbq7nqnp.js → chunk-6g5wvt5m.js} +1 -1
  18. package/dist/cli/{chunk-mwm63vz3.js → chunk-6wxnkz3c.js} +8 -8
  19. package/dist/cli/{chunk-pcyatg4b.js → chunk-6zvh002j.js} +1 -1
  20. package/dist/cli/chunk-7wga6bet.js +8 -0
  21. package/dist/cli/{chunk-2nfz06mq.js → chunk-7zpkyrxy.js} +1 -1
  22. package/dist/cli/{chunk-ffjwgbck.js → chunk-80zzjcvp.js} +1 -1
  23. package/dist/cli/{chunk-0x7zcw52.js → chunk-8bd054vx.js} +1 -1
  24. package/dist/cli/{chunk-6ygwq4w5.js → chunk-9dendh71.js} +1 -1
  25. package/dist/cli/chunk-9g0vz9dk.js +209 -0
  26. package/dist/cli/{chunk-ad5gbdcf.js → chunk-ant4k6dm.js} +1 -1
  27. package/dist/cli/chunk-cm923k09.js +52 -0
  28. package/dist/cli/{chunk-sncjkw3g.js → chunk-d48g9zzm.js} +3 -3
  29. package/dist/cli/{chunk-2bmebw8q.js → chunk-d4mvprvq.js} +1 -1
  30. package/dist/cli/{chunk-02h0488p.js → chunk-ddc4t38t.js} +1 -1
  31. package/dist/cli/{chunk-dk0hffvd.js → chunk-dqprpnd6.js} +1 -1
  32. package/dist/cli/{chunk-814ktvx2.js → chunk-e5vnptx5.js} +1 -1
  33. package/dist/cli/chunk-edsm15ht.js +4 -0
  34. package/dist/cli/{chunk-v9avfsxq.js → chunk-ef7ckm5b.js} +1 -1
  35. package/dist/cli/{chunk-y33j54yr.js → chunk-fnsch8kr.js} +2 -2
  36. package/dist/cli/{chunk-vcq9hb2a.js → chunk-fwt0t2h7.js} +1 -1
  37. package/dist/cli/chunk-gqpka00s.js +30 -0
  38. package/dist/cli/{chunk-p8d9va1w.js → chunk-hqp8b49k.js} +2 -2
  39. package/dist/cli/{chunk-yjk0465m.js → chunk-hzzq6pdb.js} +1 -1
  40. package/dist/cli/{chunk-x2c8f2qz.js → chunk-j19gkhzh.js} +1 -1
  41. package/dist/cli/{chunk-s21t29qn.js → chunk-j7831wcj.js} +1 -1
  42. package/dist/cli/{chunk-mt8vtz20.js → chunk-j84zbw79.js} +2 -2
  43. package/dist/cli/chunk-j9c9tdfg.js +2 -0
  44. package/dist/cli/{chunk-67q0qw7z.js → chunk-jetsx9zr.js} +1 -1
  45. package/dist/cli/{chunk-q349ydch.js → chunk-jtpjdmb6.js} +1 -1
  46. package/dist/cli/{chunk-c4e149yb.js → chunk-jwtqe209.js} +1 -1
  47. package/dist/cli/{chunk-gt1vbz3f.js → chunk-k7ke95vy.js} +1 -1
  48. package/dist/cli/{chunk-bdvqjzwh.js → chunk-k9ahks28.js} +9 -7
  49. package/dist/cli/{chunk-tq1hrd9n.js → chunk-kwd59v51.js} +1 -1
  50. package/dist/cli/{chunk-75zg2k73.js → chunk-m0cbndc2.js} +1 -1
  51. package/dist/cli/{chunk-rm2wy5hf.js → chunk-mpdfhvgs.js} +3 -3
  52. package/dist/cli/{chunk-6k424rbf.js → chunk-mxkm0snt.js} +1 -1
  53. package/dist/cli/{chunk-nhpadsbv.js → chunk-n3wdy4z4.js} +1 -1
  54. package/dist/cli/{chunk-bk4pfjs0.js → chunk-n5xj11ps.js} +1 -1
  55. package/dist/cli/{chunk-hqzgejfj.js → chunk-p5902z3e.js} +1 -1
  56. package/dist/cli/{chunk-q1e0qqmd.js → chunk-pahcf9td.js} +1 -1
  57. package/dist/cli/{chunk-76adkzyf.js → chunk-pvah9q79.js} +1 -1
  58. package/dist/cli/{chunk-bq0xsdqx.js → chunk-pyv2ywxr.js} +1 -1
  59. package/dist/cli/{chunk-6e54q8g5.js → chunk-qkd4eweb.js} +1 -1
  60. package/dist/cli/{chunk-sk3h2pzj.js → chunk-r7q7s63y.js} +2 -2
  61. package/dist/cli/{chunk-zmw0v18d.js → chunk-rf4z7b6g.js} +1 -1
  62. package/dist/cli/{chunk-8wze6dnr.js → chunk-rn97jntv.js} +1 -1
  63. package/dist/cli/{chunk-jbqpyp76.js → chunk-rnxk3587.js} +1 -1
  64. package/dist/cli/{chunk-pwybgztt.js → chunk-s96qnht3.js} +1 -1
  65. package/dist/cli/chunk-sma961wh.js +3 -0
  66. package/dist/cli/{chunk-b18pnmsv.js → chunk-stcvcsfm.js} +1 -1
  67. package/dist/cli/{chunk-epyw87gt.js → chunk-sxhjvr0w.js} +1 -1
  68. package/dist/cli/{chunk-97vsqj97.js → chunk-sxt12set.js} +1 -1
  69. package/dist/cli/{chunk-xgq5ycyn.js → chunk-tbq3t259.js} +1 -1
  70. package/dist/cli/{chunk-hm7t9gkb.js → chunk-tewt7vre.js} +1 -1
  71. package/dist/cli/{chunk-k8dm013e.js → chunk-tnft1xw4.js} +1 -1
  72. package/dist/cli/{chunk-b3j5s2jb.js → chunk-tq6pq1ws.js} +1 -1
  73. package/dist/cli/{chunk-3dgghmjv.js → chunk-v7prawj1.js} +1 -1
  74. package/dist/cli/chunk-v9fgdd90.js +3 -0
  75. package/dist/cli/chunk-vfwbgx85.js +2 -0
  76. package/dist/cli/{chunk-qc06psqb.js → chunk-vvw1njx5.js} +1 -1
  77. package/dist/cli/{chunk-wq6pfbek.js → chunk-vzn94t0z.js} +2 -2
  78. package/dist/cli/chunk-wn2w5ar9.js +2 -0
  79. package/dist/cli/{chunk-65tbvcjj.js → chunk-wsv6tw1b.js} +1 -1
  80. package/dist/cli/{chunk-6r84zkcz.js → chunk-x40h0f1w.js} +1 -1
  81. package/dist/cli/{chunk-g3wdrhxk.js → chunk-x7ryv67y.js} +2 -2
  82. package/dist/cli/{chunk-9wkf17yd.js → chunk-x951qvk5.js} +1 -1
  83. package/dist/cli/{chunk-dkb8nj75.js → chunk-xdhs40fx.js} +1 -1
  84. package/dist/cli/{chunk-p98w5ffk.js → chunk-y330t2bt.js} +2 -2
  85. package/dist/cli/{chunk-b1mk33gy.js → chunk-yebn33mf.js} +1 -1
  86. package/dist/cli/{chunk-rpm771v5.js → chunk-ykdpg0zd.js} +8 -8
  87. package/dist/cli/index.js +4 -4
  88. package/dist/cli/rove.js +1 -1
  89. package/dist/completions/rove.bash +1 -1
  90. package/dist/completions/rove.fish +1 -1
  91. package/dist/completions/rove.zsh +1 -1
  92. package/dist/skills/rove/SKILL.md +14 -3
  93. package/dist/skills/rove/references/api-flags.md +47 -32
  94. package/dist/web/assets/{index-DmRZRttZ.js → index-BydepNFM.js} +1 -1
  95. package/dist/web/index.html +1 -1
  96. package/dist/web-ui/assets/{harness-BHiciz5A.js → harness-dYkQBfYz.js} +3 -3
  97. package/dist/web-ui/assets/{index-BkxJISAI.js → index-ByMdqeTv.js} +2 -2
  98. package/dist/web-ui/index.html +1 -1
  99. package/package.json +3 -3
  100. package/dist/cli/chunk-9g7gneek.js +0 -30
  101. package/dist/cli/chunk-9jbcfrse.js +0 -2
  102. package/dist/cli/chunk-9r6x8mh4.js +0 -8
  103. package/dist/cli/chunk-admwmjjy.js +0 -4
  104. package/dist/cli/chunk-cgy92ks5.js +0 -2
  105. package/dist/cli/chunk-n7dtvega.js +0 -2
  106. package/dist/cli/chunk-parvvj8h.js +0 -2
  107. package/dist/cli/chunk-r2pd9tv9.js +0 -3
  108. package/dist/cli/chunk-sb2xg6py.js +0 -5
  109. package/dist/cli/chunk-vx4e787s.js +0 -3
  110. package/dist/cli/chunk-zfjqy7hp.js +0 -52
@@ -1,6 +1,6 @@
1
1
  // @bun
2
- import{DAEMON_CHANNELS}from"./chunk-278sc87n.js";import{logClientError}from"./chunk-y55zpren.js";import{samePath}from"./chunk-pn5ygqn6.js";import{preRenameRuntimePaths}from"./chunk-b39sdtt0.js";import{readRoveEnv}from"./chunk-nc46gddg.js";import{connect}from"net";import{StringDecoder}from"string_decoder";function automationRunNeedsAttention(status){return status==="dispatch_failed"||status==="skipped_unavailable"}var ROUTINE_RESPONSE_MAX_CHARS=32000,ROUTINE_RESPONSE_WINDOW_MS=7200000;function routineRunResponseState(run,nowMs){if(run.response)return"responded";if(run.status!=="dispatched"&&run.status!=="revived")return null;if(run.deliveryStatus==="missing")return"missing";if(run.deliveryStatus==="awaiting")return"awaiting";return nowMs-Date.parse(run.at)>ROUTINE_RESPONSE_WINDOW_MS?"missing":"awaiting"}var GATE_QUESTION_MAX=500,GATE_CONTEXT_MAX=4000,GATE_OPTIONS_MAX=6;function gateInboxKey(gateId){return`\x00gate\x00${gateId}`}var ATTENTION_INBOX_STATES=["turn_complete","permission_needed","error","rate_limited","dead","routine_failed","routine_responded","report_missing","decision_needed"];function isRoutineInboxState(state){return state==="routine_failed"||state==="routine_responded"}function isAttentionInboxState(value){return typeof value==="string"&&ATTENTION_INBOX_STATES.includes(value)}function attentionInboxItemKey(item){if(isRoutineInboxState(item.state)&&item.detail?.routine)return`\x00${item.state}\x00${item.detail.routine.automationId}`;if(item.state==="report_missing"&&item.detail?.delivery)return`\x00delivery\x00${item.detail.delivery.id}`;if(item.state==="decision_needed"&&item.detail?.gate)return gateInboxKey(item.detail.gate.id);return`${item.taskId}\x00${item.tabId??""}`}var DELIVERY_OUTCOMES=["done","partial","blocked","failed"],DELIVERY_SUMMARY_MAX_CHARS=32000,DELIVERY_EVIDENCE_MAX_ITEMS=50,DELIVERY_EVIDENCE_MAX_CHARS=2000,DELIVERY_NEXT_MAX_CHARS=4000,DELIVERY_PROMPT_HEAD_CHARS=200,MAX_DELIVERIES_PER_TASK=50,DELIVERY_STALL_MS=600000;function deliveryFooter(deliveryId,api){return`[ROVE] When this turn ends, report: ${api} report --delivery ${deliveryId} --outcome done|partial|blocked|failed --summary \u2026 [--evidence \u2026]\u2026 [--next \u2026]`}var CHANNEL_NAMES=DAEMON_CHANNELS;var CHANNEL_NAME_SET=new Set(CHANNEL_NAMES);function isChannelName(value){return typeof value==="string"&&CHANNEL_NAME_SET.has(value)}function normalizeChannelFilter(value){if(!Array.isArray(value))return null;let set=new Set;for(let name of value)if(isChannelName(name))set.add(name);return set.size>0?set:null}var DAEMON_PROTOCOL_VERSION=5,MIN_COMPATIBLE_PROTOCOL_VERSION=2;function isProtocolCompatible(args){return args.remoteVersion>=args.localMin&&args.localVersion>=args.remoteMin}function isDaemonVersionStale(daemonVersion,clientVersion){if(!daemonVersion)return!1;return daemonVersion!==clientVersion}function isForeignDaemonHome(daemonHome,clientHome){if(!daemonHome)return!1;return!samePath(daemonHome,clientHome)}var BLOCKING_RPCS=new Set(["api.invoke","ui.prompt","task.land","workitem.start","automation.runNow","pr.rerunFailedChecks","task.ensureWorktree","task.ensureMain","worktree.discoverAdoptable","worktree.adopt","worktree.list","worktree.remove"]);function parseDaemonStopReason(value){return value==="restart"||value==="stop"||value==="idle"||value==="socket-lost"?value:void 0}function displayTaskTitle(task){return task.title||task.branch||task.worktreePath||task.repo||"scratch"}function serializeTask(task){return{id:task.id,title:displayTaskTitle(task),repo:task.repo,branch:task.branch,worktreePath:task.worktreePath,kind:task.kind??"task",...task.scratch?{scratch:!0}:{},...task.routine?{routine:task.routine}:{},status:task.status,pinned:task.pinned??!1,vendor:task.vendor,command:task.command,prStatus:task.prStatus,modelEffort:task.modelEffort,model:task.model,tier:task.tier,groupId:task.groupId,observedLanguage:task.observedLanguage,deletion:task.deletion,quotaResume:task.quotaResume,linkedWorkItem:task.linkedWorkItem,dispatcher:task.dispatcher,requireReport:task.requireReport,prompt:task.prompt,baseRef:task.baseRef,worktreeName:task.worktreeName,report:task.report,createdAt:task.createdAt,updatedAt:task.updatedAt}}function frameToLine(frame){return`${JSON.stringify(frame)}
2
+ import{DAEMON_CHANNELS}from"./chunk-278sc87n.js";import{logClientError}from"./chunk-y55zpren.js";import{samePath}from"./chunk-pn5ygqn6.js";import{preRenameRuntimePaths}from"./chunk-b39sdtt0.js";import{readRoveEnv}from"./chunk-nc46gddg.js";import{connect}from"net";import{StringDecoder}from"string_decoder";function automationRunNeedsAttention(status){return status==="dispatch_failed"||status==="skipped_unavailable"}var ROUTINE_RESPONSE_MAX_CHARS=32000,ROUTINE_RESPONSE_WINDOW_MS=7200000;function routineRunResponseState(run,nowMs){if(run.response)return"responded";if(run.status!=="dispatched"&&run.status!=="revived")return null;if(run.deliveryStatus==="missing")return"missing";if(run.deliveryStatus==="awaiting")return"awaiting";return nowMs-Date.parse(run.at)>ROUTINE_RESPONSE_WINDOW_MS?"missing":"awaiting"}var GATE_QUESTION_MAX=500,GATE_CONTEXT_MAX=4000,GATE_OPTIONS_MAX=6;function gateInboxKey(gateId){return`\x00gate\x00${gateId}`}var ATTENTION_INBOX_STATES=["turn_complete","permission_needed","error","rate_limited","dead","routine_failed","routine_responded","report_missing","decision_needed"];function isRoutineInboxState(state){return state==="routine_failed"||state==="routine_responded"}function isAttentionInboxState(value){return typeof value==="string"&&ATTENTION_INBOX_STATES.includes(value)}function attentionInboxItemKey(item){if(isRoutineInboxState(item.state)&&item.detail?.routine)return`\x00${item.state}\x00${item.detail.routine.automationId}`;if(item.state==="report_missing"&&item.detail?.delivery)return`\x00delivery\x00${item.detail.delivery.id}`;if(item.state==="decision_needed"&&item.detail?.gate)return gateInboxKey(item.detail.gate.id);return`${item.taskId}\x00${item.tabId??""}`}var DELIVERY_OUTCOMES=["done","partial","blocked","failed"],DELIVERY_SUMMARY_MAX_CHARS=32000,DELIVERY_EVIDENCE_MAX_ITEMS=50,DELIVERY_EVIDENCE_MAX_CHARS=2000,DELIVERY_NEXT_MAX_CHARS=4000,DELIVERY_PROMPT_HEAD_CHARS=200,MAX_DELIVERIES_PER_TASK=50,DELIVERY_STALL_MS=600000;function deliveryFooter(deliveryId,api){return`[ROVE] When this turn ends, report: ${api} report --delivery ${deliveryId} --outcome done|partial|blocked|failed --summary \u2026 [--evidence \u2026]\u2026 [--next \u2026]`}var SKIP_REASONS=["task-missing","awaiting-owner","report-missing","quota","engine-error","engine-dead","awaiting-permission","busy"],SHOULD_RUN_SKIP_EXIT_CODE=3;function parseSkipVerdict(value){if(!value||typeof value!=="object"||Array.isArray(value))return;let raw=value;if(raw.run!==!1||!SKIP_REASONS.includes(raw.reason))return;let text=(v)=>typeof v==="string"&&v.length>0?v:void 0;return{run:!1,reason:raw.reason,...text(raw.detail)?{detail:raw.detail}:{},...text(raw.until)?{until:raw.until}:{},...Array.isArray(raw.gateIds)?{gateIds:raw.gateIds.filter((g)=>typeof g==="string")}:{}}}var CHANNEL_NAMES=DAEMON_CHANNELS;var CHANNEL_NAME_SET=new Set(CHANNEL_NAMES);function isChannelName(value){return typeof value==="string"&&CHANNEL_NAME_SET.has(value)}function normalizeChannelFilter(value){if(!Array.isArray(value))return null;let set=new Set;for(let name of value)if(isChannelName(name))set.add(name);return set.size>0?set:null}var DAEMON_PROTOCOL_VERSION=5,MIN_COMPATIBLE_PROTOCOL_VERSION=2;function isProtocolCompatible(args){return args.remoteVersion>=args.localMin&&args.localVersion>=args.remoteMin}function isDaemonVersionStale(daemonVersion,clientVersion){if(!daemonVersion)return!1;return daemonVersion!==clientVersion}function isForeignDaemonHome(daemonHome,clientHome){if(!daemonHome)return!1;return!samePath(daemonHome,clientHome)}var BLOCKING_RPCS=new Set(["api.invoke","ui.prompt","task.land","workitem.start","automation.runNow","pr.rerunFailedChecks","task.ensureWorktree","task.ensureMain","worktree.discoverAdoptable","worktree.adopt","worktree.list","worktree.remove"]);function parseDaemonStopReason(value){return value==="restart"||value==="stop"||value==="idle"||value==="socket-lost"?value:void 0}function displayTaskTitle(task){return task.title||task.branch||task.worktreePath||task.repo||"scratch"}function serializeTask(task){return{id:task.id,title:displayTaskTitle(task),repo:task.repo,branch:task.branch,worktreePath:task.worktreePath,kind:task.kind??"task",...task.scratch?{scratch:!0}:{},...task.routine?{routine:task.routine}:{},status:task.status,pinned:task.pinned??!1,vendor:task.vendor,command:task.command,prStatus:task.prStatus,modelEffort:task.modelEffort,model:task.model,tier:task.tier,groupId:task.groupId,observedLanguage:task.observedLanguage,deletion:task.deletion,quotaResume:task.quotaResume,linkedWorkItem:task.linkedWorkItem,dispatcher:task.dispatcher,requireReport:task.requireReport,prompt:task.prompt,baseRef:task.baseRef,worktreeName:task.worktreeName,report:task.report,createdAt:task.createdAt,updatedAt:task.updatedAt}}function frameToLine(frame){return`${JSON.stringify(frame)}
3
3
  `}class RpcTimeoutError extends Error{constructor(name,timeoutMs){super(`daemon rpc "${name}" timed out after ${timeoutMs}ms (daemon wedged?)`);this.name="RpcTimeoutError"}}function rpcTimeoutMs(){let raw=readRoveEnv("RPC_TIMEOUT_MS")?.trim();if(raw){let parsed=Number.parseInt(raw,10);if(Number.isFinite(parsed))return parsed}return 20000}class ConnectTimeoutError extends Error{constructor(socketPath,timeoutMs){super(`connecting to ${socketPath} timed out after ${timeoutMs}ms \u2014 nothing accepted the connection (daemon or PTY host not listening at that address)`);this.name="ConnectTimeoutError"}}function connectTimeoutMs(){let raw=readRoveEnv("CONNECT_TIMEOUT_MS")?.trim();if(raw){let parsed=Number.parseInt(raw,10);if(Number.isFinite(parsed))return parsed}return 5000}class RoveDaemonClient{socketPath;socket=null;buffer="";nextId=1;pending=new Map;handlers=new Map;lifecycleHandlers=new Map;connecting=null;disposed=!1;constructor(socketPath){this.socketPath=socketPath}connect(){if(this.socket)return Promise.resolve();if(this.disposed)return Promise.reject(Error("daemon client disposed"));if(this.connecting)return this.connecting;let p=this.openSocketWithFallback();this.connecting=p;let cleanup=()=>{if(this.connecting===p)this.connecting=null};return p.then(cleanup,cleanup),p}get isDisposed(){return this.disposed}close(){this.disposed=!0,this.socket?.end(),this.socket=null,this.failPending()}forceDisconnect(){let socket=this.socket;if(!socket)return;this.socket=null,socket.destroy(),this.failPending()}failPending(){if(this.pending.size===0)return;let err=Error("daemon connection closed");for(let pending of this.pending.values()){if(pending.timer)clearTimeout(pending.timer);pending.reject(err)}this.pending.clear()}on(name,handler){let set=this.handlers.get(name);if(!set)set=new Set,this.handlers.set(name,set);return set.add(handler),()=>{if(set?.delete(handler),set?.size===0)this.handlers.delete(name)}}onChannel(channel,handler){return this.on(channel,(frame)=>handler(frame.payload))}subscribe(opts={}){let payload={};if(opts.channels)payload.channels=opts.channels;if(opts.role)payload.role=opts.role;if(opts.cellPixelSize)payload.cellPixelWidth=opts.cellPixelSize.width,payload.cellPixelHeight=opts.cellPixelSize.height;return this.request("subscribe",payload)}onLifecycle(name,handler){let set=this.lifecycleHandlers.get(name);if(!set)set=new Set,this.lifecycleHandlers.set(name,set);return set.add(handler),()=>{if(set?.delete(handler),set?.size===0)this.lifecycleHandlers.delete(name)}}async request(name,payload){await this.connect();let socket=this.socket;if(!socket)throw Error("daemon connection is not open");let id=String(this.nextId++),promise=new Promise((resolve,reject)=>{let entry={resolve:(value)=>resolve(value),reject},timeoutMs=rpcTimeoutMs();if(timeoutMs>0&&!BLOCKING_RPCS.has(name))entry.timer=setTimeout(()=>this.onRequestTimeout(id,name,timeoutMs),timeoutMs);this.pending.set(id,entry)});return socket.write(frameToLine({type:"request",id,name,payload})),promise}onRequestTimeout(id,name,timeoutMs){let pending=this.pending.get(id);if(!pending)return;this.pending.delete(id),pending.reject(new RpcTimeoutError(name,timeoutMs)),this.forceDisconnect(),this.emitLifecycle("close")}async openSocketWithFallback(){try{await this.openSocket(this.socketPath);return}catch(err){if(!(err instanceof Error)||!("code"in err)||!["ENOENT","ECONNREFUSED"].includes(String(err.code)))throw err;for(let path of preRenameRuntimePaths(this.socketPath)){if(this.disposed)throw err;try{await this.openSocket(path);return}catch{}}throw err}}openSocket(path){return new Promise((resolve,reject)=>{let socket=connect(path);this.socket=socket;let timeoutMs=connectTimeoutMs(),timer;if(timeoutMs>0)timer=setTimeout(()=>{if(socket.off("connect",onConnect),socket.off("error",onError),socket.destroy(),this.socket===socket)this.socket=null;reject(new ConnectTimeoutError(this.socketPath,timeoutMs))},timeoutMs);let onConnect=()=>{if(timer)clearTimeout(timer);socket.off("error",onError),socket.on("error",()=>socket.destroy()),resolve()},onError=(err)=>{if(timer)clearTimeout(timer);if(socket.off("connect",onConnect),this.socket===socket)this.socket=null;reject(err)};socket.once("connect",onConnect),socket.once("error",onError);let decoder=new StringDecoder("utf8");this.buffer="",socket.on("data",(chunk)=>this.onData(decoder.write(chunk))),socket.on("close",()=>this.onSocketClose(socket))})}onSocketClose(which){if(this.socket!==which)return;this.socket=null,this.failPending(),this.emitLifecycle("close")}emitLifecycle(name){for(let handler of this.lifecycleHandlers.get(name)??[])try{handler()}catch(err){console.error(`[rove] lifecycle handler for "${name}" threw:`,err)}}onData(chunk){this.buffer+=chunk;let nl=this.buffer.indexOf(`
4
4
  `);while(nl!==-1){let line=this.buffer.slice(0,nl);if(this.buffer=this.buffer.slice(nl+1),line.trim().length>0)this.onLine(line);nl=this.buffer.indexOf(`
5
5
  `)}}onLine(line){let frame;try{frame=JSON.parse(line)}catch(err){logClientError("client-frame",err);return}if(frame.type==="event"){this.emit(frame);return}if(frame.type!=="response")return;let pending=this.pending.get(frame.id);if(!pending)return;if(this.pending.delete(frame.id),pending.timer)clearTimeout(pending.timer);if(frame.error){let err=Error(frame.error.message);if(frame.error.name)err.name=frame.error.name;pending.reject(err)}else pending.resolve(frame.payload)}emit(frame){for(let handler of this.handlers.get(frame.name)??[])try{handler(frame)}catch(err){logClientError("client-event",err)}for(let handler of this.handlers.get("*")??[])try{handler(frame)}catch(err){logClientError("client-event",err)}}}
6
- export{automationRunNeedsAttention,ROUTINE_RESPONSE_MAX_CHARS,routineRunResponseState,GATE_QUESTION_MAX,GATE_CONTEXT_MAX,GATE_OPTIONS_MAX,isRoutineInboxState,isAttentionInboxState,attentionInboxItemKey,DELIVERY_OUTCOMES,DELIVERY_SUMMARY_MAX_CHARS,DELIVERY_EVIDENCE_MAX_ITEMS,DELIVERY_EVIDENCE_MAX_CHARS,DELIVERY_NEXT_MAX_CHARS,DELIVERY_PROMPT_HEAD_CHARS,MAX_DELIVERIES_PER_TASK,DELIVERY_STALL_MS,deliveryFooter,CHANNEL_NAMES,normalizeChannelFilter,DAEMON_PROTOCOL_VERSION,MIN_COMPATIBLE_PROTOCOL_VERSION,isProtocolCompatible,isDaemonVersionStale,isForeignDaemonHome,parseDaemonStopReason,displayTaskTitle,serializeTask,frameToLine,RpcTimeoutError,ConnectTimeoutError,RoveDaemonClient};
6
+ export{automationRunNeedsAttention,ROUTINE_RESPONSE_MAX_CHARS,routineRunResponseState,GATE_QUESTION_MAX,GATE_CONTEXT_MAX,GATE_OPTIONS_MAX,isRoutineInboxState,isAttentionInboxState,attentionInboxItemKey,DELIVERY_OUTCOMES,DELIVERY_SUMMARY_MAX_CHARS,DELIVERY_EVIDENCE_MAX_ITEMS,DELIVERY_EVIDENCE_MAX_CHARS,DELIVERY_NEXT_MAX_CHARS,DELIVERY_PROMPT_HEAD_CHARS,MAX_DELIVERIES_PER_TASK,DELIVERY_STALL_MS,deliveryFooter,SKIP_REASONS,SHOULD_RUN_SKIP_EXIT_CODE,parseSkipVerdict,CHANNEL_NAMES,normalizeChannelFilter,DAEMON_PROTOCOL_VERSION,MIN_COMPATIBLE_PROTOCOL_VERSION,isProtocolCompatible,isDaemonVersionStale,isForeignDaemonHome,parseDaemonStopReason,displayTaskTitle,serializeTask,frameToLine,RpcTimeoutError,ConnectTimeoutError,RoveDaemonClient};
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{RemoteOrchestrator}from"./chunk-vx4e787s.js";import{startTunnel}from"./chunk-v0jvt60f.js";import{discoverMachine}from"./chunk-v9dcyjmj.js";import{dedupeMachines,duplicateAliasOf,listMachines,readMachines,setMachineIdentity,updateMachine}from"./chunk-3jnw3ftt.js";import{loadStateFile}from"./chunk-axxf5dkq.js";import{createStateCell}from"./chunk-cmp64q4j.js";import{RoveDaemonClient}from"./chunk-y33j54yr.js";import{logClient,logClientError}from"./chunk-y55zpren.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,...found.roveBin?{roveBin:found.roveBin}:{}});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{RemoteOrchestrator}from"./chunk-v9fgdd90.js";import{startTunnel}from"./chunk-v0jvt60f.js";import{discoverMachine}from"./chunk-v9dcyjmj.js";import{dedupeMachines,duplicateAliasOf,listMachines,readMachines,setMachineIdentity,updateMachine}from"./chunk-3jnw3ftt.js";import{loadStateFile}from"./chunk-axxf5dkq.js";import{createStateCell}from"./chunk-cmp64q4j.js";import{RoveDaemonClient}from"./chunk-fnsch8kr.js";import{logClient,logClientError}from"./chunk-y55zpren.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,...found.roveBin?{roveBin:found.roveBin}:{}});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};