@sma1lboy/rove 0.9.281 → 0.9.282

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 (68) hide show
  1. package/dist/cli/{chunk-f23manyf.js → chunk-03a986ba.js} +1 -1
  2. package/dist/cli/{chunk-3m0ydze9.js → chunk-084a4eq5.js} +1 -1
  3. package/dist/cli/{chunk-kt5ngemc.js → chunk-0mr6cckm.js} +1 -1
  4. package/dist/cli/{chunk-6wt08a28.js → chunk-0ramhr3v.js} +1 -1
  5. package/dist/cli/{chunk-cx78tyg1.js → chunk-0ws6j7zf.js} +1 -1
  6. package/dist/cli/{chunk-twy9bfps.js → chunk-1k6expt9.js} +1 -1
  7. package/dist/cli/{chunk-7911jkq6.js → chunk-231mqmk5.js} +1 -1
  8. package/dist/cli/{chunk-v3ecphrz.js → chunk-3m6m1994.js} +1 -1
  9. package/dist/cli/{chunk-hmy01yg2.js → chunk-3xz0dmnc.js} +6 -5
  10. package/dist/cli/{chunk-a5xbsvx2.js → chunk-4d5xp2p0.js} +1 -1
  11. package/dist/cli/{chunk-vtay379p.js → chunk-4g463eqt.js} +1 -1
  12. package/dist/cli/{chunk-08mb3qss.js → chunk-55e3pt18.js} +1 -1
  13. package/dist/cli/{chunk-q6cwy6v5.js → chunk-5bnhecx3.js} +1 -1
  14. package/dist/cli/{chunk-ejfs22aq.js → chunk-5z02j1em.js} +1 -1
  15. package/dist/cli/{chunk-k2rmj0v3.js → chunk-6jj8perx.js} +2 -2
  16. package/dist/cli/{chunk-y2v1x23z.js → chunk-7r1wt7qp.js} +1 -1
  17. package/dist/cli/{chunk-nkgn0bqq.js → chunk-7zwehmay.js} +1 -1
  18. package/dist/cli/{chunk-cx8wnz54.js → chunk-8ccc9v77.js} +1 -1
  19. package/dist/cli/{chunk-c9ptxthj.js → chunk-8ew9sqwa.js} +1 -1
  20. package/dist/cli/{chunk-w3kvkax7.js → chunk-8kspedny.js} +1 -1
  21. package/dist/cli/{chunk-gzkes5bw.js → chunk-92hpkjkk.js} +1 -1
  22. package/dist/cli/{chunk-bbt217yd.js → chunk-97er67dc.js} +1 -1
  23. package/dist/cli/{chunk-j5y7hhc2.js → chunk-9q8wwfs1.js} +1 -1
  24. package/dist/cli/{chunk-cs410j8b.js → chunk-ae8dj2fd.js} +1 -1
  25. package/dist/cli/{chunk-9vwb9f7q.js → chunk-b4egks20.js} +1 -1
  26. package/dist/cli/{chunk-w6ft4djp.js → chunk-b64w1jh6.js} +1 -1
  27. package/dist/cli/{chunk-bm6qhcck.js → chunk-h0wp2ghf.js} +1 -1
  28. package/dist/cli/{chunk-q2nhmaq9.js → chunk-h81h0arp.js} +2 -2
  29. package/dist/cli/{chunk-3pgp6z3k.js → chunk-h8v2jzth.js} +1 -1
  30. package/dist/cli/{chunk-kp43j420.js → chunk-h9cjzh9j.js} +1 -1
  31. package/dist/cli/{chunk-ww0zctb7.js → chunk-jp354m6j.js} +1 -1
  32. package/dist/cli/{chunk-yn01fet6.js → chunk-jxqhq9va.js} +1 -1
  33. package/dist/cli/{chunk-03fv92ya.js → chunk-nb0be8dz.js} +1 -1
  34. package/dist/cli/{chunk-46qs744w.js → chunk-nbf3attz.js} +1 -1
  35. package/dist/cli/{chunk-k9xabf0t.js → chunk-nh4dd7q4.js} +1 -1
  36. package/dist/cli/{chunk-sqdmngys.js → chunk-pg48v2kc.js} +1 -1
  37. package/dist/cli/{chunk-01tghgf3.js → chunk-ph9m6y5j.js} +1 -1
  38. package/dist/cli/{chunk-14tevt5v.js → chunk-pm6j59da.js} +1 -1
  39. package/dist/cli/{chunk-3qj9yw5c.js → chunk-pv3c4vgt.js} +2 -2
  40. package/dist/cli/{chunk-0nkk13z9.js → chunk-q012n1t1.js} +1 -1
  41. package/dist/cli/{chunk-y07cp9mb.js → chunk-qkdc5tc7.js} +1 -1
  42. package/dist/cli/{chunk-4vkrv4eb.js → chunk-qx6d4bbb.js} +1 -1
  43. package/dist/cli/{chunk-ga82ras9.js → chunk-s5eat30g.js} +1 -1
  44. package/dist/cli/{chunk-xekk4k54.js → chunk-s7tbwn04.js} +1 -1
  45. package/dist/cli/{chunk-btxfcc77.js → chunk-swcfg2vb.js} +2 -2
  46. package/dist/cli/{chunk-xxz3np4w.js → chunk-swzdd5aj.js} +1 -1
  47. package/dist/cli/{chunk-vx44yxra.js → chunk-t2418v0z.js} +1 -1
  48. package/dist/cli/{chunk-b5fdqynx.js → chunk-tcdz7sx9.js} +1 -1
  49. package/dist/cli/{chunk-x119xqa6.js → chunk-tg4swhr1.js} +1 -1
  50. package/dist/cli/{chunk-jar50zcp.js → chunk-v5bn5fnd.js} +1 -1
  51. package/dist/cli/{chunk-5swmvt20.js → chunk-v8c4n8by.js} +1 -1
  52. package/dist/cli/{chunk-j2e7jgh8.js → chunk-vcj2x6ne.js} +1 -1
  53. package/dist/cli/{chunk-9qpea48c.js → chunk-w3f993d8.js} +2 -2
  54. package/dist/cli/{chunk-453qpfae.js → chunk-y8n6trr4.js} +1 -1
  55. package/dist/cli/{chunk-32y7f5dr.js → chunk-ydaj339x.js} +1 -1
  56. package/dist/cli/{chunk-tgv90744.js → chunk-yeq2pc68.js} +1 -1
  57. package/dist/cli/{chunk-hnxs5shy.js → chunk-z204mctb.js} +4 -4
  58. package/dist/cli/{chunk-1a57ejnh.js → chunk-za8pnw78.js} +1 -1
  59. package/dist/cli/{chunk-ap3fgbbt.js → chunk-zd61a32g.js} +1 -1
  60. package/dist/cli/{chunk-w8dmmnys.js → chunk-ze4v7eda.js} +1 -1
  61. package/dist/cli/{chunk-sm96b61g.js → chunk-zjsfr4y7.js} +1 -1
  62. package/dist/cli/{chunk-q72w3dsx.js → chunk-zypkjg5t.js} +1 -1
  63. package/dist/cli/index.js +2 -2
  64. package/dist/cli/rove.js +1 -1
  65. package/dist/web/assets/{index-Ct8dDnCc.js → index-Bpal5sTS.js} +31 -31
  66. package/dist/web/index.html +1 -1
  67. package/dist/web/relay/index.html +5 -5
  68. package/package.json +3 -3
