wherdr 0.0.0-stage → 1.2.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 +15 -0
- package/.output/public/_nuxt/AgentView.DE2GDt4O.css +1 -0
- package/.output/public/_nuxt/BDI8xNSb.js +2 -0
- package/.output/public/_nuxt/BDNMzG2s.js +1 -0
- package/.output/public/_nuxt/BIA9pZvC.js +1 -0
- package/.output/public/_nuxt/Bd17z0YL.js +2 -0
- package/.output/public/_nuxt/BevNMnQ2.js +83 -0
- package/.output/public/_nuxt/BpQH8Ho1.js +1 -0
- package/.output/public/_nuxt/Bta8at9w.js +6 -0
- package/.output/public/_nuxt/CA9mI3eg.js +23 -0
- package/.output/public/_nuxt/CWwyK2XK.js +2 -0
- package/.output/public/_nuxt/CXG-cOdh.js +1 -0
- package/.output/public/_nuxt/Ci8N4mWR.js +1 -0
- package/.output/public/_nuxt/CjKICX3g.js +17 -0
- package/.output/public/_nuxt/D903WmCE.js +65 -0
- package/.output/public/_nuxt/DBu2-cEy.js +30 -0
- package/.output/public/_nuxt/DJE_XMLO.js +1 -0
- package/.output/public/_nuxt/DLLQgP0d.js +1 -0
- package/.output/public/_nuxt/DxO1TBoK.js +1 -0
- package/.output/public/_nuxt/SiL1FJ5s.js +3 -0
- package/.output/public/_nuxt/archivo-latin-ext-wght-normal.C4zznr8T.woff2 +0 -0
- package/.output/public/_nuxt/archivo-latin-wght-normal.E0tuGl4L.woff2 +0 -0
- package/.output/public/_nuxt/archivo-vietnamese-wght-normal.XAtsl5Q_.woff2 +0 -0
- package/.output/public/_nuxt/bLP7Jj-b.js +1 -0
- package/.output/public/_nuxt/builds/latest.json +1 -0
- package/.output/public/_nuxt/builds/meta/211609c0-be04-46c5-a6b0-566bc0c4a3dd.json +1 -0
- package/.output/public/_nuxt/e5N4AqCN.js +93 -0
- package/.output/public/_nuxt/entry.SHBiCXBL.css +2 -0
- package/.output/public/_nuxt/error-404.Bb87HomL.css +1 -0
- package/.output/public/_nuxt/error-500.Bwd7zAaE.css +1 -0
- package/.output/public/_nuxt/inter-cyrillic-ext-wght-normal.BOeWTOD4.woff2 +0 -0
- package/.output/public/_nuxt/inter-cyrillic-wght-normal.DqGufNeO.woff2 +0 -0
- package/.output/public/_nuxt/inter-greek-ext-wght-normal.DlzME5K_.woff2 +0 -0
- package/.output/public/_nuxt/inter-greek-wght-normal.CkhJZR-_.woff2 +0 -0
- package/.output/public/_nuxt/inter-latin-ext-wght-normal.DO1Apj_S.woff2 +0 -0
- package/.output/public/_nuxt/inter-latin-wght-normal.Dx4kXJAl.woff2 +0 -0
- package/.output/public/_nuxt/inter-vietnamese-wght-normal.CBcvBZtf.woff2 +0 -0
- package/.output/public/_nuxt/jetbrains-mono-cyrillic-wght-normal.D73BlboJ.woff2 +0 -0
- package/.output/public/_nuxt/jetbrains-mono-greek-wght-normal.Bw9x6K1M.woff2 +0 -0
- package/.output/public/_nuxt/jetbrains-mono-latin-ext-wght-normal.DBQx-q_a.woff2 +0 -0
- package/.output/public/_nuxt/jetbrains-mono-latin-wght-normal.B9CIFXIH.woff2 +0 -0
- package/.output/public/_nuxt/jetbrains-mono-vietnamese-wght-normal.Bt-aOZkq.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-nerd-awesome.DQ3_iAfa.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-nerd-codicons.CtEsfSAf.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-nerd-devicons.ZMSFX1sW.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-nerd-extension.Dai_ky39.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-nerd-material-1.BdvqkCqW.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-nerd-material-2.C_flbBWO.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-nerd-material-3.8xz7iX-Y.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-nerd-material-4.CO_PudDR.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-nerd-octicons.Hl4VEx8m.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-nerd-powerline.B_kAMxXr.woff2 +0 -0
- package/.output/public/_nuxt/wherdr-symbols.C1LsPKmg.woff2 +0 -0
- package/.output/public/_nuxt/yzABg5xl.js +1 -0
- package/.output/public/manifest-en.webmanifest +18 -0
- package/.output/public/manifest.webmanifest +18 -0
- package/.output/public/sw.js +99 -0
- package/.output/server/chunks/_/awake.mjs +170 -0
- package/.output/server/chunks/_/branding.mjs +28 -0
- package/.output/server/chunks/_/changes.mjs +199 -0
- package/.output/server/chunks/_/error-500.mjs +20 -0
- package/.output/server/chunks/_/machineOrder.mjs +40 -0
- package/.output/server/chunks/_/onboarding.mjs +26 -0
- package/.output/server/chunks/_/phone.mjs +343 -0
- package/.output/server/chunks/_/plugins.mjs +248 -0
- package/.output/server/chunks/_/projectBoard.mjs +275 -0
- package/.output/server/chunks/_/projectsActions.mjs +143 -0
- package/.output/server/chunks/_/projectsPlugin.mjs +56 -0
- package/.output/server/chunks/_/restart.mjs +459 -0
- package/.output/server/chunks/_/reveal.mjs +137 -0
- package/.output/server/chunks/_/worktrees.mjs +74 -0
- package/.output/server/chunks/_/ws.mjs +57 -0
- package/.output/server/chunks/nitro/nitro.mjs +20691 -0
- package/.output/server/chunks/raw/apple-touch-icon.mjs +7 -0
- package/.output/server/chunks/raw/build-nerd-font.mjs +7 -0
- package/.output/server/chunks/raw/build-terminal-font.mjs +7 -0
- package/.output/server/chunks/raw/check-leaks.mjs +5 -0
- package/.output/server/chunks/raw/dev.wherdr.open.mjs +7 -0
- package/.output/server/chunks/raw/docker-entrypoint.mjs +7 -0
- package/.output/server/chunks/raw/favicon-32.mjs +7 -0
- package/.output/server/chunks/raw/favicon.mjs +7 -0
- package/.output/server/chunks/raw/herdr-plugin.mjs +7 -0
- package/.output/server/chunks/raw/icon-192.mjs +7 -0
- package/.output/server/chunks/raw/icon-512-maskable.mjs +7 -0
- package/.output/server/chunks/raw/icon-512.mjs +7 -0
- package/.output/server/chunks/raw/icon-maskable.mjs +7 -0
- package/.output/server/chunks/raw/icon.mjs +7 -0
- package/.output/server/chunks/raw/install-claude-statusline.mjs +7 -0
- package/.output/server/chunks/raw/install-host-open.mjs +7 -0
- package/.output/server/chunks/raw/pack-output.mjs +5 -0
- package/.output/server/chunks/raw/reveal.mjs +7 -0
- package/.output/server/chunks/raw/wherdr-open.mjs +7 -0
- package/.output/server/chunks/routes/api/_..._.mjs +30 -0
- package/.output/server/chunks/routes/api/agents.post.mjs +30 -0
- package/.output/server/chunks/routes/api/ask-tab.post.mjs +49 -0
- package/.output/server/chunks/routes/api/attach.post.mjs +35 -0
- package/.output/server/chunks/routes/api/auth/disable.post.mjs +30 -0
- package/.output/server/chunks/routes/api/auth/lock-all.post.mjs +30 -0
- package/.output/server/chunks/routes/api/auth/lock.post.mjs +30 -0
- package/.output/server/chunks/routes/api/auth/login/options.post.mjs +30 -0
- package/.output/server/chunks/routes/api/auth/login/verify.post.mjs +30 -0
- package/.output/server/chunks/routes/api/auth/max-session.post.mjs +30 -0
- package/.output/server/chunks/routes/api/auth/register/options.post.mjs +30 -0
- package/.output/server/chunks/routes/api/auth/register/verify.post.mjs +30 -0
- package/.output/server/chunks/routes/api/auth/status.get.mjs +33 -0
- package/.output/server/chunks/routes/api/changes.get.mjs +38 -0
- package/.output/server/chunks/routes/api/chat/image.get.mjs +40 -0
- package/.output/server/chunks/routes/api/chat.get.mjs +93 -0
- package/.output/server/chunks/routes/api/choose.post.mjs +135 -0
- package/.output/server/chunks/routes/api/claude-statusline.post.mjs +35 -0
- package/.output/server/chunks/routes/api/close/status.get.mjs +36 -0
- package/.output/server/chunks/routes/api/close.post.mjs +37 -0
- package/.output/server/chunks/routes/api/codex-update.post.mjs +41 -0
- package/.output/server/chunks/routes/api/commands.get.mjs +42 -0
- package/.output/server/chunks/routes/api/config.get.mjs +86 -0
- package/.output/server/chunks/routes/api/dirs.get.mjs +33 -0
- package/.output/server/chunks/routes/api/dismiss.post.mjs +33 -0
- package/.output/server/chunks/routes/api/effort.post.mjs +36 -0
- package/.output/server/chunks/routes/api/efforts.get.mjs +37 -0
- package/.output/server/chunks/routes/api/file.post.mjs +34 -0
- package/.output/server/chunks/routes/api/gitroot.get.mjs +37 -0
- package/.output/server/chunks/routes/api/index.get.mjs +36 -0
- package/.output/server/chunks/routes/api/input.post.mjs +43 -0
- package/.output/server/chunks/routes/api/interrupt.post.mjs +48 -0
- package/.output/server/chunks/routes/api/isgit.get.mjs +37 -0
- package/.output/server/chunks/routes/api/machine/awake.get.mjs +39 -0
- package/.output/server/chunks/routes/api/machine/awake.post.mjs +40 -0
- package/.output/server/chunks/routes/api/machine/order.get.mjs +31 -0
- package/.output/server/chunks/routes/api/machine/order.post.mjs +36 -0
- package/.output/server/chunks/routes/api/machine/rename.post.mjs +39 -0
- package/.output/server/chunks/routes/api/menu.post.mjs +76 -0
- package/.output/server/chunks/routes/api/model.post.mjs +36 -0
- package/.output/server/chunks/routes/api/models.get.mjs +35 -0
- package/.output/server/chunks/routes/api/nav.post.mjs +58 -0
- package/.output/server/chunks/routes/api/onboarding.get.mjs +31 -0
- package/.output/server/chunks/routes/api/onboarding.post.mjs +34 -0
- package/.output/server/chunks/routes/api/phone.get.mjs +38 -0
- package/.output/server/chunks/routes/api/phone.post.mjs +38 -0
- package/.output/server/chunks/routes/api/plugins/actions.get.mjs +36 -0
- package/.output/server/chunks/routes/api/plugins/invoke.post.mjs +33 -0
- package/.output/server/chunks/routes/api/plugins/profiles.get.mjs +35 -0
- package/.output/server/chunks/routes/api/plugins/projects.get.mjs +37 -0
- package/.output/server/chunks/routes/api/plugins/projects.post.mjs +37 -0
- package/.output/server/chunks/routes/api/plugins/thread-limits.get.mjs +30 -0
- package/.output/server/chunks/routes/api/plugins/thread-limits.post.mjs +40 -0
- package/.output/server/chunks/routes/api/project/report.get.mjs +36 -0
- package/.output/server/chunks/routes/api/prompt.post.mjs +87 -0
- package/.output/server/chunks/routes/api/push/quiet.post.mjs +49 -0
- package/.output/server/chunks/routes/api/push/subscribe.post.mjs +51 -0
- package/.output/server/chunks/routes/api/push/test.post.mjs +32 -0
- package/.output/server/chunks/routes/api/push/unsubscribe.post.mjs +34 -0
- package/.output/server/chunks/routes/api/quotas.get.mjs +30 -0
- package/.output/server/chunks/routes/api/rename.post.mjs +36 -0
- package/.output/server/chunks/routes/api/requeue.post.mjs +34 -0
- package/.output/server/chunks/routes/api/restart.get.mjs +38 -0
- package/.output/server/chunks/routes/api/restart.post.mjs +39 -0
- package/.output/server/chunks/routes/api/reveal.post.mjs +31 -0
- package/.output/server/chunks/routes/api/screen-key.post.mjs +41 -0
- package/.output/server/chunks/routes/api/screen.get.mjs +76 -0
- package/.output/server/chunks/routes/api/search.get.mjs +76 -0
- package/.output/server/chunks/routes/api/seen.post.mjs +33 -0
- package/.output/server/chunks/routes/api/sessions.get.mjs +33 -0
- package/.output/server/chunks/routes/api/sessions.post.mjs +33 -0
- package/.output/server/chunks/routes/api/space.post.mjs +258 -0
- package/.output/server/chunks/routes/api/state.get.mjs +30 -0
- package/.output/server/chunks/routes/api/unqueue.post.mjs +35 -0
- package/.output/server/chunks/routes/api/update.get.mjs +78 -0
- package/.output/server/chunks/routes/api/upload.post.mjs +33 -0
- package/.output/server/chunks/routes/api/worktrees/remove.post.mjs +34 -0
- package/.output/server/chunks/routes/api/worktrees.get.mjs +31 -0
- package/.output/server/chunks/routes/favicon.ico.get.mjs +31 -0
- package/.output/server/chunks/routes/icons/_name_.get.mjs +31 -0
- package/.output/server/chunks/routes/renderer.mjs +358 -0
- package/.output/server/chunks/routes/uploads/_...name_.get.mjs +39 -0
- package/.output/server/chunks/routes/ws/_..._.mjs +32 -0
- package/.output/server/chunks/routes/ws/events.mjs +57 -0
- package/.output/server/chunks/routes/ws/mirror.mjs +157 -0
- package/.output/server/chunks/routes/ws/term.mjs +151 -0
- package/.output/server/chunks/virtual/_raw-helpers.mjs +12 -0
- package/.output/server/chunks/virtual/_virtual_spa-template.mjs +4 -0
- package/.output/server/chunks/virtual/precomputed.mjs +4 -0
- package/.output/server/index.mjs +26 -0
- package/.output/server/node_modules/@babel/parser/lib/index.js +14616 -0
- package/.output/server/node_modules/@babel/parser/package.json +50 -0
- package/.output/server/node_modules/@hexagon/base64/package.json +73 -0
- package/.output/server/node_modules/@hexagon/base64/src/base64.js +190 -0
- package/.output/server/node_modules/@levischuck/tiny-cbor/esm/cbor/cbor.js +440 -0
- package/.output/server/node_modules/@levischuck/tiny-cbor/esm/cbor/cbor_internal.js +111 -0
- package/.output/server/node_modules/@levischuck/tiny-cbor/esm/index.js +1 -0
- package/.output/server/node_modules/@levischuck/tiny-cbor/esm/package.json +3 -0
- package/.output/server/node_modules/@levischuck/tiny-cbor/package.json +25 -0
- package/.output/server/node_modules/@peculiar/asn1-android/build/es2015/attestation.js +34 -0
- package/.output/server/node_modules/@peculiar/asn1-android/build/es2015/index.js +3 -0
- package/.output/server/node_modules/@peculiar/asn1-android/build/es2015/key_description.js +512 -0
- package/.output/server/node_modules/@peculiar/asn1-android/build/es2015/nonstandard.js +103 -0
- package/.output/server/node_modules/@peculiar/asn1-android/build/es2015/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-android/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-android/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-android/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-android/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-android/package.json +64 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/attribute.js +22 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/attributes/counter_signature.js +13 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/attributes/index.js +8 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/attributes/message_digest.js +8 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/attributes/signing_time.js +13 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/certificate_choices.js +64 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/content_info.js +22 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/encapsulated_content_info.js +40 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/encrypted_content_info.js +56 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/enveloped_data.js +60 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/index.js +24 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/issuer_and_serial_number.js +23 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/kek_recipient_info.js +53 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/key_agree_recipient_info.js +167 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/key_trans_recipient_info.js +51 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/object_identifiers.js +10 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/originator_info.js +31 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/other_key_attribute.js +22 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/password_recipient_info.js +32 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/recipient_info.js +75 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/recipient_infos.js +20 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/revocation_info_choice.js +54 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/signed_data.js +64 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/signer_identifier.js +28 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/signer_info.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/build/cjs/types.js +51 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-cms/package.json +65 -0
- package/.output/server/node_modules/@peculiar/asn1-csr/build/cjs/attributes.js +20 -0
- package/.output/server/node_modules/@peculiar/asn1-csr/build/cjs/certification_request.js +29 -0
- package/.output/server/node_modules/@peculiar/asn1-csr/build/cjs/certification_request_info.js +34 -0
- package/.output/server/node_modules/@peculiar/asn1-csr/build/cjs/index.js +6 -0
- package/.output/server/node_modules/@peculiar/asn1-csr/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-csr/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-csr/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-csr/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-csr/package.json +65 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/cjs/algorithms.js +14 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/cjs/ec_parameters.js +27 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/cjs/ec_private_key.js +36 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/cjs/ec_signature_value.js +25 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/cjs/index.js +9 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/cjs/object_identifiers.js +26 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/cjs/rfc3279.js +95 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/es2015/algorithms.js +10 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/es2015/ec_parameters.js +24 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/es2015/ec_private_key.js +32 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/es2015/ec_signature_value.js +21 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/es2015/index.js +6 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/es2015/object_identifiers.js +23 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/es2015/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/build/es2015/rfc3279.js +90 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-ecc/package.json +66 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/attribute.js +36 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/authenticated_safe.js +20 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/bags/cert_bag.js +26 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/bags/crl_bag.js +25 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/bags/index.js +9 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/bags/key_bag.js +12 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/bags/pkcs8_shrouded_key_bag.js +12 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/bags/secret_bag.js +22 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/bags/types.js +11 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/index.js +10 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/mac_data.js +27 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/object_identifiers.js +14 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/pfx.js +28 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/build/cjs/safe_bag.js +45 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-pfx/package.json +67 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs8/build/cjs/encrypted_private_key_info.js +23 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs8/build/cjs/index.js +5 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs8/build/cjs/private_key_info.js +54 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs8/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs8/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs8/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs8/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs8/package.json +63 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs9/build/cjs/index.js +301 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs9/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs9/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs9/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs9/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-pkcs9/package.json +67 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/cjs/algorithms.js +40 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/cjs/index.js +9 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/cjs/object_identifiers.js +28 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/cjs/other_prime_info.js +46 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/cjs/parameters/index.js +6 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/cjs/parameters/rsaes_oaep.js +45 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/cjs/parameters/rsassa_pkcs1_v1_5.js +20 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/cjs/parameters/rsassa_pss.js +53 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/cjs/rsa_private_key.js +79 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/cjs/rsa_public_key.js +25 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/algorithms.js +36 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/index.js +6 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/object_identifiers.js +25 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/other_prime_info.js +42 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/parameters/index.js +3 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/parameters/rsaes_oaep.js +41 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/parameters/rsassa_pkcs1_v1_5.js +16 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/parameters/rsassa_pss.js +49 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/rsa_private_key.js +75 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/build/es2015/rsa_public_key.js +21 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-rsa/package.json +64 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/convert.js +25 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/converters.js +148 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/decorators.js +52 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/enums.js +40 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/errors/index.js +4 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/errors/schema_validation.js +7 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/helper.js +44 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/index.js +22 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/objects.js +17 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/parser.js +313 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/schema.js +165 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/serializer.js +150 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/storage.js +5 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/types/bit_string.js +71 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/types/index.js +5 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/cjs/types/octet_string.js +45 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/convert.js +20 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/converters.js +143 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/decorators.js +43 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/enums.js +37 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/errors/index.js +1 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/errors/schema_validation.js +3 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/helper.js +39 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/index.js +9 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/objects.js +13 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/parser.js +308 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/schema.js +160 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/serializer.js +145 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/storage.js +2 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/types/bit_string.js +66 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/types/index.js +2 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/build/es2015/types/octet_string.js +40 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-schema/package.json +74 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/algorithm_identifier.js +28 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/attribute.js +22 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/certificate.js +29 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/certificate_list.js +29 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extension.js +41 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/authority_information_access.js +36 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/authority_key_identifier.js +48 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/basic_constraints.js +27 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/certificate_issuer.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/certificate_policies.js +136 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/crl_delta_indicator.js +14 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/crl_distribution_points.js +132 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/crl_freshest.js +22 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/crl_issuing_distribution_point.js +68 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/crl_number.js +20 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/crl_reason.js +39 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/entrust_version_info.js +46 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/extended_key_usage.js +28 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/index.js +28 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/inhibit_any_policy.js +23 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/invalidity_date.js +22 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/issuer_alternative_name.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/key_usage.js +56 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/name_constraints.js +74 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/policy_constraints.js +33 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/policy_mappings.js +35 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/private_key_usage_period.js +31 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/subject_alternative_name.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/subject_directory_attributes.js +22 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/subject_info_access.js +22 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/extensions/subject_key_identifier.js +9 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/general_name.js +132 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/general_names.js +20 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/index.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/ip_converter.js +177 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/name.js +110 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/object_identifiers.js +16 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/subject_public_key_info.js +20 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/tbs_cert_list.js +83 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/tbs_certificate.js +78 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/time.js +43 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/types.js +9 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/cjs/validity.js +23 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/algorithm_identifier.js +24 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/attribute.js +18 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/certificate.js +25 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/certificate_list.js +25 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extension.js +37 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/authority_information_access.js +32 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/authority_key_identifier.js +43 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/basic_constraints.js +23 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/certificate_issuer.js +16 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/certificate_policies.js +129 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/crl_delta_indicator.js +11 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/crl_distribution_points.js +127 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/crl_freshest.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/crl_issuing_distribution_point.js +64 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/crl_number.js +17 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/crl_reason.js +36 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/entrust_version_info.js +41 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/extended_key_usage.js +25 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/index.js +25 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/inhibit_any_policy.js +20 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/invalidity_date.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/issuer_alternative_name.js +16 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/key_usage.js +52 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/name_constraints.js +69 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/policy_constraints.js +29 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/policy_mappings.js +31 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/private_key_usage_period.js +27 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/subject_alternative_name.js +16 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/subject_directory_attributes.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/subject_info_access.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/extensions/subject_key_identifier.js +5 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/general_name.js +127 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/general_names.js +17 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/index.js +16 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/ip_converter.js +173 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/name.js +106 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/object_identifiers.js +13 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/subject_public_key_info.js +16 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/tbs_cert_list.js +78 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/tbs_certificate.js +74 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/time.js +40 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/types.js +6 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/build/es2015/validity.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-x509/package.json +64 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/aa_clear_attrs.js +27 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/aa_controls.js +44 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/attr_cert_issuer.js +31 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/attr_cert_validity_period.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/attr_spec.js +19 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/attribute_certificate.js +25 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/attribute_certificate_info.js +67 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/class_list.js +16 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/clearance.js +31 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/holder.js +41 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/ietf_attr_syntax.js +46 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/index.js +23 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/issuer_serial.js +30 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/object_digest_info.js +37 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/object_identifiers.js +17 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/proxy_info.js +20 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/role_syntax.js +29 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/security_category.js +27 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/svce_auth_info.js +27 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/target.js +79 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/build/cjs/v2_form.js +39 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/asn1-x509-attr/package.json +64 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/bytes/buffer-source.js +115 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/bytes/concat.js +41 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/bytes/equal.js +17 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/bytes/index.js +31 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/bytes/sequence.js +161 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/converters/convert.js +74 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/converters/defaults.js +72 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/converters/index.js +18 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/converters/registry.js +188 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/encoding/base64.js +48 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/encoding/base64url.js +26 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/encoding/binary.js +26 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/encoding/hex.js +229 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/encoding/index.js +10 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/encoding/utf16.js +24 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/encoding/utf8.js +13 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/index.js +10 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/legacy/buffer-source-converter.js +37 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/legacy/convert.js +72 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/legacy/functions.js +23 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/legacy/index.js +11 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/package.json +3 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/pem/index.js +14 -0
- package/.output/server/node_modules/@peculiar/utils/build/cjs/pem/pem.js +140 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/bytes/buffer-source.js +101 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/bytes/concat.js +37 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/bytes/equal.js +14 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/bytes/index.js +4 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/bytes/sequence.js +150 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/converters/convert.js +71 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/converters/defaults.js +68 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/converters/index.js +3 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/converters/registry.js +185 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/encoding/base64.js +40 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/encoding/base64url.js +19 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/encoding/binary.js +20 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/encoding/hex.js +220 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/encoding/index.js +6 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/encoding/utf16.js +19 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/encoding/utf8.js +8 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/index.js +6 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/legacy/buffer-source-converter.js +33 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/legacy/convert.js +68 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/legacy/functions.js +18 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/legacy/index.js +3 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/pem/index.js +1 -0
- package/.output/server/node_modules/@peculiar/utils/build/esm/pem/pem.js +129 -0
- package/.output/server/node_modules/@peculiar/utils/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/utils/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/utils/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/utils/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/utils/package.json +111 -0
- package/.output/server/node_modules/@peculiar/x509/build/x509.cjs.js +3445 -0
- package/.output/server/node_modules/@peculiar/x509/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/@peculiar/x509/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/@peculiar/x509/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/@peculiar/x509/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/@peculiar/x509/package.json +94 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/authentication/generateAuthenticationOptions.js +41 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/authentication/verifyAuthenticationResponse.js +171 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/convertAAGUIDToString.js +17 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/convertCOSEtoPKCS.js +21 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/convertCertBufferToPEM.js +31 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/convertPEMToBytes.js +11 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/convertX509PublicKeyToCOSE.js +73 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/cose.js +90 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/decodeAttestationObject.js +16 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/decodeAuthenticatorExtensions.js +34 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/decodeClientDataJSON.js +16 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/decodeCredentialPublicKey.js +11 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/fetch.js +14 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/generateChallenge.js +24 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/generateUserID.js +20 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/getCertificateInfo.js +77 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/index.js +17 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/isCertRevoked.js +96 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/index.js +11 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoBase64URL.js +72 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCBOR.js +35 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/digest.js +14 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/getRandomValues.js +11 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/getWebCrypto.js +49 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/importKey.js +8 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/index.js +7 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/mapCoseAlgToWebCryptoAlg.js +20 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/mapCoseAlgToWebCryptoKeyAlgName.js +19 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/unwrapEC2Signature.js +73 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/verify.js +32 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/verifyEC2.js +73 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/verifyOKP.js +51 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoCrypto/verifyRSA.js +91 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/iso/isoUint8Array.js +79 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/logging.js +19 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/mapJWSAlgToCOSEAlg.js +31 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/mapX509SignatureAlgToCOSEAlg.js +35 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/matchExpectedRPID.js +41 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/parseAuthenticatorData.js +106 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/parseBackupFlags.js +25 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/toHash.js +12 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/validateCertificatePath.js +134 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/validateExtFIDOGenCEAAGUID.js +34 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/helpers/verifySignature.js +35 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/index.js +8 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/metadata/mdsTypes.js +17 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/metadata/parseJWT.js +12 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/metadata/verifyAttestationWithMetadata.js +159 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/metadata/verifyJWT.js +42 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/metadata/verifyMDSBlob.js +59 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/package.json +3 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/generateRegistrationOptions.js +181 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/verifications/tpm/constants.js +137 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/verifications/tpm/parseCertInfo.js +58 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/verifications/tpm/parsePubArea.js +94 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/verifications/tpm/verifyAttestationTPM.js +331 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/verifications/verifyAttestationAndroidKey.js +120 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/verifications/verifyAttestationAndroidSafetyNet.js +113 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/verifications/verifyAttestationApple.js +58 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/verifications/verifyAttestationFIDOU2F.js +48 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/verifications/verifyAttestationPacked.js +113 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/registration/verifyRegistrationResponse.js +213 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/services/defaultRootCerts/android-key.js +171 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/services/defaultRootCerts/android-safetynet.js +32 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/services/defaultRootCerts/apple.js +25 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/services/defaultRootCerts/mds.js +74 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/services/metadataService.js +268 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/services/settingsService.js +74 -0
- package/.output/server/node_modules/@simplewebauthn/server/esm/types/index.js +1 -0
- package/.output/server/node_modules/@simplewebauthn/server/package.json +65 -0
- package/.output/server/node_modules/@vue/compiler-core/dist/compiler-core.cjs.prod.js +6801 -0
- package/.output/server/node_modules/@vue/compiler-core/package.json +58 -0
- package/.output/server/node_modules/@vue/compiler-dom/dist/compiler-dom.cjs.prod.js +692 -0
- package/.output/server/node_modules/@vue/compiler-dom/package.json +57 -0
- package/.output/server/node_modules/@vue/compiler-ssr/dist/compiler-ssr.cjs.js +1420 -0
- package/.output/server/node_modules/@vue/compiler-ssr/package.json +34 -0
- package/.output/server/node_modules/@vue/reactivity/dist/reactivity.cjs.prod.js +1905 -0
- package/.output/server/node_modules/@vue/reactivity/package.json +55 -0
- package/.output/server/node_modules/@vue/runtime-core/dist/runtime-core.cjs.prod.js +7006 -0
- package/.output/server/node_modules/@vue/runtime-core/package.json +52 -0
- package/.output/server/node_modules/@vue/runtime-dom/dist/runtime-dom.cjs.prod.js +1867 -0
- package/.output/server/node_modules/@vue/runtime-dom/package.json +60 -0
- package/.output/server/node_modules/@vue/server-renderer/dist/server-renderer.cjs.prod.js +904 -0
- package/.output/server/node_modules/@vue/server-renderer/package.json +53 -0
- package/.output/server/node_modules/@vue/shared/dist/shared.cjs.prod.js +655 -0
- package/.output/server/node_modules/@vue/shared/package.json +47 -0
- package/.output/server/node_modules/agent-base/dist/helpers.js +66 -0
- package/.output/server/node_modules/agent-base/dist/index.js +178 -0
- package/.output/server/node_modules/agent-base/package.json +46 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/api.js +57 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/base/buffer.js +153 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/base/index.js +8 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/base/node.js +638 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/base/reporter.js +123 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/constants/der.js +58 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/constants/index.js +21 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/decoders/der.js +335 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/decoders/index.js +6 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/decoders/pem.js +51 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/encoders/der.js +295 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/encoders/index.js +6 -0
- package/.output/server/node_modules/asn1.js/lib/asn1/encoders/pem.js +23 -0
- package/.output/server/node_modules/asn1.js/lib/asn1.js +11 -0
- package/.output/server/node_modules/asn1.js/package.json +36 -0
- package/.output/server/node_modules/asn1js/build/index.js +3266 -0
- package/.output/server/node_modules/asn1js/package.json +86 -0
- package/.output/server/node_modules/bn.js/lib/bn.js +3463 -0
- package/.output/server/node_modules/bn.js/package.json +36 -0
- package/.output/server/node_modules/buffer-equal-constant-time/index.js +41 -0
- package/.output/server/node_modules/buffer-equal-constant-time/package.json +21 -0
- package/.output/server/node_modules/debug/package.json +64 -0
- package/.output/server/node_modules/debug/src/browser.js +272 -0
- package/.output/server/node_modules/debug/src/common.js +292 -0
- package/.output/server/node_modules/debug/src/index.js +10 -0
- package/.output/server/node_modules/debug/src/node.js +263 -0
- package/.output/server/node_modules/devalue/index.js +17 -0
- package/.output/server/node_modules/devalue/package.json +39 -0
- package/.output/server/node_modules/devalue/src/base64.js +60 -0
- package/.output/server/node_modules/devalue/src/constants.js +12 -0
- package/.output/server/node_modules/devalue/src/operations.js +221 -0
- package/.output/server/node_modules/devalue/src/parse.js +279 -0
- package/.output/server/node_modules/devalue/src/stringify.js +433 -0
- package/.output/server/node_modules/devalue/src/uneval.js +698 -0
- package/.output/server/node_modules/devalue/src/utils.js +190 -0
- package/.output/server/node_modules/ecdsa-sig-formatter/package.json +46 -0
- package/.output/server/node_modules/ecdsa-sig-formatter/src/ecdsa-sig-formatter.js +187 -0
- package/.output/server/node_modules/ecdsa-sig-formatter/src/param-bytes-for-alg.js +23 -0
- package/.output/server/node_modules/entities/dist/commonjs/decode-codepoint.js +77 -0
- package/.output/server/node_modules/entities/dist/commonjs/decode.js +568 -0
- package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-html.js +7 -0
- package/.output/server/node_modules/entities/dist/commonjs/generated/decode-data-xml.js +7 -0
- package/.output/server/node_modules/entities/dist/commonjs/internal/bin-trie-flags.js +21 -0
- package/.output/server/node_modules/entities/dist/commonjs/internal/decode-shared.js +31 -0
- package/.output/server/node_modules/entities/dist/commonjs/package.json +3 -0
- package/.output/server/node_modules/entities/package.json +120 -0
- package/.output/server/node_modules/estree-walker/dist/umd/estree-walker.js +344 -0
- package/.output/server/node_modules/estree-walker/package.json +37 -0
- package/.output/server/node_modules/hookable/dist/index.mjs +257 -0
- package/.output/server/node_modules/hookable/package.json +54 -0
- package/.output/server/node_modules/http_ece/ece.js +528 -0
- package/.output/server/node_modules/http_ece/package.json +29 -0
- package/.output/server/node_modules/https-proxy-agent/dist/index.js +180 -0
- package/.output/server/node_modules/https-proxy-agent/dist/parse-proxy-response.js +101 -0
- package/.output/server/node_modules/https-proxy-agent/package.json +50 -0
- package/.output/server/node_modules/inherits/inherits.js +9 -0
- package/.output/server/node_modules/inherits/inherits_browser.js +27 -0
- package/.output/server/node_modules/inherits/package.json +29 -0
- package/.output/server/node_modules/jwa/index.js +266 -0
- package/.output/server/node_modules/jwa/package.json +37 -0
- package/.output/server/node_modules/jws/index.js +22 -0
- package/.output/server/node_modules/jws/lib/data-stream.js +55 -0
- package/.output/server/node_modules/jws/lib/sign-stream.js +83 -0
- package/.output/server/node_modules/jws/lib/tostring.js +10 -0
- package/.output/server/node_modules/jws/lib/verify-stream.js +125 -0
- package/.output/server/node_modules/jws/package.json +34 -0
- package/.output/server/node_modules/minimalistic-assert/index.js +11 -0
- package/.output/server/node_modules/minimalistic-assert/package.json +19 -0
- package/.output/server/node_modules/ms/index.js +162 -0
- package/.output/server/node_modules/ms/package.json +38 -0
- package/.output/server/node_modules/nostics/dist/formatters/ansi.mjs +19 -0
- package/.output/server/node_modules/nostics/dist/index.mjs +194 -0
- package/.output/server/node_modules/nostics/package.json +126 -0
- package/.output/server/node_modules/pvtsutils/build/index.js +399 -0
- package/.output/server/node_modules/pvtsutils/package.json +76 -0
- package/.output/server/node_modules/pvutils/build/utils.js +361 -0
- package/.output/server/node_modules/pvutils/package.json +63 -0
- package/.output/server/node_modules/qrcode-terminal/package.json +47 -0
- package/.output/server/node_modules/qrcode-terminal/vendor/QRCode/QR8bitByte.js +22 -0
- package/.output/server/node_modules/qrcode-terminal/vendor/QRCode/QRBitBuffer.js +38 -0
- package/.output/server/node_modules/qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel.js +7 -0
- package/.output/server/node_modules/qrcode-terminal/vendor/QRCode/QRMaskPattern.js +10 -0
- package/.output/server/node_modules/qrcode-terminal/vendor/QRCode/QRMath.js +44 -0
- package/.output/server/node_modules/qrcode-terminal/vendor/QRCode/QRMode.js +6 -0
- package/.output/server/node_modules/qrcode-terminal/vendor/QRCode/QRPolynomial.js +66 -0
- package/.output/server/node_modules/qrcode-terminal/vendor/QRCode/QRRSBlock.js +298 -0
- package/.output/server/node_modules/qrcode-terminal/vendor/QRCode/QRUtil.js +272 -0
- package/.output/server/node_modules/qrcode-terminal/vendor/QRCode/index.js +462 -0
- package/.output/server/node_modules/reflect-metadata/Reflect.js +1415 -0
- package/.output/server/node_modules/reflect-metadata/package.json +68 -0
- package/.output/server/node_modules/safe-buffer/index.js +65 -0
- package/.output/server/node_modules/safe-buffer/package.json +51 -0
- package/.output/server/node_modules/safer-buffer/package.json +34 -0
- package/.output/server/node_modules/safer-buffer/safer.js +77 -0
- package/.output/server/node_modules/source-map-js/lib/array-set.js +121 -0
- package/.output/server/node_modules/source-map-js/lib/base64-vlq.js +140 -0
- package/.output/server/node_modules/source-map-js/lib/base64.js +67 -0
- package/.output/server/node_modules/source-map-js/lib/binary-search.js +111 -0
- package/.output/server/node_modules/source-map-js/lib/mapping-list.js +79 -0
- package/.output/server/node_modules/source-map-js/lib/quick-sort.js +132 -0
- package/.output/server/node_modules/source-map-js/lib/source-map-consumer.js +1188 -0
- package/.output/server/node_modules/source-map-js/lib/source-map-generator.js +444 -0
- package/.output/server/node_modules/source-map-js/lib/source-node.js +413 -0
- package/.output/server/node_modules/source-map-js/lib/util.js +594 -0
- package/.output/server/node_modules/source-map-js/package.json +71 -0
- package/.output/server/node_modules/source-map-js/source-map.js +8 -0
- package/.output/server/node_modules/supports-color/index.js +202 -0
- package/.output/server/node_modules/supports-color/package.json +64 -0
- package/.output/server/node_modules/tslib/modules/index.js +70 -0
- package/.output/server/node_modules/tslib/modules/package.json +3 -0
- package/.output/server/node_modules/tslib/package.json +47 -0
- package/.output/server/node_modules/tslib/tslib.js +484 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/decorators/auto-injectable.js +46 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/decorators/index.js +20 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/decorators/inject-all-with-transform.js +13 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/decorators/inject-all.js +12 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/decorators/inject-with-transform.js +10 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/decorators/inject.js +12 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/decorators/injectable.js +21 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/decorators/registry.js +14 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/decorators/scoped.js +13 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/decorators/singleton.js +11 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/dependency-container.js +341 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/error-helpers.js +19 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/factories/index.js +8 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/factories/instance-caching-factory.js +12 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/factories/instance-per-container-caching-factory.js +14 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/factories/predicate-aware-class-factory.js +19 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/index.js +15 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/interceptors.js +17 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/lazy-helpers.js +54 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/providers/class-provider.js +7 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/providers/factory-provider.js +7 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/providers/index.js +12 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/providers/injection-token.js +24 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/providers/provider.js +14 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/providers/token-provider.js +7 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/providers/value-provider.js +7 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/reflection-helpers.js +27 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/registry-base.js +39 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/registry.js +6 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/resolution-context.js +8 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/types/disposable.js +13 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/types/index.js +4 -0
- package/.output/server/node_modules/tsyringe/dist/cjs/types/lifecycle.js +10 -0
- package/.output/server/node_modules/tsyringe/node_modules/tslib/package.json +37 -0
- package/.output/server/node_modules/tsyringe/node_modules/tslib/tslib.js +284 -0
- package/.output/server/node_modules/tsyringe/package.json +63 -0
- package/.output/server/node_modules/ufo/dist/index.mjs +645 -0
- package/.output/server/node_modules/ufo/package.json +48 -0
- package/.output/server/node_modules/unhead/dist/client.mjs +22 -0
- package/.output/server/node_modules/unhead/dist/legacy.mjs +33 -0
- package/.output/server/node_modules/unhead/dist/minify.mjs +183 -0
- package/.output/server/node_modules/unhead/dist/parser.mjs +518 -0
- package/.output/server/node_modules/unhead/dist/plugins.mjs +746 -0
- package/.output/server/node_modules/unhead/dist/server.mjs +99 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.-hZVKou0.mjs +400 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BEmVMkeA.mjs +673 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BGFxPGPQ.mjs +47 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.BQWSw36o.mjs +192 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Bf_fPVYA.mjs +6 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Bjbp1C8D.mjs +224 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Bm4Y6XQI.mjs +17 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.C5Bksi2B.mjs +49 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CGPOfp5O.mjs +32 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.CHEy9ana.mjs +7 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.C_7zwq8E.mjs +11 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.D7HkBzZn.mjs +59 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.Dssd7L5I.mjs +196 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.jEy9BmRq.mjs +264 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.oZ7pkTV1.mjs +19 -0
- package/.output/server/node_modules/unhead/dist/shared/unhead.tQnRaXfX.mjs +240 -0
- package/.output/server/node_modules/unhead/dist/stream/client.mjs +33 -0
- package/.output/server/node_modules/unhead/dist/stream/iife.mjs +2 -0
- package/.output/server/node_modules/unhead/dist/stream/server.mjs +436 -0
- package/.output/server/node_modules/unhead/dist/utils.mjs +7 -0
- package/.output/server/node_modules/unhead/package.json +179 -0
- package/.output/server/node_modules/vue/dist/vue.cjs.js +80 -0
- package/.output/server/node_modules/vue/dist/vue.cjs.prod.js +66 -0
- package/.output/server/node_modules/vue/index.js +7 -0
- package/.output/server/node_modules/vue/index.mjs +1 -0
- package/.output/server/node_modules/vue/package.json +112 -0
- package/.output/server/node_modules/vue/server-renderer/index.mjs +1 -0
- package/.output/server/node_modules/vue-bundle-renderer/dist/runtime.mjs +687 -0
- package/.output/server/node_modules/vue-bundle-renderer/package.json +66 -0
- package/.output/server/node_modules/web-push/package.json +55 -0
- package/.output/server/node_modules/web-push/src/encryption-helper.js +62 -0
- package/.output/server/node_modules/web-push/src/index.js +21 -0
- package/.output/server/node_modules/web-push/src/urlsafe-base64-helper.js +13 -0
- package/.output/server/node_modules/web-push/src/vapid-helper.js +255 -0
- package/.output/server/node_modules/web-push/src/web-push-constants.js +17 -0
- package/.output/server/node_modules/web-push/src/web-push-error.js +16 -0
- package/.output/server/node_modules/web-push/src/web-push-lib.js +413 -0
- package/.output/server/package.json +67 -0
- package/LICENSE +21 -0
- package/README.md +963 -2
- package/bin/lib/commands.mjs +432 -0
- package/bin/lib/core.mjs +150 -0
- package/bin/lib/panel.mjs +208 -0
- package/bin/lib/runtime.mjs +74 -0
- package/bin/lib/service.mjs +133 -0
- package/bin/lib/tailnet.d.mts +32 -0
- package/bin/lib/tailnet.mjs +185 -0
- package/bin/wherdr.mjs +23 -0
- package/package.json +75 -4
package/README.md
CHANGED
|
@@ -1,3 +1,964 @@
|
|
|
1
|
-
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="server/assets/branding/icons/icon-512.png" alt="wherdr logo" width="120">
|
|
3
|
+
</p>
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
<h1 align="center">wherdr</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center"><b>A complete workspace for the coding agents running in <a href="https://herdr.dev">Herdr</a>, on your
|
|
8
|
+
computer and on your phone.</b></p>
|
|
9
|
+
|
|
10
|
+
<p align="center"><a href="https://wherdr.dev"><b>wherdr.dev</b></a> · <code>curl -fsSL https://wherdr.dev/install | sh</code> · <code>herdr plugin install afloury/wherdr</code></p>
|
|
11
|
+
|
|
12
|
+
<p align="center"><a href="https://github.com/afloury/wherdr/actions/workflows/ci.yml"><img src="https://github.com/afloury/wherdr/actions/workflows/ci.yml/badge.svg?branch=main" alt="CI"></a></p>
|
|
13
|
+
|
|
14
|
+
## Quick start
|
|
15
|
+
|
|
16
|
+
With [Herdr](https://herdr.dev) running and Node.js 22 (or Bun), on macOS or Linux:
|
|
17
|
+
|
|
18
|
+
```sh
|
|
19
|
+
npx wherdr # or: bunx wherdr, pnpm dlx wherdr — then open http://localhost:7683
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
To keep it: `npm install -g wherdr`, then `wherdr service install` starts it at every login, and
|
|
23
|
+
`wherdr phone` walks you through phone access. See [the `wherdr` command](#the-wherdr-command).
|
|
24
|
+
|
|
25
|
+
At first launch, wherdr opens a **setup guide**: the Herdr agents it found, your phone
|
|
26
|
+
(Tailscale), then the passkey lock and notifications. Skip it any time; finishing or skipping is
|
|
27
|
+
saved on the server (`data/onboarding.json`), so your other devices do not show it again. Reopen
|
|
28
|
+
it from Settings › About › **Setup guide**. On a phone that already opens wherdr through its
|
|
29
|
+
tailnet address, the phone step becomes Add to Home Screen.
|
|
30
|
+
|
|
31
|
+
wherdr is a small self-hosted web app that talks to the Herdr server on your machine. **On a
|
|
32
|
+
computer**, it can replace the Herdr terminal client day to day: your spaces, tabs and split panes
|
|
33
|
+
side by side, live conversations and real terminals, drag-and-drop layout, keyboard shortcuts
|
|
34
|
+
and a project board for herdr-projects. **On a phone**, installed as a PWA, it is the companion
|
|
35
|
+
that follows your agents when you are away: push notifications when an agent finishes or needs
|
|
36
|
+
you, one-tap answers, quick replies and offline reading.
|
|
37
|
+
|
|
38
|
+
It lists your agents live — Claude Code, Codex and the other agents Herdr recognizes — and works
|
|
39
|
+
on the same Herdr session `herdr` attaches to: nothing is copied, nothing runs in the cloud. Use
|
|
40
|
+
it on `localhost`, or from your other devices over Tailscale.
|
|
41
|
+
|
|
42
|
+
> [!WARNING]
|
|
43
|
+
> **wherdr is a remote shell on your machine.** Anyone who can reach it can start agents and
|
|
44
|
+
> run commands as your user. **Never expose it on the public Internet** (no port forwarding, no
|
|
45
|
+
> public reverse proxy, no tunnel). Use it on `localhost`, or from your other devices through a
|
|
46
|
+
> private network such as [Tailscale](https://tailscale.com). Enabling the passkey lock is
|
|
47
|
+
> strongly recommended. See [Security](#security).
|
|
48
|
+
|
|
49
|
+
<p align="center">
|
|
50
|
+
<img src="docs/screenshots/desktop.png" alt="wherdr on a computer: agent sidebar and conversation" width="900">
|
|
51
|
+
</p>
|
|
52
|
+
<p align="center"><sub>On a computer</sub></p>
|
|
53
|
+
<br>
|
|
54
|
+
<p align="center">
|
|
55
|
+
<img src="docs/screenshots/home-phone.png" alt="Agent list on a phone" width="340">
|
|
56
|
+
|
|
57
|
+
<img src="docs/screenshots/chat-phone.png" alt="Conversation view on a phone" width="340">
|
|
58
|
+
</p>
|
|
59
|
+
<p align="center"><sub>On a phone: the same agents, the same session.</sub></p>
|
|
60
|
+
|
|
61
|
+
*Unofficial project. Not affiliated with or endorsed by Herdr, Anthropic or OpenAI. Claude,
|
|
62
|
+
Claude Code, Codex and other product names are trademarks of their respective owners.*
|
|
63
|
+
|
|
64
|
+
## Contents
|
|
65
|
+
|
|
66
|
+
- [Quick start](#quick-start)
|
|
67
|
+
- [Features](#features)
|
|
68
|
+
- [How it works](#how-it-works)
|
|
69
|
+
- [Requirements](#requirements)
|
|
70
|
+
- [Installation](#installation): [which setup?](#which-setup) ·
|
|
71
|
+
[always-on server + Tailscale](#recommended-always-on-server--tailscale) ·
|
|
72
|
+
[other private networks](#other-private-networks) ·
|
|
73
|
+
[the `wherdr` command](#the-wherdr-command) ·
|
|
74
|
+
[one computer, no Docker](#simple-one-computer-no-docker) ·
|
|
75
|
+
[as a Herdr plugin](#install-as-a-herdr-plugin) ·
|
|
76
|
+
[Docker on a Mac: Reveal/Open](#wherdr-in-docker-on-a-mac-reveal-in-finder-open-and-modalto)
|
|
77
|
+
- [Updating](#updating)
|
|
78
|
+
- [Install the app on your phone](#install-the-app-on-your-phone)
|
|
79
|
+
- [Configuration](#configuration)
|
|
80
|
+
- [Several machines (SSH)](#several-machines-ssh)
|
|
81
|
+
- [Claude and Codex quotas](#claude-and-codex-quotas)
|
|
82
|
+
- [Notifications](#notifications)
|
|
83
|
+
- [Works great with herdr-projects](#works-great-with-herdr-projects)
|
|
84
|
+
- [Herdr plugins](#herdr-plugins)
|
|
85
|
+
- [Security](#security)
|
|
86
|
+
- [Troubleshooting](#troubleshooting)
|
|
87
|
+
- [Contributing](#contributing) · [License](#license)
|
|
88
|
+
|
|
89
|
+
## Features
|
|
90
|
+
|
|
91
|
+
### Everywhere
|
|
92
|
+
|
|
93
|
+
- **Live agent list**, one line per Herdr space, grouped by state (your turn, working, ready),
|
|
94
|
+
with a preview of each agent's last answer. When an agent asks for permission or asks a
|
|
95
|
+
question, the options show on its card: **answer in one tap** without opening it.
|
|
96
|
+
- **Conversation view**: the agent's real transcript (Claude Code, Codex and omp), rendered as
|
|
97
|
+
Markdown, with grouped tool calls, images (full-screen viewer with pinch / wheel zoom and pan), timestamps, search and infinite scroll back to the
|
|
98
|
+
first message. Reading a conversation never touches the terminal, so it never resizes a pane.
|
|
99
|
+
A command the agent proposes (shell code block, or inline `! command`) can be copied without
|
|
100
|
+
its prompt, or run in the agent's shell mode (`!`, Claude Code, Codex and omp) after you
|
|
101
|
+
confirm the full command.
|
|
102
|
+
- **Terminal view**: the real terminal (xterm.js, WebGL or DOM renderer) with take-over. On a
|
|
103
|
+
computer, drag over the text on screen to select it: releasing the button copies it, as do
|
|
104
|
+
`⌘C` / `Ctrl+Shift+C`. The history is browsed with the wheel, not by dragging past the edge.
|
|
105
|
+
Links (OSC 8 hyperlinks and plain `http(s)://` URLs, even wrapped over several rows) open in a
|
|
106
|
+
new tab with `⌘`+click / `Ctrl`+click, or a tap on a phone; only http and https open. A long
|
|
107
|
+
line wrapped by the width is copied in one piece, without the breaks between its rows. An image
|
|
108
|
+
pasted with `⌘V` (Mac), here or in a side-by-side terminal, goes to the agent's machine and its
|
|
109
|
+
path is pasted, which omp and Claude Code attach as an image, as in the conversation.
|
|
110
|
+
- **Composer**: send messages while the agent works (queued, cancellable), attach or paste
|
|
111
|
+
photos and the files the agent can read (Claude Code: PDFs, notebooks, text and code of any
|
|
112
|
+
extension; Codex: notebooks, text and code), run slash commands (`/compact`, `/clear`, `/context`, `/usage`…) and see the output
|
|
113
|
+
of local commands. Stop button while the agent works.
|
|
114
|
+
- **Codex updates and limits**: in a Codex conversation, a new Codex version shows above the
|
|
115
|
+
field with an **Update** button (runs Codex's official update command on that machine, after
|
|
116
|
+
confirmation), then **Restart to update** on the same conversation. When wherdr cannot run it
|
|
117
|
+
(Docker, read-only home), Update exits Codex, runs the command in the agent's own terminal and
|
|
118
|
+
resumes the same conversation (only while Codex is idle). Codex's own weekly-limit warning
|
|
119
|
+
(its footer gauge, or its startup heads-up) is repeated above the field, with its values, while
|
|
120
|
+
Codex shows it.
|
|
121
|
+
- **Model and effort pickers** for Claude Code, Codex and omp (omp: its
|
|
122
|
+
"Switch Model" selector, `/switch` or `/model`, and its thinking level, changed with its own
|
|
123
|
+
⇧⇥ cycle). Changes apply **to the current session only**; wherdr never changes your default
|
|
124
|
+
model.
|
|
125
|
+
- **New agent**: pick an installed agent (or a plain terminal), a folder, optionally a separate
|
|
126
|
+
Git **worktree** and branch, resume the last conversation, and queue a first message.
|
|
127
|
+
- **Changes view**: Git status and diff of an agent's working folder; worktree management.
|
|
128
|
+
- **Several machines**: agents of the SSH machines registered in Herdr (`herdr machine add`)
|
|
129
|
+
appear in their own section; everything works the same on a remote agent.
|
|
130
|
+
- **Named Herdr sessions**, **quotas** (remaining Claude and Codex usage limits), **Herdr plugin
|
|
131
|
+
actions** in the menus, **passkey lock** (Face ID, Touch ID, Windows Hello, Android…).
|
|
132
|
+
- **Themes**: wherdr Titanium (default), herdr.dev and Herdr's built-in themes, or follow your Herdr theme.
|
|
133
|
+
**English and French** interface.
|
|
134
|
+
|
|
135
|
+
### On a computer
|
|
136
|
+
|
|
137
|
+
- **Split panes, live**: a tab with several panes is drawn with Herdr's real layout; every pane
|
|
138
|
+
shows its conversation or terminal live, and the one you click becomes interactive.
|
|
139
|
+
- **Rearrange the layout**: drag a pane onto another to move it, drag a divider to resize
|
|
140
|
+
(arrow keys work on a focused divider); changes go to Herdr itself.
|
|
141
|
+
- **Spaces and tabs**: sidebar with every space, tabs at the top, active tab remembered per space.
|
|
142
|
+
The sidebar can be resized, or collapsed to a narrow rail (search, new agent, settings and
|
|
143
|
+
state counters) with the button next to Settings; the choice is kept on the device.
|
|
144
|
+
- **Keyboard shortcuts** (`Mod` is ⌘ on macOS, Ctrl elsewhere; `Mod+/` or `?` lists them all,
|
|
145
|
+
also in Settings › Computer):
|
|
146
|
+
- `Ctrl/⌘+K` global search across agents and conversations, `Alt+↑/↓` previous / next agent
|
|
147
|
+
in the list, `Mod+,` settings.
|
|
148
|
+
- `Mod+Alt+N` new agent in a new space, `Mod+Alt+T` new tab in the current space,
|
|
149
|
+
`Mod+Alt+W` close the current pane (after confirmation). They work from the terminal too.
|
|
150
|
+
- With [herdr-projects](#works-great-with-herdr-projects) on the agent's machine: `Mod+Alt+P`
|
|
151
|
+
shows or collapses the Project panel of the current agent's project (from a thread, it opens
|
|
152
|
+
the coordinator), and `Mod+Alt+Shift+N` opens **New project**.
|
|
153
|
+
- In an agent: `Mod+F` searches the conversation, ``Ctrl+` `` switches between conversation
|
|
154
|
+
and terminal, and `Esc` stops a working agent when the message field is empty.
|
|
155
|
+
- `Alt+Shift+arrows` swaps the current pane with its neighbour, `Ctrl/⌘+Alt+arrows` moves
|
|
156
|
+
focus to the neighbouring pane in a side-by-side tab, `Esc` closes dialogs, `Enter` sends
|
|
157
|
+
and `Shift+Enter` adds a new line. On a "Your turn" card, `1`–`9` pick an option (on AZERTY
|
|
158
|
+
without Shift too, outside the message field); on the `/resume` card, `Ctrl+A` switches
|
|
159
|
+
between every project and the current one (`⌘A` still selects all on macOS).
|
|
160
|
+
- **Project board** for [herdr-projects](#works-great-with-herdr-projects): coordinator and threads grouped
|
|
161
|
+
under their project, and a side panel with the project's task lists (to test, to decide,
|
|
162
|
+
to review, in progress, in queue, blocked, to do, backlog — each optional) and one-click
|
|
163
|
+
replies to the coordinator.
|
|
164
|
+
- **Settings** in a sidebar, with desktop-only options such as the content width.
|
|
165
|
+
|
|
166
|
+
### On a phone
|
|
167
|
+
|
|
168
|
+
- **Installable app (PWA)** on iPhone and Android, with safe-area and keyboard handling.
|
|
169
|
+
- **Web Push notifications** when an agent finishes or needs you (with its question), and for
|
|
170
|
+
`herdr notification show` (plugins, scripts).
|
|
171
|
+
- **Quick replies**: answer permissions and questions in one tap from the agent list.
|
|
172
|
+
- **Split tabs on a small screen**: a plan of the tab's panes in Herdr's proportions, then each
|
|
173
|
+
pane full screen with a mini-map and swipe to its neighbours.
|
|
174
|
+
- **Terminal key bar** (Esc, Enter, arrows, Shift+Tab, Ctrl+C…) and touch scrolling.
|
|
175
|
+
- **Offline reading** of the last known state and of recently opened conversations.
|
|
176
|
+
|
|
177
|
+
## How it works
|
|
178
|
+
|
|
179
|
+
```
|
|
180
|
+
phone / laptop ──private network──> HTTPS (tailscale serve, private proxy)
|
|
181
|
+
│
|
|
182
|
+
▼
|
|
183
|
+
wherdr (Nitro server, 127.0.0.1:7683)
|
|
184
|
+
├─ Herdr API socket ~/.config/herdr/herdr.sock
|
|
185
|
+
├─ Herdr client socket (notifications, passive client)
|
|
186
|
+
├─ herdr terminal session control <pane> (terminal view)
|
|
187
|
+
├─ transcripts ~/.claude, ~/.codex, ~/.omp (read only)
|
|
188
|
+
└─ ssh -M <machine> (other machines, optional)
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
wherdr runs on the same machine as the Herdr server (the "server" below). It uses Herdr's local
|
|
192
|
+
socket API and CLI, reads the agents' transcript files, and serves a client-only Nuxt app. Data
|
|
193
|
+
it keeps (VAPID keys, push subscriptions, passkeys, recent folders) lives in `data/`.
|
|
194
|
+
|
|
195
|
+
Built with Nuxt 4, Nuxt UI 4, Tailwind 4 and TypeScript; the Herdr gateway (API, WebSockets,
|
|
196
|
+
Web Push, lock) runs in Nitro.
|
|
197
|
+
|
|
198
|
+
## Requirements
|
|
199
|
+
|
|
200
|
+
- **Herdr ≥ 0.9.1** running on the server (`herdr` or `herdr server`), with its Claude Code /
|
|
201
|
+
Codex / omp integrations installed if you use them (`herdr integration install claude|codex|omp`).
|
|
202
|
+
omp's conversation is only found through its integration, which reports the session file.
|
|
203
|
+
- **Linux or macOS** server with either **Docker** (Compose v2) or **Node.js 22**.
|
|
204
|
+
The Docker image is for Linux servers (tested on a Raspberry Pi too). **On macOS, run without
|
|
205
|
+
Docker**: Docker Desktop cannot reach Herdr's Unix socket on the host.
|
|
206
|
+
- **HTTPS** to use passkeys, push notifications and the installable app from another device.
|
|
207
|
+
Browsers only allow them on `https://` or `http://localhost`. The easiest way is
|
|
208
|
+
[`tailscale serve`](https://tailscale.com/kb/1312/serve); a reverse proxy **reachable only
|
|
209
|
+
from your private network** with a valid certificate also works (see
|
|
210
|
+
[Other private networks](#other-private-networks)).
|
|
211
|
+
|
|
212
|
+
## Installation
|
|
213
|
+
|
|
214
|
+
### Which setup?
|
|
215
|
+
|
|
216
|
+
| | **Always-on server + Tailscale** (recommended) | **One computer, no Docker** |
|
|
217
|
+
| --- | --- | --- |
|
|
218
|
+
| Runs on | A machine that never sleeps: Raspberry Pi, mini-PC, home server, private VPS (Linux, Docker) | The computer you work on (macOS or Linux, Node.js 22) |
|
|
219
|
+
| Reach it from | Your phone and every computer on your tailnet | That computer only (`http://localhost:7683`) |
|
|
220
|
+
| Installable app, push notifications, passkeys | Yes (private HTTPS from `tailscale serve`) | Desktop browser only; no phone access |
|
|
221
|
+
| Other machines (a Mac, a laptop…) | Added in Herdr over SSH, shown in wherdr | Also possible, but they are only reachable while this computer is awake |
|
|
222
|
+
|
|
223
|
+
Both setups use the same app. You can start with the second one and move to the first later.
|
|
224
|
+
|
|
225
|
+
### Recommended: always-on server + Tailscale
|
|
226
|
+
|
|
227
|
+
Your agents keep running when your laptop is closed, and you follow them from your phone.
|
|
228
|
+
wherdr stays on your private network: it is **never published on the Internet**.
|
|
229
|
+
|
|
230
|
+
**1. Herdr on the server.** Install [Herdr](https://herdr.dev) (≥ 0.9.1) and start it
|
|
231
|
+
(`herdr` or `herdr server`), with the integrations of the agents you use
|
|
232
|
+
(`herdr integration install claude|codex`).
|
|
233
|
+
|
|
234
|
+
**2. wherdr with Docker** (Linux, Compose v2):
|
|
235
|
+
|
|
236
|
+
```sh
|
|
237
|
+
git clone https://github.com/afloury/wherdr.git
|
|
238
|
+
cd wherdr
|
|
239
|
+
cp .env.example .env
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
Edit `.env` (every value has a default; `HOST_HOME` defaults to your `$HOME`):
|
|
243
|
+
|
|
244
|
+
| Variable | Example | Meaning |
|
|
245
|
+
| --- | --- | --- |
|
|
246
|
+
| `HOST_HOME` | `/home/alice` | Your home folder on the server (default: `$HOME`). Mounted at the same path, read-only. |
|
|
247
|
+
| `PUID` / `PGID` | `1000` | Your user and group IDs (`id -u`, `id -g`). |
|
|
248
|
+
| `PORT` | `7683` | Listening port, published on `127.0.0.1` only. |
|
|
249
|
+
| `APP_URL` | `https://server.example.ts.net:7683/` | Private HTTPS address of the app (step 3; also used as the Web Push contact and an allowed host). Use `http://localhost:7683/` for local testing. |
|
|
250
|
+
| `HOST_LABEL` | `server` | Name of this machine in the app. |
|
|
251
|
+
| `TZ` | `Europe/Paris` | Time zone for timestamps and logs. |
|
|
252
|
+
| `WHERDR_UPDATE_CHECK` | `off` | Disable the daily check for a new release (default `on`). |
|
|
253
|
+
|
|
254
|
+
Create the bind-mount folders **before** starting Compose, as your own user. Otherwise Docker
|
|
255
|
+
may create missing host folders as root, leaving the container unable to write to them.
|
|
256
|
+
|
|
257
|
+
```sh
|
|
258
|
+
mkdir -p data "$HOME/.config/herdr" "$HOME/.local/state/herdr/client" "$HOME/.cache/herdr-web" \
|
|
259
|
+
"$HOME/.herdr-projects"
|
|
260
|
+
docker compose up -d # pulls ghcr.io/afloury/wherdr (arm64 and amd64)
|
|
261
|
+
docker compose logs -f # optional: follow the logs and find the first-passkey token
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
The container runs as your user and mounts your home folder **read-only**, except
|
|
265
|
+
`~/.config/herdr` (Herdr sockets), `~/.local/state/herdr/client` (machine names),
|
|
266
|
+
`~/.cache/herdr-web` (uploaded photos and files, quotas) and `~/.herdr-projects` (herdr-projects
|
|
267
|
+
projects, see [Works great with herdr-projects](#works-great-with-herdr-projects)). It uses the
|
|
268
|
+
server's own `herdr` binary, so the client and the server always stay on the same version.
|
|
269
|
+
|
|
270
|
+
The repository is only needed for `docker-compose.yml` and `.env`: the image is prebuilt and
|
|
271
|
+
published for each release. To build it from source instead, see [Updating](#updating).
|
|
272
|
+
**Custom icons** (optional): copy
|
|
273
|
+
`docker-compose.override.example.yml` to `docker-compose.override.yml` and put your icons in
|
|
274
|
+
`branding/` (both untracked).
|
|
275
|
+
|
|
276
|
+
**3. Private HTTPS with Tailscale.** Install [Tailscale](https://tailscale.com) on the server,
|
|
277
|
+
your phone and your computers, on the same tailnet, with
|
|
278
|
+
[MagicDNS and HTTPS certificates](https://tailscale.com/kb/1153/enabling-https) enabled. Then,
|
|
279
|
+
on the server:
|
|
280
|
+
|
|
281
|
+
```sh
|
|
282
|
+
tailscale serve --bg --https=7683 http://127.0.0.1:7683
|
|
283
|
+
# → https://<machine>.<tailnet>.ts.net:7683/ (e.g. https://server.example.ts.net:7683/)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
Tailscale Serve listens on HTTPS port 7683 of your tailnet name, with a valid certificate, and
|
|
287
|
+
forwards to wherdr's local HTTP port. Only devices of your tailnet can reach it. Then open
|
|
288
|
+
**Settings › Phone** in wherdr on the server (`http://localhost:7683/#/settings?section=phone`),
|
|
289
|
+
paste that address: wherdr checks it answers, sets it as `APP_URL` (saved in `data/app-url.json`;
|
|
290
|
+
an HTTPS `APP_URL` in `.env` wins) and shows its QR code. Without Docker, the same page publishes
|
|
291
|
+
wherdr itself: one button, asked first.
|
|
292
|
+
|
|
293
|
+
**Why HTTPS matters.** Browsers only allow three things on `https://` (or on `localhost` itself):
|
|
294
|
+
|
|
295
|
+
- **installing the app** on the home screen (PWA) on iPhone and Android;
|
|
296
|
+
- **push notifications** (on iOS, only in the installed app);
|
|
297
|
+
- **passkeys** for the lock screen (Face ID, Touch ID, Windows Hello, Android).
|
|
298
|
+
|
|
299
|
+
**4. On the phone:** open the address, [install the app](#install-the-app-on-your-phone), then
|
|
300
|
+
Settings → **Enable notifications**. **On the computer:** use the same address in a browser; the
|
|
301
|
+
desktop layout can replace the Herdr terminal client for daily work.
|
|
302
|
+
|
|
303
|
+
**5. Passkey lock** (recommended, optional): Settings → Security → **Enable passkey lock**. The
|
|
304
|
+
first passkey asks for a bootstrap token, printed in the server logs (`docker compose logs`);
|
|
305
|
+
it changes on each restart and is only needed for that first passkey. Add a passkey on each of
|
|
306
|
+
your devices after that (see [New device](#new-device) below). Without one, every device of your
|
|
307
|
+
tailnet can control your agents.
|
|
308
|
+
|
|
309
|
+
**6. More machines** (optional): register your other computers in Herdr over SSH
|
|
310
|
+
(`herdr machine add`, see [Several machines (SSH)](#several-machines-ssh)). Their agents show
|
|
311
|
+
in wherdr in their own section, and everything works the same on them. The machine menu also has
|
|
312
|
+
**Keep awake**, which stops a Mac (`caffeinate`) or a Linux machine (`systemd-inhibit`) from
|
|
313
|
+
sleeping for an hour, four hours, the evening or until turned off.
|
|
314
|
+
|
|
315
|
+
> [!CAUTION]
|
|
316
|
+
> Never publish wherdr on the Internet: no port forwarding on your router, no public reverse
|
|
317
|
+
> proxy, no ngrok, no `tailscale funnel`, no Cloudflare Tunnel without Cloudflare Access. Use
|
|
318
|
+
> `tailscale serve`, which stays inside your tailnet. See [Security](#security).
|
|
319
|
+
|
|
320
|
+
### Other private networks
|
|
321
|
+
|
|
322
|
+
Tailscale is the built-in path (one click in **Settings › Phone**), not a requirement. wherdr
|
|
323
|
+
works with any private network that gives it an **HTTPS address with a valid certificate**:
|
|
324
|
+
|
|
325
|
+
- **HTTPS with a certificate your phone trusts.** The installed app (PWA), push notifications
|
|
326
|
+
and passkeys only work on `https://`. A self-signed certificate or plain `http://` on your
|
|
327
|
+
LAN is not enough, and is never a supported way to reach wherdr.
|
|
328
|
+
- **`APP_URL` set to that address** (`.env` with Docker, or the environment of `wherdr` /
|
|
329
|
+
`npm start`), then restart wherdr. Its hostname is allowed automatically and it enables Web
|
|
330
|
+
Push. Add `HERDR_WEB_ALLOWED_HOSTS` only if you also open wherdr under another name. The
|
|
331
|
+
one-click address check in **Settings › Phone** only knows `*.ts.net` addresses; an HTTPS
|
|
332
|
+
`APP_URL` in the environment always wins.
|
|
333
|
+
- **Never exposed without authentication.** wherdr keeps listening on `127.0.0.1`; only the
|
|
334
|
+
proxy listens on the private network. Turn on the passkey lock as soon as another device can
|
|
335
|
+
reach it.
|
|
336
|
+
|
|
337
|
+
**Headscale, NetBird, ZeroTier, WireGuard: the same recipe.** Join the server and the phone to
|
|
338
|
+
the network, give the server a DNS name that points to its **private** address, and put a reverse
|
|
339
|
+
proxy in front of wherdr that listens on that private address only. Let's Encrypt cannot reach a
|
|
340
|
+
private address, so the certificate comes from the
|
|
341
|
+
[DNS challenge](https://caddyserver.com/docs/automatic-https#dns-challenge). With
|
|
342
|
+
[Caddy](https://caddyserver.com) built with your DNS provider's
|
|
343
|
+
[module](https://github.com/caddy-dns) (here [Cloudflare DNS](https://github.com/caddy-dns/cloudflare)),
|
|
344
|
+
a `Caddyfile` like this ([`bind`](https://caddyserver.com/docs/caddyfile/directives/bind),
|
|
345
|
+
[`tls`](https://caddyserver.com/docs/caddyfile/directives/tls)):
|
|
346
|
+
|
|
347
|
+
```caddy
|
|
348
|
+
wherdr.example.com {
|
|
349
|
+
bind 100.64.0.10 # the server's address on the private network only
|
|
350
|
+
tls {
|
|
351
|
+
dns cloudflare {env.CF_API_TOKEN}
|
|
352
|
+
}
|
|
353
|
+
reverse_proxy 127.0.0.1:7683
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
Point `wherdr.example.com` (an `A` record in your DNS zone) to that private address: from
|
|
358
|
+
anywhere else it leads nowhere. Then set `APP_URL=https://wherdr.example.com/` and restart
|
|
359
|
+
wherdr. To join each device:
|
|
360
|
+
|
|
361
|
+
| Network | Join a device (official docs) | Server's private address |
|
|
362
|
+
| --- | --- | --- |
|
|
363
|
+
| [Headscale](https://headscale.net/stable/usage/getting-started/) | Tailscale clients: `tailscale up --login-server <YOUR_HEADSCALE_URL>` | `tailscale ip -4` |
|
|
364
|
+
| [NetBird](https://docs.netbird.io/get-started/cli) | `netbird up` (`--management-url` when self-hosted) | `netbird status` |
|
|
365
|
+
| [ZeroTier](https://docs.zerotier.com/start) | `zerotier-cli join <network ID>`, then authorize the device in the network's members | The members list of your network |
|
|
366
|
+
| [WireGuard](https://www.wireguard.com/quickstart/) | `wg-quick up wg0` with a peer per device | The `Address` of the server's interface |
|
|
367
|
+
|
|
368
|
+
Headscale does not support `tailscale serve` with HTTPS yet
|
|
369
|
+
([features](https://headscale.net/stable/about/features/),
|
|
370
|
+
[#1921](https://github.com/juanfont/headscale/issues/1921)): `tailscale cert` and Serve need
|
|
371
|
+
certificates that only Tailscale's own control server provisions. Use the reverse proxy above
|
|
372
|
+
instead of step 3.
|
|
373
|
+
|
|
374
|
+
**Cloudflare Tunnel + Cloudflare Access: only with Access.**
|
|
375
|
+
|
|
376
|
+
> [!WARNING]
|
|
377
|
+
> A Cloudflare Tunnel puts wherdr **on the Internet**: anyone can reach its address, and
|
|
378
|
+
> Cloudflare terminates TLS, so it sees all traffic. **Cloudflare Access is mandatory**, created
|
|
379
|
+
> *before* the route: without it, whoever finds the address controls your agents. Keep the
|
|
380
|
+
> passkey lock on as well. Prefer a private network when you can.
|
|
381
|
+
|
|
382
|
+
1. In Cloudflare One, create the Access application first:
|
|
383
|
+
[Self-hosted and private › Add public hostname](https://developers.cloudflare.com/cloudflare-one/access-controls/applications/http-apps/self-hosted-public-app/)
|
|
384
|
+
`wherdr.example.com`, with an **Allow** policy for your own e-mail only (Access applications
|
|
385
|
+
deny everyone else by default).
|
|
386
|
+
2. [Create a tunnel](https://developers.cloudflare.com/tunnel/setup/) and run `cloudflared` on the
|
|
387
|
+
server, then add a **published application** route: hostname `wherdr.example.com`, service
|
|
388
|
+
`http://localhost:7683`.
|
|
389
|
+
3. Set `APP_URL=https://wherdr.example.com/` and restart wherdr.
|
|
390
|
+
|
|
391
|
+
Installing the app and notifications behind Access are not tested by the project: the phone must
|
|
392
|
+
first sign in to Access in the browser.
|
|
393
|
+
|
|
394
|
+
### The `wherdr` command
|
|
395
|
+
|
|
396
|
+
The npm package holds the built app: nothing is compiled on your machine. Try it with
|
|
397
|
+
`npx wherdr` (or `bunx wherdr`, `pnpm dlx wherdr`); to keep it, install it once:
|
|
398
|
+
|
|
399
|
+
```sh
|
|
400
|
+
npm install -g wherdr # or: pnpm add -g wherdr, bun add -g wherdr
|
|
401
|
+
wherdr service install # starts at every login; prints the address
|
|
402
|
+
wherdr phone # phone state, the app's phone setup page, QR code once it answers
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
| Command | What it does |
|
|
406
|
+
| --- | --- |
|
|
407
|
+
| `wherdr` (or `wherdr run`) | Runs in the foreground; Ctrl+C stops it. |
|
|
408
|
+
| `wherdr start` · `stop` · `restart` | Background server, pid and log in `~/wherdr`. `start` says *started* only once the port answers; otherwise it prints the end of the log. With a login service installed, they drive the service. |
|
|
409
|
+
| `wherdr status` | Address, process, service, data folder and log. |
|
|
410
|
+
| `wherdr logs` (`-f` to follow, `-n 100`) | The log, `~/wherdr/wherdr.log`. |
|
|
411
|
+
| `wherdr open` | Opens wherdr in the browser. |
|
|
412
|
+
| `wherdr phone` | Whether your phone can reach wherdr (Tailscale, `tailscale serve`, the address answering), the link to **Settings › Phone** where you publish it in one click, and the QR code once the address answers. |
|
|
413
|
+
| `wherdr service install` · `uninstall` | Start at login: a LaunchAgent on macOS (`~/Library/LaunchAgents/dev.wherdr.plist`), a `systemd --user` unit on Linux (`loginctl enable-linger` keeps it running while you are logged out). |
|
|
414
|
+
| `wherdr doctor` | Checks Node/Bun, Herdr and its socket, the port, the service, the data folder and `APP_URL`. |
|
|
415
|
+
|
|
416
|
+
Options: `--port` (default `7683`), `--host` (default `127.0.0.1`, keep it on loopback),
|
|
417
|
+
`--data-dir` (passkeys, push keys and settings; default `~/wherdr/data`, the folder the Herdr
|
|
418
|
+
plugin and the install script use), `--session` (a named Herdr session). Every
|
|
419
|
+
[environment variable](#configuration) works too, and so do `KEY=VALUE` lines in
|
|
420
|
+
`~/wherdr/wherdr.env` (for example `APP_URL=…`, read at each start); options win, then the
|
|
421
|
+
environment, then that file. `start` and `service install` remember the port and folders for
|
|
422
|
+
the other commands.
|
|
423
|
+
|
|
424
|
+
The login service records the **absolute path** of the runtime (n, nvm, fnm, Volta or Homebrew
|
|
425
|
+
node), since launchd and systemd do not see your shell's `PATH`. It refuses to point at a
|
|
426
|
+
temporary `npx` / `pnpm dlx` / `bunx` folder: install the package globally first. To update:
|
|
427
|
+
`npm install -g wherdr@latest && wherdr restart` (with `npx`: stop it, then `npx wherdr@latest`).
|
|
428
|
+
|
|
429
|
+
Bun runs wherdr too (WebSockets, push, passkeys and Herdr's socket work); when Node.js 22 is
|
|
430
|
+
also installed, `bunx wherdr` hands the server to Node, the reference runtime. Set
|
|
431
|
+
`WHERDR_RUNTIME=bun` to keep Bun.
|
|
432
|
+
|
|
433
|
+
### Simple: one computer, no Docker
|
|
434
|
+
|
|
435
|
+
The quickest way to try it, and the way to run wherdr **on macOS**: Docker Desktop cannot reach
|
|
436
|
+
Herdr's Unix socket on the host. With Herdr running, Git and Node.js 22 on the same machine:
|
|
437
|
+
|
|
438
|
+
```sh
|
|
439
|
+
git clone https://github.com/afloury/wherdr.git
|
|
440
|
+
cd wherdr
|
|
441
|
+
npm ci
|
|
442
|
+
npm run build
|
|
443
|
+
npm start # listens on 127.0.0.1:7683
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
Open `http://localhost:7683` in a browser on that computer: the desktop layout, passkeys and the
|
|
447
|
+
installable app work there, since browsers treat `localhost` as secure. There is no phone access
|
|
448
|
+
and no push notification in this setup; for that, use the recommended setup (or publish this
|
|
449
|
+
instance with `tailscale serve` as above and start it with
|
|
450
|
+
`APP_URL=https://server.example.ts.net:7683/ npm start`).
|
|
451
|
+
|
|
452
|
+
Run it as the user who runs Herdr. It uses `$HOME` and `$HOME/.local/bin/herdr`, or `herdr` from
|
|
453
|
+
the `PATH` (Homebrew); set `HERDR_BIN` otherwise. `DATA_DIR` holds passkeys, push data and recent
|
|
454
|
+
folders (default `./data`). `npm start` listens on `127.0.0.1` (`HOST`) and port `7683` (`PORT`).
|
|
455
|
+
The first-passkey bootstrap token is printed in its output. Keep the process running with your
|
|
456
|
+
usual service manager (systemd user unit, launchd, tmux…).
|
|
457
|
+
|
|
458
|
+
With `APP_URL` empty or `http://localhost:7683/`, wherdr starts normally but disables Web Push
|
|
459
|
+
and logs a warning.
|
|
460
|
+
|
|
461
|
+
### Install as a Herdr plugin
|
|
462
|
+
|
|
463
|
+
Herdr can also install wherdr itself, on Linux and macOS, with Herdr ≥ 0.9.1. In three lines:
|
|
464
|
+
|
|
465
|
+
1. Run `herdr plugin install afloury/wherdr`: it installs wherdr, starts it
|
|
466
|
+
(`✓ wherdr is running → http://localhost:7683`) and, at the first install on a computer with a
|
|
467
|
+
screen, opens the setup guide in your browser (`open` on macOS, `xdg-open` on Linux with a
|
|
468
|
+
display; a headless server just prints `http://localhost:7683/#/setup`). Updates open nothing.
|
|
469
|
+
2. In Herdr, press **prefix+i** (`ctrl+b` then `i` with the default prefix): the **wherdr** panel,
|
|
470
|
+
with the state, **O** Open wherdr and **P** Set up my phone. The install prints the key it
|
|
471
|
+
chose (see [Panel key](#panel-key)).
|
|
472
|
+
3. **P** opens Settings › Phone in the browser: **Make wherdr reachable from my phone** publishes
|
|
473
|
+
it on your tailnet, then the QR code shows once the address answers. Scan it with the iPhone,
|
|
474
|
+
then Share → Add to Home Screen.
|
|
475
|
+
|
|
476
|
+
Herdr shows the manifest and the commands it will run, then the plugin installs wherdr in
|
|
477
|
+
`~/wherdr` and starts it, unless something already answers on the port. If wherdr cannot start,
|
|
478
|
+
the install still succeeds and says why; press **S** in the panel once it is fixed. It picks the
|
|
479
|
+
setup by itself:
|
|
480
|
+
|
|
481
|
+
- **Docker** on Linux when Docker Compose v2 works for your user: the published image, from
|
|
482
|
+
`~/wherdr` (`docker-compose.yml`, `.env`), exactly like the [one-line installer](https://wherdr.dev/install).
|
|
483
|
+
- **Node.js 22** everywhere else, and always on macOS (Docker Desktop cannot reach Herdr's
|
|
484
|
+
socket): the plugin downloads the prebuilt npm package of its version (or builds wherdr in its
|
|
485
|
+
own folder when that fails), copies it to `~/wherdr/app` and runs it detached from there, with
|
|
486
|
+
its pid and log (`wherdr.log`) in `~/wherdr`. Herdr builds plugins in a temporary folder and
|
|
487
|
+
then moves them, so the server never runs from the plugin folder. Bun works too when Node.js 22
|
|
488
|
+
is missing. Without either, the install stops and says so.
|
|
489
|
+
|
|
490
|
+
The **wherdr** panel (a Herdr popup) shows ● running / ○ stopped, the local address, the phone
|
|
491
|
+
address (with its QR code once it answers), and two main keys: **O** Open wherdr, **P** Set up my
|
|
492
|
+
phone (Settings › Phone in the browser). The other keys stay as a fallback: **S** start, **X**
|
|
493
|
+
stop, **R** restart, **L** log (Ctrl+C to go back), **U** update (reinstalls the plugin, or pulls
|
|
494
|
+
the image in Docker mode), **A** auto-start at login on/off, **Q** quit.
|
|
495
|
+
|
|
496
|
+
#### Panel key
|
|
497
|
+
|
|
498
|
+
Herdr plugins have no menu of their own: an action runs from a key or from the command line. The
|
|
499
|
+
install therefore appends one marked block to Herdr's `config.toml` (`HERDR_CONFIG_PATH`, or
|
|
500
|
+
`~/.config/herdr/config.toml`):
|
|
501
|
+
|
|
502
|
+
```toml
|
|
503
|
+
# wherdr: key that opens the wherdr panel (remove this block to unbind it)
|
|
504
|
+
[[keys.command]]
|
|
505
|
+
key = "prefix+i"
|
|
506
|
+
type = "plugin_action"
|
|
507
|
+
command = "afloury.wherdr.panel"
|
|
508
|
+
description = "wherdr"
|
|
509
|
+
# end wherdr
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
It takes the first key of `prefix+i`, `prefix+u`, `prefix+y`, `prefix+m`, `prefix+alt+w` that
|
|
513
|
+
neither Herdr's default keymap nor your config already binds, and prints
|
|
514
|
+
`Press prefix+i in Herdr to open the wherdr panel.` Your own lines are never changed. Nothing is
|
|
515
|
+
added when a key already runs the panel, when every candidate is taken, or when
|
|
516
|
+
`herdr config check` would reject the result. The install then runs `herdr server reload-config`:
|
|
517
|
+
keys apply without restarting Herdr. Pick another key by editing the block, or bind the panel
|
|
518
|
+
yourself (`command = "afloury.wherdr.panel"`) before installing.
|
|
519
|
+
|
|
520
|
+
Without a key: `herdr plugin action invoke panel --plugin afloury.wherdr`. The plugin's actions:
|
|
521
|
+
|
|
522
|
+
| Action | What it does |
|
|
523
|
+
|---|---|
|
|
524
|
+
| `panel` | The **wherdr** panel (a popup) |
|
|
525
|
+
| `open` | Opens wherdr in the browser |
|
|
526
|
+
|
|
527
|
+
Up to 1.2.0 the panel action was called `wherdr`: change a key bound to `afloury.wherdr.wherdr` to
|
|
528
|
+
`afloury.wherdr.panel` (Herdr has no action aliases; the install warns about such a key and
|
|
529
|
+
leaves it alone). Remove the block with `sh scripts/herdr-plugin.sh key uninstall` in the plugin
|
|
530
|
+
folder (`~/.config/herdr/plugins/github/wherdr-…`), or delete the lines from `# wherdr:` to `# end wherdr`.
|
|
531
|
+
|
|
532
|
+
Auto-start: the plugin's startup hook starts wherdr each time the Herdr server starts, which is
|
|
533
|
+
all wherdr needs (it drives Herdr). Key **A** adds a login service as well (a LaunchAgent on
|
|
534
|
+
macOS, a `systemd --user` unit on Linux, pointing at `~/wherdr/app` with the absolute path of the
|
|
535
|
+
runtime): wherdr then runs from login and is restarted if it crashes. It is not installed on its
|
|
536
|
+
own because it changes your login session. In Docker mode the container's restart policy does
|
|
537
|
+
this job.
|
|
538
|
+
|
|
539
|
+
Herdr runs the plugin's commands with the environment of its server, whose `PATH` often lacks the
|
|
540
|
+
folders of version managers (n, nvm, fnm, Volta, asdf). The install therefore saves the absolute
|
|
541
|
+
path of the runtime in `~/wherdr/plugin.env` (`WHERDR_RUNTIME=/path/to/node`); if that binary
|
|
542
|
+
disappears, **Start** looks in the usual places (`~/.n/bin`, `~/.nvm`, `~/.volta/bin`, fnm,
|
|
543
|
+
`~/.asdf/shims`, Homebrew, `/usr/local/bin`, `~/.bun/bin`) and saves what it finds. Set
|
|
544
|
+
`WHERDR_RUNTIME` there by hand for anything else. **Start** only reports success once the
|
|
545
|
+
process is alive and the port answers; otherwise it prints the last lines of `wherdr.log`.
|
|
546
|
+
|
|
547
|
+
Force a setup with `WHERDR_MODE=native herdr plugin install afloury/wherdr` (or `docker`). The
|
|
548
|
+
choice, the port (`WHERDR_PORT`, default 7683) and, in native mode, `APP_URL` are kept in
|
|
549
|
+
`~/wherdr/plugin.env`; another folder can be set with `WHERDR_DIR` at install time. Nothing is
|
|
550
|
+
installed globally and nothing runs with sudo.
|
|
551
|
+
|
|
552
|
+
When something already answers on the port (a wherdr started with Docker, systemd or by hand),
|
|
553
|
+
the plugin starts nothing and never stops it: **Stop** only stops what the plugin started. The
|
|
554
|
+
output of the install and of the startup hook is in the plugin logs:
|
|
555
|
+
`herdr plugin log list --plugin afloury.wherdr`.
|
|
556
|
+
|
|
557
|
+
**Uninstall.** Herdr has no uninstall hook, so remove wherdr in this order: in the panel, **A**
|
|
558
|
+
(if the login service is on) and **X**; in the plugin folder, `sh scripts/herdr-plugin.sh key
|
|
559
|
+
uninstall` (the panel key) and `sh scripts/herdr-plugin.sh skill uninstall`; then
|
|
560
|
+
`herdr plugin uninstall afloury.wherdr && rm -rf ~/wherdr` (`~/wherdr/data` holds your passkeys
|
|
561
|
+
and push keys).
|
|
562
|
+
|
|
563
|
+
### wherdr in Docker on a Mac: Reveal in Finder, Open and Mod+Alt+O
|
|
564
|
+
|
|
565
|
+
The container is Linux: it has no `open` command, so "Reveal in Finder" / "Open" on file paths
|
|
566
|
+
and `Mod+Alt+O` (the agent's folder in your editor) do nothing by default — the app reports
|
|
567
|
+
"not a Mac". wherdr can ask your Mac to run them over SSH:
|
|
568
|
+
|
|
569
|
+
```sh
|
|
570
|
+
sh scripts/install-host-open.sh # on the Mac; --user/--target/--port optional
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
This creates a dedicated key pair in `data/` (`host-open-key`), installs
|
|
574
|
+
`~/.local/share/wherdr/{reveal.sh,wherdr-open.sh}` on the Mac, loads a small LaunchAgent
|
|
575
|
+
(`dev.wherdr.open`, in `~/Library/LaunchAgents`) that launches GUI apps on behalf of the SSH
|
|
576
|
+
session, and adds one `authorized_keys` line whose forced command only ever runs the reveal
|
|
577
|
+
checks on a path wherdr passes (existing, under your home folder, never an app or a script —
|
|
578
|
+
the same rules as a native install).
|
|
579
|
+
|
|
580
|
+
Then add to `docker-compose.override.yml` and restart the container:
|
|
581
|
+
|
|
582
|
+
```yaml
|
|
583
|
+
services:
|
|
584
|
+
herdr-web:
|
|
585
|
+
environment:
|
|
586
|
+
- HERDR_WEB_HOST_OPEN_TARGET=host.docker.internal # the Mac as the container sees it
|
|
587
|
+
- HERDR_WEB_HOST_OPEN_USER=<your mac user>
|
|
588
|
+
```
|
|
589
|
+
|
|
590
|
+
Without these variables nothing changes: a non-Mac server refuses with "not a Mac" as before.
|
|
591
|
+
|
|
592
|
+
The installer picks the editor that opens folders (first of Zed, Trae, Visual Studio Code,
|
|
593
|
+
Cursor, Sublime Text, TextMate). Change it any time:
|
|
594
|
+
|
|
595
|
+
```sh
|
|
596
|
+
printf %s "Visual Studio Code" > ~/.local/share/wherdr/editor
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
## Updating
|
|
600
|
+
|
|
601
|
+
wherdr checks the latest GitHub release at most once a day (an anonymous request to
|
|
602
|
+
`api.github.com`, nothing is sent) and shows a small **“wherdr X.Y.Z is available”** banner on the
|
|
603
|
+
home screen and in Settings › About, with the release notes and the exact command for your setup.
|
|
604
|
+
Hide it until the next version with ×. Set `WHERDR_UPDATE_CHECK=off` to disable the check. The
|
|
605
|
+
installed version is shown in Settings › About.
|
|
606
|
+
|
|
607
|
+
| Setup | Update command (in the wherdr folder) |
|
|
608
|
+
| --- | --- |
|
|
609
|
+
| Docker, published image (default) | `docker compose pull && docker compose up -d` |
|
|
610
|
+
| Docker, built from source | `git pull && docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build` |
|
|
611
|
+
| No Docker | `git pull && npm ci && npm run build`, then restart wherdr |
|
|
612
|
+
| `wherdr` command (npm) | `npm install -g wherdr@latest && wherdr restart` (npx: stop it, then `npx wherdr@latest`) |
|
|
613
|
+
| Herdr plugin, Docker | **U** in the **wherdr** panel (pulls the image, restarts the container) |
|
|
614
|
+
| Herdr plugin, Node.js | **U** in the **wherdr** panel, or `herdr plugin install afloury/wherdr --yes` (wherdr restarts on the new version) |
|
|
615
|
+
|
|
616
|
+
Also run `git pull` now and then with the published image: it brings the latest
|
|
617
|
+
`docker-compose.yml` and `.env.example`.
|
|
618
|
+
|
|
619
|
+
**Build from source.** `docker-compose.build.yml` builds the image locally (`wherdr:local`)
|
|
620
|
+
instead of pulling it: add `-f docker-compose.yml -f docker-compose.build.yml` to every
|
|
621
|
+
`docker compose` command (and `-f docker-compose.override.yml` if you use one). A build needs
|
|
622
|
+
about 2 GB of free memory.
|
|
623
|
+
|
|
624
|
+
**Automatic updates** (optional). [Watchtower](https://containrrr.dev/watchtower/) can pull new
|
|
625
|
+
images and restart the container for you:
|
|
626
|
+
|
|
627
|
+
```sh
|
|
628
|
+
docker run -d --name watchtower --restart unless-stopped \
|
|
629
|
+
-v /var/run/docker.sock:/var/run/docker.sock \
|
|
630
|
+
containrrr/watchtower --cleanup --schedule "0 0 4 * * *" wherdr
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
Pin a version instead of `latest` with `WHERDR_IMAGE=ghcr.io/afloury/wherdr:1.2.0` in `.env`.
|
|
634
|
+
|
|
635
|
+
## Install the app on your phone
|
|
636
|
+
|
|
637
|
+
The app must be served over HTTPS (see [Requirements](#requirements)).
|
|
638
|
+
|
|
639
|
+
- **iPhone / iPad** (iOS 16.4 or later): open the address in **Safari** → Share →
|
|
640
|
+
**Add to Home Screen**. Open wherdr from the home screen, then Settings → **Enable
|
|
641
|
+
notifications**. On iOS, push notifications only work in the installed app.
|
|
642
|
+
- **Android**: open the address in **Chrome** → menu → **Install app** (or Add to Home
|
|
643
|
+
screen), then Settings → **Enable notifications**.
|
|
644
|
+
- **Computer**: just use the address in a browser; Chrome and Edge can also install it.
|
|
645
|
+
|
|
646
|
+
Then Settings → Security → **Enable passkey lock** on each device.
|
|
647
|
+
|
|
648
|
+
## Configuration
|
|
649
|
+
|
|
650
|
+
All settings are environment variables (`.env` with Docker).
|
|
651
|
+
|
|
652
|
+
| Variable | Default | Meaning |
|
|
653
|
+
| --- | --- | --- |
|
|
654
|
+
| `PORT` | `7683` | Listening port. |
|
|
655
|
+
| `HOST` | `127.0.0.1` (`npm start`) | Listening address without Docker. Keep it on loopback. |
|
|
656
|
+
| `HOST_LABEL` | server hostname (`wherdr` in Docker) | Name of this machine in the app (can be renamed in the app). |
|
|
657
|
+
| `APP_URL` | *(empty)* | App address and allowed host; a valid HTTPS URL enables Web Push. HTTP, empty or invalid values disable Web Push with a warning. |
|
|
658
|
+
| `HERDR_WEB_ALLOWED_HOSTS` | *(empty)* | Additional hostnames or IP addresses allowed to open the app, comma-separated. |
|
|
659
|
+
| `PASSKEY_USER` | `wherdr` | User name stored with the passkeys. |
|
|
660
|
+
| `DATA_DIR` | `./data` | VAPID keys, push subscriptions, passkeys, recent folders. |
|
|
661
|
+
| `HERDR_BIN` | `~/.local/bin/herdr`, else `herdr` in `PATH` | Herdr binary. |
|
|
662
|
+
| `HERDR_WEB_SESSION` | *(default session)* | Named Herdr session to drive. Not `HERDR_SESSION`, which Herdr reads itself. |
|
|
663
|
+
| `HERDR_WEB_HOST_OPEN_TARGET` | *(unset)* | Docker on a Mac: SSH host that runs Reveal/Open for local panes (see [Docker on a Mac](#wherdr-in-docker-on-a-mac-reveal-in-finder-open-and-modalto)). |
|
|
664
|
+
| `HERDR_WEB_HOST_OPEN_USER` | `root` | SSH user for `HERDR_WEB_HOST_OPEN_TARGET` (your Mac user). |
|
|
665
|
+
| `HERDR_WEB_HOST_OPEN_KEY` | `data/host-open-key` | SSH private key for the host-open route. |
|
|
666
|
+
| `AGENT_KINDS` | all known agents | Agents offered in **New** (only installed ones are shown). |
|
|
667
|
+
| `HERDR_WEB_MACHINES` | `on` | `off` to ignore the SSH machines registered in Herdr. |
|
|
668
|
+
| `HERDR_WEB_SELF_HOSTS` | | Other names / IPs of this machine, comma-separated (profiles pointing to it are ignored). |
|
|
669
|
+
| `HERDR_WEB_REMOTE_SESSION` | | Herdr session to use on every remote machine instead of the profile's. |
|
|
670
|
+
| `HERDR_WEB_HERDR_NOTIFICATIONS` | `on` | `off` to stop relaying `herdr notification show` as push. |
|
|
671
|
+
| `UPLOAD_DIR` | `~/.cache/herdr-web/uploads` | Where photos sent to agents are stored (deleted after 7 days). |
|
|
672
|
+
| `ATTACH_DIR` | `~/.cache/herdr-web/files` | Where other files attached to messages are stored, on the agent's machine (mode 600, deleted after 7 days). |
|
|
673
|
+
| `TZ` | `UTC` | Time zone. |
|
|
674
|
+
|
|
675
|
+
In the app, **Settings** holds per-device preferences: language, theme, notifications, terminal
|
|
676
|
+
text size and renderer, typing effect, what the home screen shows, and the passkey lock.
|
|
677
|
+
|
|
678
|
+
## Several machines (SSH)
|
|
679
|
+
|
|
680
|
+
wherdr also shows the agents of the **SSH machines registered in Herdr** — the ones the Herdr
|
|
681
|
+
terminal client shows in its sidebar. It opens one SSH master connection per machine, forwards
|
|
682
|
+
the remote Herdr socket through it, and reads transcripts and files over the same connection.
|
|
683
|
+
|
|
684
|
+
Requirements on the remote machine: the **same Herdr version** (`herdr --version`), its server
|
|
685
|
+
running, and key-based SSH access from the server. Example, on the server:
|
|
686
|
+
|
|
687
|
+
```sh
|
|
688
|
+
ssh-keygen -t ed25519 -f ~/.ssh/wherdr_ed25519 -N ''
|
|
689
|
+
cat >> ~/.ssh/config <<'CFG'
|
|
690
|
+
Host laptop
|
|
691
|
+
HostName laptop
|
|
692
|
+
User alice
|
|
693
|
+
IdentityFile ~/.ssh/wherdr_ed25519
|
|
694
|
+
IdentitiesOnly yes
|
|
695
|
+
CFG
|
|
696
|
+
ssh-copy-id -i ~/.ssh/wherdr_ed25519 laptop
|
|
697
|
+
ssh laptop true # accept the host key once
|
|
698
|
+
herdr machine add laptop --label Laptop # see `herdr machine --help`
|
|
699
|
+
```
|
|
700
|
+
|
|
701
|
+
wherdr picks it up within 30 seconds; `herdr machine rename|disable|remove` work the same way.
|
|
702
|
+
Machines can also be renamed from the app (machine menu → Options).
|
|
703
|
+
|
|
704
|
+
With Docker, the image includes `openssh-client` and reads `~/.ssh` through the read-only home
|
|
705
|
+
mount. At startup the container creates its user with your `PUID`/`PGID` and `HOST_HOME` as its
|
|
706
|
+
home folder, so ssh finds `~/.ssh` there.
|
|
707
|
+
|
|
708
|
+
## Claude and Codex quotas
|
|
709
|
+
|
|
710
|
+
The home screen shows what is left of the Claude and Codex usage limits (5-hour window and
|
|
711
|
+
week, with reset times), for every online machine.
|
|
712
|
+
|
|
713
|
+
- **Codex**: nothing to do, Codex writes its limits in its session files. Machines on different
|
|
714
|
+
Codex accounts get one block each (told apart by a short hash of the account ID found in the
|
|
715
|
+
session files; `~/.codex/auth.json` is never read).
|
|
716
|
+
- **Claude Code** only gives them to its status line. On each machine, install wherdr's
|
|
717
|
+
invisible status line (it displays nothing, and chains to your existing status line if you
|
|
718
|
+
have one):
|
|
719
|
+
|
|
720
|
+
```sh
|
|
721
|
+
sh scripts/install-claude-statusline.sh
|
|
722
|
+
```
|
|
723
|
+
|
|
724
|
+
The app offers the same thing: a banner "Claude quotas not configured" with **Install** (runs
|
|
725
|
+
it over SSH on a remote machine) and **Copy command**. Quotas show after the next exchange with
|
|
726
|
+
a Claude agent. The status line stores the limits in `~/.cache/herdr-web/claude-status.json`
|
|
727
|
+
and a short hash of the account ID (never a token or email) to tell accounts apart.
|
|
728
|
+
|
|
729
|
+
**New machine**: run `sh scripts/install-claude-statusline.sh` on it once (or click **Install** in
|
|
730
|
+
the banner), then send a message to any Claude agent there; its quotas appear on the home screen.
|
|
731
|
+
|
|
732
|
+
## Notifications
|
|
733
|
+
|
|
734
|
+
With notifications enabled on a device, wherdr sends a Web Push when an agent goes from working
|
|
735
|
+
to **blocked** (with its question and options) or to **done** (with the start of its answer).
|
|
736
|
+
There is no push for the agent currently on screen. Settings → Notifications lets each device
|
|
737
|
+
choose between all agents and main agents only (herdr-projects threads are muted by default).
|
|
738
|
+
|
|
739
|
+
**Do not disturb** (top of Settings → Notifications) stops every push, for this device or for all
|
|
740
|
+
devices, for 1 hour, until 8 am or until turned back on. The server applies it before sending and
|
|
741
|
+
keeps it across restarts (`data/quiet.json` for all devices). While it is on, a crossed-out bell
|
|
742
|
+
next to Settings on the home screen turns it off in one tap.
|
|
743
|
+
|
|
744
|
+
wherdr also relays custom notifications sent with `herdr notification show` (plugins, scripts).
|
|
745
|
+
To receive them it connects to Herdr's client socket as a **passive** client: it never becomes
|
|
746
|
+
the foreground client and never resizes anything. Side effects: with wherdr connected,
|
|
747
|
+
`notification show` reports `shown: true` even with no terminal attached, and an empty session
|
|
748
|
+
gets a default workspace, as with any attached client.
|
|
749
|
+
|
|
750
|
+
## Works great with herdr-projects
|
|
751
|
+
|
|
752
|
+
[herdr-projects](https://github.com/eliasstravik/herdr-projects) is a Herdr plugin that runs a
|
|
753
|
+
project as one **coordinator** conversation and parallel **threads**, each in its own Git
|
|
754
|
+
worktree. It is optional; with it installed, wherdr adds:
|
|
755
|
+
|
|
756
|
+
- **Project groups** in the agent list: the coordinator first, its threads indented under it,
|
|
757
|
+
grouped by repository (`Repo web-shop · 2 worktrees`), with their thread number and state.
|
|
758
|
+
- **Project panel** next to the coordinator (a side panel on a computer, a tab on a phone). It
|
|
759
|
+
reads the project's `TASKS.md` and shows the lists it has, always in this order, with the open
|
|
760
|
+
threads live (state, progress, report) and resolved threads under Done:
|
|
761
|
+
|
|
762
|
+
| List | Meaning | Buttons |
|
|
763
|
+
| --- | --- | --- |
|
|
764
|
+
| **To test** | You confirm the work | Confirm, Problem, Question |
|
|
765
|
+
| **To decide** | Only you can unblock it | Question, Answer |
|
|
766
|
+
| **To review** | Pull requests for you | Reviewed, Comment |
|
|
767
|
+
| **In progress** | What threads are really doing | (live threads) |
|
|
768
|
+
| **In queue** | Decided: the coordinator launches the first one as soon as a thread slot frees | Move up / down, Launch now, Clarify, Remove from queue |
|
|
769
|
+
| **Blocked** | Waiting for someone or something external | Unblock, Clarify |
|
|
770
|
+
| **To do** | To do soon, in your priority order; never launched on its own | Move up / down, Queue it, Launch now, Clarify, Back to backlog |
|
|
771
|
+
| **Backlog** | Everything else | Launch, Clarify |
|
|
772
|
+
| **Done** | Resolved threads | |
|
|
773
|
+
|
|
774
|
+
Every list is **optional**: you and your coordinator pick the ones a project uses (a small
|
|
775
|
+
project may only need Backlog, In progress and Done); any other `##` list shows in a neutral
|
|
776
|
+
style after Backlog. French titles and common synonyms are recognized (À tester, En file,
|
|
777
|
+
À faire, Plus tard…). Every button sends a ready-made message to the coordinator, which edits
|
|
778
|
+
`TASKS.md` (wherdr never writes it). The In queue header shows the thread slots in use
|
|
779
|
+
(`max_parallel_threads` in `PROJECT.md`) and the next task, plus the machine's global limit
|
|
780
|
+
when one is set (`2 of 2 thread slots in use on <machine> (all projects)`).
|
|
781
|
+
- **Max threads per machine**, across all projects: herdr-projects only limits threads per
|
|
782
|
+
project, so three coordinators could still start a dozen threads on one small machine. Set a
|
|
783
|
+
limit per machine in **Settings → Plugins → herdr-projects** (empty `—` = no global limit;
|
|
784
|
+
saved on the server, in `data/thread-limits.json`). wherdr counts the active threads of every
|
|
785
|
+
project from the live panes (herdr-projects marks each open thread's pane): a thread whose agent
|
|
786
|
+
has finished (idle or done, waiting for review or for you) gives its slot back right away; one
|
|
787
|
+
started less than 3 minutes ago still counts while it waits for its brief. wherdr writes
|
|
788
|
+
`.wherdr-limits.json` in each herdr-projects folder where a coordinator runs, refreshed on
|
|
789
|
+
every change:
|
|
790
|
+
|
|
791
|
+
```json
|
|
792
|
+
{ "updated": "…", "this": "Server", "machines": { "Server": { "max": 2, "open": 2, "free": 0, "threads": ["shop/t-0012", "docs/t-0003"] } } }
|
|
793
|
+
```
|
|
794
|
+
|
|
795
|
+
The coordinator rules (Settings) tell the coordinator to read it before starting a thread and
|
|
796
|
+
to wait while `free` is `0`, even if its project still has slots; In queue tasks start when the
|
|
797
|
+
machine has a free slot. `herdr-projects overview` is the fallback when the file is missing.
|
|
798
|
+
The same data is available read-only at `GET /api/plugins/thread-limits`.
|
|
799
|
+
- **Badges**, the only decoration on task lines, chosen by the coordinator (wherdr adds none
|
|
800
|
+
on its own): `[b:color(text)]`, or `[b:color(text)](target)` for a clickable badge with a small ↗.
|
|
801
|
+
The target is an `https://` / `http://` link (new tab) or a thread ID such as `t-0140` (opens
|
|
802
|
+
its tab); any other scheme is ignored. Color is `red`, `orange`, `amber`, `green`, `teal`,
|
|
803
|
+
`blue`, `violet`, `pink`, `gray` (theme-aware), a `#rgb` / `#rrggbb` hex, or empty for neutral;
|
|
804
|
+
at most 24 characters are shown. A bare URL in the text shows as a plain link, and the owner
|
|
805
|
+
`(me)` / `(agent)` is read but not shown. The coordinator rules (Settings) tell the coordinator
|
|
806
|
+
to use badges on its own when they help (status, thread, PR, device, priority…), sparingly,
|
|
807
|
+
and to follow your preferences. Example:
|
|
808
|
+
|
|
809
|
+
```markdown
|
|
810
|
+
- [ ] Stop button on iPhone [b:red(bug)] [b:gray(t-0140)](t-0140) [b:blue(PR #12)](https://github.com/owner/repo/pull/12) (me)
|
|
811
|
+
```
|
|
812
|
+
- **Settings → Plugins → herdr-projects**: install status per machine, the `TASKS.md` convention,
|
|
813
|
+
a template, the max threads per machine and the coordinator rules to copy.
|
|
814
|
+
- **Projects entries** in the menus when the plugin is on the agent's machine: an agent's menu
|
|
815
|
+
(`…`) and its card's (right click, long press on the phone) offer the Project panel, **New
|
|
816
|
+
project…**, **Continue as a project…** (an agent outside a project), **Pause this project…**
|
|
817
|
+
and **Check herdr-projects setup**; the project's header in the list has its own menu with
|
|
818
|
+
the same entries. Shortcuts: `Mod+Alt+P` (Project panel) and `Mod+Alt+Shift+N` (New project).
|
|
819
|
+
The plugin's other actions stay under **Plugin actions**.
|
|
820
|
+
- **New project** with the same machine and folder picker as **New agent**, and the agent
|
|
821
|
+
profiles of its coordinator and threads (see [Herdr plugins](#herdr-plugins)).
|
|
822
|
+
|
|
823
|
+
<p align="center">
|
|
824
|
+
<img src="docs/screenshots/project-panel.png" alt="A coordinator with the Project panel open, and its project group with threads in the sidebar" width="900">
|
|
825
|
+
</p>
|
|
826
|
+
<p align="center">
|
|
827
|
+
<img src="docs/screenshots/project-phone.png" alt="The Project panel on a phone" width="340">
|
|
828
|
+
</p>
|
|
829
|
+
<p align="center"><sub>A coordinator with its Project panel, on a computer and on a phone (demo data).</sub></p>
|
|
830
|
+
|
|
831
|
+
### Using wherdr with herdr-projects
|
|
832
|
+
|
|
833
|
+
The Project panel only works well when the coordinator follows its conventions: which lists
|
|
834
|
+
mean what, the badges, `(agent → t-NNNN)`, and what to do with each message the buttons send
|
|
835
|
+
(`✓ Tested: …`, `✗ Problem: … — …`, `↳ Queue: …`…). They are written once, as an agent skill:
|
|
836
|
+
[`skills/wherdr/SKILL.md`](skills/wherdr/SKILL.md).
|
|
837
|
+
|
|
838
|
+
- **Herdr plugin**: the install links the skill for every coordinator, whatever its agent:
|
|
839
|
+
`~/.claude/skills/wherdr` (Claude Code, or `$CLAUDE_CONFIG_DIR/skills`) and
|
|
840
|
+
`~/.agents/skills/wherdr` (Codex, omp), each only when that agent is installed. Both point to a
|
|
841
|
+
copy in `~/wherdr/skills/wherdr`, refreshed on each update. An existing `wherdr` skill that is
|
|
842
|
+
not this link is left alone. Remove the links with `sh scripts/herdr-plugin.sh skill uninstall`
|
|
843
|
+
in the plugin folder.
|
|
844
|
+
- **Other installs**: link or copy `skills/wherdr` into your agent's skills folder yourself, or
|
|
845
|
+
paste **Settings → Plugins → herdr-projects → Copy rules for the coordinator** to it.
|
|
846
|
+
|
|
847
|
+
## Herdr plugins
|
|
848
|
+
|
|
849
|
+
Actions declared by the plugins installed on a machine (`herdr plugin install|link`) appear in
|
|
850
|
+
the menus: workspace / tab / pane actions in the agent menu, global actions in the machine menu.
|
|
851
|
+
wherdr always passes the agent's pane explicitly. It asks for confirmation before running an
|
|
852
|
+
action, except for actions that only show or check something (list, show, status, doctor…).
|
|
853
|
+
Actions that open a plugin panel open it in the attached Herdr terminal client, not on the phone.
|
|
854
|
+
|
|
855
|
+
**herdr-projects** actions that ask for input (New project, continue this workspace as a
|
|
856
|
+
project, open, pause, resume) are run by wherdr itself as `herdr-projects` commands, because
|
|
857
|
+
Herdr's API cannot pass them arguments. **New project** picks its repository like **New agent**
|
|
858
|
+
picks a folder: the machine (when the project is created from this machine, a repository on an
|
|
859
|
+
SSH machine is passed as `PATH@MACHINE`), a folder browser and recent folders. It suggests the
|
|
860
|
+
root of the current space's Git repository (nothing outside a repository, never your home
|
|
861
|
+
folder itself), offers the root when you pick a subfolder, and names the project after the
|
|
862
|
+
repository. It also asks which agent profile runs the **coordinator** and which one the
|
|
863
|
+
**threads** start with: the profiles of the project's machine (`herdr-projects profile list`:
|
|
864
|
+
yours and the signed-in built-ins such as Claude or omp) that the plugin allows for each role,
|
|
865
|
+
with the plugin's defaults for new projects selected (or the first profile listed, when a default
|
|
866
|
+
is not available there). The choice is written to the project's
|
|
867
|
+
`PROJECT.md` (`coordinator_profile`, `thread_profile`); with a herdr-projects without profiles,
|
|
868
|
+
the choice is not shown.
|
|
869
|
+
With Docker, these commands write to the projects folder, so `docker-compose.yml` mounts
|
|
870
|
+
`~/.herdr-projects` read-write. If you set another `root` in
|
|
871
|
+
`~/.config/herdr-projects/config.toml`, mount that folder instead (same path on both sides);
|
|
872
|
+
otherwise wherdr reports that the home folder is read-only. Check setup only reads; the other
|
|
873
|
+
actions (Configure…) run on the host through Herdr, as in the terminal client. When no herdr-projects
|
|
874
|
+
ticker is running yet, the one these commands start inside the container is stopped right away;
|
|
875
|
+
the next `herdr-projects` command run on the host (a coordinator starting a thread, Herdr
|
|
876
|
+
starting) starts it there.
|
|
877
|
+
|
|
878
|
+
## Security
|
|
879
|
+
|
|
880
|
+
wherdr drives Herdr, so **it can run anything as your user**. Docker does not change that: the
|
|
881
|
+
container talks to the Herdr server running on the host.
|
|
882
|
+
|
|
883
|
+
- It listens on `127.0.0.1` only. Reach it from other devices **only through a private
|
|
884
|
+
network** (Tailscale or [equivalent](#other-private-networks)). Never add a public route
|
|
885
|
+
(port forwarding, public reverse proxy, ngrok…); the only exception is a Cloudflare Tunnel
|
|
886
|
+
behind Cloudflare Access, with its risks.
|
|
887
|
+
- Requests are accepted only for `localhost`, loopback addresses, the runtime's hostname, the
|
|
888
|
+
hostname in `APP_URL`, and the runtime's network interface addresses (those of the container
|
|
889
|
+
with Docker). Add other private names or IP addresses to `HERDR_WEB_ALLOWED_HOSTS`
|
|
890
|
+
(comma-separated) before using them. An unlisted name returns HTTP 403 (`host` / "Host not
|
|
891
|
+
allowed"); add it to `HERDR_WEB_ALLOWED_HOSTS`, then restart wherdr. This host check also
|
|
892
|
+
applies to WebSockets.
|
|
893
|
+
- **Passkey lock** (Settings → Security, recommended): once a passkey is registered, the API,
|
|
894
|
+
images, photos and WebSockets require an unlocked session (signed HttpOnly cookie). Two limits
|
|
895
|
+
apply:
|
|
896
|
+
- **12 hours without use**: the session slides, so the app only locks again after 12 hours
|
|
897
|
+
without any request (or when you lock it from Settings).
|
|
898
|
+
- **Maximum duration** since the last passkey unlock, set in Settings → Security for every
|
|
899
|
+
device: 1 day, 7 days (default), 30 days, 90 days or 1 year. The unlock time is signed in the
|
|
900
|
+
cookie and the slide never moves it. Past it, the device asks for the passkey again at the
|
|
901
|
+
next opening of the app (launch, reload, or back in the foreground), never in the middle of
|
|
902
|
+
use; the app warns in the last hours. A client that never reopens is cut 12 hours after the
|
|
903
|
+
deadline. A shorter duration applies to the sessions already open.
|
|
904
|
+
|
|
905
|
+
A network error or a server restart never locks the app. **Lock all devices** (Settings →
|
|
906
|
+
Security, for a lost or stolen device) ends every session, this one included, and keeps the
|
|
907
|
+
passkeys: each device unlocks again with its own. Turning the lock off removes the passkeys and
|
|
908
|
+
invalidates every session. Lost passkey: delete `data/auth.json` on the server; the app is open
|
|
909
|
+
again to whoever can reach it.
|
|
910
|
+
- <a id="new-device"></a>**New device**: it can only get in with an existing passkey. Unlock it
|
|
911
|
+
with a passkey synced by your password manager (iCloud Keychain, Google Password Manager,
|
|
912
|
+
1Password…), or with the passkey of another device through the browser's "use a phone or
|
|
913
|
+
tablet" QR code, then Settings → Security → **Add this device** to give it its own passkey.
|
|
914
|
+
- Without a passkey, **anyone who can reach the address can control your agents**: every device
|
|
915
|
+
on your tailnet, and every user of your tailnet if you share it.
|
|
916
|
+
- Writes require `Content-Type: application/json` (or `image/*` for photos, `application/octet-stream` for attached files) and an `Origin`
|
|
917
|
+
matching the host, WebSockets included. API reads sent from another site (links, images,
|
|
918
|
+
`no-cors` fetches, reported by the browser's `Sec-Fetch-Site`) are refused too.
|
|
919
|
+
- A strict Content Security Policy limits scripts to the app's own origin and hashed inline
|
|
920
|
+
scripts, and connections to that origin and its WebSockets. It also blocks embedded objects
|
|
921
|
+
and framing.
|
|
922
|
+
- wherdr never changes your agents' global settings: model and effort changes are for the
|
|
923
|
+
current session only.
|
|
924
|
+
|
|
925
|
+
See [SECURITY.md](SECURITY.md) to report a vulnerability.
|
|
926
|
+
|
|
927
|
+
## Troubleshooting
|
|
928
|
+
|
|
929
|
+
- **"The Herdr server is not responding"**: start Herdr on the server (`herdr` or
|
|
930
|
+
`herdr server`). With Docker, check that `HOST_HOME` and `PUID` match your user.
|
|
931
|
+
- **No conversation, only the terminal**: the agent was started before the Herdr integration
|
|
932
|
+
was installed, or it is not Claude Code / Codex / omp. Install the integration
|
|
933
|
+
(`herdr integration install claude|codex|omp`) and start a new agent.
|
|
934
|
+
- **Passkeys or notifications unavailable**: the page must be served over HTTPS (or
|
|
935
|
+
`localhost`). On iPhone, notifications need the app installed on the home screen.
|
|
936
|
+
- **HTTP 403 when opening the app through another name**: add that private hostname or IP
|
|
937
|
+
address to `HERDR_WEB_ALLOWED_HOSTS`, or use the hostname in `APP_URL`, then restart wherdr.
|
|
938
|
+
- **Remote machine offline**: `docker compose logs | grep machine` shows its state. Test SSH as
|
|
939
|
+
wherdr does, from the container:
|
|
940
|
+
`docker compose exec herdr-web ssh -o BatchMode=yes laptop '~/.local/bin/herdr status server'`.
|
|
941
|
+
- `Could not resolve hostname`: container DNS (use the full name in `HostName`);
|
|
942
|
+
- `Permission denied (publickey)` / `Host key verification failed`: key or `known_hosts`
|
|
943
|
+
(run `ssh laptop true` once on the server);
|
|
944
|
+
- `Bad owner or permissions`: `~/.ssh/config` must belong to you and not be group-writable.
|
|
945
|
+
- **Claude says "Not logged in" on a Mac** whose Herdr server was started over SSH: the macOS
|
|
946
|
+
keychain is locked in SSH sessions. Start the Herdr server from a terminal on the Mac.
|
|
947
|
+
- **`Session open refused by peer` / `Connection closed by UNKNOWN port 65535`** in the logs: the
|
|
948
|
+
shared SSH connection to a remote machine reached sshd's session limit (`MaxSessions`, 10 by
|
|
949
|
+
default). wherdr stays under it and retries, so this is rare; if it persists (many terminals
|
|
950
|
+
open at once), raise `MaxSessions` in the remote machine's `sshd_config`.
|
|
951
|
+
- **Quotas missing**: see [Claude and Codex quotas](#claude-and-codex-quotas).
|
|
952
|
+
- **iPhone layout cut at the bottom** after changing the status bar style: reinstall the home
|
|
953
|
+
screen icon (iOS reads this setting at install time).
|
|
954
|
+
|
|
955
|
+
## Contributing
|
|
956
|
+
|
|
957
|
+
See [CONTRIBUTING.md](CONTRIBUTING.md). Changes are listed in [CHANGELOG.md](CHANGELOG.md).
|
|
958
|
+
|
|
959
|
+
Every commit is public: a leak check (gitleaks plus your own forbidden patterns) covers the files
|
|
960
|
+
and the commits about to be pushed; see [Leak check](CONTRIBUTING.md#leak-check).
|
|
961
|
+
|
|
962
|
+
## License
|
|
963
|
+
|
|
964
|
+
[MIT](LICENSE). The embedded font subsets keep their own licenses (`app/assets/fonts/`).
|