clementine-agent 1.0.16 → 1.0.17

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.
@@ -175,7 +175,20 @@ export function computeBrokenJobs(now = Date.now()) {
175
175
  const lastRunMs = Date.parse(lastEntry.startedAt);
176
176
  // Always consult the breaker state — a stuck breaker is the primary
177
177
  // signal for "job has been silently broken for days".
178
- const cb = lastCircuitBreakerEvent(jobName);
178
+ let cb = lastCircuitBreakerEvent(jobName);
179
+ // Clear a "stuck" breaker flag if we see an ok run AFTER the last
180
+ // breaker engagement. The scheduler only logs a circuit-recovery
181
+ // event when consecutiveErrors >= 5 at recovery time — but a
182
+ // successful manual/probe run resets consecutiveErrors to 0 first,
183
+ // so the recovery branch never fires and the advisor log keeps the
184
+ // breaker appearing engaged forever. Fix: use run-log truth instead.
185
+ if (cb.engagedAt) {
186
+ const engagedMs = Date.parse(cb.engagedAt);
187
+ const hasOkSinceBreaker = entries.some(e => e.status === 'ok' && Date.parse(e.startedAt) > engagedMs);
188
+ if (hasOkSinceBreaker) {
189
+ cb = { engagedAt: null, lastOpinion: cb.lastOpinion };
190
+ }
191
+ }
179
192
  if (!cb.engagedAt && Number.isFinite(lastRunMs) && lastRunMs < dormantCutoffMs) {
180
193
  continue;
181
194
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clementine-agent",
3
- "version": "1.0.16",
3
+ "version": "1.0.17",
4
4
  "description": "Clementine — Personal AI Assistant (TypeScript)",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",