@@ -3,5 +3,5 @@ var en={title:"ROUTINES",holdingDaemon:"keeping the daemon awake",notHolding:"no
3
3
  {url}`,error:`error: {message}
4
4
  {hint}`},...en17},zh20={appearance:{enabled:"\u5F00\u542F",disabled:"\u5173\u95ED",borderFlow:"\u6D41\u52A8\u6E10\u53D8",borderStill:"\u9759\u6B62",glyphsBraille:"\u76F2\u6587\u70B9",glyphsStarburst:"\u661F\u8292\uFF08\u9700\u8981\u542B Dingbats \u7B26\u53F7\u533A\u7684\u5B57\u4F53\uFF09",glyphsAscii:"ASCII",titleShimmer:"\u6D41\u5149",titleStill:"\u9759\u6B62",preview:"\u5DE5\u4F5C\u533A\u9884\u89C8",tasks:"\u4EFB\u52A1",terminal:"\u7EC8\u7AEF",files:"\u6587\u4EF6",testsPassed:"\u6D4B\u8BD5\u901A\u8FC7",transparent:"\u900F\u660E\u80CC\u666F",opaque:"\u4E0D\u900F\u660E\u80CC\u666F",modeDark:"\u6DF1\u8272",modeLight:"\u6D45\u8272",modeAuto:"\u81EA\u52A8\uFF08\u8DDF\u968F\u7EC8\u7AEF\uFF09",openHint:"\u6309 Enter \u6253\u5F00\u9009\u9879\u548C\u9884\u89C8\u3002",chooseHint:"\u2191/\u2193 \u6216 j/k \u9884\u89C8 \xB7 enter \u5E94\u7528 \xB7 esc \u53D6\u6D88"},title:"\u8BBE\u7F6E",esc:"esc",nav:{default:"j/k \u9009\u62E9 \xB7 h/l \u5207\u6362\u5C42\u7EA7 \xB7 enter \u786E\u8BA4 \xB7 esc \u5173\u95ED",feedback:"tab \u4E0B\u4E00\u9879 \xB7 enter \u5728\u53D1\u9001\u9879\u53D1\u9001 \xB7 esc \u5173\u95ED"},sections:{general:"\u901A\u7528",autoRouting:"\u81EA\u52A8\u8DEF\u7531",engines:"\u5F15\u64CE",plugins:"\u63D2\u4EF6",marketplace:"\u63D2\u4EF6\u5E02\u573A",keys:"\u5FEB\u6377\u952E",feedback:"\u53CD\u9988",dev:"\u5F00\u53D1"},general:{usage:"\u7528\u91CF",theme:"\u4E3B\u9898",themeMode:"\u660E\u6697",themeHint:"l \u8FDB\u5165\u5217\u8868 \xB7 j/k \u9AD8\u4EAE \xB7 enter \u5E94\u7528",language:"\u8BED\u8A00",languageHint:"Rove \u754C\u9762\u7684\u663E\u793A\u8BED\u8A00\u3002l \u8FDB\u5165\u5217\u8868 \xB7 j/k \u9AD8\u4EAE \xB7 enter \u5E94\u7528\u3002",transparent:"\u900F\u660E\u80CC\u666F",transparentHint:"\u53BB\u6389\u6E32\u67D3\u5668\u7684\u80CC\u666F\u586B\u5145\uFF0C\u8BA9\u5BBF\u4E3B\u7EC8\u7AEF\u900F\u51FA\u6765\u3002\u6309 enter \u5207\u6362\u3002",on:"[x] \u5F00",off:"[ ] \u5173",focusAccent:"\u805A\u7126\u5F3A\u8C03\u8272",focusAccentHint:"\u805A\u7126\u9762\u677F\u6807\u9898\u3001\u258C \u6807\u8BB0\u548C\u5206\u9694\u8FB9\u6846\u7684\u989C\u8272\u3002",accentPrimary:"\u4E3B\u8272\uFF08\u54C1\u724C\u5F3A\u8C03\u8272\uFF09",accentSuccess:"\u6210\u529F\u8272\uFF08\u4F20\u7EDF\u7EFF\uFF09",accentInfo:"\u4FE1\u606F\u8272\uFF08\u51B7\u84DD\uFF09",appearance:"\u5916\u89C2",appearanceHint:"\u5206\u5C4F\u9762\u677F\u600E\u4E48\u753B\u8FB9\u3002",splitStyle:"\u5206\u5C4F\u9762\u677F",workingBorder:"\u8FD0\u884C\u4E2D\u8FB9\u6846",taskColors:"\u4EFB\u52A1\u914D\u8272",glyphSet:"\u72B6\u6001\u7B26\u53F7",colorblind:"\u8272\u76F2\u53CB\u597D\u7684\u589E\u5220\u914D\u8272",runningTitle:"\u8FD0\u884C\u4E2D\u6807\u9898",splitBox:"\u65B9\u6846\u8FB9\u6846",splitLine:"\u5355\u7EBF\u5206\u9694",splitRail:"\u5DE6\u4FA7\u5F3A\u8C03\u6761",splitRule:"\u9876\u90E8\u6A2A\u7EBF",notifications:"\u901A\u77E5",notificationsHint:"\u540E\u53F0\u6807\u7B7E\u5B8C\u6210\u6216\u5728\u5BA1\u6279\u5904\u6682\u505C\u65F6\u89E6\u53D1\u3002",toast:"Toast \u5F39\u7A97",toastHint:"\u53F3\u4E0B\u89D2\u5F39\u7A97",sound:"\u58F0\u97F3",soundHint:"\u54CD\u94C3 + \u63D0\u793A\u97F3 + OSC 9 \u684C\u9762\u901A\u77E5\uFF08\u7ECF SSH \u76F4\u8FBE\u672C\u5730\uFF09",soundVolume:"\u63D0\u793A\u97F3\u97F3\u91CF \u2014 {percent}%",soundVolumeHint:"\u56DE\u8F66\u5FAA\u73AF\u5207\u6362\uFF1B\u4E0B\u4E00\u58F0\u63D0\u793A\u97F3\u751F\u6548",crossTask:"\u8DE8\u4EFB\u52A1",crossTaskHint:"\u4F60\u5DF2\u5207\u8D70\u7684\u4EFB\u52A1\u4E5F\u901A\u77E5",finishedAlerts:"\u56DE\u5408\u5B8C\u6210",finishedAlertsHint:"\u5173\u95ED\u540E\u53EA\u6709\u5BA1\u6279\u548C\u9519\u8BEF\u4F1A\u63D0\u9192\uFF1B\u672A\u8BFB\u6807\u8BB0\u7167\u5E38",keyHints:"\u952E\u76D8\u63D0\u793A",keyHintsHint:"\u72B6\u6001\u680F\u63D0\u9192\uFF0C\u4EE5\u53CA\u4FA7\u680F\u548C\u6587\u4EF6\u9762\u677F\u7684\u9996\u7528\u63D0\u793A\u3002",keyHintsShow:"\u663E\u793A\u952E\u76D8\u63D0\u793A",keyHintsShowHint:"\u91CD\u65B0\u5F00\u542F\u4F1A\u70B9\u4EAE\u5DF2\u56E0\u4F7F\u7528\u800C\u7184\u706D\u7684\u63D0\u793A",zen:"\u7985\u6A21\u5F0F",zenHint:"`zen` \u6807\u8BB0\u548C `prefix`+z \u9690\u85CF Files\uFF0C\u4FDD\u7559 Tasks \u4FA7\u680F\u4E0E workspace\u3002",zenDefaultOn:"\u542F\u52A8\u5373\u8FDB\u5165\u7985\u6A21\u5F0F",updates:"\u66F4\u65B0",updatesHint:"\u7A33\u5B9A\u7248\u662F\u9ED8\u8BA4\u6E20\u9053\uFF1Bnext \u9884\u89C8\u5373\u5C06\u53D1\u5E03\u7684\u7248\u672C\uFF1Bnightly \u6BCF\u5929\u4ECE main \u81EA\u52A8\u6784\u5EFA\u3002",updateChannelTitle:"\u53D1\u5E03\u6E20\u9053",updateChannel:"\u6E20\u9053\uFF1A{channel}",updateChannelHint:"enter \u5728\u7A33\u5B9A\u7248 / next / nightly \u95F4\u5207\u6362\uFF1B`rove update` \u8DDF\u968F\u5B83",updateChannelName:{latest:"\u7A33\u5B9A\u7248",next:"next \u9884\u89C8\u7248",nightly:"nightly \u9884\u89C8\u7248"},updateNotify:"\u6709\u65B0\u7248\u672C\u65F6\u901A\u77E5\u6211",updateNotifyHint:"\u53EA\u9488\u5BF9\u6240\u9009\u6E20\u9053\uFF1B\u5173\u95ED\u540E\u4E0D\u518D\u663E\u793A\u66F4\u65B0\u6807\u8BB0\uFF0C\u624B\u52A8\u68C0\u67E5\u4ECD\u4F1A\u7ED9\u51FA\u7ED3\u679C",updateCheck:"[ \u68C0\u67E5\u66F4\u65B0 ]",updateCheckHint:"\u7ACB\u5373\u5411 npm \u67E5\u8BE2\u6240\u9009\u6E20\u9053\u7684\u6700\u65B0\u7248\u672C",updateCheckButton:"\u68C0\u67E5\u66F4\u65B0",updateChecking:"\u68C0\u67E5\u4E2D\u2026",updateOpenPage:"\u6253\u5F00\u66F4\u65B0\u9875",updateOpenPageRow:"[ \u6253\u5F00\u66F4\u65B0\u9875 ]",railFold:"\u6298\u53E0\u540E\u7684\u4EFB\u52A1\u680F",railFoldHint:"\u4EFB\u52A1\u680F\u4ECE\u89D2\u6807\u6298\u53E0\u4E4B\u540E\u663E\u793A\u4EC0\u4E48\u3002",railFoldRow:"\u6298\u53E0\u540E\u663E\u793A\uFF1A{style}",railFoldRowHint:"enter \u5207\u6362",railFoldGlyphs:"\u72B6\u6001\u5B57\u5F62",railFoldInitials:"\u5B57\u5F62 + \u9996\u5B57\u6BCD",railFoldHairline:"\u4EC5\u8272\u5E26",editor:"\u7F16\u8F91\u5668",editorHint:"\u6587\u4EF6\u6811\u91CC\u6309 enter \u7528\u4EC0\u4E48\u6253\u5F00\u6587\u4EF6\u2014\u2014\u652F\u6301\u65F6\u8D70\u7F16\u8F91\u5668 diff \u6A21\u5F0F\uFF0C\u672A\u5B89\u88C5\u65F6\u56DE\u9000\u5230\u53EA\u8BFB\u9884\u89C8\u3002",editorRow:"\u7F16\u8F91\u5668: < {kind} >",editorRowHint:"auto \u8DDF\u968F $VISUAL / $EDITOR\uFF0C\u5426\u5219 nvim / vim / emacs / nano",editorCustom:"\u81EA\u5B9A\u4E49: {cmd}",editorCustomUnset:"(\u672A\u8BBE\u7F6E \u2014 enter \u7F16\u8F91)",worktree:"\u5DE5\u4F5C\u6811\u4F4D\u7F6E",worktreeHint:"\u65B0\u4EFB\u52A1\u5DE5\u4F5C\u6811\u7684\u521B\u5EFA\u4F4D\u7F6E\u3002\u4EC5\u5BF9\u65B0\u4EFB\u52A1\u751F\u6548\u3002",worktreeBase:"\u4F4D\u7F6E: < {kind} >",worktreeBaseHint:"\u81EA\u5B9A\u4E49\u53EF\u586B `~`\u3001\u76F8\u5BF9\u8DEF\u5F84\u6216\u4EE5 `$project_dir` \u5F00\u5934",worktreeKindDefault:"\u9ED8\u8BA4 ~/.rove/worktrees",worktreeKindNext:"\u9879\u76EE\u65C1\u8FB9",worktreeKindCustom:"\u81EA\u5B9A\u4E49",worktreeCustom:"\u81EA\u5B9A\u4E49: {path}",worktreeCustomUnset:"(\u672A\u8BBE\u7F6E \u2014 enter \u7F16\u8F91)",worktreeBaseTitle:"\u81EA\u5B9A\u4E49\u5DE5\u4F5C\u6811\u4F4D\u7F6E\uFF08\u7559\u7A7A = \u9ED8\u8BA4\uFF1B$project_dir = \u9879\u76EE\u6839\u76EE\u5F55\uFF09",worktreeBaseField:"\u8DEF\u5F84",editorCustomTitle:"\u81EA\u5B9A\u4E49\u7F16\u8F91\u5668\u547D\u4EE4\uFF08\u7528 {file} \u4EE3\u8868\u6587\u4EF6\u8DEF\u5F84\uFF09",worktreeBaseInvalidTitle:"\u65E0\u6CD5\u4F7F\u7528\u8BE5\u5DE5\u4F5C\u6811\u4F4D\u7F6E",worktreeBaseTokenBody:"{token} \u53EA\u80FD\u4F5C\u4E3A\u8DEF\u5F84\u7684\u7B2C\u4E00\u6BB5\u5C55\u5F00\uFF08\u5982 {token}/../rove-worktrees\uFF09\u3002\u4FDD\u7559\u539F\u8BBE\u7F6E\u3002",worktreeBaseUnusableBody:"{path} \u4E0D\u53EF\u7528\uFF08{error}\uFF09\u3002\u4FDD\u7559\u539F\u8BBE\u7F6E \u2014\u2014 \u8BF7\u9009\u62E9\u4E00\u4E2A\u53EF\u5199\u76EE\u5F55\u3002",terminal:"\u7EC8\u7AEF",terminalHint:"\u5BF9\u4FEE\u6539\u540E\u65B0\u6253\u5F00\u7684\u7EC8\u7AEF\u751F\u6548\u3002",scrollbackRow:"\u56DE\u6EDA\u884C\u6570: {rows} \u884C",scrollbackRowHint:"100\u2013100000 \xB7 \u8C03\u5927\u4F1A\u6309\u6BD4\u4F8B\u589E\u52A0\u6BCF\u6B21\u91CD\u7ED8\u7684 CPU",scrollbackTitle:"\u7EC8\u7AEF\u56DE\u6EDA\u884C\u6570\uFF08100\u2013100000\uFF09",scrollbackField:"\u884C\u6570",scrollbackInvalidTitle:"\u4E0D\u662F\u6570\u5B57",scrollbackInvalidBody:"\u56DE\u6EDA\u884C\u6570\u5FC5\u987B\u662F\u6570\u5B57\uFF08\u5982 1000\uFF09\u3002\u4FDD\u7559\u539F\u8BBE\u7F6E\u3002",tabStripRow:"\u6807\u7B7E\u680F: {mode}",tabStripMode:{never:"\u5173\u95ED \u2014 \u6807\u7B7E\u5728\u5DE6\u4FA7\u6811\u91CC",multipleOnly:"\u4EC5 2 \u4E2A\u4EE5\u4E0A\u6807\u7B7E\u65F6\u663E\u793A",always:"\u59CB\u7EC8\u663E\u793A"}},field:{command:"\u547D\u4EE4",name:"\u540D\u79F0",id:"\u6807\u8BC6"},action:{save:"\u4FDD\u5B58",next:"\u4E0B\u4E00\u6B65",add:"\u6DFB\u52A0"},reset:{title:"\u91CD\u7F6E\u754C\u9762\u72B6\u6001\uFF1F",body:"\u5C06\u6E05\u9664 ~/.config/rove/state.json \u548C ~/.rove/tasks.json \u5E76\u9000\u51FA Rove \u2014\u2014 \u91CD\u65B0\u542F\u52A8\u540E\u4F1A\u662F\u4E00\u4E2A\u5E72\u51C0\u7684\u5F00\u59CB\uFF0C\u5DE5\u4F5C\u4F1A\u8BDD\u5217\u8868\u4E3A\u7A7A\u3002\u78C1\u76D8\u4E0A\u7684\u5DE5\u4F5C\u6811\u548C\u5F15\u64CE\u4F1A\u8BDD\u5386\u53F2\u4E0D\u53D7\u5F71\u54CD\u3002",done:"Rove\uFF1A\u754C\u9762\u72B6\u6001\u5DF2\u91CD\u7F6E\u3002\u91CD\u65B0\u542F\u52A8 Rove \u5373\u53EF\u4ECE\u5934\u5F00\u59CB\u3002",failedTitle:"UI \u72B6\u6001\u672A\u80FD\u91CD\u7F6E",failedBody:"\u65E0\u6CD5\u5199\u5165\u8BBE\u7F6E\u6587\u4EF6\u3002\u8BBE\u7F6E\u548C\u4EFB\u52A1\u5747\u5DF2\u4FDD\u7559\uFF0C\u8BF7\u7A0D\u540E\u91CD\u65B0\u5C1D\u8BD5\u91CD\u7F6E\u3002"},restart:{title:"\u91CD\u542F\u540E\u7AEF\uFF1F",body:"\u4F1A\u505C\u6389 daemon\uFF0C\u5E76\u4EE5\u5DF2\u5B89\u88C5\u7684\u7248\u672C\u91CD\u65B0\u542F\u52A8\u5F53\u524D Rove \u7A97\u53E3\uFF0C\u4ECE\u800C\u8BA9 daemon / orchestrator / \u5F15\u64CE\u7684\u6539\u52A8\u751F\u6548\u3002\u6B63\u5728\u8FD0\u884C\u7684\u5F15\u64CE\u4F1A\u8BDD\u7531 PTY host \u6258\u7BA1\uFF0C\u4E0D\u4F1A\u4E2D\u65AD\uFF1B\u5DF2\u6253\u5F00\u7684\u6807\u7B7E\u9875\u4F1A\u6062\u590D\u3002\u5176\u4ED6\u5DF2\u8FDE\u63A5\u7684\u7A97\u53E3\u4F1A\u81EA\u884C\u91CD\u8FDE\u3002",done:"Rove\uFF1A\u6B63\u5728\u91CD\u542F\u540E\u7AEF\u2026\u2026"},stateWrite:{failedTitle:"\u8BBE\u7F6E\u672A\u80FD\u4FDD\u5B58",failedBody:"{file} \u5199\u5165\u5931\u8D25\uFF08{keys}\uFF09\u3002\u8BF7\u68C0\u67E5\u76EE\u5F55\u6743\u9650\u548C\u78C1\u76D8\u7A7A\u95F4\uFF0C\u518D\u6B21\u4FDD\u5B58\u3002"},...zh16,...zh18,...zh19,keybindings:{title:"\u5FEB\u6377\u952E",hint:"\u5728\u4F60\u81EA\u5DF1\u7684 YAML \u6587\u4EF6\u91CC\u91CD\u7ED1\u5B9A\u76F4\u63A5\u6309\u952E\u548C prefix \u7EC4\u5408\uFF1B\u4FEE\u6539\u4F1A\u5B9E\u65F6\u52A0\u8F7D\u3002\u4EFB\u610F\u4F4D\u7F6E\u6309 F1 \u67E5\u770B\u5E26\u6BCF\u4E2A\u7ED1\u5B9A id \u7684\u5B9E\u65F6\u952E\u4F4D\u8868\u3002",configFile:"\u914D\u7F6E\u6587\u4EF6",notCreated:" (\u5C1A\u672A\u521B\u5EFA)",prefixTitle:"\u547D\u4EE4\u5C42\uFF08{prefix}\uFF09",prefixHint:"\u88F8\u952E\u4F5C\u7528\u4E8E\u5F53\u524D\u805A\u7126\u9762\u677F\uFF1B\u5C11\u91CF\u5355\u6B21\u5FEB\u6377\u952E\u8986\u76D6\u9AD8\u9891 Rove \u64CD\u4F5C\uFF1B{prefix} \u6253\u5F00\u547D\u4EE4\u5C42\uFF08\u7B2C\u4E8C\u51FB\u7A97\u53E3 {timeout}ms\uFF09\u3002Prefix \u7ED1\u5B9A\u4FDD\u6301\u539F\u6709\u7684\u9762\u677F\u4F5C\u7528\u57DF\u548C modal \u89C4\u5219\u3002",tapPresentation:"\u70B9\u6309 Prefix",tapPresentationHint:"\u9009\u62E9\u5B8C\u6574\u6307\u5357\u662F\u5426\u540C\u65F6\u6807\u8BB0\u5F53\u524D\u5C4F\u5E55\u4E0A\u7684\u5165\u53E3\u3002",tapPresentationLocal:"\u5C4F\u5E55\u5165\u53E3 + \u5B8C\u6574\u6307\u5357\uFF08\u9ED8\u8BA4\uFF09",tapPresentationGuide:"\u4EC5\u5B8C\u6574\u6307\u5357",prefixDisabled:"\u5DF2\u7981\u7528",fixed:"\u56FA\u5B9A\uFF08\u4E0D\u53EF\u91CD\u7ED1\u5B9A\uFF09\uFF1A{ids}\u3002",createHint:"\u8FD8\u6CA1\u6709\u8986\u76D6\u6587\u4EF6\u3002Rove \u53EF\u4EE5\u5E2E\u4F60\u5199\u4E00\u4EFD\u5E26\u5B8C\u6574\u6CE8\u91CA\u7684\u2014\u2014\u5728\u4F60\u53D6\u6D88\u6CE8\u91CA\u4E4B\u524D\u4E0D\u4F1A\u6539\u52A8\u4EFB\u4F55\u6309\u952E\u3002",createFile:"[enter] \u521B\u5EFA keybindings.yaml",overridesApplied:"\u5DF2\u5E94\u7528\u7684\u8986\u76D6",none:"\u65E0",unbound:"(\u5DF2\u89E3\u7ED1)",defaultKeys:"\u9ED8\u8BA4: {keys}",warnings:"\u8B66\u544A"},feedback:{title:"\u53CD\u9988",hint:"\u901A\u8FC7 `gh` \u5728 Rove \u4ED3\u5E93\u63D0\u4E00\u4E2A GitHub issue\u3002\u9700\u8981 `gh auth login`\uFF1B\u6CA1\u767B\u5F55\u65F6\u4F1A\u7ED9\u4F60\u4E00\u6761\u9884\u586B\u597D\u7684\u94FE\u63A5\u3002",titleLabel:"\u6807\u9898",titlePlaceholder:"\u7B80\u77ED\u6982\u62EC",descriptionLabel:"\u63CF\u8FF0",descriptionPlaceholder:"\u53D1\u751F\u4E86\u4EC0\u4E48\uFF1F(enter \u6362\u884C \xB7 tab \u8DF3\u5230\u53D1\u9001)",send:"[enter] \u63D0\u4EA4 GitHub issue",submitting:"\u63D0\u4EA4\u4E2D...",sent:"\u5DF2\u63D0\u4EA4 #{number}\uFF1A{url}",notFiled:`\u672A\u63D0\u4EA4\uFF1A{hint}
5
5
  {url}`,error:`\u9519\u8BEF\uFF1A{message}
6
- {hint}`},...zh17};var en21={cancel:"cancel",forgetProjectTitle:'Remove project "{title}"?',forgetProjectBody:"Forgets it from the projects list. The repo, its branches, worktrees, and any tasks under it stay on disk \u2014 re-add it with `rove add`.",forgetProjectConfirm:"remove",deleteTitle:'Remove session "{title}"?',deleteTitleDir:'Remove session "{title}"?',deleteBodyDir:"Ends this session and closes all its tabs. Nothing on disk changes: the folder and its files stay.",deleteBodyMain:"Ends this session and closes all its tabs. The project stays in your list and nothing on disk changes: the repo, its branches and worktrees stay.",deleteBodyTask:"Ends this session, closes all its tabs and removes its worktree folder. The git branch stays.",deleteBodyTaskBranch:"Ends this session, closes all its tabs and removes its worktree folder, and its git branch if it is merged. An unmerged branch stays.",deleteConfirm:"remove",childrenTitle:'"{title}" has {count} child tasks',childrenBody:"Promote moves them up one level and keeps their worktrees and sessions. Remove with children removes them too.",childrenPromote:"promote children",childrenCascade:"remove with children",childrenBodyMain:"Ends this session and closes its tabs; nothing on disk changes. Its child tasks keep running unless you delete them too.",childrenKeepMain:"remove session",childrenCascadeMain:"remove with children",forceDeleteTitle:'"{title}" has uncommitted changes',forceDeleteConfirm:"force remove"},zh21={cancel:"\u53D6\u6D88",forgetProjectTitle:"\u4ECE\u5217\u8868\u4E2D\u79FB\u9664\u9879\u76EE\u300C{title}\u300D\uFF1F",forgetProjectBody:"\u53EA\u662F\u628A\u5B83\u4ECE\u9879\u76EE\u5217\u8868\u91CC\u5FD8\u6389\u3002\u4ED3\u5E93\u3001\u5206\u652F\u3001worktree \u4EE5\u53CA\u5B83\u4E0B\u9762\u7684\u4EFB\u52A1\u90FD\u4F1A\u7559\u5728\u78C1\u76D8\u4E0A\u2014\u2014\u4E4B\u540E\u53EF\u4EE5\u7528 `rove add` \u91CD\u65B0\u52A0\u56DE\u6765\u3002",forgetProjectConfirm:"\u79FB\u9664",deleteTitle:"\u79FB\u9664\u4F1A\u8BDD\u300C{title}\u300D\uFF1F",deleteTitleDir:"\u79FB\u9664\u4F1A\u8BDD\u300C{title}\u300D\uFF1F",deleteBodyDir:"\u7ED3\u675F\u8FD9\u4E2A\u4F1A\u8BDD\uFF0C\u5173\u95ED\u5B83\u7684\u6240\u6709\u6807\u7B7E\u9875\u3002\u78C1\u76D8\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u52A8\uFF1A\u6587\u4EF6\u5939\u548C\u91CC\u9762\u7684\u6587\u4EF6\u90FD\u4F1A\u4FDD\u7559\u3002",deleteBodyMain:"\u7ED3\u675F\u8FD9\u4E2A\u4F1A\u8BDD\uFF0C\u5173\u95ED\u5B83\u7684\u6240\u6709\u6807\u7B7E\u9875\u3002\u9879\u76EE\u4ECD\u7559\u5728\u5217\u8868\u91CC\uFF0C\u78C1\u76D8\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u52A8\uFF1A\u4ED3\u5E93\u3001\u5206\u652F\u548C worktree \u90FD\u4F1A\u4FDD\u7559\u3002",deleteBodyTask:"\u7ED3\u675F\u8FD9\u4E2A\u4F1A\u8BDD\uFF0C\u5173\u95ED\u5B83\u7684\u6240\u6709\u6807\u7B7E\u9875\uFF0C\u5E76\u5220\u9664\u5B83\u7684 worktree \u6587\u4EF6\u5939\u3002git \u5206\u652F\u4F1A\u4FDD\u7559\u3002",deleteBodyTaskBranch:"\u7ED3\u675F\u8FD9\u4E2A\u4F1A\u8BDD\uFF0C\u5173\u95ED\u5B83\u7684\u6240\u6709\u6807\u7B7E\u9875\uFF0C\u5220\u9664\u5B83\u7684 worktree \u6587\u4EF6\u5939\uFF0C\u4EE5\u53CA\u5DF2\u5408\u5E76\u7684 git \u5206\u652F\u3002\u672A\u5408\u5E76\u7684\u5206\u652F\u4F1A\u4FDD\u7559\u3002",deleteConfirm:"\u79FB\u9664",childrenTitle:"\u300C{title}\u300D\u6709 {count} \u4E2A\u5B50\u4EFB\u52A1",childrenBody:"\u63D0\u5347\u4F1A\u628A\u5B83\u4EEC\u4E0A\u79FB\u4E00\u7EA7\uFF0C\u5E76\u4FDD\u7559\u5B83\u4EEC\u7684 worktree \u548C\u4F1A\u8BDD\u3002\u8FDE\u540C\u5B50\u4EFB\u52A1\u79FB\u9664\u4F1A\u628A\u5B83\u4EEC\u4E00\u5E76\u79FB\u9664\u3002",childrenPromote:"\u63D0\u5347\u5B50\u4EFB\u52A1",childrenCascade:"\u8FDE\u540C\u5B50\u4EFB\u52A1\u79FB\u9664",childrenBodyMain:"\u7ED3\u675F\u8FD9\u4E2A\u4F1A\u8BDD\u5E76\u5173\u95ED\u5B83\u7684\u6807\u7B7E\u9875\uFF0C\u78C1\u76D8\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u52A8\u3002\u5B83\u7684\u5B50\u4EFB\u52A1\u4F1A\u7EE7\u7EED\u8FD0\u884C\uFF0C\u9664\u975E\u4F60\u4E5F\u9009\u62E9\u628A\u5B83\u4EEC\u4E00\u5E76\u5220\u9664\u3002",childrenKeepMain:"\u79FB\u9664\u4F1A\u8BDD",childrenCascadeMain:"\u8FDE\u540C\u5B50\u4EFB\u52A1\u79FB\u9664",forceDeleteTitle:"\u300C{title}\u300D\u6709\u672A\u63D0\u4EA4\u7684\u6539\u52A8",forceDeleteConfirm:"\u5F3A\u5236\u79FB\u9664"};var en22={noDaemonWorktree:"No daemon running \u2014 can't create the worktree. Start it with `rove daemon restart`.",noEditor:"No editor found \u2014 set ROVE_OPEN_EDITOR (e.g. 'code', 'cursor', 'nvim')",openWorktreeFailed:"Couldn't open worktree with {label}",worktreeErrorDeleting:"This task is being deleted \u2014 it can't be opened",worktreeErrorNotGit:"This project isn't a git repo yet \u2014 a task needs a git branch. Run `git init` (+ a first commit) in the project, then open the task. Non-git support is coming.",worktreeErrorGeneric:"Couldn't create the worktree: {message}",scratchAdopted:"Adopted into {repo} \u2014 save it as a project from New Task if you want it in the picker",scratchOpenFailed:"Couldn't open a scratch shell: {message}",scratchCloseFailed:"Couldn't close the scratch task: {message}",worktreeGoneTitle:'Worktree for "{title}" is gone',worktreeGoneBody:"Closed {count} tab(s). The branch {branch} is still there \u2014 reopen the task to re-create its worktree.",checksPassingTitle:'Checks passed for "{title}"',checksFailingTitle:'Checks failed for "{title}"',checksResolvedBody:"PR {pr} on {branch}",copiedId:"Copied task ID {text}",copiedTab:"Copied tab address {text}",copiedBranch:"Copied branch {text}",copiedPath:"Copied path {text}",copyFailed:"Couldn't reach a clipboard \u2014 no clipboard command on PATH, and this terminal refused OSC 52.",forgetProjectFailed:"Couldn't remove the project \u2014 it stays in the projects list: {error}",deleteFailed:`Couldn't delete "{title}" \u2014 the task and its worktree are untouched: {error}`,createFailed:"Couldn't create the task \u2014 nothing was created: {error}",forkFailed:"Couldn't fork the task \u2014 the original is untouched: {error}",forkLeftBehind:"Started from the last commit \u2014 uncommitted work stays in the original task ({reason})",childFailed:"Couldn't start the new conversation \u2014 the current one is untouched: {error}",renameFailed:"Couldn't rename the task \u2014 it keeps its old title: {error}",renameBranchFailed:`Couldn't rename the branch \u2014 it stays "{branch}": {error}`,switchEngineFailed:"Couldn't switch the engine \u2014 the task keeps the one it had: {error}",setStatusFailed:"Couldn't set the status \u2014 it stays {status}: {error}",pinFailed:"Couldn't change the pin \u2014 the task keeps its current place: {error}",moveFailed:"Couldn't move the task \u2014 it keeps its current place: {error}",moveToProjectFailed:"Couldn't move the task to that project \u2014 it stays where it was: {error}",movedToProject:"Moved to {project} \u2014 the session and its checkout stay where they are",issueChatFailed:"Couldn't start the issue chat \u2014 the issue is unchanged: {error}",inboxMarkReadFailed:"Couldn't mark it read \u2014 it stays in the inbox: {error}",inboxDismissFailed:"Couldn't dismiss it \u2014 it stays in the inbox: {error}",engineSwitched:"Engine \u2192 {engine} (applies on reopen)",statusSet:"Status \u2192 {status}"},zh22={noDaemonWorktree:"\u5B88\u62A4\u8FDB\u7A0B\u672A\u8FD0\u884C\u2014\u2014\u65E0\u6CD5\u521B\u5EFA worktree\u3002\u8BF7\u8FD0\u884C `rove daemon restart` \u542F\u52A8\u5B83\u3002",noEditor:"\u672A\u627E\u5230\u7F16\u8F91\u5668\u2014\u2014\u8BF7\u8BBE\u7F6E ROVE_OPEN_EDITOR\uFF08\u5982 'code'\u3001'cursor'\u3001'nvim'\uFF09",openWorktreeFailed:"\u65E0\u6CD5\u7528 {label} \u6253\u5F00 worktree",worktreeErrorDeleting:"\u8BE5\u4EFB\u52A1\u6B63\u5728\u5220\u9664\u4E2D\u2014\u2014\u65E0\u6CD5\u6253\u5F00",worktreeErrorNotGit:"\u8BE5\u9879\u76EE\u5C1A\u975E git \u4ED3\u5E93\u2014\u2014\u4EFB\u52A1\u9700\u8981 git \u5206\u652F\u3002\u8BF7\u5728\u9879\u76EE\u4E2D\u6267\u884C `git init`\uFF08+ \u9996\u6B21\u63D0\u4EA4\uFF09\u540E\u518D\u6253\u5F00\u4EFB\u52A1\u3002\u975E git \u9879\u76EE\u7684\u652F\u6301\u5373\u5C06\u63A8\u51FA\u3002",worktreeErrorGeneric:"\u65E0\u6CD5\u521B\u5EFA worktree\uFF1A{message}",scratchAdopted:"\u5DF2\u5F52\u5165 {repo}\u2014\u2014\u82E5\u8981\u51FA\u73B0\u5728\u9879\u76EE\u9009\u62E9\u5668\u91CC,\u53EF\u5728\u65B0\u5EFA\u4EFB\u52A1\u4E2D\u4FDD\u5B58\u4E3A\u9879\u76EE",scratchOpenFailed:"\u65E0\u6CD5\u6253\u5F00\u4E34\u65F6 Shell:{message}",scratchCloseFailed:"\u65E0\u6CD5\u5173\u95ED\u4E34\u65F6\u4EFB\u52A1:{message}",worktreeGoneTitle:'"{title}" \u7684 worktree \u5DF2\u6D88\u5931',worktreeGoneBody:"\u5DF2\u5173\u95ED {count} \u4E2A\u6807\u7B7E\u9875\u3002\u5206\u652F {branch} \u4ECD\u5728\u2014\u2014\u91CD\u65B0\u6253\u5F00\u8BE5\u4EFB\u52A1\u4F1A\u91CD\u5EFA worktree\u3002",checksPassingTitle:"\u300C{title}\u300D\u7684 PR \u68C0\u67E5\u5DF2\u901A\u8FC7",checksFailingTitle:"\u300C{title}\u300D\u7684 PR \u68C0\u67E5\u5931\u8D25\u4E86",checksResolvedBody:"PR {pr}\uFF0C\u5206\u652F {branch}",copiedId:"\u5DF2\u590D\u5236\u4EFB\u52A1 ID {text}",copiedTab:"\u5DF2\u590D\u5236\u6807\u7B7E\u9875\u5730\u5740 {text}",copiedBranch:"\u5DF2\u590D\u5236\u5206\u652F {text}",copiedPath:"\u5DF2\u590D\u5236\u8DEF\u5F84 {text}",copyFailed:"\u65E0\u6CD5\u8BBF\u95EE\u526A\u8D34\u677F\u2014\u2014PATH \u4E0A\u6CA1\u6709\u526A\u8D34\u677F\u547D\u4EE4\uFF0C\u8FD9\u4E2A\u7EC8\u7AEF\u4E5F\u62D2\u7EDD\u4E86 OSC 52\u3002",forgetProjectFailed:"\u79FB\u9664\u9879\u76EE\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u5728\u9879\u76EE\u5217\u8868\u91CC\uFF1A{error}",deleteFailed:"\u5220\u9664\u300C{title}\u300D\u5931\u8D25\u2014\u2014\u4EFB\u52A1\u548C\u5B83\u7684 worktree \u90FD\u6CA1\u6709\u88AB\u6539\u52A8\uFF1A{error}",createFailed:"\u521B\u5EFA\u4EFB\u52A1\u5931\u8D25\u2014\u2014\u4EC0\u4E48\u90FD\u6CA1\u6709\u88AB\u521B\u5EFA\uFF1A{error}",forkFailed:"fork \u4EFB\u52A1\u5931\u8D25\u2014\u2014\u539F\u4EFB\u52A1\u6CA1\u6709\u88AB\u6539\u52A8\uFF1A{error}",forkLeftBehind:"\u5DF2\u4ECE\u6700\u8FD1\u4E00\u6B21\u63D0\u4EA4\u5F00\u59CB\u2014\u2014\u672A\u63D0\u4EA4\u7684\u6539\u52A8\u7559\u5728\u539F\u4EFB\u52A1\u91CC\uFF08{reason}\uFF09",childFailed:"\u65E0\u6CD5\u5F00\u59CB\u65B0\u5BF9\u8BDD\u2014\u2014\u5F53\u524D\u5BF9\u8BDD\u6CA1\u6709\u88AB\u6539\u52A8\uFF1A{error}",renameFailed:"\u91CD\u547D\u540D\u4EFB\u52A1\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u7528\u539F\u6765\u7684\u6807\u9898\uFF1A{error}",renameBranchFailed:"\u91CD\u547D\u540D\u5206\u652F\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u662F\u300C{branch}\u300D\uFF1A{error}",switchEngineFailed:"\u5207\u6362\u5F15\u64CE\u5931\u8D25\u2014\u2014\u4EFB\u52A1\u4ECD\u4F7F\u7528\u539F\u6765\u7684\u5F15\u64CE\uFF1A{error}",setStatusFailed:"\u8BBE\u7F6E\u72B6\u6001\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u662F {status}\uFF1A{error}",pinFailed:"\u4FEE\u6539\u7F6E\u9876\u72B6\u6001\u5931\u8D25\u2014\u2014\u4EFB\u52A1\u4ECD\u5728\u539F\u6765\u7684\u4F4D\u7F6E\uFF1A{error}",moveFailed:"\u79FB\u52A8\u4EFB\u52A1\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u5728\u539F\u6765\u7684\u4F4D\u7F6E\uFF1A{error}",moveToProjectFailed:"\u79FB\u5230\u8BE5\u9879\u76EE\u5931\u8D25\u2014\u2014\u4EFB\u52A1\u4ECD\u5728\u539F\u6765\u7684\u9879\u76EE\uFF1A{error}",movedToProject:"\u5DF2\u79FB\u5230 {project}\u2014\u2014\u4F1A\u8BDD\u548C\u5B83\u7684\u5DE5\u4F5C\u76EE\u5F55\u90FD\u6CA1\u6709\u52A8",issueChatFailed:"\u542F\u52A8\u8BAE\u9898\u4F1A\u8BDD\u5931\u8D25\u2014\u2014\u8BAE\u9898\u6CA1\u6709\u88AB\u6539\u52A8\uFF1A{error}",inboxMarkReadFailed:"\u6807\u8BB0\u4E3A\u5DF2\u8BFB\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u7559\u5728\u6536\u4EF6\u7BB1\u91CC\uFF1A{error}",inboxDismissFailed:"\u5FFD\u7565\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u7559\u5728\u6536\u4EF6\u7BB1\u91CC\uFF1A{error}",engineSwitched:"\u5F15\u64CE \u2192 {engine}\uFF08\u91CD\u65B0\u6253\u5F00\u540E\u751F\u6548\uFF09",statusSet:"\u72B6\u6001 \u2192 {status}"};var en23={nav:{kanban:"Kanban",automations:"Routines",issues:"Issues",mods:"Mods"},header:{scratch:"Ungrouped"},search:{placeholder:"fuzzy filter"},sort:{label:"sort: {mode}",hint:"Change the order (manual \u2192 newest \u2192 attention \u2192 name)",reorderSwitched:"Reorder needs manual order \u2014 switched",modes:{default:"manual",recent:"newest",attention:"attention",name:"name"}},menu:{open:"Open",collapseChildren:"Collapse children",expandChildren:"Expand children",newChat:"New conversation",newShell:"New shell",continueEngine:"Continue in another engine\u2026",newScratchChat:"New conversation (no folder)",newTask:"New task",forgetProject:"Remove project",fieldNotes:"Field notes",rename:"Rename",pin:"Pin",unpin:"Unpin",reorder:"Reorder row",moveToTop:"Move to top",reorderProject:"Reorder project",runAgain:"Run again",setStatus:"Set status",moveToProject:"Move to project\u2026",copyId:"Copy task ID",copyBranch:"Copy branch name",copyPath:"Copy path",openEditor:"Open in editor",renameBranch:"Rename branch",changeEngine:"Change engine",fixChecks:"Fix failing checks",rerunChecks:"Re-run failed checks",syncBase:"Sync with base",resolveConflicts:"Resolve conflicts",land:"Land into base branch",archive:"Archive",unarchive:"Unarchive",delete:"Remove session"},status:{backlog:"Backlog",inProgress:"In progress",inReview:"In review",done:"Done",canceled:"Canceled",error:"Error"},setStatus:{title:"Set status",current:"current",footer:"\u2191\u2193 choose \xB7 enter set \xB7 esc cancel"},moveToProject:{title:"Move to project",empty:"No other project yet \u2014 add one first, or run `rove api update --project PATH`",footer:"\u2191\u2193 choose \xB7 enter move \xB7 esc cancel"},sync:{done:"Merged {base} into this worktree",alreadyCurrent:"Already up to date with {base}",conflict:"Merge conflict \u2014 resolve then commit: {files}",dirty:"Commit the worktree's changes first, then sync: {files}",failed:"Sync failed: {error}"},archive:{done:"Archived {title}. Its worktree, branch and sessions are untouched",restored:"Restored {title}",busyTitle:"Archive while it's working?",busyBody:"An engine in {title} is still working or waiting on you. Archiving hides the row without stopping it.",busyConfirm:"Archive anyway",failed:"Couldn't archive: {error}",restoreFailed:"Couldn't restore: {error}"},rerun:{started:"Re-running failed checks",none:"No failed checks to re-run",external:"These checks didn't run on GitHub Actions; re-run them where they ran",refused:"Re-run refused: {detail}"},changeEngine:{title:"Change engine",current:"current",effortLabel:"EFFORT",noEffort:"engine default",footer:{engine:"\u2191\u2193 engine",effort:"\u2190\u2192 effort",model:"tab model",set:"enter set",cancel:"esc cancel"}},engineModel:{label:"MODEL",placeholder:"engine default",loading:"listing models\u2026"},tier:{swift:"swift",standard:"standard",deep:"deep",manual:"manual"},tierDesc:{swift:"small, well-specified edits \u2014 the fastest, cheapest setting",standard:"everyday feature work and bug fixes",deep:"hard problems: unclear root causes, large refactors, design decisions"},runAgain:{title:"Run again",source:"Brief from \u201C{title}\u201D",hint:"Runs this brief again in a new task, on its own branch and worktree.",confirm:"Run again",footer:"\u2191\u2193 scroll \xB7 \u2190\u2192 choose \xB7 enter run \xB7 esc cancel"},fieldNotes:{title:"Field notes",empty:"No field notes for this repo yet \u2014 agents file one with `rove api note`.",loading:"Loading\u2026",footer:"\u2191\u2193 scroll \xB7 esc close",footerDeletable:"\u2191\u2193 select \xB7 d delete \xB7 esc close",confirmDelete:{title:"Delete this field note?",body:"\u201C{text}\u201D stops being injected into new sessions on this repo. Nothing else changes."}},confirm:en21,renameBranch:{title:"Rename branch",fieldLabel:"branch"},moveChip:" move",recentJump:"Recent: {title}",routinesRow:"{count} routine sessions",routinesRowOne:"1 routine session",archivedRow:"Archived \xB7 {count}",machine:{connecting:"connecting\u2026",offline:"offline",unsupported:"unsupported",mismatch:"protocol mismatch",filesElsewhere:"on {host}",filesHint:"{host} is unreachable right now; its files show here again when it reconnects.",terminalElsewhere:"This task runs on {host}, which is unreachable right now.",runsOn:"on {host}",noTabs:"No tabs on {host} yet \u2014 prefix t opens one there."},empty:{noMatchSearch:"No matching tasks \u2014 esc to clear.",noActiveProject:"No active tasks for this project.",noActive:"No active tasks \u2014 create one above."},activity:{working:"working",rateLimited:"rate limited",permissionNeeded:"needs permission",error:"error",dead:"engine exited"},group:{waitingOnYou:"needs you",landing:"ready to land",readyForReview:"needs review",working:"working"},subtitle:{noTracking:"no activity tracking",materializing:"materializing",deleting:"deleting",deleteFailed:"delete failed"},reBranch:{title:"Set branch",fieldLabel:"branch",hintNoBranches:"(no local branches \u2014 type a new name)",hintNoMatch:"(no match \u2014 enter renames to this branch)",footer:"\u2191\u2193 pick \xB7 enter set \xB7 esc cancel"},toast:en22},zh23={nav:{kanban:"\u770B\u677F",automations:"\u4F8B\u884C\u4EFB\u52A1",issues:"\u8BAE\u9898",mods:"Mods"},header:{scratch:"\u672A\u5206\u7EC4"},search:{placeholder:"\u6A21\u7CCA\u641C\u7D22"},sort:{label:"\u6392\u5E8F\uFF1A{mode}",hint:"\u5207\u6362\u6392\u5E8F\uFF08\u624B\u52A8 \u2192 \u6700\u65B0 \u2192 \u5173\u6CE8 \u2192 \u540D\u79F0\uFF09",reorderSwitched:"\u8C03\u6574\u987A\u5E8F\u9700\u624B\u52A8\u6392\u5E8F\uFF0C\u5DF2\u5207\u6362",modes:{default:"\u624B\u52A8",recent:"\u6700\u65B0",attention:"\u5173\u6CE8",name:"\u540D\u79F0"}},menu:{open:"\u6253\u5F00",collapseChildren:"\u6298\u53E0\u5B50\u4EFB\u52A1",expandChildren:"\u5C55\u5F00\u5B50\u4EFB\u52A1",newChat:"\u65B0\u5EFA\u4F1A\u8BDD",newShell:"\u65B0\u5EFA\u7EC8\u7AEF",continueEngine:"\u6362\u4E2A\u5F15\u64CE\u7EE7\u7EED\u2026",newScratchChat:"\u65B0\u5EFA\u4F1A\u8BDD\uFF08\u65E0\u6587\u4EF6\u5939\uFF09",newTask:"\u65B0\u5EFA\u4EFB\u52A1",forgetProject:"\u79FB\u9664\u9879\u76EE",fieldNotes:"\u73B0\u573A\u7B14\u8BB0",rename:"\u91CD\u547D\u540D",pin:"\u7F6E\u9876",unpin:"\u53D6\u6D88\u7F6E\u9876",reorder:"\u91CD\u65B0\u6392\u5E8F",moveToTop:"\u79FB\u5230\u9876\u90E8",reorderProject:"\u8C03\u6574\u9879\u76EE\u987A\u5E8F",runAgain:"\u91CD\u65B0\u8FD0\u884C",setStatus:"\u8BBE\u7F6E\u72B6\u6001",moveToProject:"\u79FB\u5230\u5176\u4ED6\u9879\u76EE\u2026",copyId:"\u590D\u5236\u4EFB\u52A1 ID",copyBranch:"\u590D\u5236\u5206\u652F\u540D",copyPath:"\u590D\u5236\u8DEF\u5F84",openEditor:"\u5728\u7F16\u8F91\u5668\u4E2D\u6253\u5F00",renameBranch:"\u91CD\u547D\u540D\u5206\u652F",changeEngine:"\u5207\u6362\u5F15\u64CE",fixChecks:"\u4FEE\u590D\u5931\u8D25\u7684\u68C0\u67E5",rerunChecks:"\u91CD\u65B0\u8FD0\u884C\u5931\u8D25\u7684\u68C0\u67E5",syncBase:"\u540C\u6B65\u57FA\u7840\u5206\u652F",resolveConflicts:"\u8BA9 agent \u89E3\u51B3\u51B2\u7A81",land:"\u5408\u5165\u57FA\u7840\u5206\u652F",archive:"\u5F52\u6863",unarchive:"\u53D6\u6D88\u5F52\u6863",delete:"\u79FB\u9664\u4F1A\u8BDD"},status:{backlog:"\u5F85\u529E",inProgress:"\u8FDB\u884C\u4E2D",inReview:"\u5F85\u8BC4\u5BA1",done:"\u5DF2\u5B8C\u6210",canceled:"\u5DF2\u53D6\u6D88",error:"\u51FA\u9519"},setStatus:{title:"\u8BBE\u7F6E\u72B6\u6001",current:"\u5F53\u524D",footer:"\u2191\u2193 \u9009\u62E9 \xB7 enter \u8BBE\u7F6E \xB7 esc \u53D6\u6D88"},moveToProject:{title:"\u79FB\u5230\u5176\u4ED6\u9879\u76EE",empty:"\u8FD8\u6CA1\u6709\u5176\u4ED6\u9879\u76EE\u2014\u2014\u5148\u6DFB\u52A0\u4E00\u4E2A\uFF0C\u6216\u8FD0\u884C `rove api update --project PATH`",footer:"\u2191\u2193 \u9009\u62E9 \xB7 enter \u79FB\u52A8 \xB7 esc \u53D6\u6D88"},sync:{done:"\u5DF2\u628A {base} \u5408\u5E76\u8FDB\u8BE5\u5DE5\u4F5C\u6811",alreadyCurrent:"\u5DF2\u7ECF\u548C {base} \u540C\u6B65",conflict:"\u5408\u5E76\u51B2\u7A81\u2014\u2014\u89E3\u51B3\u540E\u63D0\u4EA4\uFF1A{files}",dirty:"\u8BF7\u5148\u63D0\u4EA4\u5DE5\u4F5C\u6811\u91CC\u7684\u6539\u52A8\uFF0C\u518D\u540C\u6B65\uFF1A{files}",failed:"\u540C\u6B65\u5931\u8D25\uFF1A{error}"},archive:{done:"\u5DF2\u5F52\u6863 {title}\u3002\u5DE5\u4F5C\u6811\u3001\u5206\u652F\u548C\u4F1A\u8BDD\u90FD\u4FDD\u6301\u539F\u6837",restored:"\u5DF2\u6062\u590D {title}",busyTitle:"\u5B83\u8FD8\u5728\u5DE5\u4F5C\uFF0C\u4ECD\u8981\u5F52\u6863\uFF1F",busyBody:"{title} \u91CC\u6709\u5F15\u64CE\u4ECD\u5728\u5DE5\u4F5C\u6216\u5728\u7B49\u4F60\u3002\u5F52\u6863\u53EA\u9690\u85CF\u8FD9\u4E00\u884C\uFF0C\u4E0D\u4F1A\u505C\u6B62\u5B83\u3002",busyConfirm:"\u4ECD\u8981\u5F52\u6863",failed:"\u5F52\u6863\u5931\u8D25\uFF1A{error}",restoreFailed:"\u6062\u590D\u5931\u8D25\uFF1A{error}"},rerun:{started:"\u6B63\u5728\u91CD\u65B0\u8FD0\u884C\u5931\u8D25\u7684\u68C0\u67E5",none:"\u6CA1\u6709\u53EF\u91CD\u65B0\u8FD0\u884C\u7684\u5931\u8D25\u68C0\u67E5",external:"\u8FD9\u4E9B\u68C0\u67E5\u4E0D\u662F\u5728 GitHub Actions \u4E0A\u8FD0\u884C\u7684\uFF0C\u8BF7\u5230\u5B83\u4EEC\u8FD0\u884C\u7684\u5730\u65B9\u91CD\u65B0\u8FD0\u884C",refused:"\u65E0\u6CD5\u91CD\u65B0\u8FD0\u884C\uFF1A{detail}"},changeEngine:{title:"\u5207\u6362\u5F15\u64CE",current:"\u5F53\u524D",effortLabel:"\u63A8\u7406\u5F3A\u5EA6",noEffort:"\u5F15\u64CE\u9ED8\u8BA4",footer:{engine:"\u2191\u2193 \u5F15\u64CE",effort:"\u2190\u2192 \u5F3A\u5EA6",model:"tab \u6A21\u578B",set:"enter \u8BBE\u7F6E",cancel:"esc \u53D6\u6D88"}},engineModel:{label:"\u6A21\u578B",placeholder:"\u5F15\u64CE\u9ED8\u8BA4",loading:"\u6B63\u5728\u5217\u51FA\u6A21\u578B\u2026"},tier:{swift:"\u8F7B\u5FEB",standard:"\u6807\u51C6",deep:"\u6DF1\u5165",manual:"\u624B\u52A8"},tierDesc:{swift:"\u5C0F\u800C\u660E\u786E\u7684\u6539\u52A8\u2014\u2014\u6700\u5FEB\u3001\u6700\u7701\u7684\u4E00\u6863",standard:"\u65E5\u5E38\u7684\u529F\u80FD\u5F00\u53D1\u548C\u4FEE bug",deep:"\u96BE\u9898\uFF1A\u6839\u56E0\u4E0D\u660E\u3001\u5927\u91CD\u6784\u3001\u8BBE\u8BA1\u51B3\u7B56"},runAgain:{title:"\u91CD\u65B0\u8FD0\u884C",source:"\u6765\u81EA\u4EFB\u52A1\u300C{title}\u300D\u7684\u6307\u4EE4",hint:"\u5728\u65B0\u4EFB\u52A1\u91CC\u91CD\u65B0\u6267\u884C\u8FD9\u6BB5\u6307\u4EE4\uFF0C\u65B0\u4EFB\u52A1\u6709\u81EA\u5DF1\u7684\u5206\u652F\u548C\u5DE5\u4F5C\u6811\u3002",confirm:"\u91CD\u65B0\u8FD0\u884C",footer:"\u2191\u2193 \u6EDA\u52A8 \xB7 \u2190\u2192 \u9009\u62E9 \xB7 enter \u8FD0\u884C \xB7 esc \u53D6\u6D88"},confirm:zh21,renameBranch:{title:"\u91CD\u547D\u540D\u5206\u652F",fieldLabel:"\u5206\u652F"},fieldNotes:{title:"\u73B0\u573A\u7B14\u8BB0",empty:"\u8BE5\u4ED3\u5E93\u6682\u65E0\u73B0\u573A\u7B14\u8BB0\u2014\u2014agent \u53EF\u7528 `rove api note` \u8BB0\u5F55\u3002",loading:"\u52A0\u8F7D\u4E2D\u2026",footer:"\u2191\u2193 \u6EDA\u52A8 \xB7 esc \u5173\u95ED",footerDeletable:"\u2191\u2193 \u9009\u62E9 \xB7 d \u5220\u9664 \xB7 esc \u5173\u95ED",confirmDelete:{title:"\u5220\u9664\u8FD9\u6761\u73B0\u573A\u7B14\u8BB0?",body:"\u300C{text}\u300D\u5C06\u4E0D\u518D\u6CE8\u5165\u8BE5\u4ED3\u5E93\u7684\u65B0\u4F1A\u8BDD\u3002\u5176\u4ED6\u5185\u5BB9\u4E0D\u53D7\u5F71\u54CD\u3002"}},moveChip:" \u79FB\u52A8",recentJump:"\u6700\u8FD1:{title}",routinesRow:"{count} \u4E2A routine \u4F1A\u8BDD",routinesRowOne:"1 \u4E2A routine \u4F1A\u8BDD",archivedRow:"\u5DF2\u5F52\u6863 \xB7 {count}",machine:{connecting:"\u8FDE\u63A5\u4E2D\u2026",offline:"\u79BB\u7EBF",unsupported:"\u4E0D\u652F\u6301",mismatch:"\u534F\u8BAE\u4E0D\u517C\u5BB9",filesElsewhere:"\u5728 {host} \u4E0A",filesHint:"{host} \u6682\u65F6\u8FDE\u4E0D\u4E0A\uFF1B\u91CD\u65B0\u8FDE\u4E0A\u540E\u8FD9\u91CC\u4F1A\u518D\u663E\u793A\u5B83\u7684\u6587\u4EF6\u3002",terminalElsewhere:"\u8FD9\u4E2A\u4EFB\u52A1\u8DD1\u5728 {host} \u4E0A\uFF0C\u6682\u65F6\u8FDE\u4E0D\u4E0A\u3002",runsOn:"\u5728 {host} \u4E0A",noTabs:"{host} \u4E0A\u8FD8\u6CA1\u6709 tab\u2014\u2014\u6309 prefix t \u5728\u90A3\u91CC\u65B0\u5F00\u4E00\u4E2A\u3002"},empty:{noMatchSearch:"\u65E0\u5339\u914D\u4EFB\u52A1\u2014\u2014\u6309 esc \u6E05\u9664\u3002",noActiveProject:"\u8BE5\u9879\u76EE\u6682\u65E0\u6D3B\u8DC3\u4EFB\u52A1\u3002",noActive:"\u6682\u65E0\u6D3B\u8DC3\u4EFB\u52A1\u2014\u2014\u5728\u4E0A\u65B9\u65B0\u5EFA\u3002"},activity:{working:"\u8FD0\u884C\u4E2D",rateLimited:"\u8BF7\u6C42\u53D7\u9650",permissionNeeded:"\u7B49\u5F85\u6388\u6743",error:"\u9519\u8BEF",dead:"\u5F15\u64CE\u5DF2\u9000\u51FA"},group:{waitingOnYou:"\u7B49\u4F60\u5904\u7406",landing:"\u53EF\u4EE5\u5408\u4E86",readyForReview:"\u5F85\u4F60\u9A8C\u6536",working:"\u8FD0\u884C\u4E2D"},subtitle:{noTracking:"\u4E0D\u8DDF\u8E2A\u6D3B\u52A8",materializing:"\u6B63\u5728\u521B\u5EFA worktree",deleting:"\u6B63\u5728\u5220\u9664",deleteFailed:"\u5220\u9664\u5931\u8D25"},reBranch:{title:"\u8BBE\u7F6E\u5206\u652F",fieldLabel:"\u5206\u652F",hintNoBranches:"\uFF08\u6CA1\u6709\u672C\u5730\u5206\u652F\u2014\u2014\u8F93\u5165\u65B0\u540D\u79F0\uFF09",hintNoMatch:"\uFF08\u65E0\u5339\u914D\u2014\u2014\u56DE\u8F66\u5C06\u5206\u652F\u91CD\u547D\u540D\u4E3A\u6B64\u540D\uFF09",footer:"\u2191\u2193 \u9009\u62E9 \xB7 enter \u8BBE\u7F6E \xB7 esc \u53D6\u6D88"},toast:zh22};var en24={noTask:"(no task \u2014 press n to create)",exited:"process exited \u2014 F5 restarts it",engineExit:{title:"Engine exited",titleCode:"Engine exited (code {code})",retry:"Retry",settings:"Settings \u2192 Engines",another:"Another engine",continueIn:"Continue in another engine"},usageLimit:{title:"Usage limit reached",dismiss:"Dismiss"},restoring:"restoring session\u2026",recovery:{live:"Live process reattached",relaunched:"Command relaunched in a new process. Any restored output is historical; check the engine to resume or continue your conversation.",restored:"Historical screen restored; previous process ended. Restart and check the engine before continuing."},tab:{groupTitle:"group {n}",renameTitle:"Rename tab",renameField:"TAB TITLE",renameSubmit:"rename",chooseEngineHint:"\u2190/\u2192 or h/l choose, enter confirm, esc cancel",newChat:{title:"New conversation",engine:"ENGINE",destLabel:"DESTINATION",destTab:"child task, same directory",destFork:"fork a child task (new worktree)",destScratch:"new scratch task ($HOME)",ctxLabel:"CONTEXT",ctxFresh:"fresh conversation",ctxContinue:"continue this conversation"},cannotCloseLast:"Cannot close the only tab",tabGone:"That tab is no longer there",closeOthersTitle:"Close the other tabs?",closeOthersBody:"Closing {count} \xB7 their sessions end, this tab stays open.",closeOthersConfirm:"close tabs",closeOthersCancel:"cancel",menu:{rename:"Rename tab",copyAddress:"Copy tab address",continueEngine:"Continue in another engine\u2026",closeOthers:"Close other tabs",close:"Close tab"},nothingToFork:"No conversation in this tab to fork yet",noTranscriptToHandOff:"{engine} keeps no readable transcript to hand over"},split:{renameTitle:"Rename split",renameField:"SPLIT NAME"},scrolledBack:"\u2191 scrolled {lines}L",scrollFirst:"[first]",scrollLatest:"[latest]",unavailable:{shellMissing:"terminal unavailable \u2014 the shell named by $SHELL isn't on this machine. Point $SHELL at one that exists, or unset it to fall back to the system default.",spawnFailed:"terminal unavailable \u2014 the shell exited immediately. Its error is in ~/.rove/pty.log.",retry:"F5 tries again"},reset:{title:"Reset terminal?",body:"The running shell will be killed and a fresh one will spawn at the worktree. Any in-flight processes (vim, htop, paused jobs) end immediately."}},zh24={recovery:{live:"\u5DF2\u91CD\u65B0\u8FDE\u63A5\u4ECD\u5728\u8FD0\u884C\u7684\u8FDB\u7A0B",relaunched:"\u547D\u4EE4\u5DF2\u5728\u65B0\u8FDB\u7A0B\u4E2D\u91CD\u542F\u3002\u5982\u6709\u6062\u590D\u7684\u8F93\u51FA\uFF0C\u5B83\u5C5E\u4E8E\u5386\u53F2\u8BB0\u5F55\uFF1B\u8BF7\u5728\u5F15\u64CE\u5185\u786E\u8BA4\u4F1A\u8BDD\u6062\u590D\u6216\u7EE7\u7EED\u64CD\u4F5C\u3002",restored:"\u5DF2\u6062\u590D\u5386\u53F2\u753B\u9762\uFF1B\u539F\u8FDB\u7A0B\u5DF2\u7ED3\u675F\u3002\u8BF7\u91CD\u542F\u5E76\u786E\u8BA4\u5F15\u64CE\u72B6\u6001\u540E\u7EE7\u7EED\u3002"},noTask:"\uFF08\u65E0\u4EFB\u52A1 \u2014\u2014 \u6309 n \u521B\u5EFA\uFF09",exited:"\u8FDB\u7A0B\u5DF2\u9000\u51FA \u2014\u2014 \u6309 F5 \u91CD\u542F",engineExit:{title:"\u5F15\u64CE\u5DF2\u9000\u51FA",titleCode:"\u5F15\u64CE\u5DF2\u9000\u51FA\uFF08\u9000\u51FA\u7801 {code}\uFF09",retry:"\u91CD\u8BD5",settings:"\u8BBE\u7F6E \u2192 \u5F15\u64CE",another:"\u6362\u4E2A\u5F15\u64CE",continueIn:"\u6362\u4E2A\u5F15\u64CE\u7EE7\u7EED"},usageLimit:{title:"\u5DF2\u8FBE\u5230\u7528\u91CF\u4E0A\u9650",dismiss:"\u5FFD\u7565"},restoring:"\u6B63\u5728\u6062\u590D\u4F1A\u8BDD\u2026",tab:{groupTitle:"group {n}",renameTitle:"\u91CD\u547D\u540D\u6807\u7B7E\u9875",renameField:"\u6807\u7B7E\u9875\u540D\u79F0",renameSubmit:"\u91CD\u547D\u540D",chooseEngineHint:"\u2190/\u2192 \u6216 h/l \u9009\u62E9\uFF0Center \u786E\u8BA4\uFF0Cesc \u53D6\u6D88",newChat:{title:"\u65B0\u5EFA\u5BF9\u8BDD",engine:"\u5F15\u64CE",destLabel:"\u843D\u70B9",destTab:"\u5B50\u4EFB\u52A1\uFF0C\u540C\u4E00\u76EE\u5F55",destFork:"fork \u5B50\u4EFB\u52A1\uFF08\u65B0 worktree\uFF09",destScratch:"\u65B0\u4E34\u65F6\u4EFB\u52A1\uFF08$HOME\uFF09",ctxLabel:"\u4E0A\u4E0B\u6587",ctxFresh:"\u5168\u65B0\u5BF9\u8BDD",ctxContinue:"\u63A5\u7740\u5F53\u524D\u5BF9\u8BDD"},cannotCloseLast:"\u65E0\u6CD5\u5173\u95ED\u552F\u4E00\u7684\u6807\u7B7E\u9875",tabGone:"\u8FD9\u4E2A\u6807\u7B7E\u9875\u5DF2\u7ECF\u4E0D\u5728\u4E86",closeOthersTitle:"\u5173\u95ED\u5176\u4ED6\u6807\u7B7E\u9875\uFF1F",closeOthersBody:"\u5C06\u5173\u95ED {count} \u4E2A\uFF0C\u5B83\u4EEC\u7684\u4F1A\u8BDD\u4F1A\u7ED3\u675F\uFF0C\u53EA\u4FDD\u7559\u8FD9\u4E2A\u6807\u7B7E\u9875\u3002",closeOthersConfirm:"\u5173\u95ED\u6807\u7B7E\u9875",closeOthersCancel:"\u53D6\u6D88",menu:{rename:"\u91CD\u547D\u540D\u6807\u7B7E\u9875",copyAddress:"\u590D\u5236\u6807\u7B7E\u9875\u5730\u5740",continueEngine:"\u6362\u4E2A\u5F15\u64CE\u7EE7\u7EED\u2026",closeOthers:"\u5173\u95ED\u5176\u4ED6\u6807\u7B7E\u9875",close:"\u5173\u95ED\u6807\u7B7E\u9875"},nothingToFork:"\u8FD9\u4E2A\u6807\u7B7E\u9875\u8FD8\u6CA1\u6709\u53EF\u6D3E\u751F\u7684\u5BF9\u8BDD",noTranscriptToHandOff:"{engine} \u6CA1\u6709\u53EF\u8BFB\u7684\u5BF9\u8BDD\u8BB0\u5F55\uFF0C\u65E0\u6CD5\u4EA4\u63A5"},split:{renameTitle:"\u91CD\u547D\u540D\u5206\u5C4F",renameField:"\u5206\u5C4F\u540D\u79F0"},scrolledBack:"\u2191 \u5DF2\u56DE\u6EDA {lines} \u884C",scrollFirst:"[\u6700\u65E9]",scrollLatest:"[\u6700\u65B0]",unavailable:{shellMissing:"\u7EC8\u7AEF\u4E0D\u53EF\u7528 \u2014\u2014 $SHELL \u6307\u5411\u7684 shell \u5728\u8FD9\u53F0\u673A\u5668\u4E0A\u4E0D\u5B58\u5728\u3002\u8BF7\u628A $SHELL \u6307\u5411\u4E00\u4E2A\u771F\u5B9E\u5B58\u5728\u7684 shell\uFF0C\u6216\u53D6\u6D88\u8BBE\u7F6E\u4EE5\u56DE\u9000\u5230\u7CFB\u7EDF\u9ED8\u8BA4\u3002",spawnFailed:"\u7EC8\u7AEF\u4E0D\u53EF\u7528 \u2014\u2014 shell \u542F\u52A8\u540E\u7ACB\u5373\u9000\u51FA\u3002\u5177\u4F53\u9519\u8BEF\u89C1 ~/.rove/pty.log\u3002",retry:"\u6309 F5 \u91CD\u8BD5"},reset:{title:"\u91CD\u7F6E\u7EC8\u7AEF\uFF1F",body:"\u6B63\u5728\u8FD0\u884C\u7684 shell \u4F1A\u88AB\u6740\u6389\u5E76\u5728 worktree \u91CD\u65B0\u542F\u52A8\uFF0C\u8FDB\u884C\u4E2D\u7684\u8FDB\u7A0B\uFF08vim\u3001htop\u3001\u6682\u505C\u7684\u4EFB\u52A1\uFF09\u4F1A\u7ACB\u5373\u7ED3\u675F\u3002"}};var en25={pageTitle:"ROVE UPDATE",closeHint:"q / esc close",chip:"\u2191 {version}",current:"current",available:"v{version} available",latest:"latest",latestUnknown:"unknown \u2014 could not reach the registry",registryRetry:"Check your connection, then close and reopen Update to retry.",upToDate:"No newer release \u2014 nothing to install.",releaseUrlUnavailable:"release URL unavailable; visit github.com/Sma1lboy/rove/releases",statusReleaseOpened:"Opened release page in your browser.",statusReleaseError:"Could not open release URL. Visit github.com/Sma1lboy/rove/releases in your browser.",statusRunningUpdater:"Closing the TUI and running the updater in this terminal...",loadingNotes:"Loading release notes...",notesUnavailable:"Release notes are unavailable. Use Open release to view the GitHub release page.",changesSectionHeader:"\u2500\u2500 changes from v{from} to v{to} \u2500\u2500",updateComplete:"Rove update complete. Relaunch Rove to use the new version.",updateFailed:"Rove update failed with exit code {code}. Check the output above, then run `rove update` to retry.",pressAnyKey:"Press any key to close this update window.",actions:{updateNow:"Update now",openRelease:"Open release",close:"Close",closeDetail:"return to the workspace"},whatsNew:{title:"WHAT'S NEW",closeHint:"q / esc continue",upgraded:"You're now on Rove v{to}, up from v{from}. Here's what changed.",notesUnavailable:"Could not load the release notes \u2014 check your connection, or read them on GitHub.",sourceHint:"release notes: {url}"},skew:{title:"\u26A0 DAEMON OUT OF DATE",olderBuild:"an older build",hint:"daemon is {daemon} \u2014 you launched v{clientVersion}. Press {keys} to refresh Rove onto the installed build",hintNoKey:"daemon is {daemon} \u2014 you launched v{clientVersion}. Run `rove daemon restart`, then relaunch Rove"},refresh:{confirmTitle:"Refresh Rove?",confirmBody:"Rove restarts the daemon and relaunches itself on the installed build. Running engine sessions live in the PTY host and keep going; open tabs come back.",confirmLabel:"Refresh",relaunching:"rove: restarting on the installed build...",alreadyCurrent:"Rove and the daemon already run the same build \u2014 nothing to refresh.",installGone:"This Rove was installed from a directory that no longer exists, so it cannot relaunch itself. Reinstall with `npm install -g @sma1lboy/rove`."},staleInstall:{title:"\u2715 ROVE INSTALL IS GONE",hint:"this Rove is running from an install that no longer exists on disk, so it cannot start a daemon. Reinstall (`npm install -g @sma1lboy/rove`) and relaunch Rove"},versions:{pageTitle:"ROVE VERSIONS",loading:"Loading releases...",unavailable:"Could not fetch releases. Check your connection or wait for the rate limit, then reopen this page.",tagCurrent:"current",tagLatest:"latest",tagBreaking:"breaking",breakingWarning:"\u26A0 installing this crosses breaking version(s) {versions}. Rove will refuse to start until you run `rove reset`, which stops the daemon, the PTY host, and every live session. Tasks and worktrees are kept.",footerHint:"j/k select \xB7 enter install \xB7 q close",closeHint:"q / esc close"}},zh25={pageTitle:"ROVE \u66F4\u65B0",closeHint:"q / esc \u5173\u95ED",chip:"\u2191 {version}",current:"\u5F53\u524D",available:"\u6709\u65B0\u7248\u672C v{version}",latest:"\u6700\u65B0",latestUnknown:"\u672A\u77E5 \u2014\u2014 \u65E0\u6CD5\u8FDE\u63A5\u5230 registry",registryRetry:"\u8BF7\u68C0\u67E5\u7F51\u7EDC\uFF0C\u7136\u540E\u5173\u95ED\u5E76\u91CD\u65B0\u6253\u5F00\u66F4\u65B0\u9875\u91CD\u8BD5\u3002",upToDate:"\u6CA1\u6709\u66F4\u65B0\u7684\u7248\u672C \u2014\u2014 \u65E0\u9700\u5B89\u88C5\u3002",releaseUrlUnavailable:"\u53D1\u5E03\u94FE\u63A5\u4E0D\u53EF\u7528\uFF1B\u8BF7\u8BBF\u95EE github.com/Sma1lboy/rove/releases",statusReleaseOpened:"\u5DF2\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u53D1\u5E03\u8BF4\u660E\u9875\u9762\u3002",statusReleaseError:"\u65E0\u6CD5\u6253\u5F00\u53D1\u5E03\u94FE\u63A5\u3002\u8BF7\u5728\u6D4F\u89C8\u5668\u8BBF\u95EE github.com/Sma1lboy/rove/releases\u3002",statusRunningUpdater:"\u6B63\u5728\u5173\u95ED TUI\uFF0C\u5E76\u5728\u5F53\u524D\u7EC8\u7AEF\u4E2D\u8FD0\u884C\u66F4\u65B0\u7A0B\u5E8F\u2026\u2026",loadingNotes:"\u6B63\u5728\u52A0\u8F7D\u53D1\u5E03\u8BF4\u660E\u2026\u2026",notesUnavailable:"\u53D1\u5E03\u8BF4\u660E\u4E0D\u53EF\u7528\u3002\u8BF7\u4F7F\u7528\u300C\u6253\u5F00\u53D1\u5E03\u9875\u300D\u67E5\u770B GitHub \u53D1\u5E03\u9875\u9762\u3002",changesSectionHeader:"\u2500\u2500 v{from} \u81F3 v{to} \u7684\u53D8\u66F4 \u2500\u2500",updateComplete:"Rove \u66F4\u65B0\u5B8C\u6210\u3002\u8BF7\u91CD\u65B0\u542F\u52A8 Rove \u4EE5\u4F7F\u7528\u65B0\u7248\u672C\u3002",updateFailed:"Rove \u66F4\u65B0\u5931\u8D25\uFF0C\u9000\u51FA\u7801\u4E3A {code}\u3002\u8BF7\u68C0\u67E5\u4E0A\u65B9\u8F93\u51FA\uFF0C\u518D\u8FD0\u884C `rove update` \u91CD\u8BD5\u3002",pressAnyKey:"\u6309\u4EFB\u610F\u952E\u5173\u95ED\u6B64\u66F4\u65B0\u7A97\u53E3\u3002",actions:{updateNow:"\u7ACB\u5373\u66F4\u65B0",openRelease:"\u6253\u5F00\u53D1\u5E03\u9875",close:"\u5173\u95ED",closeDetail:"\u8FD4\u56DE\u5DE5\u4F5C\u533A"},whatsNew:{title:"\u66F4\u65B0\u5185\u5BB9",closeHint:"q / esc \u7EE7\u7EED",upgraded:"Rove \u5DF2\u4ECE v{from} \u66F4\u65B0\u5230 v{to}\uFF0C\u672C\u6B21\u53D8\u66F4\u5982\u4E0B\u3002",notesUnavailable:"\u65E0\u6CD5\u52A0\u8F7D\u53D1\u5E03\u8BF4\u660E \u2014\u2014 \u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\uFF0C\u6216\u5230 GitHub \u4E0A\u67E5\u770B\u3002",sourceHint:"\u53D1\u5E03\u8BF4\u660E\uFF1A{url}"},skew:{title:"\u26A0 DAEMON \u7248\u672C\u4E0D\u4E00\u81F4",olderBuild:"\u65E7\u7248\u672C\u6784\u5EFA",hint:"daemon \u8FD0\u884C\u7684\u662F {daemon}\uFF0C\u800C\u4F60\u542F\u52A8\u7684\u662F v{clientVersion}\u3002\u6309 {keys} \u53EF\u8BA9 Rove \u5237\u65B0\u5230\u5DF2\u5B89\u88C5\u7684\u7248\u672C",hintNoKey:"daemon \u8FD0\u884C\u7684\u662F {daemon}\uFF0C\u800C\u4F60\u542F\u52A8\u7684\u662F v{clientVersion}\u3002\u8BF7\u8FD0\u884C `rove daemon restart`\uFF0C\u7136\u540E\u91CD\u65B0\u542F\u52A8 Rove"},refresh:{confirmTitle:"\u5237\u65B0 Rove\uFF1F",confirmBody:"Rove \u4F1A\u91CD\u542F daemon\uFF0C\u5E76\u4EE5\u5DF2\u5B89\u88C5\u7684\u7248\u672C\u91CD\u65B0\u542F\u52A8\u81EA\u8EAB\u3002\u6B63\u5728\u8FD0\u884C\u7684\u5F15\u64CE\u4F1A\u8BDD\u7531 PTY host \u6258\u7BA1\uFF0C\u4E0D\u4F1A\u4E2D\u65AD\uFF1B\u5DF2\u6253\u5F00\u7684\u6807\u7B7E\u9875\u4F1A\u6062\u590D\u3002",confirmLabel:"\u5237\u65B0",relaunching:"rove\uFF1A\u6B63\u5728\u4EE5\u5DF2\u5B89\u88C5\u7684\u7248\u672C\u91CD\u65B0\u542F\u52A8\u2026\u2026",alreadyCurrent:"Rove \u4E0E daemon \u5DF2\u7ECF\u662F\u540C\u4E00\u4E2A\u7248\u672C \u2014\u2014 \u65E0\u9700\u5237\u65B0\u3002",installGone:"\u5F53\u524D Rove \u7684\u5B89\u88C5\u76EE\u5F55\u5DF2\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u91CD\u65B0\u542F\u52A8\u81EA\u8EAB\u3002\u8BF7\u8FD0\u884C `npm install -g @sma1lboy/rove` \u91CD\u65B0\u5B89\u88C5\u3002"},staleInstall:{title:"\u2715 ROVE \u5B89\u88C5\u5DF2\u4E0D\u5B58\u5728",hint:"\u5F53\u524D Rove \u8FD0\u884C\u81EA\u4E00\u4EFD\u5DF2\u4ECE\u78C1\u76D8\u5220\u9664\u7684\u5B89\u88C5\uFF0C\u56E0\u6B64\u65E0\u6CD5\u542F\u52A8 daemon\u3002\u8BF7\u91CD\u65B0\u5B89\u88C5\uFF08`npm install -g @sma1lboy/rove`\uFF09\u5E76\u91CD\u65B0\u542F\u52A8 Rove"},versions:{pageTitle:"ROVE \u7248\u672C\u5217\u8868",loading:"\u6B63\u5728\u52A0\u8F7D\u53D1\u5E03\u5217\u8868\u2026\u2026",unavailable:"\u65E0\u6CD5\u83B7\u53D6\u53D1\u5E03\u5217\u8868\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u7B49\u5F85\u9650\u6D41\u89E3\u9664\uFF0C\u7136\u540E\u91CD\u65B0\u6253\u5F00\u672C\u9875\u3002",tagCurrent:"\u5F53\u524D",tagLatest:"\u6700\u65B0",tagBreaking:"breaking",breakingWarning:"\u26A0 \u5B89\u88C5\u8BE5\u7248\u672C\u4F1A\u8DE8\u8FC7 breaking \u7248\u672C {versions}\u3002\u66F4\u65B0\u540E Rove \u4F1A\u62D2\u7EDD\u542F\u52A8\uFF0C\u76F4\u5230\u4F60\u8FD0\u884C `rove reset`\u2014\u2014\u5B83\u4F1A\u505C\u6389 daemon\u3001PTY host \u548C\u6240\u6709\u6D3B\u52A8\u4F1A\u8BDD\u3002\u4EFB\u52A1\u548C worktree \u4F1A\u4FDD\u7559\u3002",footerHint:"j/k \u9009\u62E9 \xB7 enter \u5B89\u88C5 \xB7 q \u5173\u95ED",closeHint:"q / esc \u5173\u95ED"}};var en26={title:"ISSUES",noRepo:"no project",empty:"No open issues.",assignedFilter:"assigned to me",starting:"Starting work on #{number}\u2026",startedNoEngine:"Created {title}, but its engine did not start.",linkedChip:"\u2192 {title}",openingLinked:"Opening {title}\u2026",startFailed:"Couldn't start work on #{number}: {error}",errorHint:{noRemote:"Add a GitHub remote (`git remote add origin <url>`) and try again, or press q / esc to close.",ghMissing:"Install the `gh` CLI and authenticate, or press q / esc to close.",auth:"Run `gh auth login`, or press q / esc to close.",fallback:"{message} \xB7 press q / esc to close"}},zh26={title:"\u8BAE\u9898",noRepo:"\u65E0\u9879\u76EE",empty:"\u6CA1\u6709\u5F00\u653E\u7684\u8BAE\u9898\u3002",assignedFilter:"\u5206\u914D\u7ED9\u6211\u7684",starting:"\u6B63\u5728\u5F00\u59CB\u5904\u7406 #{number}\u2026",startedNoEngine:"\u5DF2\u521B\u5EFA {title}\uFF0C\u4F46\u5F15\u64CE\u6CA1\u6709\u542F\u52A8\u3002",linkedChip:"\u2192 {title}",openingLinked:"\u6B63\u5728\u6253\u5F00 {title}\u2026",startFailed:"\u5F00\u59CB\u5904\u7406 #{number} \u5931\u8D25\uFF1A{error}",errorHint:{noRemote:"\u6DFB\u52A0 GitHub remote\uFF08`git remote add origin <url>`\uFF09\u540E\u91CD\u8BD5\uFF0C\u6216\u6309 q / esc \u5173\u95ED\u3002",ghMissing:"\u5B89\u88C5 `gh` CLI \u5E76\u767B\u5F55\uFF0C\u6216\u6309 q / esc \u5173\u95ED\u3002",auth:"\u6267\u884C `gh auth login`\uFF0C\u6216\u6309 q / esc \u5173\u95ED\u3002",fallback:"{message} \xB7 \u6309 q / esc \u5173\u95ED"}};var en27={quit:{confirmTitle:"Quit Rove?",confirmBody:"The daemon and task sessions keep running. This closes only the native workspace.",confirmLabel:"Quit"},narrowBack:"Tasks",empty:{selectTask:"Select a task with a worktree",noSessions:"No sessions here \u2014 press \u23CE to start {engine}, or ctrl+e to pick another",noSessionsShell:"No sessions here \u2014 press \u23CE to start a shell, or ctrl+e to pick another",remoteUnsupported:"Hosted engine launch over SSH is not implemented \u2014 this task's worktree is on {host}"},welcome:{title:"Welcome to Rove",tagline:"Run several AI coding sessions side by side \u2014 use managed tasks for isolated worktrees.",worktreeExplain:"Managed tasks create isolated worktrees and branches. Directory and project tasks reuse existing files; tabs within a task share its directory.",stepNew:"creates your first task \u2014 pick a repo, a base branch, an engine",stepHelp:"shows every shortcut reachable from the current focus",stepPrefix:"opens the command menu",enginesFound:"\u2713 engines: {list}",enginesSignedOut:"\u2717 installed but not signed in: {list} \u2014 run one of them in a shell and log in",enginesMissing:"\u2717 no engine CLI found \u2014 install claude, codex, copilot, or kimi, then restart Rove",gitMissing:"\u2717 git not found on PATH \u2014 Rove needs git to create worktrees",doctorHint:"run `rove doctor` in a shell for the full diagnosis",docsHint:"docs: https://docs.rove.run"},attention:{none:"No available Inbox items"},inbox:{title:"INBOX",empty:"No pending attention",openHint:"enter open",clearHint:"d ack",clearAllHint:"D ack all",more:"+{count} more",section:{attention:"ATTENTION",recent:"RECENT"},state:{done:"done",needsInput:"needs input",error:"error",rateLimited:"rate limited",running:"running",dead:"engine exited",routineFailed:"routine needs you",reportMissing:"report missing",decisionNeeded:"decision needed",gateAnswered:"answered \xB7 engine not running"},resumesAt:"resumes {time}"}},zh27={quit:{confirmTitle:"\u9000\u51FA Rove\uFF1F",confirmBody:"\u5B88\u62A4\u8FDB\u7A0B\u548C\u4EFB\u52A1\u4F1A\u8BDD\u4F1A\u7EE7\u7EED\u8FD0\u884C\uFF0C\u8FD9\u91CC\u53EA\u5173\u95ED\u539F\u751F\u5DE5\u4F5C\u533A\u3002",confirmLabel:"\u9000\u51FA"},narrowBack:"\u4EFB\u52A1",empty:{selectTask:"\u8BF7\u9009\u62E9\u4E00\u4E2A\u5E26 worktree \u7684\u4EFB\u52A1",noSessions:"\u8FD9\u91CC\u6CA1\u6709\u4F1A\u8BDD\u2014\u2014\u6309 \u23CE \u542F\u52A8 {engine}\uFF0C\u6216\u6309 ctrl+e \u53E6\u9009\u4E00\u4E2A",noSessionsShell:"\u8FD9\u91CC\u6CA1\u6709\u4F1A\u8BDD\u2014\u2014\u6309 \u23CE \u542F\u52A8 shell\uFF0C\u6216\u6309 ctrl+e \u53E6\u9009\u4E00\u4E2A",remoteUnsupported:"\u5C1A\u672A\u5B9E\u73B0\u901A\u8FC7 SSH \u542F\u52A8\u6258\u7BA1\u5F15\u64CE\u2014\u2014\u8BE5\u4EFB\u52A1\u7684 worktree \u5728 {host} \u4E0A"},welcome:{title:"\u6B22\u8FCE\u4F7F\u7528 Rove",tagline:"\u5E76\u884C\u8FD0\u884C\u591A\u4E2A AI \u7F16\u7801\u4F1A\u8BDD\u2014\u2014\u4F7F\u7528\u6258\u7BA1\u4EFB\u52A1\u83B7\u5F97\u72EC\u7ACB\u7684 worktree\u3002",worktreeExplain:"\u6258\u7BA1\u4EFB\u52A1\u521B\u5EFA\u72EC\u7ACB\u7684 worktree \u548C\u5206\u652F\u3002\u76EE\u5F55\u4E0E\u9879\u76EE\u4EFB\u52A1\u590D\u7528\u73B0\u6709\u6587\u4EF6\uFF1B\u540C\u4E00\u4EFB\u52A1\u5185\u7684\u6807\u7B7E\u9875\u5171\u4EAB\u76EE\u5F55\u3002",stepNew:"\u521B\u5EFA\u4F60\u7684\u7B2C\u4E00\u4E2A\u4EFB\u52A1\u2014\u2014\u9009\u4ED3\u5E93\u3001\u57FA\u7840\u5206\u652F\u548C\u5F15\u64CE",stepHelp:"\u67E5\u770B\u5F53\u524D\u7126\u70B9\u4E0B\u7684\u5168\u90E8\u5FEB\u6377\u952E",stepPrefix:"\u6253\u5F00\u547D\u4EE4\u83DC\u5355",enginesFound:"\u2713 \u5DF2\u68C0\u6D4B\u5230\u5F15\u64CE:{list}",enginesSignedOut:"\u2717 \u5DF2\u5B89\u88C5\u4F46\u672A\u767B\u5F55:{list}\u2014\u2014\u8BF7\u5728 shell \u91CC\u8FD0\u884C\u5176\u4E2D\u4E4B\u4E00\u5E76\u5B8C\u6210\u767B\u5F55",enginesMissing:"\u2717 \u672A\u627E\u5230\u5F15\u64CE CLI\u2014\u2014\u8BF7\u5B89\u88C5 claude\u3001codex\u3001copilot \u6216 kimi \u540E\u91CD\u542F Rove",gitMissing:"\u2717 PATH \u4E0A\u6CA1\u6709 git\u2014\u2014Rove \u9700\u8981 git \u6765\u521B\u5EFA worktree",doctorHint:"\u5728 shell \u91CC\u8FD0\u884C `rove doctor` \u67E5\u770B\u5B8C\u6574\u8BCA\u65AD",docsHint:"\u6587\u6863:https://docs.rove.run"},attention:{none:"\u6536\u4EF6\u7BB1\u4E2D\u6CA1\u6709\u53EF\u6253\u5F00\u7684\u9879\u76EE"},inbox:{title:"\u6536\u4EF6\u7BB1",empty:"\u6682\u65E0\u5F85\u5904\u7406",openHint:"enter \u6253\u5F00",clearHint:"d \u5DF2\u9605",clearAllHint:"D \u5168\u90E8\u5DF2\u9605",more:"\u8FD8\u6709 {count} \u6761",section:{attention:"\u5F85\u5904\u7406",recent:"\u6700\u8FD1\u4F7F\u7528"},state:{done:"\u5B8C\u6210",needsInput:"\u9700\u8981\u8F93\u5165",error:"\u51FA\u9519",rateLimited:"\u9650\u6D41",running:"\u8FDB\u884C\u4E2D",dead:"\u5F15\u64CE\u5DF2\u9000\u51FA",routineFailed:"\u4F8B\u884C\u4EFB\u52A1\u9700\u8981\u5904\u7406",reportMissing:"\u672A\u56DE\u62A5",decisionNeeded:"\u7B49\u4F60\u51B3\u5B9A",gateAnswered:"\u5DF2\u56DE\u7B54 \xB7 \u5F15\u64CE\u672A\u8FD0\u884C"},resumesAt:"{time} \u6062\u590D"}};var en28={title:"Worktrees",loading:"Loading worktrees\u2026",noProjects:"No local projects known to Rove yet.",noWorktrees:"No worktrees.",badge:{roveManaged:"rove",dirty:"dirty",dirtyUnknown:"dirty?",remoteOn:"on remote",remoteOff:"not pushed",remoteUnknown:"remote unknown"},verdict:{prOpen:"PR open",prMerged:"merged (PR)",inMain:"in main",prClosed:"PR closed",idle:"stale"},row:{detached:"(detached)",created:"created {age} ago"},delete:{button:"Delete",confirmTitle:"Delete worktree?",confirmBody:'Delete the worktree for "{branch}"? This removes the working directory; the branch itself is kept.',forceTitle:"Force delete worktree?",forceBody:'"{branch}" has uncommitted, untracked, or gitignored work. Force delete removes the worktree, but the work is snapshotted first to a salvage ref \u2014 list them with `git for-each-ref refs/rove/salvage`. Force delete anyway?',forceReason:"Refused because: {reason}",failed:"Failed to delete worktree: {error}",residue:"Git deregistered the worktree, but couldn't delete {path} ({reason}). Rove is done with it \u2014 retrying won't help; delete the directory by hand if you want the space."},land:{button:"Land",confirmTitle:"Land branch?",confirmBody:'Merge "{branch}" into {landedOn} ({commits} commits), then remove this worktree? The branch is kept. Conflicts abort with a file list.',confirmBodyOne:'Merge "{branch}" into {landedOn} (1 commit), then remove this worktree? The branch is kept. Conflicts abort with a file list.',noTask:"This worktree isn't tracked as a Rove task \u2014 nothing to land.",conflict:"Land hit conflicts (merge aborted). Resolve by hand: {files}",dirtyBase:"The base checkout has uncommitted changes \u2014 commit them, then land. Never `git stash` here: the stash stack lives in the repo's common dir and is shared by every linked worktree, so a stash can entangle other tasks' work.",failed:"Land failed: {error}",done:'Landed "{branch}" onto {landedOn} ({commit}).',worktreeKept:"Landed, but the worktree was kept: {reason}",worktreePathStale:"Landed and removed the worktree, but the task still points at it: {reason}",worktreeResidue:"Landed. Git deregistered the worktree, but couldn't delete {path} ({reason}) \u2014 delete the directory by hand if you want the space."},hint:{}},zh28={title:"\u5DE5\u4F5C\u6811",loading:"\u6B63\u5728\u52A0\u8F7D worktree\u2026",noProjects:"Rove \u8FD8\u6CA1\u6709\u5DF2\u77E5\u7684\u672C\u5730\u9879\u76EE\u3002",noWorktrees:"\u6CA1\u6709 worktree\u3002",badge:{roveManaged:"rove",dirty:"\u6709\u6539\u52A8",dirtyUnknown:"\u6539\u52A8\u672A\u77E5",remoteOn:"\u5DF2\u63A8\u9001",remoteOff:"\u672A\u63A8\u9001",remoteUnknown:"\u8FDC\u7AEF\u672A\u77E5"},verdict:{prOpen:"PR \u8BC4\u5BA1\u4E2D",prMerged:"\u5DF2\u5408\u5165 (PR)",inMain:"\u5DF2\u5728\u4E3B\u5206\u652F",prClosed:"PR \u5DF2\u5173\u95ED",idle:"\u9648\u65E7"},row:{detached:"(\u6E38\u79BB\u72B6\u6001)",created:"{age}\u524D\u521B\u5EFA"},delete:{button:"\u5220\u9664",confirmTitle:"\u5220\u9664 worktree\uFF1F",confirmBody:'\u786E\u5B9A\u5220\u9664 "{branch}" \u5BF9\u5E94\u7684 worktree\uFF1F\u5DE5\u4F5C\u76EE\u5F55\u4F1A\u88AB\u79FB\u9664\uFF0C\u5206\u652F\u672C\u8EAB\u4F1A\u4FDD\u7559\u3002',forceTitle:"\u5F3A\u5236\u5220\u9664 worktree\uFF1F",forceBody:'"{branch}" \u5B58\u5728\u672A\u63D0\u4EA4\u3001\u672A\u8DDF\u8E2A\u6216\u88AB gitignore \u7684\u6539\u52A8\u3002\u5F3A\u5236\u5220\u9664\u4F1A\u79FB\u9664 worktree\uFF0C\u4F46\u8FD9\u4E9B\u6539\u52A8\u4F1A\u5148\u88AB\u5FEB\u7167\u5230\u4E00\u4E2A salvage ref\u2014\u2014\u7528 `git for-each-ref refs/rove/salvage` \u53EF\u4EE5\u5217\u51FA\u5B83\u4EEC\u3002\u4ECD\u8981\u5F3A\u5236\u5220\u9664\u5417\uFF1F',forceReason:"\u62D2\u7EDD\u539F\u56E0\uFF1A{reason}",failed:"\u5220\u9664 worktree \u5931\u8D25\uFF1A{error}",residue:"Git \u5DF2\u6CE8\u9500\u8BE5 worktree\uFF0C\u4F46\u6CA1\u80FD\u5220\u6389 {path}\uFF08{reason}\uFF09\u3002Rove \u8FD9\u8FB9\u5DF2\u7ECF\u5904\u7406\u5B8C\u4E86\u2014\u2014\u91CD\u8BD5\u6CA1\u6709\u7528\uFF1B\u60F3\u8981\u56DE\u78C1\u76D8\u7A7A\u95F4\u8BF7\u624B\u52A8\u5220\u9664\u8BE5\u76EE\u5F55\u3002"},land:{button:"\u5408\u5165",confirmTitle:"\u5408\u5165\u5206\u652F\uFF1F",confirmBody:'\u628A "{branch}" \u5408\u5165 {landedOn}\uFF08{commits} \u4E2A\u63D0\u4EA4\uFF09\uFF0C\u7136\u540E\u79FB\u9664\u8FD9\u4E2A worktree\uFF1F\u5206\u652F\u4F1A\u4FDD\u7559\u3002\u51B2\u7A81\u4F1A\u4E2D\u6B62\u5E76\u7ED9\u51FA\u6587\u4EF6\u6E05\u5355\u3002',confirmBodyOne:'\u628A "{branch}" \u5408\u5165 {landedOn}\uFF081 \u4E2A\u63D0\u4EA4\uFF09\uFF0C\u7136\u540E\u79FB\u9664\u8FD9\u4E2A worktree\uFF1F\u5206\u652F\u4F1A\u4FDD\u7559\u3002\u51B2\u7A81\u4F1A\u4E2D\u6B62\u5E76\u7ED9\u51FA\u6587\u4EF6\u6E05\u5355\u3002',noTask:"\u8BE5 worktree \u672A\u4F5C\u4E3A Rove \u4EFB\u52A1\u88AB\u8DDF\u8E2A\u2014\u2014\u6CA1\u6709\u53EF\u5408\u5165\u7684\u5BF9\u8C61\u3002",conflict:"\u5408\u5165\u9047\u5230\u51B2\u7A81\uFF08\u5DF2\u4E2D\u6B62\uFF09\u3002\u8BF7\u624B\u52A8\u89E3\u51B3\uFF1A{files}",dirtyBase:"\u57FA\u7840\u68C0\u51FA\u6709\u672A\u63D0\u4EA4\u6539\u52A8\u2014\u2014\u8BF7\u5148\u63D0\u4EA4\u518D\u5408\u5165\u3002\u7EDD\u4E0D\u8981\u5728\u8FD9\u91CC `git stash`\uFF1Astash \u6808\u5B58\u653E\u5728\u4ED3\u5E93\u7684 common dir \u4E2D\uFF0C\u8BE5\u4ED3\u5E93\u6240\u6709 linked worktree \u5171\u4EAB\uFF0C\u4E00\u6B21 stash \u53EF\u80FD\u7EA0\u7F20\u5176\u4ED6\u4EFB\u52A1\u7684\u5DE5\u4F5C\u3002",failed:"\u5408\u5165\u5931\u8D25\uFF1A{error}",done:'\u5DF2\u628A "{branch}" \u5408\u5165 {landedOn}\uFF08{commit}\uFF09\u3002',worktreeKept:"\u5DF2\u5408\u5165\uFF0C\u4F46 worktree \u4FDD\u7559\u4E86\uFF1A{reason}",worktreePathStale:"\u5DF2\u5408\u5165\u5E76\u79FB\u9664 worktree\uFF0C\u4F46\u4EFB\u52A1\u4ECD\u6307\u5411\u5B83\uFF1A{reason}",worktreeResidue:"\u5DF2\u5408\u5165\u3002Git \u5DF2\u6CE8\u9500\u8BE5 worktree\uFF0C\u4F46\u6CA1\u80FD\u5220\u6389 {path}\uFF08{reason}\uFF09\u2014\u2014\u60F3\u8981\u56DE\u78C1\u76D8\u7A7A\u95F4\u8BF7\u624B\u52A8\u5220\u9664\u8BE5\u76EE\u5F55\u3002"},hint:{}};var en29={settings:en20,tasks:en23,terminal:en24,files:en4,newTask:en11,onboarding:en12,ops:en13,update:en25,quickTask:en14,help:en6,hints:en7,common:en2,keys:en9,workspace:en27,worktrees:en28,kanban:en8,automations:en,workItems:en26,gates:en5,doctor:en3,mods:en10,search:en15},zh29={settings:zh20,tasks:zh23,terminal:zh24,files:zh4,newTask:zh11,onboarding:zh12,ops:zh13,update:zh25,quickTask:zh14,help:zh6,hints:zh7,common:zh2,keys:zh9,workspace:zh27,worktrees:zh28,kanban:zh8,automations:zh,workItems:zh26,gates:zh5,doctor:zh3,mods:zh10,search:zh15},LOCALES=[{id:"en",label:"English",intl:"en-US"},{id:"zh",label:"\u4E2D\u6587",intl:"zh-CN"}],CATALOGS={en:en29,zh:zh29},DEFAULT_LOCALE="en";function isLocaleId(value){return typeof value==="string"&&LOCALES.some((l)=>l.id===value)}
6
+ {hint}`},...zh17};var en21={cancel:"cancel",forgetProjectTitle:'Remove project "{title}"?',forgetProjectBody:"Forgets it from the projects list. The repo, its branches, worktrees, and any tasks under it stay on disk \u2014 re-add it with `rove add`.",forgetProjectConfirm:"remove",deleteTitle:'Remove session "{title}"?',deleteTitleDir:'Remove session "{title}"?',deleteBodyDir:"Ends this session and closes all its tabs. Nothing on disk changes: the folder and its files stay.",deleteBodyMain:"Ends this session and closes all its tabs. The project stays in your list and nothing on disk changes: the repo, its branches and worktrees stay.",deleteBodyTask:"Ends this session, closes all its tabs and removes its worktree folder. The git branch stays.",deleteBodyTaskBranch:"Ends this session, closes all its tabs and removes its worktree folder, and its git branch if it is merged. An unmerged branch stays.",deleteConfirm:"remove",childrenTitle:'"{title}" has {count} child tasks',childrenBody:"Promote moves them up one level and keeps their worktrees and sessions. Remove with children removes them too.",childrenPromote:"promote children",childrenCascade:"remove with children",childrenBodyMain:"Ends this session and closes its tabs; nothing on disk changes. Its child tasks keep running unless you delete them too.",childrenKeepMain:"remove session",childrenCascadeMain:"remove with children",forceDeleteTitle:'"{title}" has uncommitted changes',forceDeleteConfirm:"force remove"},zh21={cancel:"\u53D6\u6D88",forgetProjectTitle:"\u4ECE\u5217\u8868\u4E2D\u79FB\u9664\u9879\u76EE\u300C{title}\u300D\uFF1F",forgetProjectBody:"\u53EA\u662F\u628A\u5B83\u4ECE\u9879\u76EE\u5217\u8868\u91CC\u5FD8\u6389\u3002\u4ED3\u5E93\u3001\u5206\u652F\u3001worktree \u4EE5\u53CA\u5B83\u4E0B\u9762\u7684\u4EFB\u52A1\u90FD\u4F1A\u7559\u5728\u78C1\u76D8\u4E0A\u2014\u2014\u4E4B\u540E\u53EF\u4EE5\u7528 `rove add` \u91CD\u65B0\u52A0\u56DE\u6765\u3002",forgetProjectConfirm:"\u79FB\u9664",deleteTitle:"\u79FB\u9664\u4F1A\u8BDD\u300C{title}\u300D\uFF1F",deleteTitleDir:"\u79FB\u9664\u4F1A\u8BDD\u300C{title}\u300D\uFF1F",deleteBodyDir:"\u7ED3\u675F\u8FD9\u4E2A\u4F1A\u8BDD\uFF0C\u5173\u95ED\u5B83\u7684\u6240\u6709\u6807\u7B7E\u9875\u3002\u78C1\u76D8\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u52A8\uFF1A\u6587\u4EF6\u5939\u548C\u91CC\u9762\u7684\u6587\u4EF6\u90FD\u4F1A\u4FDD\u7559\u3002",deleteBodyMain:"\u7ED3\u675F\u8FD9\u4E2A\u4F1A\u8BDD\uFF0C\u5173\u95ED\u5B83\u7684\u6240\u6709\u6807\u7B7E\u9875\u3002\u9879\u76EE\u4ECD\u7559\u5728\u5217\u8868\u91CC\uFF0C\u78C1\u76D8\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u52A8\uFF1A\u4ED3\u5E93\u3001\u5206\u652F\u548C worktree \u90FD\u4F1A\u4FDD\u7559\u3002",deleteBodyTask:"\u7ED3\u675F\u8FD9\u4E2A\u4F1A\u8BDD\uFF0C\u5173\u95ED\u5B83\u7684\u6240\u6709\u6807\u7B7E\u9875\uFF0C\u5E76\u5220\u9664\u5B83\u7684 worktree \u6587\u4EF6\u5939\u3002git \u5206\u652F\u4F1A\u4FDD\u7559\u3002",deleteBodyTaskBranch:"\u7ED3\u675F\u8FD9\u4E2A\u4F1A\u8BDD\uFF0C\u5173\u95ED\u5B83\u7684\u6240\u6709\u6807\u7B7E\u9875\uFF0C\u5220\u9664\u5B83\u7684 worktree \u6587\u4EF6\u5939\uFF0C\u4EE5\u53CA\u5DF2\u5408\u5E76\u7684 git \u5206\u652F\u3002\u672A\u5408\u5E76\u7684\u5206\u652F\u4F1A\u4FDD\u7559\u3002",deleteConfirm:"\u79FB\u9664",childrenTitle:"\u300C{title}\u300D\u6709 {count} \u4E2A\u5B50\u4EFB\u52A1",childrenBody:"\u63D0\u5347\u4F1A\u628A\u5B83\u4EEC\u4E0A\u79FB\u4E00\u7EA7\uFF0C\u5E76\u4FDD\u7559\u5B83\u4EEC\u7684 worktree \u548C\u4F1A\u8BDD\u3002\u8FDE\u540C\u5B50\u4EFB\u52A1\u79FB\u9664\u4F1A\u628A\u5B83\u4EEC\u4E00\u5E76\u79FB\u9664\u3002",childrenPromote:"\u63D0\u5347\u5B50\u4EFB\u52A1",childrenCascade:"\u8FDE\u540C\u5B50\u4EFB\u52A1\u79FB\u9664",childrenBodyMain:"\u7ED3\u675F\u8FD9\u4E2A\u4F1A\u8BDD\u5E76\u5173\u95ED\u5B83\u7684\u6807\u7B7E\u9875\uFF0C\u78C1\u76D8\u4E0A\u4EC0\u4E48\u90FD\u4E0D\u52A8\u3002\u5B83\u7684\u5B50\u4EFB\u52A1\u4F1A\u7EE7\u7EED\u8FD0\u884C\uFF0C\u9664\u975E\u4F60\u4E5F\u9009\u62E9\u628A\u5B83\u4EEC\u4E00\u5E76\u5220\u9664\u3002",childrenKeepMain:"\u79FB\u9664\u4F1A\u8BDD",childrenCascadeMain:"\u8FDE\u540C\u5B50\u4EFB\u52A1\u79FB\u9664",forceDeleteTitle:"\u300C{title}\u300D\u6709\u672A\u63D0\u4EA4\u7684\u6539\u52A8",forceDeleteConfirm:"\u5F3A\u5236\u79FB\u9664"};var en22={noDaemonWorktree:"No daemon running \u2014 can't create the worktree. Start it with `rove daemon restart`.",noEditor:"No editor found \u2014 set ROVE_OPEN_EDITOR (e.g. 'code', 'cursor', 'nvim')",openWorktreeFailed:"Couldn't open worktree with {label}",worktreeErrorDeleting:"This task is being deleted \u2014 it can't be opened",worktreeErrorNotGit:"This project isn't a git repo yet \u2014 a task needs a git branch. Run `git init` (+ a first commit) in the project, then open the task. Non-git support is coming.",worktreeErrorGeneric:"Couldn't create the worktree: {message}",scratchAdopted:"Adopted into {repo} \u2014 save it as a project from New Task if you want it in the picker",scratchOpenFailed:"Couldn't open a scratch shell: {message}",scratchCloseFailed:"Couldn't close the scratch task: {message}",worktreeGoneTitle:'Worktree for "{title}" is gone',worktreeGoneBody:"Closed {count} tab(s). The branch {branch} is still there \u2014 reopen the task to re-create its worktree.",checksPassingTitle:'Checks passed for "{title}"',checksFailingTitle:'Checks failed for "{title}"',checksResolvedBody:"PR {pr} on {branch}",copiedId:"Copied task ID {text}",copiedTab:"Copied tab address {text}",copiedBranch:"Copied branch {text}",copiedPath:"Copied path {text}",copyFailed:"Couldn't reach a clipboard \u2014 no clipboard command on PATH, and this terminal refused OSC 52.",forgetProjectFailed:"Couldn't remove the project \u2014 it stays in the projects list: {error}",deleteFailed:`Couldn't delete "{title}" \u2014 the task and its worktree are untouched: {error}`,createFailed:"Couldn't create the task \u2014 nothing was created: {error}",forkFailed:"Couldn't fork the task \u2014 the original is untouched: {error}",forkLeftBehind:"Started from the last commit \u2014 uncommitted work stays in the original task ({reason})",childFailed:"Couldn't start the new conversation \u2014 the current one is untouched: {error}",renameFailed:"Couldn't rename the task \u2014 it keeps its old title: {error}",renameBranchFailed:`Couldn't rename the branch \u2014 it stays "{branch}": {error}`,switchEngineFailed:"Couldn't switch the engine \u2014 the task keeps the one it had: {error}",setStatusFailed:"Couldn't set the status \u2014 it stays {status}: {error}",pinFailed:"Couldn't change the pin \u2014 the task keeps its current place: {error}",moveFailed:"Couldn't move the task \u2014 it keeps its current place: {error}",moveToProjectFailed:"Couldn't move the task to that project \u2014 it stays where it was: {error}",movedToProject:"Moved to {project} \u2014 the session and its checkout stay where they are",issueChatFailed:"Couldn't start the issue chat \u2014 the issue is unchanged: {error}",inboxMarkReadFailed:"Couldn't mark it read \u2014 it stays in the inbox: {error}",inboxDismissFailed:"Couldn't dismiss it \u2014 it stays in the inbox: {error}",engineSwitched:"Engine \u2192 {engine} (applies on reopen)",statusSet:"Status \u2192 {status}"},zh22={noDaemonWorktree:"\u5B88\u62A4\u8FDB\u7A0B\u672A\u8FD0\u884C\u2014\u2014\u65E0\u6CD5\u521B\u5EFA worktree\u3002\u8BF7\u8FD0\u884C `rove daemon restart` \u542F\u52A8\u5B83\u3002",noEditor:"\u672A\u627E\u5230\u7F16\u8F91\u5668\u2014\u2014\u8BF7\u8BBE\u7F6E ROVE_OPEN_EDITOR\uFF08\u5982 'code'\u3001'cursor'\u3001'nvim'\uFF09",openWorktreeFailed:"\u65E0\u6CD5\u7528 {label} \u6253\u5F00 worktree",worktreeErrorDeleting:"\u8BE5\u4EFB\u52A1\u6B63\u5728\u5220\u9664\u4E2D\u2014\u2014\u65E0\u6CD5\u6253\u5F00",worktreeErrorNotGit:"\u8BE5\u9879\u76EE\u5C1A\u975E git \u4ED3\u5E93\u2014\u2014\u4EFB\u52A1\u9700\u8981 git \u5206\u652F\u3002\u8BF7\u5728\u9879\u76EE\u4E2D\u6267\u884C `git init`\uFF08+ \u9996\u6B21\u63D0\u4EA4\uFF09\u540E\u518D\u6253\u5F00\u4EFB\u52A1\u3002\u975E git \u9879\u76EE\u7684\u652F\u6301\u5373\u5C06\u63A8\u51FA\u3002",worktreeErrorGeneric:"\u65E0\u6CD5\u521B\u5EFA worktree\uFF1A{message}",scratchAdopted:"\u5DF2\u5F52\u5165 {repo}\u2014\u2014\u82E5\u8981\u51FA\u73B0\u5728\u9879\u76EE\u9009\u62E9\u5668\u91CC,\u53EF\u5728\u65B0\u5EFA\u4EFB\u52A1\u4E2D\u4FDD\u5B58\u4E3A\u9879\u76EE",scratchOpenFailed:"\u65E0\u6CD5\u6253\u5F00\u4E34\u65F6 Shell:{message}",scratchCloseFailed:"\u65E0\u6CD5\u5173\u95ED\u4E34\u65F6\u4EFB\u52A1:{message}",worktreeGoneTitle:'"{title}" \u7684 worktree \u5DF2\u6D88\u5931',worktreeGoneBody:"\u5DF2\u5173\u95ED {count} \u4E2A\u6807\u7B7E\u9875\u3002\u5206\u652F {branch} \u4ECD\u5728\u2014\u2014\u91CD\u65B0\u6253\u5F00\u8BE5\u4EFB\u52A1\u4F1A\u91CD\u5EFA worktree\u3002",checksPassingTitle:"\u300C{title}\u300D\u7684 PR \u68C0\u67E5\u5DF2\u901A\u8FC7",checksFailingTitle:"\u300C{title}\u300D\u7684 PR \u68C0\u67E5\u5931\u8D25\u4E86",checksResolvedBody:"PR {pr}\uFF0C\u5206\u652F {branch}",copiedId:"\u5DF2\u590D\u5236\u4EFB\u52A1 ID {text}",copiedTab:"\u5DF2\u590D\u5236\u6807\u7B7E\u9875\u5730\u5740 {text}",copiedBranch:"\u5DF2\u590D\u5236\u5206\u652F {text}",copiedPath:"\u5DF2\u590D\u5236\u8DEF\u5F84 {text}",copyFailed:"\u65E0\u6CD5\u8BBF\u95EE\u526A\u8D34\u677F\u2014\u2014PATH \u4E0A\u6CA1\u6709\u526A\u8D34\u677F\u547D\u4EE4\uFF0C\u8FD9\u4E2A\u7EC8\u7AEF\u4E5F\u62D2\u7EDD\u4E86 OSC 52\u3002",forgetProjectFailed:"\u79FB\u9664\u9879\u76EE\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u5728\u9879\u76EE\u5217\u8868\u91CC\uFF1A{error}",deleteFailed:"\u5220\u9664\u300C{title}\u300D\u5931\u8D25\u2014\u2014\u4EFB\u52A1\u548C\u5B83\u7684 worktree \u90FD\u6CA1\u6709\u88AB\u6539\u52A8\uFF1A{error}",createFailed:"\u521B\u5EFA\u4EFB\u52A1\u5931\u8D25\u2014\u2014\u4EC0\u4E48\u90FD\u6CA1\u6709\u88AB\u521B\u5EFA\uFF1A{error}",forkFailed:"fork \u4EFB\u52A1\u5931\u8D25\u2014\u2014\u539F\u4EFB\u52A1\u6CA1\u6709\u88AB\u6539\u52A8\uFF1A{error}",forkLeftBehind:"\u5DF2\u4ECE\u6700\u8FD1\u4E00\u6B21\u63D0\u4EA4\u5F00\u59CB\u2014\u2014\u672A\u63D0\u4EA4\u7684\u6539\u52A8\u7559\u5728\u539F\u4EFB\u52A1\u91CC\uFF08{reason}\uFF09",childFailed:"\u65E0\u6CD5\u5F00\u59CB\u65B0\u5BF9\u8BDD\u2014\u2014\u5F53\u524D\u5BF9\u8BDD\u6CA1\u6709\u88AB\u6539\u52A8\uFF1A{error}",renameFailed:"\u91CD\u547D\u540D\u4EFB\u52A1\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u7528\u539F\u6765\u7684\u6807\u9898\uFF1A{error}",renameBranchFailed:"\u91CD\u547D\u540D\u5206\u652F\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u662F\u300C{branch}\u300D\uFF1A{error}",switchEngineFailed:"\u5207\u6362\u5F15\u64CE\u5931\u8D25\u2014\u2014\u4EFB\u52A1\u4ECD\u4F7F\u7528\u539F\u6765\u7684\u5F15\u64CE\uFF1A{error}",setStatusFailed:"\u8BBE\u7F6E\u72B6\u6001\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u662F {status}\uFF1A{error}",pinFailed:"\u4FEE\u6539\u7F6E\u9876\u72B6\u6001\u5931\u8D25\u2014\u2014\u4EFB\u52A1\u4ECD\u5728\u539F\u6765\u7684\u4F4D\u7F6E\uFF1A{error}",moveFailed:"\u79FB\u52A8\u4EFB\u52A1\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u5728\u539F\u6765\u7684\u4F4D\u7F6E\uFF1A{error}",moveToProjectFailed:"\u79FB\u5230\u8BE5\u9879\u76EE\u5931\u8D25\u2014\u2014\u4EFB\u52A1\u4ECD\u5728\u539F\u6765\u7684\u9879\u76EE\uFF1A{error}",movedToProject:"\u5DF2\u79FB\u5230 {project}\u2014\u2014\u4F1A\u8BDD\u548C\u5B83\u7684\u5DE5\u4F5C\u76EE\u5F55\u90FD\u6CA1\u6709\u52A8",issueChatFailed:"\u542F\u52A8\u8BAE\u9898\u4F1A\u8BDD\u5931\u8D25\u2014\u2014\u8BAE\u9898\u6CA1\u6709\u88AB\u6539\u52A8\uFF1A{error}",inboxMarkReadFailed:"\u6807\u8BB0\u4E3A\u5DF2\u8BFB\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u7559\u5728\u6536\u4EF6\u7BB1\u91CC\uFF1A{error}",inboxDismissFailed:"\u5FFD\u7565\u5931\u8D25\u2014\u2014\u5B83\u4ECD\u7559\u5728\u6536\u4EF6\u7BB1\u91CC\uFF1A{error}",engineSwitched:"\u5F15\u64CE \u2192 {engine}\uFF08\u91CD\u65B0\u6253\u5F00\u540E\u751F\u6548\uFF09",statusSet:"\u72B6\u6001 \u2192 {status}"};var en23={nav:{kanban:"Kanban",automations:"Routines",issues:"Issues",mods:"Mods"},header:{scratch:"Ungrouped"},search:{placeholder:"fuzzy filter"},sort:{label:"sort: {mode}",hint:"Change the order (manual \u2192 newest \u2192 attention \u2192 name)",reorderSwitched:"Reorder needs manual order \u2014 switched",modes:{default:"manual",recent:"newest",attention:"attention",name:"name"}},menu:{open:"Open",collapseChildren:"Collapse children",expandChildren:"Expand children",newChat:"New conversation",newShell:"New shell",continueEngine:"Continue in another engine\u2026",newScratchChat:"New conversation (no folder)",newTask:"New task",forgetProject:"Remove project",fieldNotes:"Field notes",rename:"Rename",pin:"Pin",unpin:"Unpin",reorder:"Reorder row",moveToTop:"Move to top",reorderProject:"Reorder project",runAgain:"Run again",setStatus:"Set status",moveToProject:"Move to project\u2026",copyId:"Copy task ID",copyBranch:"Copy branch name",copyPath:"Copy path",openEditor:"Open in editor",renameBranch:"Rename branch",changeEngine:"Change engine",fixChecks:"Fix failing checks",rerunChecks:"Re-run failed checks",syncBase:"Sync with base",resolveConflicts:"Resolve conflicts",land:"Land into base branch",archive:"Archive",unarchive:"Unarchive",delete:"Remove session"},status:{backlog:"Backlog",inProgress:"In progress",inReview:"In review",done:"Done",canceled:"Canceled",error:"Error"},setStatus:{title:"Set status",current:"current",footer:"\u2191\u2193 choose \xB7 enter set \xB7 esc cancel"},moveToProject:{title:"Move to project",empty:"No other project yet \u2014 add one first, or run `rove api update --project PATH`",footer:"\u2191\u2193 choose \xB7 enter move \xB7 esc cancel"},sync:{done:"Merged {base} into this worktree",alreadyCurrent:"Already up to date with {base}",conflict:"Merge conflict \u2014 resolve then commit: {files}",dirty:"Commit the worktree's changes first, then sync: {files}",failed:"Sync failed: {error}"},archive:{done:"Archived {title}. Its worktree, branch and sessions are untouched",restored:"Restored {title}",busyTitle:"Archive while it's working?",busyBody:"An engine in {title} is still working or waiting on you. Archiving hides the row without stopping it.",busyConfirm:"Archive anyway",failed:"Couldn't archive: {error}",restoreFailed:"Couldn't restore: {error}"},rerun:{started:"Re-running failed checks",none:"No failed checks to re-run",external:"These checks didn't run on GitHub Actions; re-run them where they ran",refused:"Re-run refused: {detail}"},changeEngine:{title:"Change engine",current:"current",effortLabel:"EFFORT",noEffort:"engine default",footer:{engine:"\u2191\u2193 engine",effort:"\u2190\u2192 effort",model:"tab model",set:"enter set",cancel:"esc cancel"}},engineModel:{label:"MODEL",placeholder:"engine default",loading:"listing models\u2026"},tier:{swift:"swift",standard:"standard",deep:"deep",manual:"manual"},tierDesc:{swift:"small, well-specified edits \u2014 the fastest, cheapest setting",standard:"everyday feature work and bug fixes",deep:"hard problems: unclear root causes, large refactors, design decisions"},runAgain:{title:"Run again",source:"Brief from \u201C{title}\u201D",hint:"Runs this brief again in a new task, on its own branch and worktree.",confirm:"Run again",footer:"\u2191\u2193 scroll \xB7 \u2190\u2192 choose \xB7 enter run \xB7 esc cancel"},fieldNotes:{title:"Field notes",empty:"No field notes for this repo yet \u2014 agents file one with `rove api note`.",loading:"Loading\u2026",footer:"\u2191\u2193 scroll \xB7 esc close",footerDeletable:"\u2191\u2193 select \xB7 d delete \xB7 esc close",confirmDelete:{title:"Delete this field note?",body:"\u201C{text}\u201D stops being injected into new sessions on this repo. Nothing else changes."}},confirm:en21,renameBranch:{title:"Rename branch",fieldLabel:"branch"},moveChip:" move",recentJump:"Recent: {title}",routinesRow:"{count} routine sessions",routinesRowOne:"1 routine session",archivedRow:"Archived \xB7 {count}",machine:{connecting:"connecting\u2026",offline:"offline",unsupported:"unsupported",mismatch:"protocol mismatch",filesElsewhere:"on {host}",filesHint:"{host} is unreachable right now; its files show here again when it reconnects.",terminalElsewhere:"This task runs on {host}, which is unreachable right now.",runsOn:"on {host}",noTabs:"No tabs on {host} yet \u2014 prefix t opens one there."},empty:{noMatchSearch:"No matching tasks \u2014 esc to clear.",noActiveProject:"No active tasks for this project.",noActive:"No active tasks \u2014 create one above."},activity:{working:"working",rateLimited:"rate limited",permissionNeeded:"needs permission",error:"error",dead:"engine exited"},group:{waitingOnYou:"needs you",landing:"ready to land",readyForReview:"needs review",working:"working"},subtitle:{noTracking:"no activity tracking",materializing:"materializing",deleting:"deleting",deleteFailed:"delete failed"},reBranch:{title:"Set branch",fieldLabel:"branch",hintNoBranches:"(no local branches \u2014 type a new name)",hintNoMatch:"(no match \u2014 enter renames to this branch)",footer:"\u2191\u2193 pick \xB7 enter set \xB7 esc cancel"},toast:en22},zh23={nav:{kanban:"\u770B\u677F",automations:"\u4F8B\u884C\u4EFB\u52A1",issues:"\u8BAE\u9898",mods:"Mods"},header:{scratch:"\u672A\u5206\u7EC4"},search:{placeholder:"\u6A21\u7CCA\u641C\u7D22"},sort:{label:"\u6392\u5E8F\uFF1A{mode}",hint:"\u5207\u6362\u6392\u5E8F\uFF08\u624B\u52A8 \u2192 \u6700\u65B0 \u2192 \u5173\u6CE8 \u2192 \u540D\u79F0\uFF09",reorderSwitched:"\u8C03\u6574\u987A\u5E8F\u9700\u624B\u52A8\u6392\u5E8F\uFF0C\u5DF2\u5207\u6362",modes:{default:"\u624B\u52A8",recent:"\u6700\u65B0",attention:"\u5173\u6CE8",name:"\u540D\u79F0"}},menu:{open:"\u6253\u5F00",collapseChildren:"\u6298\u53E0\u5B50\u4EFB\u52A1",expandChildren:"\u5C55\u5F00\u5B50\u4EFB\u52A1",newChat:"\u65B0\u5EFA\u4F1A\u8BDD",newShell:"\u65B0\u5EFA\u7EC8\u7AEF",continueEngine:"\u6362\u4E2A\u5F15\u64CE\u7EE7\u7EED\u2026",newScratchChat:"\u65B0\u5EFA\u4F1A\u8BDD\uFF08\u65E0\u6587\u4EF6\u5939\uFF09",newTask:"\u65B0\u5EFA\u4EFB\u52A1",forgetProject:"\u79FB\u9664\u9879\u76EE",fieldNotes:"\u73B0\u573A\u7B14\u8BB0",rename:"\u91CD\u547D\u540D",pin:"\u7F6E\u9876",unpin:"\u53D6\u6D88\u7F6E\u9876",reorder:"\u91CD\u65B0\u6392\u5E8F",moveToTop:"\u79FB\u5230\u9876\u90E8",reorderProject:"\u8C03\u6574\u9879\u76EE\u987A\u5E8F",runAgain:"\u91CD\u65B0\u8FD0\u884C",setStatus:"\u8BBE\u7F6E\u72B6\u6001",moveToProject:"\u79FB\u5230\u5176\u4ED6\u9879\u76EE\u2026",copyId:"\u590D\u5236\u4EFB\u52A1 ID",copyBranch:"\u590D\u5236\u5206\u652F\u540D",copyPath:"\u590D\u5236\u8DEF\u5F84",openEditor:"\u5728\u7F16\u8F91\u5668\u4E2D\u6253\u5F00",renameBranch:"\u91CD\u547D\u540D\u5206\u652F",changeEngine:"\u5207\u6362\u5F15\u64CE",fixChecks:"\u4FEE\u590D\u5931\u8D25\u7684\u68C0\u67E5",rerunChecks:"\u91CD\u65B0\u8FD0\u884C\u5931\u8D25\u7684\u68C0\u67E5",syncBase:"\u540C\u6B65\u57FA\u7840\u5206\u652F",resolveConflicts:"\u8BA9 agent \u89E3\u51B3\u51B2\u7A81",land:"\u5408\u5165\u57FA\u7840\u5206\u652F",archive:"\u5F52\u6863",unarchive:"\u53D6\u6D88\u5F52\u6863",delete:"\u79FB\u9664\u4F1A\u8BDD"},status:{backlog:"\u5F85\u529E",inProgress:"\u8FDB\u884C\u4E2D",inReview:"\u5F85\u8BC4\u5BA1",done:"\u5DF2\u5B8C\u6210",canceled:"\u5DF2\u53D6\u6D88",error:"\u51FA\u9519"},setStatus:{title:"\u8BBE\u7F6E\u72B6\u6001",current:"\u5F53\u524D",footer:"\u2191\u2193 \u9009\u62E9 \xB7 enter \u8BBE\u7F6E \xB7 esc \u53D6\u6D88"},moveToProject:{title:"\u79FB\u5230\u5176\u4ED6\u9879\u76EE",empty:"\u8FD8\u6CA1\u6709\u5176\u4ED6\u9879\u76EE\u2014\u2014\u5148\u6DFB\u52A0\u4E00\u4E2A\uFF0C\u6216\u8FD0\u884C `rove api update --project PATH`",footer:"\u2191\u2193 \u9009\u62E9 \xB7 enter \u79FB\u52A8 \xB7 esc \u53D6\u6D88"},sync:{done:"\u5DF2\u628A {base} \u5408\u5E76\u8FDB\u8BE5\u5DE5\u4F5C\u6811",alreadyCurrent:"\u5DF2\u7ECF\u548C {base} \u540C\u6B65",conflict:"\u5408\u5E76\u51B2\u7A81\u2014\u2014\u89E3\u51B3\u540E\u63D0\u4EA4\uFF1A{files}",dirty:"\u8BF7\u5148\u63D0\u4EA4\u5DE5\u4F5C\u6811\u91CC\u7684\u6539\u52A8\uFF0C\u518D\u540C\u6B65\uFF1A{files}",failed:"\u540C\u6B65\u5931\u8D25\uFF1A{error}"},archive:{done:"\u5DF2\u5F52\u6863 {title}\u3002\u5DE5\u4F5C\u6811\u3001\u5206\u652F\u548C\u4F1A\u8BDD\u90FD\u4FDD\u6301\u539F\u6837",restored:"\u5DF2\u6062\u590D {title}",busyTitle:"\u5B83\u8FD8\u5728\u5DE5\u4F5C\uFF0C\u4ECD\u8981\u5F52\u6863\uFF1F",busyBody:"{title} \u91CC\u6709\u5F15\u64CE\u4ECD\u5728\u5DE5\u4F5C\u6216\u5728\u7B49\u4F60\u3002\u5F52\u6863\u53EA\u9690\u85CF\u8FD9\u4E00\u884C\uFF0C\u4E0D\u4F1A\u505C\u6B62\u5B83\u3002",busyConfirm:"\u4ECD\u8981\u5F52\u6863",failed:"\u5F52\u6863\u5931\u8D25\uFF1A{error}",restoreFailed:"\u6062\u590D\u5931\u8D25\uFF1A{error}"},rerun:{started:"\u6B63\u5728\u91CD\u65B0\u8FD0\u884C\u5931\u8D25\u7684\u68C0\u67E5",none:"\u6CA1\u6709\u53EF\u91CD\u65B0\u8FD0\u884C\u7684\u5931\u8D25\u68C0\u67E5",external:"\u8FD9\u4E9B\u68C0\u67E5\u4E0D\u662F\u5728 GitHub Actions \u4E0A\u8FD0\u884C\u7684\uFF0C\u8BF7\u5230\u5B83\u4EEC\u8FD0\u884C\u7684\u5730\u65B9\u91CD\u65B0\u8FD0\u884C",refused:"\u65E0\u6CD5\u91CD\u65B0\u8FD0\u884C\uFF1A{detail}"},changeEngine:{title:"\u5207\u6362\u5F15\u64CE",current:"\u5F53\u524D",effortLabel:"\u63A8\u7406\u5F3A\u5EA6",noEffort:"\u5F15\u64CE\u9ED8\u8BA4",footer:{engine:"\u2191\u2193 \u5F15\u64CE",effort:"\u2190\u2192 \u5F3A\u5EA6",model:"tab \u6A21\u578B",set:"enter \u8BBE\u7F6E",cancel:"esc \u53D6\u6D88"}},engineModel:{label:"\u6A21\u578B",placeholder:"\u5F15\u64CE\u9ED8\u8BA4",loading:"\u6B63\u5728\u5217\u51FA\u6A21\u578B\u2026"},tier:{swift:"\u8F7B\u5FEB",standard:"\u6807\u51C6",deep:"\u6DF1\u5165",manual:"\u624B\u52A8"},tierDesc:{swift:"\u5C0F\u800C\u660E\u786E\u7684\u6539\u52A8\u2014\u2014\u6700\u5FEB\u3001\u6700\u7701\u7684\u4E00\u6863",standard:"\u65E5\u5E38\u7684\u529F\u80FD\u5F00\u53D1\u548C\u4FEE bug",deep:"\u96BE\u9898\uFF1A\u6839\u56E0\u4E0D\u660E\u3001\u5927\u91CD\u6784\u3001\u8BBE\u8BA1\u51B3\u7B56"},runAgain:{title:"\u91CD\u65B0\u8FD0\u884C",source:"\u6765\u81EA\u4EFB\u52A1\u300C{title}\u300D\u7684\u6307\u4EE4",hint:"\u5728\u65B0\u4EFB\u52A1\u91CC\u91CD\u65B0\u6267\u884C\u8FD9\u6BB5\u6307\u4EE4\uFF0C\u65B0\u4EFB\u52A1\u6709\u81EA\u5DF1\u7684\u5206\u652F\u548C\u5DE5\u4F5C\u6811\u3002",confirm:"\u91CD\u65B0\u8FD0\u884C",footer:"\u2191\u2193 \u6EDA\u52A8 \xB7 \u2190\u2192 \u9009\u62E9 \xB7 enter \u8FD0\u884C \xB7 esc \u53D6\u6D88"},confirm:zh21,renameBranch:{title:"\u91CD\u547D\u540D\u5206\u652F",fieldLabel:"\u5206\u652F"},fieldNotes:{title:"\u73B0\u573A\u7B14\u8BB0",empty:"\u8BE5\u4ED3\u5E93\u6682\u65E0\u73B0\u573A\u7B14\u8BB0\u2014\u2014agent \u53EF\u7528 `rove api note` \u8BB0\u5F55\u3002",loading:"\u52A0\u8F7D\u4E2D\u2026",footer:"\u2191\u2193 \u6EDA\u52A8 \xB7 esc \u5173\u95ED",footerDeletable:"\u2191\u2193 \u9009\u62E9 \xB7 d \u5220\u9664 \xB7 esc \u5173\u95ED",confirmDelete:{title:"\u5220\u9664\u8FD9\u6761\u73B0\u573A\u7B14\u8BB0?",body:"\u300C{text}\u300D\u5C06\u4E0D\u518D\u6CE8\u5165\u8BE5\u4ED3\u5E93\u7684\u65B0\u4F1A\u8BDD\u3002\u5176\u4ED6\u5185\u5BB9\u4E0D\u53D7\u5F71\u54CD\u3002"}},moveChip:" \u79FB\u52A8",recentJump:"\u6700\u8FD1:{title}",routinesRow:"{count} \u4E2A routine \u4F1A\u8BDD",routinesRowOne:"1 \u4E2A routine \u4F1A\u8BDD",archivedRow:"\u5DF2\u5F52\u6863 \xB7 {count}",machine:{connecting:"\u8FDE\u63A5\u4E2D\u2026",offline:"\u79BB\u7EBF",unsupported:"\u4E0D\u652F\u6301",mismatch:"\u534F\u8BAE\u4E0D\u517C\u5BB9",filesElsewhere:"\u5728 {host} \u4E0A",filesHint:"{host} \u6682\u65F6\u8FDE\u4E0D\u4E0A\uFF1B\u91CD\u65B0\u8FDE\u4E0A\u540E\u8FD9\u91CC\u4F1A\u518D\u663E\u793A\u5B83\u7684\u6587\u4EF6\u3002",terminalElsewhere:"\u8FD9\u4E2A\u4EFB\u52A1\u8DD1\u5728 {host} \u4E0A\uFF0C\u6682\u65F6\u8FDE\u4E0D\u4E0A\u3002",runsOn:"\u5728 {host} \u4E0A",noTabs:"{host} \u4E0A\u8FD8\u6CA1\u6709 tab\u2014\u2014\u6309 prefix t \u5728\u90A3\u91CC\u65B0\u5F00\u4E00\u4E2A\u3002"},empty:{noMatchSearch:"\u65E0\u5339\u914D\u4EFB\u52A1\u2014\u2014\u6309 esc \u6E05\u9664\u3002",noActiveProject:"\u8BE5\u9879\u76EE\u6682\u65E0\u6D3B\u8DC3\u4EFB\u52A1\u3002",noActive:"\u6682\u65E0\u6D3B\u8DC3\u4EFB\u52A1\u2014\u2014\u5728\u4E0A\u65B9\u65B0\u5EFA\u3002"},activity:{working:"\u8FD0\u884C\u4E2D",rateLimited:"\u8BF7\u6C42\u53D7\u9650",permissionNeeded:"\u7B49\u5F85\u6388\u6743",error:"\u9519\u8BEF",dead:"\u5F15\u64CE\u5DF2\u9000\u51FA"},group:{waitingOnYou:"\u7B49\u4F60\u5904\u7406",landing:"\u53EF\u4EE5\u5408\u4E86",readyForReview:"\u5F85\u4F60\u9A8C\u6536",working:"\u8FD0\u884C\u4E2D"},subtitle:{noTracking:"\u4E0D\u8DDF\u8E2A\u6D3B\u52A8",materializing:"\u6B63\u5728\u521B\u5EFA worktree",deleting:"\u6B63\u5728\u5220\u9664",deleteFailed:"\u5220\u9664\u5931\u8D25"},reBranch:{title:"\u8BBE\u7F6E\u5206\u652F",fieldLabel:"\u5206\u652F",hintNoBranches:"\uFF08\u6CA1\u6709\u672C\u5730\u5206\u652F\u2014\u2014\u8F93\u5165\u65B0\u540D\u79F0\uFF09",hintNoMatch:"\uFF08\u65E0\u5339\u914D\u2014\u2014\u56DE\u8F66\u5C06\u5206\u652F\u91CD\u547D\u540D\u4E3A\u6B64\u540D\uFF09",footer:"\u2191\u2193 \u9009\u62E9 \xB7 enter \u8BBE\u7F6E \xB7 esc \u53D6\u6D88"},toast:zh22};var en24={noTask:"(no task \u2014 press n to create)",exited:"process exited \u2014 F5 restarts it",engineExit:{title:"Engine exited",titleCode:"Engine exited (code {code})",retry:"Retry",settings:"Settings \u2192 Engines",another:"Another engine",continueIn:"Continue in another engine"},usageLimit:{title:"Usage limit reached",dismiss:"Dismiss"},restoring:"restoring session\u2026",recovery:{live:"Live process reattached",relaunched:"Command relaunched in a new process. Any restored output is historical; check the engine to resume or continue your conversation.",restored:"Historical screen restored; previous process ended. Restart and check the engine before continuing."},tab:{groupTitle:"group {n}",renameTitle:"Rename tab",renameField:"TAB TITLE",renameSubmit:"rename",chooseEngineHint:"\u2190/\u2192 or h/l choose, enter confirm, esc cancel",newChat:{title:"New conversation",engine:"ENGINE",destLabel:"DESTINATION",destTab:"child task, same directory",destFork:"fork a child task (new worktree)",destScratch:"new scratch task ($HOME)",ctxLabel:"CONTEXT",ctxFresh:"fresh conversation",ctxContinue:"continue this conversation"},cannotCloseLast:"Cannot close the only tab",tabGone:"That tab is no longer there",closeOthersTitle:"Close the other tabs?",closeOthersBody:"Closing {count} \xB7 their sessions end, this tab stays open.",closeOthersConfirm:"close tabs",closeOthersCancel:"cancel",menu:{rename:"Rename tab",copyAddress:"Copy tab address",continueEngine:"Continue in another engine\u2026",closeOthers:"Close other tabs",close:"Close tab"},nothingToFork:"No conversation in this tab to fork yet",noTranscriptToHandOff:"{engine} keeps no readable transcript to hand over"},split:{renameTitle:"Rename split",renameField:"SPLIT NAME"},scrolledBack:"\u2191 scrolled {lines}L",scrollFirst:"[first]",scrollLatest:"[latest]",unavailable:{shellMissing:"terminal unavailable \u2014 the shell named by $SHELL isn't on this machine. Point $SHELL at one that exists, or unset it to fall back to the system default.",spawnFailed:"terminal unavailable \u2014 the shell exited immediately. Its error is in ~/.rove/pty.log.",retry:"F5 tries again"},reset:{title:"Reset terminal?",body:"The running shell will be killed and a fresh one will spawn at the worktree. Any in-flight processes (vim, htop, paused jobs) end immediately."}},zh24={recovery:{live:"\u5DF2\u91CD\u65B0\u8FDE\u63A5\u4ECD\u5728\u8FD0\u884C\u7684\u8FDB\u7A0B",relaunched:"\u547D\u4EE4\u5DF2\u5728\u65B0\u8FDB\u7A0B\u4E2D\u91CD\u542F\u3002\u5982\u6709\u6062\u590D\u7684\u8F93\u51FA\uFF0C\u5B83\u5C5E\u4E8E\u5386\u53F2\u8BB0\u5F55\uFF1B\u8BF7\u5728\u5F15\u64CE\u5185\u786E\u8BA4\u4F1A\u8BDD\u6062\u590D\u6216\u7EE7\u7EED\u64CD\u4F5C\u3002",restored:"\u5DF2\u6062\u590D\u5386\u53F2\u753B\u9762\uFF1B\u539F\u8FDB\u7A0B\u5DF2\u7ED3\u675F\u3002\u8BF7\u91CD\u542F\u5E76\u786E\u8BA4\u5F15\u64CE\u72B6\u6001\u540E\u7EE7\u7EED\u3002"},noTask:"\uFF08\u65E0\u4EFB\u52A1 \u2014\u2014 \u6309 n \u521B\u5EFA\uFF09",exited:"\u8FDB\u7A0B\u5DF2\u9000\u51FA \u2014\u2014 \u6309 F5 \u91CD\u542F",engineExit:{title:"\u5F15\u64CE\u5DF2\u9000\u51FA",titleCode:"\u5F15\u64CE\u5DF2\u9000\u51FA\uFF08\u9000\u51FA\u7801 {code}\uFF09",retry:"\u91CD\u8BD5",settings:"\u8BBE\u7F6E \u2192 \u5F15\u64CE",another:"\u6362\u4E2A\u5F15\u64CE",continueIn:"\u6362\u4E2A\u5F15\u64CE\u7EE7\u7EED"},usageLimit:{title:"\u5DF2\u8FBE\u5230\u7528\u91CF\u4E0A\u9650",dismiss:"\u5FFD\u7565"},restoring:"\u6B63\u5728\u6062\u590D\u4F1A\u8BDD\u2026",tab:{groupTitle:"group {n}",renameTitle:"\u91CD\u547D\u540D\u6807\u7B7E\u9875",renameField:"\u6807\u7B7E\u9875\u540D\u79F0",renameSubmit:"\u91CD\u547D\u540D",chooseEngineHint:"\u2190/\u2192 \u6216 h/l \u9009\u62E9\uFF0Center \u786E\u8BA4\uFF0Cesc \u53D6\u6D88",newChat:{title:"\u65B0\u5EFA\u5BF9\u8BDD",engine:"\u5F15\u64CE",destLabel:"\u843D\u70B9",destTab:"\u5B50\u4EFB\u52A1\uFF0C\u540C\u4E00\u76EE\u5F55",destFork:"fork \u5B50\u4EFB\u52A1\uFF08\u65B0 worktree\uFF09",destScratch:"\u65B0\u4E34\u65F6\u4EFB\u52A1\uFF08$HOME\uFF09",ctxLabel:"\u4E0A\u4E0B\u6587",ctxFresh:"\u5168\u65B0\u5BF9\u8BDD",ctxContinue:"\u63A5\u7740\u5F53\u524D\u5BF9\u8BDD"},cannotCloseLast:"\u65E0\u6CD5\u5173\u95ED\u552F\u4E00\u7684\u6807\u7B7E\u9875",tabGone:"\u8FD9\u4E2A\u6807\u7B7E\u9875\u5DF2\u7ECF\u4E0D\u5728\u4E86",closeOthersTitle:"\u5173\u95ED\u5176\u4ED6\u6807\u7B7E\u9875\uFF1F",closeOthersBody:"\u5C06\u5173\u95ED {count} \u4E2A\uFF0C\u5B83\u4EEC\u7684\u4F1A\u8BDD\u4F1A\u7ED3\u675F\uFF0C\u53EA\u4FDD\u7559\u8FD9\u4E2A\u6807\u7B7E\u9875\u3002",closeOthersConfirm:"\u5173\u95ED\u6807\u7B7E\u9875",closeOthersCancel:"\u53D6\u6D88",menu:{rename:"\u91CD\u547D\u540D\u6807\u7B7E\u9875",copyAddress:"\u590D\u5236\u6807\u7B7E\u9875\u5730\u5740",continueEngine:"\u6362\u4E2A\u5F15\u64CE\u7EE7\u7EED\u2026",closeOthers:"\u5173\u95ED\u5176\u4ED6\u6807\u7B7E\u9875",close:"\u5173\u95ED\u6807\u7B7E\u9875"},nothingToFork:"\u8FD9\u4E2A\u6807\u7B7E\u9875\u8FD8\u6CA1\u6709\u53EF\u6D3E\u751F\u7684\u5BF9\u8BDD",noTranscriptToHandOff:"{engine} \u6CA1\u6709\u53EF\u8BFB\u7684\u5BF9\u8BDD\u8BB0\u5F55\uFF0C\u65E0\u6CD5\u4EA4\u63A5"},split:{renameTitle:"\u91CD\u547D\u540D\u5206\u5C4F",renameField:"\u5206\u5C4F\u540D\u79F0"},scrolledBack:"\u2191 \u5DF2\u56DE\u6EDA {lines} \u884C",scrollFirst:"[\u6700\u65E9]",scrollLatest:"[\u6700\u65B0]",unavailable:{shellMissing:"\u7EC8\u7AEF\u4E0D\u53EF\u7528 \u2014\u2014 $SHELL \u6307\u5411\u7684 shell \u5728\u8FD9\u53F0\u673A\u5668\u4E0A\u4E0D\u5B58\u5728\u3002\u8BF7\u628A $SHELL \u6307\u5411\u4E00\u4E2A\u771F\u5B9E\u5B58\u5728\u7684 shell\uFF0C\u6216\u53D6\u6D88\u8BBE\u7F6E\u4EE5\u56DE\u9000\u5230\u7CFB\u7EDF\u9ED8\u8BA4\u3002",spawnFailed:"\u7EC8\u7AEF\u4E0D\u53EF\u7528 \u2014\u2014 shell \u542F\u52A8\u540E\u7ACB\u5373\u9000\u51FA\u3002\u5177\u4F53\u9519\u8BEF\u89C1 ~/.rove/pty.log\u3002",retry:"\u6309 F5 \u91CD\u8BD5"},reset:{title:"\u91CD\u7F6E\u7EC8\u7AEF\uFF1F",body:"\u6B63\u5728\u8FD0\u884C\u7684 shell \u4F1A\u88AB\u6740\u6389\u5E76\u5728 worktree \u91CD\u65B0\u542F\u52A8\uFF0C\u8FDB\u884C\u4E2D\u7684\u8FDB\u7A0B\uFF08vim\u3001htop\u3001\u6682\u505C\u7684\u4EFB\u52A1\uFF09\u4F1A\u7ACB\u5373\u7ED3\u675F\u3002"}};var en25={pageTitle:"ROVE UPDATE",closeHint:"q / esc close",chip:"\u2191 {version}",current:"current",available:"v{version} available",latest:"latest",latestUnknown:"unknown \u2014 could not reach the registry",registryRetry:"Check your connection, then close and reopen Update to retry.",upToDate:"No newer release \u2014 nothing to install.",releaseUrlUnavailable:"release URL unavailable; visit github.com/Sma1lboy/rove/releases",statusReleaseOpened:"Opened release page in your browser.",statusReleaseError:"Could not open release URL. Visit github.com/Sma1lboy/rove/releases in your browser.",statusRunningUpdater:"Closing the TUI and running the updater in this terminal...",loadingNotes:"Loading release notes...",notesUnavailable:"Release notes are unavailable. Use Open release to view the GitHub release page.",changesSectionHeader:"\u2500\u2500 changes from v{from} to v{to} \u2500\u2500",updateComplete:"Rove update complete. Relaunch Rove to use the new version.",updateFailed:"Rove update failed with exit code {code}. Check the output above, then run `rove update` to retry.",pressAnyKey:"Press any key to close this update window.",webRunning:"Running {command} \u2026",webInstalled:"Installed. The daemon and this web bridge still run v{current}: run `rove daemon restart`, then restart `rove --web`. The page reloads itself once the bridge runs the new version.",webStartFailed:"Could not start the updater: {error}",actions:{updateNow:"Update now",openRelease:"Open release",close:"Close",closeDetail:"return to the workspace"},whatsNew:{title:"WHAT'S NEW",closeHint:"q / esc continue",upgraded:"You're now on Rove v{to}, up from v{from}. Here's what changed.",notesUnavailable:"Could not load the release notes \u2014 check your connection, or read them on GitHub.",sourceHint:"release notes: {url}"},skew:{title:"\u26A0 DAEMON OUT OF DATE",olderBuild:"an older build",hint:"daemon is {daemon} \u2014 you launched v{clientVersion}. Press {keys} to refresh Rove onto the installed build",hintNoKey:"daemon is {daemon} \u2014 you launched v{clientVersion}. Run `rove daemon restart`, then relaunch Rove"},refresh:{confirmTitle:"Refresh Rove?",confirmBody:"Rove restarts the daemon and relaunches itself on the installed build. Running engine sessions live in the PTY host and keep going; open tabs come back.",confirmLabel:"Refresh",relaunching:"rove: restarting on the installed build...",alreadyCurrent:"Rove and the daemon already run the same build \u2014 nothing to refresh.",installGone:"This Rove was installed from a directory that no longer exists, so it cannot relaunch itself. Reinstall with `npm install -g @sma1lboy/rove`."},staleInstall:{title:"\u2715 ROVE INSTALL IS GONE",hint:"this Rove is running from an install that no longer exists on disk, so it cannot start a daemon. Reinstall (`npm install -g @sma1lboy/rove`) and relaunch Rove"},versions:{pageTitle:"ROVE VERSIONS",loading:"Loading releases...",unavailable:"Could not fetch releases. Check your connection or wait for the rate limit, then reopen this page.",tagCurrent:"current",tagLatest:"latest",tagBreaking:"breaking",breakingWarning:"\u26A0 installing this crosses breaking version(s) {versions}. Rove will refuse to start until you run `rove reset`, which stops the daemon, the PTY host, and every live session. Tasks and worktrees are kept.",footerHint:"j/k select \xB7 enter install \xB7 q close",closeHint:"q / esc close"}},zh25={pageTitle:"ROVE \u66F4\u65B0",closeHint:"q / esc \u5173\u95ED",chip:"\u2191 {version}",current:"\u5F53\u524D",available:"\u6709\u65B0\u7248\u672C v{version}",latest:"\u6700\u65B0",latestUnknown:"\u672A\u77E5 \u2014\u2014 \u65E0\u6CD5\u8FDE\u63A5\u5230 registry",registryRetry:"\u8BF7\u68C0\u67E5\u7F51\u7EDC\uFF0C\u7136\u540E\u5173\u95ED\u5E76\u91CD\u65B0\u6253\u5F00\u66F4\u65B0\u9875\u91CD\u8BD5\u3002",upToDate:"\u6CA1\u6709\u66F4\u65B0\u7684\u7248\u672C \u2014\u2014 \u65E0\u9700\u5B89\u88C5\u3002",releaseUrlUnavailable:"\u53D1\u5E03\u94FE\u63A5\u4E0D\u53EF\u7528\uFF1B\u8BF7\u8BBF\u95EE github.com/Sma1lboy/rove/releases",statusReleaseOpened:"\u5DF2\u5728\u6D4F\u89C8\u5668\u4E2D\u6253\u5F00\u53D1\u5E03\u8BF4\u660E\u9875\u9762\u3002",statusReleaseError:"\u65E0\u6CD5\u6253\u5F00\u53D1\u5E03\u94FE\u63A5\u3002\u8BF7\u5728\u6D4F\u89C8\u5668\u8BBF\u95EE github.com/Sma1lboy/rove/releases\u3002",statusRunningUpdater:"\u6B63\u5728\u5173\u95ED TUI\uFF0C\u5E76\u5728\u5F53\u524D\u7EC8\u7AEF\u4E2D\u8FD0\u884C\u66F4\u65B0\u7A0B\u5E8F\u2026\u2026",loadingNotes:"\u6B63\u5728\u52A0\u8F7D\u53D1\u5E03\u8BF4\u660E\u2026\u2026",notesUnavailable:"\u53D1\u5E03\u8BF4\u660E\u4E0D\u53EF\u7528\u3002\u8BF7\u4F7F\u7528\u300C\u6253\u5F00\u53D1\u5E03\u9875\u300D\u67E5\u770B GitHub \u53D1\u5E03\u9875\u9762\u3002",changesSectionHeader:"\u2500\u2500 v{from} \u81F3 v{to} \u7684\u53D8\u66F4 \u2500\u2500",updateComplete:"Rove \u66F4\u65B0\u5B8C\u6210\u3002\u8BF7\u91CD\u65B0\u542F\u52A8 Rove \u4EE5\u4F7F\u7528\u65B0\u7248\u672C\u3002",updateFailed:"Rove \u66F4\u65B0\u5931\u8D25\uFF0C\u9000\u51FA\u7801\u4E3A {code}\u3002\u8BF7\u68C0\u67E5\u4E0A\u65B9\u8F93\u51FA\uFF0C\u518D\u8FD0\u884C `rove update` \u91CD\u8BD5\u3002",pressAnyKey:"\u6309\u4EFB\u610F\u952E\u5173\u95ED\u6B64\u66F4\u65B0\u7A97\u53E3\u3002",webRunning:"\u6B63\u5728\u8FD0\u884C {command} \u2026",webInstalled:"\u5DF2\u5B89\u88C5\u3002daemon \u548C\u8FD9\u4E2A web bridge \u4ECD\u5728\u8DD1 v{current}\uFF1A\u5148\u8FD0\u884C `rove daemon restart`\uFF0C\u518D\u91CD\u542F `rove --web`\u3002bridge \u6362\u5230\u65B0\u7248\u672C\u540E\uFF0C\u9875\u9762\u4F1A\u81EA\u52A8\u5237\u65B0\u3002",webStartFailed:"\u65E0\u6CD5\u542F\u52A8\u66F4\u65B0\u7A0B\u5E8F\uFF1A{error}",actions:{updateNow:"\u7ACB\u5373\u66F4\u65B0",openRelease:"\u6253\u5F00\u53D1\u5E03\u9875",close:"\u5173\u95ED",closeDetail:"\u8FD4\u56DE\u5DE5\u4F5C\u533A"},whatsNew:{title:"\u66F4\u65B0\u5185\u5BB9",closeHint:"q / esc \u7EE7\u7EED",upgraded:"Rove \u5DF2\u4ECE v{from} \u66F4\u65B0\u5230 v{to}\uFF0C\u672C\u6B21\u53D8\u66F4\u5982\u4E0B\u3002",notesUnavailable:"\u65E0\u6CD5\u52A0\u8F7D\u53D1\u5E03\u8BF4\u660E \u2014\u2014 \u8BF7\u68C0\u67E5\u7F51\u7EDC\u8FDE\u63A5\uFF0C\u6216\u5230 GitHub \u4E0A\u67E5\u770B\u3002",sourceHint:"\u53D1\u5E03\u8BF4\u660E\uFF1A{url}"},skew:{title:"\u26A0 DAEMON \u7248\u672C\u4E0D\u4E00\u81F4",olderBuild:"\u65E7\u7248\u672C\u6784\u5EFA",hint:"daemon \u8FD0\u884C\u7684\u662F {daemon}\uFF0C\u800C\u4F60\u542F\u52A8\u7684\u662F v{clientVersion}\u3002\u6309 {keys} \u53EF\u8BA9 Rove \u5237\u65B0\u5230\u5DF2\u5B89\u88C5\u7684\u7248\u672C",hintNoKey:"daemon \u8FD0\u884C\u7684\u662F {daemon}\uFF0C\u800C\u4F60\u542F\u52A8\u7684\u662F v{clientVersion}\u3002\u8BF7\u8FD0\u884C `rove daemon restart`\uFF0C\u7136\u540E\u91CD\u65B0\u542F\u52A8 Rove"},refresh:{confirmTitle:"\u5237\u65B0 Rove\uFF1F",confirmBody:"Rove \u4F1A\u91CD\u542F daemon\uFF0C\u5E76\u4EE5\u5DF2\u5B89\u88C5\u7684\u7248\u672C\u91CD\u65B0\u542F\u52A8\u81EA\u8EAB\u3002\u6B63\u5728\u8FD0\u884C\u7684\u5F15\u64CE\u4F1A\u8BDD\u7531 PTY host \u6258\u7BA1\uFF0C\u4E0D\u4F1A\u4E2D\u65AD\uFF1B\u5DF2\u6253\u5F00\u7684\u6807\u7B7E\u9875\u4F1A\u6062\u590D\u3002",confirmLabel:"\u5237\u65B0",relaunching:"rove\uFF1A\u6B63\u5728\u4EE5\u5DF2\u5B89\u88C5\u7684\u7248\u672C\u91CD\u65B0\u542F\u52A8\u2026\u2026",alreadyCurrent:"Rove \u4E0E daemon \u5DF2\u7ECF\u662F\u540C\u4E00\u4E2A\u7248\u672C \u2014\u2014 \u65E0\u9700\u5237\u65B0\u3002",installGone:"\u5F53\u524D Rove \u7684\u5B89\u88C5\u76EE\u5F55\u5DF2\u4E0D\u5B58\u5728\uFF0C\u65E0\u6CD5\u91CD\u65B0\u542F\u52A8\u81EA\u8EAB\u3002\u8BF7\u8FD0\u884C `npm install -g @sma1lboy/rove` \u91CD\u65B0\u5B89\u88C5\u3002"},staleInstall:{title:"\u2715 ROVE \u5B89\u88C5\u5DF2\u4E0D\u5B58\u5728",hint:"\u5F53\u524D Rove \u8FD0\u884C\u81EA\u4E00\u4EFD\u5DF2\u4ECE\u78C1\u76D8\u5220\u9664\u7684\u5B89\u88C5\uFF0C\u56E0\u6B64\u65E0\u6CD5\u542F\u52A8 daemon\u3002\u8BF7\u91CD\u65B0\u5B89\u88C5\uFF08`npm install -g @sma1lboy/rove`\uFF09\u5E76\u91CD\u65B0\u542F\u52A8 Rove"},versions:{pageTitle:"ROVE \u7248\u672C\u5217\u8868",loading:"\u6B63\u5728\u52A0\u8F7D\u53D1\u5E03\u5217\u8868\u2026\u2026",unavailable:"\u65E0\u6CD5\u83B7\u53D6\u53D1\u5E03\u5217\u8868\u3002\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216\u7B49\u5F85\u9650\u6D41\u89E3\u9664\uFF0C\u7136\u540E\u91CD\u65B0\u6253\u5F00\u672C\u9875\u3002",tagCurrent:"\u5F53\u524D",tagLatest:"\u6700\u65B0",tagBreaking:"breaking",breakingWarning:"\u26A0 \u5B89\u88C5\u8BE5\u7248\u672C\u4F1A\u8DE8\u8FC7 breaking \u7248\u672C {versions}\u3002\u66F4\u65B0\u540E Rove \u4F1A\u62D2\u7EDD\u542F\u52A8\uFF0C\u76F4\u5230\u4F60\u8FD0\u884C `rove reset`\u2014\u2014\u5B83\u4F1A\u505C\u6389 daemon\u3001PTY host \u548C\u6240\u6709\u6D3B\u52A8\u4F1A\u8BDD\u3002\u4EFB\u52A1\u548C worktree \u4F1A\u4FDD\u7559\u3002",footerHint:"j/k \u9009\u62E9 \xB7 enter \u5B89\u88C5 \xB7 q \u5173\u95ED",closeHint:"q / esc \u5173\u95ED"}};var en26={title:"ISSUES",noRepo:"no project",empty:"No open issues.",assignedFilter:"assigned to me",starting:"Starting work on #{number}\u2026",startedNoEngine:"Created {title}, but its engine did not start.",linkedChip:"\u2192 {title}",openingLinked:"Opening {title}\u2026",startFailed:"Couldn't start work on #{number}: {error}",errorHint:{noRemote:"Add a GitHub remote (`git remote add origin <url>`) and try again, or press q / esc to close.",ghMissing:"Install the `gh` CLI and authenticate, or press q / esc to close.",auth:"Run `gh auth login`, or press q / esc to close.",fallback:"{message} \xB7 press q / esc to close"}},zh26={title:"\u8BAE\u9898",noRepo:"\u65E0\u9879\u76EE",empty:"\u6CA1\u6709\u5F00\u653E\u7684\u8BAE\u9898\u3002",assignedFilter:"\u5206\u914D\u7ED9\u6211\u7684",starting:"\u6B63\u5728\u5F00\u59CB\u5904\u7406 #{number}\u2026",startedNoEngine:"\u5DF2\u521B\u5EFA {title}\uFF0C\u4F46\u5F15\u64CE\u6CA1\u6709\u542F\u52A8\u3002",linkedChip:"\u2192 {title}",openingLinked:"\u6B63\u5728\u6253\u5F00 {title}\u2026",startFailed:"\u5F00\u59CB\u5904\u7406 #{number} \u5931\u8D25\uFF1A{error}",errorHint:{noRemote:"\u6DFB\u52A0 GitHub remote\uFF08`git remote add origin <url>`\uFF09\u540E\u91CD\u8BD5\uFF0C\u6216\u6309 q / esc \u5173\u95ED\u3002",ghMissing:"\u5B89\u88C5 `gh` CLI \u5E76\u767B\u5F55\uFF0C\u6216\u6309 q / esc \u5173\u95ED\u3002",auth:"\u6267\u884C `gh auth login`\uFF0C\u6216\u6309 q / esc \u5173\u95ED\u3002",fallback:"{message} \xB7 \u6309 q / esc \u5173\u95ED"}};var en27={quit:{confirmTitle:"Quit Rove?",confirmBody:"The daemon and task sessions keep running. This closes only the native workspace.",confirmLabel:"Quit"},narrowBack:"Tasks",empty:{selectTask:"Select a task with a worktree",noSessions:"No sessions here \u2014 press \u23CE to start {engine}, or ctrl+e to pick another",noSessionsShell:"No sessions here \u2014 press \u23CE to start a shell, or ctrl+e to pick another",remoteUnsupported:"Hosted engine launch over SSH is not implemented \u2014 this task's worktree is on {host}"},welcome:{title:"Welcome to Rove",tagline:"Run several AI coding sessions side by side \u2014 use managed tasks for isolated worktrees.",worktreeExplain:"Managed tasks create isolated worktrees and branches. Directory and project tasks reuse existing files; tabs within a task share its directory.",stepNew:"creates your first task \u2014 pick a repo, a base branch, an engine",stepHelp:"shows every shortcut reachable from the current focus",stepPrefix:"opens the command menu",enginesFound:"\u2713 engines: {list}",enginesSignedOut:"\u2717 installed but not signed in: {list} \u2014 run one of them in a shell and log in",enginesMissing:"\u2717 no engine CLI found \u2014 install claude, codex, copilot, or kimi, then restart Rove",gitMissing:"\u2717 git not found on PATH \u2014 Rove needs git to create worktrees",doctorHint:"run `rove doctor` in a shell for the full diagnosis",docsHint:"docs: https://docs.rove.run"},attention:{none:"No available Inbox items"},inbox:{title:"INBOX",empty:"No pending attention",openHint:"enter open",clearHint:"d ack",clearAllHint:"D ack all",more:"+{count} more",section:{attention:"ATTENTION",recent:"RECENT"},state:{done:"done",needsInput:"needs input",error:"error",rateLimited:"rate limited",running:"running",dead:"engine exited",routineFailed:"routine needs you",reportMissing:"report missing",decisionNeeded:"decision needed",gateAnswered:"answered \xB7 engine not running"},resumesAt:"resumes {time}"}},zh27={quit:{confirmTitle:"\u9000\u51FA Rove\uFF1F",confirmBody:"\u5B88\u62A4\u8FDB\u7A0B\u548C\u4EFB\u52A1\u4F1A\u8BDD\u4F1A\u7EE7\u7EED\u8FD0\u884C\uFF0C\u8FD9\u91CC\u53EA\u5173\u95ED\u539F\u751F\u5DE5\u4F5C\u533A\u3002",confirmLabel:"\u9000\u51FA"},narrowBack:"\u4EFB\u52A1",empty:{selectTask:"\u8BF7\u9009\u62E9\u4E00\u4E2A\u5E26 worktree \u7684\u4EFB\u52A1",noSessions:"\u8FD9\u91CC\u6CA1\u6709\u4F1A\u8BDD\u2014\u2014\u6309 \u23CE \u542F\u52A8 {engine}\uFF0C\u6216\u6309 ctrl+e \u53E6\u9009\u4E00\u4E2A",noSessionsShell:"\u8FD9\u91CC\u6CA1\u6709\u4F1A\u8BDD\u2014\u2014\u6309 \u23CE \u542F\u52A8 shell\uFF0C\u6216\u6309 ctrl+e \u53E6\u9009\u4E00\u4E2A",remoteUnsupported:"\u5C1A\u672A\u5B9E\u73B0\u901A\u8FC7 SSH \u542F\u52A8\u6258\u7BA1\u5F15\u64CE\u2014\u2014\u8BE5\u4EFB\u52A1\u7684 worktree \u5728 {host} \u4E0A"},welcome:{title:"\u6B22\u8FCE\u4F7F\u7528 Rove",tagline:"\u5E76\u884C\u8FD0\u884C\u591A\u4E2A AI \u7F16\u7801\u4F1A\u8BDD\u2014\u2014\u4F7F\u7528\u6258\u7BA1\u4EFB\u52A1\u83B7\u5F97\u72EC\u7ACB\u7684 worktree\u3002",worktreeExplain:"\u6258\u7BA1\u4EFB\u52A1\u521B\u5EFA\u72EC\u7ACB\u7684 worktree \u548C\u5206\u652F\u3002\u76EE\u5F55\u4E0E\u9879\u76EE\u4EFB\u52A1\u590D\u7528\u73B0\u6709\u6587\u4EF6\uFF1B\u540C\u4E00\u4EFB\u52A1\u5185\u7684\u6807\u7B7E\u9875\u5171\u4EAB\u76EE\u5F55\u3002",stepNew:"\u521B\u5EFA\u4F60\u7684\u7B2C\u4E00\u4E2A\u4EFB\u52A1\u2014\u2014\u9009\u4ED3\u5E93\u3001\u57FA\u7840\u5206\u652F\u548C\u5F15\u64CE",stepHelp:"\u67E5\u770B\u5F53\u524D\u7126\u70B9\u4E0B\u7684\u5168\u90E8\u5FEB\u6377\u952E",stepPrefix:"\u6253\u5F00\u547D\u4EE4\u83DC\u5355",enginesFound:"\u2713 \u5DF2\u68C0\u6D4B\u5230\u5F15\u64CE:{list}",enginesSignedOut:"\u2717 \u5DF2\u5B89\u88C5\u4F46\u672A\u767B\u5F55:{list}\u2014\u2014\u8BF7\u5728 shell \u91CC\u8FD0\u884C\u5176\u4E2D\u4E4B\u4E00\u5E76\u5B8C\u6210\u767B\u5F55",enginesMissing:"\u2717 \u672A\u627E\u5230\u5F15\u64CE CLI\u2014\u2014\u8BF7\u5B89\u88C5 claude\u3001codex\u3001copilot \u6216 kimi \u540E\u91CD\u542F Rove",gitMissing:"\u2717 PATH \u4E0A\u6CA1\u6709 git\u2014\u2014Rove \u9700\u8981 git \u6765\u521B\u5EFA worktree",doctorHint:"\u5728 shell \u91CC\u8FD0\u884C `rove doctor` \u67E5\u770B\u5B8C\u6574\u8BCA\u65AD",docsHint:"\u6587\u6863:https://docs.rove.run"},attention:{none:"\u6536\u4EF6\u7BB1\u4E2D\u6CA1\u6709\u53EF\u6253\u5F00\u7684\u9879\u76EE"},inbox:{title:"\u6536\u4EF6\u7BB1",empty:"\u6682\u65E0\u5F85\u5904\u7406",openHint:"enter \u6253\u5F00",clearHint:"d \u5DF2\u9605",clearAllHint:"D \u5168\u90E8\u5DF2\u9605",more:"\u8FD8\u6709 {count} \u6761",section:{attention:"\u5F85\u5904\u7406",recent:"\u6700\u8FD1\u4F7F\u7528"},state:{done:"\u5B8C\u6210",needsInput:"\u9700\u8981\u8F93\u5165",error:"\u51FA\u9519",rateLimited:"\u9650\u6D41",running:"\u8FDB\u884C\u4E2D",dead:"\u5F15\u64CE\u5DF2\u9000\u51FA",routineFailed:"\u4F8B\u884C\u4EFB\u52A1\u9700\u8981\u5904\u7406",reportMissing:"\u672A\u56DE\u62A5",decisionNeeded:"\u7B49\u4F60\u51B3\u5B9A",gateAnswered:"\u5DF2\u56DE\u7B54 \xB7 \u5F15\u64CE\u672A\u8FD0\u884C"},resumesAt:"{time} \u6062\u590D"}};var en28={title:"Worktrees",loading:"Loading worktrees\u2026",noProjects:"No local projects known to Rove yet.",noWorktrees:"No worktrees.",badge:{roveManaged:"rove",dirty:"dirty",dirtyUnknown:"dirty?",remoteOn:"on remote",remoteOff:"not pushed",remoteUnknown:"remote unknown"},verdict:{prOpen:"PR open",prMerged:"merged (PR)",inMain:"in main",prClosed:"PR closed",idle:"stale"},row:{detached:"(detached)",created:"created {age} ago"},delete:{button:"Delete",confirmTitle:"Delete worktree?",confirmBody:'Delete the worktree for "{branch}"? This removes the working directory; the branch itself is kept.',forceTitle:"Force delete worktree?",forceBody:'"{branch}" has uncommitted, untracked, or gitignored work. Force delete removes the worktree, but the work is snapshotted first to a salvage ref \u2014 list them with `git for-each-ref refs/rove/salvage`. Force delete anyway?',forceReason:"Refused because: {reason}",failed:"Failed to delete worktree: {error}",residue:"Git deregistered the worktree, but couldn't delete {path} ({reason}). Rove is done with it \u2014 retrying won't help; delete the directory by hand if you want the space."},land:{button:"Land",confirmTitle:"Land branch?",confirmBody:'Merge "{branch}" into {landedOn} ({commits} commits), then remove this worktree? The branch is kept. Conflicts abort with a file list.',confirmBodyOne:'Merge "{branch}" into {landedOn} (1 commit), then remove this worktree? The branch is kept. Conflicts abort with a file list.',noTask:"This worktree isn't tracked as a Rove task \u2014 nothing to land.",conflict:"Land hit conflicts (merge aborted). Resolve by hand: {files}",dirtyBase:"The base checkout has uncommitted changes \u2014 commit them, then land. Never `git stash` here: the stash stack lives in the repo's common dir and is shared by every linked worktree, so a stash can entangle other tasks' work.",failed:"Land failed: {error}",done:'Landed "{branch}" onto {landedOn} ({commit}).',worktreeKept:"Landed, but the worktree was kept: {reason}",worktreePathStale:"Landed and removed the worktree, but the task still points at it: {reason}",worktreeResidue:"Landed. Git deregistered the worktree, but couldn't delete {path} ({reason}) \u2014 delete the directory by hand if you want the space."},hint:{}},zh28={title:"\u5DE5\u4F5C\u6811",loading:"\u6B63\u5728\u52A0\u8F7D worktree\u2026",noProjects:"Rove \u8FD8\u6CA1\u6709\u5DF2\u77E5\u7684\u672C\u5730\u9879\u76EE\u3002",noWorktrees:"\u6CA1\u6709 worktree\u3002",badge:{roveManaged:"rove",dirty:"\u6709\u6539\u52A8",dirtyUnknown:"\u6539\u52A8\u672A\u77E5",remoteOn:"\u5DF2\u63A8\u9001",remoteOff:"\u672A\u63A8\u9001",remoteUnknown:"\u8FDC\u7AEF\u672A\u77E5"},verdict:{prOpen:"PR \u8BC4\u5BA1\u4E2D",prMerged:"\u5DF2\u5408\u5165 (PR)",inMain:"\u5DF2\u5728\u4E3B\u5206\u652F",prClosed:"PR \u5DF2\u5173\u95ED",idle:"\u9648\u65E7"},row:{detached:"(\u6E38\u79BB\u72B6\u6001)",created:"{age}\u524D\u521B\u5EFA"},delete:{button:"\u5220\u9664",confirmTitle:"\u5220\u9664 worktree\uFF1F",confirmBody:'\u786E\u5B9A\u5220\u9664 "{branch}" \u5BF9\u5E94\u7684 worktree\uFF1F\u5DE5\u4F5C\u76EE\u5F55\u4F1A\u88AB\u79FB\u9664\uFF0C\u5206\u652F\u672C\u8EAB\u4F1A\u4FDD\u7559\u3002',forceTitle:"\u5F3A\u5236\u5220\u9664 worktree\uFF1F",forceBody:'"{branch}" \u5B58\u5728\u672A\u63D0\u4EA4\u3001\u672A\u8DDF\u8E2A\u6216\u88AB gitignore \u7684\u6539\u52A8\u3002\u5F3A\u5236\u5220\u9664\u4F1A\u79FB\u9664 worktree\uFF0C\u4F46\u8FD9\u4E9B\u6539\u52A8\u4F1A\u5148\u88AB\u5FEB\u7167\u5230\u4E00\u4E2A salvage ref\u2014\u2014\u7528 `git for-each-ref refs/rove/salvage` \u53EF\u4EE5\u5217\u51FA\u5B83\u4EEC\u3002\u4ECD\u8981\u5F3A\u5236\u5220\u9664\u5417\uFF1F',forceReason:"\u62D2\u7EDD\u539F\u56E0\uFF1A{reason}",failed:"\u5220\u9664 worktree \u5931\u8D25\uFF1A{error}",residue:"Git \u5DF2\u6CE8\u9500\u8BE5 worktree\uFF0C\u4F46\u6CA1\u80FD\u5220\u6389 {path}\uFF08{reason}\uFF09\u3002Rove \u8FD9\u8FB9\u5DF2\u7ECF\u5904\u7406\u5B8C\u4E86\u2014\u2014\u91CD\u8BD5\u6CA1\u6709\u7528\uFF1B\u60F3\u8981\u56DE\u78C1\u76D8\u7A7A\u95F4\u8BF7\u624B\u52A8\u5220\u9664\u8BE5\u76EE\u5F55\u3002"},land:{button:"\u5408\u5165",confirmTitle:"\u5408\u5165\u5206\u652F\uFF1F",confirmBody:'\u628A "{branch}" \u5408\u5165 {landedOn}\uFF08{commits} \u4E2A\u63D0\u4EA4\uFF09\uFF0C\u7136\u540E\u79FB\u9664\u8FD9\u4E2A worktree\uFF1F\u5206\u652F\u4F1A\u4FDD\u7559\u3002\u51B2\u7A81\u4F1A\u4E2D\u6B62\u5E76\u7ED9\u51FA\u6587\u4EF6\u6E05\u5355\u3002',confirmBodyOne:'\u628A "{branch}" \u5408\u5165 {landedOn}\uFF081 \u4E2A\u63D0\u4EA4\uFF09\uFF0C\u7136\u540E\u79FB\u9664\u8FD9\u4E2A worktree\uFF1F\u5206\u652F\u4F1A\u4FDD\u7559\u3002\u51B2\u7A81\u4F1A\u4E2D\u6B62\u5E76\u7ED9\u51FA\u6587\u4EF6\u6E05\u5355\u3002',noTask:"\u8BE5 worktree \u672A\u4F5C\u4E3A Rove \u4EFB\u52A1\u88AB\u8DDF\u8E2A\u2014\u2014\u6CA1\u6709\u53EF\u5408\u5165\u7684\u5BF9\u8C61\u3002",conflict:"\u5408\u5165\u9047\u5230\u51B2\u7A81\uFF08\u5DF2\u4E2D\u6B62\uFF09\u3002\u8BF7\u624B\u52A8\u89E3\u51B3\uFF1A{files}",dirtyBase:"\u57FA\u7840\u68C0\u51FA\u6709\u672A\u63D0\u4EA4\u6539\u52A8\u2014\u2014\u8BF7\u5148\u63D0\u4EA4\u518D\u5408\u5165\u3002\u7EDD\u4E0D\u8981\u5728\u8FD9\u91CC `git stash`\uFF1Astash \u6808\u5B58\u653E\u5728\u4ED3\u5E93\u7684 common dir \u4E2D\uFF0C\u8BE5\u4ED3\u5E93\u6240\u6709 linked worktree \u5171\u4EAB\uFF0C\u4E00\u6B21 stash \u53EF\u80FD\u7EA0\u7F20\u5176\u4ED6\u4EFB\u52A1\u7684\u5DE5\u4F5C\u3002",failed:"\u5408\u5165\u5931\u8D25\uFF1A{error}",done:'\u5DF2\u628A "{branch}" \u5408\u5165 {landedOn}\uFF08{commit}\uFF09\u3002',worktreeKept:"\u5DF2\u5408\u5165\uFF0C\u4F46 worktree \u4FDD\u7559\u4E86\uFF1A{reason}",worktreePathStale:"\u5DF2\u5408\u5165\u5E76\u79FB\u9664 worktree\uFF0C\u4F46\u4EFB\u52A1\u4ECD\u6307\u5411\u5B83\uFF1A{reason}",worktreeResidue:"\u5DF2\u5408\u5165\u3002Git \u5DF2\u6CE8\u9500\u8BE5 worktree\uFF0C\u4F46\u6CA1\u80FD\u5220\u6389 {path}\uFF08{reason}\uFF09\u2014\u2014\u60F3\u8981\u56DE\u78C1\u76D8\u7A7A\u95F4\u8BF7\u624B\u52A8\u5220\u9664\u8BE5\u76EE\u5F55\u3002"},hint:{}};var en29={settings:en20,tasks:en23,terminal:en24,files:en4,newTask:en11,onboarding:en12,ops:en13,update:en25,quickTask:en14,help:en6,hints:en7,common:en2,keys:en9,workspace:en27,worktrees:en28,kanban:en8,automations:en,workItems:en26,gates:en5,doctor:en3,mods:en10,search:en15},zh29={settings:zh20,tasks:zh23,terminal:zh24,files:zh4,newTask:zh11,onboarding:zh12,ops:zh13,update:zh25,quickTask:zh14,help:zh6,hints:zh7,common:zh2,keys:zh9,workspace:zh27,worktrees:zh28,kanban:zh8,automations:zh,workItems:zh26,gates:zh5,doctor:zh3,mods:zh10,search:zh15},LOCALES=[{id:"en",label:"English",intl:"en-US"},{id:"zh",label:"\u4E2D\u6587",intl:"zh-CN"}],CATALOGS={en:en29,zh:zh29},DEFAULT_LOCALE="en";function isLocaleId(value){return typeof value==="string"&&LOCALES.some((l)=>l.id===value)}
7
7
  export{LOCALES,CATALOGS,DEFAULT_LOCALE,isLocaleId};
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{awaitEngineProcess,deliverToHostedKey,enginePresence,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,isHostedTaskKey,killHostedSessions,listHostedSessions,listHostedSessionsOrNull,openHostedSessionHost,pastePromptWhenEngineUp,readPersistedTerminalDefaultColors,sessionArgvNamesEngine}from"./chunk-vx44yxra.js";import{engineTabArgv,readTabsSnapshot}from"./chunk-1a57ejnh.js";import{buildEngineSessionLaunch,initMarkerSaysFinished}from"./chunk-qecygh3f.js";import{engineLaunchArgv}from"./chunk-rjq38twt.js";import{ApiError}from"./chunk-r5j8fycq.js";import{engineProcessIn,parsePsSnapshot,psSnapshot,vendorFromArgv}from"./chunk-5rgrde6b.js";import{basename}from"path";async function countLiveEngineSessions(sessions,snapshot=psSnapshot){let tabs=sessions.filter((s)=>s.alive&&s.key.split("::").length===2);if(!tabs.length)return 0;let rows;try{if(rows=parsePsSnapshot(await snapshot(tabs.flatMap((s)=>s.pid?[s.pid]:[]))),!rows.length)return tabs.length}catch{return tabs.length}return tabs.filter((s)=>{if(!s.pid)return!0;let root=rows.find((row)=>row.pid===s.pid);if(!root)return!0;if(engineProcessIn(rows,s.pid)||vendorFromArgv(root.args))return!0;let[taskId,tabId]=s.key.split("::"),labelled=readTabsSnapshot(taskId)?.tabs.some((tab)=>tab.id===tabId&&tab.kind==="engine");if(tabId!=="tab-1"&&!labelled&&!sessionArgvNamesEngine(s.command))return!1;let executable=basename(root.args.split(/\s+/)[0]).toLowerCase().replace(/^-/,"").replace(/\.exe$/,"");if(["sh","bash","zsh","fish","dash","ash","ksh","mksh"].includes(executable))return/^\S+\s+-[a-zA-Z]*c\b/.test(root.args);return!0}).length}async function openAdmittedEngine(rpc,spec,opts){let limit=opts.maxLiveEngines;if(limit===void 0)return rpc.request("pty.open",spec);for(let attempt=0;attempt<20;attempt++){let{sessions,admissionToken}=await rpc.request("pty.list",{});if(typeof admissionToken!=="string")throw new ApiError("the PTY host must be updated before enforcing engine.maxLiveSessions","ENGINE_ADMISSION_UNAVAILABLE",{taskId:opts.taskId,hint:"the running PTY host predates atomic admission; update and restart the PTY host before retrying",nextCommandArgs:opts.retryArgs});let live=await countLiveEngineSessions(sessions,opts.snapshot);if(!sessions.some((s)=>s.key===spec.key&&s.alive)&&live>=limit)throw new ApiError(`${live} engine sessions are already running (engine.maxLiveSessions is ${limit})`,"ENGINE_LIMIT",{taskId:opts.taskId,live,limit,hint:"wait for an engine to finish or close a tab, then retry; raise engine.maxLiveSessions in state.json to allow more",nextCommandArgs:opts.retryArgs});let result=await rpc.request("pty.openChecked",{...spec,admissionToken});if(result.kind==="opened")return result.open}throw new ApiError("PTY inventory kept changing during engine admission; retry the send","ENGINE_ADMISSION_BUSY",{taskId:opts.taskId,nextCommandArgs:opts.retryArgs})}function restoredTabsOf(sessions,taskId,exceptKey){let prefix=`${taskId}::`,ids=[];for(let s of sessions){if(s.alive||s.restored!==!0||s.key===exceptKey||!s.key.startsWith(prefix))continue;let tab=s.key.slice(prefix.length);if(tab.includes("::"))continue;if(!ids.includes(tab))ids.push(tab)}let tabs=readTabsSnapshot(taskId)?.tabs??[];return ids.map((tab)=>{let sessionId=tabs.find((t)=>t.id===tab)?.sessionId;return sessionId?{tab,sessionId}:{tab}})}function tabEngineBase(task,tab){return engineLaunchArgv({command:tab.engineCommand??(tab.vendor?void 0:task.command),vendor:tab.vendor??task.vendor,effort:task.modelEffort,model:tab.engineCommand||tab.vendor?void 0:task.model})}function restoredTabLaunch(task,tabId,worktreePath,shell){let tab=readTabsSnapshot(task.id)?.tabs.find((t)=>t.id===tabId&&t.kind==="engine");if(!tab)return null;return buildEngineSessionLaunch({task:{id:task.id,kind:task.kind??"task",vendor:tab.vendor??task.vendor,repo:task.repo,repos:task.repos},worktreePath,shell,argv:engineTabArgv(tab,tabEngineBase(task,tab),!1,task.vendor),promptIntent:{kind:"none"},tabId})}var isTaskKey=isHostedTaskKey,findEngineKey=findHostedEngineKey,taskKeys=hostedTaskKeys,openPtyHost=openHostedSessionHost,ensurePtyHost=ensureHostedSessionHost,listSessions=listHostedSessions,listSessionsOrNull=listHostedSessionsOrNull,deliverToKey=deliverToHostedKey,ENGINE_START_PROBE_MS=3000,ENGINE_START_POLL_MS=150,ENGINE_NOT_OBSERVED_REASON=`no engine process appeared in the session within ${ENGINE_START_PROBE_MS}ms`;function outcomeFields(outcome){if(!outcome)return{engineReady:!1,delivered:!1};return{engineReady:outcome.ready,delivered:!0,bytes:outcome.bytes,promptEcho:outcome.confirmed?"confirmed":"unconfirmed"}}async function deliverHostedPrompt(rpc,target,cwd,prompt,launch,opts){let{sessions=[]}=await rpc.request("pty.list",{}),existingKey=findEngineKey(sessions,target.id,target.engineBin,target.scope);if(existingKey){let pid=sessions.find((s)=>s.key===existingKey)?.pid,presence=await enginePresence(pid,target.engineBin,opts?.snapshot);if(presence.kind==="unknown")throw new ApiError(`could not read the process table, so task ${target.id}'s engine tab (${existingKey}) could not be checked for a live engine`,"ENGINE_PROBE_FAILED",{hint:"the `ps` probe failed or timed out; retry, or check the machine's process table",nextCommandArgs:["api","pty-list"]});if(presence.kind!=="engine")throw new ApiError(`task ${target.id}'s engine tab (${existingKey}) has no live engine process \u2014 its engine exited into a plain shell`,"ENGINE_NOT_RUNNING",{hint:"spawn a fresh engine tab for this prompt with --tab new",nextCommandArgs:["api","send","--task-id",target.id,"--tab","new","--plain","--prompt",prompt]});let outcome=await deliverToKey(rpc,existingKey,prompt,{vendor:presence.vendor});return{session:existingKey,pane:existingKey,started:!1,...outcomeFields(outcome)}}let aliveTabs=sessions.filter((s)=>s.alive&&isTaskKey(s.key,target.id)).map((s)=>s.key);if(aliveTabs.length>0&&!target.firstConversation)throw new ApiError(`task ${target.id} has live tabs (${aliveTabs.join(", ")}) but none resolves as its engine tab \u2014 refusing to spawn a new engine`,"NO_ENGINE_TAB",{hint:"address a live engine tab explicitly with --tab <tab-N> (see pty-list), or start another conversation with --tab new",nextCommandArgs:["api","pty-list"]});let frozen=restoredTabsOf(sessions,target.id,launch.key),disclose=frozen.length>0?{frozenTabs:frozen}:{},staleCanonical=sessions.find((session)=>session.key===launch.key&&!session.alive);if(staleCanonical&&staleCanonical.restored!==!0)await rpc.request("pty.kill",{key:launch.key});let open=await openAdmittedEngine(rpc,{key:launch.key,cwd,command:launch.command,defaultColors:readPersistedTerminalDefaultColors()},{maxLiveEngines:opts?.maxLiveEngines,snapshot:opts?.snapshot,taskId:target.id,retryArgs:opts?.retryArgs??["api","send","--task-id",target.id,"--plain","--prompt",prompt]});try{if(!open.alive)return{session:launch.key,pane:launch.key,started:open.created!==!1||open.respawned===!0,engineReady:!1,delivered:!1,...disclose};if(launch.firstMessage){let outcome=await pastePromptWhenEngineUp(rpc,launch.key,target.engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs});return{session:launch.key,pane:launch.key,started:open.created!==!1||open.respawned===!0,...outcomeFields(outcome),...disclose}}let started=open.created!==!1||open.respawned===!0;if(open.created===!1&&open.respawned!==!0){let outcome=await pastePromptWhenEngineUp(rpc,launch.key,target.engineBin,prompt,{snapshot:opts?.snapshot});return{session:launch.key,pane:launch.key,started,...outcomeFields(outcome),...disclose}}let pendingInit={session:launch.key,pane:launch.key,started,engineReady:!1,delivered:!0,reason:"repo init script is still running; the engine has not started yet",...disclose};if(launch.initMarkerPath&&!initMarkerSaysFinished(launch.initMarkerPath))return pendingInit;if(await awaitEngineProcess(rpc,launch.key,target.engineBin,{timeoutMs:ENGINE_START_PROBE_MS,intervalMs:ENGINE_START_POLL_MS,snapshot:opts?.snapshot})===null){if(launch.initMarkerPath&&!initMarkerSaysFinished(launch.initMarkerPath)&&(await listSessions(rpc)).some((session)=>session.key===launch.key&&session.alive)&&!initMarkerSaysFinished(launch.initMarkerPath))return pendingInit;return{session:launch.key,pane:launch.key,started,engineReady:!1,delivered:!1,reason:await hostedSessionFailureLine(rpc,launch.key)??ENGINE_NOT_OBSERVED_REASON,...disclose}}return{session:launch.key,pane:launch.key,started,engineReady:!0,delivered:!0,...disclose}}finally{await rpc.request("pty.detach",{key:launch.key}).catch(()=>{})}}var killTaskSessions=killHostedSessions;
2
+ import{awaitEngineProcess,deliverToHostedKey,enginePresence,ensureHostedSessionHost,findHostedEngineKey,hostedSessionFailureLine,hostedTaskKeys,isHostedTaskKey,killHostedSessions,listHostedSessions,listHostedSessionsOrNull,openHostedSessionHost,pastePromptWhenEngineUp,readPersistedTerminalDefaultColors,sessionArgvNamesEngine}from"./chunk-t2418v0z.js";import{engineTabArgv,readTabsSnapshot}from"./chunk-za8pnw78.js";import{buildEngineSessionLaunch,initMarkerSaysFinished}from"./chunk-qecygh3f.js";import{engineLaunchArgv}from"./chunk-rjq38twt.js";import{ApiError}from"./chunk-r5j8fycq.js";import{engineProcessIn,parsePsSnapshot,psSnapshot,vendorFromArgv}from"./chunk-5rgrde6b.js";import{basename}from"path";async function countLiveEngineSessions(sessions,snapshot=psSnapshot){let tabs=sessions.filter((s)=>s.alive&&s.key.split("::").length===2);if(!tabs.length)return 0;let rows;try{if(rows=parsePsSnapshot(await snapshot(tabs.flatMap((s)=>s.pid?[s.pid]:[]))),!rows.length)return tabs.length}catch{return tabs.length}return tabs.filter((s)=>{if(!s.pid)return!0;let root=rows.find((row)=>row.pid===s.pid);if(!root)return!0;if(engineProcessIn(rows,s.pid)||vendorFromArgv(root.args))return!0;let[taskId,tabId]=s.key.split("::"),labelled=readTabsSnapshot(taskId)?.tabs.some((tab)=>tab.id===tabId&&tab.kind==="engine");if(tabId!=="tab-1"&&!labelled&&!sessionArgvNamesEngine(s.command))return!1;let executable=basename(root.args.split(/\s+/)[0]).toLowerCase().replace(/^-/,"").replace(/\.exe$/,"");if(["sh","bash","zsh","fish","dash","ash","ksh","mksh"].includes(executable))return/^\S+\s+-[a-zA-Z]*c\b/.test(root.args);return!0}).length}async function openAdmittedEngine(rpc,spec,opts){let limit=opts.maxLiveEngines;if(limit===void 0)return rpc.request("pty.open",spec);for(let attempt=0;attempt<20;attempt++){let{sessions,admissionToken}=await rpc.request("pty.list",{});if(typeof admissionToken!=="string")throw new ApiError("the PTY host must be updated before enforcing engine.maxLiveSessions","ENGINE_ADMISSION_UNAVAILABLE",{taskId:opts.taskId,hint:"the running PTY host predates atomic admission; update and restart the PTY host before retrying",nextCommandArgs:opts.retryArgs});let live=await countLiveEngineSessions(sessions,opts.snapshot);if(!sessions.some((s)=>s.key===spec.key&&s.alive)&&live>=limit)throw new ApiError(`${live} engine sessions are already running (engine.maxLiveSessions is ${limit})`,"ENGINE_LIMIT",{taskId:opts.taskId,live,limit,hint:"wait for an engine to finish or close a tab, then retry; raise engine.maxLiveSessions in state.json to allow more",nextCommandArgs:opts.retryArgs});let result=await rpc.request("pty.openChecked",{...spec,admissionToken});if(result.kind==="opened")return result.open}throw new ApiError("PTY inventory kept changing during engine admission; retry the send","ENGINE_ADMISSION_BUSY",{taskId:opts.taskId,nextCommandArgs:opts.retryArgs})}function restoredTabsOf(sessions,taskId,exceptKey){let prefix=`${taskId}::`,ids=[];for(let s of sessions){if(s.alive||s.restored!==!0||s.key===exceptKey||!s.key.startsWith(prefix))continue;let tab=s.key.slice(prefix.length);if(tab.includes("::"))continue;if(!ids.includes(tab))ids.push(tab)}let tabs=readTabsSnapshot(taskId)?.tabs??[];return ids.map((tab)=>{let sessionId=tabs.find((t)=>t.id===tab)?.sessionId;return sessionId?{tab,sessionId}:{tab}})}function tabEngineBase(task,tab){return engineLaunchArgv({command:tab.engineCommand??(tab.vendor?void 0:task.command),vendor:tab.vendor??task.vendor,effort:task.modelEffort,model:tab.engineCommand||tab.vendor?void 0:task.model})}function restoredTabLaunch(task,tabId,worktreePath,shell){let tab=readTabsSnapshot(task.id)?.tabs.find((t)=>t.id===tabId&&t.kind==="engine");if(!tab)return null;return buildEngineSessionLaunch({task:{id:task.id,kind:task.kind??"task",vendor:tab.vendor??task.vendor,repo:task.repo,repos:task.repos},worktreePath,shell,argv:engineTabArgv(tab,tabEngineBase(task,tab),!1,task.vendor),promptIntent:{kind:"none"},tabId})}var isTaskKey=isHostedTaskKey,findEngineKey=findHostedEngineKey,taskKeys=hostedTaskKeys,openPtyHost=openHostedSessionHost,ensurePtyHost=ensureHostedSessionHost,listSessions=listHostedSessions,listSessionsOrNull=listHostedSessionsOrNull,deliverToKey=deliverToHostedKey,ENGINE_START_PROBE_MS=3000,ENGINE_START_POLL_MS=150,ENGINE_NOT_OBSERVED_REASON=`no engine process appeared in the session within ${ENGINE_START_PROBE_MS}ms`;function outcomeFields(outcome){if(!outcome)return{engineReady:!1,delivered:!1};return{engineReady:outcome.ready,delivered:!0,bytes:outcome.bytes,promptEcho:outcome.confirmed?"confirmed":"unconfirmed"}}async function deliverHostedPrompt(rpc,target,cwd,prompt,launch,opts){let{sessions=[]}=await rpc.request("pty.list",{}),existingKey=findEngineKey(sessions,target.id,target.engineBin,target.scope);if(existingKey){let pid=sessions.find((s)=>s.key===existingKey)?.pid,presence=await enginePresence(pid,target.engineBin,opts?.snapshot);if(presence.kind==="unknown")throw new ApiError(`could not read the process table, so task ${target.id}'s engine tab (${existingKey}) could not be checked for a live engine`,"ENGINE_PROBE_FAILED",{hint:"the `ps` probe failed or timed out; retry, or check the machine's process table",nextCommandArgs:["api","pty-list"]});if(presence.kind!=="engine")throw new ApiError(`task ${target.id}'s engine tab (${existingKey}) has no live engine process \u2014 its engine exited into a plain shell`,"ENGINE_NOT_RUNNING",{hint:"spawn a fresh engine tab for this prompt with --tab new",nextCommandArgs:["api","send","--task-id",target.id,"--tab","new","--plain","--prompt",prompt]});let outcome=await deliverToKey(rpc,existingKey,prompt,{vendor:presence.vendor});return{session:existingKey,pane:existingKey,started:!1,...outcomeFields(outcome)}}let aliveTabs=sessions.filter((s)=>s.alive&&isTaskKey(s.key,target.id)).map((s)=>s.key);if(aliveTabs.length>0&&!target.firstConversation)throw new ApiError(`task ${target.id} has live tabs (${aliveTabs.join(", ")}) but none resolves as its engine tab \u2014 refusing to spawn a new engine`,"NO_ENGINE_TAB",{hint:"address a live engine tab explicitly with --tab <tab-N> (see pty-list), or start another conversation with --tab new",nextCommandArgs:["api","pty-list"]});let frozen=restoredTabsOf(sessions,target.id,launch.key),disclose=frozen.length>0?{frozenTabs:frozen}:{},staleCanonical=sessions.find((session)=>session.key===launch.key&&!session.alive);if(staleCanonical&&staleCanonical.restored!==!0)await rpc.request("pty.kill",{key:launch.key});let open=await openAdmittedEngine(rpc,{key:launch.key,cwd,command:launch.command,defaultColors:readPersistedTerminalDefaultColors()},{maxLiveEngines:opts?.maxLiveEngines,snapshot:opts?.snapshot,taskId:target.id,retryArgs:opts?.retryArgs??["api","send","--task-id",target.id,"--plain","--prompt",prompt]});try{if(!open.alive)return{session:launch.key,pane:launch.key,started:open.created!==!1||open.respawned===!0,engineReady:!1,delivered:!1,...disclose};if(launch.firstMessage){let outcome=await pastePromptWhenEngineUp(rpc,launch.key,target.engineBin,launch.firstMessage,{initMarkerPath:launch.initMarkerPath,initTimeoutMs:launch.initTimeoutMs});return{session:launch.key,pane:launch.key,started:open.created!==!1||open.respawned===!0,...outcomeFields(outcome),...disclose}}let started=open.created!==!1||open.respawned===!0;if(open.created===!1&&open.respawned!==!0){let outcome=await pastePromptWhenEngineUp(rpc,launch.key,target.engineBin,prompt,{snapshot:opts?.snapshot});return{session:launch.key,pane:launch.key,started,...outcomeFields(outcome),...disclose}}let pendingInit={session:launch.key,pane:launch.key,started,engineReady:!1,delivered:!0,reason:"repo init script is still running; the engine has not started yet",...disclose};if(launch.initMarkerPath&&!initMarkerSaysFinished(launch.initMarkerPath))return pendingInit;if(await awaitEngineProcess(rpc,launch.key,target.engineBin,{timeoutMs:ENGINE_START_PROBE_MS,intervalMs:ENGINE_START_POLL_MS,snapshot:opts?.snapshot})===null){if(launch.initMarkerPath&&!initMarkerSaysFinished(launch.initMarkerPath)&&(await listSessions(rpc)).some((session)=>session.key===launch.key&&session.alive)&&!initMarkerSaysFinished(launch.initMarkerPath))return pendingInit;return{session:launch.key,pane:launch.key,started,engineReady:!1,delivered:!1,reason:await hostedSessionFailureLine(rpc,launch.key)??ENGINE_NOT_OBSERVED_REASON,...disclose}}return{session:launch.key,pane:launch.key,started,engineReady:!0,delivered:!0,...disclose}}finally{await rpc.request("pty.detach",{key:launch.key}).catch(()=>{})}}var killTaskSessions=killHostedSessions;
3
3
  export{openAdmittedEngine,tabEngineBase,restoredTabLaunch,isTaskKey,findEngineKey,taskKeys,openPtyHost,ensurePtyHost,listSessions,listSessionsOrNull,deliverToKey,ENGINE_START_PROBE_MS,ENGINE_START_POLL_MS,ENGINE_NOT_OBSERVED_REASON,outcomeFields,deliverHostedPrompt,killTaskSessions};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{detectShell,installCompletions,recordWelcomeChoices,runPendingWelcomeInstalls,settleWelcomeInstall}from"./chunk-bbt217yd.js";import"./chunk-eege1x0a.js";import"./chunk-qqr4tfhk.js";import"./chunk-32j6y5d1.js";import"./chunk-a5xbsvx2.js";import"./chunk-9vwb9f7q.js";import"./chunk-cmp64q4j.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";export{settleWelcomeInstall,runPendingWelcomeInstalls,recordWelcomeChoices,installCompletions,detectShell};
