instar 1.3.1606 → 1.3.1608
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/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/feedback-factory/execute/executorSession.d.ts.map +1 -1
- package/dist/feedback-factory/execute/executorSession.js +6 -1
- package/dist/feedback-factory/execute/executorSession.js.map +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.1607.md +21 -0
- package/upgrades/1.3.1608.md +23 -0
- package/upgrades/side-effects/desktop-peer-rope-fallback.eli16.md +30 -0
- package/upgrades/side-effects/desktop-peer-rope-fallback.md +79 -0
- package/upgrades/side-effects/feedback-base-missing-new-source.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:00:15.797Z",
|
|
5
|
+
"instarVersion": "1.3.1608",
|
|
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.1608",
|
|
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": "f8a624d90b7e0da9279f067fef9e141bac4834e4418d71b592ef4c5b07b6af49",
|
|
3
3
|
"registrySha256": "db01d9f92c6aa26ca903702896b41be53722982ed07d27633237bb254c214290",
|
|
4
|
-
"packageVersion": "1.3.
|
|
4
|
+
"packageVersion": "1.3.1608"
|
|
5
5
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
- The feedback executor now accepts a base-version test failure when the test imports a source file that the proposed fix adds. Vitest reports zero collected tests in that case, but the missing file is the expected proof that the old version lacks the fix. The checker still rejects an unrelated missing import, a nonexistent test file, and a proposed fix whose named test never passes.
|
|
9
|
+
|
|
10
|
+
## What to Tell Your User
|
|
11
|
+
|
|
12
|
+
A feedback fix will no longer be discarded just because its test uses a new source file that does not exist in the old version. The fix still has to pass its test on the proposed version and clear review.
|
|
13
|
+
|
|
14
|
+
## Summary of New Capabilities
|
|
15
|
+
|
|
16
|
+
None. This corrects the existing feedback proof gate.
|
|
17
|
+
|
|
18
|
+
## Evidence
|
|
19
|
+
|
|
20
|
+
- The recorded Vitest failure shape is covered by a unit test, alongside unrelated missing-file and generic zero-test cases. The full unit rerun passed 55,549 tests.
|
|
21
|
+
- Full unit, integration, and end-to-end checks are required before merge.
|
|
@@ -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,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.
|