conductor-remote 1.24.2 → 1.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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-Cc72wJyy.js"></script>
16
+ <script type="module" crossorigin src="/assets/index-qjWM9xpd.js"></script>
17
17
  <link rel="stylesheet" crossorigin href="/assets/index-D6B0k-tm.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 s=(s,n)=>(s=new URL(s+".js",n).href,i[s]||new Promise(i=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=i,document.head.appendChild(e)}else e=s,importScripts(s),i()}).then(()=>{let e=i[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e}));self.define=(n,r)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(i[o])return;let l={};const t=e=>s(e,o),c={module:{uri:o},exports:l,require:t};i[o]=Promise.all(n.map(e=>c[e]||t(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:"3129d4691e071b4f7fbba97436b7a149"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/index-D6B0k-tm.css",revision:null},{url:"assets/index-Cc72wJyy.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\//]}))});
1
+ if(!self.define){let e,i={};const s=(s,n)=>(s=new URL(s+".js",n).href,i[s]||new Promise(i=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=i,document.head.appendChild(e)}else e=s,importScripts(s),i()}).then(()=>{let e=i[s];if(!e)throw new Error(`Module ${s} didn’t register its module`);return e}));self.define=(n,r)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(i[o])return;let l={};const t=e=>s(e,o),c={module:{uri:o},exports:l,require:t};i[o]=Promise.all(n.map(e=>c[e]||t(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:"544bc260095fe9ec2113480b6e679eee"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/index-qjWM9xpd.js",revision:null},{url:"assets/index-D6B0k-tm.css",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\//]}))});
@@ -45,6 +45,11 @@ function main() {
45
45
  // `standby`/`powernap` are per-source, so read them from the Battery Power block.
46
46
  const sleepStep = seconds !== null ? `sleep ${seconds}` : 'while :; do sleep 86400; done';
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
+ // Confirm *inside* the root shell, after pmset applies: this line prints only once the
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. `arg` is
51
+ // regex-validated (digits + s/m/h), so it's safe in the single-quoted echo.
52
+ const durClause = seconds !== null ? ` for ${arg}` : '';
48
53
  const script = [
49
54
  `sb=$(${battValue('standby')})`,
50
55
  `pn=$(${battValue('powernap')})`,
@@ -53,6 +58,8 @@ function main() {
53
58
  `trap "pmset -b standby \${sb:-1} powernap \${pn:-1}; pmset -a disablesleep \${ds:-0}" EXIT INT TERM`,
54
59
  'pmset -b standby 0 powernap 0',
55
60
  'pmset -a disablesleep 1',
61
+ "echo ''",
62
+ `echo '✓ Sleep disabled — this Mac will stay awake${durClause} (incl. lid closed). Ctrl-C to restore.'`,
56
63
  sleepStep
57
64
  ].join('\n');
58
65
  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 6h registry poll, a cheap local check reconciles a disk↔process version skew: if the
11
+ * Beyond that hourly 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,14 +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
- // a coarse interval, by contrast, left the phone serving a stale build for hours when several versions
40
- // ship in quick succession (the poll only fires ~90s after boot, then on this interval). 2 min keeps the
41
- // phone within a couple minutes of `latest`. `AUTO_UPDATE_INTERVAL_MINUTES` retunes it with no code change;
42
- // values are floored at 1 min (below that you're just racing the 60s disk-skew heal and the CDN's tag TTL).
38
+ // Registry poll cadence. The poll is a single cheap GET off npm's CDN, so a tight loop costs nothing
39
+ // but releases are now infrequent and rarely carry a critical fix, so racing `latest` buys little. A
40
+ // coarse hourly poll lands the phone on `latest` within the hour, and an out-of-band `yarn deploy` still
41
+ // heals in ~a minute via the disk-skew check below. (The first poll fires ~90s after boot, then on this
42
+ // interval, so a restart re-syncs fast regardless of cadence.) `AUTO_UPDATE_INTERVAL_MINUTES` retunes it
43
+ // with no code change — drop it to e.g. 2 while shipping a burst of releases; values are floored at 1 min
44
+ // (below that you're just racing the 60s disk-skew heal and the CDN's tag TTL).
43
45
  function resolveIntervalMs() {
44
46
  const raw = Number(process.env.AUTO_UPDATE_INTERVAL_MINUTES);
45
- const minutes = Number.isFinite(raw) && raw > 0 ? raw : 2;
47
+ const minutes = Number.isFinite(raw) && raw > 0 ? raw : 60;
46
48
  return Math.max(minutes, 1) * 60 * 1000;
47
49
  }
48
50
  const CHECK_INTERVAL_MS = resolveIntervalMs();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conductor-remote",
3
- "version": "1.24.2",
3
+ "version": "1.25.0",
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.",