wherdr 2.2.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{AgentView.CfD2RWZY.css → AgentView.B12D6ccj.css} +1 -1
  3. package/.output/public/_nuxt/AgentView.B12D6ccj.css.br +0 -0
  4. package/.output/public/_nuxt/AgentView.B12D6ccj.css.gz +0 -0
  5. package/.output/public/_nuxt/{DuVQjOfc.js → B2KlcBQ-.js} +1 -1
  6. package/.output/public/_nuxt/B2KlcBQ-.js.br +0 -0
  7. package/.output/public/_nuxt/{DuVQjOfc.js.gz → B2KlcBQ-.js.gz} +0 -0
  8. package/.output/public/_nuxt/BDTOz37p.js +1 -0
  9. package/.output/public/_nuxt/BDTOz37p.js.br +0 -0
  10. package/.output/public/_nuxt/BDTOz37p.js.gz +0 -0
  11. package/.output/public/_nuxt/BGD5AamG.js +25 -0
  12. package/.output/public/_nuxt/BGD5AamG.js.br +0 -0
  13. package/.output/public/_nuxt/BGD5AamG.js.gz +0 -0
  14. package/.output/public/_nuxt/BdJIc1Xf.js +1 -0
  15. package/.output/public/_nuxt/BdJIc1Xf.js.br +0 -0
  16. package/.output/public/_nuxt/BdJIc1Xf.js.gz +0 -0
  17. package/.output/public/_nuxt/BxlzUs1i.js +23 -0
  18. package/.output/public/_nuxt/BxlzUs1i.js.br +0 -0
  19. package/.output/public/_nuxt/BxlzUs1i.js.gz +0 -0
  20. package/.output/public/_nuxt/C-BDzEtI.js +3 -0
  21. package/.output/public/_nuxt/C-BDzEtI.js.br +0 -0
  22. package/.output/public/_nuxt/C-BDzEtI.js.gz +0 -0
  23. package/.output/public/_nuxt/{CML5cHwz.js → CLf2i_DM.js} +1 -1
  24. package/.output/public/_nuxt/CO4sDeSt.js +62 -0
  25. package/.output/public/_nuxt/CO4sDeSt.js.br +0 -0
  26. package/.output/public/_nuxt/CO4sDeSt.js.gz +0 -0
  27. package/.output/public/_nuxt/{CoRTPMqP.js → CPlkxpge.js} +42 -42
  28. package/.output/public/_nuxt/CPlkxpge.js.br +0 -0
  29. package/.output/public/_nuxt/CPlkxpge.js.gz +0 -0
  30. package/.output/public/_nuxt/CTPNZj4T.js +9 -0
  31. package/.output/public/_nuxt/CTPNZj4T.js.br +0 -0
  32. package/.output/public/_nuxt/CTPNZj4T.js.gz +0 -0
  33. package/.output/public/_nuxt/CV6ukk-M.js +1 -0
  34. package/.output/public/_nuxt/CgUSTIM1.js +1 -0
  35. package/.output/public/_nuxt/CgUSTIM1.js.br +0 -0
  36. package/.output/public/_nuxt/CgUSTIM1.js.gz +0 -0
  37. package/.output/public/_nuxt/CwurhZnh.js +123 -0
  38. package/.output/public/_nuxt/CwurhZnh.js.br +0 -0
  39. package/.output/public/_nuxt/CwurhZnh.js.gz +0 -0
  40. package/.output/public/_nuxt/D7fCPncR.js +1 -0
  41. package/.output/public/_nuxt/D7fCPncR.js.br +0 -0
  42. package/.output/public/_nuxt/D7fCPncR.js.gz +0 -0
  43. package/.output/public/_nuxt/DFe-cDm2.js +1 -0
  44. package/.output/public/_nuxt/DFe-cDm2.js.br +0 -0
  45. package/.output/public/_nuxt/DFe-cDm2.js.gz +0 -0
  46. package/.output/public/_nuxt/Dpe9TNcA.js +31 -0
  47. package/.output/public/_nuxt/Dpe9TNcA.js.br +0 -0
  48. package/.output/public/_nuxt/Dpe9TNcA.js.gz +0 -0
  49. package/.output/public/_nuxt/{board.CeTYM1XN.css → board.fZYj3O-m.css} +1 -1
  50. package/.output/public/_nuxt/board.fZYj3O-m.css.br +0 -0
  51. package/.output/public/_nuxt/board.fZYj3O-m.css.gz +0 -0
  52. package/.output/public/_nuxt/builds/latest.json +1 -1
  53. package/.output/public/_nuxt/builds/meta/75cc4ea7-3027-463a-aa3e-29e474ed7173.json +1 -0
  54. package/.output/public/_nuxt/entry.KNdllmoL.css +2 -0
  55. package/.output/public/_nuxt/entry.KNdllmoL.css.br +0 -0
  56. package/.output/public/_nuxt/entry.KNdllmoL.css.gz +0 -0
  57. package/.output/public/sw.js +1 -1
  58. package/.output/server/chunks/_/branding.mjs +1 -1
  59. package/.output/server/chunks/_/package.mjs +1 -1
  60. package/.output/server/chunks/_/selfupdate.mjs +1 -1
  61. package/.output/server/chunks/_/updates.mjs +18 -5
  62. package/.output/server/chunks/_/worktrees.mjs +1 -1
  63. package/.output/server/chunks/_/ws.mjs +1 -1
  64. package/.output/server/chunks/nitro/nitro.mjs +1109 -609
  65. package/.output/server/chunks/raw/install-claude-statusline.mjs +1 -1
  66. package/.output/server/chunks/routes/api/search.get.mjs +55 -2
  67. package/.output/server/chunks/routes/api/seen.post.mjs +1 -1
  68. package/.output/server/chunks/routes/api/send-now.post.mjs +53 -0
  69. package/.output/server/chunks/routes/api/sessions.get.mjs +1 -1
  70. package/.output/server/chunks/routes/api/sessions.post.mjs +1 -1
  71. package/.output/server/chunks/routes/api/settings-tab.post.mjs +1 -1
  72. package/.output/server/chunks/routes/api/settings.get.mjs +1 -1
  73. package/.output/server/chunks/routes/api/settings.post.mjs +1 -1
  74. package/.output/server/chunks/routes/api/space.post.mjs +1 -177
  75. package/.output/server/chunks/routes/api/split-command.post.mjs +157 -0
  76. package/.output/server/chunks/routes/api/tasks/action.post.mjs +1 -1
  77. package/.output/server/chunks/routes/api/tasks/add.post.mjs +1 -1
  78. package/.output/server/chunks/routes/api/tasks/after.post.mjs +1 -1
  79. package/.output/server/chunks/routes/api/tasks/approve.post.mjs +1 -1
  80. package/.output/server/chunks/routes/api/tasks/archive-done.post.mjs +1 -1
  81. package/.output/server/chunks/routes/api/tasks/archived.get.mjs +1 -1
  82. package/.output/server/chunks/routes/api/tasks/autopilot.get.mjs +1 -1
  83. package/.output/server/chunks/routes/api/tasks/autopilot.post.mjs +1 -1
  84. package/.output/server/chunks/routes/api/tasks/board-settings.get.mjs +1 -1
  85. package/.output/server/chunks/routes/api/tasks/board-settings.post.mjs +1 -1
  86. package/.output/server/chunks/routes/api/tasks/coordinator.get.mjs +1 -1
  87. package/.output/server/chunks/routes/api/tasks/coordinator.post.mjs +1 -1
  88. package/.output/server/chunks/routes/api/tasks/describe.post.mjs +1 -1
  89. package/.output/server/chunks/routes/api/tasks/details.get.mjs +1 -1
  90. package/.output/server/chunks/routes/api/tasks/limit.post.mjs +1 -1
  91. package/.output/server/chunks/routes/api/tasks/links.get.mjs +1 -1
  92. package/.output/server/chunks/routes/api/tasks/models.get.mjs +1 -1
  93. package/.output/server/chunks/routes/api/tasks/pick.post.mjs +1 -1
  94. package/.output/server/chunks/routes/api/tasks/project.get.mjs +1 -1
  95. package/.output/server/chunks/routes/api/tasks/project.post.mjs +1 -1
  96. package/.output/server/chunks/routes/api/tasks/question.post.mjs +1 -1
  97. package/.output/server/chunks/routes/api/tasks/scheduled.get.mjs +1 -1
  98. package/.output/server/chunks/routes/api/tasks/settings.get.mjs +1 -1
  99. package/.output/server/chunks/routes/api/tasks/start.get.mjs +1 -1
  100. package/.output/server/chunks/routes/api/tasks/tell.post.mjs +1 -1
  101. package/.output/server/chunks/routes/api/tasks.get.mjs +1 -1
  102. package/.output/server/chunks/routes/api/unqueue.post.mjs +1 -1
  103. package/.output/server/chunks/routes/icons/_name_.get.mjs +1 -1
  104. package/.output/server/chunks/routes/renderer.mjs +2 -2
  105. package/.output/server/chunks/routes/uploads/_...name_.get.mjs +1 -1
  106. package/.output/server/chunks/routes/ws/_..._.mjs +1 -1
  107. package/.output/server/chunks/routes/ws/events.mjs +5 -1
  108. package/.output/server/chunks/routes/ws/term.mjs +1 -1
  109. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  110. package/.output/server/index.mjs +1 -1
  111. package/.output/server/package.json +1 -1
  112. package/README.md +3 -1
  113. package/docs/README.md +5 -0
  114. package/docs/RELEASING.md +18 -10
  115. package/docs/board.md +8 -1
  116. package/docs/design.md +112 -0
  117. package/docs/devices.md +5 -0
  118. package/docs/herdr-projects-1x.md +28 -0
  119. package/docs/home.md +9 -0
  120. package/docs/installation.md +12 -0
  121. package/docs/quotas.md +6 -0
  122. package/docs/release-notes-2.3.0.md +23 -0
  123. package/docs/release-notes-2.4.0.md +37 -0
  124. package/package.json +1 -1
  125. package/.output/public/_nuxt/30nuHmZs.js +0 -1
  126. package/.output/public/_nuxt/30nuHmZs.js.br +0 -0
  127. package/.output/public/_nuxt/30nuHmZs.js.gz +0 -0
  128. package/.output/public/_nuxt/4gY2mLGX.js +0 -62
  129. package/.output/public/_nuxt/4gY2mLGX.js.br +0 -0
  130. package/.output/public/_nuxt/4gY2mLGX.js.gz +0 -0
  131. package/.output/public/_nuxt/AgentView.CfD2RWZY.css.br +0 -0
  132. package/.output/public/_nuxt/AgentView.CfD2RWZY.css.gz +0 -0
  133. package/.output/public/_nuxt/B8eSr-59.js +0 -1
  134. package/.output/public/_nuxt/B8eSr-59.js.br +0 -0
  135. package/.output/public/_nuxt/B8eSr-59.js.gz +0 -0
  136. package/.output/public/_nuxt/BsbsvkAK.js +0 -1
  137. package/.output/public/_nuxt/BsbsvkAK.js.br +0 -0
  138. package/.output/public/_nuxt/BsbsvkAK.js.gz +0 -0
  139. package/.output/public/_nuxt/CN39A7L5.js +0 -3
  140. package/.output/public/_nuxt/CN39A7L5.js.br +0 -0
  141. package/.output/public/_nuxt/CN39A7L5.js.gz +0 -0
  142. package/.output/public/_nuxt/CfQgQDOp.js +0 -9
  143. package/.output/public/_nuxt/CfQgQDOp.js.br +0 -0
  144. package/.output/public/_nuxt/CfQgQDOp.js.gz +0 -0
  145. package/.output/public/_nuxt/CoRTPMqP.js.br +0 -0
  146. package/.output/public/_nuxt/CoRTPMqP.js.gz +0 -0
  147. package/.output/public/_nuxt/CvGCN0_f.js +0 -23
  148. package/.output/public/_nuxt/CvGCN0_f.js.br +0 -0
  149. package/.output/public/_nuxt/CvGCN0_f.js.gz +0 -0
  150. package/.output/public/_nuxt/DmYihq1h.js +0 -1
  151. package/.output/public/_nuxt/DoX0nZZb.js +0 -105
  152. package/.output/public/_nuxt/DoX0nZZb.js.br +0 -0
  153. package/.output/public/_nuxt/DoX0nZZb.js.gz +0 -0
  154. package/.output/public/_nuxt/DuVQjOfc.js.br +0 -0
  155. package/.output/public/_nuxt/Y-4S7Nuf.js +0 -1
  156. package/.output/public/_nuxt/Y-4S7Nuf.js.br +0 -0
  157. package/.output/public/_nuxt/Y-4S7Nuf.js.gz +0 -0
  158. package/.output/public/_nuxt/board.CeTYM1XN.css.br +0 -0
  159. package/.output/public/_nuxt/board.CeTYM1XN.css.gz +0 -0
  160. package/.output/public/_nuxt/builds/meta/fd79ea32-8bac-487a-afa1-7a6e336fff3f.json +0 -1
  161. package/.output/public/_nuxt/entry.Cd2iNkBC.css +0 -2
  162. package/.output/public/_nuxt/entry.Cd2iNkBC.css.br +0 -0
  163. package/.output/public/_nuxt/entry.Cd2iNkBC.css.gz +0 -0
  164. package/.output/public/_nuxt/hSqNtAW9.js +0 -25
  165. package/.output/public/_nuxt/hSqNtAW9.js.br +0 -0
  166. package/.output/public/_nuxt/hSqNtAW9.js.gz +0 -0
  167. package/.output/public/_nuxt/o1wml4Rx.js +0 -31
  168. package/.output/public/_nuxt/o1wml4Rx.js.br +0 -0
  169. package/.output/public/_nuxt/o1wml4Rx.js.gz +0 -0
