wherdr 1.3.3 → 1.3.4

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 (136) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/{CP8o925U.js → BEJHMUrj.js} +1 -1
  3. package/.output/public/_nuxt/BOtcEDnA.js +1 -0
  4. package/.output/public/_nuxt/BUaYhQ2r.js +6 -0
  5. package/.output/public/_nuxt/{yzABg5xl.js → Bpoxvzh6.js} +1 -1
  6. package/.output/public/_nuxt/C25ROUa9.js +3 -0
  7. package/.output/public/_nuxt/CDWjMk9C.js +2 -0
  8. package/.output/public/_nuxt/CJKsMzIp.js +1 -0
  9. package/.output/public/_nuxt/CJNhn9sA.js +36 -0
  10. package/.output/public/_nuxt/COCvtdHN.js +89 -0
  11. package/.output/public/_nuxt/{Ci8N4mWR.js → CXJnLmWv.js} +1 -1
  12. package/.output/public/_nuxt/{DT8qZ0Wv.js → Cl45J6_Q.js} +1 -1
  13. package/.output/public/_nuxt/CndPDbMI.js +2 -0
  14. package/.output/public/_nuxt/Ctbx58Um.js +23 -0
  15. package/.output/public/_nuxt/{CKhgznq4.js → DMLmW6JM.js} +43 -39
  16. package/.output/public/_nuxt/Dl1PHLOB.js +1 -0
  17. package/.output/public/_nuxt/{DaaJIRB3.js → Nhex3_iH.js} +1 -1
  18. package/.output/public/_nuxt/OpWX45i7.js +89 -0
  19. package/.output/public/_nuxt/builds/latest.json +1 -1
  20. package/.output/public/_nuxt/builds/meta/4994f3a4-4126-4f57-a9e5-c7ebb25850bc.json +1 -0
  21. package/.output/public/_nuxt/dTj21DMs.js +1 -0
  22. package/.output/public/_nuxt/entry.BohTWE-n.css +2 -0
  23. package/.output/public/_nuxt/{Cr3SrGky.js → kwSoIiM7.js} +1 -1
  24. package/.output/public/_nuxt/mkEwYka4.js +1 -0
  25. package/.output/public/_nuxt/pdf.min.t82Z80JU.mjs +28 -0
  26. package/.output/public/_nuxt/pdf.worker.min.wgc6bjNh.mjs +28 -0
  27. package/.output/public/_nuxt/w7Rm7unj.js +1 -0
  28. package/.output/public/sw.js +1 -1
  29. package/.output/server/chunks/_/branding.mjs +1 -1
  30. package/.output/server/chunks/_/files.mjs +19 -6
  31. package/.output/server/chunks/_/machineOrder.mjs +1 -1
  32. package/.output/server/chunks/_/onboarding.mjs +1 -1
  33. package/.output/server/chunks/_/package.mjs +3 -1
  34. package/.output/server/chunks/_/plugins.mjs +6 -3
  35. package/.output/server/chunks/_/projectBoard.mjs +4 -7
  36. package/.output/server/chunks/_/projectsActions.mjs +1 -1
  37. package/.output/server/chunks/_/projectsPlugin.mjs +24 -50
  38. package/.output/server/chunks/_/projectsPlugin2.mjs +57 -0
  39. package/.output/server/chunks/_/restart.mjs +1 -1
  40. package/.output/server/chunks/_/reveal.mjs +1 -1
  41. package/.output/server/chunks/_/selfupdate.mjs +1 -1
  42. package/.output/server/chunks/_/settingstabs.mjs +36 -0
  43. package/.output/server/chunks/_/updates.mjs +1 -1
  44. package/.output/server/chunks/_/worktrees.mjs +1 -1
  45. package/.output/server/chunks/_/ws.mjs +1 -1
  46. package/.output/server/chunks/nitro/nitro.mjs +840 -367
  47. package/.output/server/chunks/routes/api/board.get.mjs +1 -0
  48. package/.output/server/chunks/routes/api/chat/image.get.mjs +1 -1
  49. package/.output/server/chunks/routes/api/chat.get.mjs +25 -5
  50. package/.output/server/chunks/routes/api/choose.post.mjs +14 -14
  51. package/.output/server/chunks/routes/api/claude-statusline.post.mjs +1 -1
  52. package/.output/server/chunks/routes/api/codex-update.post.mjs +1 -1
  53. package/.output/server/chunks/routes/api/commands.get.mjs +3 -2
  54. package/.output/server/chunks/routes/api/config.get.mjs +1 -1
  55. package/.output/server/chunks/routes/api/dirs.get.mjs +1 -1
  56. package/.output/server/chunks/routes/api/dismiss-stopped.post.mjs +1 -1
  57. package/.output/server/chunks/routes/api/dismiss.post.mjs +1 -1
  58. package/.output/server/chunks/routes/api/effort.post.mjs +1 -1
  59. package/.output/server/chunks/routes/api/efforts.get.mjs +1 -1
  60. package/.output/server/chunks/routes/api/file.post.mjs +1 -1
  61. package/.output/server/chunks/routes/api/files/download.get.mjs +10 -3
  62. package/.output/server/chunks/routes/api/gitroot.get.mjs +1 -1
  63. package/.output/server/chunks/routes/api/index.get.mjs +1 -0
  64. package/.output/server/chunks/routes/api/input.post.mjs +27 -10
  65. package/.output/server/chunks/routes/api/interrupt.post.mjs +1 -1
  66. package/.output/server/chunks/routes/api/isgit.get.mjs +1 -1
  67. package/.output/server/chunks/routes/api/machine/awake.get.mjs +1 -1
  68. package/.output/server/chunks/routes/api/machine/awake.post.mjs +1 -1
  69. package/.output/server/chunks/routes/api/machine/rename.post.mjs +1 -1
  70. package/.output/server/chunks/routes/api/menu.post.mjs +4 -1
  71. package/.output/server/chunks/routes/api/model.post.mjs +1 -1
  72. package/.output/server/chunks/routes/api/models.get.mjs +1 -1
  73. package/.output/server/chunks/routes/api/nav.post.mjs +34 -21
  74. package/.output/server/chunks/routes/api/phone.get.mjs +1 -1
  75. package/.output/server/chunks/routes/api/phone.post.mjs +1 -1
  76. package/.output/server/chunks/routes/api/plugins/actions.get.mjs +2 -0
  77. package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +2 -0
  78. package/.output/server/chunks/routes/api/plugins/profiles.get.mjs +2 -0
  79. package/.output/server/chunks/routes/api/plugins/projects.get.mjs +3 -2
  80. package/.output/server/chunks/routes/api/plugins/projects.post.mjs +3 -2
  81. package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +1 -1
  82. package/.output/server/chunks/routes/api/project/inbox.get.mjs +1 -0
  83. package/.output/server/chunks/routes/api/project/inbox.post.mjs +1 -0
  84. package/.output/server/chunks/routes/api/project/memory.get.mjs +1 -0
  85. package/.output/server/chunks/routes/api/project/report.get.mjs +1 -0
  86. package/.output/server/chunks/routes/api/project/routines.get.mjs +1 -0
  87. package/.output/server/chunks/routes/api/project/settings.get.mjs +1 -0
  88. package/.output/server/chunks/routes/api/project/thread.get.mjs +1 -0
  89. package/.output/server/chunks/routes/api/project/thread.post.mjs +2 -0
  90. package/.output/server/chunks/routes/api/prompt.post.mjs +1 -1
  91. package/.output/server/chunks/routes/api/push/quiet.post.mjs +1 -1
  92. package/.output/server/chunks/routes/api/push/subscribe.post.mjs +1 -1
  93. package/.output/server/chunks/routes/api/push/test.post.mjs +1 -1
  94. package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +1 -1
  95. package/.output/server/chunks/routes/api/quotas.get.mjs +1 -1
  96. package/.output/server/chunks/routes/api/requeue.post.mjs +1 -1
  97. package/.output/server/chunks/routes/api/screen-key.post.mjs +13 -10
  98. package/.output/server/chunks/routes/api/screen.get.mjs +2 -35
  99. package/.output/server/chunks/routes/api/search.get.mjs +1 -1
  100. package/.output/server/chunks/routes/api/seen.post.mjs +1 -1
  101. package/.output/server/chunks/routes/api/sessions.get.mjs +1 -1
  102. package/.output/server/chunks/routes/api/sessions.post.mjs +1 -1
  103. package/.output/server/chunks/routes/api/settings-tab.post.mjs +89 -0
  104. package/.output/server/chunks/routes/api/space.post.mjs +1 -1
  105. package/.output/server/chunks/routes/api/unqueue.post.mjs +1 -1
  106. package/.output/server/chunks/routes/api/update.get.mjs +1 -1
  107. package/.output/server/chunks/routes/api/update.post.mjs +1 -1
  108. package/.output/server/chunks/routes/api/upload.post.mjs +1 -1
  109. package/.output/server/chunks/routes/icons/_name_.get.mjs +1 -1
  110. package/.output/server/chunks/routes/renderer.mjs +2 -2
  111. package/.output/server/chunks/routes/uploads/_...name_.get.mjs +1 -1
  112. package/.output/server/chunks/routes/ws/_..._.mjs +1 -1
  113. package/.output/server/chunks/routes/ws/events.mjs +1 -1
  114. package/.output/server/chunks/routes/ws/term.mjs +1 -1
  115. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  116. package/.output/server/index.mjs +1 -1
  117. package/.output/server/package.json +1 -1
  118. package/README.md +44 -23
  119. package/package.json +3 -1
  120. package/skills/wherdr/SKILL.md +9 -3
  121. package/.output/public/_nuxt/B4Yk2tB1.js +0 -23
  122. package/.output/public/_nuxt/BBw_0a4M.js +0 -6
  123. package/.output/public/_nuxt/BSy6OCIY.js +0 -1
  124. package/.output/public/_nuxt/BX5PM2JQ.js +0 -1
  125. package/.output/public/_nuxt/BgPDnf2S.js +0 -1
  126. package/.output/public/_nuxt/BkOxQzbS.js +0 -2
  127. package/.output/public/_nuxt/CWwyK2XK.js +0 -2
  128. package/.output/public/_nuxt/CkbmecwS.js +0 -1
  129. package/.output/public/_nuxt/DAg9fiVh.js +0 -89
  130. package/.output/public/_nuxt/DcJi16XA.js +0 -1
  131. package/.output/public/_nuxt/SiL1FJ5s.js +0 -3
  132. package/.output/public/_nuxt/VpjCgSXu.js +0 -36
  133. package/.output/public/_nuxt/builds/meta/c735b6c0-1bd0-47d7-a208-d310f0a06287.json +0 -1
  134. package/.output/public/_nuxt/dPxB2L94.js +0 -89
  135. package/.output/public/_nuxt/entry.CGWKmYU3.css +0 -2
  136. package/.output/public/_nuxt/xYX85SPI.js +0 -1
