instar 1.3.986 → 1.3.987
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/threadline/ThreadlineBootstrap.d.ts +9 -0
- package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
- package/dist/threadline/ThreadlineBootstrap.js +14 -0
- package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
- package/dist/threadline/relayConnectionObserver.d.ts +76 -0
- package/dist/threadline/relayConnectionObserver.d.ts.map +1 -0
- package/dist/threadline/relayConnectionObserver.js +86 -0
- package/dist/threadline/relayConnectionObserver.js.map +1 -0
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +2 -2
- package/upgrades/1.3.987.md +100 -0
- package/upgrades/side-effects/relay-drop-was-unrecorded.md +160 -0
|
@@ -17,6 +17,7 @@ import { HandshakeManager } from './HandshakeManager.js';
|
|
|
17
17
|
import { AgentDiscovery } from './AgentDiscovery.js';
|
|
18
18
|
import { ThreadlineClient } from './client/ThreadlineClient.js';
|
|
19
19
|
import { InboundMessageGate } from './InboundMessageGate.js';
|
|
20
|
+
import { type RelayConnectionEvent } from './relayConnectionObserver.js';
|
|
20
21
|
import { AgentTrustManager } from './AgentTrustManager.js';
|
|
21
22
|
export interface ThreadlineBootstrapConfig {
|
|
22
23
|
/** Agent name */
|
|
@@ -64,6 +65,14 @@ export interface ThreadlineBootstrapResult {
|
|
|
64
65
|
inboundGate?: InboundMessageGate;
|
|
65
66
|
/** Trust manager */
|
|
66
67
|
trustManager?: AgentTrustManager;
|
|
68
|
+
/**
|
|
69
|
+
* Most recent relay connection-LOSS event, or null if the relay has never
|
|
70
|
+
* dropped. Exists so a status surface can report WHY the relay is down rather
|
|
71
|
+
* than only that it is — the distinction the 2026-07-26 incident turned on,
|
|
72
|
+
* when the only record available said "connected" for a connection that was
|
|
73
|
+
* gone. See relayConnectionObserver.ts.
|
|
74
|
+
*/
|
|
75
|
+
getLastRelayEvent?: () => RelayConnectionEvent | null;
|
|
67
76
|
}
|
|
68
77
|
/**
|
|
69
78
|
* Bootstrap the Threadline protocol stack.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadlineBootstrap.d.ts","sourceRoot":"","sources":["../../src/threadline/ThreadlineBootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAO3D,MAAM,WAAW,yBAAyB;IACxC,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/C,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,MAAM;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,uBAAuB,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1G;AAED,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,8BAA8B;IAC9B,SAAS,EAAE,cAAc,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,iDAAiD;IACjD,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,oBAAoB;IACpB,YAAY,CAAC,EAAE,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"ThreadlineBootstrap.d.ts","sourceRoot":"","sources":["../../src/threadline/ThreadlineBootstrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAEhE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAA4B,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AACnG,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAO3D,MAAM,WAAW,yBAAyB;IACxC,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,wBAAwB;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,uDAAuD;IACvD,UAAU,EAAE,MAAM,CAAC;IACnB,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,6DAA6D;IAC7D,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gCAAgC;IAChC,UAAU,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IAC/C,iCAAiC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;;;OAKG;IACH,wBAAwB,CAAC,EAAE,MAAM;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,uBAAuB,EAAE,OAAO,CAAA;KAAE,CAAC;CAC1G;AAED,MAAM,WAAW,yBAAyB;IACxC,8CAA8C;IAC9C,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,8BAA8B;IAC9B,SAAS,EAAE,cAAc,CAAC;IAC1B,6CAA6C;IAC7C,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,+CAA+C;IAC/C,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,iDAAiD;IACjD,WAAW,CAAC,EAAE,kBAAkB,CAAC;IACjC,oBAAoB;IACpB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC;;;;;;OAMG;IACH,iBAAiB,CAAC,EAAE,MAAM,oBAAoB,GAAG,IAAI,CAAC;CACvD;AAID;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,yBAAyB,GAChC,OAAO,CAAC,yBAAyB,CAAC,CAqRpC"}
|
|
@@ -24,6 +24,7 @@ import { DEFAULT_RELAY_URL } from './constants.js';
|
|
|
24
24
|
import { resolveThreadlineMcpEntry } from './mcpEntry.js';
|
|
25
25
|
import { ThreadlineClient } from './client/ThreadlineClient.js';
|
|
26
26
|
import { InboundMessageGate } from './InboundMessageGate.js';
|
|
27
|
+
import { attachRelayObservability } from './relayConnectionObserver.js';
|
|
27
28
|
import { AgentTrustManager } from './AgentTrustManager.js';
|
|
28
29
|
import { SafeFsExecutor } from '../core/SafeFsExecutor.js';
|
|
29
30
|
import { IdentityManager } from './client/IdentityManager.js';
|
|
@@ -147,6 +148,7 @@ export async function bootstrapThreadline(config) {
|
|
|
147
148
|
}
|
|
148
149
|
}
|
|
149
150
|
let relayClient;
|
|
151
|
+
let relayObservability;
|
|
150
152
|
let inboundGate;
|
|
151
153
|
let trustManager;
|
|
152
154
|
// Always create trust manager when relay is enabled — needed for processing
|
|
@@ -249,6 +251,14 @@ export async function bootstrapThreadline(config) {
|
|
|
249
251
|
relayClient.on('auto-discovered', (info) => {
|
|
250
252
|
console.log(`Threadline: auto-discovered ${info.count} agent(s) on relay`);
|
|
251
253
|
});
|
|
254
|
+
// Record connection LOSS, not just connection. Without this the successful
|
|
255
|
+
// connect line below is the last word the record can ever contain, so a relay
|
|
256
|
+
// that drops afterwards — including the terminal `displaced` case, which
|
|
257
|
+
// disarms reconnect permanently — is invisible. See relayConnectionObserver.ts
|
|
258
|
+
// for the incident this closes.
|
|
259
|
+
relayObservability = attachRelayObservability(relayClient, {
|
|
260
|
+
logDir: path.join(config.stateDir, '..', 'logs'),
|
|
261
|
+
});
|
|
252
262
|
try {
|
|
253
263
|
await relayClient.connect();
|
|
254
264
|
console.log(`Threadline: relay connected (fingerprint: ${relayClient.fingerprint})`);
|
|
@@ -273,6 +283,10 @@ export async function bootstrapThreadline(config) {
|
|
|
273
283
|
discovery,
|
|
274
284
|
trustManager,
|
|
275
285
|
relayClient,
|
|
286
|
+
/** Most recent relay connection-loss event, or null if it has never dropped.
|
|
287
|
+
* Lets a status surface report WHY the relay is down instead of only that it
|
|
288
|
+
* is — the distinction the 2026-07-26 incident turned on. */
|
|
289
|
+
getLastRelayEvent: () => relayObservability?.getLastEvent() ?? null,
|
|
276
290
|
inboundGate,
|
|
277
291
|
shutdown: async () => {
|
|
278
292
|
stopHeartbeat();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThreadlineBootstrap.js","sourceRoot":"","sources":["../../src/threadline/ThreadlineBootstrap.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ThreadlineBootstrap.js","sourceRoot":"","sources":["../../src/threadline/ThreadlineBootstrap.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability for the server's relay connection.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS
|
|
5
|
+
* ---------------
|
|
6
|
+
* On 2026-07-26 the agent could not send to a peer. The peer was healthy and
|
|
7
|
+
* listening; this agent's relay was down. Diagnosing it was impossible from the
|
|
8
|
+
* record, because the record could only ever say one thing:
|
|
9
|
+
*
|
|
10
|
+
* Threadline: relay connected (fingerprint: …)
|
|
11
|
+
*
|
|
12
|
+
* `RelayClient` emits BOTH `disconnected` (socket close) and `displaced` (another
|
|
13
|
+
* connection claimed the same identity). `ThreadlineBootstrap` subscribed to
|
|
14
|
+
* `message`, `unknown-sender` and `auto-discovered` — and to NEITHER of those two.
|
|
15
|
+
* So a connection that dropped after startup left the successful connect line as
|
|
16
|
+
* the last word forever.
|
|
17
|
+
*
|
|
18
|
+
* THE PART THAT MAKES IT WORTH A MODULE. `displaced` sets `shouldReconnect = false`
|
|
19
|
+
* permanently — deliberately, so two processes do not fight over one identity. That
|
|
20
|
+
* is a *terminal* state: the exponential backoff that would otherwise recover the
|
|
21
|
+
* connection is switched off and never re-armed for the life of the process. A
|
|
22
|
+
* terminal state that is never recorded is the worst combination available: the
|
|
23
|
+
* channel is gone for good and nothing says so.
|
|
24
|
+
*
|
|
25
|
+
* The bootstrap itself documents a known "displacement race" between the server's
|
|
26
|
+
* client and the standalone listener daemon. Whether that race is what fired here
|
|
27
|
+
* is UNKNOWN — and unknowable from the existing record, which is precisely the
|
|
28
|
+
* defect. This module does not diagnose the cause; it makes the next occurrence
|
|
29
|
+
* diagnosable.
|
|
30
|
+
*
|
|
31
|
+
* SCOPE — deliberately narrow. This RECORDS transitions. It does not reconnect,
|
|
32
|
+
* does not re-arm anything, and never changes the client's behaviour. Any recovery
|
|
33
|
+
* fix belongs after this, and would be unverifiable before it.
|
|
34
|
+
*/
|
|
35
|
+
/** One recorded relay-connection transition. */
|
|
36
|
+
export interface RelayConnectionEvent {
|
|
37
|
+
ts: string;
|
|
38
|
+
/**
|
|
39
|
+
* `disconnected` — socket closed; the client's backoff will retry.
|
|
40
|
+
* `displaced` — another connection took this identity. TERMINAL: retry is
|
|
41
|
+
* disarmed permanently and this process will not reconnect.
|
|
42
|
+
*/
|
|
43
|
+
event: 'disconnected' | 'displaced';
|
|
44
|
+
/** Reason string from the client, clamped. Never trusted as structured data. */
|
|
45
|
+
reason: string;
|
|
46
|
+
fingerprint: string;
|
|
47
|
+
/**
|
|
48
|
+
* True only for `displaced`. Recorded explicitly rather than left implicit,
|
|
49
|
+
* because "will retry" and "will never retry" are the two states a reader
|
|
50
|
+
* actually needs to tell apart, and they are otherwise indistinguishable.
|
|
51
|
+
*/
|
|
52
|
+
terminal: boolean;
|
|
53
|
+
}
|
|
54
|
+
/** Minimal shape this module needs — keeps it testable without a real socket. */
|
|
55
|
+
export interface RelayEventSource {
|
|
56
|
+
on(event: string, listener: (...args: unknown[]) => void): unknown;
|
|
57
|
+
readonly fingerprint?: string | null;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Subscribe to the relay client's connection-loss events and record each one.
|
|
61
|
+
*
|
|
62
|
+
* Returns a getter for the most recent event so a status surface can report WHY
|
|
63
|
+
* the connection is down rather than only that it is. Returns null until one
|
|
64
|
+
* fires — which correctly distinguishes "never dropped" from "dropped, cause X".
|
|
65
|
+
*/
|
|
66
|
+
export declare function attachRelayObservability(client: RelayEventSource, opts: {
|
|
67
|
+
/** Directory for the durable record. Created if absent. */
|
|
68
|
+
logDir: string;
|
|
69
|
+
/** Injected so tests capture output instead of writing to the console. */
|
|
70
|
+
log?: (line: string) => void;
|
|
71
|
+
/** Injected for the same reason. */
|
|
72
|
+
logError?: (line: string) => void;
|
|
73
|
+
}): {
|
|
74
|
+
getLastEvent: () => RelayConnectionEvent | null;
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=relayConnectionObserver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayConnectionObserver.d.ts","sourceRoot":"","sources":["../../src/threadline/relayConnectionObserver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAKH,gDAAgD;AAChD,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX;;;;OAIG;IACH,KAAK,EAAE,cAAc,GAAG,WAAW,CAAC;IACpC,gFAAgF;IAChF,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAC/B,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC;IACnE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACtC;AASD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,gBAAgB,EACxB,IAAI,EAAE;IACJ,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf,0EAA0E;IAC1E,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,oCAAoC;IACpC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,GACA;IAAE,YAAY,EAAE,MAAM,oBAAoB,GAAG,IAAI,CAAA;CAAE,CA6CrD"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observability for the server's relay connection.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS
|
|
5
|
+
* ---------------
|
|
6
|
+
* On 2026-07-26 the agent could not send to a peer. The peer was healthy and
|
|
7
|
+
* listening; this agent's relay was down. Diagnosing it was impossible from the
|
|
8
|
+
* record, because the record could only ever say one thing:
|
|
9
|
+
*
|
|
10
|
+
* Threadline: relay connected (fingerprint: …)
|
|
11
|
+
*
|
|
12
|
+
* `RelayClient` emits BOTH `disconnected` (socket close) and `displaced` (another
|
|
13
|
+
* connection claimed the same identity). `ThreadlineBootstrap` subscribed to
|
|
14
|
+
* `message`, `unknown-sender` and `auto-discovered` — and to NEITHER of those two.
|
|
15
|
+
* So a connection that dropped after startup left the successful connect line as
|
|
16
|
+
* the last word forever.
|
|
17
|
+
*
|
|
18
|
+
* THE PART THAT MAKES IT WORTH A MODULE. `displaced` sets `shouldReconnect = false`
|
|
19
|
+
* permanently — deliberately, so two processes do not fight over one identity. That
|
|
20
|
+
* is a *terminal* state: the exponential backoff that would otherwise recover the
|
|
21
|
+
* connection is switched off and never re-armed for the life of the process. A
|
|
22
|
+
* terminal state that is never recorded is the worst combination available: the
|
|
23
|
+
* channel is gone for good and nothing says so.
|
|
24
|
+
*
|
|
25
|
+
* The bootstrap itself documents a known "displacement race" between the server's
|
|
26
|
+
* client and the standalone listener daemon. Whether that race is what fired here
|
|
27
|
+
* is UNKNOWN — and unknowable from the existing record, which is precisely the
|
|
28
|
+
* defect. This module does not diagnose the cause; it makes the next occurrence
|
|
29
|
+
* diagnosable.
|
|
30
|
+
*
|
|
31
|
+
* SCOPE — deliberately narrow. This RECORDS transitions. It does not reconnect,
|
|
32
|
+
* does not re-arm anything, and never changes the client's behaviour. Any recovery
|
|
33
|
+
* fix belongs after this, and would be unverifiable before it.
|
|
34
|
+
*/
|
|
35
|
+
import fs from 'node:fs';
|
|
36
|
+
import path from 'node:path';
|
|
37
|
+
const MAX_REASON_CHARS = 300;
|
|
38
|
+
function clampReason(reason) {
|
|
39
|
+
const s = typeof reason === 'string' ? reason : String(reason ?? '');
|
|
40
|
+
return s.length > MAX_REASON_CHARS ? `${s.slice(0, MAX_REASON_CHARS)}…` : s;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Subscribe to the relay client's connection-loss events and record each one.
|
|
44
|
+
*
|
|
45
|
+
* Returns a getter for the most recent event so a status surface can report WHY
|
|
46
|
+
* the connection is down rather than only that it is. Returns null until one
|
|
47
|
+
* fires — which correctly distinguishes "never dropped" from "dropped, cause X".
|
|
48
|
+
*/
|
|
49
|
+
export function attachRelayObservability(client, opts) {
|
|
50
|
+
const log = opts.log ?? ((line) => console.log(line));
|
|
51
|
+
const logError = opts.logError ?? ((line) => console.error(line));
|
|
52
|
+
let lastEvent = null;
|
|
53
|
+
const record = (event, reason, terminal) => {
|
|
54
|
+
const entry = {
|
|
55
|
+
ts: new Date().toISOString(),
|
|
56
|
+
event,
|
|
57
|
+
reason: clampReason(reason),
|
|
58
|
+
fingerprint: client.fingerprint ?? 'unknown',
|
|
59
|
+
terminal,
|
|
60
|
+
};
|
|
61
|
+
lastEvent = entry;
|
|
62
|
+
// Loud on the console FIRST. If the durable write fails, the operator still
|
|
63
|
+
// sees the transition — the whole point is that this must not be silent.
|
|
64
|
+
if (terminal) {
|
|
65
|
+
logError(`Threadline: relay DISPLACED by another connection using this identity — ${entry.reason}. `
|
|
66
|
+
+ 'Reconnect is now disarmed for the life of this process; this agent cannot send or '
|
|
67
|
+
+ 'receive until it restarts.');
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
log(`Threadline: relay disconnected — ${entry.reason}. Client will retry with backoff.`);
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
fs.mkdirSync(opts.logDir, { recursive: true });
|
|
74
|
+
fs.appendFileSync(path.join(opts.logDir, 'threadline-relay-events.jsonl'), `${JSON.stringify(entry)}\n`, 'utf-8');
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
// Never throw out of an event handler — a failed audit write must not take
|
|
78
|
+
// down the connection path it is observing.
|
|
79
|
+
logError(`Threadline: failed to record relay ${event} — ${err instanceof Error ? err.message : err}`);
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
client.on('disconnected', (reason) => record('disconnected', reason, false));
|
|
83
|
+
client.on('displaced', (reason) => record('displaced', reason, true));
|
|
84
|
+
return { getLastEvent: () => lastEvent };
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=relayConnectionObserver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"relayConnectionObserver.js","sourceRoot":"","sources":["../../src/threadline/relayConnectionObserver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AA4B7B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,SAAS,WAAW,CAAC,MAAe;IAClC,MAAM,CAAC,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IACrE,OAAO,CAAC,CAAC,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,wBAAwB,CACtC,MAAwB,EACxB,IAOC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,IAAI,SAAS,GAAgC,IAAI,CAAC;IAElD,MAAM,MAAM,GAAG,CAAC,KAAoC,EAAE,MAAe,EAAE,QAAiB,EAAQ,EAAE;QAChG,MAAM,KAAK,GAAyB;YAClC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YAC5B,KAAK;YACL,MAAM,EAAE,WAAW,CAAC,MAAM,CAAC;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,SAAS;YAC5C,QAAQ;SACT,CAAC;QACF,SAAS,GAAG,KAAK,CAAC;QAElB,4EAA4E;QAC5E,yEAAyE;QACzE,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CACN,2EAA2E,KAAK,CAAC,MAAM,IAAI;kBACzF,oFAAoF;kBACpF,4BAA4B,CAC/B,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,oCAAoC,KAAK,CAAC,MAAM,mCAAmC,CAAC,CAAC;QAC3F,CAAC;QAED,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,EAAE,CAAC,cAAc,CACf,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,+BAA+B,CAAC,EACvD,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAC5B,OAAO,CACR,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,2EAA2E;YAC3E,4CAA4C;YAC5C,QAAQ,CAAC,sCAAsC,KAAK,MAAM,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QACxG,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,MAAe,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,MAAe,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAE/E,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;AAC3C,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-07-
|
|
5
|
-
"instarVersion": "1.3.
|
|
4
|
+
"generatedAt": "2026-07-26T19:26:36.562Z",
|
|
5
|
+
"instarVersion": "1.3.987",
|
|
6
6
|
"entryCount": 202,
|
|
7
7
|
"entries": {
|
|
8
8
|
"hook:session-start": {
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
# Upgrade Guide — vNEXT
|
|
2
|
+
|
|
3
|
+
<!-- assembled-by: assemble-next-md -->
|
|
4
|
+
<!-- bump: patch -->
|
|
5
|
+
|
|
6
|
+
## What Changed
|
|
7
|
+
|
|
8
|
+
**When the agent-to-agent relay connection dropped, nothing recorded it — so the startup line
|
|
9
|
+
saying it had connected stayed the last word forever, whatever happened afterwards.**
|
|
10
|
+
|
|
11
|
+
`RelayClient` emits two connection-loss events: `disconnected` (socket close; the client retries
|
|
12
|
+
with exponential backoff) and `displaced` (another connection claimed this identity — **terminal**,
|
|
13
|
+
because `case 'displaced': shouldReconnect = false` disarms retry for the life of the process).
|
|
14
|
+
`ThreadlineBootstrap` subscribed to `message`, `unknown-sender` and `auto-discovered` — and to
|
|
15
|
+
**neither** loss event. Only `listener-daemon.ts` handled them.
|
|
16
|
+
|
|
17
|
+
**Observed (2026-07-26).** The agent could not send to a peer; two send paths refused with
|
|
18
|
+
`Relay not connected and local delivery unavailable`. The peer's own server reported
|
|
19
|
+
`ready: true, relay.connected: true` and had been listening since the previous day — the peer was
|
|
20
|
+
healthy. This agent reported `ready: false, relay.connected: false`, while its last written word on
|
|
21
|
+
the subject was `Threadline: relay connected` at `18:21:27Z`, with no disconnect line anywhere.
|
|
22
|
+
|
|
23
|
+
**The property that made this worth fixing rather than noting: the defect concealed its own cause.**
|
|
24
|
+
A `displaced` frame would fully explain why backoff never recovered the connection, and
|
|
25
|
+
`ThreadlineBootstrap` documents a known displacement race between the server's client and the
|
|
26
|
+
standalone listener daemon. Whether that is what fired is **unknowable**, because nothing recorded
|
|
27
|
+
it — the absence of evidence was produced by the defect itself.
|
|
28
|
+
|
|
29
|
+
The server now subscribes to both and records each transition, appending to
|
|
30
|
+
`logs/threadline-relay-events.jsonl` and exposing the latest event on the bootstrap result.
|
|
31
|
+
|
|
32
|
+
**Ordering note.** This ships observability and *not* reconnection, reversing the author's first
|
|
33
|
+
plan. A reconnect fix built first would have been unverifiable — there would have been no way to
|
|
34
|
+
observe whether it held.
|
|
35
|
+
|
|
36
|
+
## What to Tell Your User
|
|
37
|
+
|
|
38
|
+
If I have ever been unable to reach another agent and could not tell you why, this is one reason.
|
|
39
|
+
My link to the shared relay could go down and leave behind a note saying it was up — not merely
|
|
40
|
+
silent, but actively misleading, because that startup note was the only note that could ever exist.
|
|
41
|
+
|
|
42
|
+
Two things can end that connection. An ordinary drop, which retries by itself and usually recovers.
|
|
43
|
+
And being displaced, where another process takes the same identity — in which case retrying is
|
|
44
|
+
switched off deliberately and permanently, so the link is gone until a restart. Those demand
|
|
45
|
+
opposite reactions from anyone reading, and both were equally invisible.
|
|
46
|
+
|
|
47
|
+
Now a drop is reported calmly and says a retry is coming, and a displacement is reported as an error
|
|
48
|
+
that says plainly the agent cannot send or receive until it restarts.
|
|
49
|
+
|
|
50
|
+
Two honest limits. This does not reconnect anything — a restart still fixes it, as before, and
|
|
51
|
+
recovery is separate work. And it cannot explain the outage that prompted it, because that evidence
|
|
52
|
+
was never created; what changes is that the next one is diagnosable.
|
|
53
|
+
|
|
54
|
+
## Summary of New Capabilities
|
|
55
|
+
|
|
56
|
+
- A relay disconnection is recorded durably instead of passing silently.
|
|
57
|
+
- A relay *displacement* is recorded, flagged terminal, and reported at error level with its
|
|
58
|
+
consequence stated — that retry is disarmed and the agent cannot send or receive until restart.
|
|
59
|
+
- The two are distinguishable, so a reader can tell "wait for the retry" from "this is over".
|
|
60
|
+
- Every occurrence is appended rather than overwriting the last, so a flapping connection is
|
|
61
|
+
visible — the shape a reconnection bug actually takes.
|
|
62
|
+
- The most recent loss event is exposed on the bootstrap result, so a status surface can report
|
|
63
|
+
*why* the relay is down rather than only that it is.
|
|
64
|
+
- A connection that has never dropped records nothing and reports no last event, keeping
|
|
65
|
+
"never dropped" distinct from "dropped, cause unknown".
|
|
66
|
+
|
|
67
|
+
## Evidence
|
|
68
|
+
|
|
69
|
+
**Before**, on the affected agent:
|
|
70
|
+
|
|
71
|
+
| surface | reading |
|
|
72
|
+
|---|---|
|
|
73
|
+
| peer's own server | `ready: true`, `relay.connected: true`, listening since 2026-07-25 |
|
|
74
|
+
| this agent | `ready: false`, `relay.connected: false` |
|
|
75
|
+
| this agent's log, last relay line | `Threadline: relay connected` @ `18:21:27Z` |
|
|
76
|
+
| disconnect / displacement lines | none — no handler existed |
|
|
77
|
+
|
|
78
|
+
**After** — every row asserted by a test:
|
|
79
|
+
|
|
80
|
+
| event | recorded | terminal | reported as | says |
|
|
81
|
+
|---|---|---|---|---|
|
|
82
|
+
| `disconnected` | yes | `false` | log | will retry with backoff |
|
|
83
|
+
| `displaced` | yes | `true` | **error** | retry disarmed; cannot send/receive until restart |
|
|
84
|
+
| never dropped | nothing written | — | — | last event is `null`, not a falsy "unknown" |
|
|
85
|
+
| 5 consecutive drops | 5 rows appended | — | — | flapping stays visible |
|
|
86
|
+
| unwritable log dir | handler does not throw | — | error | console + in-memory state still correct |
|
|
87
|
+
| 5,000-char reason | clamped below 400 | — | — | untrusted text is not written whole |
|
|
88
|
+
| null fingerprint | `"unknown"` | — | — | recorded honestly, not as empty string |
|
|
89
|
+
|
|
90
|
+
**Three guards refuse.** Each regression was introduced deliberately and the suite re-run:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
remove the 'displaced' subscription → 4 failed | 6 passed (10)
|
|
94
|
+
remove the 'disconnected' subscription → 7 failed | 3 passed (10)
|
|
95
|
+
collapse terminal into one verdict (false) → 4 failed | 6 passed (10)
|
|
96
|
+
restored → 10 passed (10)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Scope run:** `npx tsc --noEmit` clean; tree-scanning tests plus every threadline test — counts in
|
|
100
|
+
the PR body.
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# Side-Effects Review — a relay that dropped left "connected" as the last word
|
|
2
|
+
|
|
3
|
+
**Version / slug:** `relay-drop-was-unrecorded`
|
|
4
|
+
**Date:** `2026-07-26`
|
|
5
|
+
**Author:** `Echo (instar-dev agent)`
|
|
6
|
+
**Second-pass reviewer:** `see Phase 5`
|
|
7
|
+
|
|
8
|
+
## Summary of the change
|
|
9
|
+
|
|
10
|
+
`RelayClient` emits two connection-loss events: `disconnected` (socket close, client
|
|
11
|
+
retries with backoff) and `displaced` (another connection claimed this identity —
|
|
12
|
+
**terminal**, because `case 'displaced': shouldReconnect = false` disarms retry for
|
|
13
|
+
the life of the process). `ThreadlineBootstrap` subscribed to `message`,
|
|
14
|
+
`unknown-sender` and `auto-discovered` — and to **neither** loss event. Verified by
|
|
15
|
+
grep: both return empty in that file. Only `listener-daemon.ts` handles them.
|
|
16
|
+
|
|
17
|
+
So the server logged `Threadline: relay connected (fingerprint: …)` and could log
|
|
18
|
+
nothing afterwards, whatever happened.
|
|
19
|
+
|
|
20
|
+
**Observed (2026-07-26, topic 29723).** The agent could not send to peer
|
|
21
|
+
`instar-codey`; two send paths refused with `Relay not connected and local delivery
|
|
22
|
+
unavailable`. The peer's own server reported `ready:true, relay.connected:true`,
|
|
23
|
+
listening since 2026-07-25 — the peer was fine. This agent reported
|
|
24
|
+
`ready:false, relay.connected:false`, while its last written word on the subject was
|
|
25
|
+
`relay connected` at 18:21:27Z, with no disconnect line anywhere.
|
|
26
|
+
|
|
27
|
+
**The property that makes this worth fixing rather than noting: the defect conceals
|
|
28
|
+
its own cause.** `displaced` would fully explain why exponential backoff never
|
|
29
|
+
recovered the connection. Whether a `displaced` frame arrived is **unknowable**,
|
|
30
|
+
because nothing recorded it. The absence of evidence is produced by the defect.
|
|
31
|
+
`ThreadlineBootstrap` itself documents a known "displacement race" between the
|
|
32
|
+
server's client and the standalone listener daemon — a candidate, **not asserted**.
|
|
33
|
+
|
|
34
|
+
This change RECORDS transitions. It does not reconnect and does not alter client
|
|
35
|
+
behaviour. That ordering is deliberate and is a correction to my own first plan
|
|
36
|
+
("reconnect, then observe"): a reconnect fix built first would have been
|
|
37
|
+
unverifiable, because there would be no way to see whether it held.
|
|
38
|
+
|
|
39
|
+
## Decision-point inventory
|
|
40
|
+
|
|
41
|
+
| point | classification | note |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| `disconnected` → record, non-terminal | `invariant` | Deterministic event subscription. |
|
|
44
|
+
| `displaced` → record, terminal + error-level | `invariant` | Same. `terminal` is stored explicitly rather than inferred, because "will retry" vs "will never retry" is the distinction a reader needs and they are otherwise identical. |
|
|
45
|
+
| reason string clamped to 300 chars | `invariant` | The reason originates off-machine; it is treated as untrusted text, never structured data. |
|
|
46
|
+
| audit-write failure swallowed | `invariant` | An observer must not throw out of a handler on the path it observes. |
|
|
47
|
+
|
|
48
|
+
No judgment points. No model call. Nothing gates or blocks.
|
|
49
|
+
|
|
50
|
+
## 1. Over-block
|
|
51
|
+
|
|
52
|
+
Nothing is blocked. The observer only appends and logs; it cannot refuse a
|
|
53
|
+
connection, a send, or a message. The strongest available failure is noise in the
|
|
54
|
+
log if the relay flaps — which is information, not a block, and is the signal a
|
|
55
|
+
future reconnect fix will be judged against.
|
|
56
|
+
|
|
57
|
+
## 2. Under-block
|
|
58
|
+
|
|
59
|
+
**It does not fix the outage.** The relay is still down as of writing, and this
|
|
60
|
+
change does not reconnect it. Restarting the server restores the connection; that is
|
|
61
|
+
unchanged and untouched.
|
|
62
|
+
|
|
63
|
+
**It does not identify tonight's cause.** That evidence was destroyed before it
|
|
64
|
+
existed. The honest claim is narrower than it looks: the *next* occurrence becomes
|
|
65
|
+
diagnosable, this one does not become explicable.
|
|
66
|
+
|
|
67
|
+
**It observes only the server's client.** The MCP server and the listener daemon each
|
|
68
|
+
construct their own client. The daemon already handles both events; the MCP path is
|
|
69
|
+
untouched and remains unobserved. Recorded, not silently deferred.
|
|
70
|
+
|
|
71
|
+
**A record that is never read is only half of observability.** This writes a durable
|
|
72
|
+
JSONL and exposes the latest event through the bootstrap result. Surfacing it on
|
|
73
|
+
`/threadline/status` is the obvious next step and is deliberately not bundled — this
|
|
74
|
+
PR's refusal evidence is about recording, and mixing a route change in would blur it.
|
|
75
|
+
|
|
76
|
+
## 3. Level-of-abstraction fit
|
|
77
|
+
|
|
78
|
+
A pure-ish module (`fs` only), below the bootstrap, testable with a fake
|
|
79
|
+
`EventEmitter` and no socket. The bootstrap owns wiring; the module owns recording.
|
|
80
|
+
|
|
81
|
+
**A smarter component already exists and was consulted, not duplicated.**
|
|
82
|
+
`listener-daemon.ts` handles both events and writes `listener-displaced-alert.json` —
|
|
83
|
+
a single-slot file. This deliberately appends instead: a one-slot file cannot show a
|
|
84
|
+
flapping connection, which is exactly the shape a reconnect bug takes.
|
|
85
|
+
|
|
86
|
+
## 4. Signal vs authority compliance
|
|
87
|
+
|
|
88
|
+
Pure signal. It records and logs; it holds no authority over anything. It cannot
|
|
89
|
+
block a send, refuse a connection, or influence reconnection. `docs/signal-vs-authority.md`
|
|
90
|
+
is satisfied trivially — there is no decision to misplace.
|
|
91
|
+
|
|
92
|
+
The one risk an observer can carry is taking down what it watches. That is closed by
|
|
93
|
+
swallowing audit-write failures, asserted by a test.
|
|
94
|
+
|
|
95
|
+
## 4b. Judgment-point check (Judgment Within Floors standard)
|
|
96
|
+
|
|
97
|
+
None introduced. Every branch is a deterministic event subscription.
|
|
98
|
+
|
|
99
|
+
## 5. Interactions
|
|
100
|
+
|
|
101
|
+
- **`listener-daemon.ts`** — already handles both events independently; unchanged.
|
|
102
|
+
Its single-slot alert file is left alone; this is a second, additive record.
|
|
103
|
+
- **`ThreadlineClient` / `RelayClient`** — unchanged. No new emissions, no altered
|
|
104
|
+
reconnect behaviour, no change to `shouldReconnect`.
|
|
105
|
+
- **The daemon-handles-relay branch** — when the daemon owns the relay, the server
|
|
106
|
+
never connects and the observer is never attached. Correct: nothing to observe.
|
|
107
|
+
- **`/threadline/status`** — unchanged in this PR (see §2).
|
|
108
|
+
|
|
109
|
+
## 6. External surfaces
|
|
110
|
+
|
|
111
|
+
One new durable file, `logs/threadline-relay-events.jsonl`, and one optional field on
|
|
112
|
+
the bootstrap result. No route, no config key, no CLI flag, no message to any user.
|
|
113
|
+
|
|
114
|
+
**Content:** timestamps, event names, this agent's own fingerprint, and a clamped
|
|
115
|
+
reason string from the relay. No message bodies, no peer content.
|
|
116
|
+
|
|
117
|
+
## 6b. Operator-surface quality
|
|
118
|
+
|
|
119
|
+
Two new log lines. The displacement line is error-level and states the consequence in
|
|
120
|
+
plain terms — that retry is disarmed and the agent cannot send or receive until
|
|
121
|
+
restart — rather than naming the event and leaving the reader to infer what it means.
|
|
122
|
+
The disconnect line is calm and says a retry is coming. That difference is the entire
|
|
123
|
+
point; a reader must be able to tell "wait" from "this is over".
|
|
124
|
+
|
|
125
|
+
## 7. Multi-machine posture (Cross-Machine Coherence)
|
|
126
|
+
|
|
127
|
+
Machine-local by design. Each machine observes its own relay client and writes its own
|
|
128
|
+
record; a relay connection is per-process and cannot be reasoned about remotely. No
|
|
129
|
+
replication, no lease interaction, no shared state, no generated URL.
|
|
130
|
+
|
|
131
|
+
## 8. Rollback cost
|
|
132
|
+
|
|
133
|
+
Low. Delete the module, remove one import, one declaration, one call, one optional
|
|
134
|
+
result field. No migration, no persisted state anyone reads yet, no config default,
|
|
135
|
+
nothing installed into an agent home. The test would fail on revert, announcing it.
|
|
136
|
+
|
|
137
|
+
## Phase 5 — Second-pass review
|
|
138
|
+
|
|
139
|
+
The change touches the session/dispatch family only in the sense that it observes it;
|
|
140
|
+
it holds no authority, gates nothing, and cannot alter connection behaviour, so the
|
|
141
|
+
high-risk trigger list (block/allow decisions, session lifecycle, trust) is not
|
|
142
|
+
engaged. Author-applied lenses, disclosed:
|
|
143
|
+
|
|
144
|
+
**Adversarial — "how would I make this useless?"** By recording to a single slot (a
|
|
145
|
+
flap would overwrite itself) or by letting a write failure kill the handler. Both are
|
|
146
|
+
closed and asserted by tests.
|
|
147
|
+
|
|
148
|
+
**"Did I fix the symptom or the cause?"** Neither — deliberately. This fixes the
|
|
149
|
+
*blindness*, which is a precondition for diagnosing the cause. Stated plainly in §2
|
|
150
|
+
rather than implied.
|
|
151
|
+
|
|
152
|
+
**"Would it have caught the incident?"** It would have recorded the transition and,
|
|
153
|
+
if a displacement occurred, said so at error level with the consequence spelled out.
|
|
154
|
+
It would not have prevented it.
|
|
155
|
+
|
|
156
|
+
**Weakest point:** §2's last item. A durable record that no status surface reads is
|
|
157
|
+
observability only for someone who knows the file exists. I judged the route change
|
|
158
|
+
worth separating to keep this PR's refusal evidence unambiguous, but a reader could
|
|
159
|
+
reasonably call that half a job — which is why it is written down here rather than
|
|
160
|
+
left for them to notice.
|