herdr-remote 0.2.38 → 0.3.31
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/dist/chunks/353DMT35.js +3 -0
- package/dist/chunks/42KARAL4.js +31 -0
- package/dist/chunks/7AUQHB3O.js +10 -0
- package/dist/chunks/7SMZ43LI.js +9 -0
- package/dist/chunks/AM3OEMFK.js +16 -0
- package/dist/chunks/ANNJESOL.js +10 -0
- package/dist/chunks/AWB4A65P.js +63 -0
- package/dist/chunks/C2UUZY6J.js +2 -0
- package/dist/chunks/DGUZCGQN.js +3 -0
- package/dist/chunks/H24ZP5D5.js +16 -0
- package/dist/chunks/I6NRCYLI.js +3 -0
- package/dist/chunks/JJGEV4EZ.js +3 -0
- package/dist/chunks/KRSURB5L.js +5 -0
- package/dist/chunks/KRVF37OW.js +3 -0
- package/dist/chunks/KUDCC7ZO.js +6 -0
- package/dist/chunks/M3NRPJK2.js +77 -0
- package/dist/chunks/M4AFZHKH.js +3 -0
- package/dist/chunks/M52LJEES.js +6 -0
- package/dist/chunks/O2LNVFUT.js +3 -0
- package/dist/chunks/OJPBI7KB.js +3 -0
- package/dist/chunks/OMN6C7J6.js +3 -0
- package/dist/chunks/PBMBFWLQ.js +3 -0
- package/dist/chunks/PBRQ3HEG.js +3 -0
- package/dist/chunks/PFFVGFPL.js +45 -0
- package/dist/chunks/QRGNEKME.js +5 -0
- package/dist/chunks/TNLCNVA2.js +3 -0
- package/dist/chunks/U27JJKJ6.js +3 -0
- package/dist/chunks/U6QAYG3E.js +3 -0
- package/dist/chunks/UEOQE77N.js +4 -0
- package/dist/chunks/WSACSE45.js +4 -0
- package/dist/chunks/WY7WHEJ4.js +3 -0
- package/dist/chunks/XJKWLK43.js +4 -0
- package/dist/chunks/XN6D5S55.js +3 -0
- package/dist/chunks/YD3MIP7B.js +5 -0
- package/dist/chunks/YXDQ62BB.js +4 -0
- package/dist/cli.js +21 -294
- package/dist/connector/admin-broker.js +3 -302
- package/dist/connector/main.js +20 -18
- package/dist/harfbuzz-subset.wasm +0 -0
- package/dist/postinstall.js +17 -0
- package/herdr-plugin.toml +1 -1
- package/node_modules/herdr-remote-relay/bin/herdr-remote-relay.js +33 -92
- package/node_modules/herdr-remote-relay/package.json +3 -46
- package/package.json +8 -27
- package/dist/agent-status.js +0 -130
- package/dist/binary-plist.js +0 -157
- package/dist/config.js +0 -278
- package/dist/connector/admin-broker-setup.js +0 -40
- package/dist/connector/admin-shell.js +0 -67
- package/dist/connector/admin-tab.js +0 -90
- package/dist/connector/adminBrokerEndpoint.js +0 -68
- package/dist/connector/agent-watch.js +0 -123
- package/dist/connector/elevatedPty.js +0 -141
- package/dist/connector/font-server.js +0 -165
- package/dist/connector/herdr-prefix-keys.js +0 -28
- package/dist/connector/host-connector.js +0 -433
- package/dist/connector/host-hello.js +0 -32
- package/dist/connector/lock.js +0 -73
- package/dist/connector/sessions.js +0 -381
- package/dist/connector/update-report.js +0 -70
- package/dist/connector/wire.js +0 -42
- package/dist/exit-codes.js +0 -13
- package/dist/font-subset.js +0 -110
- package/dist/herdr-api.js +0 -254
- package/dist/herdr-command.js +0 -245
- package/dist/herdr-plugin.js +0 -120
- package/dist/herdr-server.js +0 -190
- package/dist/i18n/en.js +0 -257
- package/dist/i18n/index.js +0 -48
- package/dist/i18n/zh.js +0 -256
- package/dist/keepalive/detached.js +0 -97
- package/dist/keepalive/environment.js +0 -44
- package/dist/keepalive/index.js +0 -129
- package/dist/keepalive/launchd.js +0 -117
- package/dist/keepalive/systemd.js +0 -112
- package/dist/keepalive/types.js +0 -1
- package/dist/keepalive/windows-service-setup.js +0 -138
- package/dist/keepalive/windows-service.js +0 -272
- package/dist/keepalive/windows-task.js +0 -191
- package/dist/lib/process.js +0 -132
- package/dist/lifecycle.js +0 -79
- package/dist/net-interfaces.js +0 -82
- package/dist/node-pty-loader.js +0 -80
- package/dist/pasted-files.js +0 -115
- package/dist/paths.js +0 -74
- package/dist/pty-session.js +0 -133
- package/dist/relay-client.js +0 -106
- package/dist/relay-urls.js +0 -99
- package/dist/runtime.js +0 -107
- package/dist/service.js +0 -267
- package/dist/settings-model.js +0 -298
- package/dist/socket-discovery.js +0 -70
- package/dist/supervisor.js +0 -323
- package/dist/terminal-font/deps.js +0 -83
- package/dist/terminal-font/files.js +0 -357
- package/dist/terminal-font/formats.js +0 -355
- package/dist/terminal-font/index.js +0 -187
- package/dist/terminal-font/readers.js +0 -373
- package/dist/terminal-font/terminals.js +0 -147
- package/dist/terminal-palette.js +0 -399
- package/dist/tui/App.js +0 -199
- package/dist/tui/api.js +0 -91
- package/dist/tui/components/TextField.js +0 -50
- package/dist/tui/components/common.js +0 -80
- package/dist/tui/index.js +0 -36
- package/dist/tui/mouse/index.js +0 -164
- package/dist/tui/mouse/protocol.js +0 -96
- package/dist/tui/mouse/source.js +0 -79
- package/dist/tui/screens/About.js +0 -172
- package/dist/tui/screens/Herdr.js +0 -75
- package/dist/tui/screens/Keepalive.js +0 -141
- package/dist/tui/screens/Overview.js +0 -36
- package/dist/tui/screens/Pair.js +0 -74
- package/dist/tui/screens/Relay.js +0 -243
- package/dist/tui/screens/Services.js +0 -63
- package/dist/tui/screens/Wizard.js +0 -241
- package/dist/tui/terminal.js +0 -39
- package/dist/tui/theme.js +0 -33
- package/dist/update-command.js +0 -118
- package/dist/updater/in-place.js +0 -83
- package/dist/updater/npm.js +0 -62
- package/dist/updater.js +0 -401
- package/node_modules/herdr-remote-relay/README.md +0 -76
- package/node_modules/herdr-remote-relay/README.zh-CN.md +0 -76
- package/node_modules/herdr-remote-relay/config.example.json +0 -18
- package/node_modules/herdr-remote-relay/deploy/cloudflared/config.yml.example +0 -9
- package/node_modules/herdr-remote-relay/deploy/docker/compose.yaml +0 -23
- package/node_modules/herdr-remote-relay/deploy/nginx/herdr-remote-relay.conf.example +0 -49
- package/node_modules/herdr-remote-relay/deploy/systemd/herdr-remote-relay.service +0 -41
- package/node_modules/herdr-remote-relay/deploy/systemd/relay.env.example +0 -25
- package/node_modules/herdr-remote-relay/dist/auth-store.d.ts +0 -114
- package/node_modules/herdr-remote-relay/dist/auth-store.js +0 -289
- package/node_modules/herdr-remote-relay/dist/metrics.d.ts +0 -76
- package/node_modules/herdr-remote-relay/dist/metrics.js +0 -249
- package/node_modules/herdr-remote-relay/dist/protocol/frames.d.ts +0 -27
- package/node_modules/herdr-remote-relay/dist/protocol/frames.js +0 -110
- package/node_modules/herdr-remote-relay/dist/protocol/herdr-keys.d.ts +0 -8
- package/node_modules/herdr-remote-relay/dist/protocol/herdr-keys.js +0 -34
- package/node_modules/herdr-remote-relay/dist/protocol/http.d.ts +0 -165
- package/node_modules/herdr-remote-relay/dist/protocol/http.js +0 -3
- package/node_modules/herdr-remote-relay/dist/protocol/index.d.ts +0 -7
- package/node_modules/herdr-remote-relay/dist/protocol/index.js +0 -9
- package/node_modules/herdr-remote-relay/dist/protocol/messages.d.ts +0 -362
- package/node_modules/herdr-remote-relay/dist/protocol/messages.js +0 -20
- package/node_modules/herdr-remote-relay/dist/protocol/paste.d.ts +0 -14
- package/node_modules/herdr-remote-relay/dist/protocol/paste.js +0 -50
- package/node_modules/herdr-remote-relay/dist/protocol/release.d.ts +0 -8
- package/node_modules/herdr-remote-relay/dist/protocol/release.js +0 -17
- package/node_modules/herdr-remote-relay/dist/protocol/terminal.d.ts +0 -79
- package/node_modules/herdr-remote-relay/dist/protocol/terminal.js +0 -150
- package/node_modules/herdr-remote-relay/dist/relay-config.d.ts +0 -74
- package/node_modules/herdr-remote-relay/dist/relay-config.js +0 -316
- package/node_modules/herdr-remote-relay/dist/relay-server.d.ts +0 -67
- package/node_modules/herdr-remote-relay/dist/relay-server.js +0 -196
- package/node_modules/herdr-remote-relay/dist/scroll-input.d.ts +0 -17
- package/node_modules/herdr-remote-relay/dist/scroll-input.js +0 -124
- package/node_modules/herdr-remote-relay/dist/server/client-channel.d.ts +0 -3
- package/node_modules/herdr-remote-relay/dist/server/client-channel.js +0 -396
- package/node_modules/herdr-remote-relay/dist/server/font-proxy.d.ts +0 -19
- package/node_modules/herdr-remote-relay/dist/server/font-proxy.js +0 -155
- package/node_modules/herdr-remote-relay/dist/server/host-broadcasts.d.ts +0 -27
- package/node_modules/herdr-remote-relay/dist/server/host-broadcasts.js +0 -83
- package/node_modules/herdr-remote-relay/dist/server/host-channel.d.ts +0 -3
- package/node_modules/herdr-remote-relay/dist/server/host-channel.js +0 -271
- package/node_modules/herdr-remote-relay/dist/server/http-api.d.ts +0 -4
- package/node_modules/herdr-remote-relay/dist/server/http-api.js +0 -219
- package/node_modules/herdr-remote-relay/dist/server/maintenance.d.ts +0 -5
- package/node_modules/herdr-remote-relay/dist/server/maintenance.js +0 -64
- package/node_modules/herdr-remote-relay/dist/server/requests.d.ts +0 -34
- package/node_modules/herdr-remote-relay/dist/server/requests.js +0 -142
- package/node_modules/herdr-remote-relay/dist/server/sessions.d.ts +0 -36
- package/node_modules/herdr-remote-relay/dist/server/sessions.js +0 -230
- package/node_modules/herdr-remote-relay/dist/server/sockets.d.ts +0 -12
- package/node_modules/herdr-remote-relay/dist/server/sockets.js +0 -64
- package/node_modules/herdr-remote-relay/dist/server/status.d.ts +0 -11
- package/node_modules/herdr-remote-relay/dist/server/status.js +0 -99
- package/node_modules/herdr-remote-relay/dist/server/transport.d.ts +0 -16
- package/node_modules/herdr-remote-relay/dist/server/transport.js +0 -110
- package/node_modules/herdr-remote-relay/dist/server/types.d.ts +0 -133
- package/node_modules/herdr-remote-relay/dist/server/types.js +0 -3
- package/node_modules/herdr-remote-relay/dist/server/version.d.ts +0 -2
- package/node_modules/herdr-remote-relay/dist/server/version.js +0 -5
- package/node_modules/herdr-remote-relay/dist/state.d.ts +0 -6
- package/node_modules/herdr-remote-relay/dist/state.js +0 -47
- package/node_modules/ws/LICENSE +0 -20
- package/node_modules/ws/README.md +0 -548
- package/node_modules/ws/browser.js +0 -8
- package/node_modules/ws/index.js +0 -22
- package/node_modules/ws/lib/buffer-util.js +0 -131
- package/node_modules/ws/lib/constants.js +0 -19
- package/node_modules/ws/lib/event-target.js +0 -292
- package/node_modules/ws/lib/extension.js +0 -203
- package/node_modules/ws/lib/limiter.js +0 -55
- package/node_modules/ws/lib/permessage-deflate.js +0 -530
- package/node_modules/ws/lib/receiver.js +0 -743
- package/node_modules/ws/lib/sender.js +0 -607
- package/node_modules/ws/lib/stream.js +0 -161
- package/node_modules/ws/lib/subprotocol.js +0 -62
- package/node_modules/ws/lib/validation.js +0 -152
- package/node_modules/ws/lib/websocket-server.js +0 -562
- package/node_modules/ws/lib/websocket.js +0 -1407
- package/node_modules/ws/package.json +0 -74
- package/node_modules/ws/wrapper.mjs +0 -21
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{l as c}from"./UEOQE77N.js";import{a as s}from"./TNLCNVA2.js";import f from"node:os";import i from"node:path";function h(){return i.join(s,"bin","herdr-remote.js")}function p({env:o=process.env,herdrCommand:e=null}={}){let n=String(o.PATH||"").split(i.delimiter).map(r=>r.trim()).filter(Boolean);return e&&n.push(i.dirname(e)),[...new Set(n)].join(i.delimiter)}function P({env:o=process.env,home:e=f.homedir(),directories:n}={}){let r={},t=c({env:o,home:e,...n?{directories:n}:{}});t.found&&(r.HERDR_BIN_PATH=t.command);let m=p({env:o,herdrCommand:t.found?t.command:null});return m&&(r.PATH=m),r}export{h as a,p as b,P as c};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{i as m}from"./PBMBFWLQ.js";import{d,g as _}from"./TNLCNVA2.js";function i(e){return e==="127.0.0.1"||e==="localhost"||e==="::1"||e==="[::1]"}function E(e){let r=typeof e=="string"?e.trim().toLowerCase():"";return r==="0.0.0.0"||r==="::"||r==="[::]"}function R(e){try{let r=new URL(e).hostname.toLowerCase();return r==="0.0.0.0"||r==="::"||r==="[::]"}catch{return!1}}function h(e){return typeof e=="string"?e.trim().replace(/\/+$/,""):""}function N(e){return e.relay.mode!=="remote"}function b(e){return e.relay.mode==="lan"?"0.0.0.0":"127.0.0.1"}function M(e,r=null){if(e.relay.mode==="lan"){let t=e.relay.lanHost;return t&&!i(t)&&!E(t)?t:r&&!i(r)&&!E(r)?r:"127.0.0.1"}return"127.0.0.1"}function B(e,r=null){return e.relay.publicUrl?e.relay.publicUrl:e.relay.mode==="remote"?A(e.relay.remoteUrl):`http://${M(e,r)}:${e.relay.port}`}function I(e){return e.relay.mode==="remote"?A(e.relay.remoteUrl):`http://127.0.0.1:${e.relay.port}`}function w(e){let r=e.relay.mode==="remote"?e.relay.remoteUrl:`ws://127.0.0.1:${e.relay.port}`;return T(r)}function A(e){try{let r=new URL(e);r.protocol==="ws:"&&(r.protocol="http:"),r.protocol==="wss:"&&(r.protocol="https:");let t=r.pathname.replace(/\/+$/,"");return`${r.origin}${t}`}catch{return h(e)}}function T(e){let r=new URL(e);r.protocol==="http:"&&(r.protocol="ws:"),r.protocol==="https:"&&(r.protocol="wss:");let t=r.pathname.replace(/\/+$/,"");return!t||t==="/"?r.pathname=m:t.endsWith(m)||(r.pathname=`${t}${m}`),r.toString()}import u from"node:fs";import c from"node:os";import x from"node:path";import S from"node:path";var F=S.resolve(import.meta.dirname,"..");var s={relay:{mode:"remote",host:"127.0.0.1",port:8787,publicUrl:"http://127.0.0.1:8787",maxPayloadBytes:5*1024*1024,maxClientsPerHost:16,maxHosts:1024,maxPendingHandshakes:1024,maxBufferedBytesPerClient:4*1024*1024,allowedOrigins:[],trustProxy:!1,hostReconnectGraceMs:30*1e3},auth:{pairingTtlMs:600*1e3,deviceTtlMs:720*60*60*1e3,maxDevices:32,password:null,adminToken:null,stateFile:null},cleanup:{intervalMs:60*1e3,heartbeatIntervalMs:30*1e3,staleAfterMs:90*1e3}};var p=["local","lan","remote"],z="wss://herdr-remote.564616.xyz",L=["auto","zh","en"],P=["auto","systemd","launchd","supervisor","windows-task","windows-service","none"];function y(e,r){return e.includes(r)}var a={ui:{language:"auto"},relay:{mode:"local",port:8787,lanHost:"",publicUrl:"",remoteUrl:"",maxPayloadBytes:s.relay.maxPayloadBytes,maxClientsPerHost:s.relay.maxClientsPerHost,maxHosts:s.relay.maxHosts,maxPendingHandshakes:s.relay.maxPendingHandshakes,maxBufferedBytesPerClient:s.relay.maxBufferedBytesPerClient,hostReconnectGraceMs:s.relay.hostReconnectGraceMs,allowedOrigins:[]},herdr:{socketPath:null,args:[],cwd:c.homedir(),autoStart:!1},auth:{pairingTtlMs:s.auth.pairingTtlMs,deviceTtlMs:s.auth.deviceTtlMs,maxDevices:s.auth.maxDevices},cleanup:{...s.cleanup},keepalive:{manager:"auto"}};function H(e){return JSON.parse(JSON.stringify(e))}function O(e){try{return JSON.parse(u.readFileSync(e,"utf8"))}catch(r){let{code:t,message:o}=r;return t!=="ENOENT"&&process.stderr.write(`herdr-remote: ignoring invalid JSON at ${e}: ${o}
|
|
4
|
+
`),{}}}function V(){let e=d();if(u.existsSync(e))return{migrated:!1,reason:"config already exists"};let r=_();if(!r||!u.existsSync(r))return{migrated:!1,reason:"no legacy config"};try{return u.mkdirSync(x.dirname(e),{recursive:!0,mode:448}),u.copyFileSync(r,e),{migrated:!0,from:r,to:e}}catch(t){return{migrated:!1,reason:t.message}}}function f(e){let r=H(a),t=e??{};for(let o of Object.keys(r)){let n=t[o];n&&typeof n=="object"&&Object.assign(r[o],n)}return r}function U(e,r){let t=r?.relay||{};y(p,t.mode)||(t.local===!1&&typeof t.url=="string"&&t.url?(e.relay.mode="remote",e.relay.remoteUrl||(e.relay.remoteUrl=t.url)):typeof t.host=="string"&&t.host&&!i(t.host)?e.relay.mode="lan":e.relay.mode="local"),e.relay.mode==="lan"&&!e.relay.lanHost&&typeof t.host=="string"&&!i(t.host)&&t.host!=="0.0.0.0"&&(e.relay.lanHost=t.host),delete e.relay.local,delete e.relay.host,delete e.relay.url,typeof e.relay.publicUrl=="string"&&/^https?:\/\/(127\.0\.0\.1|localhost)(:\d+)?\/?$/.test(e.relay.publicUrl)&&(e.relay.publicUrl="")}function l(e,r,t,o){let n=Number(e);return!Number.isInteger(n)||n<t||n>o?r:n}function D(e){y(p,e.relay.mode)||(e.relay.mode=a.relay.mode),y(L,e.ui.language)||(e.ui.language=a.ui.language),y(P,e.keepalive.manager)||(e.keepalive.manager=a.keepalive.manager),e.relay.port=l(e.relay.port,a.relay.port,1,65535),e.relay.maxPayloadBytes=l(e.relay.maxPayloadBytes,a.relay.maxPayloadBytes,4096,16*1024*1024),e.relay.maxClientsPerHost=l(e.relay.maxClientsPerHost,a.relay.maxClientsPerHost,1,256),e.relay.maxHosts=l(e.relay.maxHosts,a.relay.maxHosts,1,1e5),e.relay.maxPendingHandshakes=l(e.relay.maxPendingHandshakes,a.relay.maxPendingHandshakes,16,1e5),e.relay.maxBufferedBytesPerClient=l(e.relay.maxBufferedBytesPerClient,a.relay.maxBufferedBytesPerClient,64*1024,256*1024*1024),e.relay.hostReconnectGraceMs=l(e.relay.hostReconnectGraceMs,a.relay.hostReconnectGraceMs,1e3,1440*60*1e3),e.auth.pairingTtlMs=l(e.auth.pairingTtlMs,a.auth.pairingTtlMs,30*1e3,1440*60*1e3),e.auth.deviceTtlMs=l(e.auth.deviceTtlMs,a.auth.deviceTtlMs,60*1e3,365*24*60*60*1e3),e.auth.maxDevices=l(e.auth.maxDevices,a.auth.maxDevices,1,1e4),e.cleanup.intervalMs=l(e.cleanup.intervalMs,a.cleanup.intervalMs,1e3,1440*60*1e3),e.cleanup.heartbeatIntervalMs=l(e.cleanup.heartbeatIntervalMs,a.cleanup.heartbeatIntervalMs,1e3,600*1e3),e.cleanup.staleAfterMs=l(e.cleanup.staleAfterMs,a.cleanup.staleAfterMs,e.cleanup.heartbeatIntervalMs*2,1440*60*1e3),e.relay.publicUrl=h(e.relay.publicUrl),e.relay.remoteUrl=h(e.relay.remoteUrl),e.relay.lanHost=typeof e.relay.lanHost=="string"?e.relay.lanHost.trim():"",e.relay.mode==="lan"&&(i(e.relay.lanHost)||E(e.relay.lanHost))&&(e.relay.lanHost=""),R(e.relay.publicUrl)&&(e.relay.publicUrl=""),Array.isArray(e.relay.allowedOrigins)||(e.relay.allowedOrigins=[]),(!Array.isArray(e.herdr.args)||!e.herdr.args.every(t=>typeof t=="string"))&&(e.herdr.args=[]);let r=e.herdr.args;return r.includes("--no-session")&&(e.herdr.args=r.filter(t=>t!=="--no-session"),process.stderr.write(`herdr-remote: ignoring removed --no-session argument (removed in Herdr 0.9.0)
|
|
5
|
+
`)),(typeof e.herdr.socketPath!="string"||e.herdr.socketPath.length===0)&&(e.herdr.socketPath=null),(typeof e.herdr.cwd!="string"||e.herdr.cwd.length===0)&&(e.herdr.cwd=c.homedir()),e.herdr.autoStart=e.herdr.autoStart===!0,e.relay.mode==="remote"&&!e.relay.remoteUrl&&(e.relay.mode="local"),e}function Y(e){let r=process.env;if(r.HERDR_REMOTE_LANG&&y(L,r.HERDR_REMOTE_LANG)&&(e.ui.language=r.HERDR_REMOTE_LANG),r.HERDR_REMOTE_MODE&&y(p,r.HERDR_REMOTE_MODE)&&(e.relay.mode=r.HERDR_REMOTE_MODE),r.RELAY_PORT&&(e.relay.port=r.RELAY_PORT),r.RELAY_PUBLIC_URL&&(e.relay.publicUrl=r.RELAY_PUBLIC_URL),r.RELAY_REMOTE_URL&&(e.relay.remoteUrl=r.RELAY_REMOTE_URL),r.RELAY_MAX_HOSTS&&(e.relay.maxHosts=r.RELAY_MAX_HOSTS),r.RELAY_MAX_PENDING_HANDSHAKES&&(e.relay.maxPendingHandshakes=r.RELAY_MAX_PENDING_HANDSHAKES),r.RELAY_MAX_BUFFERED_BYTES_PER_CLIENT&&(e.relay.maxBufferedBytesPerClient=r.RELAY_MAX_BUFFERED_BYTES_PER_CLIENT),r.RELAY_HOST_RECONNECT_GRACE_MS&&(e.relay.hostReconnectGraceMs=r.RELAY_HOST_RECONNECT_GRACE_MS),r.HERDR_SOCKET_PATH&&(e.herdr.socketPath=r.HERDR_SOCKET_PATH),r.HERDR_CWD&&(e.herdr.cwd=r.HERDR_CWD),r.HERDR_ARGS_JSON)try{let t=JSON.parse(r.HERDR_ARGS_JSON);Array.isArray(t)&&(e.herdr.args=t)}catch(t){process.stderr.write(`herdr-remote: invalid HERDR_ARGS_JSON: ${t.message}
|
|
6
|
+
`)}}function q(){let e=O(d()),r=f(e);return U(r,e),Y(r),D(r)}function Q(){return u.existsSync(d())}export{i as a,E as b,R as c,N as d,b as e,B as f,I as g,w as h,T as i,p as j,z as k,L as l,P as m,V as n,q as o,Q as p};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o}from"./PBRQ3HEG.js";import"./U6QAYG3E.js";import"./KRVF37OW.js";import"./QRGNEKME.js";import"./PBMBFWLQ.js";import"./TNLCNVA2.js";import"./I6NRCYLI.js";export{b as ANSI_KEYS,a as ANSI_SLOTS,n as captureTerminalPalette,h as collectPalette,o as hostTerminalPalette,f as paletteFromEnvironment,d as parseOscColorReply,c as parseXColor,j as probeConsolePalette,i as probeTerminalPalette,k as rememberTerminalPalette,l as rememberedTerminalPalette,m as resolveHostPalette,e as sanitizePalette,g as takeOscColorReply};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{a,b,c,d,e,f,g,h,i}from"./KRSURB5L.js";import"./DGUZCGQN.js";import"./JJGEV4EZ.js";import"./H24ZP5D5.js";import"./PBRQ3HEG.js";import"./U6QAYG3E.js";import"./UEOQE77N.js";import"./M52LJEES.js";import"./KRVF37OW.js";import"./QRGNEKME.js";import"./PBMBFWLQ.js";import"./TNLCNVA2.js";import"./I6NRCYLI.js";export{c as baseEnvironment,h as pair,i as readLogTail,a as relayBinPath,f as restartServices,b as serviceSpecs,d as startServices,g as statusServices,e as stopServices};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{a as e,b as f,c as g,d as h,e as i,f as j,g as k,h as l,i as m,j as n}from"./PFFVGFPL.js";import{a as c,b as d}from"./AWB4A65P.js";import{b as a,c as b}from"./M4AFZHKH.js";import"./UEOQE77N.js";import"./M52LJEES.js";import"./KRVF37OW.js";import"./QRGNEKME.js";import"./PBMBFWLQ.js";import"./TNLCNVA2.js";import"./I6NRCYLI.js";export{g as detectManager,m as enableLinger,c as escapeXml,i as install,n as logsHint,d as renderLaunchdPlist,f as renderSystemdUnit,k as restart,b as serviceEnvironment,a as servicePath,h as status,l as stopManaged,e as systemdEnvironmentLine,j as uninstall};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
var T=["black","red","green","yellow","blue","magenta","cyan","white","brightBlack","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite"],R=["regular","bold","italic","boldItalic"],I=["truetype","opentype"],S=["cjk","all"];var y=/^#[0-9a-f]{6}$/i,w=/["'\\;,{}<>@\u0000-\u001f\u007f]/,h=/^[0-9a-f]{64}$/;function E(t){return!!t&&typeof t=="object"&&!Array.isArray(t)}function p(t,e){return t.includes(e)}function A(t){return typeof t=="string"&&y.test(t)?t.toLowerCase():void 0}function O(t){if(!E(t))return null;let e={};for(let r of["background","foreground","cursor"]){let o=A(t[r]);o&&(e[r]=o)}let n=t.ansi;if(E(n)){let r={};for(let o of T){let i=A(n[o]);i&&(r[o]=i)}Object.keys(r).length===T.length&&(e.ansi=r)}return Object.keys(e).length>0?e:null}function d(t){let e=typeof t=="string"?t.trim():"";return!e||e.length>128||w.test(e)?null:e}function U(t){if(!E(t))return null;let e=d(t.family);if(!e)return null;let n=Number(t.sizePx),r=Number.isFinite(n)&&n>=4&&n<=96?Math.round(n*10)/10:null,o=typeof t.source=="string"&&/^[a-z0-9-]{1,32}$/.test(t.source)?t.source:null,i=[],l=new Set;for(let f of Array.isArray(t.faces)?t.faces.slice(0,16):[]){if(!E(f))continue;let{style:a,format:c,bytes:s,sha256:u}=f;!p(R,a)||l.has(a)||p(I,c)&&(typeof s!="number"||!Number.isInteger(s)||s<=0||s>16777216||typeof u!="string"||!h.test(u)||(l.add(a),i.push({style:a,format:c,bytes:s,sha256:u})))}let m=[];for(let f of Array.isArray(t.subsets)?t.subsets.slice(0,16):[]){if(!E(f))continue;let a=d(f.family),{scope:c,sha256:s}=f;!a||f.style!=="regular"||p(S,c)&&(typeof s!="string"||!h.test(s)||m.some(u=>u.scope===c)||m.push({family:a,style:"regular",scope:c,sha256:s}))}return{family:e,...r!==null&&{sizePx:r},...o!==null&&{source:o},faces:i,subsets:m}}var M="dibin666/herdr-remote",g=`https://github.com/${M}/releases`,Y=`${g}/latest/download/latest.json`,L=`${g}/latest/download/herdr-remote.tgz`;function b(t){return`${g}/download/herdr-remote-v${t}/herdr-remote-${t}.tgz`}function _(t){return Buffer.isBuffer(t)?t:(typeof t=="string"||t instanceof ArrayBuffer,Buffer.from(t))}function k(t,e,n=Buffer.alloc(0)){if(typeof t!="string"||!t||typeof e!="string"||!e)throw new TypeError("type and streamId must be non-empty strings");let r=_(n),o=Buffer.from(JSON.stringify({type:t,streamId:e}),"utf8");if(o.length>8192)throw new RangeError("stream frame header is too large");let i=Buffer.allocUnsafe(4);return i.writeUInt32BE(o.length,0),Buffer.concat([i,o,r])}function P(t){let e=_(t);if(e.length<4)throw new Error("stream frame is truncated");let n=e.readUInt32BE(0);if(n===0||n>8192||e.length<4+n)throw new Error("stream frame header is invalid");let r;try{r=JSON.parse(e.subarray(4,4+n).toString("utf8"))}catch(o){throw new Error(`stream frame header is not JSON: ${o.message}`)}if(!r||typeof r.type!="string"||typeof r.streamId!="string")throw new Error("stream frame header is missing routing fields");return{version:1,type:r.type,streamId:r.streamId,payload:e.subarray(4+n)}}function X(t,e,n=Buffer.alloc(0)){let r=t;if(t==="output"?r=0:t==="input"&&(r=1),r!==0&&r!==1)throw new TypeError("type must be FRAME_TYPE_OUTPUT (0) or FRAME_TYPE_INPUT (1)");if(!Number.isInteger(e)||e<0||e>65535)throw new RangeError("streamIndex must be an unsigned 16-bit integer (0-65535)");let o=_(n),i=Buffer.allocUnsafe(4+o.length);return i.writeUInt8(255,0),i.writeUInt8(r,1),i.writeUInt16BE(e,2),o.copy(i,4),i}function F(t){let e=_(t);if(e.length<4)throw new Error("v2 stream frame is truncated");if(e.readUInt8(0)!==255)throw new Error("invalid v2 stream frame magic byte");let r=e.readUInt8(1);if(r!==0&&r!==1)throw new Error(`unknown v2 stream frame type: ${r}`);let o=e.readUInt16BE(2);return{version:2,type:r===0?"output":"input",typeCode:r,streamIndex:o,payload:e.subarray(4)}}function C(t){let e=_(t);if(e.length<4)throw new Error("stream frame is truncated");return e[0]===255?F(e):P(e)}var N=/^[\x21-\x7e]+$/;function z(t){if(!Array.isArray(t))return;let e=new Set;for(let n of t){if(e.size>=8)break;if(typeof n!="string")continue;let r=n.replace(/\s+/g,"").toLowerCase();r.length<=32&&N.test(r)&&e.add(r)}return e.size>0?[...e]:void 0}var G="/ws/host";var D={hostHandoff:"host_handoff",idleHeartbeat:"idle_heartbeat",binaryFrameV2:"binary_frame_v2",adminTabs:"admin_tabs"};var x={"image/png":".png","image/jpeg":".jpg","image/webp":".webp","image/gif":".gif"},K=Object.keys(x);function J(t){return typeof t=="string"&&Object.hasOwn(x,t)}function W(t,e){switch(t){case"image/png":return e.length>=8&&e[0]===137&&e[1]===80&&e[2]===78&&e[3]===71;case"image/jpeg":return e.length>=3&&e[0]===255&&e[1]===216&&e[2]===255;case"image/webp":return e.length>=12&&e[0]===82&&e[1]===73&&e[2]===70&&e[3]===70&&e[8]===87&&e[9]===69&&e[10]===66&&e[11]===80;case"image/gif":return e.length>=6&&e[0]===71&&e[1]===73&&e[2]===70&&e[3]===56;default:return!1}}export{k as a,X as b,C as c,T as d,R as e,O as f,U as g,z as h,G as i,D as j,x as k,J as l,W as m,g as n,Y as o,L as p,b as q};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{a as g,c as S}from"./U6QAYG3E.js";import{d as p,f as b}from"./PBMBFWLQ.js";import f from"node:fs";import{spawnSync as O}from"node:child_process";var A=p.length,D="3",M=2,h=3e3,P=p;function v(e){if(typeof e!="string")return null;let n=/^rgba?:([0-9a-f]+)\/([0-9a-f]+)\/([0-9a-f]+)/i.exec(e.trim());if(!n)return null;let t=n.slice(1,4).map(r=>{let l=r.length;if(l===0||l>4)return null;let i=Math.round(parseInt(r,16)/(16**l-1)*255);return Math.max(0,Math.min(255,i))});return t.some(r=>r===null)?null:`#${t.map(r=>r.toString(16).padStart(2,"0")).join("")}`}function R(e,n){if(typeof e!="string")return null;let t=e.indexOf(`${n};`);if(t===-1)return null;let r=e.indexOf("\x1B\\",t),l=e.indexOf("\x07",t),i=-1,s=-1;if(r!==-1&&(l===-1||r<l))i=r,s=r+2;else if(l!==-1)i=l,s=l+1;else return null;let o=v(e.slice(t+n.length+1,i).trim());return o?{color:o,start:t,end:s}:null}function C(e,n){return R(e,n)?.color??null}var d=b;function T(e=process.env){let n=e.HERDR_TERM_PALETTE_JSON;if(!n)return null;try{return d(JSON.parse(n))}catch{return null}}function m(e,n){return O("stty",[...e,"-F",n],{encoding:"utf8",timeout:1e3,windowsHide:!0})}function y(e,n){let t=R(e.pending,n);return t?(e.pending=e.pending.slice(0,t.start)+e.pending.slice(t.end),t.color):null}var _=[{query:"\x1B]10;?\x1B\\",prefix:"\x1B]10",paletteKey:"foreground"},{query:"\x1B]11;?\x1B\\",prefix:"\x1B]11",paletteKey:"background"},{query:"\x1B]12;?\x1B\\",prefix:"\x1B]12",paletteKey:"cursor"},...P.map((e,n)=>({query:`\x1B]4;${n};?\x1B\\`,prefix:`\x1B]4;${n}`,paletteKey:"ansi",ansiKey:e}))];function x(e){let n={},t={};for(let r of _){let l=e(r.query,r.prefix);if(r.paletteKey==="ansi"){if(!l)break;t[r.ansiKey]=l}else l&&(n[r.paletteKey]=l)}return Object.keys(t).length===A&&(n.ansi=t),d(n)}function N(e,n,t,r){f.writeSync(e,n);let l=Buffer.alloc(256),i=0;for(;i<M&&Date.now()<r.overallDeadline;){let s=y(r,t);if(s)return s;let o=0;try{o=f.readSync(e,l,0,l.length,null)}catch(a){if(a.code==="EAGAIN"){i+=1;continue}return null}o>0?(r.pending+=l.toString("latin1",0,o),i=0):i+=1}return y(r,t)}function E({ttyPath:e="/dev/tty",timeoutMs:n=h}={}){if(process.platform==="win32")return null;let t=null,r=null;try{t=f.openSync(e,"r+")}catch{return null}try{let l=m(["-g"],e);if(l.status!==0||(r=l.stdout.trim(),m(["raw","-echo","min","0","time",D],e).status!==0))return null;let i={pending:"",overallDeadline:Date.now()+n},s=t;return x((o,a)=>N(s,o,a,i))}catch{return null}finally{if(r&&m([r],e),t!==null)try{f.closeSync(t)}catch{}}}async function I({input:e=process.stdin,output:n=process.stdout,timeoutMs:t=h}={}){if(!e.isTTY||!n.isTTY)return null;let r={pending:"",overallDeadline:Date.now()+t},l=null,i;try{return e.setRawMode(!0),await new Promise(s=>{let o=!1,a=()=>{o||(o=!0,s())};l=c=>{r.pending+=typeof c=="string"?c:c.toString("latin1"),/\x1b\[\?[\d;]*c/.test(r.pending)&&a()},e.on("data",l),e.resume(),i=setTimeout(a,Math.max(0,r.overallDeadline-Date.now())),n.write(`${_.map(({query:c})=>c).join("")}\x1B[c`)}),x((s,o)=>y(r,o))}catch{return null}finally{i&&clearTimeout(i),l&&e.removeListener("data",l);try{e.setRawMode(!1)}catch{}e.pause()}}function w(e){let n=d(e);if(!n)return null;try{S(t=>{t.terminalPalette=n})}catch{}return n}function K(){try{return d(g().terminalPalette)}catch{return null}}function J({env:e=process.env,probe:n=E}={}){return T(e)||n()||null}async function $({env:e=process.env,probe:n=E,platform:t=process.platform,consoleProbe:r=I}={}){if(e.HERDR_TERM_PALETTE_JSON)return T(e);if(!process.stdin.isTTY||!process.stdout.isTTY)return null;let l=t==="win32"?await r():n();return l?(e.HERDR_TERM_PALETTE_JSON=JSON.stringify(l),w(l),l):null}var u;function j({refresh:e=!1}={}){if(!e&&u!==void 0)return u;let n=T();if(n)return u=n,u;let t=E();return u=t?w(t):K(),u}export{A as a,P as b,v as c,C as d,d as e,T as f,y as g,x as h,E as i,I as j,w as k,K as l,J as m,$ as n,j as o};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{a as F,b as B,c as q,d as Q,e as P,g as r,h,m as i}from"./AWB4A65P.js";import{a as m,b as G,c as a}from"./M4AFZHKH.js";import{o as u}from"./M52LJEES.js";import{b as U,c as j}from"./KRVF37OW.js";import{a as w,b as M,c as W}from"./QRGNEKME.js";import{b as C,c as d,f as N}from"./TNLCNVA2.js";import{c as it}from"./I6NRCYLI.js";var It={};it(It,{detectManager:()=>rt,enableLinger:()=>At,escapeXml:()=>F,install:()=>Pt,logsHint:()=>xt,renderLaunchdPlist:()=>B,renderSystemdUnit:()=>O,restart:()=>Dt,serviceEnvironment:()=>a,servicePath:()=>G,status:()=>st,stopManaged:()=>bt,systemdEnvironmentLine:()=>L,uninstall:()=>Rt});import{spawnSync as Et}from"node:child_process";import tt from"node:fs";import Nt from"node:os";import et from"node:path";import{spawn as at}from"node:child_process";import D from"node:fs";import ct from"node:path";function k(){return ct.join(d(),"supervisor.pid")}function b(){let t=W(k(),{});return j([t]).length>0?t.pid:null}function X(){let t=b();if(t!==null)return{ok:!0,alreadyRunning:!0,pid:t};w(d());let e=D.openSync(N("supervisor"),"a");try{let n=at(process.execPath,[m(),"run","--daemon"],{cwd:d(),env:{...process.env,HERDR_REMOTE_SERVICE:"1",...a()},detached:!0,windowsHide:!0,stdio:["ignore",e,e]});return n.unref(),M(k(),{pid:n.pid,processStart:n.pid?U(n.pid):null,startedAt:new Date().toISOString()}),{ok:!0,pid:n.pid,note:"this fallback does not survive a reboot"}}finally{D.closeSync(e)}}function R(){let t=b();if(t!==null)try{process.kill(t,"SIGTERM")}catch{}return D.rmSync(k(),{force:!0}),{ok:!0,stoppedPid:t}}function A(t=process.platform,e=N("supervisor")){return t==="win32"?`Get-Content -Wait -Tail 40 "${e}"`:`tail -f ${e}`}var J={name:"supervisor",status(){let t=b(),e=t!==null;return{manager:"supervisor",installed:e,active:e,enabled:!1,pid:e?t:null,unitPath:k(),state:e?"running":"stopped"}},async install(){return X()},async uninstall(){return R()},restart(){return R(),X()},stop(){R()},logsHint(){return A()}};import{spawnSync as V}from"node:child_process";import x from"node:fs";import I from"node:os";import _ from"node:path";var c="herdr-remote.service";function $(){let t=process.env.XDG_CONFIG_HOME||_.join(I.homedir(),".config");return _.join(t,"systemd","user",c)}function L(t,e){let n=String(e).replace(/[\r\n]+/g," ").replace(/%/g,"%%");return/^[\w@+=:,./-]*$/.test(n)?`Environment=${t}=${n}`:`Environment="${t}=${n.replace(/([\\"])/g,"\\$1")}"`}function O({nodePath:t=process.execPath,entryPoint:e=m(),environment:n={}}={}){let s=Object.entries(n).map(([o,S])=>L(o,S)).join(`
|
|
4
|
+
`);return`[Unit]
|
|
5
|
+
Description=Herdr Remote (relay and host connector)
|
|
6
|
+
Documentation=https://github.com/dibin666/herdr-remote
|
|
7
|
+
After=default.target
|
|
8
|
+
|
|
9
|
+
[Service]
|
|
10
|
+
Type=simple
|
|
11
|
+
ExecStart=${t} ${e} run
|
|
12
|
+
Restart=always
|
|
13
|
+
RestartSec=3
|
|
14
|
+
# Give the relay and host connector time to close sessions cleanly.
|
|
15
|
+
TimeoutStopSec=15
|
|
16
|
+
${s}
|
|
17
|
+
|
|
18
|
+
[Install]
|
|
19
|
+
WantedBy=default.target
|
|
20
|
+
`}function l(t){return V("systemctl",["--user",...t],{encoding:"utf8",stdio:"pipe",windowsHide:!0})}function K(t,e){let n=l(t);if(n.status!==0)throw new Error(`${e}: ${String(n.stderr||"").trim()}`)}var Y={name:"systemd",status(){if(!x.existsSync($()))return{manager:"systemd",installed:!1,active:!1,enabled:!1};let e=l(["is-active",c]),n=l(["is-enabled",c]),s=V("loginctl",["show-user",I.userInfo().username,"--property=Linger"],{encoding:"utf8",windowsHide:!0});return{manager:"systemd",installed:!0,active:String(e.stdout||"").trim()==="active",enabled:String(n.stdout||"").trim().startsWith("enabled"),linger:String(s.stdout||"").includes("Linger=yes"),unitPath:$(),state:String(e.stdout||e.stderr||"").trim()}},async install(){let t=$();return w(_.dirname(t)),x.writeFileSync(t,O({environment:a()}),{mode:420}),K(["daemon-reload"],"systemctl --user daemon-reload failed"),K(["enable","--now",c],"systemctl --user enable --now failed"),{ok:!0,unitPath:t,hint:`loginctl enable-linger ${I.userInfo().username}`}},async uninstall(){let t=$();return l(["disable","--now",c]),x.rmSync(t,{force:!0}),l(["daemon-reload"]),{ok:!0,unitPath:t}},restart(){let t=l(["restart",c]);if(t.status!==0)throw new Error(String(t.stderr||"").trim()||"systemctl restart failed");return{ok:!0}},stop(){l(["stop",c])},logsHint(){return`journalctl --user -u ${c} -f`}};import{spawnSync as Z}from"node:child_process";import ut from"node:fs";import lt from"node:path";var dt=15e3,mt=15e3,z=250;function p(t=P().user){return Q(t)}function ft(t){let e={...t.environment,HERDR_REMOTE_CONFIG_DIR:t.configDirectory,HERDR_REMOTE_STATE_DIR:t.stateDirectory,HERDR_REMOTE_SERVICE:"1"};return`$ErrorActionPreference = 'Stop'
|
|
21
|
+
${Object.entries(e).map(([s,o])=>`$env:${s} = '${r(o)}'`).join(`
|
|
22
|
+
`)}
|
|
23
|
+
Set-Location -LiteralPath '${r(t.workingDirectory)}'
|
|
24
|
+
& '${r(t.nodePath)}' '${r(t.entryPoint)}' run --daemon
|
|
25
|
+
exit $LASTEXITCODE`}function pt(t){let e=r(t.taskName),n=r(t.account),s=r(t.powershellPath),o=r(t.workingDirectory),S=`-NoLogo -NoProfile -NonInteractive -WindowStyle Hidden -EncodedCommand ${h(t.launchScript)}`;return`$ErrorActionPreference = 'Stop'
|
|
26
|
+
$action = New-ScheduledTaskAction -Execute '${s}' -Argument '${S}' -WorkingDirectory '${o}'
|
|
27
|
+
$trigger = New-ScheduledTaskTrigger -AtLogOn -User '${n}'
|
|
28
|
+
# Interactive logon uses the signed-in token and avoids storing account credentials.
|
|
29
|
+
$principal = New-ScheduledTaskPrincipal -UserId '${n}' -LogonType Interactive -RunLevel Limited
|
|
30
|
+
$settings = New-ScheduledTaskSettingsSet -StartWhenAvailable -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -RestartCount 3 -RestartInterval (New-TimeSpan -Minutes 1) -ExecutionTimeLimit ([TimeSpan]::Zero) -MultipleInstances IgnoreNew
|
|
31
|
+
Register-ScheduledTask -TaskName '${e}' -Description 'Herdr Remote keep-alive' -Action $action -Trigger $trigger -Principal $principal -Settings $settings -Force | Out-Null
|
|
32
|
+
Enable-ScheduledTask -TaskName '${e}' | Out-Null
|
|
33
|
+
Start-ScheduledTask -TaskName '${e}'`}function St(t){try{let e=JSON.parse(t.replace(/^\uFEFF/,"").trim()).State;return e==="Ready"||e==="Queued"||e==="Running"||e==="Disabled"?e:"Absent"}catch{return"Absent"}}function H(){let t=process.env.SystemRoot||process.env.WINDIR||"C:\\Windows";return lt.join(t,"System32","WindowsPowerShell","v1.0","powershell.exe")}function gt(t){return`$ErrorActionPreference = 'Stop'
|
|
34
|
+
$task = Get-ScheduledTask -TaskName '${r(t)}' -ErrorAction SilentlyContinue
|
|
35
|
+
if ($null -eq $task) { '{"State":"Absent"}'; exit 0 }
|
|
36
|
+
[pscustomobject]@{ State = [string]$task.State } | ConvertTo-Json -Compress`}function y(t,e){let n=Z(H(),["-NoLogo","-NoProfile","-NonInteractive","-EncodedCommand",h(t)],{encoding:"utf8",windowsHide:!0});if(n.error||n.status!==0){let s=String(n.stderr||n.stdout||"").trim();throw new Error(`${e} failed (${String(n.status)}): ${s}`)}return String(n.stdout||"").trim()}function f(){let t=Z(H(),["-NoProfile","-NoLogo","-NonInteractive","-EncodedCommand",h(gt(p()))],{encoding:"utf8",windowsHide:!0});return t.error||t.status!==0?"Absent":St(String(t.stdout||""))}function wt(){let{domain:t,user:e}=P();return t?`${t}\\${e}`:e}function ht(t){let e=r(t);return`$ErrorActionPreference = 'Stop'
|
|
37
|
+
$task = Get-ScheduledTask -TaskName '${e}' -ErrorAction SilentlyContinue
|
|
38
|
+
if ($null -eq $task -or ($task.State -ne 'Running' -and $task.State -ne 'Queued')) { exit 0 }
|
|
39
|
+
Stop-ScheduledTask -TaskName '${e}'
|
|
40
|
+
$deadline = [DateTime]::UtcNow.AddMilliseconds(${mt})
|
|
41
|
+
do {
|
|
42
|
+
Start-Sleep -Milliseconds ${z}
|
|
43
|
+
$task = Get-ScheduledTask -TaskName '${e}' -ErrorAction SilentlyContinue
|
|
44
|
+
} while ($task -and ($task.State -eq 'Running' -or $task.State -eq 'Queued') -and [DateTime]::UtcNow -lt $deadline)
|
|
45
|
+
if ($task -and ($task.State -eq 'Running' -or $task.State -eq 'Queued')) { throw 'Scheduled task did not stop in time.' }`}function v(){let t=f();(t==="Running"||t==="Queued")&&y(ht(p()),"Stopping the Windows scheduled task")}function kt(){let t=d();return{nodePath:process.execPath,entryPoint:m(),workingDirectory:t,configDirectory:C(),stateDirectory:t,environment:a()}}function $t(){let t=f(),e=t!=="Absent";return{manager:"windows-task",installed:e,active:t==="Running",enabled:e&&t!=="Disabled",state:t.toLowerCase()}}async function yt(){f()!=="Absent"&&v(),i.status().installed&&await i.uninstall();let t=kt();await ut.promises.mkdir(t.workingDirectory,{recursive:!0});let e=ft(t),n=pt({taskName:p(),account:wt(),powershellPath:H(),workingDirectory:t.workingDirectory,launchScript:e});y(n,"Installing the Windows scheduled task");let s=Date.now()+dt,o=f();for(;o!=="Running"&&o!=="Absent"&&Date.now()<s;)await new Promise(S=>setTimeout(S,z)),o=f();if(o!=="Running")throw new Error(`Windows scheduled task did not start (state: ${o.toLowerCase()}).`);return{ok:!0,taskName:p(),state:o}}async function vt(){let t=p();if(f()!=="Absent"){v();let e=r(t);y(`Unregister-ScheduledTask -TaskName '${e}' -Confirm:$false -ErrorAction Stop`,"Removing the Windows scheduled task")}return i.status().installed&&await i.uninstall(),{ok:!0,taskName:t}}function Tt(){v();let t=r(p());return y(`Start-ScheduledTask -TaskName '${t}'`,"Starting the Windows scheduled task"),{ok:!0}}var T={name:"windows-task",status:$t,install:yt,uninstall:vt,restart:Tt,stop:v,logsHint:()=>A("win32")};function nt(t){return(process.env.PATH||"").split(et.delimiter).filter(Boolean).some(e=>{try{return tt.accessSync(et.join(e,t),tt.constants.X_OK),!0}catch{return!1}})}function rt(t="auto",e=process.platform){return t&&t!=="auto"?t:e==="win32"?"windows-task":e==="linux"?nt("systemctl")&&(process.env.DBUS_SESSION_BUS_ADDRESS||process.env.XDG_RUNTIME_DIR)?"systemd":"supervisor":e==="darwin"&&nt("launchctl")?"launchd":"supervisor"}function E(t){return rt(t.keepalive?.manager||"auto")}function ot(t){return t==="systemd"?Y:t==="launchd"?q:t==="windows-task"?T:t==="windows-service"?i:J}function g(t){let e=E(t);if(e==="windows-task"){if(T.status().installed)return T;if(i.status().installed)return i}return ot(e)}function st(t=u()){return E(t)==="none"?{manager:"none",installed:!1,active:!1,enabled:!1}:g(t).status()}async function Pt(t=u()){if(E(t)==="none")throw new Error("keep-alive is disabled in the configuration");let e=ot(E(t));return{manager:e.name,...await e.install()}}async function Rt(t=u()){let e=g(t);return{manager:e.name,...await e.uninstall()}}function Dt(t=u()){let e=g(t);return{manager:e.name,...e.restart()}}function bt(t=u()){let e=st(t);return e.manager==="none"||!e.installed&&!e.active?{managed:!1}:(g(t).stop(),{managed:!0,manager:e.manager})}function At(){let t=Nt.userInfo().username,e=Et("loginctl",["enable-linger",t],{encoding:"utf8",windowsHide:!0});if(e.status!==0)throw new Error(String(e.stderr||"").trim()||"loginctl enable-linger failed");return{ok:!0,username:t}}function xt(t=u()){return g(t).logsHint()}export{L as a,O as b,rt as c,st as d,Pt as e,Rt as f,Dt as g,bt as h,At as i,xt as j,It as k};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import e from"node:crypto";import t from"node:fs";import i from"node:path";function s(r){t.mkdirSync(r,{recursive:!0,mode:448});try{t.chmodSync(r,448)}catch{}}function u(r,n){s(i.dirname(r));let o=`${r}.${process.pid}.${e.randomBytes(4).toString("hex")}.tmp`;t.writeFileSync(o,`${JSON.stringify(n,null,2)}
|
|
4
|
+
`,{mode:384});try{t.chmodSync(o,384)}catch{}t.renameSync(o,r);try{t.chmodSync(r,384)}catch{}}function p(r,n){try{return JSON.parse(t.readFileSync(r,"utf8"))}catch(o){let{code:c,message:m}=o;return c!=="ENOENT"&&process.stderr.write(`herdr-remote: invalid state at ${r}: ${m}
|
|
5
|
+
`),n}}function S(r=32){return e.randomBytes(r).toString("base64url")}export{s as a,u as b,p as c,S as d};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import f from"node:fs";import e from"node:os";import r from"node:path";function m(o){let n=o;for(let t=0;t<8;t+=1){let c=r.join(n,"package.json");try{if(JSON.parse(f.readFileSync(c,"utf8")).name==="herdr-remote")return n}catch{}let i=r.dirname(n);if(i===n)break;n=i}return r.resolve(o,"..")}var _=m(import.meta.dirname);function R(o=process.env,n=process.platform){return o.HERDR_REMOTE_CONFIG_DIR?o.HERDR_REMOTE_CONFIG_DIR:n==="win32"?r.join(o.APPDATA||r.join(e.homedir(),"AppData","Roaming"),"herdr-remote"):r.join(e.homedir(),".config","herdr-remote")}function a(o=process.env,n=process.platform){return o.HERDR_REMOTE_STATE_DIR?o.HERDR_REMOTE_STATE_DIR:n==="win32"?r.join(o.LOCALAPPDATA||r.join(e.homedir(),"AppData","Local"),"herdr-remote"):r.join(e.homedir(),".local","state","herdr-remote")}function D(){return r.join(R(),"config.json")}function d(){return r.join(a(),"runtime.json")}function E(o){return r.join(a(),`${o}.log`)}function h(){return process.env.HERDR_PLUGIN_CONFIG_DIR?r.join(process.env.HERDR_PLUGIN_CONFIG_DIR,"config.json"):null}export{_ as a,R as b,a as c,D as d,d as e,E as f,h as g};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{d as m,e as n,f as c,g as p}from"./KRSURB5L.js";import{a as l,h as o}from"./U6QAYG3E.js";import{d as s,g as i,h as v,j as f}from"./PFFVGFPL.js";import{o as t}from"./M52LJEES.js";function u(a){let e=s(a);return e.installed||e.active?e:null}function S(a=t()){let e=u(a);return e?(e.active||i(a),{ok:!0,managed:!0,manager:e.manager,alreadyRunning:!!e.active}):{...m(),managed:!1}}function w(a=t()){let e=v(a);return e.managed?(n(),{ok:!0,managed:!0,manager:e.manager}):{...n(),managed:!1}}function P(a=t()){let e=u(a);return e?(i(a),{ok:!0,managed:!0,manager:e.manager}):{...c(),managed:!1}}function y(a=t()){if(u(a)?.active)return!0;let e=l();return o(e).some(({pid:r})=>r===e.hostPid)}async function x(a,e,{platform:r=process.platform,isRunning:d=()=>y(a),stop:g=w,start:k=S}={}){if(r!=="win32"||!d())return e();await g(a);try{return await e()}finally{await k(a)}}async function B(a=t()){let[e,r]=[await p(),s(a)];return{...e,keepalive:r,logsHint:f(a)}}export{u as a,S as b,w as c,P as d,y as e,x as f,B as g};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{b as g,c as s}from"./KRVF37OW.js";import{a as i,b as m,c as p,d as r}from"./QRGNEKME.js";import{b as d,c as f,e as o}from"./TNLCNVA2.js";var y=2;function h(){let t=p(o(),{});return t&&typeof t=="object"?t:{}}function a(t){m(o(),t)}function I(t){let n=h();return t(n),a(n),n}function l(){return i(d()),i(f()),I(t=>{t.version||(t.version=y),t.hostId||(t.hostId=`host-${r(9)}`),t.hostToken||(t.hostToken=r(32))})}function w(t){let n=l();return n.relayPassword=typeof t=="string"?t.trim():"",a(n),n}function T(){let t=l();return t.hostId=`host-${r(9)}`,t.hostToken=r(32),a(t),t}function A(t,n,e){let x=Array.isArray(t.managedPids)?t.managedPids.filter(Boolean):[],u=s(x.filter(P=>P.pid!==e)),c=Number.isInteger(e)?g(e):null;return c&&u.push({name:n,pid:e,processStart:c,startedAt:new Date().toISOString()}),t.managedPids=u,t}function D(t=h()){let n=new Map;for(let e of t.managedPids||[])e&&!n.has(e.pid)&&n.set(e.pid,e);return s([...n.values()])}export{h as a,a as b,I as c,l as d,w as e,T as f,A as g,D as h};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{n as $,o as M,p as B,q as G}from"./PBMBFWLQ.js";import{a as w,c as K}from"./TNLCNVA2.js";import f from"node:fs";import p from"node:path";var ot=["EBUSY","EPERM","EACCES"];function U(t){return/\b(EBUSY|EPERM)\b/.test(t??"")}function st(t,e,s){try{s(t,e)}catch(o){if(!ot.includes(o.code??""))throw o;f.renameSync(e,`${e}.${process.pid}.old`),s(t,e)}}function Y(t,e,s=f.copyFileSync){f.mkdirSync(e,{recursive:!0});let o=new Set;for(let n of f.readdirSync(t,{withFileTypes:!0})){o.add(n.name.toLowerCase());let r=p.join(t,n.name),i=p.join(e,n.name),a=f.lstatSync(i,{throwIfNoEntry:!1});a&&a.isDirectory()!==n.isDirectory()&&f.rmSync(i,{recursive:!0,force:!0}),n.isDirectory()?Y(r,i,s):st(r,i,s)}for(let n of f.readdirSync(e))if(!o.has(n.toLowerCase()))try{f.rmSync(p.join(e,n),{recursive:!0,force:!0})}catch{}}async function V(t,e,{target:s=w,stage:o=p.join(K(),"update-stage"),platform:n=process.platform}={}){f.rmSync(o,{recursive:!0,force:!0});try{let r=await e([...t,"--prefix",o]);if(!r.ok)return r;let i=n==="win32"?p.join(o,"node_modules"):p.join(o,"lib","node_modules");try{Y(p.join(i,p.basename(s)),s)}catch(a){return{ok:!1,output:`${r.output}
|
|
4
|
+
${a.message}`}}return r}finally{try{f.rmSync(o,{recursive:!0,force:!0})}catch{}}}import A from"node:fs";import at from"node:os";import k from"node:path";import{spawn as ct}from"node:child_process";import{createRequire as lt}from"node:module";import it from"node:fs";import z from"node:path";function ut({args:t,platform:e=process.platform,env:s=process.env,execPath:o=process.execPath,exists:n=it.existsSync}){if(e!=="win32")return{command:"npm",args:t};let r=s.npm_execpath;if(r&&/npm-cli\.js$/i.test(r)&&n(r))return{command:o,args:[r,...t]};let i=z.join(z.dirname(o),"node_modules","npm","bin","npm-cli.js");return n(i)?{command:o,args:[i,...t]}:null}function C(t,e,s,o={}){return new Promise(n=>{let r;try{let u=ut({args:e,...o});if(!u){n({ok:!1,spawnFailed:!0,output:"npm-cli.js was not found next to this Node.js; run npm install -g herdr-remote yourself."});return}r=t(u.command,u.args,{timeout:s,windowsHide:!0})}catch(u){n({ok:!1,spawnFailed:!0,output:String(u?.message||u)});return}let i="",a=!1,l=u=>{a||(a=!0,n(u))},y=u=>{i+=String(u)};r.stdout?.on("data",y),r.stderr?.on("data",y),r.on("error",u=>l({ok:!1,spawnFailed:!0,output:u.message})),r.on("close",u=>l({ok:u===0,output:i.trim()}))})}var I="herdr-remote",ft="herdr-remote-relay",mt="https://registry.npmjs.org",pt="https://registry.npmmirror.com";function dt(){try{return JSON.parse(A.readFileSync(k.join(w,"package.json"),"utf8")).version}catch{return"0.0.0"}}function Ut(){try{let t=lt(import.meta.url).resolve(`${ft}/package.json`);return JSON.parse(A.readFileSync(t,"utf8")).version}catch{return null}}function W(){let t=w;if(!t.split(k.sep).includes("node_modules"))return"source";try{if(A.lstatSync(t).isSymbolicLink())return"linked"}catch{}return"npm"}function Yt(t=process.env){return t.HERDR_REMOTE_UPDATE_CHECK!=="0"}function Vt(){return W()==="npm"}function L(t){if(typeof t!="string")return null;let e=t.trim().replace(/\/+$/,"");return/^https?:\/\//i.test(e)?e:null}function J(t){let e;try{e=A.readFileSync(t,"utf8")}catch{return null}let s=null;for(let o of e.split(/\r?\n/)){let n=o.trim();if(!n||n.startsWith("#")||n.startsWith(";"))continue;let r=/^registry\s*=\s*(.+)$/i.exec(n);r&&(s=L(r[1].replace(/^["']|["']$/g,"")))}return s}function ht({env:t=process.env,home:e=at.homedir(),cwd:s=process.cwd()}={}){let o=[],n=r=>{let i=L(r);i&&!o.includes(i)&&o.push(i)};return n(t.npm_config_registry),n(t.NPM_CONFIG_REGISTRY),n(t.HERDR_REMOTE_REGISTRY),n(J(k.join(s,".npmrc"))),n(J(k.join(e,".npmrc"))),n(mt),n(pt),o}function h(t,e){let s=r=>String(r).split("-")[0].split(".").map(i=>Number.parseInt(i,10)||0),o=s(t),n=s(e);for(let r=0;r<Math.max(o.length,n.length);r+=1){let i=(o[r]||0)-(n[r]||0);if(i>0)return 1;if(i<0)return-1}return 0}async function q(t,{timeoutMs:e,fetchImpl:s}){let o=new AbortController,n=setTimeout(()=>o.abort(),e);try{let r=await s(t,{signal:o.signal,headers:{Accept:"application/json","Cache-Control":"no-cache"}});return r.ok?{ok:!0,body:await r.json()}:{ok:!1,message:`HTTP ${r.status??"?"}`}}catch(r){let i=r;return{ok:!1,message:i?.name==="AbortError"?"timed out":String(i?.message||r)}}finally{clearTimeout(n)}}async function yt(t,{timeoutMs:e,fetchImpl:s}){let o=[{url:`${t}/-/package/${I}/dist-tags`,read:r=>r?.latest},{url:`${t}/${I}/latest`,read:r=>r?.version}],n=null;for(let r of o){let i=await q(r.url,{timeoutMs:e,fetchImpl:s});if(!i.ok){n=i.message;continue}let a=r.read(i.body);if(typeof a=="string"&&a)return{ok:!0,latest:a};n="registry answered without a version"}return{ok:!1,message:n}}var X=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;async function gt(t,{timeoutMs:e,fetchImpl:s}){let o=await q(t,{timeoutMs:e,fetchImpl:s});if(!o.ok)return o;let n=o.body?.version;return typeof n=="string"&&X.test(n)?{ok:!0,latest:n}:{ok:!1,message:"release manifest has no version"}}async function zt({timeoutMs:t=6e3,fetchImpl:e=globalThis.fetch,registries:s=ht(),releaseManifest:o=M,current:n=dt()}={}){let r=await Promise.all([...o?[gt(o,{timeoutMs:t,fetchImpl:e}).then(u=>({source:$,...u}))]:[],...s.map(async u=>({source:u,...await yt(u,{timeoutMs:t,fetchImpl:e})}))]),i=r.filter(u=>u.ok);if(i.length===0)return{ok:!1,current:n,errorKey:"update.errorNetwork",message:r.map(u=>`${u.source}: ${"message"in u?u.message:""}`).join("; ")};let a=i.map(u=>u.latest).reduce((u,T)=>h(T,u)>0?T:u),l=i.filter(u=>h(u.latest,a)===0).map(u=>u.source),y=i.filter(u=>h(u.latest,a)<0).map(u=>({source:u.source,version:u.latest}));return{ok:!0,current:n,latest:a,source:l[0],sources:l,behind:y,updateAvailable:h(a,n)>0}}function Et(t){let e=String(t||"").split(/\r?\n/).map(s=>s.trim()).filter(s=>/^npm (error|ERR!)/.test(s)&&!/complete log of this run/i.test(s)).map(s=>s.replace(/^npm (error|ERR!)\s*/,"")).filter(Boolean);return(e.length>0?e.slice(0,3):String(t||"").trim().split(/\r?\n/).slice(-3)).join(" ")}function St(t){return/\bETARGET\b|notarget|No matching version found/i.test(String(t||""))}function wt(){try{return JSON.parse(A.readFileSync(k.join(w,"package.json"),"utf8")).version}catch{return null}}async function Jt({spawnImpl:t=ct,timeoutMs:e=18e4,installKindImpl:s=W,source:o="",sources:n=[],version:r=null,attempts:i=3,retryDelayMs:a=15e3,sleep:l=P=>new Promise(d=>setTimeout(d,P)),readInstalledVersion:y=wt,onAttempt:u=()=>{},platform:T=process.platform,inPlace:nt=V}={}){let P=s();if(P!=="npm")return{ok:!1,errorKey:`update.cannot.${P}`};let d=typeof r=="string"&&X.test(r)?r:null,R=[];for(let g of[o,...n]){let E=L(g);E&&!R.includes(E)&&R.push(E)}R.length===0&&R.push($,"");let H={ok:!1,output:""},v=!1;for(let g of R){let E=g===$,x=E?["install","-g",d?G(d):B]:["install","-g",`${I}@${d||"latest"}`,"--prefer-online"];g&&!E&&x.push("--registry",g);for(let j=1;j<=i;j+=1){u({source:g,attempt:j});let c=await C(t,x,e);if(!c.ok&&T==="win32"&&U(c.output)&&(c=await nt(x,S=>C(t,S,e))),c.ok){let S=y();return d&&S&&h(S,d)<0?{ok:!1,errorKey:"update.errorNotApplied",installed:S,output:c.output.slice(-2e3)}:{ok:!0,installed:S,output:c.output.slice(-2e3)}}if(H=c,c.spawnFailed)return{ok:!1,errorKey:"update.errorFailed",output:c.output,summary:c.output};if(v=St(c.output),!v)break;j<i&&await l(a)}}return{ok:!1,errorKey:v?"update.errorNotYetPublished":"update.errorFailed",output:String(H.output||"").slice(-2e3),summary:Et(H.output)}}import D from"node:fs";import O from"node:os";import m from"node:path";import{spawnSync as Rt}from"node:child_process";var _="herdr",Z="0.9.3",kt=["~/.local/bin","~/.cargo/bin","~/bin","/opt/homebrew/bin","/usr/local/bin","/home/linuxbrew/.linuxbrew/bin","/usr/bin"];function At(t,e){return t==="~"?e:t.startsWith("~/")?m.join(e,t.slice(2)):t}function b(t=_,e=process.platform){return e!=="win32"?[t]:[/\.exe$/i.test(t)?t:`${t}.exe`]}function N(t){try{return D.statSync(t).isFile()?(D.accessSync(t,D.constants.X_OK),!0):!1}catch{return!1}}function F(t,e=b()){if(!t)return null;for(let s of e){let o=m.join(t,s);if(N(o))return o}return null}function Q(t,e=b()){for(let s of String(t||"").split(m.delimiter)){let o=F(s.trim(),e);if(o)return o}return null}function tt(t=O.homedir(),e=process.platform,s=process.env){return e==="win32"?[m.join(s.LOCALAPPDATA||m.join(t,"AppData","Local"),"Programs","Herdr","bin"),m.join(t,".cargo","bin"),m.join(t,"scoop","shims")]:kt.map(o=>At(o,t))}function rt(t){return t.includes("/")||t.includes(m.sep)}function _t(t,e,s){let o=String(t||"").trim();if(!o)return null;if(rt(o)){let n=m.resolve(o);if(N(n))return n;if(s==="win32"&&m.extname(n)===""){let r=`${n}.exe`;if(N(r))return r}return F(n,b(_,s))}return Q(e,b(o,s))}function et({env:t=process.env,home:e=O.homedir(),platform:s=process.platform,directories:o=tt(e,s,t)}={}){let n=b(_,s),r=_t(t.HERDR_BIN_PATH,t.PATH,s);if(r)return{command:r,source:"env",found:!0};let i=Q(t.PATH,n);if(i)return{command:i,source:"path",found:!0};for(let a of o){let l=F(a,n);if(l)return{command:l,source:"fallback",found:!0}}return{command:_,source:"unresolved",found:!1}}function bt(t){return et(t).command}function rr(t,e={}){return typeof t=="string"&&rt(t)&&N(t)?{command:t,source:"verified",found:!0}:et(e)}function Tt(t){let e=/(\d+)\.(\d+)\.(\d+)/.exec(String(t||""));return e?`${e[1]}.${e[2]}.${e[3]}`:null}function Pt(t,e=Z){return t?h(t,e)>=0:!0}function er({command:t,timeout:e=1e4,...s}={}){let o=t||bt(s),n={command:o,version:null,raw:null,supported:!0,ok:!1},r;try{r=Rt(o,["--version"],{encoding:"utf8",timeout:e,windowsHide:!0})}catch{return n}if(r.error||r.status!==0&&r.status!==1)return n;let i=`${r.stdout||""}${r.stderr||""}`.trim(),a=Tt(i);return{command:o,version:a,raw:i||null,supported:Pt(a),ok:!0}}function nr(t){return`Herdr ${t} is older than ${Z}, which herdr-remote is written against. Run "herdr update" \u2014 window titles, large pastes, taps on a pane and Alt shortcuts all misbehave in browser windows before that release.`}function or({env:t=process.env,home:e=O.homedir(),platform:s=process.platform,directories:o=tt(e,s,t)}={}){let n=String(t.HERDR_BIN_PATH||"").trim(),r=[`Herdr executable "${_}" was not found.`];return n&&r.push(`HERDR_BIN_PATH=${n} does not point at an executable.`),r.push(o.length?`Searched PATH and ${o.join(", ")}.`:"Searched PATH."),r.push("Install Herdr or set HERDR_BIN_PATH to its full path, then restart herdr-remote."),r.join(" ")}export{U as a,dt as b,Ut as c,W as d,Yt as e,Vt as f,h as g,zt as h,wt as i,Jt as j,Z as k,et as l,bt as m,rr as n,er as o,nr as p,or as q};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{b as h,c as F,e as S}from"./U27JJKJ6.js";import{i as U,j as K,k as x}from"./42KARAL4.js";import"./KRSURB5L.js";import"./DGUZCGQN.js";import"./JJGEV4EZ.js";import"./H24ZP5D5.js";import"./PBRQ3HEG.js";import"./U6QAYG3E.js";import"./PFFVGFPL.js";import"./AWB4A65P.js";import{a as T}from"./M4AFZHKH.js";import{a as A,h as R,j as v}from"./UEOQE77N.js";import{o as B}from"./M52LJEES.js";import"./KRVF37OW.js";import"./QRGNEKME.js";import{q as b}from"./PBMBFWLQ.js";import"./TNLCNVA2.js";import"./I6NRCYLI.js";import{spawnSync as N}from"node:child_process";var O=12e4;function W(){let e=N(process.execPath,[T(),"restart","--json"],{encoding:"utf8",timeout:O,windowsHide:!0});if(!e.error&&e.status===0)return{ok:!0,message:""};let i=String(e.stderr||e.stdout||"").trim();return{ok:!1,message:e.error?.message||i||`exit ${e.status}`}}async function Z(e,i={}){let u=()=>i.config??B(),{platform:l=process.platform,checkCli:C=()=>R(),installCli:D=(r,p)=>v({source:r.source,sources:r.sources,version:r.latest,onAttempt:p}),isRunning:E=()=>S(u()),stop:I=()=>F(u()),start:P=()=>h(u()),restartInstalled:_=W,stopBroker:M=U,startBroker:$=async()=>{try{K(e)}catch{}return x()},report:t=r=>process.stdout.write(`${r}
|
|
4
|
+
`)}=i;t(e("update.checking"));let o=await C(),{current:a}=o;if(!o.ok)return t(e("update.errorNetworkDetail",{message:o.message??""})),{ok:!1,current:a,updated:null,restarted:!1,errorKey:o.errorKey};if(!o.updateAvailable)return t(e("update.upToDate",{version:a})),{ok:!0,current:a,updated:null,restarted:!1};let c="cli",n=o.latest??"",m=E(),f=l==="win32"&&m;f&&(t(e("update.stoppingServices")),I());let d=l==="win32"?await M():"unavailable",k=async()=>{if(d!=="stopped")return d==="busy"?"busy":null;let r=await $();return t(e(r?"update.brokerRestarted":"update.brokerRestartFailed")),r?"restarted":"failed"};t(e("update.updating",{version:n}));let s=await D(o,({attempt:r})=>{r>1&&t(e("update.updatingRetry",{version:n,attempt:r}))});if(!s.ok){f&&P();let r=await k();t(e(s.errorKey??"update.errorFailed",{version:n,installed:s.installed??"",url:b(n)})),s.summary&&t(e("update.errorFailedDetail",{message:s.summary})),l==="win32"&&A(s.output)&&t(e("update.errorBusy"));let{errorKey:p,summary:H}=s;return{ok:!1,current:a,updated:c,restarted:!1,adminBroker:r,errorKey:p,summary:H}}let g=s.installed??n;t(e("update.done",{version:g}));let y=!0,w=!1;if(!m)t(e("update.notRunning"));else{t(e("update.restarting"));let r=_();y=r.ok,w=r.ok,t(r.ok?e("services.restarted"):e("update.restartFailed",{message:r.message}))}d==="busy"&&t(e("update.brokerBusy"));let j=await k();return{ok:y,current:a,updated:c,installed:g,restarted:w,adminBroker:j}}export{Z as runUpdate};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{b as a,c as b,d as c,e as d,f as e,g as f,h as g,i as h}from"./H24ZP5D5.js";import"./U6QAYG3E.js";import"./KRVF37OW.js";import"./QRGNEKME.js";import"./PBMBFWLQ.js";import"./TNLCNVA2.js";import"./I6NRCYLI.js";export{f as captureTerminalFont,b as detectTerminalFont,e as fontFromEnvironment,h as loadHostTerminalFont,c as publicTerminalFont,d as readFontChunk,a as readTerminalFont,g as resolveHostFont};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{m as g,o as p}from"./UEOQE77N.js";import"./PBMBFWLQ.js";import{a as s}from"./TNLCNVA2.js";import"./I6NRCYLI.js";import m from"node:fs";import c from"node:path";import{spawnSync as h}from"node:child_process";var d="herdr.remote.web",S="herdr-plugin.toml";function w(){return c.join(s,S)}function a(t,{timeout:r=15e3}={}){let e=h(g(),t,{encoding:"utf8",timeout:r,windowsHide:!0});if(e.error?.code==="ENOENT")throw Object.assign(new Error("herdr command not found"),{code:"HERDR_NOT_FOUND"});return e}function b(t){let r=[];for(let e of String(t||"").split(`
|
|
4
|
+
`)){let n=/^-\s+(\S+)\s+\((.*?)\)\s+(\S+)(?:\s+\[(.*)\])?/.exec(e.trim());if(!n)continue;let[,f,i,o,l]=n,u=l?l.split(";")[0].trim():null;r.push({id:f,name:i,enabled:o==="enabled",source:u,warnings:l?.includes(";")?l.slice(l.indexOf(";")+1).trim():null,localPath:u?.startsWith("local:")?u.slice(6):null})}return r}function k(){if(!m.existsSync(w()))return{available:!1,registered:!1,reason:"manifest missing"};let{version:t,supported:r}=p(),e={version:t,versionSupported:r},n;try{n=a(["plugin","list"])}catch(o){if(o.code==="HERDR_NOT_FOUND")return{available:!1,registered:!1,reason:"herdr not found"};throw o}if(n.status!==0)return{available:!0,registered:!1,reason:String(n.stderr||"").trim(),...e};let i=b(n.stdout).find(o=>o.id===d);return i?{available:!0,registered:!0,enabled:i.enabled,linkedPath:i.localPath,stale:i.localPath?c.resolve(i.localPath)!==c.resolve(s):!1,packageRoot:s,...e}:{available:!0,registered:!1,packageRoot:s,...e}}function _(){let t=k();t.registered&&t.stale&&a(["plugin","unlink",d]);let r=a(["plugin","link",s]);if(r.status!==0)throw new Error(String(r.stderr||r.stdout||"").trim()||"herdr plugin link failed");return{ok:!0,path:s,output:String(r.stdout||"").trim()}}function R(){let t=a(["plugin","unlink",d]);if(t.status!==0)throw new Error(String(t.stderr||t.stdout||"").trim()||"herdr plugin unlink failed");return{ok:!0,output:String(t.stdout||"").trim()}}export{b as parsePluginList,_ as register,k as registrationStatus,R as unregister};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
var m={"app.name":"Herdr Remote","app.tagline":"Remote browser access to Herdr workspaces","common.yes":"Yes","common.no":"No","common.on":"on","common.off":"off","common.none":"none","common.auto":"auto","common.unknown":"unknown","common.running":"running","common.stopped":"stopped","common.connected":"connected","common.disconnected":"disconnected","common.installed":"installed","common.notInstalled":"not installed","common.enabled":"enabled","common.disabled":"disabled","common.loading":"Working\u2026","common.save":"Save settings","common.saved":"Configuration saved to {path}","common.back":"Back","common.cancel":"Cancel","common.confirm":"Confirm","common.pid":"pid {pid}","common.notApplicable":"n/a","nav.overview":"Overview","nav.pair":"Pair a device","nav.services":"Services","nav.relay":"Relay","nav.keepalive":"Keep-alive","nav.herdr":"Herdr","nav.about":"Language & about","mode.local":"This machine only","mode.lan":"Local network / Tailscale","mode.official":"Official relay","mode.remote":"Self-hosted relay","mode.local.description":"Relay listens on 127.0.0.1. Local browser only.","mode.lan.description":"Relay listens on 0.0.0.0. Accessible over LAN or Tailscale.","mode.official.description":"Connect via official relay. No server needed.","mode.remote.description":"Connect via self-hosted relay for external access.","overview.title":"Status","overview.mode":"Access mode","overview.relay":"Relay","overview.host":"Host connector","overview.socket":"Herdr socket","overview.webUrl":"Web UI","overview.keepalive":"Keep-alive","overview.devices":"Browsers","overview.hosts":"Workstations","overview.uptime":"Relay uptime","overview.relayLocal":"local, {bind}:{port}","overview.relayRemote":"remote, {url}","overview.socketMissing":"not found \u2014 is Herdr running?","overview.unreachable":"unreachable: {message}","overview.notStarted":"Services not running. Open Services tab to start.","pair.title":"Pair a device","pair.generate":"Generate pairing code","pair.regenerate":"Regenerate code","pair.working":"Generating pairing code\u2026","pair.code":"Pairing code","pair.url":"Access URL","pair.expires":"Expires in {minutes} (at {time})","pair.expired":"Code expired. Generate a new one.","pair.instructions":"Open URL and enter code to pair.","pair.qrHint":"Scan QR code to open URL.","pair.qrUnavailable":"Terminal too narrow for QR code; use URL above.","pair.failed":"Could not create pairing code: {message}","pair.hostOffline":"Relay has no workstation connected. Start services first.","services.title":"Services","services.start":"Start services","services.stop":"Stop services","services.restart":"Restart services","services.started":"Services started.","services.stopped":"Services stopped.","services.restarted":"Services restarted.","services.startFailed":"Could not start services: {message}","services.stopFailed":"Could not stop services: {message}","services.unsavedBlocked":"Unsaved changes. Save before restarting.","services.managedNotice":"Managed by {manager}; applied via keep-alive service.","services.logs":"Recent logs","services.logEmpty":"No logs.","services.logRelay":"Relay","services.logHost":"Host connector","adminBroker.windowsOnly":"The administrator terminal broker only runs on Windows.","adminBroker.needsElevation":"Open the Windows TUI and choose Set up admin terminal access. Approve the one-time Windows prompt under the same account as Herdr Remote.","adminBroker.busy":"An admin terminal is open; close it before restarting the broker.","adminBroker.title":"Admin terminal broker","adminBroker.checking":"Checking\u2026","adminBroker.ready":"Ready","adminBroker.notReady":"Not configured or stopped","adminBroker.install":"Set up admin terminal access","adminBroker.uninstall":"Remove admin terminal access","adminBroker.installDone":"Admin terminal broker setup task registered.","adminBroker.uninstallDone":"Admin terminal broker setup task removed.","adminBroker.elevationCancelled":"Administrator approval was declined; no changes were made.","adminBroker.setupFailed":"Could not configure the administrator terminal broker.","adminBroker.tuiHint":"Set this up once. Windows asks for administrator approval; later WebUI admin terminals open without UAC.","adminShell.needsTerminal":"admin-shell must run in a terminal.","adminShell.brokerUnavailable":"The administrator terminal broker is not running. Open the herdr-remote TUI, go to Keep-alive, and choose Set up admin terminal access.","adminShell.tabLabel":"Admin","relay.title":"Relay settings","relay.settings":"Settings","relay.locked":"fixed","relay.officialFixed":"The official relay address is fixed and cannot be edited.","relay.officialHint":"Official relay: address is fixed and no password is needed.","relay.password":"Relay password","relay.passwordHint":"Must match RELAY_PASSWORD on relay. Leave empty if public.","relay.passwordSet":"set","relay.passwordEmpty":"not set (public)","relay.passwordSaved":"Relay password saved. Restart services to apply.","relay.showPassword":"Show password","relay.hidePassword":"Hide password","relay.identity":"Workstation ID","relay.regenerate":"Generate new ID","relay.regenerated":"New workstation identity generated. Restart services to re-register.","relay.envSnippet":"Relay startup command","relay.envHint":"Run this command on the relay host.","relay.test":"Test relay connection","relay.testOk":"Relay reachable: version {version}, {hosts} workstation(s) connected.","relay.testFailed":"Relay unreachable: {message}","relay.selectAddress":"Choose advertised address","relay.listenAddress":"Listen address","relay.listenAddressHint":"Server bind address. Browsers use advertised address below.","relay.addressTailscale":"Tailscale","relay.addressLan":"LAN","relay.addressVirtual":"virtual","relay.addressLoopback":"loopback","relay.noAddresses":"No non-loopback addresses found.","relay.docsHint":"Self-hosting guide: docs/self-hosted-relay.md","keepalive.title":"Keep-alive service","keepalive.manager":"Manager","keepalive.state":"State","keepalive.install":"Install and start","keepalive.uninstall":"Stop and remove","keepalive.restart":"Restart service","keepalive.installed":"Keep-alive installed with {manager}.","keepalive.uninstalled":"Keep-alive removed.","keepalive.restarted":"Keep-alive service restarted.","keepalive.failed":"Keep-alive operation failed: {message}","keepalive.unitPath":"Unit file","keepalive.logsHint":"View logs: {command}","keepalive.linger":"Start at boot","keepalive.lingerEnabled":"Start at boot enabled.","keepalive.lingerDisabled":"Start at boot disabled (runs while logged in).","keepalive.enableLinger":"Enable start at boot","keepalive.lingerDone":"Start at boot enabled for {username}.","keepalive.fallbackNote":"No system service manager found; background process will not survive reboot.","keepalive.windowsTaskNote":"Starts after you sign in as your account. It needs no password or administrator rights and does not run before sign-in.","keepalive.serviceNote":"Runs as a Windows service under your account and starts before sign-in. Installing or removing it asks for administrator rights, and Windows may require your account password.","keepalive.serviceWindowHint":"Finish the installation in the administrator window that opens.","keepalive.elevationCancelled":"Administrator rights were not granted; nothing was installed.","keepalive.passwordPrompt":"Windows account password for {account} (not a PIN; press Enter if there is no password):","keepalive.passwordRejected":"Windows could not start the service with those credentials. Check the account password and service logon policy.","keepalive.serviceInstalled":"Service {id} is installed and running.","keepalive.wrongAccount":"Run this as the account that will use herdr-remote, not another administrator account.","keepalive.pressEnter":"Press Enter to close this window.","herdr.title":"Herdr integration","herdr.socketPath":"Socket path","herdr.args":"Extra arguments","herdr.autoStartHint":"Off: Herdr starts only when you run it, or when you confirm it from a browser. On: herdr-remote also starts it every time it starts, at boot included. Takes effect the next time herdr-remote starts.","herdr.cliMissing":"Command herdr not found. Set HERDR_BIN_PATH to its full path.","herdr.version":"Herdr version","herdr.versionOutdated":'Herdr {version} is older than {minimum}. Run "herdr update": window titles, large pastes, taps on a pane and Alt shortcuts misbehave in browser windows before that release.',"about.title":"Language & about","about.language":"Interface language","about.languageAuto":"Follow system ({detected})","about.languageZh":"\u4E2D\u6587","about.languageEn":"English","about.version":"Version","about.configPath":"Config file","about.statePath":"State directory","about.relayPackage":"Relay package","about.docs":"Self-hosting guide: docs/self-hosted-relay.md","wizard.title":"First-time setup","wizard.step":"Step {current} of {total}","wizard.languageTitle":"Choose language","wizard.accessTitle":"Access mode","wizard.accessHint":"Can be changed later in Relay settings.","wizard.addressTitle":"Browser access address","wizard.relayTitle":"Relay server","wizard.relayUrlLabel":"Relay URL (wss://\u2026)","wizard.relayHint":"Relay must be running. See docs/self-hosted-relay.md.","wizard.passwordTitle":"Relay password","wizard.passwordHint":"RELAY_PASSWORD of the relay. Leave empty if unset.","wizard.finishTitle":"Finish","wizard.finishHint":"Configuration will be saved to {path}.","wizard.startNow":"Start services now","wizard.installKeepalive":"Run in background","wizard.finish":"Save and finish","field.mode":"Access mode","field.port":"Relay port","field.lanHost":"Browser address","field.remoteUrl":"Relay URL","field.publicUrl":"Browser URL override","field.socketPath":"Herdr socket path","field.herdrArgs":"Herdr arguments","field.herdrAutoStart":"Auto-start Herdr","field.language":"Language","field.keepalive":"Keep-alive manager","placeholder.autoDiscovered":"auto-discovered","placeholder.none":"none","error.invalidMode":"Unknown access mode.","error.invalidPort":"Port must be a number between 1 and 65535.","error.invalidLanHost":"Browser address must be a reachable LAN or Tailscale address, not loopback or 0.0.0.0.","error.invalidRelayUrl":"Relay URL must start with wss://, ws://, https:// or http://.","error.invalidPublicUrl":"Browser URL must start with https:// or http:// and cannot use 0.0.0.0 or ::.","error.invalidLanguage":"Unknown language.","error.invalidKeepalive":"Unknown keep-alive manager.","error.unknownField":"Unknown setting.","error.remoteUrlRequired":"Relay URL is required for self-hosted relay mode.","error.removedHerdrArg":"Herdr 0.9.0 removed --no-session; remove it from the extra arguments.","error.saveFailed":"Could not save configuration: {message}","hint.navigate":"\u2191\u2193 move","hint.select":"\u21B5 select","hint.edit":"\u21B5 edit","hint.tabs":"\u2190 \u2192 switch tab","hint.back":"esc back","hint.quit":"q quit","hint.mouseOn":"m mouse off","hint.mouseOff":"m mouse on","hint.mouseUnsupported":"mouse unsupported","hint.restartRequired":"Restart services to apply changes.","hint.unsavedChanges":"Unsaved changes (press s to save).","hint.save":"s save","hint.editing":"\u21B5 confirm \xB7 esc cancel","update.title":"Updates","update.banner":"herdr-remote {latest} is out (running {current}). Press 7 and Enter on the update row to install.","update.check":"Check for updates","update.checking":"Checking GitHub Releases and npm\u2026","update.upToDate":"Up to date ({version})","update.available":"Update {version} available (press Enter to install)","update.updating":"Installing {version}\u2026","update.updatingRetry":"Installing {version}\u2026 (npm has not caught up yet, attempt {attempt})","update.done":"Updated to {version}","update.restartHint":"Update installed. Restart herdr-remote to apply.","update.errorNetwork":"Could not reach GitHub Releases or any npm registry","update.errorNetworkDetail":"Nothing answered: {message}","update.errorFailed":"Update failed. Run: npm install -g {url}","update.errorFailedDetail":"npm: {message}","update.errorNotYetPublished":"npm has not caught up with {version} yet (common in the first minutes after a release). Press Enter to try again shortly.","update.errorNotApplied":"npm reported success, but {installed} is still installed","update.mirrorBehind":"{registries} still has an older version; installing from {source}","update.cannot.source":"Source checkout \u2014 update with git","update.cannot.linked":"Linked package \u2014 managed by npm link","update.stoppingServices":"Stopping services while npm replaces their files\u2026","update.restarting":"Restarting services on the new release\u2026","update.notRunning":"Services were not running and were left stopped. Start them with: herdr-remote start","update.restartFailed":"Installed, but the services did not restart: {message}","update.brokerRestarted":"Admin terminal broker restarted.","update.brokerRestartFailed":"The admin terminal broker did not start again. Sign out of Windows and back in, or run herdr-remote admin-broker restart.","update.brokerBusy":"An admin terminal is open, so the broker keeps running the previous release. Close admin terminals, then run herdr-remote admin-broker restart.","update.errorBusy":"A process still holds the herdr-remote folder; an admin terminal broker set up by an older release does. In an administrator PowerShell run: Get-ScheduledTask -TaskName 'HerdrRemoteAdminBroker-*' | Stop-ScheduledTask. Then run herdr-remote update again here, and afterwards herdr-remote admin-broker install as administrator."},d=m;var u={"app.name":"Herdr Remote","app.tagline":"\u5728\u6D4F\u89C8\u5668\u4E2D\u4F7F\u7528 Herdr \u5DE5\u4F5C\u533A","common.yes":"\u662F","common.no":"\u5426","common.on":"\u5F00","common.off":"\u5173","common.none":"\u65E0","common.auto":"\u81EA\u52A8","common.unknown":"\u672A\u77E5","common.running":"\u8FD0\u884C\u4E2D","common.stopped":"\u5DF2\u505C\u6B62","common.connected":"\u5DF2\u8FDE\u63A5","common.disconnected":"\u672A\u8FDE\u63A5","common.installed":"\u5DF2\u5B89\u88C5","common.notInstalled":"\u672A\u5B89\u88C5","common.enabled":"\u5DF2\u542F\u7528","common.disabled":"\u5DF2\u505C\u7528","common.loading":"\u5904\u7406\u4E2D\u2026","common.save":"\u4FDD\u5B58\u8BBE\u7F6E","common.saved":"\u914D\u7F6E\u5DF2\u4FDD\u5B58\u81F3 {path}","common.back":"\u8FD4\u56DE","common.cancel":"\u53D6\u6D88","common.confirm":"\u786E\u8BA4","common.pid":"PID {pid}","common.notApplicable":"\u4E0D\u9002\u7528","nav.overview":"\u6982\u89C8","nav.pair":"\u914D\u5BF9\u8BBE\u5907","nav.services":"\u670D\u52A1","nav.relay":"Relay","nav.keepalive":"\u4FDD\u6D3B","nav.herdr":"Herdr","nav.about":"\u8BED\u8A00\u4E0E\u5173\u4E8E","mode.local":"\u4EC5\u672C\u673A","mode.lan":"\u5C40\u57DF\u7F51 / Tailscale","mode.official":"\u5B98\u65B9 Relay","mode.remote":"\u81EA\u5EFA Relay","mode.local.description":"\u76D1\u542C 127.0.0.1\uFF0C\u4EC5\u672C\u673A\u53EF\u8BBF\u95EE\u3002","mode.lan.description":"\u76D1\u542C 0.0.0.0\uFF0C\u5C40\u57DF\u7F51\u4E0E Tailscale \u8BBE\u5907\u53EF\u8BBF\u95EE\u3002","mode.official.description":"\u4F7F\u7528\u5B98\u65B9 Relay \u8DE8\u7F51\u8BBF\u95EE\uFF0C\u65E0\u9700\u81EA\u5EFA\u670D\u52A1\u5668\u3002","mode.remote.description":"\u8FDE\u63A5\u81EA\u5EFA Relay \u8DE8\u7F51\u8BBF\u95EE\u3002","overview.title":"\u72B6\u6001","overview.mode":"\u8BBF\u95EE\u65B9\u5F0F","overview.relay":"Relay","overview.host":"\u4E3B\u673A\u8FDE\u63A5\u5668","overview.socket":"Herdr \u5957\u63A5\u5B57","overview.webUrl":"Web \u754C\u9762","overview.keepalive":"\u4FDD\u6D3B\u670D\u52A1","overview.devices":"\u6D4F\u89C8\u5668","overview.hosts":"\u5DE5\u4F5C\u7AD9","overview.uptime":"Relay \u8FD0\u884C\u65F6\u95F4","overview.relayLocal":"\u672C\u5730\uFF0C{bind}:{port}","overview.relayRemote":"\u8FDC\u7A0B\uFF0C{url}","overview.socketMissing":"\u672A\u627E\u5230\uFF0C\u8BF7\u786E\u8BA4 Herdr \u662F\u5426\u8FD0\u884C","overview.unreachable":"\u65E0\u6CD5\u8BBF\u95EE\uFF1A{message}","overview.notStarted":"\u670D\u52A1\u672A\u8FD0\u884C\uFF0C\u53EF\u524D\u5F80\u300C\u670D\u52A1\u300D\u542F\u52A8\u3002","pair.title":"\u914D\u5BF9\u8BBE\u5907","pair.generate":"\u751F\u6210\u914D\u5BF9\u7801","pair.regenerate":"\u91CD\u65B0\u751F\u6210","pair.working":"\u751F\u6210\u914D\u5BF9\u7801\u4E2D\u2026","pair.code":"\u914D\u5BF9\u7801","pair.url":"\u8BBF\u95EE\u5730\u5740","pair.expires":"\u5269\u4F59 {minutes}\uFF08\u81F3 {time}\uFF09","pair.expired":"\u914D\u5BF9\u7801\u5DF2\u8FC7\u671F\uFF0C\u9700\u91CD\u65B0\u751F\u6210\u3002","pair.instructions":"\u6253\u5F00\u94FE\u63A5\u5E76\u8F93\u5165\u914D\u5BF9\u7801\u3002","pair.qrHint":"\u626B\u63CF\u4E8C\u7EF4\u7801\u6253\u5F00\u94FE\u63A5\u3002","pair.qrUnavailable":"\u7EC8\u7AEF\u5BBD\u5EA6\u4E0D\u8DB3\uFF0C\u65E0\u6CD5\u663E\u793A\u4E8C\u7EF4\u7801\u3002","pair.failed":"\u751F\u6210\u914D\u5BF9\u7801\u5931\u8D25\uFF1A{message}","pair.hostOffline":"Relay \u672A\u8FDE\u63A5\u5DE5\u4F5C\u7AD9\uFF0C\u9700\u5148\u542F\u52A8\u670D\u52A1\u3002","services.title":"\u670D\u52A1","services.start":"\u542F\u52A8\u670D\u52A1","services.stop":"\u505C\u6B62\u670D\u52A1","services.restart":"\u91CD\u542F\u670D\u52A1","services.started":"\u670D\u52A1\u5DF2\u542F\u52A8\u3002","services.stopped":"\u670D\u52A1\u5DF2\u505C\u6B62\u3002","services.restarted":"\u670D\u52A1\u5DF2\u91CD\u542F\u3002","services.startFailed":"\u542F\u52A8\u670D\u52A1\u5931\u8D25\uFF1A{message}","services.stopFailed":"\u505C\u6B62\u670D\u52A1\u5931\u8D25\uFF1A{message}","services.unsavedBlocked":"\u914D\u7F6E\u672A\u4FDD\u5B58\uFF0C\u8BF7\u5148\u4FDD\u5B58\u518D\u91CD\u542F\u3002","services.managedNotice":"\u7531 {manager} \u6258\u7BA1\uFF0C\u5DF2\u901A\u8FC7\u4FDD\u6D3B\u670D\u52A1\u6267\u884C\u3002","services.logs":"\u6700\u8FD1\u65E5\u5FD7","services.logEmpty":"\u6682\u65E0\u65E5\u5FD7\u3002","services.logRelay":"Relay","services.logHost":"\u4E3B\u673A\u8FDE\u63A5\u5668","adminBroker.windowsOnly":"\u7BA1\u7406\u5458\u7EC8\u7AEF broker \u53EA\u652F\u6301 Windows\u3002","adminBroker.needsElevation":"\u8BF7\u6253\u5F00 Windows TUI \u5E76\u9009\u62E9\u201C\u8BBE\u7F6E\u7BA1\u7406\u5458\u7EC8\u7AEF\u201D\uFF0C\u4F7F\u7528\u8FD0\u884C Herdr Remote \u7684\u540C\u4E00\u8D26\u6237\u6279\u51C6\u4E00\u6B21 Windows \u63D0\u6743\u63D0\u793A\u3002","adminBroker.busy":"\u6709\u7BA1\u7406\u5458\u7EC8\u7AEF\u5F00\u7740\uFF0C\u8BF7\u5148\u5173\u95ED\u518D\u91CD\u542F broker\u3002","adminBroker.title":"\u7BA1\u7406\u5458\u7EC8\u7AEF broker","adminBroker.checking":"\u6B63\u5728\u68C0\u67E5\u2026","adminBroker.ready":"\u5DF2\u5C31\u7EEA","adminBroker.notReady":"\u5C1A\u672A\u8BBE\u7F6E\u6216\u672A\u8FD0\u884C","adminBroker.install":"\u8BBE\u7F6E\u7BA1\u7406\u5458\u7EC8\u7AEF","adminBroker.uninstall":"\u79FB\u9664\u7BA1\u7406\u5458\u7EC8\u7AEF\u8BBE\u7F6E","adminBroker.installDone":"\u7BA1\u7406\u5458\u7EC8\u7AEF broker \u4EFB\u52A1\u5DF2\u6CE8\u518C\u3002","adminBroker.uninstallDone":"\u7BA1\u7406\u5458\u7EC8\u7AEF broker \u4EFB\u52A1\u5DF2\u79FB\u9664\u3002","adminBroker.elevationCancelled":"\u672A\u6279\u51C6\u7BA1\u7406\u5458\u6743\u9650\uFF0C\u672A\u8FDB\u884C\u66F4\u6539\u3002","adminBroker.setupFailed":"\u7BA1\u7406\u5458\u7EC8\u7AEF broker \u8BBE\u7F6E\u5931\u8D25\u3002","adminBroker.tuiHint":"\u53EA\u9700\u8BBE\u7F6E\u4E00\u6B21\u3002Windows \u4F1A\u8BF7\u6C42\u7BA1\u7406\u5458\u6388\u6743\uFF1B\u4E4B\u540E WebUI \u65B0\u5EFA\u7BA1\u7406\u5458\u7EC8\u7AEF\u4E0D\u518D\u5F39\u51FA UAC\u3002","adminShell.needsTerminal":"admin-shell \u5FC5\u987B\u5728\u7EC8\u7AEF\u4E2D\u8FD0\u884C\u3002","adminShell.brokerUnavailable":"\u7BA1\u7406\u5458\u7EC8\u7AEF broker \u5C1A\u672A\u8FD0\u884C\u3002\u8BF7\u6253\u5F00 herdr-remote TUI\uFF0C\u8FDB\u5165\u300C\u4FDD\u6D3B\u300D\u5E76\u9009\u62E9\u300C\u8BBE\u7F6E\u7BA1\u7406\u5458\u7EC8\u7AEF\u300D\u3002","adminShell.tabLabel":"\u7BA1\u7406\u5458","relay.title":"Relay \u8BBE\u7F6E","relay.settings":"\u8BBE\u7F6E","relay.locked":"\u56FA\u5B9A","relay.officialFixed":"\u5B98\u65B9 relay \u5730\u5740\u56FA\u5B9A\uFF0C\u4E0D\u53EF\u4FEE\u6539\u3002","relay.officialHint":"\u5B98\u65B9 relay\uFF1A\u5730\u5740\u56FA\u5B9A\uFF0C\u65E0\u9700\u5BC6\u7801\u3002","relay.password":"Relay \u5BC6\u7801","relay.passwordHint":"\u987B\u4E0E Relay \u7AEF\u7684 RELAY_PASSWORD \u4E00\u81F4\u3002\u7559\u7A7A\u4E3A\u516C\u7528 Relay\u3002","relay.passwordSet":"\u5DF2\u8BBE\u7F6E","relay.passwordEmpty":"\u672A\u8BBE\u7F6E\uFF08\u516C\u7528\uFF09","relay.passwordSaved":"Relay \u5BC6\u7801\u5DF2\u4FDD\u5B58\uFF0C\u91CD\u542F\u670D\u52A1\u751F\u6548\u3002","relay.showPassword":"\u663E\u793A\u5BC6\u7801","relay.hidePassword":"\u9690\u85CF\u5BC6\u7801","relay.identity":"\u5DE5\u4F5C\u7AD9\u6807\u8BC6","relay.regenerate":"\u91CD\u65B0\u751F\u6210\u6807\u8BC6","relay.regenerated":"\u5DF2\u751F\u6210\u65B0\u6807\u8BC6\uFF0C\u91CD\u542F\u540E\u91CD\u65B0\u6CE8\u518C\u3002","relay.envSnippet":"Relay \u542F\u52A8\u547D\u4EE4","relay.envHint":"\u5728 Relay \u4E3B\u673A\u6267\u884C\u6B64\u547D\u4EE4\u3002","relay.test":"\u6D4B\u8BD5 Relay \u8FDE\u63A5","relay.testOk":"Relay \u53EF\u8BBF\u95EE\uFF1A\u7248\u672C {version}\uFF0C\u5DF2\u8FDE\u63A5 {hosts} \u53F0\u5DE5\u4F5C\u7AD9\u3002","relay.testFailed":"Relay \u65E0\u6CD5\u8BBF\u95EE\uFF1A{message}","relay.selectAddress":"\u9009\u62E9\u516C\u5E03\u5730\u5740","relay.listenAddress":"\u76D1\u542C\u5730\u5740","relay.listenAddressHint":"\u670D\u52A1\u5668\u7ED1\u5B9A\u5730\u5740\uFF1B\u6D4F\u89C8\u5668\u8BBF\u95EE\u4E0B\u65B9\u516C\u5E03\u5730\u5740\u3002","relay.addressTailscale":"Tailscale","relay.addressLan":"\u5C40\u57DF\u7F51","relay.addressVirtual":"\u865A\u62DF\u7F51\u5361","relay.addressLoopback":"\u56DE\u73AF","relay.noAddresses":"\u672A\u627E\u5230\u975E\u56DE\u73AF\u5730\u5740\u3002","relay.docsHint":"\u81EA\u5EFA\u6307\u5357\uFF1Adocs/self-hosted-relay.zh-CN.md","keepalive.title":"\u540E\u53F0\u4FDD\u6D3B\u670D\u52A1","keepalive.manager":"\u7BA1\u7406\u65B9\u5F0F","keepalive.state":"\u72B6\u6001","keepalive.install":"\u5B89\u88C5\u5E76\u542F\u52A8","keepalive.uninstall":"\u505C\u6B62\u5E76\u79FB\u9664","keepalive.restart":"\u91CD\u542F\u4FDD\u6D3B\u670D\u52A1","keepalive.installed":"\u5DF2\u901A\u8FC7 {manager} \u5B89\u88C5\u4FDD\u6D3B\u670D\u52A1\u3002","keepalive.uninstalled":"\u4FDD\u6D3B\u670D\u52A1\u5DF2\u79FB\u9664\u3002","keepalive.restarted":"\u4FDD\u6D3B\u670D\u52A1\u5DF2\u91CD\u542F\u3002","keepalive.failed":"\u4FDD\u6D3B\u64CD\u4F5C\u5931\u8D25\uFF1A{message}","keepalive.unitPath":"\u5355\u5143\u6587\u4EF6","keepalive.logsHint":"\u67E5\u770B\u65E5\u5FD7\uFF1A{command}","keepalive.linger":"\u5F00\u673A\u81EA\u542F","keepalive.lingerEnabled":"\u5DF2\u5F00\u542F\u5F00\u673A\u81EA\u542F\u3002","keepalive.lingerDisabled":"\u672A\u5F00\u542F\u5F00\u673A\u81EA\u542F\uFF08\u4EC5\u767B\u5F55\u671F\u95F4\u8FD0\u884C\uFF09\u3002","keepalive.enableLinger":"\u5F00\u542F\u5F00\u673A\u81EA\u542F","keepalive.lingerDone":"\u5DF2\u4E3A {username} \u5F00\u542F\u5F00\u673A\u81EA\u542F\u3002","keepalive.fallbackNote":"\u65E0\u7CFB\u7EDF\u670D\u52A1\u7BA1\u7406\u5668\uFF0C\u4F7F\u7528\u540E\u53F0\u5B88\u62A4\u8FDB\u7A0B\uFF0C\u91CD\u542F\u540E\u4E0D\u81EA\u52A8\u6062\u590D\u3002","keepalive.windowsTaskNote":"\u5728\u4F60\u7684\u8D26\u6237\u767B\u5F55\u540E\u542F\u52A8\uFF0C\u65E0\u9700\u5BC6\u7801\u6216\u7BA1\u7406\u5458\u6743\u9650\uFF1B\u767B\u5F55\u524D\u4E0D\u4F1A\u8FD0\u884C\u3002","keepalive.serviceNote":"\u4EE5\u4F60\u7684\u8D26\u6237\u4F5C\u4E3A Windows \u670D\u52A1\u8FD0\u884C\uFF0C\u5728\u767B\u5F55\u524D\u542F\u52A8\u3002\u5B89\u88C5\u6216\u79FB\u9664\u9700\u8981\u7BA1\u7406\u5458\u6743\u9650\uFF0CWindows \u4E5F\u53EF\u80FD\u8981\u6C42\u8D26\u6237\u5BC6\u7801\u3002","keepalive.serviceWindowHint":"\u8BF7\u5728\u968F\u540E\u6253\u5F00\u7684\u7BA1\u7406\u5458\u7A97\u53E3\u4E2D\u5B8C\u6210\u5B89\u88C5\u3002","keepalive.elevationCancelled":"\u672A\u6388\u4E88\u7BA1\u7406\u5458\u6743\u9650\uFF0C\u672A\u5B89\u88C5\u670D\u52A1\u3002","keepalive.passwordPrompt":"\u8BF7\u8F93\u5165 {account} \u7684 Windows \u8D26\u6237\u5BC6\u7801\uFF08\u4E0D\u662F PIN\uFF1B\u8D26\u6237\u65E0\u5BC6\u7801\u65F6\u76F4\u63A5\u6309 Enter\uFF09\uFF1A","keepalive.passwordRejected":"Windows \u672A\u80FD\u4F7F\u7528\u8FD9\u4E9B\u51ED\u636E\u542F\u52A8\u670D\u52A1\u3002\u8BF7\u68C0\u67E5\u8D26\u6237\u5BC6\u7801\u548C\u201C\u4F5C\u4E3A\u670D\u52A1\u767B\u5F55\u201D\u7B56\u7565\u3002","keepalive.serviceInstalled":"\u670D\u52A1 {id} \u5DF2\u5B89\u88C5\u5E76\u6B63\u5728\u8FD0\u884C\u3002","keepalive.wrongAccount":"\u8BF7\u4F7F\u7528\u5C06\u8FD0\u884C herdr-remote \u7684\u8D26\u6237\u6267\u884C\u6B64\u64CD\u4F5C\uFF0C\u4E0D\u8981\u6362\u7528\u5176\u4ED6\u7BA1\u7406\u5458\u8D26\u6237\u3002","keepalive.pressEnter":"\u6309 Enter \u5173\u95ED\u6B64\u7A97\u53E3\u3002","herdr.title":"Herdr \u96C6\u6210","herdr.socketPath":"\u5957\u63A5\u5B57\u8DEF\u5F84","herdr.args":"\u9644\u52A0\u53C2\u6570","herdr.autoStartHint":"\u5173\uFF1AHerdr \u53EA\u5728\u4F60\u624B\u52A8\u8FD0\u884C\uFF0C\u6216\u5728\u6D4F\u89C8\u5668\u91CC\u786E\u8BA4\u540E\u624D\u542F\u52A8\u3002\u5F00\uFF1Aherdr-remote \u6BCF\u6B21\u542F\u52A8\uFF08\u5305\u62EC\u5F00\u673A\uFF09\u65F6\u4E00\u5E76\u542F\u52A8 Herdr\u3002\u4E0B\u6B21 herdr-remote \u542F\u52A8\u65F6\u751F\u6548\u3002","herdr.cliMissing":"\u672A\u627E\u5230 herdr \u547D\u4EE4\uFF0C\u53EF\u5C06 HERDR_BIN_PATH \u8BBE\u4E3A\u5176\u5B8C\u6574\u8DEF\u5F84\u3002","herdr.version":"Herdr \u7248\u672C","herdr.versionOutdated":"Herdr {version} \u4F4E\u4E8E {minimum}\uFF0C\u8BF7\u8FD0\u884C \u201Cherdr update\u201D\uFF1A\u5728\u8BE5\u7248\u672C\u4E4B\u524D\uFF0C\u6D4F\u89C8\u5668\u7A97\u53E3\u7684\u6807\u9898\u3001\u5927\u6BB5\u7C98\u8D34\u3001\u70B9\u6309\u7A97\u683C\u4E0E Alt \u5FEB\u6377\u952E\u90FD\u4F1A\u51FA\u95EE\u9898\u3002","about.title":"\u8BED\u8A00\u4E0E\u5173\u4E8E","about.language":"\u754C\u9762\u8BED\u8A00","about.languageAuto":"\u8DDF\u968F\u7CFB\u7EDF\uFF08{detected}\uFF09","about.languageZh":"\u4E2D\u6587","about.languageEn":"English","about.version":"\u7248\u672C","about.configPath":"\u914D\u7F6E\u6587\u4EF6","about.statePath":"\u72B6\u6001\u76EE\u5F55","about.relayPackage":"Relay \u5305","about.docs":"\u81EA\u5EFA\u6307\u5357\uFF1Adocs/self-hosted-relay.zh-CN.md","wizard.title":"\u9996\u6B21\u8BBE\u7F6E","wizard.step":"\u7B2C {current} / {total} \u6B65","wizard.languageTitle":"\u9009\u62E9\u8BED\u8A00","wizard.accessTitle":"\u9009\u62E9\u8BBF\u95EE\u65B9\u5F0F","wizard.accessHint":"\u540E\u7EED\u53EF\u5728 Relay \u9875\u9762\u4FEE\u6539\u3002","wizard.addressTitle":"\u9009\u62E9\u8BBF\u95EE\u5730\u5740","wizard.relayTitle":"Relay \u670D\u52A1\u5668","wizard.relayUrlLabel":"Relay \u5730\u5740\uFF08wss://\u2026\uFF09","wizard.relayHint":"Relay \u9700\u5148\u8FD0\u884C\u3002\u642D\u5EFA\u6307\u5357\u89C1 docs/self-hosted-relay.zh-CN.md\u3002","wizard.passwordTitle":"Relay \u5BC6\u7801","wizard.passwordHint":"Relay \u7684 RELAY_PASSWORD\u3002\u672A\u8BBE\u7559\u7A7A\u3002","wizard.finishTitle":"\u5B8C\u6210","wizard.finishHint":"\u914D\u7F6E\u5C06\u4FDD\u5B58\u81F3 {path}\u3002","wizard.startNow":"\u7ACB\u5373\u542F\u52A8\u670D\u52A1","wizard.installKeepalive":"\u540E\u53F0\u4FDD\u6D3B","wizard.finish":"\u4FDD\u5B58\u5E76\u5B8C\u6210","field.mode":"\u8BBF\u95EE\u65B9\u5F0F","field.port":"Relay \u7AEF\u53E3","field.lanHost":"\u6D4F\u89C8\u5668\u5730\u5740","field.remoteUrl":"Relay \u5730\u5740","field.publicUrl":"\u6D4F\u89C8\u5668\u5730\u5740\uFF08\u8986\u76D6\uFF09","field.socketPath":"Herdr \u5957\u63A5\u5B57\u8DEF\u5F84","field.herdrArgs":"Herdr \u53C2\u6570","field.herdrAutoStart":"\u968F\u670D\u52A1\u542F\u52A8 Herdr","field.language":"\u8BED\u8A00","field.keepalive":"\u4FDD\u6D3B\u7BA1\u7406\u65B9\u5F0F","placeholder.autoDiscovered":"\u81EA\u52A8\u63A2\u6D4B","placeholder.none":"\u65E0","error.invalidMode":"\u672A\u77E5\u7684\u8BBF\u95EE\u65B9\u5F0F\u3002","error.invalidPort":"\u7AEF\u53E3\u987B\u4E3A 1 \u5230 65535 \u4E4B\u95F4\u7684\u6570\u5B57\u3002","error.invalidLanHost":"\u6D4F\u89C8\u5668\u5730\u5740\u987B\u4E3A\u53EF\u8BBF\u95EE\u5C40\u57DF\u7F51\u6216 Tailscale \u5730\u5740\uFF0C\u4E0D\u80FD\u4E3A\u56DE\u73AF\u6216 0.0.0.0\u3002","error.invalidRelayUrl":"Relay \u5730\u5740\u987B\u4EE5 wss://\u3001ws://\u3001https:// \u6216 http:// \u5F00\u5934\u3002","error.invalidPublicUrl":"\u6D4F\u89C8\u5668\u5730\u5740\u987B\u4EE5 https:// \u6216 http:// \u5F00\u5934\uFF0C\u4E0D\u80FD\u4E3A 0.0.0.0 \u6216 ::\u3002","error.invalidLanguage":"\u672A\u77E5\u7684\u8BED\u8A00\u3002","error.invalidKeepalive":"\u672A\u77E5\u7684\u4FDD\u6D3B\u7BA1\u7406\u65B9\u5F0F\u3002","error.unknownField":"\u672A\u77E5\u7684\u8BBE\u7F6E\u9879\u3002","error.remoteUrlRequired":"\u81EA\u5EFA Relay \u6A21\u5F0F\u987B\u586B\u5199 Relay \u5730\u5740\u3002","error.removedHerdrArg":"Herdr 0.9.0 \u5DF2\u79FB\u9664 --no-session\uFF0C\u8BF7\u4ECE\u9644\u52A0\u53C2\u6570\u4E2D\u79FB\u9664\u3002","error.saveFailed":"\u4FDD\u5B58\u914D\u7F6E\u5931\u8D25\uFF1A{message}","hint.navigate":"\u2191\u2193 \u79FB\u52A8","hint.select":"\u21B5 \u9009\u62E9","hint.edit":"\u21B5 \u7F16\u8F91","hint.tabs":"\u2190 \u2192 \u5207\u6362\u9875\u9762","hint.back":"esc \u8FD4\u56DE","hint.quit":"q \u9000\u51FA","hint.mouseOn":"m \u5173\u95ED\u9F20\u6807","hint.mouseOff":"m \u5F00\u542F\u9F20\u6807","hint.mouseUnsupported":"\u4E0D\u652F\u6301\u9F20\u6807","hint.restartRequired":"\u91CD\u542F\u670D\u52A1\u751F\u6548\u3002","hint.unsavedChanges":"\u6709\u672A\u4FDD\u5B58\u4FEE\u6539\uFF08\u6309 s \u4FDD\u5B58\uFF09\u3002","hint.save":"s \u4FDD\u5B58","hint.editing":"\u21B5 \u786E\u8BA4 \xB7 esc \u53D6\u6D88","update.title":"\u66F4\u65B0","update.banner":"herdr-remote {latest} \u5DF2\u53D1\u5E03\uFF08\u5F53\u524D {current}\uFF09\uFF0C\u6309 7 \u8FDB\u5165\u300C\u8BED\u8A00\u4E0E\u5173\u4E8E\u300D\uFF0C\u5728\u66F4\u65B0\u4E00\u884C\u6309 Enter \u5B89\u88C5\u3002","update.check":"\u68C0\u67E5\u66F4\u65B0","update.checking":"\u67E5\u8BE2 GitHub Releases \u4E0E npm \u4E2D\u2026","update.upToDate":"\u5DF2\u662F\u6700\u65B0\uFF08{version}\uFF09","update.available":"\u65B0\u7248\u672C {version} \u53EF\u7528\uFF08\u6309 Enter \u5B89\u88C5\uFF09","update.updating":"\u5B89\u88C5 {version} \u4E2D\u2026","update.updatingRetry":"\u5B89\u88C5 {version} \u4E2D\u2026\uFF08npm \u5C1A\u672A\u540C\u6B65\uFF0C\u7B2C {attempt} \u6B21\u5C1D\u8BD5\uFF09","update.done":"\u5DF2\u66F4\u65B0\u81F3 {version}","update.restartHint":"\u66F4\u65B0\u5DF2\u5B89\u88C5\uFF0C\u91CD\u542F herdr-remote \u751F\u6548\u3002","update.errorNetwork":"GitHub Releases \u4E0E\u6240\u6709 npm registry \u5747\u65E0\u6CD5\u8FDE\u63A5","update.errorNetworkDetail":"\u5747\u65E0\u5E94\u7B54\uFF1A{message}","update.errorFailed":"\u66F4\u65B0\u5931\u8D25\uFF0C\u53EF\u624B\u52A8\u6267\u884C\uFF1Anpm install -g {url}","update.errorFailedDetail":"npm\uFF1A{message}","update.errorNotYetPublished":"npm \u8FD8\u6CA1\u540C\u6B65\u5230 {version}\uFF08\u521A\u53D1\u5E03\u7684\u51E0\u5206\u949F\u5185\u5E38\u89C1\uFF09\uFF0C\u7A0D\u540E\u6309 Enter \u91CD\u8BD5\u3002","update.errorNotApplied":"npm \u62A5\u544A\u6210\u529F\uFF0C\u4F46\u5B89\u88C5\u7684\u4ECD\u662F {installed}","update.mirrorBehind":"{registries} \u4ECD\u662F\u65E7\u7248\u672C\uFF0C\u5C06\u4ECE {source} \u5B89\u88C5","update.cannot.source":"\u6E90\u7801\u76EE\u5F55\u8FD0\u884C\uFF0C\u8BF7\u4F7F\u7528 git \u66F4\u65B0","update.cannot.linked":"npm link \u5DE5\u4F5C\u526F\u672C\uFF0C\u7531 npm link \u7BA1\u7406","update.stoppingServices":"\u66FF\u6362\u6587\u4EF6\u671F\u95F4\u5148\u505C\u6B62\u670D\u52A1\u2026","update.restarting":"\u6B63\u5728\u7528\u65B0\u7248\u672C\u91CD\u542F\u670D\u52A1\u2026","update.notRunning":"\u670D\u52A1\u4E4B\u524D\u6CA1\u6709\u8FD0\u884C\uFF0C\u4FDD\u6301\u505C\u6B62\u3002\u9700\u8981\u65F6\u6267\u884C\uFF1Aherdr-remote start","update.restartFailed":"\u5DF2\u5B89\u88C5\uFF0C\u4F46\u670D\u52A1\u6CA1\u80FD\u91CD\u542F\uFF1A{message}","update.brokerRestarted":"\u7BA1\u7406\u5458\u7EC8\u7AEF broker \u5DF2\u91CD\u542F\u3002","update.brokerRestartFailed":"\u7BA1\u7406\u5458\u7EC8\u7AEF broker \u6CA1\u6709\u91CD\u65B0\u542F\u52A8\u3002\u91CD\u65B0\u767B\u5F55 Windows\uFF0C\u6216\u8FD0\u884C herdr-remote admin-broker restart\u3002","update.brokerBusy":"\u6709\u7BA1\u7406\u5458\u7EC8\u7AEF\u5F00\u7740\uFF0Cbroker \u7EE7\u7EED\u8FD0\u884C\u65E7\u7248\u672C\u3002\u5173\u95ED\u6240\u6709\u7BA1\u7406\u5458\u7EC8\u7AEF\u540E\u8FD0\u884C herdr-remote admin-broker restart\u3002","update.errorBusy":"\u4ECD\u6709\u8FDB\u7A0B\u5360\u7528 herdr-remote \u7684\u5B89\u88C5\u76EE\u5F55\uFF0C\u65E7\u7248\u672C\u8BBE\u7F6E\u7684\u7BA1\u7406\u5458\u7EC8\u7AEF broker \u4F1A\u8FD9\u6837\u3002\u5148\u5728\u7BA1\u7406\u5458 PowerShell \u4E2D\u6267\u884C\uFF1AGet-ScheduledTask -TaskName 'HerdrRemoteAdminBroker-*' | Stop-ScheduledTask\uFF0C\u518D\u56DE\u5230\u8FD9\u91CC\u91CD\u65B0\u8FD0\u884C herdr-remote update\uFF0C\u6700\u540E\u4EE5\u7BA1\u7406\u5458\u8EAB\u4EFD\u8FD0\u884C herdr-remote admin-broker install\u3002"},l=u;var o={en:d,zh:l},n="en";function s(e){return typeof e=="string"&&Object.hasOwn(o,e)}function y({env:e=process.env,preference:r="auto"}={}){if(r&&r!=="auto"&&s(r))return r;if(s(e.HERDR_REMOTE_LANG))return e.HERDR_REMOTE_LANG;let a=e.LC_ALL||e.LC_MESSAGES||e.LANG||e.LANGUAGE||"";return String(a).split(/[:.@]/)[0].toLowerCase().startsWith("zh")?"zh":n}function v(e,r){return r?e.replace(/\{(\w+)\}/g,(a,i)=>Object.hasOwn(r,i)?String(r[i]):a):e}function b(e=n){let r=s(e)?o[e]:o[n],a=o[n];return Object.assign((t,c)=>{let p=r[t]??a[t]??t;return v(p,c)},{locale:e,has:t=>Object.hasOwn(r,t)})}export{y as a,b};
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import"./C2UUZY6J.js";import{b as P,c as I}from"./KRSURB5L.js";import"./DGUZCGQN.js";import"./JJGEV4EZ.js";import"./H24ZP5D5.js";import"./PBRQ3HEG.js";import{c as a,d as w,g as l,h as M}from"./U6QAYG3E.js";import"./UEOQE77N.js";import{o as u}from"./M52LJEES.js";import{a as y,c as n}from"./KRVF37OW.js";import{a as g}from"./QRGNEKME.js";import"./PBMBFWLQ.js";import{c as f,f as m}from"./TNLCNVA2.js";import"./I6NRCYLI.js";import S from"node:fs";import{spawn as v}from"node:child_process";var T=500,k=3e4,A=3e4,d=class{config;state;logToFiles;onEvent;specs;children=new Map;stopping=!1;constructor({config:t=u(),state:s=w(),logToFiles:i=!1,onEvent:e=null,specs:r=null}={}){this.config=t,this.state=s,this.logToFiles=i,this.onEvent=e,this.specs=r}emit(t){this.onEvent&&this.onEvent(t);let s=`[${new Date().toISOString()}] herdr-remote supervisor: ${t.message}
|
|
4
|
+
`;process.stdout.write(s)}async reclaimStrays({timeoutMs:t=5e3}={}){let s=M().filter(e=>e.pid!==process.pid);if(s.length===0)return s;for(let{pid:e,name:r}of s){this.emit({type:"reclaim",name:r,pid:e,message:`stopping stray ${r} from an earlier start (pid ${e})`});try{process.kill(e,"SIGTERM")}catch{}}let i=Date.now()+t;for(;Date.now()<i;){if(s.every(({pid:e})=>!y(e)))return s;await new Promise(e=>{setTimeout(e,100)})}for(let{pid:e,name:r}of n(s)){this.emit({type:"reclaim",name:r,pid:e,message:`stray ${r} (pid ${e}) ignored SIGTERM, killing`});try{process.kill(e,"SIGKILL")}catch{}}return s}async start(){if(this.stopping=!1,g(f()),await this.reclaimStrays(),!this.stopping){for(let t of this.specs??P(this.config,this.state))this.children.set(t.name,{spec:t,child:null,pid:null,restarts:0,backoffMs:T,timer:null}),this.spawnChild(t.name);this.persistPids()}}spawnChild(t){if(this.stopping)return;let s=this.children.get(t);if(!s||s.child)return;let i=["ignore","inherit","inherit"],e=null;this.logToFiles&&(e=S.openSync(m(t),"a"),i=["ignore",e,e]);let r;try{r=v(s.spec.command,s.spec.args,{cwd:s.spec.cwd,env:{...I(),...s.spec.env},windowsHide:!0,stdio:i})}catch(o){this.emit({type:"spawn_failed",name:t,message:`could not start ${t}: ${o.message}`}),this.scheduleRestart(t);return}finally{if(e!==null)try{S.closeSync(e)}catch{}}s.child=r,s.pid=r.pid,s.startedAt=Date.now(),this.emit({type:"started",name:t,pid:r.pid,message:`${t} started (pid ${r.pid})`}),this.persistPids(),r.on("exit",(o,c)=>{let h=Date.now()-(s.startedAt??Date.now());if(s.child=null,s.pid=null,this.persistPids(),!this.stopping){if(o===12){this.emit({type:"replaced",name:t,message:`${t} stood down: another instance owns this workstation. Not restarting it.`});return}if(o===13){this.emit({type:"fatal",name:t,message:`${t} stopped: relay authentication failed. Update credentials before restarting it.`});return}h>=A&&(s.backoffMs=T),this.emit({type:"exited",name:t,code:o,signal:c,message:`${t} exited (${c||`code ${o}`}) after ${Math.round(h/1e3)}s, restarting in ${s.backoffMs}ms`}),this.scheduleRestart(t)}}),r.on("error",o=>{this.emit({type:"error",name:t,message:`${t} error: ${o.message}`})})}scheduleRestart(t){if(this.stopping)return;let s=this.children.get(t);if(!s||s.timer)return;let i=s.backoffMs;s.restarts+=1,s.backoffMs=Math.min(k,Math.round(s.backoffMs*2));let e=setTimeout(()=>{s.timer=null,this.spawnChild(t)},i);s.timer=e,e.unref?.()}persistPids(){try{a(t=>{t.supervisorPid=process.pid,t.relayPid=this.children.get("relay")?.pid||null,t.hostPid=this.children.get("host")?.pid||null,t.startedAt=t.startedAt||new Date().toISOString(),t.mode=this.config.relay.mode,l(t,"supervisor",process.pid);for(let[s,i]of this.children)i.pid&&l(t,s,i.pid)})}catch(t){process.stderr.write(`herdr-remote supervisor: could not persist pids: ${t.message}
|
|
5
|
+
`)}}async stop({graceMs:t=5e3}={}){this.stopping=!0;let s=[];for(let i of this.children.values()){i.timer&&(clearTimeout(i.timer),i.timer=null);let e=i.child;e&&s.push(new Promise(r=>{let o=setTimeout(()=>{try{e.kill("SIGKILL")}catch{}r()},t);o.unref?.(),e.once("exit",()=>{clearTimeout(o),r()});try{e.kill("SIGTERM")}catch{r()}}))}await Promise.all(s);try{a(i=>{i.supervisorPid=null,i.relayPid=null,i.hostPid=null,i.startedAt=null,i.managedPids=n((i.managedPids||[]).filter(Boolean))})}catch{}}};async function x({logToFiles:p=!1}={}){let t=new d({logToFiles:p});return await t.start(),new Promise(s=>{let i=!1,e=async r=>{i||(i=!0,t.emit({type:"shutdown",message:`${r} received, stopping services`}),await t.stop(),s(0))};process.on("SIGINT",()=>{e("SIGINT")}),process.on("SIGTERM",()=>{e("SIGTERM")}),process.on("SIGHUP",()=>{e("SIGHUP")})})}export{T as MIN_BACKOFF_MS,d as Supervisor,x as runForeground};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { createRequire as __herdrCreateRequire } from 'node:module';
|
|
2
|
+
const require = __herdrCreateRequire(import.meta.url);
|
|
3
|
+
import{a as m,c as w}from"./7AUQHB3O.js";import"./XN6D5S55.js";import{b as u,c as p,d as h}from"./42KARAL4.js";import"./JJGEV4EZ.js";import"./M4AFZHKH.js";import"./UEOQE77N.js";import"./PBMBFWLQ.js";import"./TNLCNVA2.js";import"./I6NRCYLI.js";var E=5e3,f=class{socket=null;input="";connected=!1;started=!1;finished=!1;killed=!1;early=[];dataListener=null;exitListener=null;errorListener=null;options;constructor(e){this.options=e}start({cols:e,rows:r,onData:l,onExit:t,onError:n}){this.dataListener=l,this.exitListener=t,this.errorListener=n;let c;try{c=p()}catch(o){this.fail(o);return}let{socket:i,token:a}=c;this.socket=i,i.setEncoding("utf8"),i.setTimeout(E,()=>{i.destroy(Object.assign(new Error("Administrator terminal broker connection timed out"),{code:"ETIMEDOUT"}))}),i.on("connect",()=>{this.connected=!0,i.setTimeout(0),h(i,{type:"start",token:a,...this.options,cols:e,rows:r})}),i.on("data",o=>this.receive(o)),i.on("error",o=>this.fail(o)),i.on("close",()=>{this.started&&!this.finished&&!this.killed&&(this.finished=!0,this.exitListener?.({exitCode:1}))})}write(e){if(!this.finished){if(!this.started){this.early.push(Buffer.from(e));return}this.socket?.writable&&h(this.socket,{type:"input",dataBase64:Buffer.from(e).toString("base64")})}}resize(e,r){this.started&&this.socket?.writable&&h(this.socket,{type:"resize",cols:e,rows:r})}kill(){this.killed=!0,this.socket&&(this.connected&&this.socket.writable?(h(this.socket,{type:"kill"}),this.socket.end()):this.socket.destroy())}receive(e){if(this.input+=e,Buffer.byteLength(this.input,"utf8")>u){this.socket?.destroy(new Error("Administrator terminal broker message exceeded the limit"));return}for(;;){let r=this.input.indexOf(`
|
|
4
|
+
`);if(r<0)return;let l=this.input.slice(0,r);this.input=this.input.slice(r+1);let t;try{t=JSON.parse(l)}catch{this.socket?.destroy(new Error("Administrator terminal broker sent invalid JSON"));return}if(t.type==="started"){this.started=!0;let n=Buffer.concat(this.early);this.early=[],n.length>0&&this.write(n)}else t.type==="data"&&typeof t.dataBase64=="string"?this.dataListener?.(Buffer.from(t.dataBase64,"base64").toString("utf8")):t.type==="exit"?(this.finished=!0,this.exitListener?.({exitCode:Number(t.exitCode)||0,...typeof t.signal=="number"?{signal:t.signal}:{}}),this.socket?.end()):t.type==="error"&&this.fail(new Error(typeof t.message=="string"?t.message:"Admin PTY failed"))}}fail(e){if(this.started){!this.finished&&!this.killed&&(this.finished=!0,this.exitListener?.({exitCode:1}));return}this.finished||this.killed||(this.finished=!0,this.errorListener?.(e))}};var k=["ENOENT","ECONNREFUSED","ETIMEDOUT"];async function y(){let s=process.env.HERDR_SOCKET_PATH,e=process.env.HERDR_PANE_ID;if(!(process.env[w]!=="1"||!s||!e))try{await m(s,"pane.close",{pane_id:e})}catch{}}async function O(s,{stdin:e=process.stdin,stdout:r=process.stdout,platform:l=process.platform}={}){if(l!=="win32")throw new Error(s("adminBroker.windowsOnly"));if(!e.isTTY||!r.isTTY)throw new Error(s("adminShell.needsTerminal"));let t=new f({command:"powershell.exe",args:["-NoLogo","-NoProfile"],cwd:process.cwd()}),n=i=>t.write(i),c=()=>t.resize(r.columns,r.rows);e.setRawMode(!0),e.on("data",n),e.resume(),r.on("resize",c);try{let i=await new Promise((a,o)=>{t.start({cols:r.columns,rows:r.rows,onData:d=>r.write(d),onExit:d=>a(d.exitCode),onError:o})});return await y(),i}catch(i){let{code:a}=i;throw a&&k.includes(a)?new Error(s("adminShell.brokerUnavailable")):i}finally{e.off("data",n),r.off("resize",c),e.setRawMode(!1),e.pause()}}export{O as runAdminShell};
|