clawdoctor 0.4.2 → 0.4.4

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/audit.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export declare const AUDIT_PATH: string;
2
2
  export type AuditTier = 'green' | 'yellow';
3
- export type AuditResult = 'success' | 'failed' | 'dry-run' | 'pending';
3
+ export type AuditResult = 'success' | 'failed' | 'dry-run' | 'pending' | 'cooldown';
4
4
  export interface AuditEntry {
5
5
  timestamp: string;
6
6
  healer: string;
@@ -1 +1 @@
1
- {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,QAA2C,CAAC;AAEnE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC3C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;AAEvE,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAGnD;AAED,wBAAgB,cAAc,CAAC,KAAK,SAAK,GAAG,UAAU,EAAE,CAavD"}
1
+ {"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,UAAU,QAA2C,CAAC;AAEnE,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAC3C,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;AAEpF,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,WAAW,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAGnD;AAED,wBAAgB,cAAc,CAAC,KAAK,SAAK,GAAG,UAAU,EAAE,CAavD"}
@@ -1,6 +1,12 @@
1
1
  import { BaseHealer, HealResult } from './base.js';
2
2
  export declare class CronHealer extends BaseHealer {
3
3
  readonly name = "CronHealer";
4
+ private failureCounts;
5
+ private lastRetryTime;
6
+ private static readonly RETRY_COOLDOWN_MS;
7
+ private static readonly AUTO_RETRY_THRESHOLD;
8
+ private static readonly APPROVAL_THRESHOLD;
4
9
  heal(context: Record<string, unknown>): Promise<HealResult>;
10
+ resetFailureCount(cronName: string): void;
5
11
  }
6
12
  //# sourceMappingURL=cron.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/healers/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAmBnD,qBAAa,UAAW,SAAQ,UAAU;IACxC,QAAQ,CAAC,IAAI,gBAAgB;IAEvB,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;CAqGlE"}
1
+ {"version":3,"file":"cron.d.ts","sourceRoot":"","sources":["../../src/healers/cron.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAmBnD,qBAAa,UAAW,SAAQ,UAAU;IACxC,QAAQ,CAAC,IAAI,gBAAgB;IAG7B,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,aAAa,CAAkC;IAEvD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAkB;IAC3D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,oBAAoB,CAAK;IACjD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAK;IAEzC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAgIjE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;CAI1C"}
@@ -19,20 +19,32 @@ function isTransientError(errorMsg) {
19
19
  }
20
20
  class CronHealer extends base_js_1.BaseHealer {
21
21
  name = 'CronHealer';
22
+ // Track our own consecutive failure count per cron (independent of OpenClaw's counter)
23
+ failureCounts = new Map();
24
+ lastRetryTime = new Map();
25
+ static RETRY_COOLDOWN_MS = 10 * 60 * 1000; // 10 min between retries
26
+ static AUTO_RETRY_THRESHOLD = 3; // retry after 3 consecutive detections
27
+ static APPROVAL_THRESHOLD = 6; // ask user after 6 consecutive detections
22
28
  async heal(context) {
23
29
  const cronName = context.cronName ?? 'unknown';
24
- const consecutiveErrors = context.consecutiveErrors ?? 0;
30
+ const openclawConsecutive = context.consecutiveErrors ?? 0;
25
31
  const lastError = context.lastError ?? '';
32
+ const lastRunStatus = context.lastRunStatus ?? '';
26
33
  const lastRun = context.lastRun ?? 'unknown';
27
34
  const dryRun = this.isEffectiveDryRun(this.config.healers.cronRetry.dryRun);
28
- // Yellow tier: 5+ consecutive errors, ask via Telegram
29
- if (consecutiveErrors >= 5) {
35
+ // Track our own failure count
36
+ const currentCount = (this.failureCounts.get(cronName) ?? 0) + 1;
37
+ this.failureCounts.set(cronName, currentCount);
38
+ // Use the higher of OpenClaw's count or our own
39
+ const consecutiveErrors = Math.max(openclawConsecutive, currentCount);
40
+ // Yellow tier: persistent failures, ask via Telegram
41
+ if (consecutiveErrors >= CronHealer.APPROVAL_THRESHOLD) {
30
42
  if (dryRun) {
31
43
  this.writeAudit('cron-ask', cronName, 'yellow', 'dry-run');
32
44
  return {
33
45
  success: true,
34
46
  action: `dry-run: would send Telegram approval for '${cronName}'`,
35
- message: `[DRY RUN] Would request approval for cron '${cronName}' (${consecutiveErrors} errors)`,
47
+ message: `[DRY RUN] Would request approval for cron '${cronName}' (${consecutiveErrors} failures detected)`,
36
48
  tier: 'yellow',
37
49
  };
38
50
  }
@@ -40,7 +52,7 @@ class CronHealer extends base_js_1.BaseHealer {
40
52
  const result = {
41
53
  success: true,
42
54
  action: `requested approval for cron '${cronName}'`,
43
- message: `Cron '${cronName}' has ${consecutiveErrors} consecutive errors. Approval requested.`,
55
+ message: `Cron '${cronName}' has failed ${consecutiveErrors} times. Approval requested.`,
44
56
  details: { cronName, consecutiveErrors, lastError, lastRun },
45
57
  tier: 'yellow',
46
58
  requiresApproval: true,
@@ -53,60 +65,80 @@ class CronHealer extends base_js_1.BaseHealer {
53
65
  await this.recordHeal('CronWatcher', result, 'cron_approval_requested');
54
66
  return result;
55
67
  }
56
- // Green tier: re-enable if it was auto-disabled due to transient errors
57
- const transient = isTransientError(lastError);
58
- if (consecutiveErrors >= 3 && transient) {
68
+ // Green tier: auto-retry after threshold, with cooldown
69
+ if (consecutiveErrors >= CronHealer.AUTO_RETRY_THRESHOLD) {
70
+ const lastRetry = this.lastRetryTime.get(cronName) ?? 0;
71
+ const now = Date.now();
72
+ if (now - lastRetry < CronHealer.RETRY_COOLDOWN_MS) {
73
+ // Still in cooldown, just log
74
+ this.writeAudit('cron-log', cronName, 'green', 'cooldown');
75
+ return {
76
+ success: true,
77
+ action: `retry cooldown for '${cronName}'`,
78
+ message: `Cron '${cronName}' still failing (${consecutiveErrors}x). Next retry in ${Math.round((CronHealer.RETRY_COOLDOWN_MS - (now - lastRetry)) / 60000)}m.`,
79
+ tier: 'green',
80
+ };
81
+ }
59
82
  if (dryRun) {
60
83
  this.writeAudit('cron-retry', cronName, 'green', 'dry-run');
61
84
  return {
62
85
  success: true,
63
- action: `dry-run: would re-enable '${cronName}'`,
64
- message: `[DRY RUN] Would re-enable cron '${cronName}' (transient error)`,
86
+ action: `dry-run: would retry '${cronName}'`,
87
+ message: `[DRY RUN] Would retry cron '${cronName}' (${consecutiveErrors} failures)`,
65
88
  tier: 'green',
66
89
  };
67
90
  }
68
- const snapshotId = this.takeSnapshot('cron-retry', cronName, { consecutiveErrors, lastError, lastRun }, `openclaw cron disable ${cronName}`);
69
- const enableResult = (0, utils_js_1.runShell)(`openclaw cron enable ${cronName}`);
70
- if (enableResult.ok) {
91
+ // Take snapshot and retry
92
+ const snapshotId = this.takeSnapshot('cron-retry', cronName, { consecutiveErrors, lastError, lastRun, lastRunStatus }, `openclaw cron disable ${cronName}`);
93
+ const retryResult = (0, utils_js_1.runShell)(`openclaw cron run ${cronName}`);
94
+ this.lastRetryTime.set(cronName, now);
95
+ if (retryResult.ok) {
96
+ // Reset failure count on successful retry dispatch
97
+ this.failureCounts.set(cronName, 0);
71
98
  const result = {
72
99
  success: true,
73
- action: `openclaw cron enable ${cronName}`,
74
- message: `Cron '${cronName}' re-enabled after transient error`,
100
+ action: `openclaw cron run ${cronName}`,
101
+ message: `Cron '${cronName}' retried after ${consecutiveErrors} failures`,
75
102
  details: { cronName, consecutiveErrors, lastError, snapshotId },
76
103
  tier: 'green',
77
104
  snapshotId,
78
105
  };
79
- await this.recordHeal('CronWatcher', result, 'cron_reenabled');
106
+ await this.recordHeal('CronWatcher', result, 'cron_retried');
80
107
  this.writeAudit('cron-retry', cronName, 'green', 'success', snapshotId);
81
108
  return result;
82
109
  }
83
110
  const result = {
84
111
  success: false,
85
- action: `openclaw cron enable ${cronName}`,
86
- message: `Failed to re-enable cron '${cronName}': ${enableResult.stderr.slice(0, 200)}`,
112
+ action: `openclaw cron run ${cronName}`,
113
+ message: `Failed to retry cron '${cronName}': ${retryResult.stderr.slice(0, 200)}`,
87
114
  details: { cronName, consecutiveErrors, lastError, snapshotId },
88
115
  tier: 'green',
89
116
  snapshotId,
90
117
  };
91
- await this.recordHeal('CronWatcher', result, 'cron_reenable_failed');
118
+ await this.recordHeal('CronWatcher', result, 'cron_retry_failed');
92
119
  this.writeAudit('cron-retry', cronName, 'green', 'failed', snapshotId);
93
120
  return result;
94
121
  }
95
- // Default: log and suggest manual rerun
122
+ // Below threshold: just log with manual rerun command
96
123
  const manualCommand = cronName !== 'unknown'
97
124
  ? `openclaw cron run ${cronName}`
98
125
  : 'openclaw cron run <cron-name>';
99
126
  const result = {
100
127
  success: true,
101
128
  action: `logged cron failure for '${cronName}'`,
102
- message: `Cron '${cronName}' failed${lastError ? `: ${lastError}` : ''}. Last run: ${lastRun}. Manual rerun: \`${manualCommand}\``,
103
- details: { cronName, lastRun, lastError, manualCommand },
129
+ message: `Cron '${cronName}' failed (${consecutiveErrors}/${CronHealer.AUTO_RETRY_THRESHOLD} before auto-retry)${lastError ? `: ${lastError}` : ''}. Manual: \`${manualCommand}\``,
130
+ details: { cronName, lastRun, lastError, manualCommand, consecutiveErrors },
104
131
  tier: 'green',
105
132
  };
106
133
  await this.recordHeal('CronWatcher', result, 'cron_failure_logged');
107
134
  this.writeAudit('cron-log', cronName, 'green', 'success');
108
135
  return result;
109
136
  }
137
+ // Reset count when a cron starts passing again (called externally if needed)
138
+ resetFailureCount(cronName) {
139
+ this.failureCounts.delete(cronName);
140
+ this.lastRetryTime.delete(cronName);
141
+ }
110
142
  }
111
143
  exports.CronHealer = CronHealer;
112
144
  //# sourceMappingURL=cron.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/healers/cron.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cron.js","sourceRoot":"","sources":["../../src/healers/cron.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clawdoctor",
3
- "version": "0.4.2",
3
+ "version": "0.4.4",
4
4
  "description": "Self-healing doctor for OpenClaw. Watches gateway, crons, and sessions, sends Telegram alerts, and auto-fixes what it can.",
5
5
  "main": "dist/index.js",
6
6
  "bin": {