2
+ import{detectShell,installCompletions,recordWelcomeChoices,runPendingWelcomeInstalls,settleWelcomeInstall}from"./chunk-97er67dc.js";import"./chunk-eege1x0a.js";import"./chunk-qqr4tfhk.js";import"./chunk-32j6y5d1.js";import"./chunk-4d5xp2p0.js";import"./chunk-b4egks20.js";import"./chunk-cmp64q4j.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";export{settleWelcomeInstall,runPendingWelcomeInstalls,recordWelcomeChoices,installCompletions,detectShell};
@@ -4,5 +4,5 @@ import{generateCompletions,isShellKind,mergeSubVerbs,shippedCompletionsPath}from
4
4
 
5
5
  ${usage}`),process.exit(2)};if(rest.some((arg)=>HELP_WORDS.includes(arg))){process.stdout.write(usage);return}let flags=rest.filter((arg)=>arg.startsWith("-")),shells=rest.filter((arg)=>!arg.startsWith("-")),unknownFlag=flags.find((flag)=>flag!=="--path"&&flag!=="--install");if(unknownFlag)fail(`unknown option "${unknownFlag}"`);if(new Set(flags).size>1)fail("--path and --install are different things; pass one");let shell=shells.length===1?shells[0]:void 0;if(!isShellKind(shell))fail(`unknown shell "${shells.join(" ")}"`);let scriptPath=shippedCompletionsPath(shell,cliName,deps.shippedDir),shipped=existsSync(scriptPath)?scriptPath:null;if(flags[0]==="--path"){if(!shipped)fail(`no pre-generated ${shell} script at ${scriptPath}
