instar 1.3.835 → 1.3.837

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 (39) hide show
  1. package/dashboard/subscriptions.js +11 -2
  2. package/dist/commands/server.d.ts.map +1 -1
  3. package/dist/commands/server.js +1 -0
  4. package/dist/commands/server.js.map +1 -1
  5. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  6. package/dist/config/ConfigDefaults.js +4 -0
  7. package/dist/config/ConfigDefaults.js.map +1 -1
  8. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  9. package/dist/core/PostUpdateMigrator.js +4 -0
  10. package/dist/core/PostUpdateMigrator.js.map +1 -1
  11. package/dist/core/SpawnAdmission.d.ts +17 -0
  12. package/dist/core/SpawnAdmission.d.ts.map +1 -1
  13. package/dist/core/SpawnAdmission.js +32 -1
  14. package/dist/core/SpawnAdmission.js.map +1 -1
  15. package/dist/core/devGatedFeatures.js +1 -1
  16. package/dist/core/devGatedFeatures.js.map +1 -1
  17. package/dist/core/types.d.ts +2 -0
  18. package/dist/core/types.d.ts.map +1 -1
  19. package/dist/core/types.js.map +1 -1
  20. package/dist/messaging/pending-relay-store.d.ts +21 -0
  21. package/dist/messaging/pending-relay-store.d.ts.map +1 -1
  22. package/dist/messaging/pending-relay-store.js +82 -0
  23. package/dist/messaging/pending-relay-store.js.map +1 -1
  24. package/dist/monitoring/BurnThrottleRunbook.d.ts +5 -1
  25. package/dist/monitoring/BurnThrottleRunbook.d.ts.map +1 -1
  26. package/dist/monitoring/BurnThrottleRunbook.js +40 -0
  27. package/dist/monitoring/BurnThrottleRunbook.js.map +1 -1
  28. package/dist/monitoring/delivery-failure-sentinel.d.ts.map +1 -1
  29. package/dist/monitoring/delivery-failure-sentinel.js +133 -95
  30. package/dist/monitoring/delivery-failure-sentinel.js.map +1 -1
  31. package/package.json +1 -1
  32. package/src/data/builtin-manifest.json +20 -20
  33. package/src/templates/scripts/telegram-reply.sh +25 -0
  34. package/upgrades/1.3.836.md +24 -0
  35. package/upgrades/1.3.837.md +33 -0
  36. package/upgrades/eli16/telegram-recovery-queue-truth.md +12 -0
  37. package/upgrades/side-effects/ownership-gated-spawn-increment-1-4.md +25 -0
  38. package/upgrades/side-effects/telegram-recovery-queue-truth.md +81 -0
  39. package/upgrades/side-effects/throttle-episode-narration-and-subscription-drift-ui.md +43 -0
@@ -88,6 +88,43 @@ export function resolvePendingRelayPath(stateDir, agentId) {
88
88
  export function resolvePendingRelayLockPath(stateDir, agentId) {
89
89
  return path.join(stateDir, 'state', `pending-relay.${sanitizeAgentId(agentId)}.sqlite.lock`);
90
90
  }
91
+ /**
92
+ * Quarantine historical zero-byte stores created before the canonical resolver
93
+ * was shared by the shell, server, and queue route. Rename is atomic within the
94
+ * directory: even if a legacy writer opens the file between classification and
95
+ * rename, any later bytes remain preserved under the quarantine name. Nothing
96
+ * is deleted automatically.
97
+ */
98
+ export function cleanupLegacyEmptyPendingRelayStores(stateDir, agentId, beforeQuarantine) {
99
+ const safe = sanitizeAgentId(agentId);
100
+ const candidates = [
101
+ path.join(stateDir, 'pending-relay.db'),
102
+ path.join(stateDir, `pending-relay.${safe}.sqlite`),
103
+ path.join(stateDir, 'server-data', 'pending-relay.db'),
104
+ path.join(stateDir, 'server-data', `pending-relay.${safe}.sqlite`),
105
+ path.join(stateDir, 'state', 'pending-relay.db'),
106
+ path.join(stateDir, 'state', 'pending-relay.sqlite'),
107
+ path.join(stateDir, 'state', 'pending-relay.sqlite3'),
108
+ ];
109
+ const canonical = resolvePendingRelayPath(stateDir, agentId);
110
+ const quarantined = [];
111
+ for (const candidate of candidates) {
112
+ if (candidate === canonical)
113
+ continue;
114
+ try {
115
+ if (fs.statSync(candidate).size !== 0)
116
+ continue;
117
+ beforeQuarantine?.(candidate);
118
+ const quarantine = `${candidate}.legacy-empty-quarantine-${process.pid}-${Date.now()}`;
119
+ fs.renameSync(candidate, quarantine);
120
+ quarantined.push(quarantine);
121
+ }
122
+ catch {
123
+ // @silent-fallback-ok: missing/non-file/raced candidate; canonical open continues.
124
+ }
125
+ }
126
+ return quarantined;
127
+ }
91
128
  /**
92
129
  * Defensive — the agentId comes from config.json which is operator-controlled
93
130
  * but should not contain path separators; if it ever does, we'd land in a
@@ -110,6 +147,7 @@ export class PendingRelayStore {
110
147
  catch { /* already closed */ } });
111
148
  }
112
149
  static open(agentId, stateDir) {
150
+ cleanupLegacyEmptyPendingRelayStores(stateDir, agentId);
113
151
  const dbPath = resolvePendingRelayPath(stateDir, agentId);
114
152
  fs.mkdirSync(path.dirname(dbPath), { recursive: true });
115
153
  let db;
@@ -354,6 +392,50 @@ export class PendingRelayStore {
354
392
  });
355
393
  return tx();
356
394
  }
