wherdr 2.4.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/{CPlkxpge.js → 2fsYF-LK.js} +41 -41
- package/.output/public/_nuxt/2fsYF-LK.js.br +0 -0
- package/.output/public/_nuxt/2fsYF-LK.js.gz +0 -0
- package/.output/public/_nuxt/{CV6ukk-M.js → 3bE7s96N.js} +1 -1
- package/.output/public/_nuxt/6YTlf8ot.js +1 -0
- package/.output/public/_nuxt/6YTlf8ot.js.br +0 -0
- package/.output/public/_nuxt/6YTlf8ot.js.gz +0 -0
- package/.output/public/_nuxt/{BYZVrreW.js → 7KozZy5Y.js} +1 -1
- package/.output/public/_nuxt/AgentView.BwyQIUef.css +1 -0
- package/.output/public/_nuxt/AgentView.BwyQIUef.css.br +0 -0
- package/.output/public/_nuxt/AgentView.BwyQIUef.css.gz +0 -0
- package/.output/public/_nuxt/{BdJIc1Xf.js → B40shTLf.js} +1 -1
- package/.output/public/_nuxt/{BdJIc1Xf.js.br → B40shTLf.js.br} +0 -0
- package/.output/public/_nuxt/B40shTLf.js.gz +0 -0
- package/.output/public/_nuxt/B5cSia3P.js +62 -0
- package/.output/public/_nuxt/B5cSia3P.js.br +0 -0
- package/.output/public/_nuxt/B5cSia3P.js.gz +0 -0
- package/.output/public/_nuxt/BK1_9FXg.js +1 -0
- package/.output/public/_nuxt/BK1_9FXg.js.br +0 -0
- package/.output/public/_nuxt/BK1_9FXg.js.gz +0 -0
- package/.output/public/_nuxt/{CgUSTIM1.js → Bqz3nVVB.js} +1 -1
- package/.output/public/_nuxt/{CgUSTIM1.js.br → Bqz3nVVB.js.br} +0 -0
- package/.output/public/_nuxt/Bqz3nVVB.js.gz +0 -0
- package/.output/public/_nuxt/{B2KlcBQ-.js → ByLPJEo6.js} +1 -1
- package/.output/public/_nuxt/ByLPJEo6.js.br +0 -0
- package/.output/public/_nuxt/ByLPJEo6.js.gz +0 -0
- package/.output/public/_nuxt/C8tHIeGN.js +3 -0
- package/.output/public/_nuxt/C8tHIeGN.js.br +0 -0
- package/.output/public/_nuxt/C8tHIeGN.js.gz +0 -0
- package/.output/public/_nuxt/CAkH_IfS.js +9 -0
- package/.output/public/_nuxt/CAkH_IfS.js.br +0 -0
- package/.output/public/_nuxt/CAkH_IfS.js.gz +0 -0
- package/.output/public/_nuxt/COWXF9OU.js +123 -0
- package/.output/public/_nuxt/COWXF9OU.js.br +0 -0
- package/.output/public/_nuxt/COWXF9OU.js.gz +0 -0
- package/.output/public/_nuxt/{BDTOz37p.js → CiG2Lovu.js} +1 -1
- package/.output/public/_nuxt/CiG2Lovu.js.br +0 -0
- package/.output/public/_nuxt/CiG2Lovu.js.gz +0 -0
- package/.output/public/_nuxt/CnjxEm0H.js +27 -0
- package/.output/public/_nuxt/CnjxEm0H.js.br +0 -0
- package/.output/public/_nuxt/CnjxEm0H.js.gz +0 -0
- package/.output/public/_nuxt/DNs2cMBZ.js +23 -0
- package/.output/public/_nuxt/DNs2cMBZ.js.br +0 -0
- package/.output/public/_nuxt/DNs2cMBZ.js.gz +0 -0
- package/.output/public/_nuxt/D_x7Rysx.js +31 -0
- package/.output/public/_nuxt/D_x7Rysx.js.br +0 -0
- package/.output/public/_nuxt/D_x7Rysx.js.gz +0 -0
- package/.output/public/_nuxt/{CLf2i_DM.js → T-qXNaMY.js} +1 -1
- package/.output/public/_nuxt/{board.fZYj3O-m.css → board.CpFnG_Ho.css} +1 -1
- package/.output/public/_nuxt/board.CpFnG_Ho.css.br +0 -0
- package/.output/public/_nuxt/board.CpFnG_Ho.css.gz +0 -0
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/e2ee8d99-6a6a-4754-934f-8b7dbecfcdcb.json +1 -0
- package/.output/public/_nuxt/entry.C_hImCpq.css +2 -0
- package/.output/public/_nuxt/entry.C_hImCpq.css.br +0 -0
- package/.output/public/_nuxt/entry.C_hImCpq.css.gz +0 -0
- package/.output/public/_nuxt/{settings.Cdb21nNw.css → settings.ycbeituV.css} +1 -1
- package/.output/public/_nuxt/settings.ycbeituV.css.br +0 -0
- package/.output/public/_nuxt/settings.ycbeituV.css.gz +0 -0
- package/.output/public/_nuxt/useViewport.D9mmYA6A.css +1 -0
- package/.output/public/_nuxt/useWorktrees.BWpb3OO0.css +1 -0
- package/.output/public/_nuxt/useWorktrees.BWpb3OO0.css.br +0 -0
- package/.output/public/_nuxt/useWorktrees.BWpb3OO0.css.gz +0 -0
- package/.output/public/sw.js +6 -2
- package/.output/server/chunks/_/branding.mjs +1 -1
- package/.output/server/chunks/_/fileDownload.mjs +1 -1
- package/.output/server/chunks/_/files.mjs +26 -3
- package/.output/server/chunks/_/machineOrder.mjs +1 -1
- package/.output/server/chunks/_/onboarding.mjs +1 -1
- package/.output/server/chunks/_/package.mjs +1 -1
- package/.output/server/chunks/_/plugins.mjs +1 -1
- package/.output/server/chunks/_/restart.mjs +1 -1
- package/.output/server/chunks/_/revoke.mjs +22 -0
- package/.output/server/chunks/_/selfupdate.mjs +2 -1
- package/.output/server/chunks/_/splitShell.mjs +42 -0
- package/.output/server/chunks/_/updates.mjs +18 -4
- package/.output/server/chunks/_/uploadHashes.mjs +46 -0
- package/.output/server/chunks/_/worktrees.mjs +1 -1
- package/.output/server/chunks/_/ws.mjs +3 -3
- package/.output/server/chunks/nitro/nitro.mjs +15815 -15082
- package/.output/server/chunks/raw/check-leaks.mjs +1 -1
- package/.output/server/chunks/raw/ci-browser-plan.mjs +5 -0
- package/.output/server/chunks/raw/engine-changes.mjs +5 -0
- package/.output/server/chunks/raw/engine-result.mjs +7 -0
- package/.output/server/chunks/raw/herdr-plugin.mjs +1 -1
- package/.output/server/chunks/raw/prerelease.mjs +1 -1
- package/.output/server/chunks/raw/test-affected.mjs +1 -1
- package/.output/server/chunks/routes/api/_..._.mjs +5 -5
- package/.output/server/chunks/routes/api/agents.post.mjs +5 -5
- package/.output/server/chunks/routes/api/ask-tab.post.mjs +5 -5
- package/.output/server/chunks/routes/api/attach.post.mjs +5 -5
- package/.output/server/chunks/routes/api/auth/disable.post.mjs +14 -7
- package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +12 -6
- package/.output/server/chunks/routes/api/auth/lock.post.mjs +5 -5
- package/.output/server/chunks/routes/api/auth/login/options.post.mjs +7 -7
- package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +5 -5
- package/.output/server/chunks/routes/api/auth/max-session.post.mjs +5 -5
- package/.output/server/chunks/routes/api/auth/register/options.post.mjs +5 -5
- package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +5 -5
- package/.output/server/chunks/routes/api/auth/status.get.mjs +10 -10
- package/.output/server/chunks/routes/api/changes.get.mjs +6 -6
- package/.output/server/chunks/routes/api/chat/image.get.mjs +6 -6
- package/.output/server/chunks/routes/api/chat.get.mjs +20 -49
- package/.output/server/chunks/routes/api/choose.post.mjs +6 -6
- package/.output/server/chunks/routes/api/claude-setup.post.mjs +6 -6
- package/.output/server/chunks/routes/api/claude-statusline.post.mjs +6 -6
- package/.output/server/chunks/routes/api/clear-queued-input.post.mjs +6 -6
- package/.output/server/chunks/routes/api/close/status.get.mjs +6 -6
- package/.output/server/chunks/routes/api/close-preview.get.mjs +62 -0
- package/.output/server/chunks/routes/api/close.post.mjs +5 -5
- package/.output/server/chunks/routes/api/codex-update.post.mjs +6 -6
- package/.output/server/chunks/routes/api/commands.get.mjs +6 -6
- package/.output/server/chunks/routes/api/config.get.mjs +6 -6
- package/.output/server/chunks/routes/api/dirs.get.mjs +6 -6
- package/.output/server/chunks/routes/api/dismiss-stopped.post.mjs +6 -6
- package/.output/server/chunks/routes/api/dismiss.post.mjs +6 -6
- package/.output/server/chunks/routes/api/effort.post.mjs +6 -6
- package/.output/server/chunks/routes/api/efforts.get.mjs +6 -6
- package/.output/server/chunks/routes/api/file.post.mjs +6 -6
- package/.output/server/chunks/routes/api/files/download.get.mjs +5 -5
- package/.output/server/chunks/routes/api/files/download.head.mjs +5 -5
- package/.output/server/chunks/routes/api/files/read.get.mjs +6 -6
- package/.output/server/chunks/routes/api/files.get.mjs +6 -6
- package/.output/server/chunks/routes/api/health.get.mjs +5 -5
- package/.output/server/chunks/routes/api/input.post.mjs +6 -6
- package/.output/server/chunks/routes/api/interrupt.post.mjs +6 -6
- package/.output/server/chunks/routes/api/isgit.get.mjs +6 -6
- package/.output/server/chunks/routes/api/machine/awake.get.mjs +6 -6
- package/.output/server/chunks/routes/api/machine/awake.post.mjs +6 -6
- package/.output/server/chunks/routes/api/machine/order.get.mjs +5 -5
- package/.output/server/chunks/routes/api/machine/order.post.mjs +5 -5
- package/.output/server/chunks/routes/api/machine/reconnect.post.mjs +6 -6
- package/.output/server/chunks/routes/api/machine/rename.post.mjs +6 -6
- package/.output/server/chunks/routes/api/machine/status.post.mjs +6 -6
- package/.output/server/chunks/routes/api/menu-left.post.mjs +6 -6
- package/.output/server/chunks/routes/api/menu.post.mjs +6 -6
- package/.output/server/chunks/routes/api/model.post.mjs +6 -6
- package/.output/server/chunks/routes/api/models.get.mjs +6 -6
- package/.output/server/chunks/routes/api/nav.post.mjs +6 -6
- package/.output/server/chunks/routes/api/onboarding.get.mjs +5 -5
- package/.output/server/chunks/routes/api/onboarding.post.mjs +5 -5
- package/.output/server/chunks/routes/api/phone.get.mjs +6 -6
- package/.output/server/chunks/routes/api/phone.post.mjs +6 -6
- package/.output/server/chunks/routes/api/plugins/actions.get.mjs +5 -5
- package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +5 -5
- package/.output/server/chunks/routes/api/plugins/projects.get.mjs +6 -6
- package/.output/server/chunks/routes/api/plugins/projects.post.mjs +6 -6
- package/.output/server/chunks/routes/api/prompt.post.mjs +6 -6
- package/.output/server/chunks/routes/api/push/devices.post.mjs +49 -0
- package/.output/server/chunks/routes/api/push/quiet.post.mjs +6 -6
- package/.output/server/chunks/routes/api/push/subscribe.post.mjs +8 -7
- package/.output/server/chunks/routes/api/push/test.post.mjs +6 -6
- package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +6 -6
- package/.output/server/chunks/routes/api/quotas.get.mjs +6 -6
- package/.output/server/chunks/routes/api/rename.post.mjs +5 -5
- package/.output/server/chunks/routes/api/requeue.post.mjs +6 -6
- package/.output/server/chunks/routes/api/restart.get.mjs +5 -5
- package/.output/server/chunks/routes/api/restart.post.mjs +5 -5
- package/.output/server/chunks/routes/api/reveal.post.mjs +6 -6
- package/.output/server/chunks/routes/api/screen-key.post.mjs +6 -6
- package/.output/server/chunks/routes/api/screen.get.mjs +6 -6
- package/.output/server/chunks/routes/api/search.get.mjs +6 -6
- package/.output/server/chunks/routes/api/seen.post.mjs +6 -6
- package/.output/server/chunks/routes/api/send-now.post.mjs +6 -6
- package/.output/server/chunks/routes/api/sessions.get.mjs +6 -6
- package/.output/server/chunks/routes/api/sessions.post.mjs +6 -6
- package/.output/server/chunks/routes/api/settings-tab.post.mjs +6 -6
- package/.output/server/chunks/routes/api/settings.get.mjs +6 -6
- package/.output/server/chunks/routes/api/settings.post.mjs +6 -6
- package/.output/server/chunks/routes/api/space.post.mjs +6 -6
- package/.output/server/chunks/routes/api/split-command.post.mjs +9 -44
- package/.output/server/chunks/routes/api/state.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/action.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/add.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/after.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/approve.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/archive-done.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/archived.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/autopilot.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/autopilot.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/board-settings.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/board-settings.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/coordinator.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/coordinator.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/describe.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/details.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/limit.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/links.get.mjs +7 -7
- package/.output/server/chunks/routes/api/tasks/models.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/pick.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/project.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/project.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/question.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/scheduled.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/settings.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/start.get.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/tell.post.mjs +6 -6
- package/.output/server/chunks/routes/api/tasks/transcript-image.get.mjs +47 -0
- package/.output/server/chunks/routes/api/tasks/transcript.get.mjs +48 -0
- package/.output/server/chunks/routes/api/tasks.get.mjs +6 -6
- package/.output/server/chunks/routes/api/unqueue.post.mjs +6 -6
- package/.output/server/chunks/routes/api/update/status.get.mjs +5 -5
- package/.output/server/chunks/routes/api/update.get.mjs +5 -5
- package/.output/server/chunks/routes/api/update.post.mjs +5 -5
- package/.output/server/chunks/routes/api/upload.post.mjs +6 -6
- package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +5 -5
- package/.output/server/chunks/routes/api/worktrees.get.mjs +5 -5
- package/.output/server/chunks/routes/favicon.ico.get.mjs +5 -5
- package/.output/server/chunks/routes/icons/_name_.get.mjs +6 -6
- package/.output/server/chunks/routes/renderer.mjs +7 -7
- package/.output/server/chunks/routes/uploads/_...name_.get.mjs +6 -6
- package/.output/server/chunks/routes/ws/_..._.mjs +6 -6
- package/.output/server/chunks/routes/ws/events.mjs +6 -6
- package/.output/server/chunks/routes/ws/term.mjs +6 -6
- package/.output/server/chunks/virtual/precomputed.mjs +1 -1
- package/.output/server/index.mjs +6 -6
- package/.output/server/package.json +1 -1
- package/README.md +1 -1
- package/bin/lib/tailnet.d.mts +7 -4
- package/bin/lib/tailnet.mjs +76 -18
- package/bin/lib/updater.mjs +6 -0
- package/docs/README.md +4 -0
- package/docs/RELEASING.md +27 -5
- package/docs/configuration.md +3 -4
- package/docs/conversation.md +11 -3
- package/docs/design.md +1 -1
- package/docs/devices.md +28 -0
- package/docs/home.md +29 -0
- package/docs/installation.md +14 -5
- package/docs/networks.md +9 -4
- package/docs/notifications.md +7 -0
- package/docs/plugins.md +1 -1
- package/docs/quick-start.md +7 -6
- package/docs/quotas.md +10 -1
- package/docs/release-notes-2.5.0.md +25 -0
- package/docs/release-notes-2.6.0.md +29 -0
- package/docs/security.md +61 -11
- package/docs/troubleshooting.md +4 -0
- package/package.json +1 -1
- package/skills/wherdr/SKILL.md +21 -0
- package/.output/public/_nuxt/AgentView.B12D6ccj.css +0 -1
- package/.output/public/_nuxt/AgentView.B12D6ccj.css.br +0 -0
- package/.output/public/_nuxt/AgentView.B12D6ccj.css.gz +0 -0
- package/.output/public/_nuxt/B2KlcBQ-.js.br +0 -0
- package/.output/public/_nuxt/B2KlcBQ-.js.gz +0 -0
- package/.output/public/_nuxt/BDTOz37p.js.br +0 -0
- package/.output/public/_nuxt/BDTOz37p.js.gz +0 -0
- package/.output/public/_nuxt/BGD5AamG.js +0 -25
- package/.output/public/_nuxt/BGD5AamG.js.br +0 -0
- package/.output/public/_nuxt/BGD5AamG.js.gz +0 -0
- package/.output/public/_nuxt/BdJIc1Xf.js.gz +0 -0
- package/.output/public/_nuxt/BxlzUs1i.js +0 -23
- package/.output/public/_nuxt/BxlzUs1i.js.br +0 -0
- package/.output/public/_nuxt/BxlzUs1i.js.gz +0 -0
- package/.output/public/_nuxt/C-BDzEtI.js +0 -3
- package/.output/public/_nuxt/C-BDzEtI.js.br +0 -0
- package/.output/public/_nuxt/C-BDzEtI.js.gz +0 -0
- package/.output/public/_nuxt/CO4sDeSt.js +0 -62
- package/.output/public/_nuxt/CO4sDeSt.js.br +0 -0
- package/.output/public/_nuxt/CO4sDeSt.js.gz +0 -0
- package/.output/public/_nuxt/CPlkxpge.js.br +0 -0
- package/.output/public/_nuxt/CPlkxpge.js.gz +0 -0
- package/.output/public/_nuxt/CTPNZj4T.js +0 -9
- package/.output/public/_nuxt/CTPNZj4T.js.br +0 -0
- package/.output/public/_nuxt/CTPNZj4T.js.gz +0 -0
- package/.output/public/_nuxt/CgUSTIM1.js.gz +0 -0
- package/.output/public/_nuxt/CwurhZnh.js +0 -123
- package/.output/public/_nuxt/CwurhZnh.js.br +0 -0
- package/.output/public/_nuxt/CwurhZnh.js.gz +0 -0
- package/.output/public/_nuxt/D7fCPncR.js +0 -1
- package/.output/public/_nuxt/D7fCPncR.js.br +0 -0
- package/.output/public/_nuxt/D7fCPncR.js.gz +0 -0
- package/.output/public/_nuxt/DFe-cDm2.js +0 -1
- package/.output/public/_nuxt/DFe-cDm2.js.br +0 -0
- package/.output/public/_nuxt/DFe-cDm2.js.gz +0 -0
- package/.output/public/_nuxt/Dpe9TNcA.js +0 -31
- package/.output/public/_nuxt/Dpe9TNcA.js.br +0 -0
- package/.output/public/_nuxt/Dpe9TNcA.js.gz +0 -0
- package/.output/public/_nuxt/board.fZYj3O-m.css.br +0 -0
- package/.output/public/_nuxt/board.fZYj3O-m.css.gz +0 -0
- package/.output/public/_nuxt/builds/meta/75cc4ea7-3027-463a-aa3e-29e474ed7173.json +0 -1
- package/.output/public/_nuxt/entry.KNdllmoL.css +0 -2
- package/.output/public/_nuxt/entry.KNdllmoL.css.br +0 -0
- package/.output/public/_nuxt/entry.KNdllmoL.css.gz +0 -0
- package/.output/public/_nuxt/settings.Cdb21nNw.css.br +0 -0
- package/.output/public/_nuxt/settings.Cdb21nNw.css.gz +0 -0
|
Binary file
|
|
Binary file
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.notification-level[data-v-aa9b4e30]{flex-direction:column;gap:6px;min-width:0;display:flex}.notification-level select[data-v-aa9b4e30]{border:1px solid var(--line);background:var(--bg);max-width:100%;min-height:44px;color:var(--text);font:inherit;border-radius:0;padding:8px}.notification-level-hint[data-v-aa9b4e30]{color:var(--muted);font-size:12px}.notification-customize summary[data-v-aa9b4e30]{cursor:pointer;min-height:36px;color:var(--muted);align-items:center;gap:4px;font-size:13px;list-style:none;display:flex}.notification-customize summary[data-v-aa9b4e30]::-webkit-details-marker{display:none}.notification-chev[data-v-aa9b4e30]{transition:transform .15s}.notification-customize[open] .notification-chev[data-v-aa9b4e30]{transform:rotate(90deg)}.notification-events[data-v-aa9b4e30]{flex-wrap:wrap;gap:4px 18px;display:flex}.notification-events label[data-v-aa9b4e30]{align-items:center;gap:6px;min-height:44px;display:flex}.notification-events input[data-v-aa9b4e30]{accent-color:var(--accent)}.notification-rules .settings-toggle[data-v-aeafb17e]{gap:16px}.notification-rules .settings-toggle>span[data-v-aeafb17e]{flex:1;min-width:0}.notification-default[data-v-aeafb17e]>.notification-level{margin-bottom:8px}.notification-help[data-v-aeafb17e]{margin:8px 0 0;font-size:12px}.notification-rule[data-v-aeafb17e]{border:1px solid var(--line);flex-direction:column;gap:10px;min-width:0;margin:12px 0;padding:14px;display:flex}.notification-rule-head b[data-v-aeafb17e],.notification-rule-head small[data-v-aeafb17e]{overflow-wrap:anywhere;display:block}.notification-rule-head small[data-v-aeafb17e]{color:var(--muted);font:11px var(--mono);margin-bottom:4px}.notification-rule-head .notification-diff[data-v-aeafb17e]{font:12px var(--sans,inherit);margin:4px 0 0}.notification-rule .settings-action small[data-v-aeafb17e]{margin-left:auto;padding-left:8px;font-size:11px}.notification-add[data-v-aeafb17e]{margin-top:12px}.notification-picker[data-v-aeafb17e]{border:1px solid var(--line);flex-direction:column;gap:12px;margin-top:8px;padding:12px;display:flex}.notification-picker-group[data-v-aeafb17e]{flex-direction:column;gap:4px;display:flex}.notification-picker-group>small[data-v-aeafb17e]{color:var(--muted);font:11px var(--mono)}.notification-reset[data-v-aeafb17e]{margin-top:16px}
|
|
1
|
+
.notification-level[data-v-aa9b4e30]{flex-direction:column;gap:6px;min-width:0;display:flex}.notification-level select[data-v-aa9b4e30]{border:1px solid var(--line);background:var(--bg);max-width:100%;min-height:44px;color:var(--text);font:inherit;border-radius:0;padding:8px}.notification-level-hint[data-v-aa9b4e30]{color:var(--muted);font-size:12px}.notification-customize summary[data-v-aa9b4e30]{cursor:pointer;min-height:36px;color:var(--muted);align-items:center;gap:4px;font-size:13px;list-style:none;display:flex}.notification-customize summary[data-v-aa9b4e30]::-webkit-details-marker{display:none}.notification-chev[data-v-aa9b4e30]{transition:transform .15s}.notification-customize[open] .notification-chev[data-v-aa9b4e30]{transform:rotate(90deg)}.notification-events[data-v-aa9b4e30]{flex-wrap:wrap;gap:4px 18px;display:flex}.notification-events label[data-v-aa9b4e30]{align-items:center;gap:6px;min-height:44px;display:flex}.notification-events input[data-v-aa9b4e30]{accent-color:var(--accent)}.notification-rules .settings-toggle[data-v-aeafb17e]{gap:16px}.notification-rules .settings-toggle>span[data-v-aeafb17e]{flex:1;min-width:0}.notification-default[data-v-aeafb17e]>.notification-level{margin-bottom:8px}.notification-help[data-v-aeafb17e]{margin:8px 0 0;font-size:12px}.notification-rule[data-v-aeafb17e]{border:1px solid var(--line);flex-direction:column;gap:10px;min-width:0;margin:12px 0;padding:14px;display:flex}.notification-rule-head b[data-v-aeafb17e],.notification-rule-head small[data-v-aeafb17e]{overflow-wrap:anywhere;display:block}.notification-rule-head small[data-v-aeafb17e]{color:var(--muted);font:11px var(--mono);margin-bottom:4px}.notification-rule-head .notification-diff[data-v-aeafb17e]{font:12px var(--sans,inherit);margin:4px 0 0}.notification-rule .settings-action small[data-v-aeafb17e]{margin-left:auto;padding-left:8px;font-size:11px}.notification-add[data-v-aeafb17e]{margin-top:12px}.notification-picker[data-v-aeafb17e]{border:1px solid var(--line);flex-direction:column;gap:12px;margin-top:8px;padding:12px;display:flex}.notification-picker-group[data-v-aeafb17e]{flex-direction:column;gap:4px;display:flex}.notification-picker-group>small[data-v-aeafb17e]{color:var(--muted);font:11px var(--mono)}.notification-reset[data-v-aeafb17e]{margin-top:16px}.push-devices[data-v-a2f67b97]{margin-top:10px;padding-top:12px}.push-devices p[data-v-a2f67b97]{margin:0 0 4px;font-size:13px}.push-devices ul[data-v-a2f67b97]{margin:0;padding:0;list-style:none}.push-devices li[data-v-a2f67b97]{border-top:1px solid var(--line-soft);align-items:center;gap:12px;padding:10px 0;display:flex}.push-devices li[data-v-a2f67b97]:first-child{border-top:0}.push-device-main[data-v-a2f67b97]{overflow-wrap:anywhere;flex-direction:column;flex:1;gap:2px;min-width:0;font-size:13px;display:flex}.push-device-main b[data-v-a2f67b97]{font-size:14.5px;font-weight:500}.push-device-main small[data-v-a2f67b97]{font:500 10.5px/1 var(--mono);text-transform:uppercase;color:var(--accent);margin-left:8px}.push-result[data-v-a2f67b97]{font-family:var(--mono);font-size:12px}.push-result-ok[data-v-a2f67b97]{color:var(--green)}.push-result-bad[data-v-a2f67b97]{color:var(--danger)}.push-result-none[data-v-a2f67b97]{color:var(--muted)}.push-device-remove[data-v-a2f67b97]{border:1px solid var(--line);min-height:44px;color:var(--danger);cursor:pointer;background:0 0;flex:none;align-items:center;gap:6px;padding:0 12px;font-size:13px;display:flex}.push-device-remove[data-v-a2f67b97]:focus-visible{outline:1px solid var(--accent);outline-offset:-2px}
|
|
Binary file
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.omp-context-progress[data-v-e967b731]{pointer-events:none;background:var(--green);height:2px;position:absolute;bottom:0;left:0}.omp-context-progress.mid[data-v-e967b731]{background:var(--ochre)}.omp-context-progress.hi[data-v-e967b731]{background:var(--rose)}.omp-context-progress.last-known[data-v-e967b731]{opacity:.5}.omp-context[data-v-e967b731]{white-space:nowrap;font-variant-numeric:tabular-nums;cursor:pointer;position:relative}.omp-context[data-v-e967b731]:after{content:"";position:absolute;inset:-6px 0}.omp-context-detail[data-v-e967b731]{width:min(300px,80vw);color:var(--text);white-space:normal;overflow-wrap:anywhere;padding:10px;font-size:12px}.omp-context-status[data-v-e967b731]{color:var(--muted);font-family:var(--mono);margin-top:8px}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.md-body[data-v-8ea9a8a3] .svg-block{background:0 0}.md-body[data-v-8ea9a8a3] img.svg-preview{-o-object-fit:contain;object-fit:contain;cursor:zoom-in;background:0 0;border:0;width:100%;max-width:100%;max-height:65dvh;margin:0;padding:12px;display:block}.md-body[data-v-8ea9a8a3] .svg-source[hidden],.md-body[data-v-8ea9a8a3] img.svg-preview[hidden]{display:none}.md-body[data-v-8ea9a8a3] .svg-toggle:focus-visible,.md-body[data-v-8ea9a8a3] img.svg-preview:focus-visible{outline:1px solid var(--accent);outline-offset:-2px}.md-body[data-v-8ea9a8a3] .svg-toggle{min-width:64px;min-height:44px;color:var(--muted);font:500 10px/1 var(--mono);letter-spacing:.14em;text-transform:uppercase;cursor:pointer;padding:6px 8px}.md-body[data-v-8ea9a8a3] .svg-toggle:hover{color:var(--text);background:var(--surface-2)}.md-body[data-v-8ea9a8a3] .svg-note{color:var(--muted);margin:0;padding:12px 14px;font-size:13px}.md-body[data-v-8ea9a8a3] .svg-block .code-head{height:auto;min-height:44px}.md-body[data-v-8ea9a8a3] .svg-block .code-copy{min-width:44px;min-height:44px}
|
|
Binary file
|
|
Binary file
|
package/.output/public/sw.js
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
var sw = self;
|
|
16
16
|
var CACHE = "wherdr-v1";
|
|
17
17
|
var NETWORK_WAIT_MS = 3e3;
|
|
18
|
-
var PRECACHE = ["/", ...[{"revision":"e6a852ba6e2a724d2255af526cb04083","url":"manifest.webmanifest"},{"revision":"b1a14fab8c06784649bf26c636747a86","url":"manifest-en.webmanifest"},{"revision":null,"url":"_nuxt/wherdr-symbols.C1LsPKmg.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-powerline.B_kAMxXr.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-octicons.Hl4VEx8m.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-4.CO_PudDR.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-3.8xz7iX-Y.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-2.C_flbBWO.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-1.BdvqkCqW.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-extension.Dai_ky39.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-devicons.ZMSFX1sW.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-codicons.CtEsfSAf.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-awesome.DQ3_iAfa.woff2"},{"revision":null,"url":"_nuxt/settings.
|
|
18
|
+
var PRECACHE = ["/", ...[{"revision":"e6a852ba6e2a724d2255af526cb04083","url":"manifest.webmanifest"},{"revision":"b1a14fab8c06784649bf26c636747a86","url":"manifest-en.webmanifest"},{"revision":null,"url":"_nuxt/wherdr-symbols.C1LsPKmg.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-powerline.B_kAMxXr.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-octicons.Hl4VEx8m.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-4.CO_PudDR.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-3.8xz7iX-Y.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-2.C_flbBWO.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-material-1.BdvqkCqW.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-extension.Dai_ky39.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-devicons.ZMSFX1sW.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-codicons.CtEsfSAf.woff2"},{"revision":null,"url":"_nuxt/wherdr-nerd-awesome.DQ3_iAfa.woff2"},{"revision":null,"url":"_nuxt/useWorktrees.BWpb3OO0.css"},{"revision":null,"url":"_nuxt/useViewport.D9mmYA6A.css"},{"revision":null,"url":"_nuxt/settings.ycbeituV.css"},{"revision":null,"url":"_nuxt/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2"},{"revision":null,"url":"_nuxt/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2"},{"revision":null,"url":"_nuxt/inter-vietnamese-wght-normal.CBcvBZtf.woff2"},{"revision":null,"url":"_nuxt/inter-latin-wght-normal.Dx4kXJAl.woff2"},{"revision":null,"url":"_nuxt/inter-latin-ext-wght-normal.DO1Apj_S.woff2"},{"revision":null,"url":"_nuxt/inter-greek-wght-normal.CkhJZR-_.woff2"},{"revision":null,"url":"_nuxt/inter-greek-ext-wght-normal.DlzME5K_.woff2"},{"revision":null,"url":"_nuxt/inter-cyrillic-wght-normal.DqGufNeO.woff2"},{"revision":null,"url":"_nuxt/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2"},{"revision":null,"url":"_nuxt/hePW80VL.js"},{"revision":null,"url":"_nuxt/error-500.Bwd7zAaE.css"},{"revision":null,"url":"_nuxt/error-404.Bb87HomL.css"},{"revision":null,"url":"_nuxt/entry.C_hImCpq.css"},{"revision":null,"url":"_nuxt/board.CpFnG_Ho.css"},{"revision":null,"url":"_nuxt/archivo-vietnamese-wght-normal.XAtsl5Q_.woff2"},{"revision":null,"url":"_nuxt/archivo-latin-wght-normal.E0tuGl4L.woff2"},{"revision":null,"url":"_nuxt/archivo-latin-ext-wght-normal.C4zznr8T.woff2"},{"revision":null,"url":"_nuxt/T-qXNaMY.js"},{"revision":null,"url":"_nuxt/D_x7Rysx.js"},{"revision":null,"url":"_nuxt/DNs2cMBZ.js"},{"revision":null,"url":"_nuxt/CnjxEm0H.js"},{"revision":null,"url":"_nuxt/CiG2Lovu.js"},{"revision":null,"url":"_nuxt/CXJnLmWv.js"},{"revision":null,"url":"_nuxt/COWXF9OU.js"},{"revision":null,"url":"_nuxt/CDWjMk9C.js"},{"revision":null,"url":"_nuxt/CAkH_IfS.js"},{"revision":null,"url":"_nuxt/C8tHIeGN.js"},{"revision":null,"url":"_nuxt/C25ROUa9.js"},{"revision":null,"url":"_nuxt/ByLPJEo6.js"},{"revision":null,"url":"_nuxt/Bqz3nVVB.js"},{"revision":null,"url":"_nuxt/Bpoxvzh6.js"},{"revision":null,"url":"_nuxt/Bd17z0YL.js"},{"revision":null,"url":"_nuxt/BK1_9FXg.js"},{"revision":null,"url":"_nuxt/BDNMzG2s.js"},{"revision":null,"url":"_nuxt/B5cSia3P.js"},{"revision":null,"url":"_nuxt/B40shTLf.js"},{"revision":null,"url":"_nuxt/AgentView.BwyQIUef.css"},{"revision":null,"url":"_nuxt/7KozZy5Y.js"},{"revision":null,"url":"_nuxt/6YTlf8ot.js"},{"revision":null,"url":"_nuxt/3bE7s96N.js"},{"revision":null,"url":"_nuxt/2fsYF-LK.js"},{"revision":"49e0b22686896464e4fa37a1e1160a8f","url":"_nuxt/builds/latest.json"},{"revision":null,"url":"_nuxt/builds/meta/e2ee8d99-6a6a-4754-934f-8b7dbecfcdcb.json"}].map((e) => "/" + (typeof e === "string" ? e : e.url).replace(/^\//, ""))];
|
|
19
19
|
sw.addEventListener("install", (e) => {
|
|
20
20
|
e.waitUntil((async () => {
|
|
21
21
|
const c = await caches.open(CACHE);
|
|
@@ -49,7 +49,11 @@
|
|
|
49
49
|
}
|
|
50
50
|
const network = fetch(req, { cache: "no-cache" });
|
|
51
51
|
e.waitUntil(network.then((res) => keep(req, res)).catch(() => {}));
|
|
52
|
-
|
|
52
|
+
if (req.mode === "navigate") {
|
|
53
|
+
e.respondWith(caches.match("/").then((hit) => hit || network));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
const fromCache = async () => await caches.match(req) || void 0;
|
|
53
57
|
e.respondWith(networkFirst(network, fromCache, NETWORK_WAIT_MS));
|
|
54
58
|
});
|
|
55
59
|
sw.addEventListener("push", (e) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HerdrError, a as defineApi, i as getQuery, f as findPane,
|
|
1
|
+
import { H as HerdrError, a as defineApi, i as getQuery, f as findPane, B as machineFor, aK as setResponseHeader, aL as getRequestHeader, aM as setResponseStatus } from '../nitro/nitro.mjs';
|
|
2
2
|
import { w as writtenTarget, c as cleanRelative, r as rootOf, i as isVideo, O as OPEN_FILE, V as VIDEO_HEAD, s as shellError, v as videoType, a as readWrittenBytes, b as readFileBytes, d as isPdf, e as attachmentHeader } from './files.mjs';
|
|
3
3
|
import { spawn } from 'node:child_process';
|
|
4
4
|
import crypto from 'node:crypto';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { execFile } from 'node:child_process';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
+
import { H as HerdrError, ac as DATA_DIR, aJ as shq } from '../nitro/nitro.mjs';
|
|
3
4
|
import { r as resolveAgentPath, p as posixResolve } from './filePaths.mjs';
|
|
4
5
|
import { g as gitToplevel } from './changes.mjs';
|
|
5
|
-
import { H as HerdrError } from '../nitro/nitro.mjs';
|
|
6
6
|
|
|
7
7
|
const MAX_ENTRIES = 2e3;
|
|
8
8
|
const TEXT_BYTES = 256 * 1024;
|
|
@@ -62,7 +62,17 @@ printf '=\\0'
|
|
|
62
62
|
[ "$#" -gt 0 ] || exit 0
|
|
63
63
|
if stat -f %z / >/dev/null 2>&1; then stat -f %z -- "$@"; else stat -c %s -- "$@"; fi 2>/dev/null
|
|
64
64
|
exit 0`;
|
|
65
|
+
const PROTECTED_HOME = [".ssh", ".config/herdr"];
|
|
66
|
+
const protectedDirs = (home) => [...home ? PROTECTED_HOME.map((d) => path.posix.join(posixResolve("/", home), d)) : [], path.resolve(DATA_DIR)];
|
|
67
|
+
const PROTECTED = `protected_path() {
|
|
68
|
+
for pp in ${PROTECTED_HOME.map((d) => `"$HOME/${d}"`).join(" ")} ${shq(path.resolve(DATA_DIR))}; do
|
|
69
|
+
pd=$(cd "$pp" 2>/dev/null && pwd -P) || continue
|
|
70
|
+
case "$1/" in "\${pd%/}/"*) return 0 ;; esac
|
|
71
|
+
done
|
|
72
|
+
return 1
|
|
73
|
+
}`;
|
|
65
74
|
const OPEN_FILE = `${RESOLVE}
|
|
75
|
+
${PROTECTED}
|
|
66
76
|
case "$2" in */*) d=\${2%/*} ;; *) d=. ;; esac
|
|
67
77
|
b=\${2##*/}
|
|
68
78
|
dir=$(cd "$root" && cd -- "./$d" 2>/dev/null && pwd -P) || { echo "not found" >&2; exit 4; }
|
|
@@ -77,6 +87,7 @@ while [ -L "$f" ]; do
|
|
|
77
87
|
done
|
|
78
88
|
[ -e "$f" ] || { echo "not found" >&2; exit 4; }
|
|
79
89
|
under "$f" || { echo "outside" >&2; exit 5; }
|
|
90
|
+
protected_path "$f" && { echo "protected" >&2; exit 9; }
|
|
80
91
|
[ -f "$f" ] || { echo "not a file" >&2; exit 6; }
|
|
81
92
|
[ -r "$f" ] || { echo "permission denied" >&2; exit 7; }
|
|
82
93
|
command exec 3< "$f" || { echo "permission denied" >&2; exit 7; }
|
|
@@ -94,6 +105,7 @@ s=\${m#* }; s=$((\${s%% *}))
|
|
|
94
105
|
echo $s
|
|
95
106
|
[ -n "$4" ] && [ "$s" -ge "$3" ] && exit 0
|
|
96
107
|
head -c "$3" <&3`;
|
|
108
|
+
const PROTECTED_MESSAGE = "This file is protected: wherdr never shows its own data, ~/.ssh or ~/.config/herdr";
|
|
97
109
|
const MACOS_SSH_DENIED = "macOS blocks access to this folder. On the Mac: System Settings \u203A General \u203A Sharing \u203A Remote Login \u24D8 \u203A \u201CAllow full disk access for remote users\u201D.";
|
|
98
110
|
const MACOS_LOCAL_DENIED = "macOS blocks access to this folder. Allow the app that runs wherdr in System Settings \u203A Privacy & Security \u203A Full Disk Access.";
|
|
99
111
|
function executor(m, { timeoutMs = 15e3, maxBytes = IMAGE_BYTES } = {}) {
|
|
@@ -120,6 +132,7 @@ function shellError(m, code, stderr) {
|
|
|
120
132
|
if (r.code === 6) return new HerdrError("not_file", "Not a file");
|
|
121
133
|
if (r.code === 7) return new HerdrError("denied", "Permission denied");
|
|
122
134
|
if (r.code === 8) return new HerdrError("denied", m.exec ? MACOS_SSH_DENIED : MACOS_LOCAL_DENIED);
|
|
135
|
+
if (r.code === 9) return new HerdrError("protected", PROTECTED_MESSAGE);
|
|
123
136
|
if (r.code === 124) return new HerdrError("timeout", "The folder took too long to read");
|
|
124
137
|
if (r.code === 255 || r.code === null) return new HerdrError("unreachable", "Machine unreachable");
|
|
125
138
|
return new HerdrError("remote", r.stderr.trim().split("\n").pop() || `code ${r.code}`);
|
|
@@ -185,8 +198,14 @@ function writtenTarget(m, cwd, written) {
|
|
|
185
198
|
const root = posixResolve("/", m.home);
|
|
186
199
|
const rel = path.posix.relative(root, abs);
|
|
187
200
|
if (!rel) throw new HerdrError("not_file", "Not a file");
|
|
201
|
+
refuseProtected(m, abs);
|
|
188
202
|
return { root, rel, abs };
|
|
189
203
|
}
|
|
204
|
+
function refuseProtected(m, abs) {
|
|
205
|
+
for (const d of protectedDirs(m.home)) {
|
|
206
|
+
if (abs === d || abs.startsWith(d.replace(/\/+$/, "") + "/")) throw new HerdrError("protected", PROTECTED_MESSAGE);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
190
209
|
async function readHead(m, root, rel, max, opts) {
|
|
191
210
|
const out = await run(m, READ_SCRIPT, [root, rel, String(max), ...(opts == null ? void 0 : opts.whole) ? ["1"] : []], opts);
|
|
192
211
|
const nl = out.indexOf(10);
|
|
@@ -214,7 +233,9 @@ async function previewAt(m, root, rel, shown) {
|
|
|
214
233
|
async function readFilePreview(m, cwd, rel) {
|
|
215
234
|
const p = cleanRelative(rel);
|
|
216
235
|
if (!p) throw new HerdrError("not_file", "Not a file");
|
|
217
|
-
|
|
236
|
+
const root = await rootOf(m, cwd);
|
|
237
|
+
refuseProtected(m, path.posix.join(root, p));
|
|
238
|
+
return previewAt(m, root, p, p);
|
|
218
239
|
}
|
|
219
240
|
async function readWrittenPreview(m, cwd, written) {
|
|
220
241
|
const t = writtenTarget(m, cwd, written);
|
|
@@ -228,7 +249,9 @@ async function bytesAt(m, root, rel) {
|
|
|
228
249
|
async function readFileBytes(m, cwd, rel) {
|
|
229
250
|
const p = cleanRelative(rel);
|
|
230
251
|
if (!p) throw new HerdrError("not_file", "Not a file");
|
|
231
|
-
|
|
252
|
+
const root = await rootOf(m, cwd);
|
|
253
|
+
refuseProtected(m, path.posix.join(root, p));
|
|
254
|
+
return bytesAt(m, root, p);
|
|
232
255
|
}
|
|
233
256
|
async function readWrittenBytes(m, cwd, written) {
|
|
234
257
|
const t = writtenTarget(m, cwd, written);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { randomUUID } from 'node:crypto';
|
|
4
|
-
import {
|
|
4
|
+
import { aU as baseMachines, ac as DATA_DIR } from '../nitro/nitro.mjs';
|
|
5
5
|
|
|
6
6
|
function cleanMachineOrder(value, known) {
|
|
7
7
|
if (!Array.isArray(value)) return [];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { b7 as HOST_LABEL, ac as DATA_DIR } from '../nitro/nitro.mjs';
|
|
4
4
|
|
|
5
5
|
const ONBOARDING_FILE = path.join(DATA_DIR, "onboarding.json");
|
|
6
6
|
function readOnboarding(file = ONBOARDING_FILE, host = HOST_LABEL) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { B as machineFor, ba as herdrOn, H as HerdrError, f as findPane, bb as splitId, bc as getState, an as log, a5 as sleep } from '../nitro/nitro.mjs';
|
|
2
2
|
|
|
3
3
|
const PLUGIN_ID_RE = /^[A-Za-z0-9.:_-]{1,100}$/;
|
|
4
4
|
const ACTION_ID_RE = /^[A-Za-z0-9:_-]{1,100}$/;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { H as HerdrError,
|
|
1
|
+
import { H as HerdrError, ag as paneForeground, ah as codexMenuOpen, ai as stopAgent, aj as terminalUpdateLine, ak as waitFor, al as terminalUpdateDone, am as startAgent, a5 as sleep, f as findPane, a2 as restarts, an as log, Y as withPaneLock, ao as RESTARTABLE, J as transcripts, ap as claudeFooterMode, aq as planRestart, h as herdr, p as poll } from '../nitro/nitro.mjs';
|
|
2
2
|
import crypto from 'node:crypto';
|
|
3
3
|
|
|
4
4
|
const TERM_UPDATE_MS = 10 * 6e4;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { m as dropAllSubs } from '../nitro/nitro.mjs';
|
|
2
|
+
import { r as revalidatePeers } from './ws.mjs';
|
|
3
|
+
|
|
4
|
+
async function revokeEverywhere(peers) {
|
|
5
|
+
await dropAllSubs();
|
|
6
|
+
return peers ? revalidatePeers(peers) : revalidatePeers();
|
|
7
|
+
}
|
|
8
|
+
const PUSH_RESUBSCRIBE = JSON.stringify({ type: "push-resubscribe" });
|
|
9
|
+
function askPushResubscribe(clients) {
|
|
10
|
+
let asked = 0;
|
|
11
|
+
for (const c of clients) {
|
|
12
|
+
try {
|
|
13
|
+
c.send(PUSH_RESUBSCRIBE);
|
|
14
|
+
asked++;
|
|
15
|
+
} catch {
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return asked;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export { askPushResubscribe as a, revokeEverywhere as r };
|
|
22
|
+
//# sourceMappingURL=revoke.mjs.map
|
|
@@ -3,7 +3,7 @@ import fs from 'node:fs';
|
|
|
3
3
|
import os from 'node:os';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import { p as pkg } from './package.mjs';
|
|
6
|
-
import {
|
|
6
|
+
import { cE as installMode, H as HerdrError, an as log, cH as oneTapMode, cL as updateRunning, cJ as majorOf } from '../nitro/nitro.mjs';
|
|
7
7
|
import { c as checkUpdate, R as REPO } from './updates.mjs';
|
|
8
8
|
|
|
9
9
|
function wherdrDir(env = process.env) {
|
|
@@ -23,6 +23,7 @@ function buildPlan(o) {
|
|
|
23
23
|
if (!oneTapMode(o.mode)) throw new HerdrError("update_manual", "This installation cannot update itself: run the update command");
|
|
24
24
|
if (updateRunning(o.job, o.now)) throw new HerdrError("update_running", "An update is already in progress");
|
|
25
25
|
if (!o.latest || o.to !== o.latest) throw new HerdrError("update_version", "No newer version to install");
|
|
26
|
+
if (majorOf(o.latest) !== majorOf(o.current)) throw new HerdrError("update_major", `wherdr ${o.latest} is a new major version: it installs beside this one, see its migration guide`);
|
|
26
27
|
return {
|
|
27
28
|
kind: o.mode,
|
|
28
29
|
from: o.current,
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { a9 as getMachine, H as HerdrError, ac as DATA_DIR, ad as RemoteMachine, ae as HERDR_BIN } from '../nitro/nitro.mjs';
|
|
4
|
+
|
|
5
|
+
const SPLIT_TERMINAL_TOKEN = "wherdr_split_terminal";
|
|
6
|
+
const SPLIT_PROMPT_TOKEN = "wherdr_split_prompt";
|
|
7
|
+
const quote = (s) => `'${s.replace(/'/g, `'\\''`)}'`;
|
|
8
|
+
function splitShellHooks(binary, session) {
|
|
9
|
+
const report = `${quote(binary)} --session ${quote(session)} pane report-metadata "$HERDR_PANE_ID" --source wherdr-split`;
|
|
10
|
+
const busy = `${report} --clear-token ${SPLIT_PROMPT_TOKEN} >/dev/null 2>&1`;
|
|
11
|
+
const ready = `${report} --token "${SPLIT_PROMPT_TOKEN}=$$" >/dev/null 2>&1`;
|
|
12
|
+
return {
|
|
13
|
+
bash: `if (( BASH_VERSINFO[0] > 4 || (BASH_VERSINFO[0] == 4 && BASH_VERSINFO[1] >= 4) )); then PS0=${quote(`$(${busy})`)}; ${ready}; fi`,
|
|
14
|
+
zsh: `_wherdr_split_busy() { ${busy}; }
|
|
15
|
+
_wherdr_split_ready() { ${ready}; }
|
|
16
|
+
preexec_functions+=(_wherdr_split_busy)
|
|
17
|
+
precmd_functions+=(_wherdr_split_ready)
|
|
18
|
+
`
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async function prepareSplitShell(machine) {
|
|
22
|
+
const m = getMachine(machine);
|
|
23
|
+
if (!m) throw new HerdrError("bad_machine", "Unknown machine");
|
|
24
|
+
const dir = m.local ? path.join(DATA_DIR, "split-shell") : path.posix.join(m.home, ".cache/herdr-web/split-shell");
|
|
25
|
+
const hooks = splitShellHooks(m instanceof RemoteMachine ? m.bin : HERDR_BIN, m.session);
|
|
26
|
+
const zshenv = 'unset ZDOTDIR\n[[ -f "$HOME/.zshenv" ]] && source "$HOME/.zshenv"\nexport WHERDR_SPLIT_USER_ZDOTDIR=${ZDOTDIR:-$HOME}\nexport ZDOTDIR=$WHERDR_SPLIT_BOOTSTRAP\n';
|
|
27
|
+
const zprofile = 'ZDOTDIR=$WHERDR_SPLIT_USER_ZDOTDIR\n[[ -f "$ZDOTDIR/.zprofile" ]] && source "$ZDOTDIR/.zprofile"\nexport WHERDR_SPLIT_USER_ZDOTDIR=${ZDOTDIR:-$HOME}\nexport ZDOTDIR=$WHERDR_SPLIT_BOOTSTRAP\n';
|
|
28
|
+
const zshrc = 'ZDOTDIR=$WHERDR_SPLIT_USER_ZDOTDIR\n[[ -f "$ZDOTDIR/.zshrc" ]] && source "$ZDOTDIR/.zshrc"\n' + hooks.zsh;
|
|
29
|
+
if (m.exec) {
|
|
30
|
+
const r = await m.exec('umask 077; mkdir -p "$1" && printf %s "$2" > "$1/.zshenv" && printf %s "$3" > "$1/.zshrc" && printf %s "$4" > "$1/.zprofile"', [dir, zshenv, zshrc, zprofile], { timeoutMs: 5e3 });
|
|
31
|
+
if (r.code !== 0) throw new HerdrError("split_failed", "Could not prepare the split terminal. No command was sent.");
|
|
32
|
+
} else {
|
|
33
|
+
await fs.mkdir(dir, { recursive: true, mode: 448 });
|
|
34
|
+
await fs.writeFile(path.join(dir, ".zshenv"), zshenv, { mode: 384 });
|
|
35
|
+
await fs.writeFile(path.join(dir, ".zshrc"), zshrc, { mode: 384 });
|
|
36
|
+
await fs.writeFile(path.join(dir, ".zprofile"), zprofile, { mode: 384 });
|
|
37
|
+
}
|
|
38
|
+
return { PROMPT_COMMAND: hooks.bash, ZDOTDIR: dir, WHERDR_SPLIT_BOOTSTRAP: dir };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { SPLIT_PROMPT_TOKEN as S, SPLIT_TERMINAL_TOKEN as a, prepareSplitShell as p };
|
|
42
|
+
//# sourceMappingURL=splitShell.mjs.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { p as pkg } from './package.mjs';
|
|
2
|
-
import {
|
|
2
|
+
import { cE as installMode, cF as updateCommand, cG as releaseBranch, cH as oneTapMode, cI as compareVersions, cJ as majorOf, cK as majorMove } from '../nitro/nitro.mjs';
|
|
3
3
|
|
|
4
4
|
const REPO = "afloury/wherdr";
|
|
5
5
|
const RELEASES_URL = `https://api.github.com/repos/${REPO}/releases?per_page=100`;
|
|
@@ -9,6 +9,7 @@ function createUpdateChecker(opts) {
|
|
|
9
9
|
var _a;
|
|
10
10
|
const now = (_a = opts.now) != null ? _a : Date.now;
|
|
11
11
|
let cached = null;
|
|
12
|
+
let nextMajor = null;
|
|
12
13
|
let nextAt = 0;
|
|
13
14
|
let pending = null;
|
|
14
15
|
async function refresh() {
|
|
@@ -17,9 +18,21 @@ function createUpdateChecker(opts) {
|
|
|
17
18
|
const res = await opts.fetch(RELEASES_URL);
|
|
18
19
|
if (!res.ok) throw new Error("http");
|
|
19
20
|
const releases = await res.json();
|
|
20
|
-
const
|
|
21
|
+
const all = releases.filter((r) => !r.draft && !r.prerelease && /^v\d+\.\d+\.\d+$/.test(String(r.tag_name))).sort((a, b) => compareVersions(String(b.tag_name), String(a.tag_name)));
|
|
22
|
+
const major = majorOf(opts.current);
|
|
23
|
+
const next = all.find((r) => {
|
|
24
|
+
var _a3;
|
|
25
|
+
return ((_a3 = majorOf(String(r.tag_name))) != null ? _a3 : 0) > (major != null ? major : Infinity);
|
|
26
|
+
});
|
|
27
|
+
nextMajor = next ? majorMove(REPO, String(next.tag_name).replace(/^v/, ""), typeof next.html_url === "string" ? next.html_url : "") : null;
|
|
28
|
+
const stable = all.filter((r) => majorOf(String(r.tag_name)) === major);
|
|
21
29
|
const body = stable[0];
|
|
22
|
-
if (!body
|
|
30
|
+
if (!body) {
|
|
31
|
+
cached != null ? cached : cached = { version: opts.current, url: "", missed: [], truncated: false };
|
|
32
|
+
nextAt = now() + DAY_MS;
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
if (typeof body.tag_name !== "string") throw new Error("tag");
|
|
23
36
|
const missed = [...new Set(stable.map((r) => String(r.tag_name).replace(/^v/, "")))].filter((version) => compareVersions(version, opts.current) > 0);
|
|
24
37
|
const candidate = {
|
|
25
38
|
version: body.tag_name.replace(/^v/, ""),
|
|
@@ -66,7 +79,7 @@ function createUpdateChecker(opts) {
|
|
|
66
79
|
}
|
|
67
80
|
return async function check() {
|
|
68
81
|
const mode = installMode(opts.env.WHERDR_INSTALL);
|
|
69
|
-
const base = { current: opts.current, mode, command: updateCommand(mode, REPO), oneTap: oneTapMode(mode), behind: 0, missed: [], behindAtLeast: false };
|
|
82
|
+
const base = { current: opts.current, mode, command: updateCommand(mode, REPO, releaseBranch(opts.current)), oneTap: oneTapMode(mode), behind: 0, missed: [], behindAtLeast: false };
|
|
70
83
|
if (String(opts.env.WHERDR_UPDATE_CHECK || "").toLowerCase() === "off") return { ...base, latest: null, url: null, checked: false };
|
|
71
84
|
if (now() >= nextAt) {
|
|
72
85
|
pending != null ? pending : pending = refresh().finally(() => {
|
|
@@ -80,6 +93,7 @@ function createUpdateChecker(opts) {
|
|
|
80
93
|
latest: newer ? cached.version : null,
|
|
81
94
|
url: newer ? cached.url || null : null,
|
|
82
95
|
checked: !!cached,
|
|
96
|
+
nextMajor,
|
|
83
97
|
...newer ? { behind: cached.missed.length, missed: cached.missed.slice(0, 5), behindAtLeast: cached.truncated } : {}
|
|
84
98
|
};
|
|
85
99
|
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { U as UPLOAD_DIR, S as uploadNames } from '../nitro/nitro.mjs';
|
|
5
|
+
|
|
6
|
+
const UPLOAD_PATH = /\.cache\/herdr-web\/uploads\/([\w-]+\.[a-z]+)/g;
|
|
7
|
+
const CACHE_MAX = 500;
|
|
8
|
+
const cache = /* @__PURE__ */ new Map();
|
|
9
|
+
async function uploadHash(dir, name) {
|
|
10
|
+
const key = `${dir}
|
|
11
|
+
${name}`;
|
|
12
|
+
if (cache.has(key)) return cache.get(key);
|
|
13
|
+
let hash = null;
|
|
14
|
+
try {
|
|
15
|
+
hash = createHash("sha256").update(await fs.readFile(path.join(dir, path.basename(name)))).digest("hex");
|
|
16
|
+
} catch {
|
|
17
|
+
hash = null;
|
|
18
|
+
}
|
|
19
|
+
if (cache.size >= CACHE_MAX) cache.delete(cache.keys().next().value);
|
|
20
|
+
cache.set(key, hash);
|
|
21
|
+
return hash;
|
|
22
|
+
}
|
|
23
|
+
async function addUploadHashes(items, dir = UPLOAD_DIR) {
|
|
24
|
+
var _a;
|
|
25
|
+
for (const it of items) {
|
|
26
|
+
if (it.role === "user") {
|
|
27
|
+
const names = uploadNames(it.text);
|
|
28
|
+
if (!names.length) continue;
|
|
29
|
+
const own = (await Promise.all(names.map((n) => uploadHash(dir, n)))).filter((h) => !!h);
|
|
30
|
+
const hashes = [...it.hashes || [], ...own.filter((h) => {
|
|
31
|
+
var _a2;
|
|
32
|
+
return !((_a2 = it.hashes) == null ? void 0 : _a2.includes(h));
|
|
33
|
+
})];
|
|
34
|
+
if (hashes.length) it.hashes = hashes;
|
|
35
|
+
} else if (it.images === 1) {
|
|
36
|
+
const names = [...new Set([...`${it.text}
|
|
37
|
+
${((_a = it.omp) == null ? void 0 : _a.target) || ""}`.matchAll(UPLOAD_PATH)].map((m) => m[1]))];
|
|
38
|
+
if (names.length !== 1) continue;
|
|
39
|
+
const h = await uploadHash(dir, names[0]);
|
|
40
|
+
if (h) it.hashes = [h];
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { addUploadHashes as a };
|
|
46
|
+
//# sourceMappingURL=uploadHashes.mjs.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { cM as allMachines, a9 as getMachine, H as HerdrError, bb as splitId, ba as herdrOn, p as poll, aA as recentDirs, c9 as joinId, bc as getState } from '../nitro/nitro.mjs';
|
|
2
2
|
|
|
3
3
|
const opts = { trust_repository: true };
|
|
4
4
|
async function machineWorktrees(m) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { n as networkReady, o as ensureFresh, q as gateDecision, t as sameOrigin, u as hostAllowed, k as auth, v as checkRequestClient, x as onNetworkReading } from '../nitro/nitro.mjs';
|
|
2
2
|
|
|
3
3
|
var _a, _b;
|
|
4
4
|
const WS_MAX = 256 * 1024;
|
|
@@ -11,7 +11,7 @@ function headersOf(h) {
|
|
|
11
11
|
}
|
|
12
12
|
function upgradeVerdict(headers, remoteAddress) {
|
|
13
13
|
return gateDecision({
|
|
14
|
-
check: checkRequestClient(remoteAddress, headers),
|
|
14
|
+
check: checkRequestClient(remoteAddress, headers, auth.isEnabled()),
|
|
15
15
|
unlocked: auth.isUnlocked({ headers }),
|
|
16
16
|
hostOk: hostAllowed(headers.host),
|
|
17
17
|
crossSite: !sameOrigin(headers),
|
|
@@ -90,5 +90,5 @@ function messageText(message) {
|
|
|
90
90
|
return t.length > WS_MAX ? null : t;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
export { checkUpgrade as c, isOpen as i, messageText as m, unwatchPeer as u, watchPeer as w };
|
|
93
|
+
export { checkUpgrade as c, isOpen as i, messageText as m, revalidatePeers as r, unwatchPeer as u, watchPeer as w };
|
|
94
94
|
//# sourceMappingURL=ws.mjs.map
|