6
6
  ${cliName} completions ${shell} # print the script to stdout instead`);process.stdout.write(`${shipped}
7
- `);return}if(flags[0]==="--install"){let[{installCompletions,settleWelcomeInstall},{t}]=await Promise.all([import("./chunk-bm6qhcck.js"),import("./chunk-kt5ngemc.js")]),completion=installCompletions(shell,deps.home,cliName,shipped);settleWelcomeInstall("completions",shell);let line=completion.installed?"onboarding.appliedCompletions":"onboarding.keptCompletions";process.stdout.write(`${t(line,{path:completion.path})}
8
- `);return}if(shipped){process.stdout.write(readFileSync(shipped,"utf8"));return}let{API_VERBS}=await import("./chunk-453qpfae.js");process.stdout.write(generateCompletions(shell,cliName,mergeSubVerbs(API_VERBS)))}export{runCompletionsSubcommand};
7
+ `);return}if(flags[0]==="--install"){let[{installCompletions,settleWelcomeInstall},{t}]=await Promise.all([import("./chunk-h0wp2ghf.js"),import("./chunk-0mr6cckm.js")]),completion=installCompletions(shell,deps.home,cliName,shipped);settleWelcomeInstall("completions",shell);let line=completion.installed?"onboarding.appliedCompletions":"onboarding.keptCompletions";process.stdout.write(`${t(line,{path:completion.path})}
8
+ `);return}if(shipped){process.stdout.write(readFileSync(shipped,"utf8"));return}let{API_VERBS}=await import("./chunk-y8n6trr4.js");process.stdout.write(generateCompletions(shell,cliName,mergeSubVerbs(API_VERBS)))}export{runCompletionsSubcommand};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-nc46gddg.js";import{__require}from"./chunk-91sykzqq.js";import{existsSync}from"fs";import{join}from"path";function webRoot(){return[join(import.meta.dir,"..","web"),join(import.meta.dir,"..","..","..","rove-web","dist")].find((dir)=>existsSync(join(dir,"index.html")))??null}async function runWebSubcommand(args){let root=webRoot();if(!root)console.error(`${ROVE_PRODUCT_NAME} --web: the browser client is not in this build. From a checkout, run \`bun --filter rove-web build\` first; the npm package ships it in dist/web.`),process.exit(2);let{runBridge}=await import("./chunk-hmy01yg2.js");await runBridge(args,{name:`${ROVE_PRODUCT_NAME} --web`,web:{root}})}export{runWebSubcommand};
2
+ import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-nc46gddg.js";import{__require}from"./chunk-91sykzqq.js";import{existsSync}from"fs";import{join}from"path";function webRoot(){return[join(import.meta.dir,"..","web"),join(import.meta.dir,"..","..","..","rove-web","dist")].find((dir)=>existsSync(join(dir,"index.html")))??null}async function runWebSubcommand(args){let root=webRoot();if(!root)console.error(`${ROVE_PRODUCT_NAME} --web: the browser client is not in this build. From a checkout, run \`bun --filter rove-web build\` first; the npm package ships it in dist/web.`),process.exit(2);let{runBridge}=await import("./chunk-3xz0dmnc.js");await runBridge(args,{name:`${ROVE_PRODUCT_NAME} --web`,web:{root}})}export{runWebSubcommand};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{isPathLikeArg,runOpenDirectory}from"./chunk-j5y7hhc2.js";import"./chunk-2r1fgng9.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-pn5ygqn6.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";export{runOpenDirectory,isPathLikeArg};
2
+ import{isPathLikeArg,runOpenDirectory}from"./chunk-9q8wwfs1.js";import"./chunk-2r1fgng9.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-pn5ygqn6.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-91sykzqq.js";export{runOpenDirectory,isPathLikeArg};
@@ -1,2 +1,2 @@
1
1
  // @bun