395
+ /** Renew an owned claim without permitting a stale owner to steal it back. */
396
+ renewClaim(deliveryId, expectedClaimedBy, newClaimedBy) {
397
+ const result = this.db.prepare(`UPDATE entries SET claimed_by = @newClaimedBy
398
+ WHERE delivery_id = @deliveryId AND state = 'claimed' AND claimed_by = @expectedClaimedBy`).run({ deliveryId, expectedClaimedBy, newClaimedBy });
399
+ return result.changes === 1;
400
+ }
401
+ /**
402
+ * Fenced post-claim transition. Only the worker holding the exact current
403
+ * ownership token may finalize or release the row.
404
+ */
405
+ transitionClaimed(deliveryId, expectedClaimedBy, newState, additionalFields = {}) {
406
+ const tx = this.db.transaction(() => {
407
+ const current = this.db.prepare(`SELECT status_history FROM entries
408
+ WHERE delivery_id = ? AND state = 'claimed' AND claimed_by = ?`).get(deliveryId, expectedClaimedBy);
409
+ if (!current)
410
+ return false;
411
+ let history;
412
+ try {
413
+ const parsed = JSON.parse(current.status_history);
414
+ history = Array.isArray(parsed) ? parsed : [];
415
+ }
416
+ catch {
417
+ history = [];
418
+ }
419
+ history.push({ state: newState, at: new Date().toISOString() });
420
+ const fields = ['state = @state', 'status_history = @history'];
421
+ const params = {
422
+ deliveryId,
423
+ expectedClaimedBy,
424
+ state: newState,
425
+ history: JSON.stringify(history),
426
+ };
427
+ for (const [key, value] of Object.entries(additionalFields)) {
428
+ if (value === undefined)
429
+ continue;
430
+ fields.push(`${key} = @${key}`);
431
+ params[key] = value;
432
+ }
433
+ const result = this.db.prepare(`UPDATE entries SET ${fields.join(', ')}
434
+ WHERE delivery_id = @deliveryId AND state = 'claimed' AND claimed_by = @expectedClaimedBy`).run(params);
435
+ return result.changes === 1;
436
+ });
437
+ return tx();
438
+ }
357
439
  /**
358
440
  * List the rows a restore-purge at `cutoffIso` WOULD delete — so the
359
441
  * caller can make the loss traceable (per-row log + degradation report)
@@ -1 +1 @@
1
- {"version":3,"file":"pending-relay-store.js","sourceRoot":"","sources":["../../src/messaging/pending-relay-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pending-relay-store.js","sourceRoot":"","sources":["../../src/messaging/pending-relay-store.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAC3E,OAAO,EACL,2BAA2B,EAC3B,iCAAiC,GAClC,MAAM,8BAA8B,CAAC;AAEtC;;;;;GAKG;AACH,MAAM,wBAAwB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AA0DzD,yEAAyE;AAEzE,MAAM,MAAM,GAAG;IACb;;;;;;;;;;;;;;;;;KAiBG;IACH,8EAA8E;IAC9E,gFAAgF;CACjF,CAAC;AAEF,2EAA2E;AAC3E,wEAAwE;AACxE,yBAAyB;AACzB,MAAM,WAAW,GAAyC;IACxD,wEAAwE;IACxE,+EAA+E;IAC/E,sEAAsE;IACtE,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,qEAAqE,EAAE;IACjG,2EAA2E;IAC3E,sEAAsE;IACtE,0EAA0E;IAC1E,EAAE,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,sDAAsD,EAAE;CAC1F,CAAC;AAEF,yEAAyE;AAEzE;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAgB,EAAE,OAAe;IACvE,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,iBAAiB,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,QAAgB,EAAE,OAAe;IAC3E,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,iBAAiB,eAAe,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;AAC/F,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,oCAAoC,CAClD,QAAgB,EAChB,OAAe,EACf,gBAA8C;IAE9C,MAAM,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,kBAAkB,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,iBAAiB,IAAI,SAAS,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,kBAAkB,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,iBAAiB,IAAI,SAAS,CAAC;QAClE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,kBAAkB,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,sBAAsB,CAAC;QACpD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,uBAAuB,CAAC;KACtD,CAAC;IACF,MAAM,SAAS,GAAG,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACjC,IAAI,SAAS,KAAK,SAAS;YAAE,SAAS;QACxC,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC;gBAAE,SAAS;YAChD,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC;YAC9B,MAAM,UAAU,GAAG,GAAG,SAAS,4BAA4B,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACvF,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;YACrC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QAAC,MAAM,CAAC;YACP,mFAAmF;QACrF,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,EAAU;IACjC,OAAO,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;AAC7C,CAAC;AAED,yEAAyE;AAEzE,MAAM,OAAO,iBAAiB;IACpB,EAAE,CAAuB;IACzB,IAAI,CAAS;IAErB,YAAoB,EAAwB,EAAE,MAAc;QAC1D,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;QACnB,wEAAwE;QACxE,oBAAoB,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;YAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,OAAe,EAAE,QAAgB;QAC3C,oCAAoC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC1D,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAExD,IAAI,EAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,EAAE,GAAG,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,uCAAuC,MAAM,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CACrG,CAAC;QACJ,CAAC;QAED,qEAAqE;QACrE,wEAAwE;QACxE,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,gFAAgF;QAClF,CAAC;QAED,iEAAiE;QACjE,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAChC,EAAE,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAClC,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;QAEjC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,CAAC;QACD,0BAA0B;QAC1B,KAAK,MAAM,GAAG,IAAI,WAAW,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;oBACxC,MAAM,GAAG,CAAC;gBACZ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,KAAmB;QACzB,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAC5F,MAAM,WAAW,GAAG,KAAK,CAAC,YAAY,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACnE,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC;YACpC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE;SACjE,CAAC,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;;;;;;;;;;SAUG,CACJ,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC;YACtB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI;YACJ,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,IAAI;YAC5B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI;YAClC,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,IAAI;YACpC,cAAc,EAAE,KAAK,CAAC,cAAc,IAAI,IAAI;YAC5C,YAAY,EAAE,WAAW;YACzB,eAAe,EAAE,KAAK,CAAC,eAAe,IAAI,IAAI;YAC9C,cAAc,EAAE,cAAc;YAC9B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAClC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB,IAAI,IAAI;SACjD,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,gBAAgB,CAAC,UAAkB;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,CAAgC,CAAC;QAChE,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED;;;;;OAKG;IACH,wBAAwB,CACtB,OAAe,EACf,QAAgB,EAChB,QAAgB,EAChB,MAAY,IAAI,IAAI,EAAE;QAEtB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;;4CAEsC,CACvC,CAAC;QACF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAgC,CAAC;QAC/E,OAAO,GAAG,IAAI,IAAI,CAAC;IACrB,CAAC;IAED;;;;;;;;;OASG;IACH,UAAU,CACR,UAAkB,EAClB,QAAuB,EACvB,mBAMK,EAAE;QAEP,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,EAAU,EAAE,KAAoB,EAAE,KAA8B,EAAE,EAAE;YAClG,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,0DAA0D,CAAC,CAAC,GAAG,CAAC,EAAE,CAErF,CAAC;YACd,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAC3B,IAAI,OAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAClD,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAEtD,MAAM,MAAM,GAAa,CAAC,gBAAgB,EAAE,kCAAkC,CAAC,CAAC;YAChF,MAAM,MAAM,GAA4B;gBACtC,WAAW,EAAE,EAAE;gBACf,KAAK;gBACL,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aACxC,CAAC;YACF,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,IAAI,CAAC,KAAK,SAAS;oBAAE,SAAS;gBAC9B,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAC5B,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,MAAM,GAAG,GAAG,sBAAsB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC;YACvF,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChD,OAAO,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,gBAAgB,CAAY,CAAC;IAC/D,CAAC;IAED,uCAAuC;IACvC,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC,GAAG,EAAmB,CAAC;QACxF,OAAO,GAAG,CAAC,CAAC,CAAC;IACf,CAAC;IAED;;;;;;;;;;;;;;OAcG;IACH,eAAe,CAAC,MAAc,EAAE,KAAK,GAAG,GAAG;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;;;;;sBAKgB,CACjB,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC;YACd,GAAG,EAAE,MAAM;YACX,KAAK;YACL,WAAW,EAAE,2BAA2B;YACxC,WAAW,EAAE,iCAAiC;SAC/C,CAAsB,CAAC;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,0BAA0B,CAAC,MAAc,EAAE,KAAK,GAAG,GAAG;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;;;;;sBAKgB,CACjB,CAAC;QACF,OAAO,IAAI,CAAC,GAAG,CAAC;YACd,GAAG,EAAE,MAAM;YACX,KAAK;YACL,WAAW,EAAE,2BAA2B;YACxC,WAAW,EAAE,iCAAiC;SAC/C,CAAsB,CAAC;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CACN,UAAkB,EAClB,YAAoB,EACpB,QAA6D;QAE7D,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE;iBACnB,OAAO,CACN;;;;oDAI0C,CAC3C;iBACA,GAAG,CAAC;gBACH,WAAW,EAAE,UAAU;gBACvB,YAAY;gBACZ,aAAa,EAAE,QAAQ,CAAC,KAAK;gBAC7B,iBAAiB,EAAE,QAAQ,CAAC,UAAU;aACvC,CAAC,CAAC;YACL,IAAI,MAAM,CAAC,OAAO,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvC,qEAAqE;YACrE,gEAAgE;YAChE,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE;iBACpB,OAAO,CAAC,0DAA0D,CAAC;iBACnE,GAAG,CAAC,UAAU,CAA2C,CAAC;YAC7D,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,OAAkB,CAAC;gBACvB,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;oBAClD,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAChD,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,GAAG,EAAE,CAAC;gBACf,CAAC;gBACD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBACjE,IAAI,CAAC,EAAE;qBACJ,OAAO,CAAC,gEAAgE,CAAC;qBACzE,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,EAAa,CAAC;IACzB,CAAC;IAED,8EAA8E;IAC9E,UAAU,CAAC,UAAkB,EAAE,iBAAyB,EAAE,YAAoB;QAC5E,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC5B;iGAC2F,CAC5F,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC,CAAC;QACvD,OAAO,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED;;;OAGG;IACH,iBAAiB,CACf,UAAkB,EAClB,iBAAyB,EACzB,QAAuB,EACvB,mBAMK,EAAE;QAEP,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE;YAClC,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC7B;wEACgE,CACjE,CAAC,GAAG,CAAC,UAAU,EAAE,iBAAiB,CAA2C,CAAC;YAC/E,IAAI,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;YAC3B,IAAI,OAAkB,CAAC;YACvB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;gBAClD,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;YAChE,MAAM,MAAM,GAAG,CAAC,gBAAgB,EAAE,2BAA2B,CAAC,CAAC;YAC/D,MAAM,MAAM,GAA4B;gBACtC,UAAU;gBACV,iBAAiB;gBACjB,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;aACjC,CAAC;YACF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC5D,IAAI,KAAK,KAAK,SAAS;oBAAE,SAAS;gBAClC,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC;gBAChC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACtB,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC5B,sBAAsB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;mGACoD,CAC5F,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACd,OAAO,MAAM,CAAC,OAAO,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,EAAa,CAAC;IACzB,CAAC;IAED;;;;;;;;;;OAUG;IACH,kBAAkB,CAChB,SAAiB,EACjB,SAAiB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAQzC,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;;;;;mCAK6B,CAC9B,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAMpD,CAAC;QACH,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACtB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YAC/E,cAAc,EAAE,CAAC,CAAC,eAAe,KAAK,IAAI,IAAI,CAAC,CAAC,eAAe,GAAG,SAAS;SAC5E,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,mBAAmB,CAAC,SAAiB,EAAE,SAAiB,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC9E,MAAM,SAAS,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;;;sGAGgG,CACjG,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1D,OAAO,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,wBAAwB,CAAC,SAAiB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAC1B;;;sCAGgC,CACjC,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC;YACtB,MAAM,EAAE,SAAS;YACjB,WAAW,EAAE,2BAA2B;YACxC,WAAW,EAAE,iCAAiC;SAC/C,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,gDAAgD;IAChD,KAAK;QACH,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;IAED,KAAK;QACH,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;IACH,CAAC;CACF;AAED,iFAAiF;AACjF,SAAS,iBAAiB,CAAC,MAAc;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;IAClD,OAAO,IAAI,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC,CAAC,WAAW,EAAE,CAAC;AACjE,CAAC;AAED,yEAAyE;AAEzE;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,qBAAqB;IACnC,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,CAAC;QACH,YAAY,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC3D,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC;YACH,mBAAmB,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;gBACvC,OAAO,EAAE,qBAAqB;gBAC9B,OAAO,EAAE,6CAA6C;gBACtD,QAAQ,EAAE,0EAA0E;gBACpF,MAAM,EAAE,sFAAsF;gBAC9F,MAAM,EACJ,iEAAiE;oBACjE,kEAAkE;oBAClE,iFAAiF;aACpF,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,8DAA8D;QAChE,CAAC;IACH,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC;QACvC,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACzC,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,MAAM,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChE,IAAI,CAAC;YACH,mBAAmB,CAAC,WAAW,EAAE,CAAC,MAAM,CAAC;gBACvC,OAAO,EAAE,uBAAuB;gBAChC,OAAO,EAAE,kCAAkC;gBAC3C,QAAQ,EAAE,0EAA0E;gBACpF,MAAM,EAAE,kDAAkD,MAAM,EAAE;gBAClE,MAAM,EACJ,mEAAmE;oBACnE,4DAA4D;oBAC5D,gEAAgE;aACnE,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,cAAc;QAChB,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAClC,CAAC"}
@@ -33,9 +33,11 @@ export interface BurnThrottleConfig {
33
33
  autoThrottleOnUnknown: boolean;
34
34
  /** Throttle duration (default 60min). */
