conductor-remote 1.53.1 → 1.53.2

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-Dz1kQTBe.js"></script>
16
+ <script type="module" crossorigin src="/assets/index-CQuR_IG3.js"></script>
17
17
  <link rel="stylesheet" crossorigin href="/assets/index-CNdG7lFR.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,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,r)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let l={};const t=e=>i(e,o),c={module:{uri:o},exports:l,require:t};s[o]=Promise.all(n.map(e=>c[e]||t(e))).then(e=>(r(...e),l))}}define(["./workbox-9c191d2f"],function(e){"use strict";importScripts("/push-sw.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"self-heal.js",revision:"49bd63adb25a09341f8d2610e8bd3c76"},{url:"push-sw.js",revision:"e1e682e2e5e88fa03b7808ae9db8e098"},{url:"index.html",revision:"f0d77cb2af6cdaeed1b4528603d90245"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/index-Dz1kQTBe.js",revision:null},{url:"assets/index-CNdG7lFR.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\//]}))});
1
+ if(!self.define){let e,s={};const i=(i,n)=>(i=new URL(i+".js",n).href,s[i]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=i,e.onload=s,document.head.appendChild(e)}else e=i,importScripts(i),s()}).then(()=>{let e=s[i];if(!e)throw new Error(`Module ${i} didn’t register its module`);return e}));self.define=(n,r)=>{const o=e||("document"in self?document.currentScript.src:"")||location.href;if(s[o])return;let l={};const t=e=>i(e,o),c={module:{uri:o},exports:l,require:t};s[o]=Promise.all(n.map(e=>c[e]||t(e))).then(e=>(r(...e),l))}}define(["./workbox-9c191d2f"],function(e){"use strict";importScripts("/push-sw.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"self-heal.js",revision:"49bd63adb25a09341f8d2610e8bd3c76"},{url:"push-sw.js",revision:"e1e682e2e5e88fa03b7808ae9db8e098"},{url:"index.html",revision:"6fd3f4c8b836fbae3791d6d273888b16"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/index-CQuR_IG3.js",revision:null},{url:"assets/index-CNdG7lFR.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\//]}))});
@@ -8,11 +8,11 @@
8
8
  * Accessibility, no AppleScript, no window has to exist. A Conductor update can
9
9
  * rename every UI string and notifications keep working.
10
10
  *
11
- * What counts as news is deliberately narrow `sessions.status` is the only
12
- * signal Conductor records, and it holds exactly three values:
13
- * - `working → idle` the turn ended. This is *the* event: it covers "done",
14
- * "asked you a question" and "hit a permission prompt" alike, because all
15
- * three end the turn.
11
+ * What counts as news is deliberately narrow. `sessions.status` is the only
12
+ * signal Conductor records. A normal turn ends in one of three states:
13
+ * - `working → idle | needs_plan_response | needs_user_input` means the turn ended.
14
+ * This is *the* event: it covers "done", "asked you a question" and "plan ready"
15
+ * alike, because all three end the turn.
16
16
  * - `→ error` — the agent stopped badly.
17
17
  * There is no permission-request table to watch (verified against the schema), so
18
18
  * don't go looking for a finer-grained trigger; there isn't one.
@@ -247,6 +247,10 @@ function askedBy(state) {
247
247
  return '';
248
248
  return `${state.turnStartedAt ?? ''}|${state.lastUserMessageAt ?? ''}`;
249
249
  }
250
+ /** Statuses that keep a completed turn open until the person responds. */
251
+ function turnEnded(status) {
252
+ return status === 'idle' || status === 'needs_plan_response' || status === 'needs_user_input';
253
+ }
250
254
  /**
251
255
  * The status state machine, kept apart from the store and the network so it can be
252
256
  * driven a tick at a time by `scripts/check-notify.ts`. Every rule in it is a rule
@@ -307,7 +311,7 @@ export class TurnWatcher {
307
311
  if (pendingKind) {
308
312
  this.armed.delete(state.sessionId);
309
313
  // Confirmed only if the new status held for a second step; a flap just drops the arm.
310
- const held = (pendingKind === 'done' && now === 'idle') || (pendingKind === 'error' && now === 'error');
314
+ const held = (pendingKind === 'done' && turnEnded(now)) || (pendingKind === 'error' && now === 'error');
311
315
  if (held && !(pendingKind === 'done' && this.selfScheduled(state))) {
312
316
  const asked = askedBy(state);
313
317
  if (pendingKind === 'done' && asked)
@@ -320,7 +324,7 @@ export class TurnWatcher {
320
324
  // contributes its status to the snapshot but is never itself news.
321
325
  if (before === undefined)
322
326
  continue;
323
- if (before === 'working' && now === 'idle')
327
+ if (before === 'working' && turnEnded(now))
324
328
  this.armed.set(state.sessionId, 'done');
325
329
  else if (before !== 'error' && now === 'error')
326
330
  this.armed.set(state.sessionId, 'error');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conductor-remote",
3
- "version": "1.53.1",
3
+ "version": "1.53.2",
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.",