2
- import{AUTO_MACHINE,LOCAL_MACHINE,forwardVerb,invokeRouted,machineDaemonSocket,machinePtySocket,machineTasks,pickMachine,repoHosts,repoWanted,requireMachine,routeTarget}from"./chunk-y07cp9mb.js";import"./chunk-vytrhm50.js";import"./chunk-vp29jgbt.js";import"./chunk-gq36nzg8.js";import"./chunk-sq6zj3fb.js";import"./chunk-1a57ejnh.js";import"./chunk-qecygh3f.js";import"./chunk-rjq38twt.js";import"./chunk-r5j8fycq.js";import"./chunk-xfgqae9t.js";import"./chunk-j1z9kgyd.js";import"./chunk-g9ba25q5.js";import"./chunk-ggnq2vvk.js";import"./chunk-hpay0ax8.js";import"./chunk-catrr0z3.js";import"./chunk-mdc7b01e.js";import"./chunk-tn9gtf18.js";import"./chunk-895yqjjz.js";import"./chunk-sak1tphp.js";import"./chunk-y1xnjx8x.js";import"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-5rgrde6b.js";import"./chunk-4gjvmfa9.js";import"./chunk-2tfnscxk.js";import"./chunk-hzz020xx.js";import"./chunk-w7zv47mp.js";import"./chunk-rfp0ayra.js";import"./chunk-40dgv828.js";import"./chunk-zsfyj36g.js";import"./chunk-2r1fgng9.js";import"./chunk-2brn8e1y.js";import"./chunk-7mwvvj46.js";import"./chunk-32j6y5d1.js";import"./chunk-a5xbsvx2.js";import"./chunk-9vwb9f7q.js";import"./chunk-cmp64q4j.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-7bakcyes.js";import"./chunk-8qkyd589.js";import"./chunk-7kysxgbq.js";import"./chunk-hz1x3hak.js";import"./chunk-x1jxxmtc.js";import"./chunk-xy8be792.js";import"./chunk-h2m7em1e.js";import"./chunk-7ghwdjdc.js";import"./chunk-8t7qbr1e.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-pxk2c2vj.js";import"./chunk-91sykzqq.js";export{routeTarget,requireMachine,repoWanted,repoHosts,pickMachine,machineTasks,machinePtySocket,machineDaemonSocket,invokeRouted,forwardVerb,LOCAL_MACHINE,AUTO_MACHINE};
2
+ import{AUTO_MACHINE,LOCAL_MACHINE,forwardVerb,invokeRouted,machineDaemonSocket,machinePtySocket,machineTasks,pickMachine,repoHosts,repoWanted,requireMachine,routeTarget}from"./chunk-qkdc5tc7.js";import"./chunk-vytrhm50.js";import"./chunk-vp29jgbt.js";import"./chunk-gq36nzg8.js";import"./chunk-sq6zj3fb.js";import"./chunk-za8pnw78.js";import"./chunk-qecygh3f.js";import"./chunk-rjq38twt.js";import"./chunk-r5j8fycq.js";import"./chunk-xfgqae9t.js";import"./chunk-j1z9kgyd.js";import"./chunk-g9ba25q5.js";import"./chunk-ggnq2vvk.js";import"./chunk-hpay0ax8.js";import"./chunk-catrr0z3.js";import"./chunk-mdc7b01e.js";import"./chunk-tn9gtf18.js";import"./chunk-895yqjjz.js";import"./chunk-sak1tphp.js";import"./chunk-y1xnjx8x.js";import"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-5rgrde6b.js";import"./chunk-4gjvmfa9.js";import"./chunk-2tfnscxk.js";import"./chunk-hzz020xx.js";import"./chunk-w7zv47mp.js";import"./chunk-rfp0ayra.js";import"./chunk-40dgv828.js";import"./chunk-zsfyj36g.js";import"./chunk-2r1fgng9.js";import"./chunk-2brn8e1y.js";import"./chunk-7mwvvj46.js";import"./chunk-32j6y5d1.js";import"./chunk-4d5xp2p0.js";import"./chunk-b4egks20.js";import"./chunk-cmp64q4j.js";import"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-7bakcyes.js";import"./chunk-8qkyd589.js";import"./chunk-7kysxgbq.js";import"./chunk-hz1x3hak.js";import"./chunk-x1jxxmtc.js";import"./chunk-xy8be792.js";import"./chunk-h2m7em1e.js";import"./chunk-7ghwdjdc.js";import"./chunk-8t7qbr1e.js";import"./chunk-bejhca6z.js";import"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import"./chunk-z1nj22va.js";import"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import"./chunk-eqdbfgq5.js";import"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-pxk2c2vj.js";import"./chunk-91sykzqq.js";export{routeTarget,requireMachine,repoWanted,repoHosts,pickMachine,machineTasks,machinePtySocket,machineDaemonSocket,invokeRouted,forwardVerb,LOCAL_MACHINE,AUTO_MACHINE};
@@ -1,3 +1,3 @@
1
1
  // @bun