@@ -8646,87 +8646,87 @@ async function dispose(driver) {
8646
8646
  const _assets = {
8647
8647
  ["scripts:build-nerd-font.py"]: {
8648
8648
  import: () => import('../raw/build-nerd-font.mjs').then(r => r.default || r),
8649
- meta: {"type":"text/plain; charset=utf-8","etag":"\"13aa-ys9YUI0kyQcBWrUDXjdBVLF8Z3E\"","mtime":"2026-10-12T02:42:41.115Z"}
8649
+ meta: {"type":"text/plain; charset=utf-8","etag":"\"13aa-ys9YUI0kyQcBWrUDXjdBVLF8Z3E\"","mtime":"2026-10-17T18:43:08.766Z"}
8650
8650
  },
8651
8651
  ["scripts:build-terminal-font.py"]: {
8652
8652
  import: () => import('../raw/build-terminal-font.mjs').then(r => r.default || r),
8653
- meta: {"type":"text/plain; charset=utf-8","etag":"\"cf5-BDqHg2xDFu+6dg84HBWtyBtrEoU\"","mtime":"2026-10-12T02:42:41.115Z"}
8653
+ meta: {"type":"text/plain; charset=utf-8","etag":"\"cf5-BDqHg2xDFu+6dg84HBWtyBtrEoU\"","mtime":"2026-10-17T18:43:08.767Z"}
8654
8654
  },
8655
8655
  ["scripts:bump-homebrew.sh"]: {
8656
8656
  import: () => import('../raw/bump-homebrew.mjs').then(r => r.default || r),
8657
- meta: {"type":"application/x-sh","etag":"\"8b5-n/EiMEIUoHPuQl2XTJU0tSNn7FY\"","mtime":"2026-10-12T02:42:41.115Z"}
8657
+ meta: {"type":"application/x-sh","etag":"\"8b5-n/EiMEIUoHPuQl2XTJU0tSNn7FY\"","mtime":"2026-10-17T18:43:08.767Z"}
8658
8658
  },
8659
8659
  ["scripts:check-leaks.mjs"]: {
8660
8660
  import: () => import('../raw/check-leaks.mjs').then(r => r.default || r),
8661
- meta: {"type":"text/javascript; charset=utf-8","etag":"\"35b3-41HZueHfw7xuicx4q83qwdTEpbc\"","mtime":"2026-10-12T02:42:41.115Z"}
8661
+ meta: {"type":"text/javascript; charset=utf-8","etag":"\"35b3-41HZueHfw7xuicx4q83qwdTEpbc\"","mtime":"2026-10-17T18:43:08.767Z"}
8662
8662
  },
8663
8663
  ["scripts:dev.wherdr.open.plist"]: {
8664
8664
  import: () => import('../raw/dev.wherdr.open.mjs').then(r => r.default || r),
8665
- meta: {"type":"text/plain; charset=utf-8","etag":"\"1de-12VO2xq63mciP26rEzRh3cGfEkI\"","mtime":"2026-10-12T02:42:41.115Z"}
8665
+ meta: {"type":"text/plain; charset=utf-8","etag":"\"1de-12VO2xq63mciP26rEzRh3cGfEkI\"","mtime":"2026-10-17T18:43:08.767Z"}
8666
8666
  },
8667
8667
  ["scripts:docker-entrypoint.sh"]: {
8668
8668
  import: () => import('../raw/docker-entrypoint.mjs').then(r => r.default || r),
8669
- meta: {"type":"application/x-sh","etag":"\"3f3-8om3/mMriIIJYO+YcdXNJsv8tkI\"","mtime":"2026-10-12T02:42:41.115Z"}
8669
+ meta: {"type":"application/x-sh","etag":"\"3f3-8om3/mMriIIJYO+YcdXNJsv8tkI\"","mtime":"2026-10-17T18:43:08.767Z"}
8670
8670
  },
8671
8671
  ["scripts:herdr-plugin.sh"]: {
8672
8672
  import: () => import('../raw/herdr-plugin.mjs').then(r => r.default || r),
8673
- meta: {"type":"application/x-sh","etag":"\"9b85-YfAcqPKGuMgKmGSVqEIuA91sAE4\"","mtime":"2026-10-12T02:42:41.115Z"}
8673
+ meta: {"type":"application/x-sh","etag":"\"9b85-YfAcqPKGuMgKmGSVqEIuA91sAE4\"","mtime":"2026-10-17T18:43:08.767Z"}
8674
8674
  },
8675
8675
  ["scripts:install-claude-statusline.sh"]: {
8676
8676
  import: () => import('../raw/install-claude-statusline.mjs').then(r => r.default || r),
8677
- meta: {"type":"application/x-sh","etag":"\"db6-p7KGlvbZ+Qjt+JiT5yVtU4w3kfg\"","mtime":"2026-10-12T02:42:41.115Z"}
8677
+ meta: {"type":"application/x-sh","etag":"\"db6-p7KGlvbZ+Qjt+JiT5yVtU4w3kfg\"","mtime":"2026-10-17T18:43:08.767Z"}
8678
8678
  },
8679
8679
  ["scripts:install-host-open.sh"]: {
8680
8680
  import: () => import('../raw/install-host-open.mjs').then(r => r.default || r),
8681
- meta: {"type":"application/x-sh","etag":"\"103a-/zplHeQSS471/Vz3quwajHmzFQs\"","mtime":"2026-10-12T02:42:41.115Z"}
8681
+ meta: {"type":"application/x-sh","etag":"\"103a-/zplHeQSS471/Vz3quwajHmzFQs\"","mtime":"2026-10-17T18:43:08.767Z"}
8682
8682
  },
8683
8683
  ["scripts:pack-output.mjs"]: {
8684
8684
  import: () => import('../raw/pack-output.mjs').then(r => r.default || r),
8685
- meta: {"type":"text/javascript; charset=utf-8","etag":"\"54b-eU4eNNIxIecG1kwaLdtiTYODSSI\"","mtime":"2026-10-12T02:42:41.115Z"}
8685
+ meta: {"type":"text/javascript; charset=utf-8","etag":"\"54b-eU4eNNIxIecG1kwaLdtiTYODSSI\"","mtime":"2026-10-17T18:43:08.767Z"}
8686
8686
  },
8687
8687
  ["scripts:release-ready.mjs"]: {
8688
8688
  import: () => import('../raw/release-ready.mjs').then(r => r.default || r),
8689
- meta: {"type":"text/javascript; charset=utf-8","etag":"\"a44-ceu/5BQO5TUWzE/HNW2C/LvdCqw\"","mtime":"2026-10-12T02:42:41.115Z"}
8689
+ meta: {"type":"text/javascript; charset=utf-8","etag":"\"a44-ceu/5BQO5TUWzE/HNW2C/LvdCqw\"","mtime":"2026-10-17T18:43:08.767Z"}
8690
8690
  },
8691
8691
  ["scripts:reveal.sh"]: {
8692
8692
  import: () => import('../raw/reveal.mjs').then(r => r.default || r),
8693
- meta: {"type":"application/x-sh","etag":"\"72e-h/LTEU7exXdiR3GKqhj71UOwAqQ\"","mtime":"2026-10-12T02:42:41.115Z"}
8693
+ meta: {"type":"application/x-sh","etag":"\"72e-h/LTEU7exXdiR3GKqhj71UOwAqQ\"","mtime":"2026-10-17T18:43:08.767Z"}
8694
8694
  },
8695
8695
  ["scripts:wherdr-open.sh"]: {
8696
8696
  import: () => import('../raw/wherdr-open.mjs').then(r => r.default || r),
8697
- meta: {"type":"application/x-sh","etag":"\"b5b-U5OyQk3hziU9KiUyB/1FT5TkOxk\"","mtime":"2026-10-12T02:42:41.115Z"}
8697
+ meta: {"type":"application/x-sh","etag":"\"b5b-U5OyQk3hziU9KiUyB/1FT5TkOxk\"","mtime":"2026-10-17T18:43:08.767Z"}
8698
8698
  },
8699
8699
  ["server:branding:favicon.ico"]: {
8700
8700
  import: () => import('../raw/favicon.mjs').then(r => r.default || r),
8701
- meta: {"type":"image/vnd.microsoft.icon","etag":"\"3aee-Oem7XTWv+9HEwv9u/3K5QcIjS3E\"","mtime":"2026-10-12T02:42:41.120Z"}
8701
+ meta: {"type":"image/vnd.microsoft.icon","etag":"\"3aee-Oem7XTWv+9HEwv9u/3K5QcIjS3E\"","mtime":"2026-10-17T18:43:08.771Z"}
8702
8702
  },
8703
8703
  ["server:branding:icons:apple-touch-icon.png"]: {
8704
8704
  import: () => import('../raw/apple-touch-icon.mjs').then(r => r.default || r),
8705
- meta: {"type":"image/png","etag":"\"1f8-AVRrBnAhalXrGkFPGdvl0fM7DH8\"","mtime":"2026-10-12T02:42:41.120Z"}
8705
+ meta: {"type":"image/png","etag":"\"1f8-AVRrBnAhalXrGkFPGdvl0fM7DH8\"","mtime":"2026-10-17T18:43:08.771Z"}
8706
8706
  },
8707
8707
  ["server:branding:icons:favicon-32.png"]: {
8708
8708
  import: () => import('../raw/favicon-32.mjs').then(r => r.default || r),
8709
- meta: {"type":"image/png","etag":"\"a3-hAEc+Ymq1aYS3kFLyZK/H18Pge8\"","mtime":"2026-10-12T02:42:41.120Z"}
8709
+ meta: {"type":"image/png","etag":"\"a3-hAEc+Ymq1aYS3kFLyZK/H18Pge8\"","mtime":"2026-10-17T18:43:08.771Z"}
8710
8710
  },
8711
8711
  ["server:branding:icons:icon-192.png"]: {
8712
8712
  import: () => import('../raw/icon-192.mjs').then(r => r.default || r),
8713
- meta: {"type":"image/png","etag":"\"222-kioUoPaSCUaRhKKWw0PRtFbAhxk\"","mtime":"2026-10-12T02:42:41.120Z"}
8713
+ meta: {"type":"image/png","etag":"\"222-kioUoPaSCUaRhKKWw0PRtFbAhxk\"","mtime":"2026-10-17T18:43:08.771Z"}
8714
8714
  },
8715
8715
  ["server:branding:icons:icon-512-maskable.png"]: {
8716
8716
  import: () => import('../raw/icon-512-maskable.mjs').then(r => r.default || r),
8717
- meta: {"type":"image/png","etag":"\"84b-mCXgbBkXk7sqOhmJ8hjp80SN3Qk\"","mtime":"2026-10-12T02:42:41.120Z"}
8717
+ meta: {"type":"image/png","etag":"\"84b-mCXgbBkXk7sqOhmJ8hjp80SN3Qk\"","mtime":"2026-10-17T18:43:08.771Z"}
8718
8718
  },
8719
8719
  ["server:branding:icons:icon-512.png"]: {
8720
8720
  import: () => import('../raw/icon-512.mjs').then(r => r.default || r),
8721
- meta: {"type":"image/png","etag":"\"8fc-ZwRMqAqQZeLLx4iNTZxs09C4Q1I\"","mtime":"2026-10-12T02:42:41.120Z"}
8721
+ meta: {"type":"image/png","etag":"\"8fc-ZwRMqAqQZeLLx4iNTZxs09C4Q1I\"","mtime":"2026-10-17T18:43:08.771Z"}
8722
8722
  },
8723
8723
  ["server:branding:icons:icon-maskable.svg"]: {
8724
8724
  import: () => import('../raw/icon-maskable.mjs').then(r => r.default || r),
8725
- meta: {"type":"image/svg+xml","etag":"\"4a1-7XtnuN5ZOwiwIjpgpj+/Rg9LssY\"","mtime":"2026-10-12T02:42:41.120Z"}
8725
+ meta: {"type":"image/svg+xml","etag":"\"4a1-7XtnuN5ZOwiwIjpgpj+/Rg9LssY\"","mtime":"2026-10-17T18:43:08.771Z"}
8726
8726
  },
8727
8727
  ["server:branding:icons:icon.svg"]: {
8728
8728
  import: () => import('../raw/icon.mjs').then(r => r.default || r),
8729
- meta: {"type":"image/svg+xml","etag":"\"49c-O1XxkWwKTf6VBoC0i4TEPdGPsCw\"","mtime":"2026-10-12T02:42:41.120Z"}
8729
+ meta: {"type":"image/svg+xml","etag":"\"49c-O1XxkWwKTf6VBoC0i4TEPdGPsCw\"","mtime":"2026-10-17T18:43:08.771Z"}
8730
8730
  }
8731
8731
  };
8732
8732
 
@@ -9629,7 +9629,7 @@ function _expandFromEnv(value) {
9629
9629
  const _inlineRuntimeConfig = {
9630
9630
  "app": {
9631
9631
  "baseURL": "/",
9632
- "buildId": "c735b6c0-1bd0-47d7-a208-d310f0a06287",
9632
+ "buildId": "4994f3a4-4126-4f57-a9e5-c7ebb25850bc",
9633
9633
  "buildAssetsDir": "/_nuxt/",
9634
9634
  "cdnURL": ""
9635
9635
  },
@@ -10324,9 +10324,9 @@ function kindLabel(kind) {
10324
10324
  return kind ? kind[0].toUpperCase() + kind.slice(1) : "Shell";
10325
10325
  }
10326
10326
 
10327
- var __defProp$7 = Object.defineProperty;
10328
- var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10329
- var __publicField$7 = (obj, key, value) => __defNormalProp$7(obj, typeof key !== "symbol" ? key + "" : key, value);
10327
+ var __defProp$9 = Object.defineProperty;
10328
+ var __defNormalProp$9 = (obj, key, value) => key in obj ? __defProp$9(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10329
+ var __publicField$9 = (obj, key, value) => __defNormalProp$9(obj, typeof key !== "symbol" ? key + "" : key, value);
10330
10330
  function shouldNotify(scope, p) {
10331
10331
  return scope === "all" || !isProjectThread(p);
10332
10332
  }
@@ -10347,8 +10347,8 @@ function findThreadPane(panes, project, thread) {
10347
10347
  }
10348
10348
  class NoticeDeduper {
10349
10349
  constructor(windowMs = 6e4) {
10350
- __publicField$7(this, "windowMs", windowMs);
10351
- __publicField$7(this, "seen", /* @__PURE__ */ new Map());
10350
+ __publicField$9(this, "windowMs", windowMs);
10351
+ __publicField$9(this, "seen", /* @__PURE__ */ new Map());
10352
10352
  }
10353
10353
  fresh(key, now = Date.now()) {
10354
10354
  for (const [k, at] of this.seen) if (now - at >= this.windowMs) this.seen.delete(k);
@@ -10487,17 +10487,86 @@ function parseSessionList(raw, baseKey, baseSession) {
10487
10487
  return out.sort((a, b) => a.name === baseSession ? -1 : b.name === baseSession ? 1 : a.name.localeCompare(b.name));
10488
10488
  }
10489
10489
 
10490
+ var __defProp$8 = Object.defineProperty;
10491
+ var __defNormalProp$8 = (obj, key, value) => key in obj ? __defProp$8(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10492
+ var __publicField$8 = (obj, key, value) => __defNormalProp$8(obj, typeof key !== "symbol" ? key + "" : key, value);
10493
+ const SCREEN_MACHINE_MAX = 2;
10494
+ const SCREEN_TOTAL_MAX = 4;
10495
+ class ScreenGate {
10496
+ constructor() {
10497
+ __publicField$8(this, "active", 0);
10498
+ __publicField$8(this, "background", 0);
10499
+ __publicField$8(this, "backgroundMachines", /* @__PURE__ */ new Map());
10500
+ __publicField$8(this, "machines", /* @__PURE__ */ new Map());
10501
+ __publicField$8(this, "priority", () => false);
10502
+ __publicField$8(this, "reserved", () => false);
10503
+ __publicField$8(this, "queue", []);
10504
+ }
10505
+ run(machine, work, pane) {
10506
+ return new Promise((resolve, reject) => {
10507
+ this.queue.push({ machine, pane, start: () => {
10508
+ const background = !this.priority(machine, pane);
10509
+ if (background) {
10510
+ this.background++;
10511
+ this.backgroundMachines.set(machine, (this.backgroundMachines.get(machine) || 0) + 1);
10512
+ }
10513
+ this.active++;
10514
+ this.machines.set(machine, (this.machines.get(machine) || 0) + 1);
10515
+ Promise.resolve().then(work).then(resolve, reject).finally(() => {
10516
+ if (background) {
10517
+ this.background--;
10518
+ const n = this.backgroundMachines.get(machine) - 1;
10519
+ if (n) this.backgroundMachines.set(machine, n);
10520
+ else this.backgroundMachines.delete(machine);
10521
+ }
10522
+ this.active--;
10523
+ const remaining = this.machines.get(machine) - 1;
10524
+ if (remaining) this.machines.set(machine, remaining);
10525
+ else this.machines.delete(machine);
10526
+ this.drain();
10527
+ });
10528
+ } });
10529
+ this.drain();
10530
+ });
10531
+ }
10532
+ drain() {
10533
+ while (this.active < SCREEN_TOTAL_MAX) {
10534
+ const eligible = (q) => {
10535
+ const active = this.machines.get(q.machine) || 0;
10536
+ if (active >= SCREEN_MACHINE_MAX) return false;
10537
+ if (this.priority(q.machine, q.pane)) {
10538
+ return active - (this.backgroundMachines.get(q.machine) || 0) < SCREEN_MACHINE_MAX - 1 || !this.queue.some((p) => p.machine === q.machine && !this.priority(p.machine, p.pane));
10539
+ }
10540
+ return (this.backgroundMachines.get(q.machine) || 0) < SCREEN_MACHINE_MAX - Number(this.reserved(q.machine)) && this.background < SCREEN_TOTAL_MAX - Number(this.reserved());
10541
+ };
10542
+ const first = this.queue.findIndex((q) => eligible(q) && this.priority(q.machine, q.pane));
10543
+ const i = first < 0 ? this.queue.findIndex(eligible) : first;
10544
+ if (i < 0) return;
10545
+ this.queue.splice(i, 1)[0].start();
10546
+ }
10547
+ }
10548
+ }
10549
+ const workGate = new ScreenGate();
10550
+ const screenRpcGate = new ScreenGate();
10551
+ async function mapScreenPanes(panes, machine, work, viewed, publish) {
10552
+ const order = panes.map((pane, index) => ({ pane, index })).sort((a, b) => Number(viewed(b.pane)) - Number(viewed(a.pane)));
10553
+ await Promise.all(order.map(({ pane, index }) => workGate.run(machine, async () => {
10554
+ await work(pane, index);
10555
+ if (viewed(pane)) publish == null ? void 0 : publish(pane);
10556
+ })));
10557
+ }
10558
+
10490
10559
  function fmt(template, params) {
10491
10560
  return template.replace(/\{(\w+)\}/g, (all, k) => params[k] == null ? all : String(params[k]));
10492
10561
  }
10493
10562
 
10494
- var __defProp$6 = Object.defineProperty;
10495
- var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10496
- var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, key + "" , value);
10563
+ var __defProp$7 = Object.defineProperty;
10564
+ var __defNormalProp$7 = (obj, key, value) => key in obj ? __defProp$7(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10565
+ var __publicField$7 = (obj, key, value) => __defNormalProp$7(obj, key + "" , value);
10497
10566
  class HerdrError extends Error {
10498
10567
  constructor(code, message) {
10499
10568
  super(message);
10500
- __publicField$6(this, "code");
10569
+ __publicField$7(this, "code");
10501
10570
  this.code = code;
10502
10571
  }
10503
10572
  }
@@ -10518,7 +10587,8 @@ function herdr(method, params = {}, timeoutMs = 15e3) {
10518
10587
  function herdrOn(machine, method, params = {}, timeoutMs = 15e3) {
10519
10588
  const r = resolveSocket(machine);
10520
10589
  if (!r.sock) return Promise.reject(new HerdrError("unreachable", r.error || "Machine unreachable"));
10521
- return herdrSock(r.sock, method, params, timeoutMs);
10590
+ const read = () => herdrSock(r.sock, method, params, timeoutMs);
10591
+ return method === "pane.read" ? screenRpcGate.run(machine, read, params.pane_id) : read();
10522
10592
  }
10523
10593
  let reqSeq = 0;
10524
10594
  function herdrSock(path, method, params = {}, timeoutMs = 15e3) {
@@ -10571,9 +10641,9 @@ async function agentPrompt(target2, text) {
10571
10641
  }
10572
10642
  const sleep$1 = (ms) => new Promise((r) => setTimeout(r, ms));
10573
10643
 
10574
- var __defProp$5 = Object.defineProperty;
10575
- var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10576
- var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, key + "" , value);
10644
+ var __defProp$6 = Object.defineProperty;
10645
+ var __defNormalProp$6 = (obj, key, value) => key in obj ? __defProp$6(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10646
+ var __publicField$6 = (obj, key, value) => __defNormalProp$6(obj, key + "" , value);
10577
10647
  const fsp$4 = fs.promises;
10578
10648
  const toStat = (st) => ({ size: st.size, mtimeMs: st.mtimeMs, isFile: st.isFile(), isDir: st.isDirectory() });
10579
10649
  const localFs = {
@@ -10595,7 +10665,7 @@ const localFs = {
10595
10665
  class FsError extends Error {
10596
10666
  constructor(code, message) {
10597
10667
  super(message);
10598
- __publicField$5(this, "code");
10668
+ __publicField$6(this, "code");
10599
10669
  this.code = code;
10600
10670
  }
10601
10671
  }
@@ -10607,6 +10677,9 @@ for f; do
10607
10677
  elif [ -n "$bsd" ]; then stat -f '%z %m %HT' "$f" 2>/dev/null || echo x
10608
10678
  else stat -c '%s %Y %F' "$f" 2>/dev/null || echo x; fi
10609
10679
  done`;
10680
+ const MISSING_PATH_EXIT = 44;
10681
+ const REQUIRE_PATH = `[ -e "$1" ] || exit ${MISSING_PATH_EXIT}
10682
+ `;
10610
10683
  function parseStatLine(line) {
10611
10684
  const m = /^(\d+) (\d+) (.+)$/.exec(String(line || "").trim());
10612
10685
  if (!m) return null;
@@ -10621,7 +10694,7 @@ function createShellFs(exec, opts = {}) {
10621
10694
  const r = await exec(script, args, { timeoutMs, input });
10622
10695
  if (r.code !== 0) {
10623
10696
  const reason = (r.stderr || `code ${r.code}`).trim().split("\n").pop() || "failed";
10624
- const code = r.code === 255 || r.code === 124 ? "unreachable" : /no such file/i.test(r.stderr) ? "ENOENT" : "remote";
10697
+ const code = r.code === 255 || r.code === 124 ? "unreachable" : r.code === MISSING_PATH_EXIT || /no such file/i.test(r.stderr) ? "ENOENT" : "remote";
10625
10698
  throw new FsError(code, reason);
10626
10699
  }
10627
10700
  return r.stdout;
@@ -10657,24 +10730,33 @@ function createShellFs(exec, opts = {}) {
10657
10730
  },
10658
10731
  statMany,
10659
10732
  async readdir(p) {
10660
- const b = await run('cd "$1" && ls -1A', [p]);
10733
+ const b = await run(REQUIRE_PATH + 'cd "$1" && ls -1A', [p]);
10661
10734
  return b.toString("utf8").split("\n").filter(Boolean);
10662
10735
  },
10663
10736
  async readFile(p) {
10664
- return (await run('cat "$1"', [p])).toString("utf8");
10737
+ return (await run(REQUIRE_PATH + 'cat "$1"', [p])).toString("utf8");
10665
10738
  },
10666
10739
  async read(p, start, len, timeoutMs) {
10667
10740
  if (len <= 0) return Buffer.alloc(0);
10668
- return run('tail -c +"$2" "$1" | head -c "$3"', [p, String(start + 1), String(len)], timeoutMs || 6e4);
10741
+ return run(REQUIRE_PATH + 'exec 3< "$1" || exit $?\ntail -c +"$2" <&3 | head -c "$3"', [p, String(start + 1), String(len)], timeoutMs || 6e4);
10669
10742
  }
10670
10743
  };
10671
10744
  }
10672
- const LIST_DIRS_SCRIPT = `cd "$1" || exit 1
10745
+ const LIST_DIRS_SCRIPT = `why() { case "$1" in *"not permitted"*) [ "$(uname -s)" = Darwin ] && exit 3 ;; esac; exit 2; }
10746
+ e=$(cd "$1" 2>&1) || { [ -d "$1" ] || exit 1; why "$e"; }
10747
+ cd "$1" || exit 1
10748
+ e=$(LC_ALL=C ls -A 2>&1 >/dev/null) || why "$e"
10673
10749
  for d in * ; do
10674
10750
  [ -d "$d" ] || continue
10675
10751
  [ "$d" = node_modules ] && continue
10676
10752
  if [ -e "$d/.git" ]; then echo "g $d"; else echo "d $d"; fi
10677
10753
  done`;
10754
+ const dirDeniedFromCode = (code) => code === 3 ? "macos" : code === 2 ? "permission" : null;
10755
+ function dirDeniedFromError(err, platform = process.platform) {
10756
+ const code = err == null ? void 0 : err.code;
10757
+ if (code === "EPERM" && platform === "darwin") return "macos";
10758
+ return code === "EACCES" || code === "EPERM" ? "permission" : null;
10759
+ }
10678
10760
  function parseDirList(out) {
10679
10761
  return String(out || "").split("\n").filter((l) => /^[gd] ./.test(l)).map((l) => ({ name: l.slice(2), git: l[0] === "g" }));
10680
10762
  }
@@ -10694,9 +10776,9 @@ async function listDirsLocal(dir) {
10694
10776
  return out;
10695
10777
  }
10696
10778
 
10697
- var __defProp$4 = Object.defineProperty;
10698
- var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10699
- var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
10779
+ var __defProp$5 = Object.defineProperty;
10780
+ var __defNormalProp$5 = (obj, key, value) => key in obj ? __defProp$5(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10781
+ var __publicField$5 = (obj, key, value) => __defNormalProp$5(obj, typeof key !== "symbol" ? key + "" : key, value);
10700
10782
  const SSH_MAX_SESSIONS = 10;
10701
10783
  const STREAM_MARGIN = 2;
10702
10784
  const EXEC_MAX = 6;
@@ -10705,13 +10787,13 @@ const REFUSED_RE = /session open refused|session request failed|administratively
10705
10787
  const isRefused = (stderr) => REFUSED_RE.test(stderr);
10706
10788
  class SessionGate {
10707
10789
  constructor(opts = {}) {
10708
- __publicField$4(this, "opts", opts);
10709
- __publicField$4(this, "execs", 0);
10710
- __publicField$4(this, "streams", 0);
10711
- __publicField$4(this, "peak", 0);
10712
- __publicField$4(this, "refusals", 0);
10713
- __publicField$4(this, "waiting", []);
10714
- __publicField$4(this, "inflight", /* @__PURE__ */ new Map());
10790
+ __publicField$5(this, "opts", opts);
10791
+ __publicField$5(this, "execs", 0);
10792
+ __publicField$5(this, "streams", 0);
10793
+ __publicField$5(this, "peak", 0);
10794
+ __publicField$5(this, "refusals", 0);
10795
+ __publicField$5(this, "waiting", []);
10796
+ __publicField$5(this, "inflight", /* @__PURE__ */ new Map());
10715
10797
  }
10716
10798
  // Short commands allowed at once with the streams currently open.
10717
10799
  capacity() {
@@ -11272,7 +11354,7 @@ const CLAUDE_CHAT = "Chat about this";
11272
11354
  const CHECKBOX = /^\[([ ✔✓x×])\]\s+/;
11273
11355
  const SUBMIT = "Submit";
11274
11356
  const CLAUDE_FREE_BOX = "Type something";
11275
- function parseChoices(text, { strict = false } = {}) {
11357
+ function parseChoices(text, { strict = false, full = false } = {}) {
11276
11358
  if (!text) return null;
11277
11359
  let lines = text.replace(/\s+$/, "").split("\n").slice(-60);
11278
11360
  let c = -1;
@@ -11365,11 +11447,11 @@ function parseChoices(text, { strict = false } = {}) {
11365
11447
  }
11366
11448
  question = question || asks || nearest;
11367
11449
  const out = {
11368
- question: question ? (/\?\s*$/.test(question.t) ? joinQuestion(lines, question.i) : question.t).replace(/^[☐☒✔●◆▸•│\s]+/, "").slice(0, 300) : null,
11450
+ question: question ? (/\?\s*$/.test(question.t) ? joinQuestion(lines, question.i) : question.t).replace(/^[☐☒✔●◆▸•│\s]+/, "").slice(0, full ? void 0 : 300) : null,
11369
11451
  cursor,
11370
11452
  options: options.map((o) => ({
11371
- label: o.label.slice(0, 200),
11372
- hint: o.hint ? o.hint.slice(0, 300) : null,
11453
+ label: o.label.slice(0, full ? void 0 : 200),
11454
+ hint: o.hint ? o.hint.slice(0, full ? void 0 : 300) : null,
11373
11455
  ...o.n !== null ? { n: o.n } : {}
11374
11456
  }))
11375
11457
  };
@@ -11388,7 +11470,7 @@ function parseChoices(text, { strict = false } = {}) {
11388
11470
  const review = lastMatch(lines.slice(0, top), /^\s*Review your answers\s*$/);
11389
11471
  if (review >= 0 && out.options[0] && /^Submit answers$/.test(out.options[0].label)) {
11390
11472
  const answers = lines.slice(review + 1, top).map((l) => l.match(/^\s*→\s+(.+?)\s*$/)).filter(Boolean).map((m) => m[1]);
11391
- if (answers.length) out.options[0] = { ...out.options[0], hint: answers.join(" \xB7 ").slice(0, 300) };
11473
+ if (answers.length) out.options[0] = { ...out.options[0], hint: answers.join(" \xB7 ").slice(0, full ? void 0 : 300) };
11392
11474
  }
11393
11475
  if (question && isPermissionQuestion(out.question)) {
11394
11476
  const detail = screenDetail(lines, question.i, top);
@@ -11474,12 +11556,12 @@ function readOmpField(lines) {
11474
11556
  function parseOmpField(text) {
11475
11557
  return text ? readOmpField(text.replace(/\s+$/, "").split("\n")) : null;
11476
11558
  }
11477
- function parseOmpAsk(text) {
11559
+ function parseOmpAsk(text, full = false) {
11478
11560
  if (!text) return null;
11479
11561
  const lines = text.replace(/\s+$/, "").split("\n");
11480
11562
  const field = readOmpField(lines);
11481
11563
  if (field) {
11482
- const hint = field.value.replace(/\s+/g, " ").trim().slice(0, 200) || null;
11564
+ const hint = field.value.replace(/\s+/g, " ").trim().slice(0, full ? void 0 : 200) || null;
11483
11565
  return { question: field.question, cursor: 0, options: [{ label: OMP_OTHER, hint, free: true }], typing: true };
11484
11566
  }
11485
11567
  const top = lastMatch(lines, OMP_ASK);
@@ -11498,7 +11580,7 @@ function parseOmpAsk(text) {
11498
11580
  const header = sections[0].filter((l) => l.trim());
11499
11581
  const bar = header.slice(0, 3).findIndex((l) => /(?:^| {2,})Submit$/.test(l.trim()));
11500
11582
  const tabs = bar >= 0 ? header.splice(0, bar + 1).join(" ").trim().split(/ {2,}/) : null;
11501
- const question = header.map((l) => l.trim()).join(" ").slice(0, 300) || null;
11583
+ const question = header.map((l) => l.trim()).join(" ").slice(0, full ? void 0 : 300) || null;
11502
11584
  const list = sections[1];
11503
11585
  const options = [];
11504
11586
  let cursor = -1;
@@ -11508,15 +11590,15 @@ function parseOmpAsk(text) {
11508
11590
  if (m) {
11509
11591
  if (m[1]) cursor = options.length;
11510
11592
  multi || (multi = OMP_CHECK.includes(m[2]));
11511
- options.push({ label: m[3].slice(0, 200), hint: null, ...OMP_CHECKED.has(m[2]) ? { checked: true } : {}, ...m[3] === OMP_OTHER ? { free: true } : {} });
11593
+ options.push({ label: m[3].slice(0, full ? void 0 : 200), hint: null, ...OMP_CHECKED.has(m[2]) ? { checked: true } : {}, ...m[3] === OMP_OTHER ? { free: true } : {} });
11512
11594
  } else if (options.length && line.trim() && !options[options.length - 1].hint) {
11513
- options[options.length - 1].hint = line.trim().replace(/^↳\s*/, "").slice(0, 200);
11595
+ options[options.length - 1].hint = line.trim().replace(/^↳\s*/, "").slice(0, full ? void 0 : 200);
11514
11596
  }
11515
11597
  }
11516
11598
  if (!options.length) {
11517
11599
  if (!list.some((l) => OMP_CURSOR.some((c) => l.trim() === `${c} Submit`))) return null;
11518
11600
  const answers = list.map((l) => l.trim()).filter((l) => /^\d+\.\s/.test(l)).map((l) => l.replace(/^\d+\.\s+/, ""));
11519
- return { question, cursor: 0, options: [{ label: "Submit", hint: answers.join(" \xB7 ").slice(0, 200) || null }], ...tabs ? { tabs, tab: tabs.length - 1 } : {} };
11601
+ return { question, cursor: 0, options: [{ label: "Submit", hint: answers.join(" \xB7 ").slice(0, full ? void 0 : 200) || null }], ...tabs ? { tabs, tab: tabs.length - 1 } : {} };
11520
11602
  }
11521
11603
  if (cursor < 0) return null;
11522
11604
  const shown = multi ? options.map((o) => ({ ...o, checked: Boolean(o.checked) })) : options;
@@ -11525,7 +11607,7 @@ function parseOmpAsk(text) {
11525
11607
  const OMP_SELECT_TOP = /^\s*[╭+][─-] (.+?) [─-]+[╮+]\s*$/;
11526
11608
  const OMP_SELECT_LEGEND = new RegExp(`^\\s*[\u2502|] ${ompAlt(OMP_UP_DOWN)} navigate\\b.*\\bselect\\b`);
11527
11609
  const OMP_SELECT_OPTION = new RegExp(`^ (?:(${ompAlt(OMP_CURSOR)})|\\s)\\s(\\S.*)$`);
11528
- function parseOmpSelect(text) {
11610
+ function parseOmpSelect(text, full = false) {
11529
11611
  var _a;
11530
11612
  if (!text) return null;
11531
11613
  const lines = text.replace(/\s+$/, "").split("\n");
@@ -11542,7 +11624,7 @@ function parseOmpSelect(text) {
11542
11624
  const m = s ? OMP_SELECT_OPTION.exec(s) : null;
11543
11625
  if (!m) break;
11544
11626
  if (m[1]) cursor = options.length;
11545
- options.unshift({ label: m[2].trim().slice(0, 200), hint: null });
11627
+ options.unshift({ label: m[2].trim().slice(0, full ? void 0 : 200), hint: null });
11546
11628
  }
11547
11629
  if (cursor < 0) return null;
11548
11630
  cursor = options.length - 1 - cursor;
@@ -11564,8 +11646,8 @@ function parseOmpSelect(text) {
11564
11646
  const detail = tool || !title && body.length ? { tool: tool || "tool", ...body.length ? { command: body.join("\n") } : {} } : void 0;
11565
11647
  return { question: title, cursor, options, ...detail ? { detail } : {} };
11566
11648
  }
11567
- function parseOmpPrompt(text) {
11568
- return parseOmpSelect(text) || parseOmpAsk(text);
11649
+ function parseOmpPrompt(text, full = false) {
11650
+ return parseOmpSelect(text, full) || parseOmpAsk(text, full);
11569
11651
  }
11570
11652
  function ompActiveTab(ansi, tabs) {
11571
11653
  const rows = String(ansi || "").split("\n").map(ansiCells);
@@ -11748,9 +11830,20 @@ function sameQuestion(a, b) {
11748
11830
  const y = questionKey(b);
11749
11831
  return x && y ? x.startsWith(y) || y.startsWith(x) : x === y;
11750
11832
  }
11833
+ const identity = (value) => createHash("sha256").update(JSON.stringify(value)).digest("hex");
11834
+ function promptIdentity(text, agent) {
11835
+ const c = agent === "omp" ? parseOmpPrompt(text, true) : agent ? parseChoices(text, { full: true }) : parseChoices(text, { full: true }) || parseOmpPrompt(text, true);
11836
+ return identity(c ? { question: c.question, options: c.options.map(({ label, hint, n, free }) => ({ label, hint, n, free })), detail: c.detail, multi: c.multi, tabs: c.tabs } : null);
11837
+ }
11838
+ function menuIdentity(menu, target2 = menu.cursor === null ? void 0 : menu.items[menu.cursor]) {
11839
+ return identity({ title: menu.title, target: target2 ? { label: target2.label, hint: target2.hint, header: target2.header } : null, actions: menu.actions });
11840
+ }
11841
+ function waitIdentity(screen) {
11842
+ return identity({ kind: screen.kind, title: screen.title, lines: screen.lines, actions: screen.actions });
11843
+ }
11751
11844
  function screenChoices(text, agent, asked = []) {
11752
- if (agent === "omp") return parseOmpPrompt(text);
11753
- const c = parseChoices(text) || parseChoices(text, { strict: true });
11845
+ const c = agent === "omp" ? parseOmpPrompt(text) : parseChoices(text) || parseChoices(text, { strict: true });
11846
+ if (c) c.identity = promptIdentity(text, agent);
11754
11847
  return c && agent === "claude" ? completeClaudeAsk(c, asked) : c;
11755
11848
  }
11756
11849
  function panelOpen(text, agent) {
@@ -12614,7 +12707,7 @@ const OMP_BUILTIN = [
12614
12707
  ["quit", "Quit the application"]
12615
12708
  ];
12616
12709
 
12617
- const TTL$2 = 5 * 60 * 1e3;
12710
+ const TTL$2 = 20 * 1e3;
12618
12711
  const cache$3 = /* @__PURE__ */ new Map();
12619
12712
  function frontmatter(text) {
12620
12713
  const m = /^---\r?\n([\s\S]*?)\r?\n---/.exec(text);
@@ -12638,6 +12731,13 @@ async function ls$1(fs, d) {
12638
12731
  return [];
12639
12732
  }
12640
12733
  }
12734
+ async function lsRoot(fs, d) {
12735
+ try {
12736
+ return await fs.readdir(d);
12737
+ } catch (err) {
12738
+ return dirDeniedFromError(err) === "macos" ? "denied" : [];
12739
+ }
12740
+ }
12641
12741
  async function read(fs, f) {
12642
12742
  try {
12643
12743
  return await fs.readFile(f);
@@ -12648,14 +12748,26 @@ async function read(fs, f) {
12648
12748
  const HEAD = 16384;
12649
12749
  async function collectLocal(fs, roots) {
12650
12750
  const out = [];
12751
+ const denied = [];
12651
12752
  for (let i = 0; i < roots.length; i++) {
12652
12753
  const r = roots[i];
12754
+ if (r.kind === "exists") {
12755
+ if (await fs.stat(r.dir).then(() => true, () => false)) out.push({ root: i, rel: "", text: "" });
12756
+ continue;
12757
+ }
12653
12758
  if (r.kind === "file") {
12654
12759
  const text = await read(fs, r.dir);
12655
12760
  if (text !== null) out.push({ root: i, rel: "", text });
12656
- } else if (r.kind === "skills") {
12761
+ continue;
12762
+ }
12763
+ const top = await lsRoot(fs, r.dir);
12764
+ if (top === "denied") {
12765
+ denied.push(i);
12766
+ continue;
12767
+ }
12768
+ if (r.kind === "skills") {
12657
12769
  const dirs = [];
12658
- for (const a of await ls$1(fs, r.dir)) {
12770
+ for (const a of top) {
12659
12771
  dirs.push(a);
12660
12772
  for (const b of await ls$1(fs, path$1.join(r.dir, a))) {
12661
12773
  if (b === "SKILL.md") continue;
@@ -12673,7 +12785,7 @@ async function collectLocal(fs, roots) {
12673
12785
  } else {
12674
12786
  const walk = async (rel, depth) => {
12675
12787
  var _a;
12676
- for (const n of await ls$1(fs, path$1.join(r.dir, rel))) {
12788
+ for (const n of rel ? await ls$1(fs, path$1.join(r.dir, rel)) : top) {
12677
12789
  const f = rel ? path$1.join(rel, n) : n;
12678
12790
  if (n.endsWith(".md")) {
12679
12791
  const text = await read(fs, path$1.join(r.dir, f));
@@ -12684,15 +12796,20 @@ async function collectLocal(fs, roots) {
12684
12796
  await walk("", 0);
12685
12797
  }
12686
12798
  }
12687
- return out;
12799
+ return { files: out, denied };
12688
12800
  }
12689
12801
  const SLASH_SCRIPT = `i=0
12802
+ os=$(uname -s)
12690
12803
  while [ $# -ge 2 ]; do
12691
12804
  k=$1; d=$2; shift 2
12692
12805
  case $k in
12806
+ exists) if [ -e "$d" ]; then printf '\\036%s\\037\\037' "$i"; fi ;;
12693
12807
  file) if [ -f "$d" ]; then printf '\\036%s\\037\\037' "$i"; head -c ${HEAD} "$d"; fi ;;
12694
12808
  skills|commands*)
12695
12809
  if [ "$k" = skills ]; then lo=2; hi=4; name=SKILL.md; else lo=1; hi=$((\${k#commands} + 1)); name='*.md'; fi
12810
+ case $(LC_ALL=C ls -A "$d" 2>&1 >/dev/null) in
12811
+ *"not permitted"*) [ "$os" = Darwin ] && printf '\\036D\\037%s\\037' "$i" ;;
12812
+ esac
12696
12813
  if [ -d "$d" ]; then
12697
12814
  find -L "$d" -mindepth $lo -maxdepth $hi -name "$name" -type f 2>/dev/null | sort | while IFS= read -r f; do
12698
12815
  printf '\\036%s\\037%s\\037' "$i" "\${f#"$d"/}"; head -c ${HEAD} "$f"
@@ -12704,13 +12821,15 @@ done
12704
12821
  exit 0`;
12705
12822
  function parseSlashFiles(out) {
12706
12823
  const files = [];
12824
+ const denied = [];
12707
12825
  for (const rec of out.split("")) {
12708
12826
  const a = rec.indexOf("");
12709
12827
  const b = a < 0 ? -1 : rec.indexOf("", a + 1);
12710
12828
  if (b < 0) continue;
12711
- files.push({ root: Number(rec.slice(0, a)), rel: rec.slice(a + 1, b), text: rec.slice(b + 1) });
12829
+ if (rec.slice(0, a) === "D") denied.push(Number(rec.slice(a + 1, b)));
12830
+ else files.push({ root: Number(rec.slice(0, a)), rel: rec.slice(a + 1, b), text: rec.slice(b + 1) });
12712
12831
  }
12713
- return files;
12832
+ return { files, denied };
12714
12833
  }
12715
12834
  async function collectRemote(exec, roots) {
12716
12835
  const args = roots.flatMap((r) => {
@@ -12736,7 +12855,7 @@ function commandsOf(roots, files) {
12736
12855
  const sorted = [...files].sort((a, b) => a.root - b.root || (a.rel < b.rel ? -1 : a.rel > b.rel ? 1 : 0));
12737
12856
  for (const f of sorted) {
12738
12857
  const r = roots[f.root];
12739
- if (!r || r.kind === "file") continue;
12858
+ if (!r || r.kind === "file" || r.kind === "exists") continue;
12740
12859
  const parts = f.rel.split("/");
12741
12860
  const fm = frontmatter(f.text);
12742
12861
  const hint = fm["argument-hint"] || void 0;
@@ -12793,21 +12912,45 @@ function mergeCommands(builtin, extra) {
12793
12912
  function builtinCommands(kind) {
12794
12913
  return mergeCommands(kind === "claude" ? CLAUDE_BUILTIN : kind === "codex" ? CODEX_BUILTIN : kind === "omp" ? OMP_BUILTIN : [], []);
12795
12914
  }
12915
+ function claudeProjectDirs(cwd, home) {
12916
+ if (!cwd) return [];
12917
+ const stop = path$1.resolve(home);
12918
+ const out = [];
12919
+ for (let d = path$1.resolve(cwd); d !== stop; d = path$1.dirname(d)) {
12920
+ out.push(d);
12921
+ if (path$1.dirname(d) === d) break;
12922
+ }
12923
+ return out;
12924
+ }
12925
+ async function claudeCommands(collect, home, cwd) {
12926
+ const dirs = claudeProjectDirs(cwd, home);
12927
+ const roots = dirs.flatMap((d) => [
12928
+ { dir: path$1.join(d, ".git"), kind: "exists" },
12929
+ { dir: path$1.join(d, ".claude/skills"), kind: "skills" },
12930
+ { dir: path$1.join(d, ".claude/commands"), kind: "commands" }
12931
+ ]);
12932
+ roots.push({ dir: path$1.join(home, ".claude/skills"), kind: "skills" }, { dir: path$1.join(home, ".claude/commands"), kind: "commands" });
12933
+ const { files, denied } = await collect(roots);
12934
+ const git = files.filter((f) => roots[f.root].kind === "exists").map((f) => f.root / 3);
12935
+ const last = git.length ? Math.min(...git) : Infinity;
12936
+ const kept = (root) => root >= dirs.length * 3 || Math.floor(root / 3) <= last;
12937
+ return { commands: commandsOf(roots, files.filter((f) => kept(f.root))), denied: denied.some(kept) };
12938
+ }
12796
12939
  async function slashCommands(opts) {
12797
12940
  const { fs, exec, home, kind, cwd } = opts;
12798
12941
  const id = `${opts.key}|${kind}|${cwd || ""}`;
12799
12942
  const hit = cache$3.get(id);
12800
- if (hit && Date.now() - hit.at < TTL$2) return hit.list;
12943
+ if (hit && Date.now() - hit.at < TTL$2) return hit.result;
12801
12944
  const collect = (roots2) => exec ? collectRemote(exec, roots2) : collectLocal(fs, roots2);
12802
- const project = cwd && cwd !== home ? cwd : null;
12803
12945
  let roots = [];
12804
12946
  let builtin = [];
12805
12947
  const extra = [];
12948
+ let denied = false;
12806
12949
  if (kind === "claude") {
12807
12950
  builtin = CLAUDE_BUILTIN;
12808
- for (const b of project ? [project, home] : [home]) {
12809
- roots.push({ dir: path$1.join(b, ".claude/skills"), kind: "skills" }, { dir: path$1.join(b, ".claude/commands"), kind: "commands" });
12810
- }
12951
+ const r = await claudeCommands(collect, home, cwd);
12952
+ extra.push(...r.commands);
12953
+ denied = r.denied;
12811
12954
  } else if (kind === "codex") {
12812
12955
  builtin = CODEX_BUILTIN;
12813
12956
  roots = [{ dir: path$1.join(home, ".codex/prompts"), kind: "commands", depth: 0, prefix: "prompts:" }];
@@ -12816,21 +12959,21 @@ async function slashCommands(opts) {
12816
12959
  const dirs = ompConfigDirs(home, cwd);
12817
12960
  const config = { dir: path$1.join(home, ".omp/agent/config.yml"), kind: "file" };
12818
12961
  roots = [...dirs.map((d) => ({ dir: path$1.join(d, "commands"), kind: "commands" })), config, ...dirs.map((d) => ({ dir: path$1.join(d, "skills"), kind: "skills", prefix: "skill:" }))];
12819
- const files = await collect(roots);
12962
+ const { files } = await collect(roots);
12820
12963
  const cfg = files.find((f) => roots[f.root] === config);
12821
12964
  const more = cfg ? ompSkillDirs(cfg.text, home).map((d) => ({ dir: d, kind: "skills", prefix: "skill:" })) : [];
12822
12965
  const all = [...roots, ...more];
12823
- const found = more.length ? [...files, ...(await collect(more)).map((f) => ({ ...f, root: f.root + roots.length }))] : files;
12966
+ const found = more.length ? [...files, ...(await collect(more)).files.map((f) => ({ ...f, root: f.root + roots.length }))] : files;
12824
12967
  const cmds = commandsOf(all, found);
12825
12968
  const firstSkill = cmds.findIndex((c) => c.source === "skill");
12826
12969
  cmds.splice(firstSkill < 0 ? cmds.length : firstSkill, 0, { name: "init", desc: "Generate AGENTS.md for current codebase", source: "command" });
12827
12970
  extra.push(...cmds);
12828
12971
  roots = [];
12829
12972
  }
12830
- if (roots.length) extra.push(...commandsOf(roots, await collect(roots)));
12831
- const list = mergeCommands(builtin, extra);
12832
- cache$3.set(id, { at: Date.now(), list });
12833
- return list;
12973
+ if (roots.length) extra.push(...commandsOf(roots, (await collect(roots)).files));
12974
+ const result = { commands: mergeCommands(builtin, extra), ...denied ? { denied: "macos" } : {} };
12975
+ cache$3.set(id, { at: Date.now(), result });
12976
+ return result;
12834
12977
  }
12835
12978
  function ompConfigDirs(home, cwd) {
12836
12979
  const bases = [...cwd && cwd !== home ? [cwd] : [], home];
@@ -12904,6 +13047,42 @@ function splitPasted(text, listed = [], known = [], whole = false) {
12904
13047
  return { text: rest, pastes };
12905
13048
  }
12906
13049
 
13050
+ function parseIntegrationStatus(text) {
13051
+ const out = {};
13052
+ for (const line of String(text || "").split("\n")) {
13053
+ const m = /^\s*([a-z][\w-]*):\s+(.+?)\s+\((?:\/|~|[A-Z]:\\)[^()]*\)\s*$/i.exec(line);
13054
+ if (!m) continue;
13055
+ const state = m[2].toLowerCase();
13056
+ out[m[1].toLowerCase()] = state.startsWith("not installed") ? "missing" : state.startsWith("current") ? "installed" : "outdated";
13057
+ }
13058
+ return out;
13059
+ }
13060
+ const integrationCommand = (agent) => `herdr integration install ${agent}`;
13061
+ const ACTIVE = /* @__PURE__ */ new Set(["working", "blocked", "done"]);
13062
+ const activeStatus = (status) => ACTIVE.has(String(status || ""));
13063
+ function missingIntegration(p, status, wasActive) {
13064
+ if (!p.agent || p.agentSession || !status) return false;
13065
+ if (status[p.agent] !== "missing") return false;
13066
+ return wasActive || !p.bornAt;
13067
+ }
13068
+ function createActivity() {
13069
+ const active = /* @__PURE__ */ new Map();
13070
+ return {
13071
+ observe(p) {
13072
+ if (!p.agent) {
13073
+ active.delete(p.id);
13074
+ return;
13075
+ }
13076
+ if (active.get(p.id) !== p.agent) active.delete(p.id);
13077
+ if (activeStatus(p.status)) active.set(p.id, p.agent);
13078
+ },
13079
+ was: (id, agent) => Boolean(agent) && active.get(id) === agent,
13080
+ prune(keep) {
13081
+ for (const id of active.keys()) if (!keep(id)) active.delete(id);
13082
+ }
13083
+ };
13084
+ }
13085
+
12907
13086
  const WINDOW_BYTES = 2 * 1024 * 1024;
12908
13087
  const MAX_READ_BYTES = 24 * 1024 * 1024;
12909
13088
  const PAGE_ITEMS = 120;
@@ -13235,6 +13414,7 @@ function codexCommand(input) {
13235
13414
  return firstLine(s);
13236
13415
  }
13237
13416
  function parseCodex(lines) {
13417
+ var _a;
13238
13418
  const items = [];
13239
13419
  const calls = /* @__PURE__ */ new Map();
13240
13420
  for (let li = 0; li < lines.length; li++) {
@@ -13247,6 +13427,10 @@ function parseCodex(lines) {
13247
13427
  } catch {
13248
13428
  continue;
13249
13429
  }
13430
+ if (d.type === "event_msg" && ((_a = d.payload) == null ? void 0 : _a.type) === "turn_aborted") {
13431
+ if (d.payload.reason === "interrupted") items.push({ role: "system", text: "Interrupted", ts: d.timestamp || null });
13432
+ continue;
13433
+ }
13250
13434
  if (d.type !== "response_item" || !d.payload) continue;
13251
13435
  const p = d.payload;
13252
13436
  const ts = d.timestamp || null;
@@ -13616,9 +13800,14 @@ function createTranscripts({ home, herdr: herdr2, fs = localFs }) {
13616
13800
  return best && { file: best.file, session: best.id, guessed: true };
13617
13801
  }
13618
13802
  const codexPeers = /* @__PURE__ */ new Map();
13803
+ const activity = createActivity();
13619
13804
  function observe(panes) {
13805
+ var _a;
13620
13806
  codexPeers.clear();
13621
13807
  for (const p of panes) if (p.agent === "codex") codexPeers.set(p.id, p);
13808
+ const live = new Set(panes.map((p) => p.id));
13809
+ activity.prune((id) => live.has(id));
13810
+ for (const p of panes) activity.observe({ id: p.id, agent: p.agent, status: (_a = p.status) != null ? _a : null });
13622
13811
  }
13623
13812
  const bySession = /* @__PURE__ */ new Map();
13624
13813
  async function findSessionFile(kind, id) {
@@ -13941,7 +14130,7 @@ function createTranscripts({ home, herdr: herdr2, fs = localFs }) {
13941
14130
  askCache.delete(paneId);
13942
14131
  claudeAskCache.delete(paneId);
13943
14132
  }
13944
- return { chat, preview, image, forget, locate, model, observe, search, pendingTool, pendingAsk, pendingClaudeQuestions };
14133
+ return { chat, preview, image, forget, locate, model, observe, wasActive: activity.was, search, pendingTool, pendingAsk, pendingClaudeQuestions };
13945
14134
  }
13946
14135
 
13947
14136
  const ATTACH_LIMITS = {
@@ -14036,9 +14225,9 @@ function closeTrailingMention(text) {
14036
14225
  return /(^|\n)@\S+$/.test(text) ? `${text} ` : text;
14037
14226
  }
14038
14227
 
14039
- var __defProp$3 = Object.defineProperty;
14040
- var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14041
- var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
14228
+ var __defProp$4 = Object.defineProperty;
14229
+ var __defNormalProp$4 = (obj, key, value) => key in obj ? __defProp$4(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14230
+ var __publicField$4 = (obj, key, value) => __defNormalProp$4(obj, typeof key !== "symbol" ? key + "" : key, value);
14042
14231
  const fsp$3 = fs.promises;
14043
14232
  const LOCAL_LABEL_FILE = path$1.join(DATA_DIR, "machine-label.txt");
14044
14233
  function renamedLabel() {
@@ -14141,43 +14330,43 @@ function runFile(bin, args, timeoutMs) {
14141
14330
  const lastLine = (s) => String(s || "").trim().split("\n").filter(Boolean).pop() || "";
14142
14331
  class RemoteMachine {
14143
14332
  constructor(p, onChange) {
14144
- __publicField$3(this, "key");
14145
- __publicField$3(this, "baseKey");
14146
- __publicField$3(this, "profileId");
14147
- __publicField$3(this, "label");
14148
- __publicField$3(this, "target");
14149
- __publicField$3(this, "profileSession");
14150
- __publicField$3(this, "local", false);
14151
- __publicField$3(this, "status", "connecting");
14152
- __publicField$3(this, "error", null);
14153
- __publicField$3(this, "home", "");
14154
- __publicField$3(this, "os", "");
14155
- __publicField$3(this, "bin", "");
14156
- __publicField$3(this, "remoteSock", "");
14157
- __publicField$3(this, "ctl");
14158
- __publicField$3(this, "fwd");
14159
- __publicField$3(this, "fwdClient");
14160
- __publicField$3(this, "clientFwd", false);
14161
- __publicField$3(this, "fs");
14162
- __publicField$3(this, "transcripts");
14163
- __publicField$3(this, "exec");
14164
- __publicField$3(this, "master", null);
14165
- __publicField$3(this, "masterErr", []);
14166
- __publicField$3(this, "fails", 0);
14167
- __publicField$3(this, "timer", null);
14168
- __publicField$3(this, "purgeTimer", null);
14169
- __publicField$3(this, "stopped", false);
14170
- __publicField$3(this, "connecting", false);
14171
- __publicField$3(this, "pollFails", 0);
14333
+ __publicField$4(this, "key");
14334
+ __publicField$4(this, "baseKey");
14335
+ __publicField$4(this, "profileId");
14336
+ __publicField$4(this, "label");
14337
+ __publicField$4(this, "target");
14338
+ __publicField$4(this, "profileSession");
14339
+ __publicField$4(this, "local", false);
14340
+ __publicField$4(this, "status", "connecting");
14341
+ __publicField$4(this, "error", null);
14342
+ __publicField$4(this, "home", "");
14343
+ __publicField$4(this, "os", "");
14344
+ __publicField$4(this, "bin", "");
14345
+ __publicField$4(this, "remoteSock", "");
14346
+ __publicField$4(this, "ctl");
14347
+ __publicField$4(this, "fwd");
14348
+ __publicField$4(this, "fwdClient");
14349
+ __publicField$4(this, "clientFwd", false);
14350
+ __publicField$4(this, "fs");
14351
+ __publicField$4(this, "transcripts");
14352
+ __publicField$4(this, "exec");
14353
+ __publicField$4(this, "master", null);
14354
+ __publicField$4(this, "masterErr", []);
14355
+ __publicField$4(this, "fails", 0);
14356
+ __publicField$4(this, "timer", null);
14357
+ __publicField$4(this, "purgeTimer", null);
14358
+ __publicField$4(this, "stopped", false);
14359
+ __publicField$4(this, "connecting", false);
14360
+ __publicField$4(this, "pollFails", 0);
14172
14361
  // Identity seen at connection (host name + remote socket): duplicates.
14173
- __publicField$3(this, "ident", "");
14174
- __publicField$3(this, "onChange");
14175
- __publicField$3(this, "onSkip", () => {
14362
+ __publicField$4(this, "ident", "");
14363
+ __publicField$4(this, "onChange");
14364
+ __publicField$4(this, "onSkip", () => {
14176
14365
  });
14177
- __publicField$3(this, "onOnline", () => {
14366
+ __publicField$4(this, "onOnline", () => {
14178
14367
  });
14179
14368
  // Session budget of the shared connection (sshd MaxSessions).
14180
- __publicField$3(this, "gate", new SessionGate({
14369
+ __publicField$4(this, "gate", new SessionGate({
14181
14370
  onRefused: (s, attempt) => log(`machine ${this.label}: SSH session refused (attempt ${attempt}; open: ${s.execs} commands + ${s.streams} streams, ${s.queued} queued, peak ${s.peak})`)
14182
14371
  }));
14183
14372
  this.key = p.key;
@@ -14481,6 +14670,12 @@ const remoteMachines = () => [...remotes.values()];
14481
14670
  const getMachine = (key) => !key ? localMachine : remotes.get(key) || sessions.get(key);
14482
14671
  const machineOfPane = (id) => getMachine(splitId(String(id || "")).machine);
14483
14672
  const multiMachine = () => remotes.size > 0 || sessions.size > 0;
14673
+ async function runHerdrCli(m, args, timeoutMs = 1e4) {
14674
+ if (m.local) return runFile(HERDR_BIN, args, timeoutMs);
14675
+ const remote = m;
14676
+ if (remote.status !== "online" || !remote.bin) throw new HerdrError("unreachable", fmt("{machine} is unreachable", { machine: m.label }));
14677
+ return remote.exec('b="$1"; shift; "$b" "$@"', [remote.bin, ...args], { timeoutMs });
14678
+ }
14484
14679
  async function listSessions(baseKey) {
14485
14680
  const m = baseMachines().find((x) => x.key === baseKey);
14486
14681
  if (!m) throw new HerdrError("bad_machine", "unknown machine");
@@ -14918,11 +15113,53 @@ function foregroundCommand(info) {
14918
15113
  return [name, ...argv.slice(1)].join(" ").replace(/\s+/g, " ").trim().slice(0, 60);
14919
15114
  }
14920
15115
 
15116
+ var __defProp$3 = Object.defineProperty;
15117
+ var __defNormalProp$3 = (obj, key, value) => key in obj ? __defProp$3(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
15118
+ var __publicField$3 = (obj, key, value) => __defNormalProp$3(obj, typeof key !== "symbol" ? key + "" : key, value);
14921
15119
  const SCREEN_MS$1 = 3e3;
14922
- function keepReading(c, rev, strict, watch, now) {
14923
- if (!c || c.rev !== rev || c.strict !== strict) return false;
15120
+ const CHOICE_MS = 1e3;
15121
+ function keepReading(c, rev, strict, watch, now, viewed = false) {
15122
+ if (!c || c.unavailable || c.rev !== rev || c.strict !== strict) return false;
14924
15123
  const live = watch || !strict && !c.usageLimit || Boolean(c.choices || c.screen || c.menu || c.interaction === "terminal");
14925
- return !(live && now - c.at >= SCREEN_MS$1);
15124
+ return !(live && now - c.at >= (c.choices && viewed ? CHOICE_MS : SCREEN_MS$1));
15125
+ }
15126
+ class ScreenCache extends Map {
15127
+ constructor() {
15128
+ super(...arguments);
15129
+ // Retained only for disabled display after invalidation; never a cache hit.
15130
+ __publicField$3(this, "retained", /* @__PURE__ */ new Map());
15131
+ __publicField$3(this, "sequence", 0);
15132
+ __publicField$3(this, "versions", /* @__PURE__ */ new Map());
15133
+ }
15134
+ version(id) {
15135
+ if (!this.versions.has(id)) this.versions.set(id, ++this.sequence);
15136
+ return this.versions.get(id);
15137
+ }
15138
+ invalidate(id) {
15139
+ this.versions.set(id, ++this.sequence);
15140
+ }
15141
+ previous(id) {
15142
+ return this.get(id) || this.retained.get(id);
15143
+ }
15144
+ ids() {
15145
+ return /* @__PURE__ */ new Set([...this.keys(), ...this.versions.keys()]);
15146
+ }
15147
+ delete(id) {
15148
+ const previous = this.get(id);
15149
+ if (previous !== void 0) this.retained.set(id, previous);
15150
+ if (this.versions.has(id)) this.invalidate(id);
15151
+ return super.delete(id);
15152
+ }
15153
+ clear() {
15154
+ this.retained.clear();
15155
+ this.versions.clear();
15156
+ super.clear();
15157
+ }
15158
+ forget(id) {
15159
+ this.retained.delete(id);
15160
+ this.versions.delete(id);
15161
+ super.delete(id);
15162
+ }
14926
15163
  }
14927
15164
 
14928
15165
  const KEY_NAMES = { enter: "enter", return: "enter", esc: "esc", escape: "esc", tab: "tab" };
@@ -15025,6 +15262,16 @@ function settingsTabs(text) {
15025
15262
  const i = settingsRowIndex(lines);
15026
15263
  return i < 0 ? null : tabsOfRow(lines[i]);
15027
15264
  }
15265
+ function settingsFocus(text) {
15266
+ const rows = text.split("\n");
15267
+ const index = settingsRowIndex(rows);
15268
+ if (index < 0) return null;
15269
+ const lines = rows.slice(index + 1).map((l) => l.trim());
15270
+ if (lines.some((l) => /^←\/→\/tab to switch · ↓ to return · Esc to close$/.test(l))) return "tabs";
15271
+ if (lines.some((l) => /^Type to filter · Enter\/↓ to select · ↑ to tabs · Esc to clear$/.test(l))) return "filter";
15272
+ if (lines.some((l) => /^(?:Enter\/Space to change · )?\/ to search · Esc to close$/.test(l))) return "list";
15273
+ return null;
15274
+ }
15028
15275
 
15029
15276
  const SGR$1 = /\x1b\[([0-9;]*)m/g;
15030
15277
  const OTHER_ESC = /\x1b\[[0-9;?]*[ -/]*[@-~]|\x1b\][^\x07\x1b]*(?:\x07|\x1b\\)/g;
@@ -15313,12 +15560,13 @@ function parseUsageLimit(text, agent) {
15313
15560
  }
15314
15561
 
15315
15562
  function terminalException(text) {
15316
- var _a;
15563
+ var _a, _b;
15317
15564
  const lines = text.trimEnd().split("\n");
15318
15565
  const at = lines.findLastIndex((l) => /^\s*(?:Agent Command Center|Usage)\s*$/.test(l));
15319
15566
  if (at < 0) return false;
15320
15567
  const body = lines.slice(at + 1).filter((l) => l.trim());
15321
- const legend = (_a = body.pop()) == null ? void 0 : _a.trim();
15568
+ if (lines[at].trim() === "Usage" && ((_a = body[0]) == null ? void 0 : _a.trim()) === "Account usage and resets.") body.shift();
15569
+ const legend = (_b = body.pop()) == null ? void 0 : _b.trim();
15322
15570
  if (lines[at].trim() === "Agent Command Center") {
15323
15571
  return legend === "Use arrows to navigate, Enter to open, Escape to return." && body.some((l) => /^\s*›\s+\S/.test(l)) && body.every((l) => /^(?:›\s+)?\S.* {2,}\S/.test(l.trim()));
15324
15572
  }
@@ -15689,6 +15937,41 @@ function inputBox(ansi) {
15689
15937
  if (!bash && PLACEHOLDER_HINT.test(box) && !COLOR_SGR.test(ansi)) box = "";
15690
15938
  return bash ? `!${box && " "}${box}` : box;
15691
15939
  }
15940
+ const CODEX_FIELD = /^›(?: |$)/;
15941
+ function codexFieldLine(ansi) {
15942
+ const lines = String(ansi || "").split("\n").map((l) => l.replace(/\r$/, ""));
15943
+ let at = -1;
15944
+ for (let i = lines.length - 1; i >= 0 && at < 0; i--) if (CODEX_FIELD.test(lines[i].replace(SGR, ""))) at = i;
15945
+ if (at < 0) return null;
15946
+ const line = lines[at];
15947
+ const mark = sgrState(line.slice(0, line.indexOf("\u203A")));
15948
+ if (mark.dim || mark.reverse) return null;
15949
+ for (const below of lines.slice(at + 1)) {
15950
+ const plain = below.replace(SGR, "");
15951
+ if (plain.trim() && !plain.startsWith(" ")) return null;
15952
+ }
15953
+ return undimmed(line).replace(/^›\s?/, "").replace(/\u00a0/g, " ").trim();
15954
+ }
15955
+ function sgrState(prefix) {
15956
+ let dim = false;
15957
+ let reverse = false;
15958
+ for (const m of prefix.matchAll(SGR)) {
15959
+ if (!m[0].endsWith("m")) continue;
15960
+ const codes = m[0].slice(2, -1).split(";");
15961
+ for (let i = 0; i < codes.length; i++) {
15962
+ const c = Number(codes[i] || 0);
15963
+ if (c === 0) {
15964
+ dim = false;
15965
+ reverse = false;
15966
+ } else if (c === 2) dim = true;
15967
+ else if (c === 22) dim = false;
15968
+ else if (c === 7) reverse = true;
15969
+ else if (c === 27) reverse = false;
15970
+ else if (c === 38 || c === 48 || c === 58) i += codes[i + 1] === "5" ? 2 : codes[i + 1] === "2" ? 4 : 0;
15971
+ }
15972
+ }
15973
+ return { dim, reverse };
15974
+ }
15692
15975
  function clearKeys(lines) {
15693
15976
  const keys = [];
15694
15977
  for (let i = 0; i < Math.min(Math.max(lines, 1) + 2, 200); i++) keys.push("ctrl+u", "backspace");
@@ -16033,6 +16316,7 @@ const compact = (s) => s.replace(/\s+/g, "");
16033
16316
  const BASH_EMPTY = "!";
16034
16317
  const isFree = (box) => !box || box === BASH_EMPTY;
16035
16318
  const tidy = (s) => s.replace(/\s+/g, " ").trim();
16319
+ const submittable = (text) => text.endsWith("\\") ? `${text} ` : text;
16036
16320
  function classifyBox(box, ours) {
16037
16321
  const b = compact(box);
16038
16322
  const o = compact(ours);
@@ -16137,7 +16421,7 @@ async function sendOne(d, text, o, foreign) {
16137
16421
  };
16138
16422
  field = await waitFree(d, o);
16139
16423
  for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
16140
- await d.type(await bashReady(d, o, text, field));
16424
+ await d.type(submittable(await bashReady(d, o, text, field)));
16141
16425
  let state = { kind: "empty" };
16142
16426
  let box = "";
16143
16427
  const typed = now();
@@ -16172,6 +16456,7 @@ async function sendOne(d, text, o, foreign) {
16172
16456
  if (!same) {
16173
16457
  after = state.kind === "unknown" ? { kind: "unknown" } : classifyBox(box, text);
16174
16458
  if (after.kind === "glued") break;
16459
+ if (after.kind === "partial") continue;
16175
16460
  return;
16176
16461
  }
16177
16462
  if (!again && now() - entered >= o.submitWaitMs / 3) {
@@ -16533,23 +16818,30 @@ async function listDirs(p, machine = "") {
16533
16818
  const home = m.home;
16534
16819
  const dir = underHome(p || home, home);
16535
16820
  if (!dir) throw new HerdrError("bad_path", fmt("Outside {home}", { home }));
16821
+ const remote = m instanceof RemoteMachine;
16822
+ const parent = dir === home ? null : px.dirname(dir);
16536
16823
  let raw;
16824
+ let denied = null;
16537
16825
  if (m instanceof RemoteMachine) {
16538
16826
  const r = await m.exec(LIST_DIRS_SCRIPT, [dir], { timeoutMs: 15e3 });
16539
- if (r.code !== 0) throw new HerdrError("bad_path", fmt("Folder unreadable: {path}", { path: dir }));
16827
+ denied = dirDeniedFromCode(r.code);
16828
+ if (r.code !== 0 && !denied) throw new HerdrError("bad_path", fmt("Folder unreadable: {path}", { path: dir }));
16540
16829
  raw = parseDirList(r.stdout.toString("utf8"));
16541
16830
  } else {
16542
16831
  try {
16543
16832
  raw = await listDirsLocal(dir);
16544
- } catch {
16545
- throw new HerdrError("bad_path", fmt("Folder unreadable: {path}", { path: dir }));
16833
+ } catch (err) {
16834
+ denied = dirDeniedFromError(err);
16835
+ if (!denied) throw new HerdrError("bad_path", fmt("Folder unreadable: {path}", { path: dir }));
16836
+ raw = [];
16546
16837
  }
16547
16838
  }
16839
+ if (denied) return { path: dir, parent, home, dirs: [], denied, ...remote ? { remote } : {} };
16548
16840
  const out = raw.map((e) => ({ name: e.name, path: px.join(dir, e.name), git: e.git }));
16549
16841
  out.sort((a, b) => Number(b.git) - Number(a.git) || a.name.localeCompare(b.name));
16550
16842
  const kinds = await projectFolderKinds(m, [dir, ...out.map((e) => e.path)]);
16551
16843
  for (const e of out) if (kinds[e.path]) e.project = kinds[e.path];
16552
- return { path: dir, parent: dir === home ? null : px.dirname(dir), home, dirs: out, ...kinds[dir] ? { project: kinds[dir] } : {} };
16844
+ return { path: dir, parent, home, dirs: out, ...kinds[dir] ? { project: kinds[dir] } : {} };
16553
16845
  }
16554
16846
  async function closePanel(paneId) {
16555
16847
  const p = findPane(paneId);
@@ -16711,6 +17003,35 @@ function cleanSavedSizes(raw, isPane) {
16711
17003
  return out;
16712
17004
  }
16713
17005
 
17006
+ const SCROLL_MS = 75;
17007
+ const MAX_LINES = 500;
17008
+ function createScrollThrottle(send2, { intervalMs = SCROLL_MS, now = Date.now, setTimer = setTimeout, clearTimer = clearTimeout } = {}) {
17009
+ let net = 0;
17010
+ let last = -Infinity;
17011
+ let timer = null;
17012
+ const flush = () => {
17013
+ timer = null;
17014
+ if (!net) return;
17015
+ send2(net > 0 ? "up" : "down", Math.min(Math.abs(net), MAX_LINES));
17016
+ net = 0;
17017
+ last = now();
17018
+ };
17019
+ return {
17020
+ push(direction, lines) {
17021
+ net += direction === "up" ? lines : -lines;
17022
+ if (timer) return;
17023
+ const wait = last + intervalMs - now();
17024
+ if (wait <= 0) flush();
17025
+ else timer = setTimer(flush, wait);
17026
+ },
17027
+ dispose() {
17028
+ if (timer) clearTimer(timer);
17029
+ timer = null;
17030
+ net = 0;
17031
+ }
17032
+ };
17033
+ }
17034
+
16714
17035
  const clampInt = (v, lo, hi, dflt) => {
16715
17036
  const n = parseInt(String(v), 10);
16716
17037
  return Number.isFinite(n) ? Math.min(hi, Math.max(lo, n)) : dflt;
@@ -16835,6 +17156,7 @@ function openTerm(ws, url) {
16835
17156
  });
16836
17157
  for (const m of early.splice(0)) toChild(m);
16837
17158
  }
17159
+ const scroll = createScrollThrottle((direction, lines) => toChild({ type: "terminal.scroll", direction, lines }));
16838
17160
  paneSizes().hold(pane).then((h) => {
16839
17161
  if (closed) return h.release(true);
16840
17162
  hold = h;
@@ -16861,7 +17183,7 @@ function openTerm(ws, url) {
16861
17183
  }
16862
17184
  case "terminal.scroll":
16863
17185
  if (m.direction === "up" || m.direction === "down") {
16864
- toChild({ type: "terminal.scroll", direction: m.direction, lines: clampInt(m.lines, 1, 500, 3) });
17186
+ scroll.push(m.direction, clampInt(m.lines, 1, 500, 3));
16865
17187
  }
16866
17188
  break;
16867
17189
  case "keys":
@@ -16884,6 +17206,7 @@ function openTerm(ws, url) {
16884
17206
  },
16885
17207
  onClose(clean = false) {
16886
17208
  closed = true;
17209
+ scroll.dispose();
16887
17210
  termSessions.delete(sess);
16888
17211
  const c = child;
16889
17212
  if (c) {
@@ -18873,9 +19196,23 @@ function watchScreen(paneId, ms = 6e4) {
18873
19196
  screenWatch.set(paneId, Date.now() + ms);
18874
19197
  choicesCache.delete(paneId);
18875
19198
  }
18876
- const choicesCache = /* @__PURE__ */ new Map();
19199
+ const choicesCache = new ScreenCache();
18877
19200
  const askChecks = /* @__PURE__ */ new Map();
19201
+ const choicesPending = /* @__PURE__ */ new Map();
18878
19202
  async function choicesFor(p, rev, strict, watch = false) {
19203
+ const key = JSON.stringify([rev, strict, p.agent, p.agentSession]);
19204
+ const active = choicesPending.get(p.id);
19205
+ if ((active == null ? void 0 : active.key) === key && active.generation === choicesCache.version(p.id)) return active.reading;
19206
+ const reading = readChoices(p, rev, strict, watch);
19207
+ const entry = { key, reading, generation: choicesCache.version(p.id) };
19208
+ choicesPending.set(p.id, entry);
19209
+ try {
19210
+ return await reading;
19211
+ } finally {
19212
+ if (choicesPending.get(p.id) === entry) choicesPending.delete(p.id);
19213
+ }
19214
+ }
19215
+ async function readChoices(p, rev, strict, watch = false) {
18879
19216
  if (modelControlBusy(p.id)) {
18880
19217
  choicesCache.delete(p.id);
18881
19218
  return { choices: null, screen: null, menu: null, interaction: "managed" };
@@ -18883,7 +19220,16 @@ async function choicesFor(p, rev, strict, watch = false) {
18883
19220
  const c = choicesCache.get(p.id);
18884
19221
  const watched = (screenWatch.get(p.id) || 0) > Date.now();
18885
19222
  if (!watched) screenWatch.delete(p.id);
18886
- if (c && !(p.status === "unknown" && c.interaction === "terminal") && keepReading(c, rev, strict, watch || watched, Date.now())) return c;
19223
+ if (c && !(p.status === "unknown" && c.interaction === "terminal") && keepReading(c, rev, strict, watch || watched, Date.now(), isViewed(p.id))) return c;
19224
+ choicesCache.invalidate(p.id);
19225
+ const generation = choicesCache.version(p.id);
19226
+ const unavailable = (previous = choicesCache.previous(p.id)) => previous ? {
19227
+ ...previous,
19228
+ unavailable: true,
19229
+ choices: previous.choices ? { ...previous.choices, unavailable: true } : null,
19230
+ screen: previous.screen ? { ...previous.screen, unavailable: true } : null,
19231
+ menu: previous.menu ? { ...previous.menu, unavailable: true } : null
19232
+ } : { choices: null, screen: null, menu: null, interaction: "unknown", unavailable: true };
18887
19233
  let out;
18888
19234
  try {
18889
19235
  const r = await herdr("pane.read", { pane_id: p.id, source: "detection" }, 4e3);
@@ -18891,8 +19237,13 @@ async function choicesFor(p, rev, strict, watch = false) {
18891
19237
  const framed = String(text || "").split("\n").some((l) => TOP.test(l));
18892
19238
  const usageLimit = p.status === "unknown" ? null : parseUsageLimit(String(text || ""), p.agent);
18893
19239
  let choices = usageLimit ? null : p.agent === "omp" ? parseOmpPrompt(text) : parseChoices(text, { strict });
19240
+ if (choices) choices.identity = promptIdentity(text, p.agent);
18894
19241
  const menu = !usageLimit && p.agent !== "omp" && framed && (strict || !choices || !parseChoices(text, { strict: true })) ? await readMenu(p.id) : null;
18895
- if (menu) choices = null;
19242
+ if (menu) {
19243
+ menu.identity = menuIdentity(menu);
19244
+ for (const item of menu.items) item.identity = menuIdentity(menu, item);
19245
+ choices = null;
19246
+ }
18896
19247
  if (choices && p.agent === "omp" && !choices.detail) choices = await withOmpTab(p.id, completeOmpAsk(choices, await transcripts.pendingAsk(p).catch(() => [])));
18897
19248
  if (choices && p.agent === "claude") {
18898
19249
  const checks = askChecks.get(p.id) || /* @__PURE__ */ new Map();
@@ -18901,6 +19252,7 @@ async function choicesFor(p, rev, strict, watch = false) {
18901
19252
  } else if (!choices) askChecks.delete(p.id);
18902
19253
  const settings = p.agent === "claude" && settingsTabs(text) !== null;
18903
19254
  const screen = menu || settings ? null : parseWaitScreen(text, { choices: Boolean(choices) });
19255
+ if (screen) screen.identity = waitIdentity(screen);
18904
19256
  const interaction = classifyScreen({ text: String(text || ""), agent: p.agent, choices, menu, screen, settings, status: p.status });
18905
19257
  out = interaction === "terminal" ? { choices: null, screen: null, menu: null, interaction } : { choices, screen: usageLimit ? null : screen, menu, interaction, ...usageLimit ? { usageLimit } : {} };
18906
19258
  noteScreen(p.id, p.agent, text);
@@ -18912,7 +19264,10 @@ async function choicesFor(p, rev, strict, watch = false) {
18912
19264
  if (p.agent === "omp" && !choices.question && tr) choices.question = `Allow tool: ${tr.tool}`;
18913
19265
  }
18914
19266
  } catch {
18915
- out = { choices: c ? c.choices : null, screen: c ? c.screen : null, menu: c ? c.menu : null, interaction: (c == null ? void 0 : c.interaction) || "unknown", ...(c == null ? void 0 : c.usageLimit) ? { usageLimit: c.usageLimit } : {} };
19267
+ out = unavailable(c || choicesCache.previous(p.id));
19268
+ }
19269
+ if (choicesCache.version(p.id) !== generation) {
19270
+ return choicesCache.get(p.id) || unavailable();
18916
19271
  }
18917
19272
  choicesCache.set(p.id, { rev, strict, at: Date.now(), ...out });
18918
19273
  return out;
@@ -18953,6 +19308,18 @@ function refreshActivity(p) {
18953
19308
  if (((_d = old2 == null ? void 0 : old2.notice) != null ? _d : null) !== notice || ((_e = old2 == null ? void 0 : old2.suggestion) != null ? _e : null) !== (working ? null : suggestion)) setTimeout(poll, 0);
18954
19309
  }).finally(() => activityBusy.delete(p.id));
18955
19310
  }
19311
+ const codexFields = /* @__PURE__ */ new Map();
19312
+ const codexFieldBusy = /* @__PURE__ */ new Set();
19313
+ function refreshCodexField(p) {
19314
+ if (codexFieldBusy.has(p.id)) return;
19315
+ codexFieldBusy.add(p.id);
19316
+ herdr("pane.read", { pane_id: p.id, source: "visible", format: "ansi" }, 4e3).then((r) => codexFieldLine(String(r.read && r.read.text || "")) || "", () => "").then((text) => {
19317
+ const old = codexFields.get(p.id);
19318
+ const seen2 = text && (old == null ? void 0 : old.text) === text ? old.seen + 1 : 1;
19319
+ codexFields.set(p.id, { text, seen: seen2, at: Date.now() });
19320
+ if ((old && old.seen > 1 ? old.text : "") !== (seen2 > 1 ? text : "")) setTimeout(poll, 0);
19321
+ }).finally(() => codexFieldBusy.delete(p.id));
19322
+ }
18956
19323
  const OMP_STATUS_MS = 3e3;
18957
19324
  const ompStatuses = /* @__PURE__ */ new Map();
18958
19325
  const ompStatusBusy = /* @__PURE__ */ new Set();
@@ -19084,13 +19451,14 @@ const restarting = (paneId) => {
19084
19451
  return Boolean(r && r.phase !== "failed");
19085
19452
  };
19086
19453
  const GUARD_STATES = /* @__PURE__ */ new Set(["idle", "done", "working"]);
19454
+ const typedFor = (p, text) => p.agent === "claude" ? submittable(text) : text;
19087
19455
  function sendPrompt(p, text) {
19088
19456
  return withPaneLock(p.id, async () => {
19089
19457
  const now = findPane(p.id);
19090
19458
  if ((now == null ? void 0 : now.stopped) || (now == null ? void 0 : now.leaving)) {
19091
19459
  throw new HerdrError(isSlashCommand(text) ? "stale" : "no_input", "Restart Codex before sending a command.");
19092
19460
  }
19093
- if (p.agent !== "claude" || !GUARD_STATES.has(p.status || "") || isSlashCommand(text) && !p.usageLimit) return agentPrompt(p.id, text);
19461
+ if (p.agent !== "claude" || !GUARD_STATES.has(p.status || "") || isSlashCommand(text) && !p.usageLimit) return agentPrompt(p.id, typedFor(p, text));
19094
19462
  const keep = (texts) => {
19095
19463
  for (const t of texts || []) {
19096
19464
  addQueued(p.id, t, { held: true });
@@ -19267,7 +19635,7 @@ async function cancelQueued(paneId, text, id) {
19267
19635
  const r2 = await transcripts.chat(p, {});
19268
19636
  return { queue: r2.queue || [], items: r2.items || [] };
19269
19637
  },
19270
- prompt: (t) => agentPrompt(p.id, t),
19638
+ prompt: (t) => agentPrompt(p.id, submittable(t)),
19271
19639
  sleep: sleep$1,
19272
19640
  original: (e) => {
19273
19641
  var _a2, _b2;
@@ -19345,7 +19713,7 @@ function flushPending(p) {
19345
19713
  }
19346
19714
  if (!p.agent || !READY.has(p.status || "")) return;
19347
19715
  pendingBusy.add(p.id);
19348
- withPaneLock(p.id, () => agentPrompt(p.id, pend.text)).then(() => {
19716
+ withPaneLock(p.id, () => agentPrompt(p.id, typedFor(p, pend.text))).then(() => {
19349
19717
  pendingPrompts.delete(p.id);
19350
19718
  log(`initial prompt ${p.id} sent`);
19351
19719
  }).catch((e) => {
@@ -19431,8 +19799,8 @@ function paneCommand(id) {
19431
19799
  }
19432
19800
  return (c == null ? void 0 : c.cmd) || "";
19433
19801
  }
19434
- async function enrich(next, snap, machine) {
19435
- var _a2, _b2, _c;
19802
+ async function enrich(next, snap, machine, publish) {
19803
+ var _a2, _b2;
19436
19804
  const firstSnapshot = !seenMachines.has(machine);
19437
19805
  const prevStatus = new Map((((_a2 = mstates.get(machine)) == null ? void 0 : _a2.panes) || []).map((p) => [p.id, p.status || void 0]));
19438
19806
  const live = new Set(next.panes.map((p) => p.id));
@@ -19462,11 +19830,12 @@ async function enrich(next, snap, machine) {
19462
19830
  (_b2 = getMachine(machine)) == null ? void 0 : _b2.transcripts.observe(next.panes);
19463
19831
  const revs = new Map((snap.panes || []).map((p) => [joinId(machine, p.pane_id), p.revision]));
19464
19832
  const exited = await Promise.all(next.panes.map((p) => selfUpdates.observe(p, restarts.has(p.id)).catch(() => false)));
19465
- for (const [i, p] of next.panes.entries()) {
19833
+ await mapScreenPanes(next.panes, machine, async (p, i) => {
19834
+ var _a3;
19466
19835
  if (exited[i]) {
19467
19836
  p.interaction = "managed";
19468
19837
  if (queued.has(p.id)) p.queued = queued.get(p.id).map((q) => queuedPasted(publicEntry(q)));
19469
- continue;
19838
+ return;
19470
19839
  }
19471
19840
  if (leftForGood(p, findPane(p.id))) giveBackHeld(queued.get(p.id));
19472
19841
  if (pendingPrompts.has(p.id)) {
@@ -19476,7 +19845,7 @@ async function enrich(next, snap, machine) {
19476
19845
  if (queued.has(p.id)) {
19477
19846
  reconcileQueued(p);
19478
19847
  const before = findPane(p.id);
19479
- const run = p.agent === "omp" ? (_c = ompStatuses.get(p.id)) == null ? void 0 : _c.shell : null;
19848
+ const run = p.agent === "omp" ? (_a3 = ompStatuses.get(p.id)) == null ? void 0 : _a3.shell : null;
19480
19849
  if (run) {
19481
19850
  const left = queued.get(p.id).filter((q) => q.held || q.failed || !ompRunShown(p.agent, q.text, run));
19482
19851
  if (left.length) queued.set(p.id, left);
@@ -19500,13 +19869,14 @@ async function enrich(next, snap, machine) {
19500
19869
  p.agent = rs.agent;
19501
19870
  p.agentSession = rs.session || null;
19502
19871
  p.status = "unknown";
19503
- continue;
19872
+ return;
19504
19873
  }
19505
19874
  }
19506
- if (!p.agent) continue;
19875
+ if (!p.agent) return;
19507
19876
  if (p.status !== "working") {
19508
19877
  const young = !p.agentSession || p.bornAt && Date.now() - p.bornAt < 12e4;
19509
19878
  const c = await choicesFor(p, revs.get(p.id), p.status !== "blocked", Boolean(young));
19879
+ screenVersions.set(p, choicesCache.version(p.id));
19510
19880
  p.interaction = c.interaction;
19511
19881
  if (c.usageLimit) {
19512
19882
  p.usageLimit = c.usageLimit;
@@ -19548,9 +19918,14 @@ async function enrich(next, snap, machine) {
19548
19918
  const c = codexStatus.statusOf(p);
19549
19919
  if (c) p.codexStatus = c;
19550
19920
  } else codexStatus.forget(p.id);
19551
- }
19921
+ if (p.agent === "codex" && isViewed(p.id) && (p.status === "idle" || p.status === "done") && !p.prompt && !p.menu && !p.restart) {
19922
+ const f = codexFields.get(p.id);
19923
+ if (!f || Date.now() - f.at >= NOTICE_MS) refreshCodexField(p);
19924
+ if (f && f.text && f.seen > 1) p.codexField = f.text;
19925
+ } else codexFields.delete(p.id);
19926
+ }, (p) => isViewed(p.id), publish);
19552
19927
  const alive = (id) => machineOf(id) !== machine || next.panes.some((p) => p.id === id);
19553
- for (const id of choicesCache.keys()) if (!alive(id)) choicesCache.delete(id);
19928
+ for (const id of choicesCache.ids()) if (!alive(id)) choicesCache.forget(id);
19554
19929
  for (const id of askChecks.keys()) if (!alive(id)) askChecks.delete(id);
19555
19930
  for (const id of pendingPrompts.keys()) if (!alive(id)) pendingPrompts.delete(id);
19556
19931
  for (const id of queued.keys()) if (!alive(id)) queued.delete(id);
@@ -19576,6 +19951,7 @@ async function enrich(next, snap, machine) {
19576
19951
  forgetModel(id);
19577
19952
  }
19578
19953
  for (const id of activities.keys()) if (!alive(id)) activities.delete(id);
19954
+ for (const id of codexFields.keys()) if (!alive(id)) codexFields.delete(id);
19579
19955
  }
19580
19956
  const stateListeners = /* @__PURE__ */ new Set();
19581
19957
  function onStateChange(fn) {
@@ -19640,19 +20016,83 @@ function isReady() {
19640
20016
  return ready;
19641
20017
  }
19642
20018
  (_b = (_a = setTimeout(rebuild, READY_MAX_MS + 100)).unref) == null ? void 0 : _b.call(_a);
20019
+ const screenVersions = /* @__PURE__ */ new WeakMap();
20020
+ const viewedBusy = /* @__PURE__ */ new Set();
20021
+ function nativeViewed(p) {
20022
+ return Boolean(p.agent && !p.stopped && !p.leaving && p.status !== "working" && isViewed(p.id) && (p.prompt || p.screen || p.menu || p.interaction === "terminal" || p.status === "blocked" && !p.usageLimit));
20023
+ }
20024
+ function screenMachine(key) {
20025
+ const m = getMachine(key);
20026
+ return Boolean(m && (m.local || m.status === "online"));
20027
+ }
20028
+ function focusScreenGate() {
20029
+ screenRpcGate.priority = (machine, pane) => typeof pane === "string" && isViewed(joinId(machine, pane));
20030
+ screenRpcGate.reserved = (machine) => [...mstates].some(([key, s]) => (machine === void 0 || key === machine) && screenMachine(key) && s.ok && s.panes.some(nativeViewed));
20031
+ }
20032
+ function screenFields(p) {
20033
+ return { prompt: p.prompt, screen: p.screen, menu: p.menu, interaction: p.interaction, usageLimit: p.usageLimit };
20034
+ }
20035
+ function refreshNativeScreen(pane) {
20036
+ choicesCache.delete(pane);
20037
+ viewedBusy.delete(pane);
20038
+ pollViewed();
20039
+ }
20040
+ function pollViewed() {
20041
+ for (const [machine, s] of mstates) for (const p of s.panes) {
20042
+ const cached = choicesCache.previous(p.id);
20043
+ if (!screenMachine(machine) || !s.ok || !nativeViewed(p) || viewedBusy.has(p.id) || !cached || choicesCache.has(p.id) && keepReading(cached, cached.rev, cached.strict, false, Date.now(), true)) continue;
20044
+ viewedBusy.add(p.id);
20045
+ const reading = choicesFor(p, cached.rev, cached.strict);
20046
+ const generation = choicesCache.version(p.id);
20047
+ void reading.then((c) => {
20048
+ const current = mstates.get(machine);
20049
+ const latest = current == null ? void 0 : current.panes.find((x) => x.id === p.id);
20050
+ if (stopped || !screenMachine(machine) || !(current == null ? void 0 : current.ok) || !latest || !nativeViewed(latest) || latest.agent !== p.agent || latest.agentSession !== p.agentSession || choicesCache.version(p.id) !== generation) return;
20051
+ choicesCache.invalidate(p.id);
20052
+ const fresh = {
20053
+ ...latest,
20054
+ prompt: c.choices || void 0,
20055
+ screen: c.screen || void 0,
20056
+ menu: c.menu || void 0,
20057
+ interaction: c.interaction,
20058
+ usageLimit: c.usageLimit
20059
+ };
20060
+ if (c.usageLimit) fresh.status = "idle";
20061
+ mstates.set(machine, { ...current, panes: current.panes.map((x) => x.id === p.id ? fresh : x) });
20062
+ rebuild();
20063
+ }).catch(() => {
20064
+ }).finally(() => {
20065
+ var _a2, _b2;
20066
+ (_b2 = (_a2 = setTimeout(() => viewedBusy.delete(p.id), CHOICE_MS)).unref) == null ? void 0 : _b2.call(_a2);
20067
+ });
20068
+ }
20069
+ }
19643
20070
  async function pollMachine(m) {
20071
+ var _a2;
19644
20072
  const prev = mstates.get(m.key);
19645
20073
  let next;
19646
20074
  try {
19647
20075
  const r = await herdrOn(m.key, "session.snapshot", {}, 5e3);
19648
20076
  const snap = r.snapshot || r;
19649
20077
  next = reduceSnapshot(snap, m.key, HERDR_SESSION || "default");
19650
- await enrich(next, snap, m.key);
20078
+ await enrich(next, snap, m.key, (pane) => {
20079
+ var _a3;
20080
+ if (!getMachine(m.key)) return;
20081
+ const published = new Map((_a3 = mstates.get(m.key)) == null ? void 0 : _a3.panes.map((p) => [p.id, p]));
20082
+ mstates.set(m.key, { ...next, panes: next.panes.map((p) => p.id === pane.id ? { ...pane } : published.get(p.id) || { ...p }) });
20083
+ rebuild();
20084
+ });
20085
+ const current = new Map((_a2 = mstates.get(m.key)) == null ? void 0 : _a2.panes.map((p) => [p.id, p]));
20086
+ for (const p of next.panes) {
20087
+ const latest = current.get(p.id);
20088
+ if (latest && screenVersions.has(p) && screenVersions.get(p) !== choicesCache.version(p.id) && latest.agent === p.agent && latest.agentSession === p.agentSession && p.status !== "working") Object.assign(p, screenFields(latest), latest.usageLimit ? { status: "idle" } : {});
20089
+ }
19651
20090
  if (m instanceof RemoteMachine) m.reportPoll(true);
19652
20091
  } catch (e) {
19653
20092
  const error = e.message;
19654
20093
  if (m instanceof RemoteMachine) m.reportPoll(false, error);
19655
- next = m.local || !prev ? { ok: false, error, workspaces: [], panes: [] } : { ...prev, ok: false, error };
20094
+ const latest = mstates.get(m.key);
20095
+ next = m.local || !latest ? { ok: false, error, workspaces: [], panes: [] } : { ...latest, ok: false, error };
19656
20096
  }
19657
20097
  if (!getMachine(m.key)) return;
19658
20098
  mstates.set(m.key, next);
@@ -19686,8 +20126,17 @@ async function poll() {
19686
20126
  }
19687
20127
  let pollTimer = null;
19688
20128
  let stopped = false;
20129
+ let viewedTimer = null;
19689
20130
  function startPolling() {
19690
20131
  stopped = false;
20132
+ focusScreenGate();
20133
+ if (viewedTimer) clearTimeout(viewedTimer);
20134
+ const views = () => {
20135
+ if (stopped) return;
20136
+ pollViewed();
20137
+ viewedTimer = setTimeout(views, 250);
20138
+ };
20139
+ views();
19691
20140
  const loop = () => {
19692
20141
  const ms = allMachines();
19693
20142
  for (const m of ms) if (m.key !== LOCAL && m.status === "online" && !inflight.has(m.key)) pollOne(m);
@@ -19701,6 +20150,7 @@ const localMachineOf = (ms) => ms.find((m) => m.local);
19701
20150
  function stopPolling() {
19702
20151
  stopped = true;
19703
20152
  if (pollTimer) clearTimeout(pollTimer);
20153
+ if (viewedTimer) clearTimeout(viewedTimer);
19704
20154
  selfUpdates.flush();
19705
20155
  }
19706
20156
  const notifyTimers = /* @__PURE__ */ new Map();
@@ -20566,6 +21016,7 @@ function crossSiteRequest(headers) {
20566
21016
  const MAX_SESSION_DAYS = [1, 7, 30, 90, 365];
20567
21017
  const DEFAULT_MAX_SESSION_DAYS = 7;
20568
21018
  const DAY_MS = 24 * 3600 * 1e3;
21019
+ const OVERRUN_MS = 12 * 3600 * 1e3;
20569
21020
  function isMaxSessionDays(v) {
20570
21021
  return MAX_SESSION_DAYS.includes(v);
20571
21022
  }
@@ -20573,8 +21024,8 @@ function isMaxSessionDays(v) {
20573
21024
  var __defProp = Object.defineProperty;
20574
21025
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
20575
21026
  var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
20576
- const SESSION_MS = 12 * 3600 * 1e3;
20577
- const RENEW_MS = 10 * 60 * 1e3;
21027
+ const COOKIE_MS = Math.max(...MAX_SESSION_DAYS) * DAY_MS + OVERRUN_MS;
21028
+ const LEGACY_SLIDE_MS = 12 * 3600 * 1e3;
20578
21029
  const CHALLENGE_MS = 5 * 60 * 1e3;
20579
21030
  const AUTH_COOKIE = "hw_session";
20580
21031
  const CHALLENGE_COOKIE = "hw_challenge";
@@ -20632,6 +21083,10 @@ function createAuth({ dataDir, log: log2 = () => {
20632
21083
  var _a;
20633
21084
  return ((_a = db.maxSessionDays) != null ? _a : DEFAULT_MAX_SESSION_DAYS) * DAY_MS;
20634
21085
  };
21086
+ const cutAt = (since) => {
21087
+ var _a;
21088
+ return Math.max(since + maxSessionMs(), (_a = db.maxSessionChangedAt) != null ? _a : 0) + OVERRUN_MS;
21089
+ };
20635
21090
  function session(req, now = Date.now()) {
20636
21091
  const v = readCookie(req);
20637
21092
  if (!v) return null;
@@ -20640,9 +21095,9 @@ function createAuth({ dataDir, log: log2 = () => {
20640
21095
  const mac = parts.pop();
20641
21096
  if (!mac || parts[1] !== String(db.generation) || !safeEq(mac, sign(parts.join(".")))) return null;
20642
21097
  const exp = Number(parts[0]);
20643
- const since = parts.length === 3 ? Number(parts[2]) : exp - SESSION_MS;
21098
+ const since = parts.length === 3 ? Number(parts[2]) : exp - LEGACY_SLIDE_MS;
20644
21099
  if (!(exp >= now) || !Number.isFinite(since)) return null;
20645
- if (now > since + maxSessionMs() + SESSION_MS) return null;
21100
+ if (now > cutAt(since)) return null;
20646
21101
  return { exp, since };
20647
21102
  }
20648
21103
  function isUnlocked(req) {
@@ -20650,16 +21105,16 @@ function createAuth({ dataDir, log: log2 = () => {
20650
21105
  }
20651
21106
  const secure = (req) => req.headers["x-forwarded-proto"] === "https" || String(req.headers.origin || "").startsWith("https://") ? "; Secure" : "";
20652
21107
  function sessionCookie(req, now = Date.now(), since = now) {
20653
- const exp = now + SESSION_MS;
21108
+ const exp = since + COOKIE_MS;
20654
21109
  const payload = `${exp}.${db.generation}.${since}`;
20655
- return `${AUTH_COOKIE}=${payload}.${sign(payload)}; Path=/; HttpOnly; SameSite=Strict; Max-Age=${SESSION_MS / 1e3}${secure(req)}`;
21110
+ return `${AUTH_COOKIE}=${payload}.${sign(payload)}; Path=/; HttpOnly; SameSite=Strict; Max-Age=${Math.max(0, Math.floor((exp - now) / 1e3))}${secure(req)}`;
20656
21111
  }
20657
21112
  const clearCookie = (req) => `${AUTH_COOKIE}=; Path=/; HttpOnly; SameSite=Strict; Max-Age=0${secure(req)}`;
20658
21113
  function renew(req, now = Date.now()) {
20659
21114
  if (!enabled()) return null;
20660
21115
  const s = session(req, now);
20661
- if (s === null || s.exp - now > SESSION_MS - RENEW_MS) return null;
20662
- return { cookie: sessionCookie(req, now, s.since), expiresAt: now + SESSION_MS };
21116
+ if (s === null || s.exp >= s.since + COOKIE_MS) return null;
21117
+ return { cookie: sessionCookie(req, now, s.since) };
20663
21118
  }
20664
21119
  function relying(req) {
20665
21120
  const origin = String(req.headers.origin || "");
@@ -20764,15 +21219,17 @@ function createAuth({ dataDir, log: log2 = () => {
20764
21219
  log2("lock: all devices locked");
20765
21220
  return { ok: true, __cookie: clearCookie(req) };
20766
21221
  }
20767
- function setMaxSession(req, days) {
21222
+ function setMaxSession(req, days, now = Date.now()) {
21223
+ var _a;
20768
21224
  if (!enabled() || !isUnlocked(req)) throw new AuthError("locked", "Unlock first");
20769
21225
  if (!isMaxSessionDays(days)) throw new AuthError("invalid", "Invalid duration");
21226
+ if (days !== ((_a = db.maxSessionDays) != null ? _a : DEFAULT_MAX_SESSION_DAYS)) db.maxSessionChangedAt = now;
20770
21227
  db.maxSessionDays = days;
20771
21228
  save();
20772
21229
  return { ok: true, maxSessionDays: days };
20773
21230
  }
20774
21231
  function status(req, { resume = false, now = Date.now() } = {}) {
20775
- var _a, _b;
21232
+ var _a;
20776
21233
  const devices = db.credentials.map((c) => ({ name: c.name, createdAt: c.createdAt, lastUsed: c.lastUsed || null }));
20777
21234
  if (!enabled()) return { enabled: false, unlocked: true, devices };
20778
21235
  const s = session(req, now);
@@ -20784,10 +21241,10 @@ function createAuth({ dataDir, log: log2 = () => {
20784
21241
  return {
20785
21242
  enabled: true,
20786
21243
  unlocked: true,
20787
- expiresAt: (_a = renewed == null ? void 0 : renewed.expiresAt) != null ? _a : s.exp,
21244
+ expiresAt: cutAt(s.since),
20788
21245
  deadline,
20789
21246
  now,
20790
- maxSessionDays: (_b = db.maxSessionDays) != null ? _b : DEFAULT_MAX_SESSION_DAYS,
21247
+ maxSessionDays: (_a = db.maxSessionDays) != null ? _a : DEFAULT_MAX_SESSION_DAYS,
20791
21248
  devices,
20792
21249
  ...renewed ? { __cookie: renewed.cookie } : {}
20793
21250
  };
@@ -21172,408 +21629,422 @@ const assets = {
21172
21629
  "/manifest-en.webmanifest": {
21173
21630
  "type": "application/manifest+json",
21174
21631
  "etag": "\"260-q1JnCK0/ecdKwgeTve6N4I6/mWI\"",
21175
- "mtime": "2026-10-12T02:43:06.055Z",
21632
+ "mtime": "2026-10-17T18:43:41.588Z",
21176
21633
  "size": 608,
21177
21634
  "path": "../public/manifest-en.webmanifest"
21178
21635
  },
21179
21636
  "/manifest.webmanifest": {
21180
21637
  "type": "application/manifest+json",
21181
21638
  "etag": "\"26e-ykoYuj4V8la457yChW3oQTur8RU\"",
21182
- "mtime": "2026-10-12T02:43:06.055Z",
21639
+ "mtime": "2026-10-17T18:43:41.588Z",
21183
21640
  "size": 622,
21184
21641
  "path": "../public/manifest.webmanifest"
21185
21642
  },
21186
21643
  "/sw.js": {
21187
21644
  "type": "text/javascript; charset=utf-8",
21188
- "etag": "\"1b75-QHSGlFHPf7wCrgMEz9tF99j/HQQ\"",
21189
- "mtime": "2026-10-12T02:43:06.452Z",
21645
+ "etag": "\"1b75-Ur5BTmn18dE1NVPKM1rpbCIqr9I\"",
21646
+ "mtime": "2026-10-17T18:43:41.990Z",
21190
21647
  "size": 7029,
21191
21648
  "path": "../public/sw.js"
21192
21649
  },
21193
21650
  "/_nuxt/AgentView.DzFWBd2A.css": {
21194
21651
  "type": "text/css; charset=utf-8",
21195
21652
  "etag": "\"16c2-oz6EmjJDgIf6r38fC9pJHsZoJww\"",
21196
- "mtime": "2026-10-12T02:43:06.045Z",
21653
+ "mtime": "2026-10-17T18:43:41.582Z",
21197
21654
  "size": 5826,
21198
21655
  "path": "../public/_nuxt/AgentView.DzFWBd2A.css"
21199
21656
  },
21200
- "/_nuxt/B4Yk2tB1.js": {
21201
- "type": "text/javascript; charset=utf-8",
21202
- "etag": "\"1176f-Op3w8R2G8EFcEwxudNsoKLq8Fl8\"",
21203
- "mtime": "2026-10-12T02:43:06.045Z",
21204
- "size": 71535,
21205
- "path": "../public/_nuxt/B4Yk2tB1.js"
21206
- },
21207
- "/_nuxt/BBw_0a4M.js": {
21657
+ "/_nuxt/BEJHMUrj.js": {
21208
21658
  "type": "text/javascript; charset=utf-8",
21209
- "etag": "\"17b75-3R2VJP1Oq7OKRMe/1iHRMGe6l3o\"",
21210
- "mtime": "2026-10-12T02:43:06.045Z",
21211
- "size": 97141,
21212
- "path": "../public/_nuxt/BBw_0a4M.js"
21659
+ "etag": "\"238-y+VfpUOV4FM6ecp7mfl4o0RJzdU\"",
21660
+ "mtime": "2026-10-17T18:43:41.582Z",
21661
+ "size": 568,
21662
+ "path": "../public/_nuxt/BEJHMUrj.js"
21213
21663
  },
21214
- "/_nuxt/BSy6OCIY.js": {
21664
+ "/_nuxt/BOtcEDnA.js": {
21215
21665
  "type": "text/javascript; charset=utf-8",
21216
- "etag": "\"13f-1QDhbXhMYI+YPIbMXZLiVqG81SU\"",
21217
- "mtime": "2026-10-12T02:43:06.045Z",
21218
- "size": 319,
21219
- "path": "../public/_nuxt/BSy6OCIY.js"
21666
+ "etag": "\"1422a-8atYpyuVmn2+Q0/CCOp/ro0wWUY\"",
21667
+ "mtime": "2026-10-17T18:43:41.582Z",
21668
+ "size": 82474,
21669
+ "path": "../public/_nuxt/BOtcEDnA.js"
21220
21670
  },
21221
- "/_nuxt/BX5PM2JQ.js": {
21671
+ "/_nuxt/BUaYhQ2r.js": {
21222
21672
  "type": "text/javascript; charset=utf-8",
21223
- "etag": "\"2905-uwamdHajAQRD2qCUB0gaMXs5+Hs\"",
21224
- "mtime": "2026-10-12T02:43:06.045Z",
21225
- "size": 10501,
21226
- "path": "../public/_nuxt/BX5PM2JQ.js"
21673
+ "etag": "\"17edf-GsMnATHB0A2Zdo/vxDga5VMHeKY\"",
21674
+ "mtime": "2026-10-17T18:43:41.582Z",
21675
+ "size": 98015,
21676
+ "path": "../public/_nuxt/BUaYhQ2r.js"
21227
21677
  },
21228
21678
  "/_nuxt/Bd17z0YL.js": {
21229
21679
  "type": "text/javascript; charset=utf-8",
21230
21680
  "etag": "\"1615-CPDn06/EO3pj6KudXz5uMZ0FkhI\"",
21231
- "mtime": "2026-10-12T02:43:06.045Z",
21681
+ "mtime": "2026-10-17T18:43:41.582Z",
21232
21682
  "size": 5653,
21233
21683
  "path": "../public/_nuxt/Bd17z0YL.js"
21234
21684
  },
21235
- "/_nuxt/BgPDnf2S.js": {
21685
+ "/_nuxt/Bpoxvzh6.js": {
21236
21686
  "type": "text/javascript; charset=utf-8",
21237
- "etag": "\"14010-9tQrbfc74ogfocj+ZMU5WrK9qEM\"",
21238
- "mtime": "2026-10-12T02:43:06.045Z",
21239
- "size": 81936,
21240
- "path": "../public/_nuxt/BgPDnf2S.js"
21687
+ "etag": "\"1c49-bXAEhdP8o69g6PbBI2Q4c1IQs2I\"",
21688
+ "mtime": "2026-10-17T18:43:41.582Z",
21689
+ "size": 7241,
21690
+ "path": "../public/_nuxt/Bpoxvzh6.js"
21241
21691
  },
21242
- "/_nuxt/BkOxQzbS.js": {
21692
+ "/_nuxt/C25ROUa9.js": {
21243
21693
  "type": "text/javascript; charset=utf-8",
21244
- "etag": "\"91a1-Cc5iImaS93KRPJgLU4sZS6Cewjk\"",
21245
- "mtime": "2026-10-12T02:43:06.045Z",
21246
- "size": 37281,
21247
- "path": "../public/_nuxt/BkOxQzbS.js"
21694
+ "etag": "\"176b5-t7ykke36hXndVVgSfWGMLAcfqiU\"",
21695
+ "mtime": "2026-10-17T18:43:41.582Z",
21696
+ "size": 95925,
21697
+ "path": "../public/_nuxt/C25ROUa9.js"
21248
21698
  },
21249
- "/_nuxt/CP8o925U.js": {
21699
+ "/_nuxt/CJKsMzIp.js": {
21250
21700
  "type": "text/javascript; charset=utf-8",
21251
- "etag": "\"238-L5f/T9nwmMze/S7MlkAtOw2Agko\"",
21252
- "mtime": "2026-10-12T02:43:06.045Z",
21253
- "size": 568,
21254
- "path": "../public/_nuxt/CP8o925U.js"
21701
+ "etag": "\"10a-RP2xlxe7tKtrIpq0vhVbLQ+p3Ms\"",
21702
+ "mtime": "2026-10-17T18:43:41.582Z",
21703
+ "size": 266,
21704
+ "path": "../public/_nuxt/CJKsMzIp.js"
21255
21705
  },
21256
- "/_nuxt/CWwyK2XK.js": {
21706
+ "/_nuxt/CDWjMk9C.js": {
21257
21707
  "type": "text/javascript; charset=utf-8",
21258
- "etag": "\"7e5e-4BG2J9cvS3sx6WQ360LFqNaThyA\"",
21259
- "mtime": "2026-10-12T02:43:06.045Z",
21260
- "size": 32350,
21261
- "path": "../public/_nuxt/CWwyK2XK.js"
21708
+ "etag": "\"7e5c-4oH4bzjszPo3bZwQbTcPqcxL7Q8\"",
21709
+ "mtime": "2026-10-17T18:43:41.582Z",
21710
+ "size": 32348,
21711
+ "path": "../public/_nuxt/CDWjMk9C.js"
21262
21712
  },
21263
- "/_nuxt/CkbmecwS.js": {
21713
+ "/_nuxt/COCvtdHN.js": {
21264
21714
  "type": "text/javascript; charset=utf-8",
21265
- "etag": "\"f35-4fKoqAhIJbV/rJjyeg24lmHsFBg\"",
21266
- "mtime": "2026-10-12T02:43:06.046Z",
21267
- "size": 3893,
21268
- "path": "../public/_nuxt/CkbmecwS.js"
21715
+ "etag": "\"1bbdd-7o2VS8llXeUhLkFYDucYoVrbDvA\"",
21716
+ "mtime": "2026-10-17T18:43:41.582Z",
21717
+ "size": 113629,
21718
+ "path": "../public/_nuxt/COCvtdHN.js"
21269
21719
  },
21270
- "/_nuxt/Ci8N4mWR.js": {
21720
+ "/_nuxt/CJNhn9sA.js": {
21271
21721
  "type": "text/javascript; charset=utf-8",
21272
- "etag": "\"2426-fCrTYUyhtdHnTmu6ZJeEttvxVMo\"",
21273
- "mtime": "2026-10-12T02:43:06.045Z",
21274
- "size": 9254,
21275
- "path": "../public/_nuxt/Ci8N4mWR.js"
21722
+ "etag": "\"5bb9e-3d7Nv/IqQ7+jDnfQdGsgkcNQUug\"",
21723
+ "mtime": "2026-10-17T18:43:41.582Z",
21724
+ "size": 375710,
21725
+ "path": "../public/_nuxt/CJNhn9sA.js"
21276
21726
  },
21277
- "/_nuxt/Cr3SrGky.js": {
21727
+ "/_nuxt/CXJnLmWv.js": {
21278
21728
  "type": "text/javascript; charset=utf-8",
21279
- "etag": "\"e91-L57+rnkmURnrnbQ2ojMRXvZSac4\"",
21280
- "mtime": "2026-10-12T02:43:06.046Z",
21281
- "size": 3729,
21282
- "path": "../public/_nuxt/Cr3SrGky.js"
21729
+ "etag": "\"2426-wVRk+id72MiZ5Jk+fsnfLyJbNcM\"",
21730
+ "mtime": "2026-10-17T18:43:41.582Z",
21731
+ "size": 9254,
21732
+ "path": "../public/_nuxt/CXJnLmWv.js"
21283
21733
  },
21284
- "/_nuxt/DT8qZ0Wv.js": {
21734
+ "/_nuxt/Cl45J6_Q.js": {
21285
21735
  "type": "text/javascript; charset=utf-8",
21286
- "etag": "\"d34-pCkp/XrEPhSiS8s2YPYsI/DZ69I\"",
21287
- "mtime": "2026-10-12T02:43:06.046Z",
21736
+ "etag": "\"d34-0CEgeEL4LpfF/Ngxkc3X1qxVE0Q\"",
21737
+ "mtime": "2026-10-17T18:43:41.583Z",
21288
21738
  "size": 3380,
21289
- "path": "../public/_nuxt/DT8qZ0Wv.js"
21739
+ "path": "../public/_nuxt/Cl45J6_Q.js"
21290
21740
  },
21291
- "/_nuxt/DAg9fiVh.js": {
21741
+ "/_nuxt/CndPDbMI.js": {
21292
21742
  "type": "text/javascript; charset=utf-8",
21293
- "etag": "\"1b244-sPLH9gYhaVJ89ISuFCDsYuNF9Vs\"",
21294
- "mtime": "2026-10-12T02:43:06.046Z",
21295
- "size": 111172,
21296
- "path": "../public/_nuxt/DAg9fiVh.js"
21743
+ "etag": "\"91a2-smpfKh6goGkDUo+YVNYbS5+u/8I\"",
21744
+ "mtime": "2026-10-17T18:43:41.583Z",
21745
+ "size": 37282,
21746
+ "path": "../public/_nuxt/CndPDbMI.js"
21297
21747
  },
21298
- "/_nuxt/DaaJIRB3.js": {
21748
+ "/_nuxt/Ctbx58Um.js": {
21299
21749
  "type": "text/javascript; charset=utf-8",
21300
- "etag": "\"dd3-CbFoaT3rUHg6B+v1747rxTekQNQ\"",
21301
- "mtime": "2026-10-12T02:43:06.046Z",
21302
- "size": 3539,
21303
- "path": "../public/_nuxt/DaaJIRB3.js"
21750
+ "etag": "\"12607-L6r1fjUsRQANn1N6WahQDaJtUHg\"",
21751
+ "mtime": "2026-10-17T18:43:41.583Z",
21752
+ "size": 75271,
21753
+ "path": "../public/_nuxt/Ctbx58Um.js"
21304
21754
  },
21305
- "/_nuxt/DcJi16XA.js": {
21755
+ "/_nuxt/Dl1PHLOB.js": {
21306
21756
  "type": "text/javascript; charset=utf-8",
21307
- "etag": "\"10a-fvmuAmno7y+Lve3V9/nvXuQHotk\"",
21308
- "mtime": "2026-10-12T02:43:06.046Z",
21309
- "size": 266,
21310
- "path": "../public/_nuxt/DcJi16XA.js"
21757
+ "etag": "\"3779-fKEF4Ee4ZpPd5wR0QFWCwmhNG5Q\"",
21758
+ "mtime": "2026-10-17T18:43:41.583Z",
21759
+ "size": 14201,
21760
+ "path": "../public/_nuxt/Dl1PHLOB.js"
21311
21761
  },
21312
- "/_nuxt/SiL1FJ5s.js": {
21762
+ "/_nuxt/Nhex3_iH.js": {
21313
21763
  "type": "text/javascript; charset=utf-8",
21314
- "etag": "\"176ad-/hlyeMkW67OV1A4G2nhIsYJX+vE\"",
21315
- "mtime": "2026-10-12T02:43:06.046Z",
21316
- "size": 95917,
21317
- "path": "../public/_nuxt/SiL1FJ5s.js"
21318
- },
21319
- "/_nuxt/VpjCgSXu.js": {
21320
- "type": "text/javascript; charset=utf-8",
21321
- "etag": "\"5b489-LoKHy0L+KBvwlf0JAvODFbMFL2o\"",
21322
- "mtime": "2026-10-12T02:43:06.046Z",
21323
- "size": 373897,
21324
- "path": "../public/_nuxt/VpjCgSXu.js"
21325
- },
21326
- "/_nuxt/archivo-latin-ext-wght-normal.C4zznr8T.woff2": {
21327
- "type": "font/woff2",
21328
- "etag": "\"7f60-cwHN4xD2RhU0GVBfKzpzYZ7Al6U\"",
21329
- "mtime": "2026-10-12T02:43:06.046Z",
21330
- "size": 32608,
21331
- "path": "../public/_nuxt/archivo-latin-ext-wght-normal.C4zznr8T.woff2"
21764
+ "etag": "\"dd3-AX1srF/wSbPRrTQkPY3fqVPLQak\"",
21765
+ "mtime": "2026-10-17T18:43:41.583Z",
21766
+ "size": 3539,
21767
+ "path": "../public/_nuxt/Nhex3_iH.js"
21332
21768
  },
21333
21769
  "/_nuxt/archivo-latin-wght-normal.E0tuGl4L.woff2": {
21334
21770
  "type": "font/woff2",
21335
21771
  "etag": "\"8870-ZUSfFgU3jYpWYbszVY1rxpynehc\"",
21336
- "mtime": "2026-10-12T02:43:06.046Z",
21772
+ "mtime": "2026-10-17T18:43:41.583Z",
21337
21773
  "size": 34928,
21338
21774
  "path": "../public/_nuxt/archivo-latin-wght-normal.E0tuGl4L.woff2"
21339
21775
  },
21340
- "/_nuxt/CKhgznq4.js": {
21341
- "type": "text/javascript; charset=utf-8",
21342
- "etag": "\"a7330-Q9O7D5hd37aKtqvr2vkiACwyZzM\"",
21343
- "mtime": "2026-10-12T02:43:06.046Z",
21344
- "size": 684848,
21345
- "path": "../public/_nuxt/CKhgznq4.js"
21776
+ "/_nuxt/archivo-latin-ext-wght-normal.C4zznr8T.woff2": {
21777
+ "type": "font/woff2",
21778
+ "etag": "\"7f60-cwHN4xD2RhU0GVBfKzpzYZ7Al6U\"",
21779
+ "mtime": "2026-10-17T18:43:41.583Z",
21780
+ "size": 32608,
21781
+ "path": "../public/_nuxt/archivo-latin-ext-wght-normal.C4zznr8T.woff2"
21346
21782
  },
21347
21783
  "/_nuxt/archivo-vietnamese-wght-normal.XAtsl5Q_.woff2": {
21348
21784
  "type": "font/woff2",
21349
21785
  "etag": "\"33b8-4zjQHgOy7y9EDRZs7TDAFDM4Ams\"",
21350
- "mtime": "2026-10-12T02:43:06.046Z",
21786
+ "mtime": "2026-10-17T18:43:41.583Z",
21351
21787
  "size": 13240,
21352
21788
  "path": "../public/_nuxt/archivo-vietnamese-wght-normal.XAtsl5Q_.woff2"
21353
21789
  },
21354
- "/_nuxt/dPxB2L94.js": {
21790
+ "/_nuxt/OpWX45i7.js": {
21355
21791
  "type": "text/javascript; charset=utf-8",
21356
- "etag": "\"471ad-4Pu+hTmytPNTQQ7hdBgH0D/hZVE\"",
21357
- "mtime": "2026-10-12T02:43:06.046Z",
21358
- "size": 291245,
21359
- "path": "../public/_nuxt/dPxB2L94.js"
21792
+ "etag": "\"47320-mmZKztzMUS0hWTUixNYds+GuxDc\"",
21793
+ "mtime": "2026-10-17T18:43:41.583Z",
21794
+ "size": 291616,
21795
+ "path": "../public/_nuxt/OpWX45i7.js"
21360
21796
  },
21361
- "/_nuxt/error-500.Bwd7zAaE.css": {
21362
- "type": "text/css; charset=utf-8",
21363
- "etag": "\"772-nqXXACYtFiPK+D42BNu4uEECARA\"",
21364
- "mtime": "2026-10-12T02:43:06.046Z",
21365
- "size": 1906,
21366
- "path": "../public/_nuxt/error-500.Bwd7zAaE.css"
21797
+ "/_nuxt/DMLmW6JM.js": {
21798
+ "type": "text/javascript; charset=utf-8",
21799
+ "etag": "\"a9c14-yjSMqVlge3ipwm5JBRYSl/+v9CU\"",
21800
+ "mtime": "2026-10-17T18:43:41.583Z",
21801
+ "size": 695316,
21802
+ "path": "../public/_nuxt/DMLmW6JM.js"
21803
+ },
21804
+ "/_nuxt/dTj21DMs.js": {
21805
+ "type": "text/javascript; charset=utf-8",
21806
+ "etag": "\"f35-iOGrl+zkV+NSGmABY4upNQrrgWA\"",
21807
+ "mtime": "2026-10-17T18:43:41.583Z",
21808
+ "size": 3893,
21809
+ "path": "../public/_nuxt/dTj21DMs.js"
21367
21810
  },
21368
21811
  "/_nuxt/error-404.Bb87HomL.css": {
21369
21812
  "type": "text/css; charset=utf-8",
21370
21813
  "etag": "\"97d-4h9VfBznldxjqagfMldh1hDncR0\"",
21371
- "mtime": "2026-10-12T02:43:06.046Z",
21814
+ "mtime": "2026-10-17T18:43:41.583Z",
21372
21815
  "size": 2429,
21373
21816
  "path": "../public/_nuxt/error-404.Bb87HomL.css"
21374
21817
  },
21818
+ "/_nuxt/error-500.Bwd7zAaE.css": {
21819
+ "type": "text/css; charset=utf-8",
21820
+ "etag": "\"772-nqXXACYtFiPK+D42BNu4uEECARA\"",
21821
+ "mtime": "2026-10-17T18:43:41.583Z",
21822
+ "size": 1906,
21823
+ "path": "../public/_nuxt/error-500.Bwd7zAaE.css"
21824
+ },
21375
21825
  "/_nuxt/hePW80VL.js": {
21376
21826
  "type": "text/javascript; charset=utf-8",
21377
21827
  "etag": "\"2cc-fA8td6k29UVF6JoPfhOPkceTK1M\"",
21378
- "mtime": "2026-10-12T02:43:06.047Z",
21828
+ "mtime": "2026-10-17T18:43:41.583Z",
21379
21829
  "size": 716,
21380
21830
  "path": "../public/_nuxt/hePW80VL.js"
21381
21831
  },
21382
21832
  "/_nuxt/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2": {
21383
21833
  "type": "font/woff2",
21384
21834
  "etag": "\"6568-cF1iUGbboMFZ8TfnP5HiMgl9II0\"",
21385
- "mtime": "2026-10-12T02:43:06.047Z",
21835
+ "mtime": "2026-10-17T18:43:41.583Z",
21386
21836
  "size": 25960,
21387
21837
  "path": "../public/_nuxt/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2"
21388
21838
  },
21389
21839
  "/_nuxt/inter-cyrillic-wght-normal.DqGufNeO.woff2": {
21390
21840
  "type": "font/woff2",
21391
21841
  "etag": "\"493c-n3Oy9D6jvzfMjpClqox+Zo7ERQQ\"",
21392
- "mtime": "2026-10-12T02:43:06.047Z",
21842
+ "mtime": "2026-10-17T18:43:41.583Z",
21393
21843
  "size": 18748,
21394
21844
  "path": "../public/_nuxt/inter-cyrillic-wght-normal.DqGufNeO.woff2"
21395
21845
  },
21396
21846
  "/_nuxt/inter-greek-ext-wght-normal.DlzME5K_.woff2": {
21397
21847
  "type": "font/woff2",
21398
21848
  "etag": "\"2be0-BP5iTzJeB8nLqYAgKpWNi5o1Zm8\"",
21399
- "mtime": "2026-10-12T02:43:06.047Z",
21849
+ "mtime": "2026-10-17T18:43:41.583Z",
21400
21850
  "size": 11232,
21401
21851
  "path": "../public/_nuxt/inter-greek-ext-wght-normal.DlzME5K_.woff2"
21402
21852
  },
21403
21853
  "/_nuxt/inter-greek-wght-normal.CkhJZR-_.woff2": {
21404
21854
  "type": "font/woff2",
21405
21855
  "etag": "\"4a34-xor/hj4YNqI52zFecXnUbzQ4Xs4\"",
21406
- "mtime": "2026-10-12T02:43:06.047Z",
21856
+ "mtime": "2026-10-17T18:43:41.583Z",
21407
21857
  "size": 18996,
21408
21858
  "path": "../public/_nuxt/inter-greek-wght-normal.CkhJZR-_.woff2"
21409
21859
  },
21410
- "/_nuxt/inter-latin-ext-wght-normal.DO1Apj_S.woff2": {
21860
+ "/_nuxt/entry.BohTWE-n.css": {
21861
+ "type": "text/css; charset=utf-8",
21862
+ "etag": "\"69733-tHHaoNsUa1LrnLzsbMZLwgjFJCc\"",
21863
+ "mtime": "2026-10-17T18:43:41.583Z",
21864
+ "size": 431923,
21865
+ "path": "../public/_nuxt/entry.BohTWE-n.css"
21866
+ },
21867
+ "/_nuxt/inter-latin-wght-normal.Dx4kXJAl.woff2": {
21411
21868
  "type": "font/woff2",
21412
- "etag": "\"14c4c-zz61D7IQFMB9QxHvTAOk/Vh4ibQ\"",
21413
- "mtime": "2026-10-12T02:43:06.047Z",
21414
- "size": 85068,
21415
- "path": "../public/_nuxt/inter-latin-ext-wght-normal.DO1Apj_S.woff2"
21869
+ "etag": "\"bc80-8R1ym7Ck2DUNLqPQ/AYs9u8tUpg\"",
21870
+ "mtime": "2026-10-17T18:43:41.584Z",
21871
+ "size": 48256,
21872
+ "path": "../public/_nuxt/inter-latin-wght-normal.Dx4kXJAl.woff2"
21416
21873
  },
21417
21874
  "/_nuxt/inter-vietnamese-wght-normal.CBcvBZtf.woff2": {
21418
21875
  "type": "font/woff2",
21419
21876
  "etag": "\"280c-nBythjoDQ0+5wVAendJ6wU7Xz2M\"",
21420
- "mtime": "2026-10-12T02:43:06.047Z",
21877
+ "mtime": "2026-10-17T18:43:41.584Z",
21421
21878
  "size": 10252,
21422
21879
  "path": "../public/_nuxt/inter-vietnamese-wght-normal.CBcvBZtf.woff2"
21423
21880
  },
21424
- "/_nuxt/inter-latin-wght-normal.Dx4kXJAl.woff2": {
21881
+ "/_nuxt/inter-latin-ext-wght-normal.DO1Apj_S.woff2": {
21425
21882
  "type": "font/woff2",
21426
- "etag": "\"bc80-8R1ym7Ck2DUNLqPQ/AYs9u8tUpg\"",
21427
- "mtime": "2026-10-12T02:43:06.047Z",
21428
- "size": 48256,
21429
- "path": "../public/_nuxt/inter-latin-wght-normal.Dx4kXJAl.woff2"
21883
+ "etag": "\"14c4c-zz61D7IQFMB9QxHvTAOk/Vh4ibQ\"",
21884
+ "mtime": "2026-10-17T18:43:41.584Z",
21885
+ "size": 85068,
21886
+ "path": "../public/_nuxt/inter-latin-ext-wght-normal.DO1Apj_S.woff2"
21430
21887
  },
21431
21888
  "/_nuxt/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2": {
21432
21889
  "type": "font/woff2",
21433
21890
  "etag": "\"2f4c-WiAGfn140d4QND3ayQWaCHF8rbE\"",
21434
- "mtime": "2026-10-12T02:43:06.047Z",
21891
+ "mtime": "2026-10-17T18:43:41.584Z",
21435
21892
  "size": 12108,
21436
21893
  "path": "../public/_nuxt/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2"
21437
21894
  },
21438
- "/_nuxt/entry.CGWKmYU3.css": {
21439
- "type": "text/css; charset=utf-8",
21440
- "etag": "\"68db2-q6wQXFOalVzn1yh9EoP09Ru8lNs\"",
21441
- "mtime": "2026-10-12T02:43:06.046Z",
21442
- "size": 429490,
21443
- "path": "../public/_nuxt/entry.CGWKmYU3.css"
21444
- },
21445
21895
  "/_nuxt/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2": {
21446
21896
  "type": "font/woff2",
21447
21897
  "etag": "\"232c-Dnz9DhH4c266e6TziU1pxRkV6FY\"",
21448
- "mtime": "2026-10-12T02:43:06.047Z",
21898
+ "mtime": "2026-10-17T18:43:41.584Z",
21449
21899
  "size": 9004,
21450
21900
  "path": "../public/_nuxt/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2"
21451
21901
  },
21452
- "/_nuxt/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2": {
21453
- "type": "font/woff2",
21454
- "etag": "\"3b5c-HLF7Wvs2Z1IA1cPRs6jnor8OUQ4\"",
21455
- "mtime": "2026-10-12T02:43:06.047Z",
21456
- "size": 15196,
21457
- "path": "../public/_nuxt/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2"
21458
- },
21459
21902
  "/_nuxt/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2": {
21460
21903
  "type": "font/woff2",
21461
21904
  "etag": "\"9dd4-5yd+cUUhzrXxdMyYebUeD0qml1M\"",
21462
- "mtime": "2026-10-12T02:43:06.047Z",
21905
+ "mtime": "2026-10-17T18:43:41.584Z",
21463
21906
  "size": 40404,
21464
21907
  "path": "../public/_nuxt/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2"
21465
21908
  },
21466
21909
  "/_nuxt/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2": {
21467
21910
  "type": "font/woff2",
21468
21911
  "etag": "\"1d50-/Re0MyD6BV8h81wBPVijGZH5GBs\"",
21469
- "mtime": "2026-10-12T02:43:06.047Z",
21912
+ "mtime": "2026-10-17T18:43:41.584Z",
21470
21913
  "size": 7504,
21471
21914
  "path": "../public/_nuxt/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2"
21472
21915
  },
21916
+ "/_nuxt/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2": {
21917
+ "type": "font/woff2",
21918
+ "etag": "\"3b5c-HLF7Wvs2Z1IA1cPRs6jnor8OUQ4\"",
21919
+ "mtime": "2026-10-17T18:43:41.584Z",
21920
+ "size": 15196,
21921
+ "path": "../public/_nuxt/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2"
21922
+ },
21923
+ "/_nuxt/kwSoIiM7.js": {
21924
+ "type": "text/javascript; charset=utf-8",
21925
+ "etag": "\"e91-CnzsResp84INY2sxWs3arWnxgM8\"",
21926
+ "mtime": "2026-10-17T18:43:41.584Z",
21927
+ "size": 3729,
21928
+ "path": "../public/_nuxt/kwSoIiM7.js"
21929
+ },
21930
+ "/_nuxt/mkEwYka4.js": {
21931
+ "type": "text/javascript; charset=utf-8",
21932
+ "etag": "\"2e6a-zaC4Yf5z6GyCsrKnM1W6O4SIIIE\"",
21933
+ "mtime": "2026-10-17T18:43:41.584Z",
21934
+ "size": 11882,
21935
+ "path": "../public/_nuxt/mkEwYka4.js"
21936
+ },
21937
+ "/_nuxt/w7Rm7unj.js": {
21938
+ "type": "text/javascript; charset=utf-8",
21939
+ "etag": "\"13f-TquOUnLU+9UXN0EfzoVFvVrGpqg\"",
21940
+ "mtime": "2026-10-17T18:43:41.584Z",
21941
+ "size": 319,
21942
+ "path": "../public/_nuxt/w7Rm7unj.js"
21943
+ },
21473
21944
  "/_nuxt/wherdr-nerd-awesome.DQ3_iAfa.woff2": {
21474
21945
  "type": "font/woff2",
21475
21946
  "etag": "\"30178-02mpQKEDb74Ec8LtlhKceB1vHO8\"",
21476
- "mtime": "2026-10-12T02:43:06.047Z",
21947
+ "mtime": "2026-10-17T18:43:41.584Z",
21477
21948
  "size": 196984,
21478
21949
  "path": "../public/_nuxt/wherdr-nerd-awesome.DQ3_iAfa.woff2"
21479
21950
  },
21951
+ "/_nuxt/pdf.min.t82Z80JU.mjs": {
21952
+ "type": "text/javascript; charset=utf-8",
21953
+ "etag": "\"678c7-U+W9TWPlwH5JFSPFTsPGlAkMVJc\"",
21954
+ "mtime": "2026-10-17T18:43:41.584Z",
21955
+ "size": 424135,
21956
+ "path": "../public/_nuxt/pdf.min.t82Z80JU.mjs"
21957
+ },
21480
21958
  "/_nuxt/wherdr-nerd-codicons.CtEsfSAf.woff2": {
21481
21959
  "type": "font/woff2",
21482
21960
  "etag": "\"d9b0-kmO/x6KCTFRlVipOvl+5XcArGUw\"",
21483
- "mtime": "2026-10-12T02:43:06.047Z",
21961
+ "mtime": "2026-10-17T18:43:41.584Z",
21484
21962
  "size": 55728,
21485
21963
  "path": "../public/_nuxt/wherdr-nerd-codicons.CtEsfSAf.woff2"
21486
21964
  },
21487
- "/_nuxt/wherdr-nerd-extension.Dai_ky39.woff2": {
21488
- "type": "font/woff2",
21489
- "etag": "\"f76c-CjERGtjtOrkpSXy7JyZNl1CAu0U\"",
21490
- "mtime": "2026-10-12T02:43:06.047Z",
21491
- "size": 63340,
21492
- "path": "../public/_nuxt/wherdr-nerd-extension.Dai_ky39.woff2"
21493
- },
21494
21965
  "/_nuxt/wherdr-nerd-devicons.ZMSFX1sW.woff2": {
21495
21966
  "type": "font/woff2",
21496
21967
  "etag": "\"30f78-2RuGTMLnbTBdhlI9ExApyiUeD8c\"",
21497
- "mtime": "2026-10-12T02:43:06.047Z",
21968
+ "mtime": "2026-10-17T18:43:41.584Z",
21498
21969
  "size": 200568,
21499
21970
  "path": "../public/_nuxt/wherdr-nerd-devicons.ZMSFX1sW.woff2"
21500
21971
  },
21972
+ "/_nuxt/pdf.worker.min.wgc6bjNh.mjs": {
21973
+ "type": "text/javascript; charset=utf-8",
21974
+ "etag": "\"107554-apJIGjXrCPcbKwmHzZKIYl5kc4c\"",
21975
+ "mtime": "2026-10-17T18:43:41.584Z",
21976
+ "size": 1078612,
21977
+ "path": "../public/_nuxt/pdf.worker.min.wgc6bjNh.mjs"
21978
+ },
21979
+ "/_nuxt/wherdr-nerd-extension.Dai_ky39.woff2": {
21980
+ "type": "font/woff2",
21981
+ "etag": "\"f76c-CjERGtjtOrkpSXy7JyZNl1CAu0U\"",
21982
+ "mtime": "2026-10-17T18:43:41.584Z",
21983
+ "size": 63340,
21984
+ "path": "../public/_nuxt/wherdr-nerd-extension.Dai_ky39.woff2"
21985
+ },
21501
21986
  "/_nuxt/wherdr-nerd-material-1.BdvqkCqW.woff2": {
21502
21987
  "type": "font/woff2",
21503
21988
  "etag": "\"1e130-1GKpbVoJoRf3AxaKTZS8FjxkOd4\"",
21504
- "mtime": "2026-10-12T02:43:06.047Z",
21989
+ "mtime": "2026-10-17T18:43:41.584Z",
21505
21990
  "size": 123184,
21506
21991
  "path": "../public/_nuxt/wherdr-nerd-material-1.BdvqkCqW.woff2"
21507
21992
  },
21508
21993
  "/_nuxt/wherdr-nerd-material-2.C_flbBWO.woff2": {
21509
21994
  "type": "font/woff2",
21510
21995
  "etag": "\"1f95c-q6dAP964z2dgEvWzAYjTAzBtzBc\"",
21511
- "mtime": "2026-10-12T02:43:06.047Z",
21996
+ "mtime": "2026-10-17T18:43:41.585Z",
21512
21997
  "size": 129372,
21513
21998
  "path": "../public/_nuxt/wherdr-nerd-material-2.C_flbBWO.woff2"
21514
21999
  },
21515
22000
  "/_nuxt/wherdr-nerd-material-3.8xz7iX-Y.woff2": {
21516
22001
  "type": "font/woff2",
21517
22002
  "etag": "\"2248c-3GBJ1KjkT+xYPhza9V/DKaILa7Y\"",
21518
- "mtime": "2026-10-12T02:43:06.047Z",
22003
+ "mtime": "2026-10-17T18:43:41.585Z",
21519
22004
  "size": 140428,
21520
22005
  "path": "../public/_nuxt/wherdr-nerd-material-3.8xz7iX-Y.woff2"
21521
22006
  },
22007
+ "/_nuxt/wherdr-nerd-powerline.B_kAMxXr.woff2": {
22008
+ "type": "font/woff2",
22009
+ "etag": "\"1bc0-iXm39wQwNbm2VjpVBOn72grfku0\"",
22010
+ "mtime": "2026-10-17T18:43:41.585Z",
22011
+ "size": 7104,
22012
+ "path": "../public/_nuxt/wherdr-nerd-powerline.B_kAMxXr.woff2"
22013
+ },
21522
22014
  "/_nuxt/wherdr-nerd-material-4.CO_PudDR.woff2": {
21523
22015
  "type": "font/woff2",
21524
22016
  "etag": "\"1fa80-YcJvpFD/M3vTC4y6SMmp7s8a9gw\"",
21525
- "mtime": "2026-10-12T02:43:06.047Z",
22017
+ "mtime": "2026-10-17T18:43:41.585Z",
21526
22018
  "size": 129664,
21527
22019
  "path": "../public/_nuxt/wherdr-nerd-material-4.CO_PudDR.woff2"
21528
22020
  },
21529
22021
  "/_nuxt/wherdr-nerd-octicons.Hl4VEx8m.woff2": {
21530
22022
  "type": "font/woff2",
21531
22023
  "etag": "\"f890-FkAsW3iqENK+lU5UlSze0yqnE2s\"",
21532
- "mtime": "2026-10-12T02:43:06.047Z",
22024
+ "mtime": "2026-10-17T18:43:41.585Z",
21533
22025
  "size": 63632,
21534
22026
  "path": "../public/_nuxt/wherdr-nerd-octicons.Hl4VEx8m.woff2"
21535
22027
  },
21536
- "/_nuxt/wherdr-nerd-powerline.B_kAMxXr.woff2": {
21537
- "type": "font/woff2",
21538
- "etag": "\"1bc0-iXm39wQwNbm2VjpVBOn72grfku0\"",
21539
- "mtime": "2026-10-12T02:43:06.047Z",
21540
- "size": 7104,
21541
- "path": "../public/_nuxt/wherdr-nerd-powerline.B_kAMxXr.woff2"
21542
- },
21543
22028
  "/_nuxt/wherdr-symbols.C1LsPKmg.woff2": {
21544
22029
  "type": "font/woff2",
21545
22030
  "etag": "\"1304-Lwyr1XiDl3FK38nmS/6Pk9wfiWc\"",
21546
- "mtime": "2026-10-12T02:43:06.048Z",
22031
+ "mtime": "2026-10-17T18:43:41.585Z",
21547
22032
  "size": 4868,
21548
22033
  "path": "../public/_nuxt/wherdr-symbols.C1LsPKmg.woff2"
21549
22034
  },
21550
- "/_nuxt/yzABg5xl.js": {
21551
- "type": "text/javascript; charset=utf-8",
21552
- "etag": "\"1c49-W7I7waHyF8BfftITNIl1xCbNFQw\"",
21553
- "mtime": "2026-10-12T02:43:06.048Z",
21554
- "size": 7241,
21555
- "path": "../public/_nuxt/yzABg5xl.js"
21556
- },
21557
- "/_nuxt/xYX85SPI.js": {
21558
- "type": "text/javascript; charset=utf-8",
21559
- "etag": "\"374e-AaaIqO4sGKcceUeLatrSWJTAfAU\"",
21560
- "mtime": "2026-10-12T02:43:06.048Z",
21561
- "size": 14158,
21562
- "path": "../public/_nuxt/xYX85SPI.js"
21563
- },
21564
- "/_nuxt/builds/meta/c735b6c0-1bd0-47d7-a208-d310f0a06287.json": {
21565
- "type": "application/json",
21566
- "etag": "\"58-d/XzFsF7fGOYu7cBbS83s+45DOk\"",
21567
- "mtime": "2026-10-12T02:43:06.021Z",
21568
- "size": 88,
21569
- "path": "../public/_nuxt/builds/meta/c735b6c0-1bd0-47d7-a208-d310f0a06287.json"
21570
- },
21571
22035
  "/_nuxt/builds/latest.json": {
21572
22036
  "type": "application/json",
21573
- "etag": "\"47-tXRY9adXBmru9/K9a4qadfDPmmc\"",
21574
- "mtime": "2026-10-12T02:43:06.026Z",
22037
+ "etag": "\"47-Ij38vrZ4+IXs2yqcXQmMWk9jWY4\"",
22038
+ "mtime": "2026-10-17T18:43:41.560Z",
21575
22039
  "size": 71,
21576
22040
  "path": "../public/_nuxt/builds/latest.json"
22041
+ },
22042
+ "/_nuxt/builds/meta/4994f3a4-4126-4f57-a9e5-c7ebb25850bc.json": {
22043
+ "type": "application/json",
22044
+ "etag": "\"58-2ODqXvSPWOTvTj4cYdtTa6J4LS0\"",
22045
+ "mtime": "2026-10-17T18:43:41.550Z",
22046
+ "size": 88,
22047
+ "path": "../public/_nuxt/builds/meta/4994f3a4-4126-4f57-a9e5-c7ebb25850bc.json"
21577
22048
  }
21578
22049
  };
21579
22050
 
@@ -21896,6 +22367,7 @@ const _lazy_K8ukU6 = () => import('../routes/api/search.get.mjs');
21896
22367
  const _lazy_NXLBIE = () => import('../routes/api/seen.post.mjs');
21897
22368
  const _lazy_GOSQuW = () => import('../routes/api/sessions.get.mjs');
21898
22369
  const _lazy_3y86mR = () => import('../routes/api/sessions.post.mjs');
22370
+ const _lazy_tLoqXq = () => import('../routes/api/settings-tab.post.mjs');
21899
22371
  const _lazy_TqhtLZ = () => import('../routes/api/space.post.mjs');
21900
22372
  const _lazy_oeuOKk = () => import('../routes/api/state.get.mjs');
21901
22373
  const _lazy_ecbrXA = () => import('../routes/api/unqueue.post.mjs');
@@ -22000,6 +22472,7 @@ const handlers = [
22000
22472
  { route: '/api/seen', handler: _lazy_NXLBIE, lazy: true, middleware: false, method: "post" },
22001
22473
  { route: '/api/sessions', handler: _lazy_GOSQuW, lazy: true, middleware: false, method: "get" },
22002
22474
  { route: '/api/sessions', handler: _lazy_3y86mR, lazy: true, middleware: false, method: "post" },
22475
+ { route: '/api/settings-tab', handler: _lazy_tLoqXq, lazy: true, middleware: false, method: "post" },
22003
22476
  { route: '/api/space', handler: _lazy_TqhtLZ, lazy: true, middleware: false, method: "post" },
22004
22477
  { route: '/api/state', handler: _lazy_oeuOKk, lazy: true, middleware: false, method: "get" },
22005
22478
  { route: '/api/unqueue', handler: _lazy_ecbrXA, lazy: true, middleware: false, method: "post" },
@@ -22476,5 +22949,5 @@ setupGracefulShutdown(listener, nitroApp);
22476
22949
  }
22477
22950
  const nodeServer = {};
22478
22951
 
22479
- export { sleep$1 as $, ATTACH_MAX as A, isProjectThread as B, uploadNames as C, machineOfPane as D, fmt as E, takenBackOf as F, transcripts as G, HerdrError as H, chatPasted as I, withoutTakenBack as J, withSentText as K, currentModel as L, sendImage as M, keysFor as N, parseChoices as O, PANE_RE as P, parseOmpField as Q, withPaneLock as R, selfUpdates as S, restarting as T, UPLOAD_DIR as U, updateChoices as V, UPDATE_LABELS as W, updateRestartPlan as X, restarts as Y, usesTerminalException as Z, sameQuestion as _, defineApi as a, validLimit as a$, MACHINE_KEY_RE as a0, getMachine as a1, installClaudeStatusline as a2, codexStatus as a3, paneForeground as a4, codexMenuOpen as a5, stopAgent as a6, terminalUpdateLine as a7, waitFor as a8, terminalUpdateDone as a9, listEfforts as aA, saveUpload as aB, setResponseHeader as aC, underHome as aD, isSlashCommand as aE, addQueued as aF, interruptAgent as aG, takeBackFromClaude as aH, takeBack as aI, isGitRepo as aJ, projectFolderKinds as aK, baseMachines as aL, DATA_DIR as aM, renameMachine as aN, readMenu as aO, searchKeys as aP, findEntry as aQ, stepToward as aR, clickMovesOnly as aS, setModel as aT, listModels as aU, TOP as aV, HOST_LABEL as aW, phoneAccess as aX, phoneStatus as aY, phoneAction as aZ, limitMachineKeys as a_, startAgent as aa, log as ab, RESTARTABLE as ac, claudeFooterMode as ad, planRestart as ae, builtinCommands as af, slashCommands as ag, HOME as ah, localMachine as ai, readSubs as aj, vapidPublicKey as ak, pushReady as al, machineConfigs as am, recentDirsWithKinds as an, installedAgentKinds as ao, IN_DOCKER as ap, HOST_OPEN_TARGET as aq, HOST_OPEN_KEY as ar, PANE_RE$1 as as, splitId as at, HOST_OPEN_USER as au, listDirs as av, dismissStopped as aw, closePanel as ax, setEffort as ay, refreshModel as az, screenChoices as b, getResponseStatusText as b$, readThreadLimits as b0, writeThreadLimits as b1, closeTrailingMention as b2, keepPastes as b3, hasHeld as b4, INPUT_STATES as b5, inputVisible as b6, shouldHold as b7, sendPrompt as b8, agentPrompt as b9, cancelQueued as bA, installMode as bB, oneTapMode as bC, updateCommand as bD, compareVersions as bE, updateRunning as bF, allMachines as bG, recentDirs as bH, joinId as bI, useStorage as bJ, getRouterParam as bK, readUpload as bL, defineWebSocketHandler as bM, eventClients as bN, getStateJson as bO, hostAllowed as bP, sameOrigin as bQ, openTerm as bR, useRuntimeConfig as bS, encodePath as bT, joinRelativeURL as bU, defineRenderHandler as bV, createError$1 as bW, destr as bX, getRouteRules as bY, relative as bZ, joinURL as b_, isBusyError as ba, HOLD_AGENTS as bb, pendingPrompts as bc, parseQuiet as bd, writeGlobalQuiet as be, writeSubs as bf, quietActive as bg, readGlobalQuiet as bh, validPushSubscription as bi, replaceSubscription as bj, pushSend as bk, readQuotas as bl, retryQueued as bm, parseWaitScreen as bn, settingsTabs as bo, tabsOfRow as bp, classifyScreen as bq, parseMenu as br, hasTranscript as bs, SEARCH_DEADLINE_MS as bt, SEARCH_MAX_RESULTS as bu, spaceTitle as bv, markSeen as bw, listSessions as bx, openSession as by, PANE_DIRECTIONS as bz, createAgent as c, getResponseStatus as c0, useNitroApp as c1, nodeServer as c2, defineEventHandler as d, watchScreen as e, findPane as f, choicesCache as g, herdr as h, getQuery as i, saveAttachment as j, auth as k, localMachineLabel as l, getState as m, projectOf as n, isCoordinator as o, poll as p, paneBaseMachine as q, reqOf as r, sendError as s, pickCoordinator as t, currentMachineSlots as u, machineFor as v, withOmpTab as w, herdrOn as x, HERDR_CHILD_ENV as y, HERDR_BIN as z };
22952
+ export { UPDATE_LABELS as $, ATTACH_MAX as A, isProjectThread as B, uploadNames as C, runHerdrCli as D, parseIntegrationStatus as E, machineOfPane as F, fmt as G, HerdrError as H, takenBackOf as I, transcripts as J, missingIntegration as K, multiMachine as L, integrationCommand as M, chatPasted as N, withoutTakenBack as O, PANE_RE as P, withSentText as Q, currentModel as R, sendImage as S, keysFor as T, UPLOAD_DIR as U, parseChoices as V, parseOmpField as W, withPaneLock as X, selfUpdates as Y, restarting as Z, updateChoices as _, defineApi as a, refreshNativeScreen as a$, updateRestartPlan as a0, restarts as a1, usesTerminalException as a2, sameQuestion as a3, sleep$1 as a4, MACHINE_KEY_RE as a5, getMachine as a6, installClaudeStatusline as a7, codexStatus as a8, paneForeground as a9, listDirs as aA, dismissStopped as aB, closePanel as aC, setEffort as aD, refreshModel as aE, listEfforts as aF, saveUpload as aG, setResponseHeader as aH, underHome as aI, isSlashCommand as aJ, addQueued as aK, interruptAgent as aL, takeBackFromClaude as aM, takeBack as aN, isGitRepo as aO, projectFolderKinds as aP, baseMachines as aQ, DATA_DIR as aR, renameMachine as aS, readMenu as aT, findEntry as aU, menuIdentity as aV, searchKeys as aW, stepToward as aX, clickMovesOnly as aY, setModel as aZ, listModels as a_, codexMenuOpen as aa, stopAgent as ab, terminalUpdateLine as ac, waitFor as ad, terminalUpdateDone as ae, startAgent as af, log as ag, RESTARTABLE as ah, claudeFooterMode as ai, planRestart as aj, builtinCommands as ak, slashCommands as al, HOME as am, localMachine as an, readSubs as ao, vapidPublicKey as ap, pushReady as aq, machineConfigs as ar, recentDirsWithKinds as as, installedAgentKinds as at, IN_DOCKER as au, HOST_OPEN_TARGET as av, HOST_OPEN_KEY as aw, PANE_RE$1 as ax, splitId as ay, HOST_OPEN_USER as az, screenChoices as b, useRuntimeConfig as b$, TOP as b0, HOST_LABEL as b1, phoneAccess as b2, phoneStatus as b3, phoneAction as b4, limitMachineKeys as b5, validLimit as b6, readThreadLimits as b7, writeThreadLimits as b8, closeTrailingMention as b9, hasTranscript as bA, SEARCH_DEADLINE_MS as bB, SEARCH_MAX_RESULTS as bC, spaceTitle as bD, markSeen as bE, listSessions as bF, openSession as bG, settingsFocus as bH, PANE_DIRECTIONS as bI, cancelQueued as bJ, installMode as bK, oneTapMode as bL, updateCommand as bM, compareVersions as bN, updateRunning as bO, allMachines as bP, recentDirs as bQ, joinId as bR, useStorage as bS, getRouterParam as bT, readUpload as bU, defineWebSocketHandler as bV, eventClients as bW, getStateJson as bX, hostAllowed as bY, sameOrigin as bZ, openTerm as b_, keepPastes as ba, hasHeld as bb, INPUT_STATES as bc, inputVisible as bd, shouldHold as be, sendPrompt as bf, agentPrompt as bg, isBusyError as bh, HOLD_AGENTS as bi, pendingPrompts as bj, parseQuiet as bk, writeGlobalQuiet as bl, writeSubs as bm, quietActive as bn, readGlobalQuiet as bo, validPushSubscription as bp, replaceSubscription as bq, pushSend as br, readQuotas as bs, retryQueued as bt, parseWaitScreen as bu, waitIdentity as bv, settingsTabs as bw, tabsOfRow as bx, classifyScreen as by, parseMenu as bz, createAgent as c, encodePath as c0, joinRelativeURL as c1, defineRenderHandler as c2, createError$1 as c3, destr as c4, getRouteRules as c5, relative as c6, joinURL as c7, getResponseStatusText as c8, getResponseStatus as c9, useNitroApp as ca, nodeServer as cb, defineEventHandler as d, watchScreen as e, findPane as f, choicesCache as g, herdr as h, getQuery as i, saveAttachment as j, auth as k, localMachineLabel as l, getState as m, projectOf as n, isCoordinator as o, poll as p, paneBaseMachine as q, reqOf as r, sendError as s, pickCoordinator as t, currentMachineSlots as u, machineFor as v, withOmpTab as w, herdrOn as x, HERDR_CHILD_ENV as y, HERDR_BIN as z };
22480
22953
  //# sourceMappingURL=nitro.mjs.map