conductor-remote 1.78.0 → 1.78.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-dOiHAzne.js"></script>
|
|
17
17
|
<link rel="stylesheet" crossorigin href="/assets/index-BoeZwP2N.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 c={};const l=e=>i(e,o),t={module:{uri:o},exports:c,require:l};s[o]=Promise.all(n.map(e=>t[e]||l(e))).then(e=>(r(...e),c))}}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:"e7ef44deca46c0539e6ff7bba5eb815e"},{url:"index.html",revision:"
|
|
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 c={};const l=e=>i(e,o),t={module:{uri:o},exports:c,require:l};s[o]=Promise.all(n.map(e=>t[e]||l(e))).then(e=>(r(...e),c))}}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:"e7ef44deca46c0539e6ff7bba5eb815e"},{url:"index.html",revision:"bc2a0334dcf9d3a15034a75c866b2e57"},{url:"assets/workbox-window.prod.es5-BBnX5xw4.js",revision:null},{url:"assets/index-dOiHAzne.js",revision:null},{url:"assets/index-BoeZwP2N.css",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\//]}))});
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
*/
|
|
27
27
|
import { execFile } from 'node:child_process';
|
|
28
28
|
import { promisify } from 'node:util';
|
|
29
|
+
import { timestampMs } from "./shared.js";
|
|
29
30
|
const exec = promisify(execFile);
|
|
30
31
|
const str = (v) => (typeof v === 'string' && v.trim() ? v.trim() : undefined);
|
|
31
32
|
/**
|
|
@@ -55,7 +56,7 @@ export function openBackgroundTasks(rows, processStartedAt) {
|
|
|
55
56
|
open.delete(taskId);
|
|
56
57
|
}
|
|
57
58
|
else if (frame.subtype === 'task_started') {
|
|
58
|
-
if (
|
|
59
|
+
if (timestampMs(row.created_at) < processStartedAt)
|
|
59
60
|
continue;
|
|
60
61
|
const taskType = str(frame.task_type) ?? 'task';
|
|
61
62
|
open.set(taskId, {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
*/
|
|
28
28
|
import { chatCursor, parseChatCursor } from "./chat-cursor.js";
|
|
29
29
|
import { routes } from "./routes.js";
|
|
30
|
-
import { HIT_CLOSE, HIT_OPEN, isToolResult, workspaceTitle } from "./shared.js";
|
|
30
|
+
import { HIT_CLOSE, HIT_OPEN, isToolResult, timestampMs, workspaceTitle } from "./shared.js";
|
|
31
31
|
/** Versions we know how to speak. The client's choice wins when we know it. */
|
|
32
32
|
export const PROTOCOL_VERSIONS = ['2025-06-18', '2025-03-26', '2024-11-05'];
|
|
33
33
|
export const SERVER_INFO = { name: 'conductor-remote', version: '1' };
|
|
@@ -325,7 +325,7 @@ export function createTools(call) {
|
|
|
325
325
|
// A chat waiting on a background task reads `idle` in `status` and will resume
|
|
326
326
|
// itself; an agent that reads only the status would call it done and send a
|
|
327
327
|
// second prompt into the wait.
|
|
328
|
-
const waiting = (s.background_tasks ?? []).map(t => `\n waiting for task: ${t.description} (${Math.max(0, Math.round((Date.now() -
|
|
328
|
+
const waiting = (s.background_tasks ?? []).map(t => `\n waiting for task: ${t.description} (${Math.max(0, Math.round((Date.now() - timestampMs(t.since)) / 60_000))}m so far)`);
|
|
329
329
|
const glyph = s.status === 'working' ? '▶' : waiting.length ? '⧗' : '·';
|
|
330
330
|
return `${glyph} ${s.title ?? '(untitled)'} — ${s.status ?? '?'} · ${s.model ?? '?'}${ctx}\n session_id: ${s.id}${waiting.join('')}`;
|
|
331
331
|
})
|
package/dist-node/src/shared.js
CHANGED
|
@@ -50,6 +50,19 @@ export function workspaceTitle(w) {
|
|
|
50
50
|
export function queryTokens(raw) {
|
|
51
51
|
return raw.toLowerCase().match(/[\p{L}\p{N}_]+/gu) ?? [];
|
|
52
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse one of Conductor's timestamps as an epoch.
|
|
55
|
+
*
|
|
56
|
+
* Its SQLite defaults/triggers use `datetime('now')`, which is UTC but serializes as
|
|
57
|
+
* `YYYY-MM-DD HH:MM:SS` with no zone. Other writers use ISO strings ending in `Z`.
|
|
58
|
+
* Browsers interpret the bare SQLite form as local time, making a fresh chat look two
|
|
59
|
+
* hours old in Oslo during summer. Add the zone only to that exact database shape;
|
|
60
|
+
* explicitly zoned ISO values and local wall-clock strings keep their native meaning.
|
|
61
|
+
*/
|
|
62
|
+
export function timestampMs(value) {
|
|
63
|
+
const sqliteUtc = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}(?:\.\d+)?$/.test(value);
|
|
64
|
+
return Date.parse(sqliteUtc ? `${value.replace(' ', 'T')}Z` : value);
|
|
65
|
+
}
|
|
53
66
|
/**
|
|
54
67
|
* A temporary `NEW` marker in Conductor's picker is a badge, not part of the
|
|
55
68
|
* model name. The relay and phone use this value for the visible label and for
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "conductor-remote",
|
|
3
|
-
"version": "1.78.
|
|
3
|
+
"version": "1.78.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.",
|