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.
Files changed (58) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +119 -13
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +15 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  8. package/dist/core/PostUpdateMigrator.js +14 -0
  9. package/dist/core/PostUpdateMigrator.js.map +1 -1
  10. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  11. package/dist/core/devGatedFeatures.js +6 -0
  12. package/dist/core/devGatedFeatures.js.map +1 -1
  13. package/dist/core/types.d.ts +20 -0
  14. package/dist/core/types.d.ts.map +1 -1
  15. package/dist/core/types.js.map +1 -1
  16. package/dist/data/standards-guard-index.json +1 -1
  17. package/dist/data/standards-guard-index.meta.json +2 -2
  18. package/dist/data/standards-registry.meta.json +1 -1
  19. package/dist/monitoring/A2ARedeliverySentinel.d.ts +145 -6
  20. package/dist/monitoring/A2ARedeliverySentinel.d.ts.map +1 -1
  21. package/dist/monitoring/A2ARedeliverySentinel.js +451 -11
  22. package/dist/monitoring/A2ARedeliverySentinel.js.map +1 -1
  23. package/dist/scaffold/templates.d.ts.map +1 -1
  24. package/dist/scaffold/templates.js +4 -0
  25. package/dist/scaffold/templates.js.map +1 -1
  26. package/dist/server/routes.d.ts.map +1 -1
  27. package/dist/server/routes.js +65 -4
  28. package/dist/server/routes.js.map +1 -1
  29. package/dist/testing/selfActionRegistry.d.ts.map +1 -1
  30. package/dist/testing/selfActionRegistry.js +71 -0
  31. package/dist/testing/selfActionRegistry.js.map +1 -1
  32. package/dist/threadline/A2ADeliveryTracker.d.ts +55 -1
  33. package/dist/threadline/A2ADeliveryTracker.d.ts.map +1 -1
  34. package/dist/threadline/A2ADeliveryTracker.js +97 -5
  35. package/dist/threadline/A2ADeliveryTracker.js.map +1 -1
  36. package/dist/threadline/ThreadlineMCPServer.d.ts +15 -0
  37. package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
  38. package/dist/threadline/ThreadlineMCPServer.js +3 -0
  39. package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
  40. package/dist/threadline/client/ThreadlineClient.d.ts +47 -0
  41. package/dist/threadline/client/ThreadlineClient.d.ts.map +1 -1
  42. package/dist/threadline/client/ThreadlineClient.js +93 -0
  43. package/dist/threadline/client/ThreadlineClient.js.map +1 -1
  44. package/dist/threadline/mcp-http-client.d.ts.map +1 -1
  45. package/dist/threadline/mcp-http-client.js +2 -0
  46. package/dist/threadline/mcp-http-client.js.map +1 -1
  47. package/dist/threadline/peerDark.d.ts +165 -0
  48. package/dist/threadline/peerDark.d.ts.map +1 -0
  49. package/dist/threadline/peerDark.js +204 -0
  50. package/dist/threadline/peerDark.js.map +1 -0
  51. package/package.json +1 -1
  52. package/src/data/builtin-manifest.json +63 -63
  53. package/src/data/standards-guard-index.json +1 -1
  54. package/src/data/standards-guard-index.meta.json +2 -2
  55. package/src/data/standards-registry.meta.json +1 -1
  56. package/src/scaffold/templates.ts +4 -0
  57. package/upgrades/1.3.1340.md +32 -0
  58. 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. The state machine guarantees escalate-once: `markEscalated` moves a
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.cfg.enabled) {
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, ttl ${this.cfg.ttlMs}ms, maxAttempts ${this.cfg.maxAttempts})`);
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: redeliver overdue messages under the attempt cap, escalate the rest. */
130
+ /** One sweep: the legacy redelivery loop (its gate), then the §3 dark pass (its gate). */
72
131
  async tick() {
73
- if (!this.cfg.enabled) {
74
- return { disabled: true, overdue: 0, redelivered: 0, escalated: 0, escalatedPeers: [] };
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
- const nowMs = this.now();
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 { disabled: false, overdue: overdue.length, redelivered, escalated: escalatedCount, escalatedPeers };
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":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AA8BzD,MAAM,CAAC,MAAM,6BAA6B,GAAwB;IAChE,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM;IACvC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAQ,yCAAyC;IAC1E,WAAW,EAAE,CAAC;IACd,aAAa,EAAE,CAAC,GAAG,EAAE,GAAG,IAAI,EAAK,eAAe;IAChD,kBAAkB,EAAE,EAAE;CACvB,CAAC;AAqBF,MAAM,OAAO,qBAAqB;IACf,GAAG,CAAsB;IACzB,IAAI,CAAoB;IACxB,GAAG,CAAe;IAClB,GAAG,CAA0D;IACtE,KAAK,GAA0B,IAAI,CAAC;IAE5C,YAAY,IAAuB,EAAE,MAAoC,EAAE;QACzE,IAAI,CAAC,GAAG,GAAG,aAAa,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAC7D,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI;YACrB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC/C,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QACD,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;YAC5B,KAAK,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC9C,yEAAyE;gBACzE,oEAAoE;gBACpE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACnF,CAAC,CAAC,CAAC;QACL,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU;YAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/D,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,GAAG,CAAC,eAAe,WAAW,IAAI,CAAC,GAAG,CAAC,KAAK,mBAAmB,IAAI,CAAC,GAAG,CAAC,WAAW,GAAG,CAAC,CAAC;IAC5H,CAAC;IAED,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAAC,CAAC;IACnE,CAAC;IAED,sFAAsF;IACtF,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACtB,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC;QAC1F,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrE,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,gFAAgF;QAChF,MAAM,eAAe,GAAG,IAAI,GAAG,EAA8B,CAAC;QAE9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBAC3C,kFAAkF;gBAClF,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;gBAChF,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACrD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACjB,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;gBACxC,SAAS;YACX,CAAC;YACD,qEAAqE;YACrE,IAAI,WAAW,IAAI,IAAI,CAAC,GAAG,CAAC,kBAAkB;gBAAE,SAAS;YACzD,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACxB,IAAI,CAAC;oBACH,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC/D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,uEAAuE;oBACvE,0EAA0E;oBAC1E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,wBAAwB,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/I,CAAC;YACH,CAAC;YACD,0EAA0E;YAC1E,4EAA4E;YAC5E,4EAA4E;YAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;YACxF,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5D,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;YACzF,IAAI,QAAQ;gBAAE,WAAW,EAAE,CAAC;QAC9B,CAAC;QAED,yEAAyE;QACzE,MAAM,cAAc,GAAa,EAAE,CAAC;QACpC,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,eAAe,EAAE,CAAC;YAC7C,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC;YAC9B,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC/E,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7F,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;gBACzE,IAAI,CAAC;oBACH,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;wBAC7C,KAAK,EAAE,SAAS,QAAQ,aAAa,IAAI,CAAC,MAAM,yBAAyB;wBACzE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,kBAAkB,QAAQ,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,oCAAoC,IAAI,WAAW,IAAI,CAAC,GAAG,CAAC,WAAW,2IAA2I,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;wBACpV,QAAQ,EAAE,QAAQ;wBAClB,MAAM,EAAE,kBAAkB,MAAM,EAAE;qBACnC,CAAC,CAAC,CAAC;gBACN,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,yEAAyE;oBACzE,6EAA6E;oBAC7E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACzH,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,WAAW,IAAI,cAAc,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,OAAO,CAAC,MAAM,aAAa,WAAW,iBAAiB,cAAc,qBAAqB,cAAc,CAAC,MAAM,UAAU,CAAC,CAAC;QACpJ,CAAC;QACD,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;IAC9G,CAAC;CACF"}
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,CAgyDR;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"}
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.