conductor-remote 1.26.2 → 1.27.1
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/index.html
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
<title>Conductor Remote</title>
|
|
14
14
|
<!-- Runs before the module bundle so it can catch a stale shell that fails to boot. -->
|
|
15
15
|
<script src="/self-heal.js"></script>
|
|
16
|
-
<script type="module" crossorigin src="/assets/index-
|
|
16
|
+
<script type="module" crossorigin src="/assets/index-CzXmawS-.js"></script>
|
|
17
17
|
<link rel="stylesheet" crossorigin href="/assets/index-DnE5ulTu.css">
|
|
18
18
|
<link rel="manifest" href="/manifest.webmanifest"></head>
|
|
19
19
|
<body>
|
package/dist/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
if(!self.define){let e,i={};const n=(n,s)=>(n=new URL(n+".js",s).href,i[n]||new Promise(i=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=i,document.head.appendChild(e)}else e=n,importScripts(n),i()}).then(()=>{let e=i[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(s,r)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(i[o])return;let l={};const c=e=>n(e,o),t={module:{uri:o},exports:l,require:c};i[o]=Promise.all(s.map(e=>t[e]||c(e))).then(e=>(r(...e),l))}}define(["./workbox-9c191d2f"],function(e){"use strict";self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"self-heal.js",revision:"49bd63adb25a09341f8d2610e8bd3c76"},{url:"index.html",revision:"
|
|
1
|
+
if(!self.define){let e,i={};const n=(n,s)=>(n=new URL(n+".js",s).href,i[n]||new Promise(i=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=i,document.head.appendChild(e)}else e=n,importScripts(n),i()}).then(()=>{let e=i[n];if(!e)throw new Error(`Module ${n} didn’t register its module`);return e}));self.define=(s,r)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(i[o])return;let l={};const c=e=>n(e,o),t={module:{uri:o},exports:l,require:c};i[o]=Promise.all(s.map(e=>t[e]||c(e))).then(e=>(r(...e),l))}}define(["./workbox-9c191d2f"],function(e){"use strict";self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"self-heal.js",revision:"49bd63adb25a09341f8d2610e8bd3c76"},{url:"index.html",revision:"8c56dd890245566422e09621b1f83cd2"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/index-DnE5ulTu.css",revision:null},{url:"assets/index-CzXmawS-.js",revision:null},{url:"apple-touch-icon.png",revision:"2b9301416b880d45d4bb655f2600d1f2"},{url:"icon-192.png",revision:"c5e01ac58768627e18ee7b8b6a9239ef"},{url:"icon-512.png",revision:"a40638c55e310312457a621c9a0002c8"},{url:"icon-maskable-512.png",revision:"a40638c55e310312457a621c9a0002c8"},{url:"icon.svg",revision:"c1aee186821798733dd477e69a0ef243"},{url:"manifest.webmanifest",revision:"cf88fbc5755108a7fe0616fa160a8a15"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("/index.html"),{denylist:[/^\/api\//]}))});
|
|
@@ -47,9 +47,16 @@ function main() {
|
|
|
47
47
|
const battValue = (key) => `pmset -g custom | awk '/^Battery Power:/{b=1;next} /^AC Power:/{b=0} b&&$1=="${key}"{print $2;exit}'`;
|
|
48
48
|
// Confirm *inside* the root shell, after pmset applies: this line prints only once the
|
|
49
49
|
// password was accepted and the setting actually took — without it, entering your
|
|
50
|
-
// password drops into a silent `sleep` with no signal that anything happened.
|
|
51
|
-
//
|
|
52
|
-
|
|
50
|
+
// password drops into a silent `sleep` with no signal that anything happened. It also
|
|
51
|
+
// carries the wall-clock **expiry**, computed here rather than before the spawn, because
|
|
52
|
+
// the clock that matters starts when the password lands, not when the command was typed.
|
|
53
|
+
// `arg` is regex-validated (digits + s/m/h), so it's safe to interpolate. `clock` prints an
|
|
54
|
+
// epoch as HH:MM, weekday-prefixed when it lands on another day (a long window is otherwise
|
|
55
|
+
// ambiguous — "until 15:45" reads as today).
|
|
56
|
+
const clock = `clock() { if [ "$(date -r "$1" '+%j')" = "$(date '+%j')" ]; then date -r "$1" '+%H:%M'; else date -r "$1" '+%a %H:%M'; fi; }`;
|
|
57
|
+
const armed = seconds !== null
|
|
58
|
+
? `echo "✓ Sleep disabled until $(clock $(( $(date +%s) + ${seconds} ))) (${arg}, incl. lid closed). Ctrl-C to restore."`
|
|
59
|
+
: `echo "✓ Sleep disabled at $(date '+%H:%M') (incl. lid closed) — until you press Ctrl-C."`;
|
|
53
60
|
const script = [
|
|
54
61
|
`sb=$(${battValue('standby')})`,
|
|
55
62
|
`pn=$(${battValue('powernap')})`,
|
|
@@ -58,8 +65,9 @@ function main() {
|
|
|
58
65
|
`trap "pmset -b standby \${sb:-1} powernap \${pn:-1}; pmset -a disablesleep \${ds:-0}" EXIT INT TERM`,
|
|
59
66
|
'pmset -b standby 0 powernap 0',
|
|
60
67
|
'pmset -a disablesleep 1',
|
|
68
|
+
clock,
|
|
61
69
|
"echo ''",
|
|
62
|
-
|
|
70
|
+
armed,
|
|
63
71
|
sleepStep
|
|
64
72
|
].join('\n');
|
|
65
73
|
console.info('conductor-remote nosleep — keeping this Mac awake (incl. lid-closed system sleep).');
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
* KeepAlive restarts it into the freshly-installed code (the plist's baked `bin/cli.js` path is stable
|
|
9
9
|
* across a global reinstall, so no re-`service install` is needed).
|
|
10
10
|
*
|
|
11
|
-
* Beyond that
|
|
11
|
+
* Beyond that periodic registry poll, a cheap local check reconciles a disk↔process version skew: if the
|
|
12
12
|
* installed package.json on disk no longer matches the version this process booted as — an out-of-band
|
|
13
13
|
* `npm i -g`/deploy swapped the global install underneath us — it exit()→restarts to load it. Without
|
|
14
14
|
* this, a stale backend keeps serving the newer frontend from disk (the API contract drifts, e.g. the
|
|
@@ -35,16 +35,16 @@ const execFileP = promisify(execFile);
|
|
|
35
35
|
const NAME = 'conductor-remote';
|
|
36
36
|
const projectDir = packageRoot(import.meta.dirname);
|
|
37
37
|
const REGISTRY = process.env.NPM_REGISTRY ?? 'https://registry.npmjs.org';
|
|
38
|
-
// Registry poll cadence. The poll is a single cheap GET off npm's CDN, so a tight loop costs nothing
|
|
39
|
-
//
|
|
40
|
-
//
|
|
41
|
-
//
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
//
|
|
38
|
+
// Registry poll cadence. The poll is a single cheap GET off npm's CDN, so a tight loop costs nothing, and
|
|
39
|
+
// a fresh release should reach the phone while you still care about it — 5 minutes lands `latest` within
|
|
40
|
+
// one coffee sip, and an out-of-band `yarn deploy` still heals in ~a minute via the disk-skew check below.
|
|
41
|
+
// (The first poll fires ~90s after boot, then on this interval, so a restart re-syncs fast regardless of
|
|
42
|
+
// cadence.) `AUTO_UPDATE_INTERVAL_MINUTES` retunes it with no code change — raise it to e.g. 60 when
|
|
43
|
+
// releases go quiet; values are floored at 1 min (below that you're just racing the 60s disk-skew heal and
|
|
44
|
+
// the CDN's tag TTL).
|
|
45
45
|
function resolveIntervalMs() {
|
|
46
46
|
const raw = Number(process.env.AUTO_UPDATE_INTERVAL_MINUTES);
|
|
47
|
-
const minutes = Number.isFinite(raw) && raw > 0 ? raw :
|
|
47
|
+
const minutes = Number.isFinite(raw) && raw > 0 ? raw : 5;
|
|
48
48
|
return Math.max(minutes, 1) * 60 * 1000;
|
|
49
49
|
}
|
|
50
50
|
const CHECK_INTERVAL_MS = resolveIntervalMs();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "conductor-remote",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.27.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"packageManager": "yarn@4.15.0",
|
|
6
6
|
"description": "Phone control panel for local Conductor agents. Reads ride SQLite + git; prompts ride Conductor's own dispatch path.",
|