conductor-remote 1.30.3 → 1.30.4

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-B2SjHT-B.js"></script>
16
+ <script type="module" crossorigin src="/assets/index-7eBQvvzX.js"></script>
17
17
  <link rel="stylesheet" crossorigin href="/assets/index-8aCnDSQJ.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:"32efee3d01d4dec7873e83faf76854ca"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/index-B2SjHT-B.js",revision:null},{url:"assets/index-8aCnDSQJ.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,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 t=e=>n(e,o),c={module:{uri:o},exports:l,require:t};i[o]=Promise.all(s.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:"311f27093150abe5a46280667c0069e9"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/index-8aCnDSQJ.css",revision:null},{url:"assets/index-7eBQvvzX.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\//]}))});
@@ -52,9 +52,33 @@ export class Reads {
52
52
  this.db = db;
53
53
  this.workspacesRoot = workspacesRoot;
54
54
  }
55
+ /**
56
+ * Unread chats, grouped by workspace. `workspaces.unread` is a **dead column** —
57
+ * Conductor still declares it (and its migration still says "when 1, the workspace
58
+ * should be marked visually as unread") but writes 0 on every row: 0 of 1691 are
59
+ * non-zero on this Mac, which is why the sidebar's bold/badge never once fired.
60
+ * The live flag is per session, and it *is* a flag — `unread_count` is only ever
61
+ * 0 or 1 — so what's worth counting is how many chats have news, not the column.
62
+ */
63
+ unreadSessions() {
64
+ const rows = this.db.query(`SELECT workspace_id, id, updated_at
65
+ FROM sessions
66
+ WHERE COALESCE(unread_count, 0) > 0 AND COALESCE(is_hidden, 0) = 0`);
67
+ const byWorkspace = new Map();
68
+ for (const r of rows) {
69
+ if (!r.workspace_id)
70
+ continue;
71
+ const list = byWorkspace.get(r.workspace_id);
72
+ if (list)
73
+ list.push({ id: r.id, at: r.updated_at });
74
+ else
75
+ byWorkspace.set(r.workspace_id, [{ id: r.id, at: r.updated_at }]);
76
+ }
77
+ return byWorkspace;
78
+ }
55
79
  listWorkspaces() {
56
80
  const rows = this.db.query(`SELECT w.id, w.directory_name, w.workspace_name, w.branch, w.pr_title, w.derived_status, w.manual_status,
57
- w.state, w.created_at, w.updated_at, w.unread, w.pinned_at, w.active_session_id, w.intended_target_branch,
81
+ w.state, w.created_at, w.updated_at, w.pinned_at, w.active_session_id, w.intended_target_branch,
58
82
  r.name AS repo_name, r.root_path AS repo_root, r.icon AS repo_icon,
59
83
  r.remote_url AS remote_url, r.default_branch AS default_branch,
60
84
  s.status AS session_status, s.title AS session_title, s.model AS model,
@@ -64,8 +88,10 @@ export class Reads {
64
88
  LEFT JOIN sessions s ON s.id = w.active_session_id
65
89
  WHERE w.state IN ('ready', 'setting_up')
66
90
  ORDER BY (w.pinned_at IS NULL), w.updated_at DESC`);
91
+ const unread = this.unreadSessions();
67
92
  return rows.map(r => ({
68
93
  ...r,
94
+ unread_sessions: unread.get(r.id) ?? [],
69
95
  worktree: resolveWorktree(this.workspacesRoot, r.repo_name, r.directory_name, r.branch, r.repo_root),
70
96
  baseBranch: r.intended_target_branch || r.default_branch || 'main',
71
97
  icon: describeRepoIcon({ icon: r.repo_icon, repoRoot: r.repo_root, remoteUrl: r.remote_url })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conductor-remote",
3
- "version": "1.30.3",
3
+ "version": "1.30.4",
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.",