@@ -1,7 +1,7 @@
1
1
  import { b as base64ToUint8Array } from '../virtual/_raw-helpers.mjs';
2
2
 
3
3
  // ROLLUP_NO_REPLACE
4
- const installClaudeStatusline = base64ToUint8Array("IyEvYmluL3NoCiMgd2hlcmRyOiBpbnN0YWxscyBDbGF1ZGUgQ29kZSdzIGludmlzaWJsZSBzdGF0dXMgbGluZSAocXVvdGFzICsgYWNjb3VudAojIGZpbmdlcnByaW50KSBmb3IgdGhlIGN1cnJlbnQgdXNlci4gU2VsZi1jb250YWluZWQgKHRoZSBzdGF0dXMgbGluZSBpcyBpbmNsdWRlZAojIGJlbG93KTogd2hlcmRyIHJ1bnMgaXQgYXMgaXMgb24gYSBtYWNoaW5lICgiSW5zdGFsbCIgYnV0dG9uKSBvcgojIGhhbmRzIGl0IG91dCB0byBwYXN0ZSAoIkNvcHkgY29tbWFuZCIpLiBTYWZlIHRvIHJ1biBhZ2FpbjoKIyAgLSB3cml0ZXMgdGhlIHN0YXR1cyBsaW5lIHRvIH4vLmNsYXVkZS93aGVyZHItc3RhdHVzbGluZS5zaCAodXBkYXRlKTsKIyAgLSBubyBgc3RhdHVzTGluZWAgaW4gfi8uY2xhdWRlL3NldHRpbmdzLmpzb246IGFkZHMgb3VyczsKIyAgLSBhbm90aGVyIGBzdGF0dXNMaW5lYCAoY29tbWFuZCk6IGNoYWlucyBpdCBiZWhpbmQgb3VycywgaXRzCiMgICAgb3V0cHV0IHN0YXlzIHRoZSBzYW1lOyBiYWNrdXAgY29weSBzZXR0aW5ncy5qc29uLmJhay13aGVyZHIuCiMgUXVvdGFzIHNob3cgdXAgYWZ0ZXIgdGhlIG5leHQgZXhjaGFuZ2Ugd2l0aCBhIENsYXVkZS4Kc2V0IC1lCmRpcj0iJHtDTEFVREVfQ09ORklHX0RJUjotJEhPTUUvLmNsYXVkZX0iCm1rZGlyIC1wICIkZGlyIgojIC0tLS0gc3RhdHVzIGxpbmUgKHByaW50cyBub3RoaW5nKSAtLS0tCmNhdCA+ICIkZGlyL3doZXJkci1zdGF0dXNsaW5lLnNoLnRtcCIgPDwnV0hFUkRSX1NUQVRVU0xJTkUnCiMhL2Jpbi9zaAojIHdoZXJkcjogQ2xhdWRlIENvZGUncyBpbnZpc2libGUgc3RhdHVzIGxpbmUgKHByaW50cyBub3RoaW5nKS4gSXQgb25seSBrZWVwcwojIHRoZSBhY2NvdW50IHF1b3RhcyAocmF0ZV9saW1pdHMsIHdoaWNoIENsYXVkZSBDb2RlIHBhc3NlcyB0byBpdHMKIyBzdGF0dXMgbGluZSBhZnRlciBlYWNoIGV4Y2hhbmdlKSBmb3IgdGhlIHdoZXJkciBob21lIHNjcmVlbiwgYW5kIGFuIGFjY291bnQKIyBmaW5nZXJwcmludCAodHJ1bmNhdGVkIGhhc2ggb2YgaXRzIElELCBuZXZlciB0aGUgSUQgb3IgdGhlIGVtYWlsKQojIHRvIHRlbGwgYXBhcnQgbWFjaGluZXMgdGhhdCBkbyBub3QgdXNlIHRoZSBzYW1lIGFjY291bnQuCiMgSW5zdGFsbGVkIGJ5IGluc3RhbGwtY2xhdWRlLXN0YXR1c2xpbmUuc2ggKHdoZXJkciByZXBvc2l0b3J5LCBSRUFETUUsICJRdW90YXMKIyBvbiB0aGUgaG9tZSBzY3JlZW4iKS4gRXhpc3Rpbmcgc3RhdHVzIGxpbmU6IHBhc3NlZCBhcyBhbiBhcmd1bWVudCwgaXQgcmVjZWl2ZXMgdGhlCiMgc2FtZSBkYXRhIGFuZCBpdHMgb3V0cHV0IGlzIGtlcHQgKHNoIHdoZXJkci1zdGF0dXNsaW5lLnNoICdjbWQnKS4KZD0kKGNhdCkKY2FzZSAiJGQiIGluCiAgKicicmF0ZV9saW1pdHMiJyopCiAgICBkaXI9IiRIT01FLy5jYWNoZS9oZXJkci13ZWIiCiAgICBta2RpciAtcCAiJGRpciIKICAgICMgQmluZCB0aGUgZmluZ2VycHJpbnQgYW5kIHRpbWVzdGFtcCB0byB0aGUgcGF5bG9hZCBpbiBvbmUgYXRvbWljIHJlbmFtZS4KICAgICMgTm8gZmluZ2VycHJpbnQgVFRMOiBhIGxvZ2luIGNoYW5nZSBtdXN0IGFmZmVjdCB0aGUgdmVyeSBuZXh0IHJlYWRpbmcuCiAgICBwcmludGYgJyVzJyAiJGQiIHwgcHl0aG9uMyAtYyAnCmltcG9ydCBoYXNobGliLCBqc29uLCBvcywgc3lzLCB0ZW1wZmlsZSwgdGltZQpmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKY2FjaGUgPSBQYXRoKHN5cy5hcmd2WzFdKQpjb25maWcgPSBQYXRoKG9zLmVudmlyb24uZ2V0KCJDTEFVREVfQ09ORklHX0RJUiIsIG9zLmVudmlyb25bIkhPTUUiXSkpIC8gIi5jbGF1ZGUuanNvbiIKdHJ5OgogICAgYWNjb3VudF9pZCA9IGpzb24ubG9hZHMoY29uZmlnLnJlYWRfdGV4dCgpKS5nZXQoIm9hdXRoQWNjb3VudCIsIHt9KS5nZXQoImFjY291bnRVdWlkIikKZXhjZXB0IChPU0Vycm9yLCBWYWx1ZUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6CiAgICBhY2NvdW50X2lkID0gTm9uZQphY2NvdW50ID0gaGFzaGxpYi5zaGEyNTYoKCJ3aGVyZHI6IiArIGFjY291bnRfaWQpLmVuY29kZSgpKS5oZXhkaWdlc3QoKVs6MTZdIGlmIGlzaW5zdGFuY2UoYWNjb3VudF9pZCwgc3RyKSBhbmQgYWNjb3VudF9pZCBlbHNlIE5vbmUKc3RhdHVzID0ganNvbi5sb2FkKHN5cy5zdGRpbikKc3RhdHVzWyJfd2hlcmRyIl0gPSB7InZlcnNpb24iOiAxLCAiYWNjb3VudCI6IGFjY291bnQsICJhdCI6IGludCh0aW1lLnRpbWUoKSAqIDEwMDApfQpkZWYgYXRvbWljKG5hbWUsIHRleHQpOgogICAgZmQsIHRlbXAgPSB0ZW1wZmlsZS5ta3N0ZW1wKHByZWZpeD1uYW1lICsgIi4iLCBkaXI9Y2FjaGUpCiAgICB0cnk6CiAgICAgICAgd2l0aCBvcy5mZG9wZW4oZmQsICJ3IikgYXMgZjoKICAgICAgICAgICAgZi53cml0ZSh0ZXh0KQogICAgICAgIG9zLnJlcGxhY2UodGVtcCwgY2FjaGUgLyBuYW1lKQogICAgZmluYWxseToKICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyh0ZW1wKToKICAgICAgICAgICAgb3MudW5saW5rKHRlbXApCiMgQ29tcGF0aWJpbGl0eSBmb3Igb2xkZXIgcmVhZGVyczsgbmV3IHJlYWRlcnMgdXNlIG9ubHkgdGhlIGVtYmVkZGVkIGFjY291bnQuCmlmIGFjY291bnQ6CiAgICBhdG9taWMoImNsYXVkZS1hY2NvdW50IiwgYWNjb3VudCArICJcbiIpCmVsc2U6CiAgICAoY2FjaGUgLyAiY2xhdWRlLWFjY291bnQiKS51bmxpbmsobWlzc2luZ19vaz1UcnVlKQphdG9taWMoImNsYXVkZS1zdGF0dXMuanNvbiIsIGpzb24uZHVtcHMoc3RhdHVzKSkKJyAiJGRpciIgOzsKZXNhYwppZiBbIC1uICIkMSIgXTsgdGhlbiBwcmludGYgJyVzJyAiJGQiIHwgc2ggLWMgIiQxIjsgZXhpdCAkPzsgZmkKZXhpdCAwCldIRVJEUl9TVEFUVVNMSU5FCmNobW9kIDc1NSAiJGRpci93aGVyZHItc3RhdHVzbGluZS5zaC50bXAiCm12ICIkZGlyL3doZXJkci1zdGF0dXNsaW5lLnNoLnRtcCIgIiRkaXIvd2hlcmRyLXN0YXR1c2xpbmUuc2giCmVjaG8gInN0YXR1cyBsaW5lIHdyaXR0ZW46ICRkaXIvd2hlcmRyLXN0YXR1c2xpbmUuc2giCiMgLS0tLSBzZXR0aW5ncy5qc29uIC0tLS0KWyAtZiAiJGRpci9zZXR0aW5ncy5qc29uIiBdIHx8IGVjaG8gJ3t9JyA+ICIkZGlyL3NldHRpbmdzLmpzb24iCmNwICIkZGlyL3NldHRpbmdzLmpzb24iICIkZGlyL3NldHRpbmdzLmpzb24uYmFrLXdoZXJkciIKcHl0aG9uMyAtICIkZGlyL3NldHRpbmdzLmpzb24iICIkZGlyL3doZXJkci1zdGF0dXNsaW5lLnNoIiA8PCdXSEVSRFJfUFknCmltcG9ydCBqc29uLCBzaGxleCwgc3lzCnBhdGgsIHNjcmlwdCA9IHN5cy5hcmd2WzFdLCBzeXMuYXJndlsyXQpkID0ganNvbi5sb2FkKG9wZW4ocGF0aCkpCm91cnMgPSAnc2ggJyArIHNobGV4LnF1b3RlKHNjcmlwdCkKY3VyID0gZC5nZXQoJ3N0YXR1c0xpbmUnKQppZiBpc2luc3RhbmNlKGN1ciwgZGljdCkgYW5kICd3aGVyZHItc3RhdHVzbGluZS5zaCcgaW4gc3RyKGN1ci5nZXQoJ2NvbW1hbmQnLCAnJykpOgogICAgcHJpbnQoJ2FscmVhZHkgaW5zdGFsbGVkOicsIGN1clsnY29tbWFuZCddKQogICAgc3lzLmV4aXQoMCkKaWYgY3VyIGlzIE5vbmU6CiAgICBkWydzdGF0dXNMaW5lJ10gPSB7J3R5cGUnOiAnY29tbWFuZCcsICdjb21tYW5kJzogb3Vyc30KICAgIHByaW50KCdzdGF0dXMgbGluZSBhZGRlZDonLCBvdXJzKQplbGlmIGlzaW5zdGFuY2UoY3VyLCBkaWN0KSBhbmQgY3VyLmdldCgndHlwZScpID09ICdjb21tYW5kJyBhbmQgY3VyLmdldCgnY29tbWFuZCcpOgogICAgZFsnc3RhdHVzTGluZSddID0geyoqY3VyLCAnY29tbWFuZCc6IG91cnMgKyAnICcgKyBzaGxleC5xdW90ZShjdXJbJ2NvbW1hbmQnXSl9CiAgICBwcmludCgnZXhpc3Rpbmcgc3RhdHVzIGxpbmUgY2hhaW5lZDonLCBkWydzdGF0dXNMaW5lJ11bJ2NvbW1hbmQnXSkKZWxzZToKICAgIHByaW50KCd1bmtub3duIHN0YXR1c0xpbmUsIG5vdGhpbmcgY2hhbmdlZDonLCBqc29uLmR1bXBzKGN1ciksIGZpbGU9c3lzLnN0ZGVycikKICAgIHN5cy5leGl0KDEpCndpdGggb3BlbihwYXRoLCAndycpIGFzIGY6CiAgICBqc29uLmR1bXAoZCwgZiwgaW5kZW50PTIsIGVuc3VyZV9hc2NpaT1GYWxzZSkKICAgIGYud3JpdGUoJ1xuJykKV0hFUkRSX1BZCg==");
4
+ const installClaudeStatusline = base64ToUint8Array("IyEvYmluL3NoCiMgd2hlcmRyOiBpbnN0YWxscyBDbGF1ZGUgQ29kZSdzIGludmlzaWJsZSBzdGF0dXMgbGluZSAocXVvdGFzICsgYWNjb3VudAojIGZpbmdlcnByaW50KSBmb3IgdGhlIGN1cnJlbnQgdXNlci4gU2VsZi1jb250YWluZWQgKHRoZSBzdGF0dXMgbGluZSBpcyBpbmNsdWRlZAojIGJlbG93KTogd2hlcmRyIHJ1bnMgaXQgYXMgaXMgb24gYSBtYWNoaW5lICgiSW5zdGFsbCIgYnV0dG9uKSBvcgojIGhhbmRzIGl0IG91dCB0byBwYXN0ZSAoIkNvcHkgY29tbWFuZCIpLiBTYWZlIHRvIHJ1biBhZ2FpbjoKIyAgLSB3cml0ZXMgdGhlIHN0YXR1cyBsaW5lIHRvIH4vLmNsYXVkZS93aGVyZHItc3RhdHVzbGluZS5zaCAodXBkYXRlKTsKIyAgLSBubyBgc3RhdHVzTGluZWAgaW4gfi8uY2xhdWRlL3NldHRpbmdzLmpzb246IGFkZHMgb3VyczsKIyAgLSBhbm90aGVyIGBzdGF0dXNMaW5lYCAoY29tbWFuZCk6IGNoYWlucyBpdCBiZWhpbmQgb3VycywgaXRzCiMgICAgb3V0cHV0IHN0YXlzIHRoZSBzYW1lOyBiYWNrdXAgY29weSBzZXR0aW5ncy5qc29uLmJhay13aGVyZHIuCiMgUXVvdGFzIHNob3cgdXAgYWZ0ZXIgdGhlIG5leHQgZXhjaGFuZ2Ugd2l0aCBhIENsYXVkZS4Kc2V0IC1lCmRpcj0iJHtDTEFVREVfQ09ORklHX0RJUjotJEhPTUUvLmNsYXVkZX0iCm1rZGlyIC1wICIkZGlyIgojIC0tLS0gc3RhdHVzIGxpbmUgKHByaW50cyBub3RoaW5nKSAtLS0tCmNhdCA+ICIkZGlyL3doZXJkci1zdGF0dXNsaW5lLnNoLnRtcCIgPDwnV0hFUkRSX1NUQVRVU0xJTkUnCiMhL2Jpbi9zaAojIHdoZXJkcjogQ2xhdWRlIENvZGUncyBpbnZpc2libGUgc3RhdHVzIGxpbmUgKHByaW50cyBub3RoaW5nKS4gSXQgb25seSBrZWVwcwojIHRoZSBhY2NvdW50IHF1b3RhcyAocmF0ZV9saW1pdHMsIHdoaWNoIENsYXVkZSBDb2RlIHBhc3NlcyB0byBpdHMKIyBzdGF0dXMgbGluZSBhZnRlciBlYWNoIGV4Y2hhbmdlKSBmb3IgdGhlIHdoZXJkciBob21lIHNjcmVlbiwgYW5kIGFuIGFjY291bnQKIyBmaW5nZXJwcmludCAodHJ1bmNhdGVkIGhhc2ggb2YgaXRzIElELCBuZXZlciB0aGUgSUQgb3IgdGhlIGVtYWlsKQojIHRvIHRlbGwgYXBhcnQgbWFjaGluZXMgdGhhdCBkbyBub3QgdXNlIHRoZSBzYW1lIGFjY291bnQuIE9uIEFQSSBiaWxsaW5nCiMgKEFQSSBrZXksIENvbnNvbGUgY3JlZGl0cykgQ2xhdWRlIENvZGUgcGFzc2VzIG5vIHJhdGVfbGltaXRzOiBvbmNlIHRoZSBzZXNzaW9uCiMgaGFzIGhhZCBhbiBBUEkgcmVzcG9uc2UgKGNvc3QudG90YWxfYXBpX2R1cmF0aW9uX21zID4gMCksIHRoZSBzbmFwc2hvdCBpcyBrZXB0CiMgd2l0aG91dCB0aGVtLCBhbmQgd2hlcmRyIHJlYWRzICJBUEkgdXNhZ2UsIG5vIHF1b3RhIiBmb3IgdGhlIG1hY2hpbmUuCiMgSW5zdGFsbGVkIGJ5IGluc3RhbGwtY2xhdWRlLXN0YXR1c2xpbmUuc2ggKHdoZXJkciByZXBvc2l0b3J5LCBSRUFETUUsICJRdW90YXMKIyBvbiB0aGUgaG9tZSBzY3JlZW4iKS4gRXhpc3Rpbmcgc3RhdHVzIGxpbmU6IHBhc3NlZCBhcyBhbiBhcmd1bWVudCwgaXQgcmVjZWl2ZXMgdGhlCiMgc2FtZSBkYXRhIGFuZCBpdHMgb3V0cHV0IGlzIGtlcHQgKHNoIHdoZXJkci1zdGF0dXNsaW5lLnNoICdjbWQnKS4KZD0kKGNhdCkKY2FzZSAiJGQiIGluCiAgKicicmF0ZV9saW1pdHMiJyp8KicidG90YWxfYXBpX2R1cmF0aW9uX21zIicqKQogICAgZGlyPSIkSE9NRS8uY2FjaGUvaGVyZHItd2ViIgogICAgbWtkaXIgLXAgIiRkaXIiCiAgICAjIEJpbmQgdGhlIGZpbmdlcnByaW50IGFuZCB0aW1lc3RhbXAgdG8gdGhlIHBheWxvYWQgaW4gb25lIGF0b21pYyByZW5hbWUuCiAgICAjIE5vIGZpbmdlcnByaW50IFRUTDogYSBsb2dpbiBjaGFuZ2UgbXVzdCBhZmZlY3QgdGhlIHZlcnkgbmV4dCByZWFkaW5nLgogICAgcHJpbnRmICclcycgIiRkIiB8IHB5dGhvbjMgLWMgJwppbXBvcnQgaGFzaGxpYiwganNvbiwgb3MsIHN5cywgdGVtcGZpbGUsIHRpbWUKZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCmNhY2hlID0gUGF0aChzeXMuYXJndlsxXSkKY29uZmlnID0gUGF0aChvcy5lbnZpcm9uLmdldCgiQ0xBVURFX0NPTkZJR19ESVIiLCBvcy5lbnZpcm9uWyJIT01FIl0pKSAvICIuY2xhdWRlLmpzb24iCnRyeToKICAgIGFjY291bnRfaWQgPSBqc29uLmxvYWRzKGNvbmZpZy5yZWFkX3RleHQoKSkuZ2V0KCJvYXV0aEFjY291bnQiLCB7fSkuZ2V0KCJhY2NvdW50VXVpZCIpCmV4Y2VwdCAoT1NFcnJvciwgVmFsdWVFcnJvciwgQXR0cmlidXRlRXJyb3IpOgogICAgYWNjb3VudF9pZCA9IE5vbmUKYWNjb3VudCA9IGhhc2hsaWIuc2hhMjU2KCgid2hlcmRyOiIgKyBhY2NvdW50X2lkKS5lbmNvZGUoKSkuaGV4ZGlnZXN0KClbOjE2XSBpZiBpc2luc3RhbmNlKGFjY291bnRfaWQsIHN0cikgYW5kIGFjY291bnRfaWQgZWxzZSBOb25lCnN0YXR1cyA9IGpzb24ubG9hZChzeXMuc3RkaW4pCmlmIG5vdCBpc2luc3RhbmNlKHN0YXR1cywgZGljdCk6CiAgICBzeXMuZXhpdCgwKQppZiAicmF0ZV9saW1pdHMiIG5vdCBpbiBzdGF0dXM6CiAgICAjIFN1YnNjcmliZXJzIGdldCByYXRlX2xpbWl0cyBvbmx5IGFmdGVyIHRoZSBmaXJzdCBBUEkgcmVzcG9uc2Ugb2YgYSBzZXNzaW9uOgogICAgIyB3aXRob3V0IG9uZSB5ZXQsIG5vdGhpbmcgaXMga25vd24uIEEgc2Vzc2lvbiB0aGF0IGFscmVhZHkgZ2F2ZSByYXRlIGxpbWl0cwogICAgIyBzdGF5cyBhIHN1YnNjcmlwdGlvbiAoYSB3aW5kb3cgbWF5IGRyb3Agb3V0IG9uY2UgaXQgcmVzZXRzKS4KICAgIGFwaV9tcyA9IChzdGF0dXMuZ2V0KCJjb3N0Iikgb3Ige30pLmdldCgidG90YWxfYXBpX2R1cmF0aW9uX21zIikKICAgIGlmIG5vdCBpc2luc3RhbmNlKGFwaV9tcywgKGludCwgZmxvYXQpKSBvciBhcGlfbXMgPD0gMDoKICAgICAgICBzeXMuZXhpdCgwKQogICAgdHJ5OgogICAgICAgIHByZXYgPSBqc29uLmxvYWRzKChjYWNoZSAvICJjbGF1ZGUtc3RhdHVzLmpzb24iKS5yZWFkX3RleHQoKSkKICAgICAgICBpZiBwcmV2LmdldCgicmF0ZV9saW1pdHMiKSBpcyBub3QgTm9uZSBhbmQgcHJldi5nZXQoInNlc3Npb25faWQiKSA9PSBzdGF0dXMuZ2V0KCJzZXNzaW9uX2lkIik6CiAgICAgICAgICAgIHN5cy5leGl0KDApCiAgICBleGNlcHQgKE9TRXJyb3IsIFZhbHVlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKICAgICAgICBwYXNzCnN0YXR1c1siX3doZXJkciJdID0geyJ2ZXJzaW9uIjogMSwgImFjY291bnQiOiBhY2NvdW50LCAiYXQiOiBpbnQodGltZS50aW1lKCkgKiAxMDAwKX0KZGVmIGF0b21pYyhuYW1lLCB0ZXh0KToKICAgIGZkLCB0ZW1wID0gdGVtcGZpbGUubWtzdGVtcChwcmVmaXg9bmFtZSArICIuIiwgZGlyPWNhY2hlKQogICAgdHJ5OgogICAgICAgIHdpdGggb3MuZmRvcGVuKGZkLCAidyIpIGFzIGY6CiAgICAgICAgICAgIGYud3JpdGUodGV4dCkKICAgICAgICBvcy5yZXBsYWNlKHRlbXAsIGNhY2hlIC8gbmFtZSkKICAgIGZpbmFsbHk6CiAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGVtcCk6CiAgICAgICAgICAgIG9zLnVubGluayh0ZW1wKQojIENvbXBhdGliaWxpdHkgZm9yIG9sZGVyIHJlYWRlcnM7IG5ldyByZWFkZXJzIHVzZSBvbmx5IHRoZSBlbWJlZGRlZCBhY2NvdW50LgppZiBhY2NvdW50OgogICAgYXRvbWljKCJjbGF1ZGUtYWNjb3VudCIsIGFjY291bnQgKyAiXG4iKQplbHNlOgogICAgKGNhY2hlIC8gImNsYXVkZS1hY2NvdW50IikudW5saW5rKG1pc3Npbmdfb2s9VHJ1ZSkKYXRvbWljKCJjbGF1ZGUtc3RhdHVzLmpzb24iLCBqc29uLmR1bXBzKHN0YXR1cykpCicgIiRkaXIiIDs7CmVzYWMKaWYgWyAtbiAiJDEiIF07IHRoZW4gcHJpbnRmICclcycgIiRkIiB8IHNoIC1jICIkMSI7IGV4aXQgJD87IGZpCmV4aXQgMApXSEVSRFJfU1RBVFVTTElORQpjaG1vZCA3NTUgIiRkaXIvd2hlcmRyLXN0YXR1c2xpbmUuc2gudG1wIgptdiAiJGRpci93aGVyZHItc3RhdHVzbGluZS5zaC50bXAiICIkZGlyL3doZXJkci1zdGF0dXNsaW5lLnNoIgplY2hvICJzdGF0dXMgbGluZSB3cml0dGVuOiAkZGlyL3doZXJkci1zdGF0dXNsaW5lLnNoIgojIC0tLS0gc2V0dGluZ3MuanNvbiAtLS0tClsgLWYgIiRkaXIvc2V0dGluZ3MuanNvbiIgXSB8fCBlY2hvICd7fScgPiAiJGRpci9zZXR0aW5ncy5qc29uIgpjcCAiJGRpci9zZXR0aW5ncy5qc29uIiAiJGRpci9zZXR0aW5ncy5qc29uLmJhay13aGVyZHIiCnB5dGhvbjMgLSAiJGRpci9zZXR0aW5ncy5qc29uIiAiJGRpci93aGVyZHItc3RhdHVzbGluZS5zaCIgPDwnV0hFUkRSX1BZJwppbXBvcnQganNvbiwgc2hsZXgsIHN5cwpwYXRoLCBzY3JpcHQgPSBzeXMuYXJndlsxXSwgc3lzLmFyZ3ZbMl0KZCA9IGpzb24ubG9hZChvcGVuKHBhdGgpKQpvdXJzID0gJ3NoICcgKyBzaGxleC5xdW90ZShzY3JpcHQpCmN1ciA9IGQuZ2V0KCdzdGF0dXNMaW5lJykKaWYgaXNpbnN0YW5jZShjdXIsIGRpY3QpIGFuZCAnd2hlcmRyLXN0YXR1c2xpbmUuc2gnIGluIHN0cihjdXIuZ2V0KCdjb21tYW5kJywgJycpKToKICAgIHByaW50KCdhbHJlYWR5IGluc3RhbGxlZDonLCBjdXJbJ2NvbW1hbmQnXSkKICAgIHN5cy5leGl0KDApCmlmIGN1ciBpcyBOb25lOgogICAgZFsnc3RhdHVzTGluZSddID0geyd0eXBlJzogJ2NvbW1hbmQnLCAnY29tbWFuZCc6IG91cnN9CiAgICBwcmludCgnc3RhdHVzIGxpbmUgYWRkZWQ6Jywgb3VycykKZWxpZiBpc2luc3RhbmNlKGN1ciwgZGljdCkgYW5kIGN1ci5nZXQoJ3R5cGUnKSA9PSAnY29tbWFuZCcgYW5kIGN1ci5nZXQoJ2NvbW1hbmQnKToKICAgIGRbJ3N0YXR1c0xpbmUnXSA9IHsqKmN1ciwgJ2NvbW1hbmQnOiBvdXJzICsgJyAnICsgc2hsZXgucXVvdGUoY3VyWydjb21tYW5kJ10pfQogICAgcHJpbnQoJ2V4aXN0aW5nIHN0YXR1cyBsaW5lIGNoYWluZWQ6JywgZFsnc3RhdHVzTGluZSddWydjb21tYW5kJ10pCmVsc2U6CiAgICBwcmludCgndW5rbm93biBzdGF0dXNMaW5lLCBub3RoaW5nIGNoYW5nZWQ6JywganNvbi5kdW1wcyhjdXIpLCBmaWxlPXN5cy5zdGRlcnIpCiAgICBzeXMuZXhpdCgxKQp3aXRoIG9wZW4ocGF0aCwgJ3cnKSBhcyBmOgogICAganNvbi5kdW1wKGQsIGYsIGluZGVudD0yLCBlbnN1cmVfYXNjaWk9RmFsc2UpCiAgICBmLndyaXRlKCdcbicpCldIRVJEUl9QWQo=");
5
5
 
