conductor-remote 1.121.1 → 1.121.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
@@ -25,7 +25,7 @@
25
25
  <title>Conductor Remote</title>
26
26
  <!-- Runs before the module bundle so it can catch a stale shell that fails to boot. -->
27
27
  <script src="/self-heal.js"></script>
28
- <script type="module" crossorigin src="/assets/index-C2KQQeOE.js"></script>
28
+ <script type="module" crossorigin src="/assets/index-B5YGtmBf.js"></script>
29
29
  <link rel="stylesheet" crossorigin href="/assets/index-Brbciyfz.css">
30
30
  <link rel="manifest" href="/manifest.webmanifest"></head>
31
31
  <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 l=e||("document"in self?document.currentScript.src:"")||location.href;if(s[l])return;let o={};const a=e=>i(e,l),t={module:{uri:l},exports:o,require:a};s[l]=Promise.all(n.map(e=>t[e]||a(e))).then(e=>(r(...e),o))}}define(["./workbox-dcde9eb3"],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:"4e0b714c0ea53e85c167e6d8f5b767aa"},{url:"index.html",revision:"1de1a65404cb4daa91a29dbbd999700f"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/pierre-shiki-wasm-C8ETeZem.js",revision:null},{url:"assets/pierre-light-480U9XYS.js",revision:null},{url:"assets/pierre-dark-CyvmCCZW.js",revision:null},{url:"assets/index-C2KQQeOE.js",revision:null},{url:"assets/index-Brbciyfz.css",revision:null},{url:"assets/PierrePatch-BLTFNMTe.js",revision:null},{url:"apple-touch-icon.png",revision:"1127bb396b4648add53dce3f22c92aee"},{url:"icon-192.png",revision:"c5e01ac58768627e18ee7b8b6a9239ef"},{url:"icon-512.png",revision:"a40638c55e310312457a621c9a0002c8"},{url:"icon-maskable-512.png",revision:"a9b0d962686287452216492cd2247499"},{url:"icon.svg",revision:"c1aee186821798733dd477e69a0ef243"},{url:"manifest.webmanifest",revision:"cf88fbc5755108a7fe0616fa160a8a15"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("/index.html"),{denylist:[/^\/api\//]})),e.registerRoute(({url:e})=>e.pathname.startsWith("/assets/diff-syntax/"),new e.CacheFirst({cacheName:"diff-syntax",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:31536e3})]}),"GET")});
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 l=e||("document"in self?document.currentScript.src:"")||location.href;if(s[l])return;let o={};const a=e=>i(e,l),t={module:{uri:l},exports:o,require:a};s[l]=Promise.all(n.map(e=>t[e]||a(e))).then(e=>(r(...e),o))}}define(["./workbox-dcde9eb3"],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:"4e0b714c0ea53e85c167e6d8f5b767aa"},{url:"index.html",revision:"f195586ebfca009ff1ab65a425f95b14"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/pierre-shiki-wasm-C8ETeZem.js",revision:null},{url:"assets/pierre-light-480U9XYS.js",revision:null},{url:"assets/pierre-dark-CyvmCCZW.js",revision:null},{url:"assets/index-Brbciyfz.css",revision:null},{url:"assets/index-B5YGtmBf.js",revision:null},{url:"assets/PierrePatch-I9x7oqDg.js",revision:null},{url:"apple-touch-icon.png",revision:"1127bb396b4648add53dce3f22c92aee"},{url:"icon-192.png",revision:"c5e01ac58768627e18ee7b8b6a9239ef"},{url:"icon-512.png",revision:"a40638c55e310312457a621c9a0002c8"},{url:"icon-maskable-512.png",revision:"a9b0d962686287452216492cd2247499"},{url:"icon.svg",revision:"c1aee186821798733dd477e69a0ef243"},{url:"manifest.webmanifest",revision:"cf88fbc5755108a7fe0616fa160a8a15"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("/index.html"),{denylist:[/^\/api\//]})),e.registerRoute(({url:e})=>e.pathname.startsWith("/assets/diff-syntax/"),new e.CacheFirst({cacheName:"diff-syntax",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:31536e3})]}),"GET")});
@@ -97,35 +97,31 @@ on buttonsUnder(root, maxDepth)
97
97
  return acc
98
98
  end buttonsUnder
99
99
 
100
- on shallowButtonsNamed(root, maxDepth, wanted)
101
- -- Exact-name buttons at the first depth that contains one. Continue lives in
102
- -- Conductor's workspace action bar, while a chat transcript hangs much deeper
103
- -- off the same web area. Stopping at the shallowest hit both avoids walking a
104
- -- long transcript and keeps a similarly named control inside a message from
105
- -- impersonating the workspace action.
106
- set level to {root}
107
- set depth to 0
100
+ on childButtonsNamed(root, wanted)
101
+ -- Filter in one Apple event. Reading every button's name separately makes
102
+ -- even a shallow miss depend on the size of the surrounding UI.
108
103
  tell application "System Events" to tell process "Conductor"
109
- repeat while (count of level) > 0 and depth < maxDepth
110
- set found to {}
111
- set nextLevel to {}
112
- repeat with entry in level
113
- set node to contents of entry
114
- try
115
- repeat with candidate in (get UI elements of node whose role is "AXButton")
116
- set controlEl to contents of candidate
117
- if (my axName(controlEl)) is wanted then set end of found to controlEl
118
- end repeat
119
- set nextLevel to nextLevel & (get UI elements of node)
120
- end try
121
- end repeat
122
- if (count of found) > 0 then return found
123
- set level to nextLevel
124
- set depth to depth + 1
125
- end repeat
104
+ return get UI elements of root whose role is "AXButton" and name is wanted
126
105
  end tell
127
- return {}
128
- end shallowButtonsNamed
106
+ end childButtonsNamed
107
+
108
+ on workspaceActionButtons(pane, wanted)
109
+ -- The header and git action bar belong to the asserted workspace pane: their
110
+ -- buttons are direct children or inside one group. Never search the whole web
111
+ -- area or recurse into those groups. On a missing Continue, the old ten-level
112
+ -- sweep reached 584 unrelated nodes at depth four and hit the 28s run ceiling.
113
+ -- This also keeps a Continue inside a transcript, composer or modal out of the
114
+ -- candidate set. Keep every match at the shallowest level so ambiguity refuses.
115
+ set found to my childButtonsNamed(pane, wanted)
116
+ if (count of found) > 0 then return found
117
+ repeat with entry in (my axKids(pane))
118
+ set node to contents of entry
119
+ if (my axRole(node)) is "AXGroup" and (my axName(node)) is not "composer" then
120
+ set found to found & (my childButtonsNamed(node, wanted))
121
+ end if
122
+ end repeat
123
+ return found
124
+ end workspaceActionButtons
129
125
 
130
126
  on hasSiblingButtonNamed(controlEl, wanted)
131
127
  -- The live merged action is the pair Continue + Archive. Requiring that pair
@@ -147,11 +143,22 @@ on continueWorkspaceOnNewBranch()
147
143
  -- state that cannot be reproduced safely from the relay: it checks out a fresh
148
144
  -- branch at the PR's target, updates the workspace row, keeps every chat, and
149
145
  -- stages Branch continued.md in the selected chat. The relay never writes the
150
- -- database; server.ts watches `workspaces.branch` for the receipt.
146
+ -- database; the HTTP route watches `workspaces.branch` for the receipt.
151
147
  set strips to my tabGroups()
152
148
  if (count of strips) is 0 then error "couldn't find the chat pane to continue from"
153
- my assertWorkspace(item 1 of strips)
154
- set found to my shallowButtonsNamed(my webArea(), 10, "Continue")
149
+ set strip to item 1 of strips
150
+ set found to {}
151
+ -- Focusing a workspace starts its asynchronous PR refresh. Give the native
152
+ -- action time to appear, using only the bounded pane read on each attempt.
153
+ repeat with attempt from 1 to 8
154
+ my assertWorkspace(strip)
155
+ tell application "System Events" to tell process "Conductor"
156
+ set pane to value of attribute "AXParent" of strip
157
+ end tell
158
+ set found to my workspaceActionButtons(pane, "Continue")
159
+ if (count of found) > 0 then exit repeat
160
+ if attempt < 8 then delay 0.25
161
+ end repeat
155
162
  if (count of found) is 0 then error "Conductor isn't offering Continue for this workspace - it appears after its pull request is merged and refreshed"
156
163
  if (count of found) > 1 then error "more than one Continue button is visible - close any dialog and try again"
157
164
  set continueEl to item 1 of found
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "conductor-remote",
3
- "version": "1.121.1",
3
+ "version": "1.121.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.",