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.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{CP8o925U.js → BEJHMUrj.js} +1 -1
- package/.output/public/_nuxt/BOtcEDnA.js +1 -0
- package/.output/public/_nuxt/BUaYhQ2r.js +6 -0
- package/.output/public/_nuxt/{yzABg5xl.js → Bpoxvzh6.js} +1 -1
- package/.output/public/_nuxt/C25ROUa9.js +3 -0
- package/.output/public/_nuxt/CDWjMk9C.js +2 -0
- package/.output/public/_nuxt/CJKsMzIp.js +1 -0
- package/.output/public/_nuxt/CJNhn9sA.js +36 -0
- package/.output/public/_nuxt/COCvtdHN.js +89 -0
- package/.output/public/_nuxt/{Ci8N4mWR.js → CXJnLmWv.js} +1 -1
- package/.output/public/_nuxt/{DT8qZ0Wv.js → Cl45J6_Q.js} +1 -1
- package/.output/public/_nuxt/CndPDbMI.js +2 -0
- package/.output/public/_nuxt/Ctbx58Um.js +23 -0
- package/.output/public/_nuxt/{CKhgznq4.js → DMLmW6JM.js} +43 -39
- package/.output/public/_nuxt/Dl1PHLOB.js +1 -0
- package/.output/public/_nuxt/{DaaJIRB3.js → Nhex3_iH.js} +1 -1
- package/.output/public/_nuxt/OpWX45i7.js +89 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/4994f3a4-4126-4f57-a9e5-c7ebb25850bc.json +1 -0
- package/.output/public/_nuxt/dTj21DMs.js +1 -0
- package/.output/public/_nuxt/entry.BohTWE-n.css +2 -0
- package/.output/public/_nuxt/{Cr3SrGky.js → kwSoIiM7.js} +1 -1
- package/.output/public/_nuxt/mkEwYka4.js +1 -0
- package/.output/public/_nuxt/pdf.min.t82Z80JU.mjs +28 -0
- package/.output/public/_nuxt/pdf.worker.min.wgc6bjNh.mjs +28 -0
- package/.output/public/_nuxt/w7Rm7unj.js +1 -0
- package/.output/public/sw.js +1 -1
- package/.output/server/chunks/_/branding.mjs +1 -1
- package/.output/server/chunks/_/files.mjs +19 -6
- package/.output/server/chunks/_/machineOrder.mjs +1 -1
- package/.output/server/chunks/_/onboarding.mjs +1 -1
- package/.output/server/chunks/_/package.mjs +3 -1
- package/.output/server/chunks/_/plugins.mjs +6 -3
- package/.output/server/chunks/_/projectBoard.mjs +4 -7
- package/.output/server/chunks/_/projectsActions.mjs +1 -1
- package/.output/server/chunks/_/projectsPlugin.mjs +24 -50
- package/.output/server/chunks/_/projectsPlugin2.mjs +57 -0
- package/.output/server/chunks/_/restart.mjs +1 -1
- package/.output/server/chunks/_/reveal.mjs +1 -1
- package/.output/server/chunks/_/selfupdate.mjs +1 -1
- package/.output/server/chunks/_/settingstabs.mjs +36 -0
- package/.output/server/chunks/_/updates.mjs +1 -1
- package/.output/server/chunks/_/worktrees.mjs +1 -1
- package/.output/server/chunks/_/ws.mjs +1 -1
- package/.output/server/chunks/nitro/nitro.mjs +840 -367
- package/.output/server/chunks/routes/api/board.get.mjs +1 -0
- package/.output/server/chunks/routes/api/chat/image.get.mjs +1 -1
- package/.output/server/chunks/routes/api/chat.get.mjs +25 -5
- package/.output/server/chunks/routes/api/choose.post.mjs +14 -14
- package/.output/server/chunks/routes/api/claude-statusline.post.mjs +1 -1
- package/.output/server/chunks/routes/api/codex-update.post.mjs +1 -1
- package/.output/server/chunks/routes/api/commands.get.mjs +3 -2
- package/.output/server/chunks/routes/api/config.get.mjs +1 -1
- package/.output/server/chunks/routes/api/dirs.get.mjs +1 -1
- package/.output/server/chunks/routes/api/dismiss-stopped.post.mjs +1 -1
- package/.output/server/chunks/routes/api/dismiss.post.mjs +1 -1
- package/.output/server/chunks/routes/api/effort.post.mjs +1 -1
- package/.output/server/chunks/routes/api/efforts.get.mjs +1 -1
- package/.output/server/chunks/routes/api/file.post.mjs +1 -1
- package/.output/server/chunks/routes/api/files/download.get.mjs +10 -3
- package/.output/server/chunks/routes/api/gitroot.get.mjs +1 -1
- package/.output/server/chunks/routes/api/index.get.mjs +1 -0
- package/.output/server/chunks/routes/api/input.post.mjs +27 -10
- package/.output/server/chunks/routes/api/interrupt.post.mjs +1 -1
- package/.output/server/chunks/routes/api/isgit.get.mjs +1 -1
- package/.output/server/chunks/routes/api/machine/awake.get.mjs +1 -1
- package/.output/server/chunks/routes/api/machine/awake.post.mjs +1 -1
- package/.output/server/chunks/routes/api/machine/rename.post.mjs +1 -1
- package/.output/server/chunks/routes/api/menu.post.mjs +4 -1
- package/.output/server/chunks/routes/api/model.post.mjs +1 -1
- package/.output/server/chunks/routes/api/models.get.mjs +1 -1
- package/.output/server/chunks/routes/api/nav.post.mjs +34 -21
- package/.output/server/chunks/routes/api/phone.get.mjs +1 -1
- package/.output/server/chunks/routes/api/phone.post.mjs +1 -1
- package/.output/server/chunks/routes/api/plugins/actions.get.mjs +2 -0
- package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +2 -0
- package/.output/server/chunks/routes/api/plugins/profiles.get.mjs +2 -0
- package/.output/server/chunks/routes/api/plugins/projects.get.mjs +3 -2
- package/.output/server/chunks/routes/api/plugins/projects.post.mjs +3 -2
- package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +1 -1
- package/.output/server/chunks/routes/api/project/inbox.get.mjs +1 -0
- package/.output/server/chunks/routes/api/project/inbox.post.mjs +1 -0
- package/.output/server/chunks/routes/api/project/memory.get.mjs +1 -0
- package/.output/server/chunks/routes/api/project/report.get.mjs +1 -0
- package/.output/server/chunks/routes/api/project/routines.get.mjs +1 -0
- package/.output/server/chunks/routes/api/project/settings.get.mjs +1 -0
- package/.output/server/chunks/routes/api/project/thread.get.mjs +1 -0
- package/.output/server/chunks/routes/api/project/thread.post.mjs +2 -0
- package/.output/server/chunks/routes/api/prompt.post.mjs +1 -1
- package/.output/server/chunks/routes/api/push/quiet.post.mjs +1 -1
- package/.output/server/chunks/routes/api/push/subscribe.post.mjs +1 -1
- package/.output/server/chunks/routes/api/push/test.post.mjs +1 -1
- package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +1 -1
- package/.output/server/chunks/routes/api/quotas.get.mjs +1 -1
- package/.output/server/chunks/routes/api/requeue.post.mjs +1 -1
- package/.output/server/chunks/routes/api/screen-key.post.mjs +13 -10
- package/.output/server/chunks/routes/api/screen.get.mjs +2 -35
- package/.output/server/chunks/routes/api/search.get.mjs +1 -1
- package/.output/server/chunks/routes/api/seen.post.mjs +1 -1
- package/.output/server/chunks/routes/api/sessions.get.mjs +1 -1
- package/.output/server/chunks/routes/api/sessions.post.mjs +1 -1
- package/.output/server/chunks/routes/api/settings-tab.post.mjs +89 -0
- package/.output/server/chunks/routes/api/space.post.mjs +1 -1
- package/.output/server/chunks/routes/api/unqueue.post.mjs +1 -1
- package/.output/server/chunks/routes/api/update.get.mjs +1 -1
- package/.output/server/chunks/routes/api/update.post.mjs +1 -1
- package/.output/server/chunks/routes/api/upload.post.mjs +1 -1
- package/.output/server/chunks/routes/icons/_name_.get.mjs +1 -1
- package/.output/server/chunks/routes/renderer.mjs +2 -2
- package/.output/server/chunks/routes/uploads/_...name_.get.mjs +1 -1
- package/.output/server/chunks/routes/ws/_..._.mjs +1 -1
- package/.output/server/chunks/routes/ws/events.mjs +1 -1
- package/.output/server/chunks/routes/ws/term.mjs +1 -1
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/index.mjs +1 -1
- package/.output/server/package.json +1 -1
- package/README.md +44 -23
- package/package.json +3 -1
- package/skills/wherdr/SKILL.md +9 -3
- package/.output/public/_nuxt/B4Yk2tB1.js +0 -23
- package/.output/public/_nuxt/BBw_0a4M.js +0 -6
- package/.output/public/_nuxt/BSy6OCIY.js +0 -1
- package/.output/public/_nuxt/BX5PM2JQ.js +0 -1
- package/.output/public/_nuxt/BgPDnf2S.js +0 -1
- package/.output/public/_nuxt/BkOxQzbS.js +0 -2
- package/.output/public/_nuxt/CWwyK2XK.js +0 -2
- package/.output/public/_nuxt/CkbmecwS.js +0 -1
- package/.output/public/_nuxt/DAg9fiVh.js +0 -89
- package/.output/public/_nuxt/DcJi16XA.js +0 -1
- package/.output/public/_nuxt/SiL1FJ5s.js +0 -3
- package/.output/public/_nuxt/VpjCgSXu.js +0 -36
- package/.output/public/_nuxt/builds/meta/c735b6c0-1bd0-47d7-a208-d310f0a06287.json +0 -1
- package/.output/public/_nuxt/dPxB2L94.js +0 -89
- package/.output/public/_nuxt/entry.CGWKmYU3.css +0 -2
- 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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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": "
|
|
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$
|
|
10328
|
-
var __defNormalProp$
|
|
10329
|
-
var __publicField$
|
|
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$
|
|
10351
|
-
__publicField$
|
|
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$
|
|
10495
|
-
var __defNormalProp$
|
|
10496
|
-
var __publicField$
|
|
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$
|
|
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
|
-
|
|
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$
|
|
10575
|
-
var __defNormalProp$
|
|
10576
|
-
var __publicField$
|
|
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$
|
|
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('
|
|
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 = `
|
|
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$
|
|
10698
|
-
var __defNormalProp$
|
|
10699
|
-
var __publicField$
|
|
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$
|
|
10709
|
-
__publicField$
|
|
10710
|
-
__publicField$
|
|
10711
|
-
__publicField$
|
|
10712
|
-
__publicField$
|
|
10713
|
-
__publicField$
|
|
10714
|
-
__publicField$
|
|
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
|
-
|
|
11753
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
12809
|
-
|
|
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
|
|
12832
|
-
cache$3.set(id, { at: Date.now(),
|
|
12833
|
-
return
|
|
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$
|
|
14040
|
-
var __defNormalProp$
|
|
14041
|
-
var __publicField$
|
|
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$
|
|
14145
|
-
__publicField$
|
|
14146
|
-
__publicField$
|
|
14147
|
-
__publicField$
|
|
14148
|
-
__publicField$
|
|
14149
|
-
__publicField$
|
|
14150
|
-
__publicField$
|
|
14151
|
-
__publicField$
|
|
14152
|
-
__publicField$
|
|
14153
|
-
__publicField$
|
|
14154
|
-
__publicField$
|
|
14155
|
-
__publicField$
|
|
14156
|
-
__publicField$
|
|
14157
|
-
__publicField$
|
|
14158
|
-
__publicField$
|
|
14159
|
-
__publicField$
|
|
14160
|
-
__publicField$
|
|
14161
|
-
__publicField$
|
|
14162
|
-
__publicField$
|
|
14163
|
-
__publicField$
|
|
14164
|
-
__publicField$
|
|
14165
|
-
__publicField$
|
|
14166
|
-
__publicField$
|
|
14167
|
-
__publicField$
|
|
14168
|
-
__publicField$
|
|
14169
|
-
__publicField$
|
|
14170
|
-
__publicField$
|
|
14171
|
-
__publicField$
|
|
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$
|
|
14174
|
-
__publicField$
|
|
14175
|
-
__publicField$
|
|
14362
|
+
__publicField$4(this, "ident", "");
|
|
14363
|
+
__publicField$4(this, "onChange");
|
|
14364
|
+
__publicField$4(this, "onSkip", () => {
|
|
14176
14365
|
});
|
|
14177
|
-
__publicField$
|
|
14366
|
+
__publicField$4(this, "onOnline", () => {
|
|
14178
14367
|
});
|
|
14179
14368
|
// Session budget of the shared connection (sshd MaxSessions).
|
|
14180
|
-
__publicField$
|
|
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
|
-
|
|
14923
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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 =
|
|
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)
|
|
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 =
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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" ? (
|
|
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
|
-
|
|
19872
|
+
return;
|
|
19504
19873
|
}
|
|
19505
19874
|
}
|
|
19506
|
-
if (!p.agent)
|
|
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.
|
|
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
|
-
|
|
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
|
|
20577
|
-
const
|
|
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 -
|
|
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
|
|
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 =
|
|
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=${
|
|
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
|
|
20662
|
-
return { cookie: sessionCookie(req, now, s.since)
|
|
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
|
|
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: (
|
|
21244
|
+
expiresAt: cutAt(s.since),
|
|
20788
21245
|
deadline,
|
|
20789
21246
|
now,
|
|
20790
|
-
maxSessionDays: (
|
|
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-
|
|
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-
|
|
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-
|
|
21189
|
-
"mtime": "2026-10-
|
|
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-
|
|
21653
|
+
"mtime": "2026-10-17T18:43:41.582Z",
|
|
21197
21654
|
"size": 5826,
|
|
21198
21655
|
"path": "../public/_nuxt/AgentView.DzFWBd2A.css"
|
|
21199
21656
|
},
|
|
21200
|
-
"/_nuxt/
|
|
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": "\"
|
|
21210
|
-
"mtime": "2026-10-
|
|
21211
|
-
"size":
|
|
21212
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21664
|
+
"/_nuxt/BOtcEDnA.js": {
|
|
21215
21665
|
"type": "text/javascript; charset=utf-8",
|
|
21216
|
-
"etag": "\"
|
|
21217
|
-
"mtime": "2026-10-
|
|
21218
|
-
"size":
|
|
21219
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21671
|
+
"/_nuxt/BUaYhQ2r.js": {
|
|
21222
21672
|
"type": "text/javascript; charset=utf-8",
|
|
21223
|
-
"etag": "\"
|
|
21224
|
-
"mtime": "2026-10-
|
|
21225
|
-
"size":
|
|
21226
|
-
"path": "../public/_nuxt/
|
|
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-
|
|
21681
|
+
"mtime": "2026-10-17T18:43:41.582Z",
|
|
21232
21682
|
"size": 5653,
|
|
21233
21683
|
"path": "../public/_nuxt/Bd17z0YL.js"
|
|
21234
21684
|
},
|
|
21235
|
-
"/_nuxt/
|
|
21685
|
+
"/_nuxt/Bpoxvzh6.js": {
|
|
21236
21686
|
"type": "text/javascript; charset=utf-8",
|
|
21237
|
-
"etag": "\"
|
|
21238
|
-
"mtime": "2026-10-
|
|
21239
|
-
"size":
|
|
21240
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21692
|
+
"/_nuxt/C25ROUa9.js": {
|
|
21243
21693
|
"type": "text/javascript; charset=utf-8",
|
|
21244
|
-
"etag": "\"
|
|
21245
|
-
"mtime": "2026-10-
|
|
21246
|
-
"size":
|
|
21247
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21699
|
+
"/_nuxt/CJKsMzIp.js": {
|
|
21250
21700
|
"type": "text/javascript; charset=utf-8",
|
|
21251
|
-
"etag": "\"
|
|
21252
|
-
"mtime": "2026-10-
|
|
21253
|
-
"size":
|
|
21254
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21706
|
+
"/_nuxt/CDWjMk9C.js": {
|
|
21257
21707
|
"type": "text/javascript; charset=utf-8",
|
|
21258
|
-
"etag": "\"
|
|
21259
|
-
"mtime": "2026-10-
|
|
21260
|
-
"size":
|
|
21261
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21713
|
+
"/_nuxt/COCvtdHN.js": {
|
|
21264
21714
|
"type": "text/javascript; charset=utf-8",
|
|
21265
|
-
"etag": "\"
|
|
21266
|
-
"mtime": "2026-10-
|
|
21267
|
-
"size":
|
|
21268
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21720
|
+
"/_nuxt/CJNhn9sA.js": {
|
|
21271
21721
|
"type": "text/javascript; charset=utf-8",
|
|
21272
|
-
"etag": "\"
|
|
21273
|
-
"mtime": "2026-10-
|
|
21274
|
-
"size":
|
|
21275
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21727
|
+
"/_nuxt/CXJnLmWv.js": {
|
|
21278
21728
|
"type": "text/javascript; charset=utf-8",
|
|
21279
|
-
"etag": "\"
|
|
21280
|
-
"mtime": "2026-10-
|
|
21281
|
-
"size":
|
|
21282
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21734
|
+
"/_nuxt/Cl45J6_Q.js": {
|
|
21285
21735
|
"type": "text/javascript; charset=utf-8",
|
|
21286
|
-
"etag": "\"d34-
|
|
21287
|
-
"mtime": "2026-10-
|
|
21736
|
+
"etag": "\"d34-0CEgeEL4LpfF/Ngxkc3X1qxVE0Q\"",
|
|
21737
|
+
"mtime": "2026-10-17T18:43:41.583Z",
|
|
21288
21738
|
"size": 3380,
|
|
21289
|
-
"path": "../public/_nuxt/
|
|
21739
|
+
"path": "../public/_nuxt/Cl45J6_Q.js"
|
|
21290
21740
|
},
|
|
21291
|
-
"/_nuxt/
|
|
21741
|
+
"/_nuxt/CndPDbMI.js": {
|
|
21292
21742
|
"type": "text/javascript; charset=utf-8",
|
|
21293
|
-
"etag": "\"
|
|
21294
|
-
"mtime": "2026-10-
|
|
21295
|
-
"size":
|
|
21296
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21748
|
+
"/_nuxt/Ctbx58Um.js": {
|
|
21299
21749
|
"type": "text/javascript; charset=utf-8",
|
|
21300
|
-
"etag": "\"
|
|
21301
|
-
"mtime": "2026-10-
|
|
21302
|
-
"size":
|
|
21303
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21755
|
+
"/_nuxt/Dl1PHLOB.js": {
|
|
21306
21756
|
"type": "text/javascript; charset=utf-8",
|
|
21307
|
-
"etag": "\"
|
|
21308
|
-
"mtime": "2026-10-
|
|
21309
|
-
"size":
|
|
21310
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21762
|
+
"/_nuxt/Nhex3_iH.js": {
|
|
21313
21763
|
"type": "text/javascript; charset=utf-8",
|
|
21314
|
-
"etag": "\"
|
|
21315
|
-
"mtime": "2026-10-
|
|
21316
|
-
"size":
|
|
21317
|
-
"path": "../public/_nuxt/
|
|
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-
|
|
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/
|
|
21341
|
-
"type": "
|
|
21342
|
-
"etag": "\"
|
|
21343
|
-
"mtime": "2026-10-
|
|
21344
|
-
"size":
|
|
21345
|
-
"path": "../public/_nuxt/
|
|
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-
|
|
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/
|
|
21790
|
+
"/_nuxt/OpWX45i7.js": {
|
|
21355
21791
|
"type": "text/javascript; charset=utf-8",
|
|
21356
|
-
"etag": "\"
|
|
21357
|
-
"mtime": "2026-10-
|
|
21358
|
-
"size":
|
|
21359
|
-
"path": "../public/_nuxt/
|
|
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/
|
|
21362
|
-
"type": "text/
|
|
21363
|
-
"etag": "\"
|
|
21364
|
-
"mtime": "2026-10-
|
|
21365
|
-
"size":
|
|
21366
|
-
"path": "../public/_nuxt/
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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/
|
|
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": "\"
|
|
21413
|
-
"mtime": "2026-10-
|
|
21414
|
-
"size":
|
|
21415
|
-
"path": "../public/_nuxt/inter-latin-
|
|
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-
|
|
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.
|
|
21881
|
+
"/_nuxt/inter-latin-ext-wght-normal.DO1Apj_S.woff2": {
|
|
21425
21882
|
"type": "font/woff2",
|
|
21426
|
-
"etag": "\"
|
|
21427
|
-
"mtime": "2026-10-
|
|
21428
|
-
"size":
|
|
21429
|
-
"path": "../public/_nuxt/inter-latin-wght-normal.
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
21574
|
-
"mtime": "2026-10-
|
|
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 {
|
|
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
|