instar 1.3.1339 → 1.3.1340
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 +119 -13
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +15 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +14 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +6 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/core/types.d.ts +20 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.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/monitoring/A2ARedeliverySentinel.d.ts +145 -6
- package/dist/monitoring/A2ARedeliverySentinel.d.ts.map +1 -1
- package/dist/monitoring/A2ARedeliverySentinel.js +451 -11
- package/dist/monitoring/A2ARedeliverySentinel.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +4 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +65 -4
- package/dist/server/routes.js.map +1 -1
- package/dist/testing/selfActionRegistry.d.ts.map +1 -1
- package/dist/testing/selfActionRegistry.js +71 -0
- package/dist/testing/selfActionRegistry.js.map +1 -1
- package/dist/threadline/A2ADeliveryTracker.d.ts +55 -1
- package/dist/threadline/A2ADeliveryTracker.d.ts.map +1 -1
- package/dist/threadline/A2ADeliveryTracker.js +97 -5
- package/dist/threadline/A2ADeliveryTracker.js.map +1 -1
- package/dist/threadline/ThreadlineMCPServer.d.ts +15 -0
- package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
- package/dist/threadline/ThreadlineMCPServer.js +3 -0
- package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
- package/dist/threadline/client/ThreadlineClient.d.ts +47 -0
- package/dist/threadline/client/ThreadlineClient.d.ts.map +1 -1
- package/dist/threadline/client/ThreadlineClient.js +93 -0
- package/dist/threadline/client/ThreadlineClient.js.map +1 -1
- package/dist/threadline/mcp-http-client.d.ts.map +1 -1
- package/dist/threadline/mcp-http-client.js +2 -0
- package/dist/threadline/mcp-http-client.js.map +1 -1
- package/dist/threadline/peerDark.d.ts +165 -0
- package/dist/threadline/peerDark.d.ts.map +1 -0
- package/dist/threadline/peerDark.js +204 -0
- package/dist/threadline/peerDark.js.map +1 -0
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +63 -63
- 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/src/scaffold/templates.ts +4 -0
- package/upgrades/1.3.1340.md +32 -0
- package/upgrades/side-effects/a2a-peer-dark-reporting.md +149 -0
|
@@ -9,18 +9,44 @@
|
|
|
9
9
|
* backoff) or, once retries are exhausted, surfaces ONE aggregated, operator-
|
|
10
10
|
* visible escalation per peer — so a peer going dark is impossible to miss.
|
|
11
11
|
*
|
|
12
|
+
* REWORKED (docs/specs/a2a-single-agent-identity.md §3 — honest sender-side
|
|
13
|
+
* reporting of a send that stays queued). The per-MESSAGE escalation had no
|
|
14
|
+
* resolve, no cooldown and no per-peer state, and its item id carried an
|
|
15
|
+
* episode stamp. Under the `peerDark` gate the operator-facing trigger is now
|
|
16
|
+
* PER PEER: `dark && queuedCount > 0 && selfHealExhausted`, where `dark` for the
|
|
17
|
+
* RAISE is computed over the same pool-scope acks/inbounds the RESOLVE reads (a
|
|
18
|
+
* peer that answered on my other machine is not dark); the item id is the
|
|
19
|
+
* deterministic `a2a-peer-dark:<agent>:<peerFp>` (rows live on whichever machine
|
|
20
|
+
* carried the send, so a lease move must not strand an item); the item RESOLVES
|
|
21
|
+
* from pool-scope evidence newer than its raise time, naming the messages that
|
|
22
|
+
* expired unacknowledged; and each peer carries a 12 h cooldown. Before blaming
|
|
23
|
+
* the peer the sentinel heals its own side — ONLY on the awake machine (a
|
|
24
|
+
* standby's relay is disconnected by design): reconnect a dropped relay, refresh
|
|
25
|
+
* the presence map once, run the identity self-check; two passes 40 s apart.
|
|
26
|
+
* When MY relay is not connected, ONE aggregated item replaces per-peer items.
|
|
27
|
+
* Dry-run (the default) logs would-raise rows to logs/a2a-peer-dark.jsonl and
|
|
28
|
+
* raises nothing. The legacy redelivery loop is unchanged and keeps its own
|
|
29
|
+
* gate; its per-message escalation item is raised only when the peer-dark path
|
|
30
|
+
* is NOT on (today's behaviour is byte-identical with the new gate dark).
|
|
31
|
+
*
|
|
12
32
|
* Signal-vs-authority: this is a SIGNAL CONSUMER feeding existing surfaces
|
|
13
33
|
* (the relay client for redelivery, the Attention queue for escalation). It owns
|
|
14
34
|
* NO blocking authority — it never gates a send or a receive; it only re-attempts
|
|
15
|
-
* and reports.
|
|
16
|
-
* row out of `awaiting-ack`, so `findOverdue` never returns it again (no
|
|
17
|
-
* re-escalation, no cooldown log needed).
|
|
35
|
+
* and reports.
|
|
18
36
|
*
|
|
19
37
|
* Modeled on CollaborationRedriveEngine (the sibling redrive/escalate engine):
|
|
20
38
|
* injected deps for testability, per-tick caps, setInterval+unref lifecycle,
|
|
21
39
|
* disabled-by-default (it sends + escalates, so it ships dark and is opt-in).
|
|
22
40
|
*/
|
|
23
41
|
import { mergeDefaults } from '../core/mergeDefaults.js';
|
|
42
|
+
import { DEFAULT_PEER_DARK_COOLDOWN_MS, DEFAULT_QUEUED_DARK_AFTER_MS, buildPeerDarkItemBody, buildPeerDarkResolveLine, peerDarkItemId, peerLabel, relayUnreachableItemId, queuedDarkAfterMsFor, PRESENCE_RELAY_DOWN, } from '../threadline/peerDark.js';
|
|
43
|
+
export const DEFAULT_A2A_PEER_DARK_CONFIG = {
|
|
44
|
+
enabled: false,
|
|
45
|
+
dryRun: true,
|
|
46
|
+
queuedDarkAfterMs: DEFAULT_QUEUED_DARK_AFTER_MS,
|
|
47
|
+
cooldownMs: DEFAULT_PEER_DARK_COOLDOWN_MS,
|
|
48
|
+
healPassDelayMs: 40_000,
|
|
49
|
+
};
|
|
24
50
|
export const DEFAULT_A2A_REDELIVERY_CONFIG = {
|
|
25
51
|
enabled: false,
|
|
26
52
|
sweepIntervalMs: 15 * 60 * 1000, // 15m
|
|
@@ -29,14 +55,37 @@ export const DEFAULT_A2A_REDELIVERY_CONFIG = {
|
|
|
29
55
|
backoffBaseMs: 5 * 60 * 1000, // 5m, doubling
|
|
30
56
|
maxRedrivesPerTick: 10,
|
|
31
57
|
};
|
|
58
|
+
const EMPTY = {
|
|
59
|
+
disabled: true, overdue: 0, redelivered: 0, escalated: 0, escalatedPeers: [],
|
|
60
|
+
darkPeers: [], darkRaised: [], darkResolved: [], aggregateRaised: false,
|
|
61
|
+
};
|
|
62
|
+
function newest(...isos) {
|
|
63
|
+
let best = Number.NEGATIVE_INFINITY;
|
|
64
|
+
for (const v of isos) {
|
|
65
|
+
if (typeof v !== 'string')
|
|
66
|
+
continue;
|
|
67
|
+
const t = Date.parse(v);
|
|
68
|
+
if (!Number.isNaN(t) && t > best)
|
|
69
|
+
best = t;
|
|
70
|
+
}
|
|
71
|
+
return best;
|
|
72
|
+
}
|
|
32
73
|
export class A2ARedeliverySentinel {
|
|
33
74
|
cfg;
|
|
75
|
+
peerDark;
|
|
34
76
|
deps;
|
|
35
77
|
now;
|
|
36
78
|
log;
|
|
37
79
|
timer = null;
|
|
80
|
+
ticking = false;
|
|
81
|
+
/** Open per-peer dark episodes (restart: rebuilt from `attentionState`). */
|
|
82
|
+
episodes = new Map();
|
|
83
|
+
/** Last raise per peer (ms) — the in-process half of the cooldown. */
|
|
84
|
+
lastRaiseAt = new Map();
|
|
85
|
+
aggregateOpen = false;
|
|
38
86
|
constructor(deps, cfg = {}) {
|
|
39
87
|
this.cfg = mergeDefaults(DEFAULT_A2A_REDELIVERY_CONFIG, cfg);
|
|
88
|
+
this.peerDark = mergeDefaults(DEFAULT_A2A_PEER_DARK_CONFIG, cfg.peerDark);
|
|
40
89
|
this.deps = deps;
|
|
41
90
|
this.now = deps.now ?? (() => Date.now());
|
|
42
91
|
this.log = deps.log ?? {
|
|
@@ -44,10 +93,18 @@ export class A2ARedeliverySentinel {
|
|
|
44
93
|
warn: (m) => console.warn(`[A2ARedelivery] ${m}`),
|
|
45
94
|
};
|
|
46
95
|
}
|
|
96
|
+
/** The §3 path is LIVE: items and sentences are produced (enabled, not dry-run). */
|
|
97
|
+
get peerDarkLive() {
|
|
98
|
+
return this.peerDark.enabled && !this.peerDark.dryRun;
|
|
99
|
+
}
|
|
100
|
+
/** Either gate arms the sweep (§3.2 i). */
|
|
101
|
+
get armed() {
|
|
102
|
+
return this.cfg.enabled || this.peerDark.enabled;
|
|
103
|
+
}
|
|
47
104
|
start() {
|
|
48
105
|
if (this.timer)
|
|
49
106
|
return;
|
|
50
|
-
if (!this.
|
|
107
|
+
if (!this.armed) {
|
|
51
108
|
this.log.log('disabled; sweep NOT armed');
|
|
52
109
|
return;
|
|
53
110
|
}
|
|
@@ -60,7 +117,9 @@ export class A2ARedeliverySentinel {
|
|
|
60
117
|
}, this.cfg.sweepIntervalMs);
|
|
61
118
|
if (typeof this.timer.unref === 'function')
|
|
62
119
|
this.timer.unref();
|
|
63
|
-
this.log.log(`armed (sweep ${this.cfg.sweepIntervalMs}ms,
|
|
120
|
+
this.log.log(`armed (sweep ${this.cfg.sweepIntervalMs}ms, redelivery ${this.cfg.enabled ? 'on' : 'off'}, ` +
|
|
121
|
+
`peer-dark ${this.peerDark.enabled ? (this.peerDark.dryRun ? 'dry-run' : 'LIVE') : 'off'}, ` +
|
|
122
|
+
`ttl ${this.cfg.ttlMs}ms, maxAttempts ${this.cfg.maxAttempts})`);
|
|
64
123
|
}
|
|
65
124
|
stop() {
|
|
66
125
|
if (this.timer) {
|
|
@@ -68,12 +127,36 @@ export class A2ARedeliverySentinel {
|
|
|
68
127
|
this.timer = null;
|
|
69
128
|
}
|
|
70
129
|
}
|
|
71
|
-
/** One sweep:
|
|
130
|
+
/** One sweep: the legacy redelivery loop (its gate), then the §3 dark pass (its gate). */
|
|
72
131
|
async tick() {
|
|
73
|
-
if (!this.
|
|
74
|
-
return {
|
|
132
|
+
if (!this.armed)
|
|
133
|
+
return { ...EMPTY };
|
|
134
|
+
if (this.ticking)
|
|
135
|
+
return { ...EMPTY, disabled: false };
|
|
136
|
+
this.ticking = true;
|
|
137
|
+
try {
|
|
138
|
+
const nowMs = this.now();
|
|
139
|
+
const legacy = this.cfg.enabled ? await this.redeliveryPass(nowMs) : null;
|
|
140
|
+
const dark = this.peerDark.enabled ? await this.darkPass(nowMs) : null;
|
|
141
|
+
return {
|
|
142
|
+
disabled: false,
|
|
143
|
+
overdue: legacy?.overdue ?? 0,
|
|
144
|
+
redelivered: legacy?.redelivered ?? 0,
|
|
145
|
+
escalated: legacy?.escalated ?? 0,
|
|
146
|
+
escalatedPeers: legacy?.escalatedPeers ?? [],
|
|
147
|
+
darkPeers: dark?.darkPeers ?? [],
|
|
148
|
+
darkRaised: dark?.darkRaised ?? [],
|
|
149
|
+
darkResolved: dark?.darkResolved ?? [],
|
|
150
|
+
aggregateRaised: dark?.aggregateRaised ?? false,
|
|
151
|
+
...(dark?.healSkipped ? { healSkipped: dark.healSkipped } : {}),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
this.ticking = false;
|
|
75
156
|
}
|
|
76
|
-
|
|
157
|
+
}
|
|
158
|
+
// ── Legacy per-message redelivery (unchanged behaviour under its own gate) ──
|
|
159
|
+
async redeliveryPass(nowMs) {
|
|
77
160
|
const overdue = this.deps.tracker.findOverdue(this.cfg.ttlMs, nowMs);
|
|
78
161
|
let redelivered = 0;
|
|
79
162
|
// Peer → messages escalated this tick (for one aggregated attention item each).
|
|
@@ -111,12 +194,18 @@ export class A2ARedeliverySentinel {
|
|
|
111
194
|
redelivered++;
|
|
112
195
|
}
|
|
113
196
|
// ONE aggregated attention item per dark peer (P17 — never per message).
|
|
197
|
+
// With the §3 peer-dark path LIVE (enabled and not dry-run), the per-peer
|
|
198
|
+
// dark item IS the operator notice (deterministic id, resolve, cooldown) —
|
|
199
|
+
// the legacy stamped item is not raised beside it. In dry-run the dark path
|
|
200
|
+
// raises nothing, so the legacy item still goes out (no silent window). The
|
|
201
|
+
// state change (markEscalated) happens either way, and an escalated row
|
|
202
|
+
// never suppresses a later dark episode (§3.2).
|
|
114
203
|
const escalatedPeers = [];
|
|
115
204
|
let escalatedCount = 0;
|
|
116
205
|
for (const [peerFp, msgs] of escalatedByPeer) {
|
|
117
206
|
escalatedCount += msgs.length;
|
|
118
207
|
escalatedPeers.push(peerFp);
|
|
119
|
-
if (this.deps.raiseAttention) {
|
|
208
|
+
if (this.deps.raiseAttention && !this.peerDarkLive) {
|
|
120
209
|
const peerName = msgs.find((m) => m.peerName)?.peerName ?? peerFp.slice(0, 12);
|
|
121
210
|
const oldest = msgs.reduce((a, b) => (Date.parse(a.sentAt) <= Date.parse(b.sentAt) ? a : b));
|
|
122
211
|
const ageH = Math.round((nowMs - Date.parse(oldest.sentAt)) / 3_600_000);
|
|
@@ -138,7 +227,358 @@ export class A2ARedeliverySentinel {
|
|
|
138
227
|
if (redelivered || escalatedCount) {
|
|
139
228
|
this.log.log(`sweep: ${overdue.length} overdue, ${redelivered} redelivered, ${escalatedCount} escalated across ${escalatedPeers.length} peer(s)`);
|
|
140
229
|
}
|
|
141
|
-
return {
|
|
230
|
+
return { overdue: overdue.length, redelivered, escalated: escalatedCount, escalatedPeers };
|
|
231
|
+
}
|
|
232
|
+
// ── §3 per-peer dark pass ──────────────────────────────────────────────
|
|
233
|
+
audit(row) {
|
|
234
|
+
try {
|
|
235
|
+
const full = { ...row, kind: row.kind, ts: new Date(this.now()).toISOString(), dryRun: this.peerDark.dryRun };
|
|
236
|
+
this.deps.audit?.(full);
|
|
237
|
+
}
|
|
238
|
+
catch (err) {
|
|
239
|
+
// @silent-fallback-ok: the audit writer must never break the sweep; logged.
|
|
240
|
+
this.log.warn(`audit failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
get agentId() {
|
|
244
|
+
return this.deps.agentId ?? 'agent';
|
|
245
|
+
}
|
|
246
|
+
relayState() {
|
|
247
|
+
try {
|
|
248
|
+
return this.deps.relayState?.() ?? 'not-configured';
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return 'not-configured';
|
|
252
|
+
} // @silent-fallback-ok — an unreadable relay state reads as not-configured: no aggregation, no reconnect (the safe direction)
|
|
253
|
+
}
|
|
254
|
+
isAwake() {
|
|
255
|
+
try {
|
|
256
|
+
return this.deps.isAwake?.() ?? true;
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return false;
|
|
260
|
+
} // @silent-fallback-ok — an unreadable standby fact reads as standby: no heal, no raise (never a reconnect that could displace the holder)
|
|
261
|
+
}
|
|
262
|
+
localHealth(nowMs) {
|
|
263
|
+
return this.deps.tracker.allPeerHealth({ nowMs, queuedDarkAfterMsFor: (fp) => queuedDarkAfterMsFor(this.peerDark, fp) });
|
|
264
|
+
}
|
|
265
|
+
/** Pool rows for a peer; a failing pool read answers [] (local evidence only — fail toward the local verdict). */
|
|
266
|
+
async poolRows(peerFp) {
|
|
267
|
+
if (!this.deps.poolPeerHealth)
|
|
268
|
+
return [];
|
|
269
|
+
try {
|
|
270
|
+
const rows = await this.deps.poolPeerHealth(peerFp);
|
|
271
|
+
return Array.isArray(rows) ? rows : [];
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
// @silent-fallback-ok: a failing pool read is AUDITED (error row) and degrades
|
|
275
|
+
// to the local verdict — never to silence, never to a raise it cannot justify.
|
|
276
|
+
this.audit({ kind: 'error', peerFp, reason: `pool-read-failed:${err instanceof Error ? err.message : String(err)}` });
|
|
277
|
+
return [];
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Newest sign of life for a peer across local + pool rows (ms, -Infinity when
|
|
282
|
+
* none). An ack or an inbound only: a relay `delivered` verdict alone shows a
|
|
283
|
+
* connection took the message, not that the peer answered, so it never
|
|
284
|
+
* resolves a dark item.
|
|
285
|
+
*/
|
|
286
|
+
static lifeAt(local, pool) {
|
|
287
|
+
let best = newest(local?.lastAckedAt, local?.lastInboundAt);
|
|
288
|
+
for (const r of pool)
|
|
289
|
+
best = Math.max(best, newest(r.lastAckedAt, r.lastInboundAt));
|
|
290
|
+
return best;
|
|
291
|
+
}
|
|
292
|
+
/** Rebuild an episode after a restart from the durable item state. */
|
|
293
|
+
episodeFor(peerFp, health) {
|
|
294
|
+
const existing = this.episodes.get(peerFp);
|
|
295
|
+
if (existing)
|
|
296
|
+
return existing;
|
|
297
|
+
const itemId = peerDarkItemId(this.agentId, peerFp);
|
|
298
|
+
const state = this.deps.attentionState?.(itemId);
|
|
299
|
+
if (state && state.status === 'OPEN') {
|
|
300
|
+
const raisedAtMs = newest(state.updatedAt, state.createdAt);
|
|
301
|
+
const ep = {
|
|
302
|
+
itemId,
|
|
303
|
+
raisedAtMs: Number.isFinite(raisedAtMs) ? raisedAtMs : this.now(),
|
|
304
|
+
darkSince: health?.darkSince ?? null,
|
|
305
|
+
peerName: health?.peerName ?? null,
|
|
306
|
+
};
|
|
307
|
+
this.episodes.set(peerFp, ep);
|
|
308
|
+
return ep;
|
|
309
|
+
}
|
|
310
|
+
return null;
|
|
311
|
+
}
|
|
312
|
+
/** Cooldown (§3.2 iv): in-process last raise, else the durable item's last update. */
|
|
313
|
+
inCooldown(peerFp, nowMs) {
|
|
314
|
+
const last = this.lastRaiseAt.get(peerFp);
|
|
315
|
+
if (last !== undefined && nowMs - last < this.peerDark.cooldownMs)
|
|
316
|
+
return true;
|
|
317
|
+
const state = this.deps.attentionState?.(peerDarkItemId(this.agentId, peerFp));
|
|
318
|
+
if (state && state.status !== 'OPEN') {
|
|
319
|
+
const t = newest(state.updatedAt);
|
|
320
|
+
if (Number.isFinite(t) && nowMs - t < this.peerDark.cooldownMs)
|
|
321
|
+
return true;
|
|
322
|
+
}
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
async resolveEpisode(peerFp, ep, nowMs, reason) {
|
|
326
|
+
const expired = ep.darkSince ? this.deps.tracker.expiredUnacknowledgedSince(peerFp, ep.darkSince) : 0;
|
|
327
|
+
const line = buildPeerDarkResolveLine({ peerFp, peerName: ep.peerName }, expired);
|
|
328
|
+
this.episodes.delete(peerFp);
|
|
329
|
+
if (this.peerDark.dryRun) {
|
|
330
|
+
this.audit({ kind: 'would-resolve', peerFp, itemId: ep.itemId, expiredUnacknowledged: expired, reason });
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
try {
|
|
334
|
+
await Promise.resolve(this.deps.resolveAttention?.(ep.itemId, line));
|
|
335
|
+
this.audit({ kind: 'resolved', peerFp, itemId: ep.itemId, expiredUnacknowledged: expired, reason });
|
|
336
|
+
}
|
|
337
|
+
catch (err) {
|
|
338
|
+
// @silent-fallback-ok: a failed resolve is retried next tick (the episode is
|
|
339
|
+
// rebuilt from the still-OPEN item). Logged + audited.
|
|
340
|
+
this.episodes.set(peerFp, ep);
|
|
341
|
+
this.audit({ kind: 'error', peerFp, itemId: ep.itemId, reason: `resolve-failed:${err instanceof Error ? err.message : String(err)}` });
|
|
342
|
+
}
|
|
343
|
+
void nowMs;
|
|
344
|
+
}
|
|
345
|
+
/** The presence read for an audit row; a missing or throwing reader is `relay-down` (my side). */
|
|
346
|
+
presenceOf(peerFp) {
|
|
347
|
+
try {
|
|
348
|
+
const full = this.deps.peerPresence?.(peerFp);
|
|
349
|
+
if (full)
|
|
350
|
+
return full;
|
|
351
|
+
if (this.deps.peerConnectedNow) {
|
|
352
|
+
// The boolean-only reader cannot say why it is unknown; never guess a side.
|
|
353
|
+
return { connectedNow: this.deps.peerConnectedNow(peerFp) ?? null, connectedNowReason: null, connectedAsOf: null };
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
catch { /* @silent-fallback-ok — an unreadable presence map is audited as unknown, never a guessed boolean */ }
|
|
357
|
+
return PRESENCE_RELAY_DOWN;
|
|
358
|
+
}
|
|
359
|
+
async raiseEpisode(peerFp, h, nowMs) {
|
|
360
|
+
const itemId = peerDarkItemId(this.agentId, peerFp);
|
|
361
|
+
const presence = this.presenceOf(peerFp);
|
|
362
|
+
const row = { peerFp, itemId, queuedCount: h.queuedCount, darkSince: h.darkSince, ...presence };
|
|
363
|
+
if (this.peerDark.dryRun) {
|
|
364
|
+
this.audit({ kind: 'would-raise', ...row });
|
|
365
|
+
this.lastRaiseAt.set(peerFp, nowMs);
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
const body = buildPeerDarkItemBody({ peerFp, peerName: h.peerName }, h.queuedCount, h.darkSince, h.handedUnackedCount);
|
|
369
|
+
try {
|
|
370
|
+
await Promise.resolve(this.deps.raiseAttention?.({
|
|
371
|
+
id: itemId,
|
|
372
|
+
title: `Messages to ${peerLabel(peerFp, h.peerName)} are stuck (${h.queuedCount} queued)`,
|
|
373
|
+
body,
|
|
374
|
+
priority: 'medium',
|
|
375
|
+
source: `a2a-peer-dark:${peerFp}`,
|
|
376
|
+
}));
|
|
377
|
+
this.episodes.set(peerFp, { itemId, raisedAtMs: nowMs, darkSince: h.darkSince, peerName: h.peerName });
|
|
378
|
+
this.lastRaiseAt.set(peerFp, nowMs);
|
|
379
|
+
this.audit({ kind: 'raised', ...row });
|
|
380
|
+
}
|
|
381
|
+
catch (err) {
|
|
382
|
+
// @silent-fallback-ok: a failed raise is retried next tick. Logged + audited.
|
|
383
|
+
this.audit({ kind: 'error', ...row, reason: `raise-failed:${err instanceof Error ? err.message : String(err)}` });
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
async darkPass(nowMs) {
|
|
387
|
+
const out = { darkPeers: [], darkRaised: [], darkResolved: [], aggregateRaised: false, healSkipped: undefined };
|
|
388
|
+
let health;
|
|
389
|
+
try {
|
|
390
|
+
health = this.localHealth(nowMs);
|
|
391
|
+
}
|
|
392
|
+
catch (err) {
|
|
393
|
+
// Ledger unreadable → `dark: unknown`: no item, one audit row (Evidence table).
|
|
394
|
+
this.audit({ kind: 'error', reason: `ledger-unreadable:${err instanceof Error ? err.message : String(err)}` });
|
|
395
|
+
return out;
|
|
396
|
+
}
|
|
397
|
+
const byFp = new Map(health.map((h) => [h.peerFp, h]));
|
|
398
|
+
// 1. Resolve: every open episode whose peer shows life (local or pool) newer than the raise.
|
|
399
|
+
const openFps = new Set(this.episodes.keys());
|
|
400
|
+
for (const h of health)
|
|
401
|
+
if (this.episodeFor(h.peerFp, h))
|
|
402
|
+
openFps.add(h.peerFp);
|
|
403
|
+
for (const fp of openFps) {
|
|
404
|
+
const ep = this.episodes.get(fp);
|
|
405
|
+
if (!ep)
|
|
406
|
+
continue;
|
|
407
|
+
const pool = await this.poolRows(fp);
|
|
408
|
+
const life = A2ARedeliverySentinel.lifeAt(byFp.get(fp), pool);
|
|
409
|
+
if (life > ep.raisedAtMs) {
|
|
410
|
+
await this.resolveEpisode(fp, ep, nowMs, 'life-after-raise');
|
|
411
|
+
out.darkResolved.push(fp);
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
// 2. Candidates: locally dark with queued rows.
|
|
415
|
+
const candidates = health.filter((h) => h.dark && h.queuedCount > 0);
|
|
416
|
+
const awake = this.isAwake();
|
|
417
|
+
const relay = this.relayState();
|
|
418
|
+
// 3. Local cause first: my relay is not connected → heal (awake only), then ONE aggregate.
|
|
419
|
+
if (relay === 'disconnected' || relay === 'displaced') {
|
|
420
|
+
if (!awake) {
|
|
421
|
+
out.healSkipped = 'standby';
|
|
422
|
+
this.audit({ kind: 'skipped', reason: 'standby', relayState: relay, peers: candidates.length });
|
|
423
|
+
return out;
|
|
424
|
+
}
|
|
425
|
+
try {
|
|
426
|
+
await Promise.resolve(this.deps.reconnectRelay?.());
|
|
427
|
+
this.audit({ kind: 'heal', reason: 'reconnect-relay', relayState: relay });
|
|
428
|
+
}
|
|
429
|
+
catch (err) {
|
|
430
|
+
this.audit({ kind: 'error', reason: `reconnect-failed:${err instanceof Error ? err.message : String(err)}` });
|
|
431
|
+
}
|
|
432
|
+
const after = this.relayState();
|
|
433
|
+
if (after !== 'connected') {
|
|
434
|
+
if (candidates.length > 0) {
|
|
435
|
+
const messages = candidates.reduce((n, h) => n + h.queuedCount, 0);
|
|
436
|
+
out.aggregateRaised = true;
|
|
437
|
+
await this.raiseAggregate(candidates.length, messages, after, nowMs);
|
|
438
|
+
}
|
|
439
|
+
// Per-peer items are suppressed until the relay is back (§3.2).
|
|
440
|
+
this.audit({ kind: 'skipped', reason: 'relay-not-connected', relayState: after, peers: candidates.length });
|
|
441
|
+
return out;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
// Resolve the aggregate once the relay is back — including a durable OPEN
|
|
445
|
+
// item from before a restart (the in-process flag alone would miss it).
|
|
446
|
+
if (relay === 'connected' && (this.aggregateOpen || this.aggregateItemOpen()))
|
|
447
|
+
await this.resolveAggregate();
|
|
448
|
+
if (candidates.length === 0)
|
|
449
|
+
return out;
|
|
450
|
+
// 4. Pool-scope dark for the RAISE: a peer that answered on my other machine is not dark.
|
|
451
|
+
const poolDark = [];
|
|
452
|
+
for (const h of candidates) {
|
|
453
|
+
const pool = await this.poolRows(h.peerFp);
|
|
454
|
+
const poolLife = pool.length ? Math.max(...pool.map((r) => newest(r.lastAckedAt, r.lastInboundAt))) : Number.NEGATIVE_INFINITY;
|
|
455
|
+
const sinceMs = h.darkSince ? Date.parse(h.darkSince) : Number.POSITIVE_INFINITY;
|
|
456
|
+
if (poolLife > sinceMs) {
|
|
457
|
+
this.audit({ kind: 'pool-cleared', peerFp: h.peerFp, darkSince: h.darkSince, queuedCount: h.queuedCount });
|
|
458
|
+
const ep = this.episodes.get(h.peerFp);
|
|
459
|
+
if (ep && poolLife > ep.raisedAtMs) {
|
|
460
|
+
await this.resolveEpisode(h.peerFp, ep, nowMs, 'pool-life');
|
|
461
|
+
out.darkResolved.push(h.peerFp);
|
|
462
|
+
}
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
poolDark.push(h);
|
|
466
|
+
}
|
|
467
|
+
if (poolDark.length === 0)
|
|
468
|
+
return out;
|
|
469
|
+
// 5. Self-heal before notify (§3.3) — awake only; two passes 40 s apart.
|
|
470
|
+
if (!awake) {
|
|
471
|
+
out.healSkipped = 'standby';
|
|
472
|
+
out.darkPeers = poolDark.map((h) => h.peerFp);
|
|
473
|
+
this.audit({ kind: 'skipped', reason: 'standby', peers: poolDark.length });
|
|
474
|
+
return out;
|
|
475
|
+
}
|
|
476
|
+
const healed = await this.heal(nowMs);
|
|
477
|
+
if (healed === 'split') {
|
|
478
|
+
out.darkPeers = poolDark.map((h) => h.peerFp);
|
|
479
|
+
this.audit({ kind: 'superseded', reason: 'identity-split', peers: poolDark.length });
|
|
480
|
+
return out;
|
|
481
|
+
}
|
|
482
|
+
// Second pass: re-read after the wait; a peer that cleared gets no item.
|
|
483
|
+
const after = new Map(this.localHealth(this.now()).map((h) => [h.peerFp, h]));
|
|
484
|
+
for (const before of poolDark) {
|
|
485
|
+
const h = after.get(before.peerFp);
|
|
486
|
+
if (!h || !h.dark || h.queuedCount === 0) {
|
|
487
|
+
this.audit({ kind: 'heal', peerFp: before.peerFp, reason: 'cleared-during-heal' });
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
out.darkPeers.push(h.peerFp);
|
|
491
|
+
if (this.episodes.has(h.peerFp))
|
|
492
|
+
continue; // already raised, still open
|
|
493
|
+
if (this.inCooldown(h.peerFp, nowMs)) {
|
|
494
|
+
this.audit({ kind: 'cooldown', peerFp: h.peerFp, queuedCount: h.queuedCount, darkSince: h.darkSince });
|
|
495
|
+
continue;
|
|
496
|
+
}
|
|
497
|
+
await this.raiseEpisode(h.peerFp, h, this.now());
|
|
498
|
+
out.darkRaised.push(h.peerFp);
|
|
499
|
+
}
|
|
500
|
+
return out;
|
|
501
|
+
}
|
|
502
|
+
/** §3.3 steps 2–3, then the inter-pass wait. */
|
|
503
|
+
async heal(nowMs) {
|
|
504
|
+
let refreshed = null;
|
|
505
|
+
try {
|
|
506
|
+
refreshed = (await Promise.resolve(this.deps.refreshPresence?.())) ?? null;
|
|
507
|
+
}
|
|
508
|
+
catch (err) {
|
|
509
|
+
this.audit({ kind: 'error', reason: `refresh-presence-failed:${err instanceof Error ? err.message : String(err)}` });
|
|
510
|
+
}
|
|
511
|
+
let selfCheck = 'unknown';
|
|
512
|
+
try {
|
|
513
|
+
selfCheck = (await Promise.resolve(this.deps.identitySelfCheck?.())) ?? 'unknown';
|
|
514
|
+
}
|
|
515
|
+
catch (err) {
|
|
516
|
+
this.audit({ kind: 'error', reason: `self-check-failed:${err instanceof Error ? err.message : String(err)}` });
|
|
517
|
+
}
|
|
518
|
+
this.audit({ kind: 'heal', reason: 'pass-1', presenceRefreshed: refreshed, selfCheck });
|
|
519
|
+
if (selfCheck === 'split')
|
|
520
|
+
return 'split';
|
|
521
|
+
const sleep = this.deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
522
|
+
try {
|
|
523
|
+
await sleep(this.peerDark.healPassDelayMs);
|
|
524
|
+
}
|
|
525
|
+
catch { /* @silent-fallback-ok: a cancelled wait just means pass 2 runs now */ }
|
|
526
|
+
this.audit({ kind: 'heal', reason: 'pass-2', elapsedMs: this.now() - nowMs });
|
|
527
|
+
return 'ok';
|
|
528
|
+
}
|
|
529
|
+
async raiseAggregate(peers, messages, relayState, nowMs) {
|
|
530
|
+
const itemId = relayUnreachableItemId(this.agentId);
|
|
531
|
+
if (this.peerDark.dryRun) {
|
|
532
|
+
this.audit({ kind: 'would-raise-aggregate', itemId, peers, messages, relayState });
|
|
533
|
+
return;
|
|
534
|
+
}
|
|
535
|
+
if (this.aggregateOpen)
|
|
536
|
+
return;
|
|
537
|
+
const state = this.deps.attentionState?.(itemId);
|
|
538
|
+
if (state && state.status === 'OPEN') {
|
|
539
|
+
this.aggregateOpen = true;
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
542
|
+
try {
|
|
543
|
+
await Promise.resolve(this.deps.raiseAttention?.({
|
|
544
|
+
id: itemId,
|
|
545
|
+
title: 'Agent relay unreachable from this machine',
|
|
546
|
+
body: `relay unreachable from this machine; ${peers} peer${peers === 1 ? '' : 's'}, ${messages} message${messages === 1 ? '' : 's'} queued. Reconnect was attempted; per-peer notices are held until the relay is back.`,
|
|
547
|
+
priority: 'medium',
|
|
548
|
+
source: 'a2a-peer-dark:relay',
|
|
549
|
+
}));
|
|
550
|
+
this.aggregateOpen = true;
|
|
551
|
+
this.audit({ kind: 'raised-aggregate', itemId, peers, messages, relayState });
|
|
552
|
+
}
|
|
553
|
+
catch (err) {
|
|
554
|
+
this.audit({ kind: 'error', itemId, reason: `aggregate-raise-failed:${err instanceof Error ? err.message : String(err)}` });
|
|
555
|
+
}
|
|
556
|
+
void nowMs;
|
|
557
|
+
}
|
|
558
|
+
/** Durable state of the aggregate item (restart-safe). */
|
|
559
|
+
aggregateItemOpen() {
|
|
560
|
+
if (this.peerDark.dryRun)
|
|
561
|
+
return false;
|
|
562
|
+
const state = this.deps.attentionState?.(relayUnreachableItemId(this.agentId));
|
|
563
|
+
return state?.status === 'OPEN';
|
|
564
|
+
}
|
|
565
|
+
async resolveAggregate() {
|
|
566
|
+
const itemId = relayUnreachableItemId(this.agentId);
|
|
567
|
+
this.aggregateOpen = false;
|
|
568
|
+
if (this.peerDark.dryRun)
|
|
569
|
+
return;
|
|
570
|
+
try {
|
|
571
|
+
await Promise.resolve(this.deps.resolveAttention?.(itemId, 'Relay connection is back; per-peer checks resume.'));
|
|
572
|
+
this.audit({ kind: 'resolved-aggregate', itemId });
|
|
573
|
+
}
|
|
574
|
+
catch (err) {
|
|
575
|
+
this.aggregateOpen = true;
|
|
576
|
+
this.audit({ kind: 'error', itemId, reason: `aggregate-resolve-failed:${err instanceof Error ? err.message : String(err)}` });
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
/** Test/observability read: open per-peer episodes. */
|
|
580
|
+
openEpisodes() {
|
|
581
|
+
return [...this.episodes.entries()].map(([peerFp, e]) => ({ peerFp, itemId: e.itemId, raisedAt: new Date(e.raisedAtMs).toISOString() }));
|
|
142
582
|
}
|
|
143
583
|
}
|
|
144
584
|
//# sourceMappingURL=A2ARedeliverySentinel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"A2ARedeliverySentinel.js","sourceRoot":"","sources":["../../src/monitoring/A2ARedeliverySentinel.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"A2ARedeliverySentinel.js","sourceRoot":"","sources":["../../src/monitoring/A2ARedeliverySentinel.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/scaffold/templates.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAgG/D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2E/F;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2B1D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,EAC5B,WAAW,GAAE,OAAe,GAC3B,MAAM,CAoyDR;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,OAAO,EACpB,WAAW,GAAE,OAAe,GAC3B,MAAM,CAyUR;AAED,4FAA4F;AAC5F,eAAO,MAAM,6BAA6B,mDAAmD,CAAC;AAE9F;+EAC+E;AAC/E,eAAO,MAAM,6BAA6B,qvBAAquB,CAAC;AAEhxB;;+DAE+D;AAC/D,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD;AAED,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C;AAED;;;wBAGwB;AACxB,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;+DAE+D;AAC/D,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED;;2DAE2D;AAC3D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;+DAE+D;AAC/D,wBAAgB,8BAA8B,IAAI,MAAM,CAEvD"}
|
|
@@ -2012,6 +2012,10 @@ When a direct send to an agent on this machine may have reached it before I fell
|
|
|
2012
2012
|
|
|
2013
2013
|
When this machine is a standby and another of my machines holds my relay connection, my sends go out through that machine. \`deliveryPath: 'forwarded'\` and \`forwardedTo\` say so; \`relayStatus\` is the real relay verdict, and \`unconfirmed\` means unknown: I do not resend. \`reply\` is null. A reply to a send made from a topic arrives in that topic's session; a reply to a send with no topic arrives on the machine named in \`forwardedTo\`, in its Threadline hub. **When to use** (PROACTIVE): a user asks which machine carried a message, or where a reply went → read \`forwardedTo\`, \`replyArrivesIn\` and \`GET /threadline/peers/health?scope=pool\`.
|
|
2014
2014
|
|
|
2015
|
+
### A2A dark peers (did my message arrive?)
|
|
2016
|
+
|
|
2017
|
+
A peer is \`dark\` when my own delivery ledger shows messages to it queued at the relay, unconfirmed, or expired for hours with nothing back — no acknowledgement and no inbound since. A relay \`delivered\` verdict alone does NOT clear it: it shows only that something holding the peer's address took the message, not that the peer read it. Messages the relay queued and later handed over stay counted until the peer acknowledges or replies (\`handedUnackedCount\`). It is a proxy read from my ledger: it means "nothing from this peer for N h" and cannot by itself tell offline from a wrong address. A send to a dark peer answers with \`peerDark\` (\`since\`, \`queuedCount\`, \`expiresAt\`, \`connectedNow\`, \`connectedNowReason\`, \`connectedAsOf\`) beside \`relayStatus\`; \`connectedNow\` is the presence map's answer (\`true\` / \`false\` / \`null\` = unknown — never a fresh discover on the send path). When it is \`null\`, \`connectedNowReason\` says why: \`no-row\` (the relay gave me no record of this peer), \`relay-down\` (my own relay is not connected — my side, not theirs) or \`stale\` (my record is too old to trust). \`connectedAsOf\` is when that record was written, so "connected" always means "as of N minutes ago", never "right now". \`GET /threadline/peers/health\` and the per-peer route (\`?scope=pool\` across my machines) carry \`dark\`, \`darkSince\`, \`queuedCount\`, \`connectedNow\`, \`connectedNowReason\`, \`connectedAsOf\`. The wait before a peer counts as dark is 2 h by default and can be set for one peer by its fingerprint (\`threadline.peerDarkNotice.perPeer\`, e.g. 30 min for a peer that normally answers in minutes). Before blaming the peer I read my own \`relay.state\` first: a disconnected sender makes every peer look queued. The operator hears about it ONCE per peer (item \`a2a-peer-dark:<agent>:<peer>\`, 12 h cooldown) only after the awake machine reconnected its relay, refreshed the presence map and re-checked; a peer that answered on any of my machines is not dark, and the item resolves naming the messages that expired unacknowledged. Ships dry-run (\`threadline.peerDarkNotice\`): the fields are live, the worded sentence and the item wait for \`dryRun: false\`. **When to use** (PROACTIVE): a user asks "did <peer> get my message?" → read the send's \`relayStatus\` AND \`peerDark\`; "is <peer> there?" → \`GET /threadline/peers/<fingerprint>/health\` → \`dark\`, \`darkSince\`, \`queuedCount\`, \`connectedNow\`. It may be offline, or listening under a different address — I say which evidence I have, never "nothing will arrive".
|
|
2018
|
+
|
|
2015
2019
|
### A2A local-route trust
|
|
2016
2020
|
|
|
2017
2021
|
Messages from another agent on this machine arrive on a direct route that used to treat every sender as \`verified\`, while the same sender over the relay is \`untrusted\` unless I hold a trust profile for it. With \`threadline.localRouteTrust\` on, the direct route looks the sender up in the same trust profiles and applies the same rule: a sender with no profile may only ping. It starts in watch-only mode (\`dryRun\`, the default): every message is delivered as before, and each one that would be refused is logged (\`[relay-agent-trust] would-refuse\`) and counted. With \`dryRun: false\` such a message is refused before it is recorded, with HTTP 403 \`{ error: 'insufficient-trust', refused: true }\`; the sender then falls back to the relay, which judges the message again under its own rules and may accept it. Live on a development agent, dark on the fleet (omitted \`enabled\`). With no trust manager (relay off, or a relay standby) it does nothing and counts that. Counters and the current mode: authed \`/health\` → \`threadline.localRouteTrust\`. **When to use** (PROACTIVE): before turning \`dryRun\` off, read \`wouldRefuse\` — each count is a working same-machine conversation that would stop; grant those senders trust first (\`threadline_trust\`). A same-machine agent says its message was refused with \`insufficient-trust\` → grant it trust, or check the mode.
|