6
6
  export { installClaudeStatusline as default };
7
7
  //# sourceMappingURL=install-claude-statusline.mjs.map
@@ -1,4 +1,4 @@
1
- import { a as defineApi, i as getQuery, a$ as getState, by as hasTranscript, q as machineOfPane, bz as SEARCH_DEADLINE_MS, bA as SEARCH_MAX_RESULTS, bB as spaceTitle } from '../../nitro/nitro.mjs';
1
+ import { by as excerpt, bz as taskKey, bA as foldSearch, bB as matchAt, a as defineApi, i as getQuery, bC as searchableBoards, a$ as getState, bD as hasTranscript, q as machineOfPane, bE as SEARCH_DEADLINE_MS, bF as SEARCH_MAX_RESULTS, bG as spaceTitle } from '../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -31,9 +31,62 @@ import 'node:url';
31
31
  import 'node:zlib';
32
32
  import '@simplewebauthn/server';
33
33
 
34
+ const TASK_SEARCH_MAX = 12;
35
+ const compact = (s) => foldSearch(s).replace(/[\s_-]+/g, "");
36
+ const WORD = /[\p{L}\p{N}]/u;
37
+ function wordStart(text, q) {
38
+ for (let i = text.indexOf(q); i >= 0; i = text.indexOf(q, i + 1)) if (i === 0 || !WORD.test(text[i - 1])) return true;
39
+ return false;
40
+ }
41
+ function taskScore(t, query) {
42
+ const q = foldSearch(query.trim());
43
+ if (!q) return null;
44
+ const key = taskKey(t.row.id, t.row.repoKey);
45
+ const names = [key, t.row.id, `#${t.row.n}`].map(compact);
46
+ const cq = compact(q);
47
+ if (names.includes(cq)) return { score: 0, field: "id", at: 0 };
48
+ if (/\d/.test(cq) && (cq === String(t.row.n) || names.some((n) => n.startsWith(cq)))) return { score: 1, field: "id", at: 0 };
49
+ const title = foldSearch(t.row.title);
50
+ const at = title.indexOf(q);
51
+ if (at === 0) return { score: 2, field: "title", at };
52
+ if (at > 0) return { score: wordStart(title, q) ? 3 : 4, field: "title", at };
53
+ const d = matchAt(t.description, query.trim());
54
+ return d < 0 ? null : { score: 5, field: "description", at: d };
55
+ }
56
+ const GROUP_RANK = { needs: 0, ready: 0, working: 0, todo: 0, done: 1 };
57
+ function searchTasks(boards, query, max = TASK_SEARCH_MAX) {
58
+ const found = [];
59
+ for (const b of boards) {
60
+ for (const t of b.tasks) {
61
+ if (t.row.archived) continue;
62
+ const m = taskScore(t, query);
63
+ if (!m) continue;
64
+ found.push({
65
+ score: m.score,
66
+ n: t.row.n,
67
+ hit: {
68
+ machine: b.machine,
69
+ id: t.row.id,
70
+ key: taskKey(t.row.id, t.row.repoKey),
71
+ repo: t.row.repo,
72
+ title: t.row.title,
73
+ stage: t.row.stage,
74
+ group: t.row.group,
75
+ field: m.field,
76
+ ...m.field === "description" ? { excerpt: excerpt(t.description, m.at, 100, query.trim()) } : {}
77
+ }
78
+ });
79
+ }
80
+ }
81
+ found.sort((a, b) => a.score - b.score || GROUP_RANK[a.hit.group] - GROUP_RANK[b.hit.group] || b.n - a.n);
82
+ return { hits: found.slice(0, max).map((f) => f.hit), limited: found.length > max };
83
+ }
84
+
85
+ const TASKS_DEADLINE_MS = 1500;
34
86
  const search_get = defineApi(async (event) => {
35
87
  const query = String(getQuery(event).q || "").trim().slice(0, 100);
36
88
  if (query.length < 2) return { hits: [], limited: false };
89
+ const tasks = searchableBoards(TASKS_DEADLINE_MS).then((boards) => searchTasks(boards, query).hits, () => []);
37
90
  const panes = getState().panes.filter((p) => {
38
91
  var _a;
39
92
  return hasTranscript(p.agent) && (!machineOfPane(p.id) || ((_a = machineOfPane(p.id)) == null ? void 0 : _a.status) === "online");
@@ -76,7 +129,7 @@ const search_get = defineApi(async (event) => {
76
129
  await Promise.all([worker(), worker(), worker()]);
77
130
  if (next < panes.length) limited = true;
78
131
  hits.sort((a, b) => Date.parse(b.ts || "") - Date.parse(a.ts || ""));
79
- return { hits, limited };
132
+ return { hits, limited, tasks: await tasks };
80
133
  });
81
134
 
82
135
  export { search_get as default };
@@ -1,4 +1,4 @@
1
- import { a as defineApi, P as PANE_RE, H as HerdrError, bC as markSeen } from '../../nitro/nitro.mjs';
1
+ import { a as defineApi, P as PANE_RE, H as HerdrError, bH as markSeen } from '../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -0,0 +1,53 @@
1
+ import { a as defineApi, P as PANE_RE, H as HerdrError, M as withPaneLock, f as findPane, h as herdr, bI as parseClaudeScreen, p as poll } from '../../nitro/nitro.mjs';
2
+ import 'node:http';
3
+ import 'node:https';
4
+ import 'node:crypto';
5
+ import 'stream';
6
+ import 'events';
7
+ import 'http';
8
+ import 'crypto';
9
+ import 'buffer';
10
+ import 'zlib';
11
+ import 'https';
12
+ import 'net';
13
+ import 'tls';
14
+ import 'url';
15
+ import 'node:events';
16
+ import 'node:buffer';
17
+ import 'node:fs';
18
+ import 'node:path';
19
+ import 'node:os';
20
+ import 'node:net';
21
+ import 'node:child_process';
22
+ import 'node:dns';
23
+ import 'node:util';
24
+ import 'web-push';
25
+ import 'node:string_decoder';
26
+ import 'node:fs/promises';
27
+ import 'node:readline';
28
+ import 'qrcode-terminal/vendor/QRCode/index.js';
29
+ import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
30
+ import 'node:url';
31
+ import 'node:zlib';
32
+ import '@simplewebauthn/server';
33
+
34
+ const sendNow_post = defineApi(async (_event, b) => {
35
+ if (!PANE_RE.test(b.pane_id || "")) throw new HerdrError("bad_pane", "Invalid pane");
36
+ await withPaneLock(b.pane_id, async () => {
37
+ var _a, _b;
38
+ const p = findPane(b.pane_id);
39
+ if (!p || p.agent !== "claude" || p.status !== "working" || p.stopped || p.leaving) {
40
+ throw new HerdrError("stale", "The screen has changed \u2014 check the current screen.");
41
+ }
42
+ const r = await herdr("pane.read", { pane_id: b.pane_id, source: "detection" }, 4e3);
43
+ if (!((_b = parseClaudeScreen((_a = r.read) == null ? void 0 : _a.text)) == null ? void 0 : _b.sendNow)) {
44
+ throw new HerdrError("stale", "The screen has changed \u2014 check the current screen.");
45
+ }
46
+ await herdr("pane.send_input", { pane_id: b.pane_id, keys: ["ctrl+enter"] });
47
+ });
48
+ setTimeout(poll, 0);
49
+ return { ok: true };
50
+ });
51
+
52
+ export { sendNow_post as default };
53
+ //# sourceMappingURL=send-now.post.mjs.map
@@ -1,4 +1,4 @@
1
- import { a as defineApi, i as getQuery, bD as listSessions } from '../../nitro/nitro.mjs';
1
+ import { a as defineApi, i as getQuery, bJ as listSessions } from '../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, H as HerdrError, bE as openSession } from '../../nitro/nitro.mjs';
1
+ import { a as defineApi, H as HerdrError, bK as openSession } from '../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, P as PANE_RE, H as HerdrError, f as findPane, h as herdr, bu as settingsTabs, bv as tabsOfRow, bF as settingsFocus, X as sleep, g as choicesCache } from '../../nitro/nitro.mjs';
1
+ import { a as defineApi, P as PANE_RE, H as HerdrError, f as findPane, h as herdr, bu as settingsTabs, bv as tabsOfRow, bL as settingsFocus, X as sleep, g as choicesCache } from '../../nitro/nitro.mjs';
2
2
  import { a as activeTab } from '../../_/settingstabs.mjs';
3
3
  import 'node:http';
4
4
  import 'node:https';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, bG as readSettings } from '../../nitro/nitro.mjs';
1
+ import { a as defineApi, bM as readSettings } from '../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, bH as cleanSettingsPatch, H as HerdrError, bI as patchSettings } from '../../nitro/nitro.mjs';
1
+ import { a as defineApi, bN as cleanSettingsPatch, H as HerdrError, bO as patchSettings } from '../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { bJ as PANE_DIRECTIONS, a_ as splitId, br as PANE_RE, a as defineApi, H as HerdrError, aa as log, p as poll, aZ as herdrOn } from '../../nitro/nitro.mjs';
1
+ import { a as defineApi, bP as spaceCall, bQ as SpaceActionError, H as HerdrError, aa as log, p as poll, aZ as herdrOn, bR as dropSteps, bS as verifySpaceRename, bT as spaceResult, bU as swapSteps } from '../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -31,182 +31,6 @@ import 'node:url';
31
31
  import 'node:zlib';
32
32
  import '@simplewebauthn/server';
33
33
 
34
- var __defProp = Object.defineProperty;
35
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
36
- var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
37
- const WORKSPACE_RE = /^(?:[0-9a-f]{4,32}~)?w[0-9a-z]+$/i;
38
- const TAB_RE = /^(?:[0-9a-f]{4,32}~)?w[0-9a-z]+:t[0-9a-z]+$/i;
39
- const LABEL_MAX = 60;
40
- class SpaceActionError extends Error {
41
- constructor(code, message) {
42
- super(message);
43
- __publicField(this, "code");
44
- this.code = code;
45
- }
46
- }
47
- const fail = (code, message) => {
48
- throw new SpaceActionError(code, message);
49
- };
50
- const cleanLabel = (v) => String(v != null ? v : "").replace(/\s+/g, " ").trim().slice(0, LABEL_MAX);
51
- function idOf(v, re, what) {
52
- const s = String(v != null ? v : "");
53
- if (!re.test(s)) fail("bad_id", `invalid ${what}`);
54
- return splitId(s);
55
- }
56
- const cleanCwd = (x) => typeof x === "string" && x.startsWith("/") && x.length <= 4096 && !x.includes("\0") ? x : null;
57
- function spaceCall(body) {
58
- var _a;
59
- const b = body && typeof body === "object" ? body : {};
60
- const op = String(b.op || "");
61
- switch (op) {
62
- case "tab.create": {
63
- const w = idOf(b.workspace_id, WORKSPACE_RE, "workspace");
64
- const label = cleanLabel(b.label);
65
- const cwd = cleanCwd(b.cwd);
66
- return { machine: w.machine, method: "tab.create", params: { workspace_id: w.local, ...label ? { label } : {}, ...cwd ? { cwd } : {}, focus: false } };
67
- }
68
- case "workspace.rename":
69
- case "tab.rename": {
70
- const isTab = op === "tab.rename";
71
- const x = isTab ? idOf(b.tab_id, TAB_RE, "tab") : idOf(b.workspace_id, WORKSPACE_RE, "workspace");
72
- const label = cleanLabel(b.label);
73
- if (!label) fail("bad_label", "empty name");
74
- return { machine: x.machine, method: op, params: { [isTab ? "tab_id" : "workspace_id"]: x.local, label } };
75
- }
76
- case "workspace.close": {
77
- const w = idOf(b.workspace_id, WORKSPACE_RE, "workspace");
78
- return { machine: w.machine, method: op, params: { workspace_id: w.local, ...b.close_group === true ? { close_group: true } : {} } };
79
- }
80
- case "tab.close": {
81
- const x = idOf(b.tab_id, TAB_RE, "tab");
82
- if (b.close_group === true) return { machine: x.machine, method: "workspace.close", params: { workspace_id: x.local.split(":")[0], close_group: true } };
83
- return { machine: x.machine, method: op, params: { tab_id: x.local } };
84
- }
85
- case "pane.split": {
86
- const p = idOf(b.pane_id, PANE_RE, "pane");
87
- const direction = b.direction;
88
- if (direction !== "right" && direction !== "down") fail("bad_direction", "invalid direction");
89
- const cwd = cleanCwd(b.cwd);
90
- return { machine: p.machine, method: op, params: { target_pane_id: p.local, direction, ...cwd ? { cwd } : {}, focus: false } };
91
- }
92
- case "pane.move": {
93
- const p = idOf(b.pane_id, PANE_RE, "pane");
94
- const to = b.to;
95
- let destination;
96
- if (to === "new_tab") destination = { type: "new_tab", workspace_id: p.local.split(":")[0] };
97
- else if (to === "new_workspace") destination = { type: "new_workspace" };
98
- else if (to && typeof to === "object") {
99
- const x = idOf(to.tab_id, TAB_RE, "tab");
100
- if (x.machine !== p.machine) fail("bad_machine", "tab on another machine");
101
- destination = { type: "tab", tab_id: x.local, split: "right" };
102
- } else return fail("bad_destination", "invalid destination");
103
- return { machine: p.machine, method: op, params: { pane_id: p.local, destination, focus: false } };
104
- }
105
- case "pane.swap": {
106
- const p = idOf(b.pane_id, PANE_RE, "pane");
107
- const direction = b.direction;
108
- if (!PANE_DIRECTIONS.includes(direction)) fail("bad_direction", "invalid direction");
109
- return { machine: p.machine, method: op, params: { pane_id: p.local, direction } };
110
- }
111
- case "pane.drop": {
112
- const p = idOf(b.pane_id, PANE_RE, "pane");
113
- const x = idOf(b.target_pane_id, PANE_RE, "pane");
114
- if (x.machine !== p.machine) fail("bad_machine", "pane on another machine");
115
- const side = b.side;
116
- if (side !== "center" && !PANE_DIRECTIONS.includes(side)) fail("bad_direction", "invalid direction");
117
- return { machine: p.machine, method: op, params: { pane_id: p.local, target_pane_id: x.local, side } };
118
- }
119
- case "layout.ratio": {
120
- const x = idOf(b.tab_id, TAB_RE, "tab");
121
- const path = String((_a = b.path) != null ? _a : "");
122
- if (!/^[01]{0,32}$/.test(path)) fail("bad_path", "invalid split");
123
- const ratio = Number(b.ratio);
124
- if (!Number.isFinite(ratio) || ratio <= 0 || ratio >= 1) fail("bad_ratio", "invalid ratio");
125
- return {
126
- machine: x.machine,
127
- method: "layout.set_split_ratio",
128
- params: { tab_id: x.local, path: [...path].map((c) => c === "1"), ratio: Math.round(Math.min(0.95, Math.max(0.05, ratio)) * 1e3) / 1e3 }
129
- };
130
- }
131
- case "workspace.move": {
132
- const w = idOf(b.workspace_id, WORKSPACE_RE, "workspace");
133
- let before = null;
134
- if (b.before_workspace_id != null) {
135
- const x = idOf(b.before_workspace_id, WORKSPACE_RE, "workspace");
136
- if (x.machine !== w.machine) fail("bad_machine", "space on another machine");
137
- if (x.local === w.local) fail("bad_destination", "invalid destination");
138
- before = x.local;
139
- }
140
- return { machine: w.machine, method: "workspace.move_block", params: { workspace_ids: [w.local], before_workspace_id: before } };
141
- }
142
- default:
143
- return fail("bad_op", `unknown action: ${op}`);
144
- }
145
- }
146
- function spaceResult(call, r) {
147
- var _a, _b, _c, _d, _e;
148
- const id = (x) => x == null ? void 0 : call.machine ? `${call.machine}~${x}` : String(x);
149
- if (!r || typeof r !== "object") return {};
150
- if (call.method === "tab.create") return { tab_id: id((_a = r.tab) == null ? void 0 : _a.tab_id), pane_id: id((_b = r.root_pane) == null ? void 0 : _b.pane_id) };
151
- if (call.method === "pane.split") return { pane_id: id((_c = r.pane) == null ? void 0 : _c.pane_id), tab_id: id((_d = r.pane) == null ? void 0 : _d.tab_id) };
152
- if (call.method === "pane.move") {
153
- const p = (_e = r.move_result) == null ? void 0 : _e.pane;
154
- return { pane_id: id(p == null ? void 0 : p.pane_id), tab_id: id(p == null ? void 0 : p.tab_id) };
155
- }
156
- return {};
157
- }
158
- function swapSteps(snap, pane, target) {
159
- if (!target || target === pane) fail("no_neighbor", "no pane on that side");
160
- const layouts = Array.isArray(snap == null ? void 0 : snap.layouts) ? snap.layouts : [];
161
- const tab = layouts.find((l) => {
162
- var _a;
163
- return (_a = l.panes) == null ? void 0 : _a.some((p) => p.pane_id === pane);
164
- });
165
- if (!tab || !tab.panes.some((p) => p.pane_id === target)) fail("no_neighbor", "no pane on that side");
166
- if (tab.zoomed) fail("zoomed", "a pane is zoomed in this tab");
167
- const tabFocus = tab.focused_pane_id || null;
168
- const [source, other] = tabFocus === target ? [target, pane] : [pane, target];
169
- return [{ method: "pane.swap", params: { source_pane_id: source, target_pane_id: other } }, ...refocus(snap, tab, source)];
170
- }
171
- function refocus(snap, tab, cur) {
172
- const layouts = Array.isArray(snap == null ? void 0 : snap.layouts) ? snap.layouts : [];
173
- const ws = (Array.isArray(snap == null ? void 0 : snap.workspaces) ? snap.workspaces : []).find((w) => w.workspace_id === tab.workspace_id);
174
- const activeTab = layouts.find((l) => l.tab_id === (ws == null ? void 0 : ws.active_tab_id));
175
- const steps = [];
176
- for (const f of [tab.focused_pane_id || null, (activeTab == null ? void 0 : activeTab.focused_pane_id) || null, (snap == null ? void 0 : snap.focused_pane_id) || null]) {
177
- if (!f || f === cur) continue;
178
- steps.push({ method: "pane.focus", params: { pane_id: f } });
179
- cur = f;
180
- }
181
- return steps;
182
- }
183
- function dropSteps(snap, pane, target, side) {
184
- if (side === "center") return swapSteps(snap, pane, target);
185
- if (!target || target === pane) fail("no_neighbor", "same pane");
186
- const layouts = Array.isArray(snap == null ? void 0 : snap.layouts) ? snap.layouts : [];
187
- const tab = layouts.find((l) => {
188
- var _a;
189
- return (_a = l.panes) == null ? void 0 : _a.some((p) => p.pane_id === pane);
190
- });
191
- if (!tab || !tab.panes.some((p) => p.pane_id === target)) fail("no_neighbor", "pane in another tab");
192
- if (tab.zoomed) fail("zoomed", "a pane is zoomed in this tab");
193
- const before = side === "left" || side === "up";
194
- const steps = [
195
- { method: "pane.move", params: { pane_id: pane, destination: { type: "new_tab", workspace_id: tab.workspace_id }, focus: false } },
196
- { method: "pane.move", params: { pane_id: pane, destination: { type: "tab", tab_id: tab.tab_id, split: side === "left" || side === "right" ? "right" : "down", target_pane_id: target }, focus: false } }
197
- ];
198
- if (before) steps.push({ method: "pane.swap", params: { source_pane_id: pane, target_pane_id: target } });
199
- return [...steps, ...refocus(snap, tab, before ? pane : null)];
200
- }
201
- function verifySpaceRename(call, snapshot) {
202
- var _a;
203
- const tab = call.method === "tab.rename";
204
- if (!tab && call.method !== "workspace.rename") return;
205
- const key = tab ? "tab_id" : "workspace_id";
206
- const target = (_a = tab ? snapshot == null ? void 0 : snapshot.tabs : snapshot == null ? void 0 : snapshot.workspaces) == null ? void 0 : _a.find((x) => x[key] === call.params[key]);
207
- if (!target || target.label !== call.params.label) throw new SpaceActionError("rename_failed", "Rename failed. The name was not changed.");
208
- }
209
-
210
34
  const space_post = defineApi(async (_event, body) => {
211
35
  let call;
212
36
  try {
@@ -0,0 +1,157 @@
1
+ import { $ as getMachine, H as HerdrError, aH as DATA_DIR, bV as RemoteMachine, bW as HERDR_BIN, aZ as herdrOn, br as PANE_RE, a_ as splitId, bX as reduceSnapshot, X as sleep, bY as joinId, a as defineApi, p as poll } from '../../nitro/nitro.mjs';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import 'node:http';
5
+ import 'node:https';
6
+ import 'node:crypto';
7
+ import 'stream';
8
+ import 'events';
9
+ import 'http';
10
+ import 'crypto';
11
+ import 'buffer';
12
+ import 'zlib';
13
+ import 'https';
14
+ import 'net';
15
+ import 'tls';
16
+ import 'url';
17
+ import 'node:events';
18
+ import 'node:buffer';
19
+ import 'node:fs';
20
+ import 'node:os';
21
+ import 'node:net';
22
+ import 'node:child_process';
23
+ import 'node:dns';
24
+ import 'node:util';
25
+ import 'web-push';
26
+ import 'node:string_decoder';
27
+ import 'node:readline';
28
+ import 'qrcode-terminal/vendor/QRCode/index.js';
29
+ import 'qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js';
30
+ import 'node:url';
31
+ import 'node:zlib';
32
+ import '@simplewebauthn/server';
33
+
34
+ const SPLIT_TERMINAL_TOKEN = "wherdr_split_terminal";
35
+ const SPLIT_PROMPT_TOKEN = "wherdr_split_prompt";
36
+ const quote = (s) => `'${s.replace(/'/g, `'\\''`)}'`;
37
+ function splitShellHooks(binary, session) {
38
+ const report = `${quote(binary)} --session ${quote(session)} pane report-metadata "$HERDR_PANE_ID" --source wherdr-split`;
39
+ const busy = `${report} --clear-token ${SPLIT_PROMPT_TOKEN} >/dev/null 2>&1`;
40
+ const ready = `${report} --token "${SPLIT_PROMPT_TOKEN}=$$" >/dev/null 2>&1`;
41
+ return {
42
+ bash: `if (( BASH_VERSINFO[0] > 4 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4) )); then PS0=${quote(`$(${busy})`)}; ${ready}; fi`,
43
+ zsh: `_wherdr_split_busy() { ${busy}; }
44
+ _wherdr_split_ready() { ${ready}; }
45
+ preexec_functions+=(_wherdr_split_busy)
46
+ precmd_functions+=(_wherdr_split_ready)
47
+ `
48
+ };
49
+ }
50
+ async function prepareSplitShell(machine) {
51
+ const m = getMachine(machine);
52
+ if (!m) throw new HerdrError("bad_machine", "Unknown machine");
53
+ const dir = m.local ? path.join(DATA_DIR, "split-shell") : path.posix.join(m.home, ".cache/herdr-web/split-shell");
54
+ const hooks = splitShellHooks(m instanceof RemoteMachine ? m.bin : HERDR_BIN, m.session);
55
+ const zshenv = 'unset ZDOTDIR\n[[ -f "$HOME/.zshenv" ]] && source "$HOME/.zshenv"\nexport WHERDR_SPLIT_USER_ZDOTDIR=${ZDOTDIR:-$HOME}\nexport ZDOTDIR=$WHERDR_SPLIT_BOOTSTRAP\n';
56
+ const zprofile = 'ZDOTDIR=$WHERDR_SPLIT_USER_ZDOTDIR\n[[ -f "$ZDOTDIR/.zprofile" ]] && source "$ZDOTDIR/.zprofile"\nexport WHERDR_SPLIT_USER_ZDOTDIR=${ZDOTDIR:-$HOME}\nexport ZDOTDIR=$WHERDR_SPLIT_BOOTSTRAP\n';
57
+ const zshrc = 'ZDOTDIR=$WHERDR_SPLIT_USER_ZDOTDIR\n[[ -f "$ZDOTDIR/.zshrc" ]] && source "$ZDOTDIR/.zshrc"\n' + hooks.zsh;
58
+ if (m.exec) {
59
+ const r = await m.exec('umask 077; mkdir -p "$1" && printf %s "$2" > "$1/.zshenv" && printf %s "$3" > "$1/.zshrc" && printf %s "$4" > "$1/.zprofile"', [dir, zshenv, zshrc, zprofile], { timeoutMs: 5e3 });
60
+ if (r.code !== 0) throw new HerdrError("split_failed", "Could not prepare the split terminal. No command was sent.");
61
+ } else {
62
+ await fs.mkdir(dir, { recursive: true, mode: 448 });
63
+ await fs.writeFile(path.join(dir, ".zshenv"), zshenv, { mode: 384 });
64
+ await fs.writeFile(path.join(dir, ".zshrc"), zshrc, { mode: 384 });
65
+ await fs.writeFile(path.join(dir, ".zprofile"), zprofile, { mode: 384 });
66
+ }
67
+ return { PROMPT_COMMAND: hooks.bash, ZDOTDIR: dir, WHERDR_SPLIT_BOOTSTRAP: dir };
68
+ }
69
+
70
+ const pending = /* @__PURE__ */ new Map();
71
+ const START_WAIT_MS = 5e3;
72
+ const START_STEP_MS = 100;
73
+ async function runSplitCommand(paneId, raw, call = herdrOn, prepare = prepareSplitShell) {
74
+ if (!PANE_RE.test(paneId)) throw new HerdrError("bad_pane", "Pane not found");
75
+ const command = typeof raw === "string" ? raw.trim().replace(/^!\s*/, "") : "";
76
+ if (!command || /[\r\n\x00-\x1f\x7f]/.test(command)) throw new HerdrError("bad_command", "Expected a single shell command");
77
+ const { machine, local } = splitId(paneId);
78
+ const previous = pending.get(machine);
79
+ const task = (async () => {
80
+ var _a, _b;
81
+ await (previous == null ? void 0 : previous.catch(() => {
82
+ }));
83
+ const hx = (method, params = {}) => call(machine, method, params);
84
+ const snap = await hx("session.snapshot");
85
+ const state = reduceSnapshot(snap.snapshot || snap);
86
+ const agent = state.panes.find((p) => p.id === local);
87
+ if (!(agent == null ? void 0 : agent.agent) || !agent.cwd) throw new HerdrError("bad_pane", "Pane not found");
88
+ const inspect = async (id) => {
89
+ var _a2, _b2, _c;
90
+ const p = (await hx("pane.get", { pane_id: id })).pane;
91
+ if (!p || p.agent || p.tab_id !== agent.tab) return { free: false, managed: false, alone: false };
92
+ const info = (await hx("pane.process_info", { pane_id: id })).process_info;
93
+ const alone = Boolean((info == null ? void 0 : info.shell_pid) > 0 && info.foreground_process_group_id === info.shell_pid && ((_a2 = info.foreground_processes) == null ? void 0 : _a2.length) && info.foreground_processes.every((p2) => p2.pid === info.shell_pid));
94
+ const managed = ((_b2 = p.tokens) == null ? void 0 : _b2[SPLIT_TERMINAL_TOKEN]) === "1";
95
+ return { free: alone && (!managed || ((_c = p.tokens) == null ? void 0 : _c[SPLIT_PROMPT_TOKEN]) === String(info.shell_pid)), managed, alone };
96
+ };
97
+ const ready = async (id) => (await inspect(id)).free;
98
+ const siblings = state.panes.filter((p) => p.id !== local && p.tab === agent.tab && !p.agent);
99
+ let target;
100
+ let fallback;
101
+ for (const p of siblings) {
102
+ const s = await inspect(p.id);
103
+ if (!s.free) continue;
104
+ if (s.managed) {
105
+ target = p.id;
106
+ break;
107
+ }
108
+ fallback != null ? fallback : fallback = p.id;
109
+ }
110
+ target != null ? target : target = fallback;
111
+ if (target) {
112
+ await hx("pane.focus", { pane_id: target });
113
+ if (!await ready(target)) target = void 0;
114
+ }
115
+ const created = !target;
116
+ if (!target) {
117
+ const last = siblings.at(-1);
118
+ const r = await hx("pane.split", { target_pane_id: (_a = last == null ? void 0 : last.id) != null ? _a : local, direction: last ? "down" : "right", cwd: agent.cwd, focus: false, env: await prepare(machine) });
119
+ target = (_b = r.pane) == null ? void 0 : _b.pane_id;
120
+ if (!target) throw new HerdrError("bad_pane", "Pane not found");
121
+ await hx("pane.report_metadata", { pane_id: target, source: "wherdr-split", tokens: { [SPLIT_TERMINAL_TOKEN]: "1" } });
122
+ const deadline = Date.now() + START_WAIT_MS;
123
+ let s = await inspect(target);
124
+ while (!s.free && Date.now() < deadline) {
125
+ await sleep(START_STEP_MS);
126
+ s = await inspect(target);
127
+ }
128
+ if (!s.free && s.alone) {
129
+ await hx("pane.report_metadata", { pane_id: target, source: "wherdr-split", tokens: { [SPLIT_TERMINAL_TOKEN]: null } });
130
+ s = await inspect(target);
131
+ }
132
+ await hx("pane.focus", { pane_id: target });
133
+ if (!s.free || !await ready(target)) throw new HerdrError("busy_pane", "Cannot verify an idle shell prompt. No command was sent.");
134
+ }
135
+ await hx("pane.report_metadata", { pane_id: target, source: "wherdr-split", tokens: { [SPLIT_PROMPT_TOKEN]: null } });
136
+ await hx("pane.send_input", { pane_id: target, keys: ["ctrl+e", "ctrl+u"] });
137
+ await hx("pane.send_input", { pane_id: target, text: command, keys: ["enter"] });
138
+ return { ok: true, pane_id: joinId(machine, target), created };
139
+ })();
140
+ pending.set(machine, task);
141
+ try {
142
+ return await task;
143
+ } finally {
144
+ if (pending.get(machine) === task) pending.delete(machine);
145
+ }
146
+ }
147
+
148
+ const splitCommand_post = defineApi(async (_event, body) => {
149
+ try {
150
+ return await runSplitCommand(String(body.pane_id || ""), body.command);
151
+ } finally {
152
+ await poll();
153
+ }
154
+ });
155
+
156
+ export { splitCommand_post as default };
157
+ //# sourceMappingURL=split-command.post.mjs.map
@@ -1,4 +1,4 @@
1
- import { a as defineApi, bL as taskCommand } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, b_ as taskCommand } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, bM as addTask } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, b$ as addTask } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, bN as clearTaskAfter } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, c0 as clearTaskAfter } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, bO as approveTask } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, c1 as approveTask } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, bP as archiveDoneTasks } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, c2 as archiveDoneTasks } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, i as getQuery, bQ as archivedTasks } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, i as getQuery, c3 as archivedTasks } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, i as getQuery, bR as autopilotStatuses, bS as coordinatorAutopilot } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, i as getQuery, c4 as autopilotStatuses, c5 as coordinatorAutopilot } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, bS as coordinatorAutopilot } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, c5 as coordinatorAutopilot } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, i as getQuery, bT as boardSettings } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, i as getQuery, c6 as boardSettings } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, bU as changeBoardSetting } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, c7 as changeBoardSetting } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, i as getQuery, bV as coordinatorPane } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, i as getQuery, c8 as coordinatorPane } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';
@@ -1,4 +1,4 @@
1
- import { a as defineApi, bW as restartCoordinator, bX as tellCoordinator } from '../../../nitro/nitro.mjs';
1
+ import { a as defineApi, c9 as restartCoordinator, ca as tellCoordinator } from '../../../nitro/nitro.mjs';
2
2
  import 'node:http';
3
3
  import 'node:https';
4
4
  import 'node:crypto';