instar 1.3.1607 → 1.3.1609
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/dashboard/console/console.js +10 -1
- package/dashboard/console/home-model.js +18 -1
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +4 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/core/resolveMeshPeerUrl.d.ts +7 -0
- package/dist/core/resolveMeshPeerUrl.d.ts.map +1 -1
- package/dist/core/resolveMeshPeerUrl.js +23 -13
- package/dist/core/resolveMeshPeerUrl.js.map +1 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/native/instar-desktop-host +0 -0
- package/dist/server/AgentServer.d.ts +5 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +20 -11
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/DesktopMeshBroker.d.ts +8 -0
- package/dist/server/DesktopMeshBroker.d.ts.map +1 -1
- package/dist/server/DesktopMeshBroker.js +27 -17
- package/dist/server/DesktopMeshBroker.js.map +1 -1
- package/dist/server/desktopPeerRopeFetch.d.ts +56 -0
- package/dist/server/desktopPeerRopeFetch.d.ts.map +1 -0
- package/dist/server/desktopPeerRopeFetch.js +141 -0
- package/dist/server/desktopPeerRopeFetch.js.map +1 -0
- package/dist/server/poolPeerFetch.d.ts +1 -1
- package/dist/server/poolPeerFetch.d.ts.map +1 -1
- package/dist/server/poolPeerFetch.js +2 -2
- package/dist/server/poolPeerFetch.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +3 -3
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/upgrades/1.3.1608.md +23 -0
- package/upgrades/1.3.1609.md +20 -0
- package/upgrades/side-effects/console-needs-you-links.eli16.md +7 -0
- package/upgrades/side-effects/console-needs-you-links.md +33 -0
- package/upgrades/side-effects/desktop-peer-rope-fallback.eli16.md +30 -0
- package/upgrades/side-effects/desktop-peer-rope-fallback.md +79 -0
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import type { PeerEndpointKind } from './peerUrlGuard.js';
|
|
2
2
|
import type { RopeResultRecorder } from './poolPeerFetch.js';
|
|
3
|
+
import { type DesktopRope } from './desktopPeerRopeFetch.js';
|
|
3
4
|
interface DesktopPeer {
|
|
4
5
|
machineId: string;
|
|
5
6
|
url: string;
|
|
6
7
|
kind: PeerEndpointKind;
|
|
8
|
+
ropes?: DesktopRope[];
|
|
9
|
+
ropeRefusals?: Array<{
|
|
10
|
+
url: string;
|
|
11
|
+
kind: PeerEndpointKind;
|
|
12
|
+
}>;
|
|
7
13
|
}
|
|
8
14
|
export interface DesktopMeshBrokerDeps {
|
|
9
15
|
selfMachineId: string;
|
|
@@ -13,6 +19,8 @@ export interface DesktopMeshBrokerDeps {
|
|
|
13
19
|
now?: () => number;
|
|
14
20
|
fetch?: typeof fetch;
|
|
15
21
|
recordRopeResult?: RopeResultRecorder;
|
|
22
|
+
/** Test seam for the per-rope TCP reachability check (defaults to a real connect). */
|
|
23
|
+
ropeConnectCheck?: (url: string, timeoutMs: number) => Promise<boolean>;
|
|
16
24
|
onForget?: (requestId: string) => void;
|
|
17
25
|
/** A new front process waits out target delegated-session liveness from a
|
|
18
26
|
* previous incarnation before admitting fresh pool reservations. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DesktopMeshBroker.d.ts","sourceRoot":"","sources":["../../src/server/DesktopMeshBroker.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"DesktopMeshBroker.d.ts","sourceRoot":"","sources":["../../src/server/DesktopMeshBroker.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,9 @@ import { createHash, timingSafeEqual } from 'node:crypto';
|
|
|
2
2
|
import { mintDesktopLockedAssertion, mintDesktopOperatorAssertion } from '../core/DesktopOperatorAssertion.js';
|
|
3
3
|
import { sign as signMachinePayload } from '../core/MachineIdentity.js';
|
|
4
4
|
import { signRequest } from './machineAuth.js';
|
|
5
|
-
import {
|
|
5
|
+
import { desktopPeerRopes, fetchDesktopPeerOverRopes } from './desktopPeerRopeFetch.js';
|
|
6
|
+
/** Which rope answered a post — read only for the stream-relay ticket. */
|
|
7
|
+
const ANSWERED_URL = Symbol('desktop-answered-url');
|
|
6
8
|
/** Dashboard front for remote desktop. It handles routing and PIN-session
|
|
7
9
|
* attestation, while the target alone mints grants and encrypts the stream. */
|
|
8
10
|
export class DesktopMeshBroker {
|
|
@@ -112,7 +114,10 @@ export class DesktopMeshBroker {
|
|
|
112
114
|
|| result.ticket.length < 16 || result.ticket.length > 256) {
|
|
113
115
|
throw new Error('desktop target ticket invalid');
|
|
114
116
|
}
|
|
115
|
-
|
|
117
|
+
// The relay connects to the rope that actually answered, not the first one listed.
|
|
118
|
+
const answered = result[ANSWERED_URL];
|
|
119
|
+
const answeredUrl = typeof answered === 'string' ? answered : peer.url;
|
|
120
|
+
this.tickets.set(result.ticket, { requestId, url: answeredUrl, expiresAtMs: this.now() + 20_000 });
|
|
116
121
|
}
|
|
117
122
|
if (operation === 'status' && result.status === 'revoked')
|
|
118
123
|
this.forget(requestId);
|
|
@@ -212,28 +217,30 @@ export class DesktopMeshBroker {
|
|
|
212
217
|
}
|
|
213
218
|
async peer(machineId) {
|
|
214
219
|
const peer = this.d.peers().find(candidate => candidate.machineId === machineId);
|
|
215
|
-
if (!peer
|
|
220
|
+
if (!peer)
|
|
216
221
|
throw new Error('desktop target unavailable');
|
|
217
|
-
}
|
|
218
222
|
return peer;
|
|
219
223
|
}
|
|
220
224
|
async post(peer, endpoint, body, signal) {
|
|
221
|
-
|
|
225
|
+
// Every rope in order, signed once: a rope is skipped only when the request
|
|
226
|
+
// provably never reached a server; any HTTP reply is the target's answer.
|
|
222
227
|
let response;
|
|
228
|
+
let rope;
|
|
223
229
|
try {
|
|
224
|
-
response = await
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
230
|
+
({ response, rope } = await fetchDesktopPeerOverRopes({
|
|
231
|
+
machineId: peer.machineId, ropes: desktopPeerRopes(peer), path: endpoint,
|
|
232
|
+
init: {
|
|
233
|
+
method: 'POST', headers: { 'Content-Type': 'application/json',
|
|
234
|
+
...signRequest(this.d.selfMachineId, this.d.signingKeyPem, body) },
|
|
235
|
+
body: JSON.stringify(body), redirect: 'manual',
|
|
236
|
+
},
|
|
237
|
+
budgetMs: 3_000, connectCheckCapMs: 1_000, signal, record: this.d.recordRopeResult,
|
|
238
|
+
fetchImpl: this.doFetch, now: this.now, connectCheck: this.d.ropeConnectCheck,
|
|
239
|
+
}));
|
|
233
240
|
}
|
|
234
241
|
catch (error) {
|
|
235
|
-
if (
|
|
236
|
-
|
|
242
|
+
if (error instanceof Error && error.message === 'desktop-peer-unreachable') {
|
|
243
|
+
throw new Error('desktop target unavailable');
|
|
237
244
|
}
|
|
238
245
|
throw error;
|
|
239
246
|
}
|
|
@@ -263,7 +270,10 @@ export class DesktopMeshBroker {
|
|
|
263
270
|
const parsed = JSON.parse(raw);
|
|
264
271
|
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
|
|
265
272
|
throw new Error('desktop target response invalid');
|
|
266
|
-
|
|
273
|
+
const reply = parsed;
|
|
274
|
+
// Non-enumerable, so it never leaks into a caller's JSON reply.
|
|
275
|
+
Object.defineProperty(reply, ANSWERED_URL, { value: rope.url, enumerable: false });
|
|
276
|
+
return reply;
|
|
267
277
|
}
|
|
268
278
|
digest(value) { return createHash('sha256').update(value).digest('hex'); }
|
|
269
279
|
equalDigest(left, right) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DesktopMeshBroker.js","sourceRoot":"","sources":["../../src/server/DesktopMeshBroker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DesktopMeshBroker.js","sourceRoot":"","sources":["../../src/server/DesktopMeshBroker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { PeerEndpointKind } from './peerUrlGuard.js';
|
|
2
|
+
import { type RopeResultRecorder } from './poolPeerFetch.js';
|
|
3
|
+
export interface DesktopRope {
|
|
4
|
+
url: string;
|
|
5
|
+
kind: PeerEndpointKind;
|
|
6
|
+
}
|
|
7
|
+
/** The shape `resolvePeerUrls()` returns: the selected rope, the ropes the
|
|
8
|
+
* credential guard skipped ahead of it, and (when wired) every rope in order. */
|
|
9
|
+
export interface DesktopPeerEntry extends DesktopRope {
|
|
10
|
+
machineId: string;
|
|
11
|
+
ropes?: DesktopRope[];
|
|
12
|
+
ropeRefusals?: Array<{
|
|
13
|
+
url: string;
|
|
14
|
+
kind: PeerEndpointKind;
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
/** Every rope for this peer, in priority order, de-duplicated by URL. With no
|
|
18
|
+
* full list wired, the refused ropes come first: the resolver ranked them
|
|
19
|
+
* above the selection. */
|
|
20
|
+
export declare function desktopPeerRopes(peer: DesktopPeerEntry): DesktopRope[];
|
|
21
|
+
/** True only for failures that prove the request never left this machine. */
|
|
22
|
+
export declare function isConnectClassFailure(error: unknown): boolean;
|
|
23
|
+
/** Can a TCP connection to this rope's host and port be opened in time? */
|
|
24
|
+
export declare function tcpConnectCheck(url: string, timeoutMs: number): Promise<boolean>;
|
|
25
|
+
export interface DesktopRopeFetchOptions {
|
|
26
|
+
machineId: string;
|
|
27
|
+
ropes: DesktopRope[];
|
|
28
|
+
path: string;
|
|
29
|
+
/** Request init without `signal`; the helper supplies the time budget. */
|
|
30
|
+
init: Omit<RequestInit, 'signal'>;
|
|
31
|
+
/** Total time for the whole call, every rope and check included. */
|
|
32
|
+
budgetMs: number;
|
|
33
|
+
/** Longest a connect check may take before the next rope is tried. */
|
|
34
|
+
connectCheckCapMs: number;
|
|
35
|
+
/** Caller cancellation (e.g. a desktop Stop). */
|
|
36
|
+
signal?: AbortSignal;
|
|
37
|
+
record?: RopeResultRecorder;
|
|
38
|
+
fetchImpl?: typeof fetch;
|
|
39
|
+
allowed?: (rope: DesktopRope) => Promise<boolean>;
|
|
40
|
+
connectCheck?: (url: string, timeoutMs: number) => Promise<boolean>;
|
|
41
|
+
now?: () => number;
|
|
42
|
+
}
|
|
43
|
+
export declare class DesktopPeerUnreachableError extends Error {
|
|
44
|
+
constructor();
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Send one desktop request to a peer over the first rope that carries it.
|
|
48
|
+
* Returns the response and the rope that answered. Throws
|
|
49
|
+
* `DesktopPeerUnreachableError` when no rope is admissible or none could be
|
|
50
|
+
* reached, and rethrows an ambiguous failure from the rope that was in use.
|
|
51
|
+
*/
|
|
52
|
+
export declare function fetchDesktopPeerOverRopes(o: DesktopRopeFetchOptions): Promise<{
|
|
53
|
+
response: Response;
|
|
54
|
+
rope: DesktopRope;
|
|
55
|
+
}>;
|
|
56
|
+
//# sourceMappingURL=desktopPeerRopeFetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktopPeerRopeFetch.d.ts","sourceRoot":"","sources":["../../src/server/desktopPeerRopeFetch.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE5E,MAAM,WAAW,WAAW;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,gBAAgB,CAAA;CAAE;AAEpE;kFACkF;AAClF,MAAM,WAAW,gBAAiB,SAAQ,WAAW;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,WAAW,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC,CAAC;CAC/D;AAED;;2BAE2B;AAC3B,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,gBAAgB,GAAG,WAAW,EAAE,CAYtE;AAOD,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAQ7D;AAED,2EAA2E;AAC3E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAsBhF;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAClC,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,iBAAiB,EAAE,MAAM,CAAC;IAC1B,iDAAiD;IACjD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACpE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,cAA+F;CAChG;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAAC,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,CAqC9H"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* desktopPeerRopeFetch — remote-desktop calls to a peer machine try EVERY rope
|
|
3
|
+
* that peer advertises, in the resolver's order, instead of only the first.
|
|
4
|
+
*
|
|
5
|
+
* Why this exists. `resolvePeerUrls()` hands each fan-out site ONE selection per
|
|
6
|
+
* machine: the best rope the ordinary credential guard admits. The desktop gate
|
|
7
|
+
* (`desktopPeerUrlAllowed`) admits one more rope than that guard — plain-http
|
|
8
|
+
* Tailscale proven by the local daemon — so for a machine whose Tailscale rope is
|
|
9
|
+
* the only live one (a Windows PC under WSL, whose `lan` rope is the WSL-internal
|
|
10
|
+
* NAT address and whose quick tunnel went stale), the selection the desktop code
|
|
11
|
+
* received was the dead LAN rope, the call failed, and the guided setup reported
|
|
12
|
+
* "Can't reach" a machine that answered fine over Tailscale (2026-11-02).
|
|
13
|
+
*
|
|
14
|
+
* Retry rule. A rope is abandoned for the next one ONLY when the request provably
|
|
15
|
+
* never reached a server: a short TCP connect check failed before the request was
|
|
16
|
+
* sent, or the request itself failed with a connect-class error (refused, no route,
|
|
17
|
+
* DNS failure, connect timeout). Any HTTP reply — whatever its status — is
|
|
18
|
+
* authoritative and returned as-is, and an ambiguous failure (an abort or timeout
|
|
19
|
+
* after the connection opened, a reset mid-request) is rethrown without trying
|
|
20
|
+
* another rope: these requests are signed and some of them act on the target.
|
|
21
|
+
*
|
|
22
|
+
* The connect check runs only when an admissible rope remains after the current
|
|
23
|
+
* one, so a single-rope peer behaves exactly as before. The whole call, including
|
|
24
|
+
* the checks, stays inside the caller's time budget.
|
|
25
|
+
*/
|
|
26
|
+
import { connect } from 'node:net';
|
|
27
|
+
import { desktopPeerUrlAllowed } from './DesktopPeerUrlGate.js';
|
|
28
|
+
import { poolPeerFetch } from './poolPeerFetch.js';
|
|
29
|
+
/** Every rope for this peer, in priority order, de-duplicated by URL. With no
|
|
30
|
+
* full list wired, the refused ropes come first: the resolver ranked them
|
|
31
|
+
* above the selection. */
|
|
32
|
+
export function desktopPeerRopes(peer) {
|
|
33
|
+
const ordered = peer.ropes && peer.ropes.length > 0
|
|
34
|
+
? peer.ropes
|
|
35
|
+
: [...(peer.ropeRefusals ?? []), { url: peer.url, kind: peer.kind }];
|
|
36
|
+
const seen = new Set();
|
|
37
|
+
const out = [];
|
|
38
|
+
for (const rope of ordered) {
|
|
39
|
+
if (!rope || typeof rope.url !== 'string' || seen.has(rope.url))
|
|
40
|
+
continue;
|
|
41
|
+
seen.add(rope.url);
|
|
42
|
+
out.push({ url: rope.url, kind: rope.kind });
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
const CONNECT_CLASS_CODES = new Set([
|
|
47
|
+
'ECONNREFUSED', 'EHOSTUNREACH', 'ENETUNREACH', 'ENOTFOUND', 'EAI_AGAIN', 'EADDRNOTAVAIL',
|
|
48
|
+
'UND_ERR_CONNECT_TIMEOUT',
|
|
49
|
+
]);
|
|
50
|
+
/** True only for failures that prove the request never left this machine. */
|
|
51
|
+
export function isConnectClassFailure(error) {
|
|
52
|
+
let current = error;
|
|
53
|
+
for (let depth = 0; depth < 4 && current && typeof current === 'object'; depth++) {
|
|
54
|
+
const code = current.code;
|
|
55
|
+
if (typeof code === 'string' && CONNECT_CLASS_CODES.has(code))
|
|
56
|
+
return true;
|
|
57
|
+
current = current.cause;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
/** Can a TCP connection to this rope's host and port be opened in time? */
|
|
62
|
+
export function tcpConnectCheck(url, timeoutMs) {
|
|
63
|
+
let parsed;
|
|
64
|
+
try {
|
|
65
|
+
parsed = new URL(url);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
// @silent-fallback-ok — a malformed rope URL is treated as unreachable; the gate refuses it anyway.
|
|
69
|
+
return Promise.resolve(false);
|
|
70
|
+
}
|
|
71
|
+
const port = Number(parsed.port || (parsed.protocol === 'https:' ? 443 : 80));
|
|
72
|
+
const host = parsed.hostname.replace(/^\[|\]$/g, '');
|
|
73
|
+
return new Promise(resolve => {
|
|
74
|
+
let settled = false;
|
|
75
|
+
const socket = connect({ host, port });
|
|
76
|
+
const done = (ok) => {
|
|
77
|
+
if (settled)
|
|
78
|
+
return;
|
|
79
|
+
settled = true;
|
|
80
|
+
clearTimeout(timer);
|
|
81
|
+
socket.destroy();
|
|
82
|
+
resolve(ok);
|
|
83
|
+
};
|
|
84
|
+
const timer = setTimeout(() => done(false), Math.max(1, timeoutMs));
|
|
85
|
+
socket.once('connect', () => done(true));
|
|
86
|
+
socket.once('error', () => done(false));
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
export class DesktopPeerUnreachableError extends Error {
|
|
90
|
+
constructor() { super('desktop-peer-unreachable'); this.name = 'DesktopPeerUnreachableError'; }
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Send one desktop request to a peer over the first rope that carries it.
|
|
94
|
+
* Returns the response and the rope that answered. Throws
|
|
95
|
+
* `DesktopPeerUnreachableError` when no rope is admissible or none could be
|
|
96
|
+
* reached, and rethrows an ambiguous failure from the rope that was in use.
|
|
97
|
+
*/
|
|
98
|
+
export async function fetchDesktopPeerOverRopes(o) {
|
|
99
|
+
const now = o.now ?? Date.now;
|
|
100
|
+
const deadline = now() + o.budgetMs;
|
|
101
|
+
const allowed = o.allowed ?? desktopPeerUrlAllowed;
|
|
102
|
+
const check = o.connectCheck ?? tcpConnectCheck;
|
|
103
|
+
const admissible = [];
|
|
104
|
+
for (const rope of o.ropes) {
|
|
105
|
+
if (now() >= deadline)
|
|
106
|
+
break;
|
|
107
|
+
if (await allowed(rope))
|
|
108
|
+
admissible.push(rope);
|
|
109
|
+
}
|
|
110
|
+
for (let index = 0; index < admissible.length; index++) {
|
|
111
|
+
const rope = admissible[index];
|
|
112
|
+
const remaining = deadline - now();
|
|
113
|
+
if (remaining <= 0)
|
|
114
|
+
break;
|
|
115
|
+
const hasNext = index < admissible.length - 1;
|
|
116
|
+
if (hasNext) {
|
|
117
|
+
const started = now();
|
|
118
|
+
const reachable = await check(rope.url, Math.min(o.connectCheckCapMs, remaining));
|
|
119
|
+
if (!reachable) {
|
|
120
|
+
if (rope.kind !== 'last-known-url')
|
|
121
|
+
o.record?.(o.machineId, rope.kind, false, now() - started, rope.url);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const left = deadline - now();
|
|
126
|
+
if (left <= 0)
|
|
127
|
+
break;
|
|
128
|
+
const timeout = AbortSignal.timeout(left);
|
|
129
|
+
try {
|
|
130
|
+
const response = await poolPeerFetch(o.record, { machineId: o.machineId, url: rope.url.replace(/\/+$/, ''), kind: rope.kind }, o.path, { ...o.init, signal: o.signal ? AbortSignal.any([o.signal, timeout]) : timeout }, o.fetchImpl);
|
|
131
|
+
return { response, rope };
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
if (hasNext && !o.signal?.aborted && isConnectClassFailure(error))
|
|
135
|
+
continue;
|
|
136
|
+
throw error;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
throw new DesktopPeerUnreachableError();
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=desktopPeerRopeFetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"desktopPeerRopeFetch.js","sourceRoot":"","sources":["../../src/server/desktopPeerRopeFetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -48,5 +48,5 @@ export interface PoolPeerTarget {
|
|
|
48
48
|
* `isPeerUrlAllowedForCredentials` before dialling, because refusing to send a
|
|
49
49
|
* credential is a separate question from whether the wire works.
|
|
50
50
|
*/
|
|
51
|
-
export declare function poolPeerFetch(record: RopeResultRecorder | undefined, peer: PoolPeerTarget, path: string, init?: Parameters<typeof fetch>[1]): Promise<Response>;
|
|
51
|
+
export declare function poolPeerFetch(record: RopeResultRecorder | undefined, peer: PoolPeerTarget, path: string, init?: Parameters<typeof fetch>[1], fetchImpl?: typeof fetch): Promise<Response>;
|
|
52
52
|
//# sourceMappingURL=poolPeerFetch.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poolPeerFetch.d.ts","sourceRoot":"","sources":["../../src/server/poolPeerFetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;kDACkD;AAClD,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,KAAK,GAAG,YAAY,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzF;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAMD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"poolPeerFetch.d.ts","sourceRoot":"","sources":["../../src/server/poolPeerFetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;kDACkD;AAClD,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,KAAK,GAAG,YAAY,CAAC;AAE1D,MAAM,WAAW,kBAAkB;IACjC,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzF;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAMD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,kBAAkB,GAAG,SAAS,EACtC,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAClC,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,QAAQ,CAAC,CAWnB"}
|
|
@@ -39,11 +39,11 @@ function ropeKindOf(kind) {
|
|
|
39
39
|
* `isPeerUrlAllowedForCredentials` before dialling, because refusing to send a
|
|
40
40
|
* credential is a separate question from whether the wire works.
|
|
41
41
|
*/
|
|
42
|
-
export async function poolPeerFetch(record, peer, path, init) {
|
|
42
|
+
export async function poolPeerFetch(record, peer, path, init, fetchImpl = fetch) {
|
|
43
43
|
const rope = ropeKindOf(peer.kind);
|
|
44
44
|
const started = Date.now();
|
|
45
45
|
try {
|
|
46
|
-
const res = await
|
|
46
|
+
const res = await fetchImpl(`${peer.url}${path}`, init);
|
|
47
47
|
if (rope && record)
|
|
48
48
|
record(peer.machineId, rope, true, Date.now() - started, peer.url);
|
|
49
49
|
return res;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poolPeerFetch.js","sourceRoot":"","sources":["../../src/server/poolPeerFetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAiBH,SAAS,UAAU,CAAC,IAA+B;IACjD,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACvF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAsC,EACtC,IAAoB,EACpB,IAAY,EACZ,IAAkC;
|
|
1
|
+
{"version":3,"file":"poolPeerFetch.js","sourceRoot":"","sources":["../../src/server/poolPeerFetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAiBH,SAAS,UAAU,CAAC,IAA+B;IACjD,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACvF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAsC,EACtC,IAAoB,EACpB,IAAY,EACZ,IAAkC,EAClC,SAAS,GAAiB,KAAK;IAE/B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,IAAI,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACvF,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,IAAI,IAAI,MAAM;YAAE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACxF,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "./builtin-manifest.schema.json",
|
|
3
3
|
"schemaVersion": 1,
|
|
4
|
-
"generatedAt": "2026-11-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-11-02T20:33:29.976Z",
|
|
5
|
+
"instarVersion": "1.3.1609",
|
|
6
6
|
"entryCount": 206,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -1563,7 +1563,7 @@
|
|
|
1563
1563
|
"type": "subsystem",
|
|
1564
1564
|
"domain": "server",
|
|
1565
1565
|
"sourcePath": "src/server/AgentServer.ts",
|
|
1566
|
-
"contentHash": "
|
|
1566
|
+
"contentHash": "550d714dccc200c1d11f1badbea09b715c9f717e99a690fc2e32cf09e39c8981",
|
|
1567
1567
|
"since": "2025-01-01"
|
|
1568
1568
|
},
|
|
1569
1569
|
"subsystem:session-manager": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"generatedFrom": "source-tree",
|
|
4
4
|
"registrySha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
|
|
5
|
-
"packageVersion": "1.3.
|
|
5
|
+
"packageVersion": "1.3.1609",
|
|
6
6
|
"guards": [
|
|
7
7
|
{
|
|
8
8
|
"ref": "docs/audits/phase-b/f10-triage.md",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"sha256": "
|
|
2
|
+
"sha256": "ccaa1ee5b44efb04fe258136a20c35325729fa9683990dc4015d33d480a8b715",
|
|
3
3
|
"registrySha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
|
|
4
|
-
"packageVersion": "1.3.
|
|
4
|
+
"packageVersion": "1.3.1609"
|
|
5
5
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
- Remote Desktop peer calls (the guided setup's per-machine check, the readiness probe, and the remote-desktop session requests from the dashboard front) now try every rope the target machine advertises, in priority order, instead of only the single rope the shared selection picked. A rope the desktop gate refuses is skipped; a rope that cannot be connected to is skipped; any HTTP reply is final, and a request that may already have reached the target is never resent. Total time budgets are unchanged (8 s setup, 3 s probe and session calls).
|
|
9
|
+
- Before this, a machine whose preferred admissible rope was dead (for example a Windows machine under WSL advertising its WSL-internal network address) showed as "Can't reach" in setup even when it answered over Tailscale.
|
|
10
|
+
- `resolvePeerUrls()` entries carry an optional `ropes` list (every candidate rope in order) for this purpose.
|
|
11
|
+
|
|
12
|
+
## What to Tell Your User
|
|
13
|
+
|
|
14
|
+
If Remote Desktop setup said it couldn't reach one of your machines even though that machine was online, it should now find it. Nothing else changes.
|
|
15
|
+
|
|
16
|
+
## Summary of New Capabilities
|
|
17
|
+
|
|
18
|
+
None. This is a bug fix.
|
|
19
|
+
|
|
20
|
+
## Evidence
|
|
21
|
+
|
|
22
|
+
- Unit tests: first rope dead → second rope used; HTTP error on first rope → no retry; ambiguous timeout → no retry; every rope dead → unreachable; single-rope peers unchanged; the session stream is relayed to the rope that answered.
|
|
23
|
+
- Live symptom (2026-11-02, Studio): Mama PC's tailscale rope answered 200 while its lan (WSL NAT 172.22.x) and stale quick-tunnel ropes answered nothing; setup dialled only the lan rope.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
- Every item in the dashboard's "What needs you" card now links to where you act on it: its own conversation, the Desktop page for that machine, the Accounts page for a sign-in, or otherwise the Attention topic where it was posted. Before, items without a conversation were plain text.
|
|
9
|
+
|
|
10
|
+
## What to Tell Your User
|
|
11
|
+
|
|
12
|
+
Everything in "What needs you" is now a link. Tap an item and you land where you can deal with it, for example the remote-desktop setup for that exact machine.
|
|
13
|
+
|
|
14
|
+
## Summary of New Capabilities
|
|
15
|
+
|
|
16
|
+
None. This completes the existing "needs you" card.
|
|
17
|
+
|
|
18
|
+
## Evidence
|
|
19
|
+
|
|
20
|
+
- On a live agent, both items in "What needs you" (remote-desktop permission on two machines) showed as plain text with no link. On the preview, each now links to the Desktop page with that machine selected.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
# Every item in "What needs you" now has a place to tap
|
|
2
|
+
|
|
3
|
+
The dashboard's home screen has a card called "What needs you". It lists the things only you can do: approve something, sign in somewhere, or fix a setting on a machine. The rule we agreed is that everything in that list must come with a button or a link that takes you straight to where you act, because a request you cannot act on is just noise.
|
|
4
|
+
|
|
5
|
+
Until now that rule was only half true. An item tied to a conversation linked to that conversation. Anything else (for example "Remote Desktop needs its Mac permission again" on the Mac Mini) was shown as plain text you could expand and read, with nowhere to go. That is what both items on the list looked like this morning.
|
|
6
|
+
|
|
7
|
+
Now every item gets a destination. A remote-desktop item opens the Desktop page with that exact machine selected, where the step-by-step setup and the Retry button are. A sign-in item opens the Accounts page. Anything else opens the Attention conversation in Telegram, where that item was posted and where you can answer it. If the dashboard cannot work out where the Attention conversation is, the item falls back to readable text, never a broken link. Nothing is hidden or removed by this change; it only adds the missing links.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Side-effects review: every "needs you" row has somewhere to act
|
|
2
|
+
|
|
3
|
+
## Change
|
|
4
|
+
`dashboard/console/home-model.js` adds `needAction(item)`; `buildNeeds` uses it for every row. Order: the item's own topic; a `desktop` item opens `/dashboard/desktop.html?machineId=<its machine>` (that page has the guided setup and Retry for that machine); a sign-in item opens Accounts; anything else opens the Attention topic in Telegram, where the item was posted. `dashboard/console/console.js` reads `GET /telegram/system-topics` once to learn the Attention topic and maps the new `href` and `attention` action kinds to links.
|
|
5
|
+
|
|
6
|
+
Before, a row without a topic id rendered as expandable text with no link. On the Studio today both rows in "needs you" (Remote Desktop permission on Mac Lan and Mac Mini) were like that.
|
|
7
|
+
|
|
8
|
+
## 1. Over-block
|
|
9
|
+
None. Not a gate.
|
|
10
|
+
|
|
11
|
+
## 2. Under-block
|
|
12
|
+
If the Attention topic cannot be read, an `attention` row falls back to the old expandable text (no link). It never shows a broken link.
|
|
13
|
+
|
|
14
|
+
## 3. Level-of-abstraction fit
|
|
15
|
+
The console page model decides where a row links. Correct layer.
|
|
16
|
+
|
|
17
|
+
## 4. Signal vs authority
|
|
18
|
+
No decision point. Not applicable.
|
|
19
|
+
|
|
20
|
+
## 5. Interactions
|
|
21
|
+
A row with a link renders as a link instead of an expandable row, so its description is not shown inline; the destination (Desktop page, conversation, Attention topic) carries the full text. The headline now says "Tap to review and respond." for these items, as it already did for conversation items. The card still hides itself when there is exactly one actionable item, because the headline then links to it.
|
|
22
|
+
|
|
23
|
+
## 6. External surfaces
|
|
24
|
+
One extra read (`GET /telegram/system-topics`) per console load. It is read-only and already authenticated.
|
|
25
|
+
|
|
26
|
+
## 6b. Operator-surface quality
|
|
27
|
+
Checked on the preview: each of the two Remote Desktop rows links to the Desktop page with that machine selected.
|
|
28
|
+
|
|
29
|
+
## 7. Multi-machine posture
|
|
30
|
+
Items come from `/attention?scope=pool` and carry their machine id; the Desktop link uses the item's own machine. The Attention topic is the agent-wide system topic (one per agent). Machine-local page code.
|
|
31
|
+
|
|
32
|
+
## 8. Rollback cost
|
|
33
|
+
Revert the commit; no data or migration.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Why setup said "Can't reach Mama PC", and the fix (plain English)
|
|
2
|
+
|
|
3
|
+
## What happened
|
|
4
|
+
|
|
5
|
+
Each of your machines tells the others several ways to reach it, called ropes: its Tailscale address, its local network address, and its Cloudflare tunnel. When the Studio's Remote Desktop setup page checked Mama PC, it asked for "the best rope" for Mama PC and got only one answer.
|
|
6
|
+
|
|
7
|
+
The ordinary rule for picking that one rope does not allow plain Tailscale connections, so it skipped Mama PC's Tailscale rope (the one that works) and picked its local network address instead. But Mama PC runs Instar inside WSL on Windows, and the local address it reports is a private address inside Windows that no other machine can reach. The setup page tried only that one dead address, gave up, and said "Can't reach Mama PC", even though Mama PC answered fine over Tailscale.
|
|
8
|
+
|
|
9
|
+
## What already existed
|
|
10
|
+
|
|
11
|
+
The remote desktop code already had its own permission check that allows Tailscale when the local Tailscale app confirms the other machine is really on the tailnet. It just never got to use it, because it only ever saw the one rope.
|
|
12
|
+
|
|
13
|
+
## What is new
|
|
14
|
+
|
|
15
|
+
- The remote desktop calls (the setup page, the readiness check, and the live remote desktop session itself) now look at every rope the machine reports, in the usual order.
|
|
16
|
+
- They skip ropes the permission check refuses, and if a rope cannot even be connected to, they try the next one.
|
|
17
|
+
- If a machine answers at all, even with an error, that answer stands. They never resend a request that might already have arrived, because some of these requests make changes on the other machine.
|
|
18
|
+
- The whole check still finishes within the same time limits as before (8 seconds for setup, 3 for the others).
|
|
19
|
+
|
|
20
|
+
## Safeguards
|
|
21
|
+
|
|
22
|
+
Nothing about who is allowed to connect changes; the same permission check runs on each rope. A machine whose first rope works behaves exactly as before. The live remote desktop stream goes to the rope that actually answered.
|
|
23
|
+
|
|
24
|
+
## Not fixed here
|
|
25
|
+
|
|
26
|
+
Mama PC still advertises that unreachable WSL-internal address. The setup now works around it; stopping it from being advertised needs a careful change of its own, so it has been filed as a separate issue.
|
|
27
|
+
|
|
28
|
+
## What you need to decide
|
|
29
|
+
|
|
30
|
+
Nothing. This is a small change that a revert fully undoes.
|