35
35
  throttleDurationMs: number;
36
+ /** Quiet period after an episode closes before the same key may open another. */
37
+ notificationCooldownMs: number;
36
38
  }
37
39
  export declare const DEFAULT_BURN_THROTTLE_CONFIG: BurnThrottleConfig;
38
- export type RunbookOutcomeKind = 'alert-only-unknown' | 'alert-only-config-disabled' | 'alert-only-self-attribution' | 'alert-only-snoozed' | 'throttle-installed' | 'throttle-failed';
40
+ export type RunbookOutcomeKind = 'alert-only-unknown' | 'alert-only-config-disabled' | 'alert-only-self-attribution' | 'alert-only-snoozed' | 'throttle-installed' | 'throttle-suppressed-episode' | 'throttle-failed';
39
41
  export interface RunbookOutcome {
40
42
  kind: RunbookOutcomeKind;
41
43
  attributionKey: string;
@@ -74,6 +76,7 @@ export declare class BurnThrottleRunbook {
74
76
  private readonly alertTopicId;
75
77
  private readonly now;
76
78
  private readonly isSnoozed;
79
+ private readonly episodes;
77
80
  constructor(deps: BurnThrottleRunbookDeps);
78
81
  /**
79
82
  * Handle a burn-detection signal. Called from a subscriber hook on
@@ -83,6 +86,7 @@ export declare class BurnThrottleRunbook {
83
86
  * can inspect what happened.
84
87
  */
85
88
  handle(event: DegradationEvent): RunbookOutcome;
89
+ private openEpisode;
86
90
  private fireTelegram;
87
91
  }
88
92
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"BurnThrottleRunbook.d.ts","sourceRoot":"","sources":["../../src/monitoring/BurnThrottleRunbook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,YAAY,EAAE,OAAO,CAAC;IACtB;;;;;;OAMG;IACH,qBAAqB,EAAE,OAAO,CAAC;IAC/B,yCAAyC;IACzC,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,eAAO,MAAM,4BAA4B,EAAE,kBAI1C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,oBAAoB,GACpB,4BAA4B,GAC5B,6BAA6B,GAC7B,oBAAoB,GACpB,oBAAoB,GACpB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,2EAA2E;AAC3E,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1F,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,qFAAqF;IACrF,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC;CACjD;AAED,+DAA+D;AAC/D,eAAO,MAAM,cAAc,0BAA0B,CAAC;AAEtD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;gBAEzC,IAAI,EAAE,uBAAuB;IASzC;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,cAAc;IA4G/C,OAAO,CAAC,YAAY;CAYrB;AAID;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAGrE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAI9D;AAED,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,yGAAyG;AACzG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAazG"}
1
+ {"version":3,"file":"BurnThrottleRunbook.d.ts","sourceRoot":"","sources":["../../src/monitoring/BurnThrottleRunbook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEjE,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,YAAY,EAAE,OAAO,CAAC;IACtB;;;;;;OAMG;IACH,qBAAqB,EAAE,OAAO,CAAC;IAC/B,yCAAyC;IACzC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iFAAiF;IACjF,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED,eAAO,MAAM,4BAA4B,EAAE,kBAK1C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAC1B,oBAAoB,GACpB,4BAA4B,GAC5B,6BAA6B,GAC7B,oBAAoB,GACpB,oBAAoB,GACpB,6BAA6B,GAC7B,iBAAiB,CAAC;AAEtB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,kBAAkB,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,yCAAyC;IACzC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,2EAA2E;AAC3E,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1F,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACrC,qFAAqF;IACrF,YAAY,CAAC,EAAE,mBAAmB,CAAC;IACnC,oCAAoC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CAAC;CACjD;AAED,+DAA+D;AAC/D,eAAO,MAAM,cAAc,0BAA0B,CAAC;AAEtD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAc;IACnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA2B;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwG;gBAErH,IAAI,EAAE,uBAAuB;IASzC;;;;;;OAMG;IACH,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,cAAc;IAkI/C,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,YAAY;CAYrB;AAID;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAGrE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,CAI9D;AAED,oEAAoE;AACpE,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,yGAAyG;AACzG,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAazG"}
@@ -22,6 +22,7 @@ export const DEFAULT_BURN_THROTTLE_CONFIG = {
22
22
  autoThrottle: true,
23
23
  autoThrottleOnUnknown: false,
24
24
  throttleDurationMs: 60 * 60 * 1000,
25
+ notificationCooldownMs: 15 * 60 * 1000,
25
26
  };
26
27
  /** Identity tag the runbook uses when installing throttles. */
27
28
  export const RUNBOOK_ISSUER = 'burn-throttle-runbook';
@@ -32,6 +33,7 @@ export class BurnThrottleRunbook {
32
33
  alertTopicId;
33
34
  now;
34
35
  isSnoozed;
36
+ episodes = new Map();
35
37
  constructor(deps) {
36
38
  this.gate = deps.gate;
37
39
  this.config = { ...DEFAULT_BURN_THROTTLE_CONFIG, ...(deps.config ?? {}) };
@@ -52,6 +54,26 @@ export class BurnThrottleRunbook {
52
54
  const trigger = extractTrigger(event);
53
55
  const decidedAt = new Date(this.now()).toISOString();
54
56
  const signalId = `${event.timestamp}:${attributionKey}`;
57
+ // Narrate state transitions, never detector ticks. Once a throttle episode
58
+ // is open, repeated signals for the same component neither reinstall the
59
+ // throttle nor emit another user-facing notice. The post-close cooldown
60
+ // also absorbs detector lag around the expiry boundary.
61
+ const episode = this.episodes.get(attributionKey);
62
+ if (episode && this.now() < episode.cooldownUntil) {
63
+ return {
64
+ kind: 'throttle-suppressed-episode',
65
+ attributionKey,
66
+ decidedAt,
67
+ trigger,
68
+ reason: this.now() < episode.closesAt
69
+ ? 'Throttle episode is already open; duplicate signal suppressed.'
70
+ : 'Throttle episode recently closed; cooldown signal suppressed.',
71
+ };
72
+ }
73
+ if (episode) {
74
+ clearTimeout(episode.timer);
75
+ this.episodes.delete(attributionKey);
76
+ }
55
77
  // 1. Self-attribution: refuse to throttle the runbook itself, AND emit
56
78
  // a high-severity escalation alert. Per Phase 4 second-pass review §3:
57
79
  // silent swallow is the wrong response here — if the runbook itself
@@ -126,6 +148,7 @@ export class BurnThrottleRunbook {
126
148
  capabilityToken: token,
127
149
  });
128
150
  this.fireTelegram(`${alertText}\n\nI have slowed this component down. It will resume automatically in ${Math.round(this.config.throttleDurationMs / 60000)} minutes, or you can reply STOP to release it sooner.`);
151
+ this.openEpisode(attributionKey, throttle);
129
152
  return {
130
153
  kind: 'throttle-installed',
131
154
  attributionKey,
@@ -146,6 +169,23 @@ export class BurnThrottleRunbook {
146
169
  };
147
170
  }
148
171
  }
172
+ openEpisode(attributionKey, throttle) {
173
+ const closesAt = Date.parse(throttle.expiresAt);
174
+ const delay = Math.max(0, closesAt - this.now());
175
+ const timer = setTimeout(() => {
176
+ const current = this.episodes.get(attributionKey);
177
+ if (!current || current.timer !== timer)
178
+ return;
179
+ this.fireTelegram(`The token-burn slowdown for ${humanize(attributionKey)} has ended automatically. ` +
180
+ 'Normal activity is available again.');
181
+ }, delay);
182
+ timer.unref?.();
183
+ this.episodes.set(attributionKey, {
184
+ closesAt,
185
+ cooldownUntil: closesAt + this.config.notificationCooldownMs,
186
+ timer,
187
+ });
188
+ }
149
189
  fireTelegram(text) {
150
190
  if (!this.sendTelegram)
151
191
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"BurnThrottleRunbook.js","sourceRoot":"","sources":["../../src/monitoring/BurnThrottleRunbook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAoBH,MAAM,CAAC,MAAM,4BAA4B,GAAuB;IAC9D,YAAY,EAAE,IAAI;IAClB,qBAAqB,EAAE,KAAK;IAC5B,kBAAkB,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;CACnC,CAAC;AA0CF,+DAA+D;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG,uBAAuB,CAAC;AAEtD,MAAM,OAAO,mBAAmB;IACb,IAAI,CAAc;IAClB,MAAM,CAAqB;IAC3B,YAAY,CAAkC;IAC9C,YAAY,CAAS;IACrB,GAAG,CAAe;IAClB,SAAS,CAA2B;IAErD,YAAY,IAA6B;QACvC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,EAAE,GAAG,4BAA4B,EAAE,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC;QAC9C,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,KAAuB;QAC5B,MAAM,cAAc,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,cAAc,EAAE,CAAC;QAExD,uEAAuE;QACvE,0EAA0E;QAC1E,uEAAuE;QACvE,wEAAwE;QACxE,sEAAsE;QACtE,yEAAyE;QACzE,0EAA0E;QAC1E,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,cAAc,IAAI,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,YAAY,CACf,6EAA6E;gBAC7E,IAAI,cAAc,6DAA6D;gBAC/E,kFAAkF;gBAClF,sEAAsE,CACvE,CAAC;YACF,OAAO;gBACL,IAAI,EAAE,6BAA6B;gBACnC,cAAc;gBACd,SAAS;gBACT,OAAO;gBACP,MAAM,EAAE,+FAA+F;aACxG,CAAC;QACJ,CAAC;QAED,2EAA2E;QAC3E,MAAM,SAAS,GAAG,gBAAgB,CAAC,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QAEnE,2CAA2C;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC9B,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,4BAA4B;gBAClC,cAAc;gBACd,SAAS;gBACT,OAAO;gBACP,MAAM,EAAE,2EAA2E;aACpF,CAAC;QACJ,CAAC;QAED,sEAAsE;QACtE,wEAAwE;QACxE,+CAA+C;QAC/C,IAAI,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,YAAY,CAAC,GAAG,SAAS,6GAA6G,CAAC,CAAC;YAC7I,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,cAAc;gBACd,SAAS;gBACT,OAAO;gBACP,MAAM,EAAE,6EAA6E;aACtF,CAAC;QACJ,CAAC;QAED,gFAAgF;QAChF,IAAI,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACvE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,cAAc;gBACd,SAAS;gBACT,OAAO;gBACP,MAAM,EAAE,2FAA2F;aACpG,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC;YAC7C,cAAc;YACd,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;YAC1C,MAAM,EAAE,cAAc;YACtB,QAAQ;SACT,CAAC,IAAI,SAAS,CAAC;QAEhB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC;gBACzC,cAAc;gBACd,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,kBAAkB;gBAC1C,MAAM,EAAE,GAAG,OAAO,iEAAiE;gBACnF,MAAM,EAAE,cAAc;gBACtB,QAAQ;gBACR,eAAe,EAAE,KAAK;aACvB,CAAC,CAAC;YACH,IAAI,CAAC,YAAY,CAAC,GAAG,SAAS,0EAA0E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,kBAAkB,GAAG,KAAK,CAAC,uDAAuD,CAAC,CAAC;YACnN,OAAO;gBACL,IAAI,EAAE,oBAAoB;gBAC1B,cAAc;gBACd,SAAS;gBACT,OAAO;gBACP,QAAQ;gBACR,MAAM,EAAE,iCAAiC;aAC1C,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,YAAY,CAAC,GAAG,SAAS,mHAAmH,CAAC,CAAC;YACnJ,OAAO;gBACL,IAAI,EAAE,iBAAiB;gBACvB,cAAc;gBACd,SAAS;gBACT,OAAO;gBACP,MAAM,EAAE,4BAA6B,GAAa,CAAC,OAAO,EAAE;aAC7D,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,IAAY;QAC/B,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QAC/B,IAAI,CAAC;YACH,sEAAsE;YACtE,qEAAqE;YACrE,iEAAiE;YACjE,kBAAkB;YAClB,KAAK,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,uBAAuB;QACzB,CAAC;IACH,CAAC;CACF;AAED,6DAA6D;AAE7D;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAuB;IAC3D,MAAM,CAAC,GAAG,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAuB;IACpD,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACvE,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC;QAAE,OAAO,qBAAqB,CAAC;IACvE,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,YAAY,CAAC,cAAsB;IACjD,OAAO,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,gBAAgB,CAAC,KAAuB,EAAE,cAAsB,EAAE,OAAe;IAC/F,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GACpB,OAAO,KAAK,gBAAgB;QAC1B,CAAC,CAAC,mFAAmF;QACrF,CAAC,CAAC,OAAO,KAAK,qBAAqB;YACnC,CAAC,CAAC,2GAA2G;YAC7G,CAAC,CAAC,oCAAoC,CAAC;IAC3C,OAAO,CACL,aAAa,YAAY,IAAI,gBAAgB,OAAO;QACpD,GAAG,KAAK,CAAC,MAAM,MAAM;QACrB,GAAG,KAAK,CAAC,MAAM,EAAE,CAClB,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,cAAsB;IACtC,IAAI,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,sBAAsB,CAAC;IAC1E,IAAI,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC;IAChE,CAAC;IACD,IAAI,cAAc,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,oBAAoB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACpD,OAAO,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC9C,CAAC;IACD,MAAM,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC5C,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,cAAc,CAAC;AACtD,CAAC"}
1
+ {"version":3,"file":"BurnThrottleRunbook.js","sourceRoot":"","sources":["../../src/monitoring/BurnThrottleRunbook.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"delivery-failure-sentinel.d.ts","sourceRoot":"","sources":["../../src/monitoring/delivery-failure-sentinel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"delivery-failure-sentinel.d.ts","sourceRoot":"","sources":["../../src/monitoring/delivery-failure-sentinel.ts"],"names":[],"mappings":"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"}
@@ -261,8 +261,9 @@ export class DeliveryFailureSentinel extends EventEmitter {
261
261
  const nowIso = new Date(this.deps.now()).toISOString();
262
262
  try {
263
263
  const rows = this.deps.store.selectClaimable(nowIso, 100);
264
- // Filter claimed rows whose lease has not expired AND whose bootId matches
265
- // (otherwise reclaimable).
264
+ // A boot-id change does not itself make an active network send stale.
265
+ // Reclaim only after the timestamped lease expires; the owner renews it
266
+ // while awaiting I/O.
266
267
  return rows.filter((row) => {
267
268
  if (row.state !== 'claimed')
268
269
  return true;
@@ -281,9 +282,7 @@ export class DeliveryFailureSentinel extends EventEmitter {
281
282
  const parts = row.claimed_by.split(':');
282
283
  if (parts.length < 3)
283
284
  return true;
284
- const [bootId, , leaseUntilIso] = [parts[0], parts[1], parts.slice(2).join(':')];
285
- if (bootId !== this.deps.bootId)
286
- return true;
285
+ const leaseUntilIso = parts.slice(2).join(':');
287
286
  const lease = Date.parse(leaseUntilIso);
288
287
  if (Number.isNaN(lease))
289
288
  return true;
@@ -292,98 +291,130 @@ export class DeliveryFailureSentinel extends EventEmitter {
292
291
  async processRow(row) {
293
292
  // Claim the row — write the lease.
294
293
  const leaseUntil = new Date(this.deps.now() + this.cfg.leaseDurationMs).toISOString();
295
- const claimedBy = `${this.deps.bootId}:${process.pid}:${leaseUntil}`;
296
- const claimed = this.deps.store.transition(row.delivery_id, 'claimed', { claimed_by: claimedBy });
294
+ let claimedBy = `${this.deps.bootId}:${process.pid}:${leaseUntil}`;
295
+ // Atomic claim at the drain chokepoint. `transition()` was read-then-write:
296
+ // two sentinel instances that selected the same queued row could both
297
+ // report success and both POST it. CAS binds the claim to the selected
298
+ // state/owner so exactly one drain may send a delivery_id.
299
+ const claimed = this.deps.store.claimCas(row.delivery_id, claimedBy, {
300
+ state: row.state,
301
+ claimed_by: row.claimed_by,
302
+ });
297
303
  if (!claimed) {
298
304
  // Lost the race — another instance grabbed it (shared worktree case).
299
305
  return 'retry';
300
306
  }
301
- // Re-resolve config — operator may have rotated port/token since enqueue.
302
- const cfg = this.deps.readConfig();
303
- // Verify identity via /whoami before any send.
304
- let whoami;
305
- try {
306
- whoami = await this.deps.whoamiCache.get(cfg.port, cfg.authToken, this.deps.configPath, cfg.agentId);
307
- }
308
- catch (err) {
309
- // Network / auth failure → schedule next retry.
310
- return this.handlePolicyDecision(row, evaluatePolicy({
311
- httpCode: 0,
312
- responseBody: err instanceof Error ? err.message.slice(0, 256) : null,
313
- attempts: row.attempts,
314
- timeSinceFirstMs: this.deps.now() - Date.parse(row.attempted_at),
315
- now: this.deps.now,
316
- }));
317
- }
318
- if (whoami.agentId !== cfg.agentId) {
319
- return this.handlePolicyDecision(row, evaluatePolicy({
320
- httpCode: 403,
321
- responseBody: JSON.stringify({ error: 'agent_id_mismatch' }),
322
- attempts: row.attempts,
323
- timeSinceFirstMs: this.deps.now() - Date.parse(row.attempted_at),
324
- now: this.deps.now,
325
- }));
326
- }
327
- // Re-tone-gate the queued text. Apply redaction first so secrets in
328
- // the queued body never reach the tone gate provider (defense-in-
329
- // depth — they shouldn't be there in the first place, but we don't
330
- // want to amplify a leak by sending it to a third-party LLM).
331
- const text = redact(row.text.toString('utf-8'));
332
- const toneResult = await checkToneLocally(this.deps.toneGate, text, {
333
- channel: 'telegram',
334
- });
335
- if (!toneResult.passed) {
336
- return this.finalizeToneGated(row, toneResult.rule);
337
- }
338
- // POST /telegram/reply with the delivery-id header for server-side dedup.
339
- let resp;
307
+ let ownershipLost = false;
308
+ const renew = () => {
309
+ if (ownershipLost)
310
+ return false;
311
+ const nextLease = new Date(this.deps.now() + this.cfg.leaseDurationMs).toISOString();
312
+ const nextToken = `${this.deps.bootId}:${process.pid}:${nextLease}`;
313
+ if (!this.deps.store.renewClaim(row.delivery_id, claimedBy, nextToken)) {
314
+ ownershipLost = true;
315
+ return false;
316
+ }
317
+ claimedBy = nextToken;
318
+ return true;
319
+ };
320
+ const heartbeat = setInterval(renew, Math.max(1, Math.floor(this.cfg.leaseDurationMs / 3)));
321
+ heartbeat.unref();
322
+ const transitionOwned = (state, fields = {}) => !ownershipLost && this.deps.store.transitionClaimed(row.delivery_id, claimedBy, state, fields);
340
323
  try {
341
- resp = await this.deps.postReply(cfg.port, cfg.authToken, cfg.agentId, row.topic_id, text, row.delivery_id, false, row.message_metadata ?? null);
342
- }
343
- catch (err) {
344
- return this.handlePolicyDecision(row, evaluatePolicy({
345
- httpCode: 0,
346
- responseBody: err instanceof Error ? err.message.slice(0, 256) : null,
324
+ // Re-resolve config — operator may have rotated port/token since enqueue.
325
+ const cfg = this.deps.readConfig();
326
+ // Verify identity via /whoami before any send.
327
+ let whoami;
328
+ try {
329
+ whoami = await this.deps.whoamiCache.get(cfg.port, cfg.authToken, this.deps.configPath, cfg.agentId);
330
+ }
331
+ catch (err) {
332
+ // Network / auth failure → schedule next retry.
333
+ return this.handlePolicyDecision(row, evaluatePolicy({
334
+ httpCode: 0,
335
+ responseBody: err instanceof Error ? err.message.slice(0, 256) : null,
336
+ attempts: row.attempts,
337
+ timeSinceFirstMs: this.deps.now() - Date.parse(row.attempted_at),
338
+ now: this.deps.now,
339
+ }), undefined, transitionOwned);
340
+ }
341
+ if (whoami.agentId !== cfg.agentId) {
342
+ return this.handlePolicyDecision(row, evaluatePolicy({
343
+ httpCode: 403,
344
+ responseBody: JSON.stringify({ error: 'agent_id_mismatch' }),
345
+ attempts: row.attempts,
346
+ timeSinceFirstMs: this.deps.now() - Date.parse(row.attempted_at),
347
+ now: this.deps.now,
348
+ }), undefined, transitionOwned);
349
+ }
350
+ // Re-tone-gate the queued text. Apply redaction first so secrets in
351
+ // the queued body never reach the tone gate provider (defense-in-
352
+ // depth — they shouldn't be there in the first place, but we don't
353
+ // want to amplify a leak by sending it to a third-party LLM).
354
+ const text = redact(row.text.toString('utf-8'));
355
+ const toneResult = await checkToneLocally(this.deps.toneGate, text, {
356
+ channel: 'telegram',
357
+ });
358
+ if (!toneResult.passed) {
359
+ return this.finalizeToneGated(row, transitionOwned, toneResult.rule);
360
+ }
361
+ // POST /telegram/reply with the delivery-id header for server-side dedup.
362
+ let resp;
363
+ try {
364
+ if (!renew())
365
+ return 'retry';
366
+ resp = await this.deps.postReply(cfg.port, cfg.authToken, cfg.agentId, row.topic_id, text, row.delivery_id, false, row.message_metadata ?? null);
367
+ }
368
+ catch (err) {
369
+ return this.handlePolicyDecision(row, evaluatePolicy({
370
+ httpCode: 0,
371
+ responseBody: err instanceof Error ? err.message.slice(0, 256) : null,
372
+ attempts: row.attempts + 1,
373
+ timeSinceFirstMs: this.deps.now() - Date.parse(row.attempted_at),
374
+ now: this.deps.now,
375
+ }), undefined, transitionOwned);
376
+ }
377
+ const decision = evaluatePolicy({
378
+ httpCode: resp.status,
379
+ responseBody: resp.body.slice(0, 1024),
347
380
  attempts: row.attempts + 1,
348
381
  timeSinceFirstMs: this.deps.now() - Date.parse(row.attempted_at),
349
382
  now: this.deps.now,
350
- }));
351
- }
352
- const decision = evaluatePolicy({
353
- httpCode: resp.status,
354
- responseBody: resp.body.slice(0, 1024),
355
- attempts: row.attempts + 1,
356
- timeSinceFirstMs: this.deps.now() - Date.parse(row.attempted_at),
357
- now: this.deps.now,
358
- });
359
- if (decision.action === 'finalize-success') {
360
- // Update last-delivery time for per-topic rate cap.
361
- this.lastTopicDelivery.set(row.topic_id, this.deps.now());
362
- this.deps.store.transition(row.delivery_id, 'delivered-recovered', {
363
- attempts: row.attempts + 1,
364
- http_code: resp.status,
365
- error_body: null,
366
383
  });
367
- this.emit('sentinel:recovered', { delivery_id: row.delivery_id, topic_id: row.topic_id });
368
- // Fire-and-forget recovered-marker follow-up (~2s later, gated on 200).
369
- const shortId = row.delivery_id.slice(0, 8);
370
- setTimeout(() => {
371
- const marker = renderRecoveredMarker(shortId);
372
- // System-template send — bypass tone gate via header. Failure
373
- // is logged and dropped (spec §3e), never queued.
374
- this.deps.postReply(cfg.port, cfg.authToken, cfg.agentId, row.topic_id, marker, row.delivery_id, true)
375
- .catch((err) => {
376
- console.warn(`[delivery-sentinel] recovered-marker send failed for ${shortId}:`, err);
377
- });
378
- }, 2000).unref();
379
- return 'recovered';
384
+ if (decision.action === 'finalize-success') {
385
+ // Update last-delivery time for per-topic rate cap.
386
+ this.lastTopicDelivery.set(row.topic_id, this.deps.now());
387
+ if (!transitionOwned('delivered-recovered', {
388
+ attempts: row.attempts + 1,
389
+ http_code: resp.status,
390
+ error_body: null,
391
+ }))
392
+ return 'retry';
393
+ this.emit('sentinel:recovered', { delivery_id: row.delivery_id, topic_id: row.topic_id });
394
+ // Fire-and-forget recovered-marker follow-up (~2s later, gated on 200).
395
+ const shortId = row.delivery_id.slice(0, 8);
396
+ setTimeout(() => {
397
+ const marker = renderRecoveredMarker(shortId);
398
+ // System-template send — bypass tone gate via header. Failure
399
+ // is logged and dropped (spec §3e), never queued.
400
+ this.deps.postReply(cfg.port, cfg.authToken, cfg.agentId, row.topic_id, marker, row.delivery_id, true)
401
+ .catch((err) => {
402
+ console.warn(`[delivery-sentinel] recovered-marker send failed for ${shortId}:`, err);
403
+ });
404
+ }, 2000).unref();
405
+ return 'recovered';
406
+ }
407
+ return this.handlePolicyDecision(row, decision, resp.status, transitionOwned);
408
+ }
409
+ finally {
410
+ clearInterval(heartbeat);
380
411
  }
381
- return this.handlePolicyDecision(row, decision, resp.status);
382
412
  }
383
- async finalizeToneGated(row, rule) {
384
- this.deps.store.transition(row.delivery_id, 'delivered-tone-gated', {
413
+ async finalizeToneGated(row, transitionOwned, rule) {
414
+ if (!transitionOwned('delivered-tone-gated', {
385
415
  attempts: row.attempts + 1,
386
- });
416
+ }))
417
+ return 'retry';
387
418
  this.emit('sentinel:tone-gated', { delivery_id: row.delivery_id, topic_id: row.topic_id, rule });
388
419
  // Send the tone-gate-rejection meta-notice on the original topic.
389
420
  if (this.templatesValid) {
@@ -397,36 +428,43 @@ export class DeliveryFailureSentinel extends EventEmitter {
397
428
  }
398
429
  return 'tone-gated';
399
430
  }
400
- async handlePolicyDecision(row, decision, httpCode) {
431
+ async handlePolicyDecision(row, decision, httpCode, transitionOwned) {
401
432
  switch (decision.action) {
402
433
  case 'finalize-success':
403
434
  // Handled inline in processRow.
404
435
  return 'recovered';
405
436
  case 'finalize-tone-gated':
406
- return this.finalizeToneGated(row);
437
+ if (!transitionOwned)
438
+ return 'retry';
439
+ return this.finalizeToneGated(row, transitionOwned);
407
440
  case 'finalize-ambiguous':
408
- this.deps.store.transition(row.delivery_id, 'delivered-ambiguous', {
441
+ if (!transitionOwned?.('delivered-ambiguous', {
409
442
  attempts: row.attempts + 1,
410
443
  http_code: httpCode ?? null,
411
- });
444
+ }))
445
+ return 'retry';
412
446
  return 'ambiguous';
413
447
  case 'retry':
414
- this.deps.store.transition(row.delivery_id, 'queued', {
448
+ if (!transitionOwned?.('queued', {
415
449
  attempts: row.attempts + 1,
416
450
  next_attempt_at: decision.nextAttemptAt ?? null,
417
451
  claimed_by: null,
418
452
  http_code: httpCode ?? null,
419
- });
453
+ }))
454
+ return 'retry';
420
455
  return 'retry';
421
456
  case 'escalate':
422
- return this.escalate(row, decision);
457
+ if (!transitionOwned)
458
+ return 'retry';
459
+ return this.escalate(row, decision, transitionOwned);
423
460
  }
424
461
  }
425
- async escalate(row, decision) {
462
+ async escalate(row, decision, transitionOwned) {
426
463
  const category = reasonToCategory(decision.reason);
427
- this.deps.store.transition(row.delivery_id, 'escalated', {
464
+ if (!transitionOwned('escalated', {
428
465
  attempts: row.attempts + 1,
429
- });
466
+ }))
467
+ return 'retry';
430
468
  this.emit('sentinel:escalated', { delivery_id: row.delivery_id, topic_id: row.topic_id, category });
431
469
  if (!this.templatesValid) {
432
470
  this.recordEscalationFailure();