2
- import{isDev}from"./chunk-z1nj22va.js";import{fileURLToPath}from"url";var package_default={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.281",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",keywords:["terminal","tui","cli","multiplexer","ai-agents","coding-agent","ai-coding-assistant","agentic-ai","parallel-agents","git-worktree","claude-code","codex","llm","developer-tools"],type:"module",packageManager:"bun@1.3.13",bin:{rove:"dist/cli/rove.js"},files:["dist/cli","dist/completions","dist/web","dist/web-ui","dist/skills","dist/voice","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://rove.run",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:mock":"ROVE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:rubric":"bun run scripts/build-tier-rubric.ts",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"ROVE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"ROVE_INCLUDE_SOCKET=1 ROVE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"ROVE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun scripts/render-track.mjs",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build","plugin-sandbox":"bun run scripts/plugin-sandbox.ts"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0",react:"^19.2.8","smol-toml":"^1.7.1",ws:"^8.21.3"},optionalDependencies:{"node-pty":"^1.1.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/rove-daemon":"0.7.23","@tsconfig/bun":"1.0.11","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","react-devtools-core":"^7.0.1","rove-bridge":"0.0.42","rove-weixin":"0.0.42",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]};var CURRENT_VERSION=package_default.version,PACKAGE_NAME=package_default.name;function repoSlug(){let url=package_default.repository?.url;if(!url)return null;let m=url.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!m||!m[1]||!m[2])return null;return`${m[1]}/${m[2]}`}var UPDATE_SCRIPT_URL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",UPDATE_COMMAND=`curl -fsSL ${UPDATE_SCRIPT_URL} | sh`;function updateCommandFor(target){return target===void 0||target===DEFAULT_RELEASE_CHANNEL?UPDATE_COMMAND:`${UPDATE_COMMAND} -s -- ${target}`}function owningNpmPrefix(modulePath=fileURLToPath(import.meta.url)){let at=modulePath.indexOf("/lib/node_modules/");if(at<=0)return null;return modulePath.slice(0,at)}function recommendedGlobalInstallCommand(prefix=owningNpmPrefix()){let target=`${PACKAGE_NAME}@latest`;return prefix===null?`npm install -g ${target}`:`npm install -g --prefix ${prefix} ${target}`}var BREAKING_VERSIONS=[];function breakingVersionsCrossed(from,to,breaking=BREAKING_VERSIONS){let[lo,hi]=compareSemver(from,to)<=0?[from,to]:[to,from];return breaking.filter((b)=>compareSemver(b,lo)>0&&compareSemver(b,hi)<=0)}var FETCH_TIMEOUT_MS=3000,PACKUMENT_TIMEOUT_MS=15000,RELEASE_CHANNELS=["latest","next","nightly"],DEFAULT_RELEASE_CHANNEL="latest";function channelOf(version=CURRENT_VERSION){let tag=prereleaseOf(version)?.split(".")[0];return tag==="nightly"||tag==="next"?tag:DEFAULT_RELEASE_CHANNEL}async function fetchLatestFromRegistry(packageName,channel){let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let encoded=packageName.replace("/","%2F"),res=await fetch(`https://registry.npmjs.org/${encoded}/${channel}`,{signal:ctrl.signal,headers:{accept:"application/json"}});if(!res.ok)return null;let body=await res.json();if(typeof body.version!=="string")return null;return body.version}catch{return null}finally{clearTimeout(timer)}}async function fetchPublishedAt(packageName,version){let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),PACKUMENT_TIMEOUT_MS);try{let encoded=packageName.replace("/","%2F"),res=await fetch(`https://registry.npmjs.org/${encoded}`,{signal:ctrl.signal,headers:{accept:"application/json"}});if(!res.ok)return null;let stamp=(await res.json()).time?.[version],ms=typeof stamp==="string"?Date.parse(stamp):Number.NaN;return Number.isFinite(ms)?ms:null}catch{return null}finally{clearTimeout(timer)}}function isNewerSemver(latest,current){let core=compareSemver(latest,current);if(core!==0)return core>0;return comparePrerelease(prereleaseOf(latest),prereleaseOf(current))>0}function prereleaseOf(version){let dash=version.indexOf("-");return dash===-1?void 0:version.slice(dash+1)||void 0}function comparePrerelease(a,b){if(a===b)return 0;if(a===void 0)return 1;if(b===void 0)return-1;let aParts=a.split("."),bParts=b.split(".");for(let i=0;i<Math.max(aParts.length,bParts.length);i++){let av=aParts[i],bv=bParts[i];if(av===void 0)return-1;if(bv===void 0)return 1;if(av===bv)continue;let an=/^\d+$/.test(av)?Number.parseInt(av,10):null,bn=/^\d+$/.test(bv)?Number.parseInt(bv,10):null;if(an!==null&&bn!==null)return an>bn?1:-1;if(an!==null)return-1;if(bn!==null)return 1;return av>bv?1:-1}return 0}function compareSemver(aVersion,bVersion){let norm=(v)=>v.split("-")[0]??v,a=norm(aVersion).split(".").map((s)=>Number.parseInt(s,10)),b=norm(bVersion).split(".").map((s)=>Number.parseInt(s,10));for(let i=0;i<3;i++){let av=a[i]??0,bv=b[i]??0;if(Number.isNaN(av)||Number.isNaN(bv))return 0;if(av>bv)return 1;if(av<bv)return-1}return 0}async function checkLatestVersion(opts={}){let channel=opts.channel??channelOf(),fake=process.env.ROVE_FAKE_UPDATE;if(fake)return{current:CURRENT_VERSION,latest:fake,hasUpdate:isNewerSemver(fake,CURRENT_VERSION),channel};if(isDev()&&!opts.force)return null;let latest=await fetchLatestFromRegistry(PACKAGE_NAME,channel);if(!latest)return null;let hasUpdate=isNewerSemver(latest,CURRENT_VERSION),minAgeMs=(opts.minAgeHours??0)*3600000;if(hasUpdate&&minAgeMs>0){let publishedAt=await fetchPublishedAt(PACKAGE_NAME,latest),now=(opts.now??Date.now)();if(publishedAt!==null&&now-publishedAt<minAgeMs)hasUpdate=!1}return{current:CURRENT_VERSION,latest,hasUpdate,channel}}function versionFromTagName(tagName){if(typeof tagName!=="string")return null;return tagName.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}var ZH_NOTES_ASSET="release-notes.zh.md";async function notesBody(release,locale,signal){if(locale!=="zh"||!Array.isArray(release.assets))return release.body;let asset=release.assets.find((a)=>a.name===ZH_NOTES_ASSET);if(typeof asset?.browser_download_url!=="string")return release.body;try{let res=await fetch(asset.browser_download_url,{signal}),text=res.ok?await res.text():"";return text.trim()?text:release.body}catch{return release.body}}async function fetchReleaseNotes(version,locale="en"){let slug=repoSlug();if(!slug)return null;let tag=`v${version}`,ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases/tags/${tag}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return null;let body=await res.json();if(typeof body.body!=="string"||typeof body.html_url!=="string")return null;return{body:await notesBody({...body,body:body.body},locale,ctrl.signal),url:body.html_url,version}}catch{return null}finally{clearTimeout(timer)}}async function fetchReleaseNotesRange(args){let slug=repoSlug();if(!slug)return[];let limit=args.limit??100,ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases?per_page=${limit}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return[];let body=await res.json();if(!Array.isArray(body))return[];let inRange=body.flatMap((release)=>{let version=versionFromTagName(release.tag_name);if(!version||typeof release.html_url!=="string"||typeof release.body!=="string")return[];if(compareSemver(version,args.current)<=0)return[];if(compareSemver(version,args.latest)>0)return[];return[{version,url:release.html_url,release:{...release,body:release.body}}]});return await Promise.all(inRange.map(async({version,url,release})=>({version,url,body:await notesBody(release,args.locale??"en",ctrl.signal)})))}catch{return[]}finally{clearTimeout(timer)}}async function fetchReleaseSummaries(limit=12){let slug=repoSlug();if(!slug)return[];let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases?per_page=${limit}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return[];let body=await res.json();if(!Array.isArray(body))return[];return body.map((release)=>{let version=versionFromTagName(release.tag_name);if(!version||typeof release.html_url!=="string")return null;return{version,url:release.html_url}}).filter((release)=>release!==null)}catch{return[]}finally{clearTimeout(timer)}}function releasePageUrl(version){let slug=repoSlug();if(!slug)return null;return`https://github.com/${slug}/releases/tag/v${version}`}
2
+ import{isDev}from"./chunk-z1nj22va.js";import{fileURLToPath}from"url";var package_default={$schema:"https://json.schemastore.org/package.json",name:"@sma1lboy/rove",version:"0.9.282",description:"Rove \u2014 the agent multiplexer for your terminal. Run coding agents on parallel tasks with isolated worktrees and persistent sessions.",keywords:["terminal","tui","cli","multiplexer","ai-agents","coding-agent","ai-coding-assistant","agentic-ai","parallel-agents","git-worktree","claude-code","codex","llm","developer-tools"],type:"module",packageManager:"bun@1.3.13",bin:{rove:"dist/cli/rove.js"},files:["dist/cli","dist/completions","dist/web","dist/web-ui","dist/skills","dist/voice","dist/*.wav","README.md","LICENSE"],publishConfig:{access:"public"},repository:{type:"git",url:"git+https://github.com/Sma1lboy/rove.git"},homepage:"https://rove.run",bugs:{url:"https://github.com/Sma1lboy/rove/issues"},engines:{bun:">=1.3.11"},scripts:{dev:"ROVE_DEV=1 bun --conditions=browser ./src/cli/rove.ts","dev:mock":"ROVE_DEV=1 bun ./src/tui-react/mock/host.tsx","dev:sandbox":"bun run scripts/dev-sandbox.ts run","dev:sandbox:reset":"bun run scripts/dev-sandbox.ts reset",build:"bun run scripts/build.ts","build:rubric":"bun run scripts/build-tier-rubric.ts",compile:"bun run scripts/compile.ts",typecheck:"tsc --noEmit","check-i18n":"bun run scripts/check-i18n.ts",test:"bun run test:fast && bun run test:socket","perf:golden":"bun scripts/perf-golden.ts","pty:soak":"bun scripts/pty-soak.ts","test:fast":"vitest run --passWithNoTests --minWorkers=1 --maxWorkers=8","test:socket":"ROVE_INCLUDE_SOCKET=1 vitest run test/daemon --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:socket:coverage":"ROVE_INCLUDE_SOCKET=1 ROVE_COVERAGE_DAEMON=1 vitest run test/daemon --coverage --pool forks --minWorkers=1 --maxWorkers=4 --passWithNoTests","test:behavior":"ROVE_INCLUDE_BEHAVIOR=1 vitest run test/behavior --pool forks --minWorkers=1 --maxWorkers=1 --retry=2 --passWithNoTests","test:render":"bun scripts/render-track.mjs",coverage:"vitest run --coverage --passWithNoTests",bench:"vitest bench --run",lint:"biome check .",knip:"knip-bun",postinstall:"bun run scripts/check-preview-deps.ts || true",prepublishOnly:"bun run typecheck && bun run build","plugin-sandbox":"bun run scripts/plugin-sandbox.ts"},"//":"biome.json + bunfig.toml live at the monorepo root since they apply repo-wide; bun.lock also lives at root (workspace-shared).",dependencies:{"@ansi-tools/parser":"^1.0.15","@opentui/core":"0.4.3","@opentui/react":"0.4.3","@xterm/addon-serialize":"^0.14.0","@xterm/addon-unicode11":"^0.9.0","@xterm/headless":"^6.0.0",react:"^19.2.8","smol-toml":"^1.7.1",ws:"^8.21.3"},optionalDependencies:{"node-pty":"^1.1.0"},devDependencies:{"@biomejs/biome":"1.9.4","@sma1lboy/rove-daemon":"0.7.23","@tsconfig/bun":"1.0.11","@types/bun":"1.3.14","@types/node":"25.6.2","@types/react":"^19.2.0","@vitest/coverage-v8":"2.1.9",knip:"^6.14.2","react-devtools-core":"^7.0.1","rove-bridge":"0.0.43","rove-weixin":"0.0.43",typescript:"5.8.2",vitest:"2.1.9"},trustedDependencies:[]};var CURRENT_VERSION=package_default.version,PACKAGE_NAME=package_default.name;function repoSlug(){let url=package_default.repository?.url;if(!url)return null;let m=url.match(/github\.com[:/]([^/]+)\/([^/.]+)/);if(!m||!m[1]||!m[2])return null;return`${m[1]}/${m[2]}`}var UPDATE_SCRIPT_URL="https://raw.githubusercontent.com/Sma1lboy/rove/main/scripts/update.sh",UPDATE_COMMAND=`curl -fsSL ${UPDATE_SCRIPT_URL} | sh`;function updateCommandFor(target){return target===void 0||target===DEFAULT_RELEASE_CHANNEL?UPDATE_COMMAND:`${UPDATE_COMMAND} -s -- ${target}`}function owningNpmPrefix(modulePath=fileURLToPath(import.meta.url)){let at=modulePath.indexOf("/lib/node_modules/");if(at<=0)return null;return modulePath.slice(0,at)}function recommendedGlobalInstallCommand(prefix=owningNpmPrefix()){let target=`${PACKAGE_NAME}@latest`;return prefix===null?`npm install -g ${target}`:`npm install -g --prefix ${prefix} ${target}`}var BREAKING_VERSIONS=[];function breakingVersionsCrossed(from,to,breaking=BREAKING_VERSIONS){let[lo,hi]=compareSemver(from,to)<=0?[from,to]:[to,from];return breaking.filter((b)=>compareSemver(b,lo)>0&&compareSemver(b,hi)<=0)}var FETCH_TIMEOUT_MS=3000,PACKUMENT_TIMEOUT_MS=15000,RELEASE_CHANNELS=["latest","next","nightly"],DEFAULT_RELEASE_CHANNEL="latest";function channelOf(version=CURRENT_VERSION){let tag=prereleaseOf(version)?.split(".")[0];return tag==="nightly"||tag==="next"?tag:DEFAULT_RELEASE_CHANNEL}async function fetchLatestFromRegistry(packageName,channel){let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let encoded=packageName.replace("/","%2F"),res=await fetch(`https://registry.npmjs.org/${encoded}/${channel}`,{signal:ctrl.signal,headers:{accept:"application/json"}});if(!res.ok)return null;let body=await res.json();if(typeof body.version!=="string")return null;return body.version}catch{return null}finally{clearTimeout(timer)}}async function fetchPublishedAt(packageName,version){let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),PACKUMENT_TIMEOUT_MS);try{let encoded=packageName.replace("/","%2F"),res=await fetch(`https://registry.npmjs.org/${encoded}`,{signal:ctrl.signal,headers:{accept:"application/json"}});if(!res.ok)return null;let stamp=(await res.json()).time?.[version],ms=typeof stamp==="string"?Date.parse(stamp):Number.NaN;return Number.isFinite(ms)?ms:null}catch{return null}finally{clearTimeout(timer)}}function isNewerSemver(latest,current){let core=compareSemver(latest,current);if(core!==0)return core>0;return comparePrerelease(prereleaseOf(latest),prereleaseOf(current))>0}function prereleaseOf(version){let dash=version.indexOf("-");return dash===-1?void 0:version.slice(dash+1)||void 0}function comparePrerelease(a,b){if(a===b)return 0;if(a===void 0)return 1;if(b===void 0)return-1;let aParts=a.split("."),bParts=b.split(".");for(let i=0;i<Math.max(aParts.length,bParts.length);i++){let av=aParts[i],bv=bParts[i];if(av===void 0)return-1;if(bv===void 0)return 1;if(av===bv)continue;let an=/^\d+$/.test(av)?Number.parseInt(av,10):null,bn=/^\d+$/.test(bv)?Number.parseInt(bv,10):null;if(an!==null&&bn!==null)return an>bn?1:-1;if(an!==null)return-1;if(bn!==null)return 1;return av>bv?1:-1}return 0}function compareSemver(aVersion,bVersion){let norm=(v)=>v.split("-")[0]??v,a=norm(aVersion).split(".").map((s)=>Number.parseInt(s,10)),b=norm(bVersion).split(".").map((s)=>Number.parseInt(s,10));for(let i=0;i<3;i++){let av=a[i]??0,bv=b[i]??0;if(Number.isNaN(av)||Number.isNaN(bv))return 0;if(av>bv)return 1;if(av<bv)return-1}return 0}async function checkLatestVersion(opts={}){let channel=opts.channel??channelOf(),fake=process.env.ROVE_FAKE_UPDATE;if(fake)return{current:CURRENT_VERSION,latest:fake,hasUpdate:isNewerSemver(fake,CURRENT_VERSION),channel};if(isDev()&&!opts.force)return null;let latest=await fetchLatestFromRegistry(PACKAGE_NAME,channel);if(!latest)return null;let hasUpdate=isNewerSemver(latest,CURRENT_VERSION),minAgeMs=(opts.minAgeHours??0)*3600000;if(hasUpdate&&minAgeMs>0){let publishedAt=await fetchPublishedAt(PACKAGE_NAME,latest),now=(opts.now??Date.now)();if(publishedAt!==null&&now-publishedAt<minAgeMs)hasUpdate=!1}return{current:CURRENT_VERSION,latest,hasUpdate,channel}}function versionFromTagName(tagName){if(typeof tagName!=="string")return null;return tagName.match(/^v(\d+\.\d+\.\d+)$/)?.[1]??null}var ZH_NOTES_ASSET="release-notes.zh.md";async function notesBody(release,locale,signal){if(locale!=="zh"||!Array.isArray(release.assets))return release.body;let asset=release.assets.find((a)=>a.name===ZH_NOTES_ASSET);if(typeof asset?.browser_download_url!=="string")return release.body;try{let res=await fetch(asset.browser_download_url,{signal}),text=res.ok?await res.text():"";return text.trim()?text:release.body}catch{return release.body}}async function fetchReleaseNotes(version,locale="en"){let slug=repoSlug();if(!slug)return null;let tag=`v${version}`,ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases/tags/${tag}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return null;let body=await res.json();if(typeof body.body!=="string"||typeof body.html_url!=="string")return null;return{body:await notesBody({...body,body:body.body},locale,ctrl.signal),url:body.html_url,version}}catch{return null}finally{clearTimeout(timer)}}async function fetchReleaseNotesRange(args){let slug=repoSlug();if(!slug)return[];let limit=args.limit??100,ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases?per_page=${limit}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return[];let body=await res.json();if(!Array.isArray(body))return[];let inRange=body.flatMap((release)=>{let version=versionFromTagName(release.tag_name);if(!version||typeof release.html_url!=="string"||typeof release.body!=="string")return[];if(compareSemver(version,args.current)<=0)return[];if(compareSemver(version,args.latest)>0)return[];return[{version,url:release.html_url,release:{...release,body:release.body}}]});return await Promise.all(inRange.map(async({version,url,release})=>({version,url,body:await notesBody(release,args.locale??"en",ctrl.signal)})))}catch{return[]}finally{clearTimeout(timer)}}async function fetchReleaseSummaries(limit=12){let slug=repoSlug();if(!slug)return[];let ctrl=new AbortController,timer=setTimeout(()=>ctrl.abort(),FETCH_TIMEOUT_MS);try{let res=await fetch(`https://api.github.com/repos/${slug}/releases?per_page=${limit}`,{signal:ctrl.signal,headers:{accept:"application/vnd.github+json","x-github-api-version":"2022-11-28"}});if(!res.ok)return[];let body=await res.json();if(!Array.isArray(body))return[];return body.map((release)=>{let version=versionFromTagName(release.tag_name);if(!version||typeof release.html_url!=="string")return null;return{version,url:release.html_url}}).filter((release)=>release!==null)}catch{return[]}finally{clearTimeout(timer)}}function releasePageUrl(version){let slug=repoSlug();if(!slug)return null;return`https://github.com/${slug}/releases/tag/v${version}`}
3
3
  export{package_default,CURRENT_VERSION,PACKAGE_NAME,repoSlug,UPDATE_SCRIPT_URL,UPDATE_COMMAND,updateCommandFor,owningNpmPrefix,recommendedGlobalInstallCommand,BREAKING_VERSIONS,breakingVersionsCrossed,RELEASE_CHANNELS,DEFAULT_RELEASE_CHANNEL,channelOf,isNewerSemver,compareSemver,checkLatestVersion,ZH_NOTES_ASSET,fetchReleaseNotes,fetchReleaseNotesRange,fetchReleaseSummaries,releasePageUrl};
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{formatBytes}from"./chunk-my20q579.js";import{hookConfigIssues}from"./chunk-p2cbtrzg.js";import{applyFixes,daemonRestartFix,defaultFixRuntime,engineTabsManualFix,humanOnlyFix,killOrphansManualFix,noEngineFix,reinstallManualFix,resetManualFix,skillInstallFix,spawnHelperFix}from"./chunk-4vkrv4eb.js";import{inspectLegacyTmux,legacyTmuxDoctorLines}from"./chunk-gkdfct7t.js";import"./chunk-x35dfb1x.js";import"./chunk-16e6jqq6.js";import"./chunk-a4hsqj1b.js";import"./chunk-6hcyvg0m.js";import{skillOverview}from"./chunk-0gbg7bg8.js";import"./chunk-tq0h3vy6.js";import"./chunk-cpgnm1xr.js";import"./chunk-r3s2t9af.js";import"./chunk-6xr1prk6.js";import{describeAccount,detectEngineStatuses,probeableEngineIds,summarizeEngines}from"./chunk-zpxpwgds.js";import"./chunk-q8ffd1pc.js";import"./chunk-4hestsjp.js";import"./chunk-qgrg9a5n.js";import"./chunk-2bgmby1d.js";import"./chunk-n0rdn2fn.js";import"./chunk-5mhvjytn.js";import"./chunk-atn06ncf.js";import"./chunk-vp29jgbt.js";import"./chunk-gq36nzg8.js";import{resolveNodeBinary}from"./chunk-z43e08kw.js";import"./chunk-w77s2df8.js";import"./chunk-mqfvzdpr.js";import{formatDaemonInfo}from"./chunk-rxqdw6s5.js";import"./chunk-rjq38twt.js";import"./chunk-xfgqae9t.js";import"./chunk-j1z9kgyd.js";import"./chunk-g9ba25q5.js";import"./chunk-tn9gtf18.js";import{isStaleInstallError,resolveRoveSpawn}from"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-5rgrde6b.js";import"./chunk-4gjvmfa9.js";import"./chunk-2tfnscxk.js";import"./chunk-hzz020xx.js";import"./chunk-w7zv47mp.js";import"./chunk-2w228s7t.js";import"./chunk-etfh8f4z.js";import"./chunk-rfp0ayra.js";import"./chunk-dmzg9zdc.js";import"./chunk-40dgv828.js";import"./chunk-kg9kmwt9.js";import{CURRENT_VERSION,package_default}from"./chunk-yn01fet6.js";import"./chunk-zsfyj36g.js";import"./chunk-2brn8e1y.js";import"./chunk-7mwvvj46.js";import"./chunk-32j6y5d1.js";import{t}from"./chunk-a5xbsvx2.js";import"./chunk-9vwb9f7q.js";import"./chunk-cmp64q4j.js";import{RoveDaemonClient,isForeignDaemonHome}from"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-7bakcyes.js";import"./chunk-8qkyd589.js";import"./chunk-7kysxgbq.js";import{readableLegacyIndexPath}from"./chunk-hz1x3hak.js";import"./chunk-x1jxxmtc.js";import"./chunk-xy8be792.js";import"./chunk-h2m7em1e.js";import"./chunk-7ghwdjdc.js";import"./chunk-8t7qbr1e.js";import"./chunk-bejhca6z.js";import{readPidFile}from"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import{homeDir,kvStatePath,roveStateDir}from"./chunk-z1nj22va.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import{defaultDaemonLogPath,defaultDaemonPidPath,defaultDaemonSocketPath,defaultPtyHostLogPath,defaultPtyHostPidPath,defaultPtyHostSocketPath}from"./chunk-eqdbfgq5.js";import{preRenameStateDir}from"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-pxk2c2vj.js";import{__require}from"./chunk-91sykzqq.js";import{existsSync,readFileSync as readFileSync2,statSync as statSync2}from"fs";import{join as join2}from"path";var MIN_BUN_VERSION=package_default.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0";function parseBunVersion(raw){return raw.trim().match(/^v?(\d+\.\d+\.\d+)/)?.[1]??null}function isBunAtLeast(raw,minimum=MIN_BUN_VERSION){let found=parseBunVersion(raw),floor=parseBunVersion(minimum);if(!found||!floor)return!0;let a=found.split(".").map(Number),b=floor.split(".").map(Number);for(let i=0;i<3;i++){let av=a[i]??0,bv=b[i]??0;if(av!==bv)return av>bv}return!0}function classifyHookChannel(input){let total=0,hooked=0;for(let tabs of Object.values(input.tabs))for(let entry of Object.values(tabs))if(total++,entry.source==="hook")hooked++;if(total===0)return{kind:"no-tabs"};if(hooked===0)return{kind:"down",totalTabs:total};return{kind:"live",hookTabs:hooked,totalTabs:total}}function hookChannelDoctorLines(verdict,input,cliName){let configLines=(input.configIssues??[]).flatMap((issue)=>[` \u26A0 hook install skipped: ${issue.file}`,` ${issue.reason} \u2014 fix the file, then relaunch Rove`]);if(verdict.kind==="no-tabs")return["hooks: \u2014 no engine tabs yet (nothing to check)",...configLines];if(verdict.kind==="live")return[`hooks: \u2713 engine hook channel live (${verdict.hookTabs}/${verdict.totalTabs} tab(s) hook-sourced)`,...configLines];let out=[`hooks: \u2717 NO hook events reaching the daemon (0/${verdict.totalTabs} tab(s) hook-sourced)`," badges fall back to a ~10s poll, so activity looks seconds late",` daemon socket: ${input.socketPath}`,...configLines];return out.push(' \u2192 compare with an engine tab\'s own path: `ps eww -p <engine-pid> | tr " " "\\n" | grep DAEMON_SOCKET_PATH`',` \u2192 restart the engine tabs (they may hold a stale socket path), or run \`${cliName} daemon restart\``,` \u2192 debug one hook directly: \`ROVE_HOOK_DEBUG=1 echo '{}' | ${cliName} hook turn-start --engine claude\``),out}import{readdirSync,statSync}from"fs";import{createRequire}from"module";import{dirname,join}from"path";function installedSpawnHelpers(){let pkg;try{pkg=dirname(createRequire(import.meta.url).resolve("node-pty/package.json"))}catch{return[]}let prebuilds=join(pkg,"prebuilds"),arches;try{arches=readdirSync(prebuilds).filter((name)=>name.startsWith("darwin-"))}catch{return[]}let helpers=[];for(let arch of arches){let path=join(prebuilds,arch,"spawn-helper");try{helpers.push({path,executable:(statSync(path).mode&64)!==0})}catch{}}return helpers}function spawnHelperDoctorLines(helpers){let broken=helpers.filter((helper)=>!helper.executable).map((helper)=>helper.path);if(helpers.length===0)return{lines:["node-pty: ? no darwin spawn-helper found next to node-pty"],broken};if(broken.length===0)return{lines:[`node-pty: \u2713 spawn-helper executable (${helpers.length} arch)`],broken};return{lines:["node-pty: \u2717 spawn-helper is not executable \u2014 every node-pty PTY spawn fails",...broken.map((path)=>` ${path}`),` \u2192 chmod 755 ${broken.join(" ")}`],broken}}import{appendFileSync,readFileSync}from"fs";var PTY_MARKER="ROVE_TERMINAL_PTY=1",run=async(argv)=>{try{let proc=Bun.spawn([...argv],{stdin:"ignore",stdout:"pipe",stderr:"ignore"}),[stdout,code]=await Promise.all([new Response(proc.stdout).text().catch(()=>""),proc.exited]);return{code,stdout}}catch{return{code:127,stdout:""}}};function parsePsRows(output){let rows=[];for(let line of output.split(`
2
+ import{formatBytes}from"./chunk-my20q579.js";import{hookConfigIssues}from"./chunk-p2cbtrzg.js";import{applyFixes,daemonRestartFix,defaultFixRuntime,engineTabsManualFix,humanOnlyFix,killOrphansManualFix,noEngineFix,reinstallManualFix,resetManualFix,skillInstallFix,spawnHelperFix}from"./chunk-qx6d4bbb.js";import{inspectLegacyTmux,legacyTmuxDoctorLines}from"./chunk-gkdfct7t.js";import"./chunk-x35dfb1x.js";import"./chunk-16e6jqq6.js";import"./chunk-a4hsqj1b.js";import"./chunk-6hcyvg0m.js";import{skillOverview}from"./chunk-0gbg7bg8.js";import"./chunk-tq0h3vy6.js";import"./chunk-cpgnm1xr.js";import"./chunk-r3s2t9af.js";import"./chunk-6xr1prk6.js";import{describeAccount,detectEngineStatuses,probeableEngineIds,summarizeEngines}from"./chunk-zpxpwgds.js";import"./chunk-q8ffd1pc.js";import"./chunk-4hestsjp.js";import"./chunk-qgrg9a5n.js";import"./chunk-2bgmby1d.js";import"./chunk-n0rdn2fn.js";import"./chunk-5mhvjytn.js";import"./chunk-atn06ncf.js";import"./chunk-vp29jgbt.js";import"./chunk-gq36nzg8.js";import{resolveNodeBinary}from"./chunk-z43e08kw.js";import"./chunk-w77s2df8.js";import"./chunk-mqfvzdpr.js";import{formatDaemonInfo}from"./chunk-rxqdw6s5.js";import"./chunk-rjq38twt.js";import"./chunk-xfgqae9t.js";import"./chunk-j1z9kgyd.js";import"./chunk-g9ba25q5.js";import"./chunk-tn9gtf18.js";import{isStaleInstallError,resolveRoveSpawn}from"./chunk-e58kj4gm.js";import"./chunk-0a65j1zj.js";import"./chunk-bcyex84w.js";import"./chunk-5rgrde6b.js";import"./chunk-4gjvmfa9.js";import"./chunk-2tfnscxk.js";import"./chunk-hzz020xx.js";import"./chunk-w7zv47mp.js";import"./chunk-2w228s7t.js";import"./chunk-etfh8f4z.js";import"./chunk-rfp0ayra.js";import"./chunk-dmzg9zdc.js";import"./chunk-40dgv828.js";import"./chunk-kg9kmwt9.js";import{CURRENT_VERSION,package_default}from"./chunk-jxqhq9va.js";import"./chunk-zsfyj36g.js";import"./chunk-2brn8e1y.js";import"./chunk-7mwvvj46.js";import"./chunk-32j6y5d1.js";import{t}from"./chunk-4d5xp2p0.js";import"./chunk-b4egks20.js";import"./chunk-cmp64q4j.js";import{RoveDaemonClient,isForeignDaemonHome}from"./chunk-qzzmd63x.js";import"./chunk-96kvwzj8.js";import"./chunk-7bakcyes.js";import"./chunk-8qkyd589.js";import"./chunk-7kysxgbq.js";import{readableLegacyIndexPath}from"./chunk-hz1x3hak.js";import"./chunk-x1jxxmtc.js";import"./chunk-xy8be792.js";import"./chunk-h2m7em1e.js";import"./chunk-7ghwdjdc.js";import"./chunk-8t7qbr1e.js";import"./chunk-bejhca6z.js";import{readPidFile}from"./chunk-br8r72bf.js";import"./chunk-yt15y085.js";import{homeDir,kvStatePath,roveStateDir}from"./chunk-z1nj22va.js";import{ROVE_PRODUCT_NAME}from"./chunk-zt7wfnva.js";import"./chunk-0g4wc808.js";import"./chunk-pn5ygqn6.js";import{defaultDaemonLogPath,defaultDaemonPidPath,defaultDaemonSocketPath,defaultPtyHostLogPath,defaultPtyHostPidPath,defaultPtyHostSocketPath}from"./chunk-eqdbfgq5.js";import{preRenameStateDir}from"./chunk-f8gg8cqh.js";import"./chunk-nc46gddg.js";import"./chunk-pxk2c2vj.js";import{__require}from"./chunk-91sykzqq.js";import{existsSync,readFileSync as readFileSync2,statSync as statSync2}from"fs";import{join as join2}from"path";var MIN_BUN_VERSION=package_default.engines.bun.match(/\d+\.\d+\.\d+/)?.[0]??"0.0.0";function parseBunVersion(raw){return raw.trim().match(/^v?(\d+\.\d+\.\d+)/)?.[1]??null}function isBunAtLeast(raw,minimum=MIN_BUN_VERSION){let found=parseBunVersion(raw),floor=parseBunVersion(minimum);if(!found||!floor)return!0;let a=found.split(".").map(Number),b=floor.split(".").map(Number);for(let i=0;i<3;i++){let av=a[i]??0,bv=b[i]??0;if(av!==bv)return av>bv}return!0}function classifyHookChannel(input){let total=0,hooked=0;for(let tabs of Object.values(input.tabs))for(let entry of Object.values(tabs))if(total++,entry.source==="hook")hooked++;if(total===0)return{kind:"no-tabs"};if(hooked===0)return{kind:"down",totalTabs:total};return{kind:"live",hookTabs:hooked,totalTabs:total}}function hookChannelDoctorLines(verdict,input,cliName){let configLines=(input.configIssues??[]).flatMap((issue)=>[` \u26A0 hook install skipped: ${issue.file}`,` ${issue.reason} \u2014 fix the file, then relaunch Rove`]);if(verdict.kind==="no-tabs")return["hooks: \u2014 no engine tabs yet (nothing to check)",...configLines];if(verdict.kind==="live")return[`hooks: \u2713 engine hook channel live (${verdict.hookTabs}/${verdict.totalTabs} tab(s) hook-sourced)`,...configLines];let out=[`hooks: \u2717 NO hook events reaching the daemon (0/${verdict.totalTabs} tab(s) hook-sourced)`," badges fall back to a ~10s poll, so activity looks seconds late",` daemon socket: ${input.socketPath}`,...configLines];return out.push(' \u2192 compare with an engine tab\'s own path: `ps eww -p <engine-pid> | tr " " "\\n" | grep DAEMON_SOCKET_PATH`',` \u2192 restart the engine tabs (they may hold a stale socket path), or run \`${cliName} daemon restart\``,` \u2192 debug one hook directly: \`ROVE_HOOK_DEBUG=1 echo '{}' | ${cliName} hook turn-start --engine claude\``),out}import{readdirSync,statSync}from"fs";import{createRequire}from"module";import{dirname,join}from"path";function installedSpawnHelpers(){let pkg;try{pkg=dirname(createRequire(import.meta.url).resolve("node-pty/package.json"))}catch{return[]}let prebuilds=join(pkg,"prebuilds"),arches;try{arches=readdirSync(prebuilds).filter((name)=>name.startsWith("darwin-"))}catch{return[]}let helpers=[];for(let arch of arches){let path=join(prebuilds,arch,"spawn-helper");try{helpers.push({path,executable:(statSync(path).mode&64)!==0})}catch{}}return helpers}function spawnHelperDoctorLines(helpers){let broken=helpers.filter((helper)=>!helper.executable).map((helper)=>helper.path);if(helpers.length===0)return{lines:["node-pty: ? no darwin spawn-helper found next to node-pty"],broken};if(broken.length===0)return{lines:[`node-pty: \u2713 spawn-helper executable (${helpers.length} arch)`],broken};return{lines:["node-pty: \u2717 spawn-helper is not executable \u2014 every node-pty PTY spawn fails",...broken.map((path)=>` ${path}`),` \u2192 chmod 755 ${broken.join(" ")}`],broken}}import{appendFileSync,readFileSync}from"fs";var PTY_MARKER="ROVE_TERMINAL_PTY=1",run=async(argv)=>{try{let proc=Bun.spawn([...argv],{stdin:"ignore",stdout:"pipe",stderr:"ignore"}),[stdout,code]=await Promise.all([new Response(proc.stdout).text().catch(()=>""),proc.exited]);return{code,stdout}}catch{return{code:127,stdout:""}}};function parsePsRows(output){let rows=[];for(let line of output.split(`
3
3
  `)){let parts=line.trim().split(/\s+/);if(parts.length<6)continue;let[pid,ppid,pgid]=[parts[0],parts[1],parts[2]].map((value)=>Number.parseInt(value??"",10)),rssKb=Number.parseInt(parts[4]??"",10);if(!Number.isFinite(pid)||!Number.isFinite(ppid)||!Number.isFinite(pgid)||!Number.isFinite(rssKb))continue;rows.push({pid,ppid,pgid,etime:parts[3]??"",rssKb,command:parts.slice(5).join(" ")})}return rows}function pidAlive(pid,rows){return rows.some((row)=>row.pid===pid)}function orphanCandidates(rows,selfPgid,liveSessionPids){return rows.filter((row)=>row.ppid===1&&row.pgid!==selfPgid&&!liveSessionPids.has(row.pgid)&&!pidAlive(row.pgid,rows))}async function markedPids(pids,deps={}){let runProbe=deps.run??run,readEnviron=deps.readEnviron??((pid)=>readFileSync(`/proc/${pid}/environ`,"utf8")),marked=new Set;if(pids.length===0)return{marked,failed:null};if((deps.platform??process.platform)==="linux"){let refused=null;for(let pid of pids)try{if(readEnviron(pid).split("\x00").includes(PTY_MARKER))marked.add(pid)}catch(err){let code=err.code;if(code!=="ENOENT"&&code!=="ESRCH")refused??=`/proc/${pid}/environ: ${code??"unreadable"}`}return{marked,failed:refused}}let result=await runProbe(["ps","eww","-o","pid=,command=","-p",pids.join(",")]);if(result.code!==0)return{marked,failed:`ps eww exited ${result.code}`};let marker=new RegExp(`(^|\\s)${PTY_MARKER}(\\s|$)`);for(let line of result.stdout.split(`
4
4
  `)){let pid=Number.parseInt(line.trim().split(/\s+/)[0]??"",10);if(Number.isFinite(pid)&&marker.test(line))marked.add(pid)}return{marked,failed:null}}async function ownPgid(runProbe){let result=await runProbe(["ps","-o","pgid=","-p",String(process.pid)]),pgid=Number.parseInt(result.stdout.trim(),10);return Number.isFinite(pgid)?pgid:-1}async function collectOrphans(liveSessionPids,deps={}){let runProbe=deps.run??run;if((deps.platform??process.platform)==="win32")return{orphans:[],error:null};let ps=await runProbe(["ps","-A","-o","pid=,ppid=,pgid=,etime=,rss=,command="]);if(ps.code!==0)return{orphans:[],error:`could not read the process table \u2014 ps exited ${ps.code}`};let rows=parsePsRows(ps.stdout),candidates=orphanCandidates(rows,await ownPgid(runProbe),liveSessionPids),{marked,failed}=await markedPids(candidates.map((row)=>row.pid),deps);if(failed)return{orphans:[],error:`could not read process environments \u2014 ${failed}`};return{orphans:candidates.filter((row)=>marked.has(row.pid)),error:null}}function formatMb(rssKb){return`${(rssKb/1024).toFixed(0)} MB`}function orphanDoctorLines(orphans,error,cliName,killing=!1){if(error)return[`orphans: \u2717 ${error}`];if(orphans.length===0)return["orphans: \u2713 none \u2014 no processes left behind by a dead PTY session"];let totalMb=orphans.reduce((sum,row)=>sum+row.rssKb,0)/1024,lines=[`orphans: \u26A0 ${orphans.length} process(es) outlived the PTY session that spawned them (${totalMb.toFixed(0)} MB RSS)`," each is reparented to init, carries Rove's PTY marker, and its process"," group leader is gone \u2014 no live task owns them"];for(let row of[...orphans].sort((a,b)=>b.rssKb-a.rssKb))lines.push(` pid ${row.pid} (group ${row.pgid}) up ${row.etime}, ${formatMb(row.rssKb)}: ${row.command.slice(0,90)}`);if(!killing)lines.push(` \u2192 \`${cliName} doctor --kill-orphans\` ends those process groups (SIGTERM, then SIGKILL)`," read the list first: something you backgrounded from a Rove terminal and then"," closed the tab on looks exactly like a leak, and doctor cannot tell them apart");return lines}var GROUP_EXIT_GRACE_MS=2000,GROUP_POLL_MS=100;function logOrphanKill(pgid,signal,logPath=defaultDaemonLogPath()){try{appendFileSync(logPath,formatDaemonInfo("doctor-kill-orphans",`${signal} process group ${pgid}`))}catch{}}function groupAlive(pgid){try{return process.kill(-pgid,0),!0}catch(err){return err.code!=="ESRCH"}}async function killOrphanGroups(orphans){let groups=[...new Set(orphans.map((row)=>row.pgid))];for(let pgid of groups)try{process.kill(-pgid,"SIGTERM"),logOrphanKill(pgid,"SIGTERM")}catch{}let deadline=Date.now()+GROUP_EXIT_GRACE_MS,survivors=groups.filter(groupAlive);while(survivors.length>0&&Date.now()<deadline)await new Promise((resolve)=>setTimeout(resolve,GROUP_POLL_MS)),survivors=survivors.filter(groupAlive);for(let pgid of survivors)try{process.kill(-pgid,"SIGKILL"),logOrphanKill(pgid,"SIGKILL")}catch{}return await new Promise((resolve)=>setTimeout(resolve,GROUP_POLL_MS)),{groups,survivors:survivors.filter(groupAlive)}}function multiplexerLabel(env){if(env.TMUX)return"tmux";if(env.ZELLIJ)return"zellij";if(env.STY)return"screen";return"no"}function terminalEnvLines(env){let show=(v)=>v&&v.length>0?v:"(unset)",program=env.TERM_PROGRAM?`${env.TERM_PROGRAM}${env.TERM_PROGRAM_VERSION?` v${env.TERM_PROGRAM_VERSION}`:""}`:"(unset)";return[`terminal: TERM=${show(env.TERM)} TERM_PROGRAM=${program} COLORTERM=${show(env.COLORTERM)}`,` running inside a multiplexer: ${multiplexerLabel(env)}`]}function parseKittyProbeReply(data){let kitty=data.match(/\x1b\[\?(\d+)u/);if(kitty?.[1]!==void 0)return{kind:"supported",flags:Number.parseInt(kitty[1],10)};if(/\x1b\[\?[\d;]*c/.test(data))return{kind:"unsupported"};return null}function kittyProbeLine(result){switch(result.kind){case"supported":return` kitty keyboard protocol: \u2713 answered (flags=${result.flags})`;case"unsupported":return[" kitty keyboard protocol: \u2717 not supported \u2014 legacy key path"," (ctrl+h/ctrl+j arrive as C0 backspace/linefeed bytes; the"," split chords ctrl+\\ and ctrl+= cannot be encoded at all)"].join(`
5
5
  `);case"no-response":return" kitty keyboard protocol: ? no reply (terminal ignored both the kitty query and DA1)";case"skipped":return` kitty keyboard protocol: skipped (${result.reason})`}}async function probeKittyKeyboard(timeoutMs=300){let stdin=process.stdin;if(!stdin.isTTY||!process.stdout.isTTY)return{kind:"skipped",reason:"not an interactive terminal"};let wasRaw=stdin.isRaw===!0,buffer="";return await new Promise((resolve)=>{let done=!1,finish=(result)=>{if(done)return;if(done=!0,clearTimeout(timer),stdin.off("data",onData),stdin.pause(),!wasRaw)stdin.setRawMode(!1);resolve(result)},onData=(chunk)=>{buffer+=chunk.toString("latin1");let decided=parseKittyProbeReply(buffer);if(decided)finish(decided)},timer=setTimeout(()=>finish({kind:"no-response"}),timeoutMs);stdin.setRawMode(!0),stdin.resume(),stdin.on("data",onData),process.stdout.write("\x1B[?u\x1B[c")})}async function terminalDoctorLines(){return[...terminalEnvLines(process.env),kittyProbeLine(await probeKittyKeyboard())]}async function probeGit(){try{let proc=Bun.spawn(["git","--version"],{stdin:"ignore",stdout:"pipe",stderr:"ignore"}),text=(await new Response(proc.stdout).text()).trim();if(await proc.exited===0&&text)return{line:`git: \u2713 ${text}`,found:!0}}catch{}return{line:"git: \u2717 not found on PATH",found:!1}}function binaryLabel(binary){return binary.found?`\u2713 ${binary.path}`:`\u2717 ${binary.error}`}async function probeEngines(){let statuses=await detectEngineStatuses(await probeableEngineIds()),lines=["engines:"];for(let status of statuses){let account=describeAccount(status.account),name=`${status.vendor.padEnd(7)} `;if(lines.push(` ${name}${binaryLabel(status.binary)}${status.binary.found?` \u2014 ${account}`:""}`),status.accountError)lines.push(` \u26A0 ${status.accountError}`)}let{usable,signedOut}=summarizeEngines(statuses);return{lines,anyUsable:usable.length>0,signedOut}}var CLI_NAME=ROVE_PRODUCT_NAME;function isProcessAlive(pid){try{return process.kill(pid,0),!0}catch(err){return err.code==="EPERM"}}async function requestIfReachable(socketPath,name){let client=new RoveDaemonClient(socketPath);try{return await client.request(name,{})}catch{return null}finally{client.close()}}function fmtDuration(ms){let seconds=Math.floor(ms/1000);if(seconds<60)return`${seconds}s`;let minutes=Math.floor(seconds/60);if(minutes<60)return`${minutes}m ${seconds%60}s`;return`${Math.floor(minutes/60)}h ${minutes%60}m`}function describeFile(path){try{let stat=statSync2(path);return`present (${formatBytes(stat.size)}, modified ${stat.mtime.toISOString()})`}catch{return"absent"}}function taskCount(path){try{let parsed=JSON.parse(readFileSync2(path,"utf8"));return Array.isArray(parsed.tasks)?parsed.tasks.length:null}catch{return null}}function tailFile(path,count){try{return readFileSync2(path,"utf8").split(`