openclaw-telegram-manager 1.3.0 → 1.3.2
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/lib/include-generator.d.ts +1 -1
- package/dist/lib/include-generator.d.ts.map +1 -1
- package/dist/lib/include-generator.js +33 -2
- package/dist/lib/include-generator.js.map +1 -1
- package/dist/plugin.js +29 -2
- package/dist/setup.js +33 -15
- package/dist/setup.js.map +1 -1
- package/package.json +2 -3
- package/src/commands/archive.ts +0 -89
- package/src/commands/doctor-all.ts +0 -243
- package/src/commands/doctor.ts +0 -100
- package/src/commands/help.ts +0 -11
- package/src/commands/init.ts +0 -376
- package/src/commands/list.ts +0 -28
- package/src/commands/rename.ts +0 -140
- package/src/commands/snooze.ts +0 -69
- package/src/commands/status.ts +0 -59
- package/src/commands/sync.ts +0 -46
- package/src/commands/upgrade.ts +0 -64
- package/src/index.ts +0 -91
- package/src/lib/audit.ts +0 -44
- package/src/lib/auth.ts +0 -96
- package/src/lib/capsule.ts +0 -206
- package/src/lib/config-restart.ts +0 -167
- package/src/lib/doctor-checks.ts +0 -639
- package/src/lib/include-generator.ts +0 -174
- package/src/lib/registry.ts +0 -197
- package/src/lib/security.ts +0 -174
- package/src/lib/telegram.ts +0 -311
- package/src/lib/types.ts +0 -172
- package/src/setup.ts +0 -475
- package/src/templates/base/COMMANDS.md +0 -3
- package/src/templates/base/CRON.md +0 -3
- package/src/templates/base/LINKS.md +0 -3
- package/src/templates/base/NOTES.md +0 -3
- package/src/templates/base/README.md +0 -3
- package/src/templates/base/TODO.md +0 -11
- package/src/templates/overlays/coding/ARCHITECTURE.md +0 -3
- package/src/templates/overlays/coding/DEPLOY.md +0 -3
- package/src/templates/overlays/marketing/CAMPAIGNS.md +0 -3
- package/src/templates/overlays/marketing/METRICS.md +0 -3
- package/src/templates/overlays/research/FINDINGS.md +0 -3
- package/src/templates/overlays/research/SOURCES.md +0 -3
- package/src/tool.ts +0 -282
|
@@ -1,167 +0,0 @@
|
|
|
1
|
-
// ── Config restart via config.patch no-op ──────────────────────────────
|
|
2
|
-
//
|
|
3
|
-
// Triggers Gateway restart by patching a no-op value, which causes
|
|
4
|
-
// OpenClaw to reload all $include files.
|
|
5
|
-
|
|
6
|
-
// ── Types ──────────────────────────────────────────────────────────────
|
|
7
|
-
|
|
8
|
-
import type { RpcInterface, Logger } from './types.js';
|
|
9
|
-
|
|
10
|
-
export type { RpcInterface, Logger };
|
|
11
|
-
|
|
12
|
-
export interface RestartResult {
|
|
13
|
-
success: boolean;
|
|
14
|
-
fallbackMessage?: string;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
// ── Cooldown tracking (module-level) ───────────────────────────────────
|
|
18
|
-
|
|
19
|
-
const COOLDOWN_MS = 60_000; // 60 seconds
|
|
20
|
-
let lastRestartTimestamp = 0;
|
|
21
|
-
|
|
22
|
-
// ── Backoff config ─────────────────────────────────────────────────────
|
|
23
|
-
|
|
24
|
-
const MAX_RETRIES = 3;
|
|
25
|
-
const BASE_DELAY_MS = 1000; // 1s, 2s, 4s exponential backoff
|
|
26
|
-
|
|
27
|
-
// ── Main function ──────────────────────────────────────────────────────
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Trigger a Gateway restart via config.patch no-op.
|
|
31
|
-
*
|
|
32
|
-
* - Enforces a 60-second cooldown between calls
|
|
33
|
-
* - Retries up to 3 times on baseHash mismatch with exponential backoff
|
|
34
|
-
* - Falls back to a user message if RPC is unavailable
|
|
35
|
-
*/
|
|
36
|
-
export async function triggerRestart(
|
|
37
|
-
rpc: RpcInterface | null | undefined,
|
|
38
|
-
logger: Logger,
|
|
39
|
-
): Promise<RestartResult> {
|
|
40
|
-
// Cooldown check
|
|
41
|
-
const now = Date.now();
|
|
42
|
-
if (now - lastRestartTimestamp < COOLDOWN_MS) {
|
|
43
|
-
const remainingSec = Math.ceil((COOLDOWN_MS - (now - lastRestartTimestamp)) / 1000);
|
|
44
|
-
logger.info(`Config restart cooldown active. ${remainingSec}s remaining.`);
|
|
45
|
-
return {
|
|
46
|
-
success: true, // Not a failure — just throttled
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
// If RPC is not available, return fallback
|
|
51
|
-
if (!rpc) {
|
|
52
|
-
return {
|
|
53
|
-
success: false,
|
|
54
|
-
fallbackMessage:
|
|
55
|
-
'Config updated. Run `openclaw gateway restart` or send SIGUSR1 to apply.',
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
// Retry loop with exponential backoff
|
|
60
|
-
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
61
|
-
try {
|
|
62
|
-
// Get current config to capture baseHash
|
|
63
|
-
const configResult = await rpc.call('config.get', {});
|
|
64
|
-
const baseHash = configResult['baseHash'] as string | undefined;
|
|
65
|
-
|
|
66
|
-
if (!baseHash) {
|
|
67
|
-
logger.warn('config.get did not return baseHash; attempting patch without it');
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
// Patch with no-op change to trigger restart
|
|
71
|
-
const patchParams: Record<string, unknown> = {
|
|
72
|
-
patch: {
|
|
73
|
-
skills: {
|
|
74
|
-
entries: {
|
|
75
|
-
'telegram-manager': {
|
|
76
|
-
lastSync: new Date().toISOString(),
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
},
|
|
80
|
-
},
|
|
81
|
-
};
|
|
82
|
-
|
|
83
|
-
if (baseHash) {
|
|
84
|
-
patchParams['baseHash'] = baseHash;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
await rpc.call('config.patch', patchParams);
|
|
88
|
-
|
|
89
|
-
// Success — update cooldown timestamp
|
|
90
|
-
lastRestartTimestamp = Date.now();
|
|
91
|
-
logger.info('Gateway restart triggered via config.patch');
|
|
92
|
-
|
|
93
|
-
return { success: true };
|
|
94
|
-
} catch (err: unknown) {
|
|
95
|
-
const isBaseHashMismatch = isHashMismatchError(err);
|
|
96
|
-
|
|
97
|
-
if (isBaseHashMismatch && attempt < MAX_RETRIES) {
|
|
98
|
-
const delay = BASE_DELAY_MS * Math.pow(2, attempt);
|
|
99
|
-
logger.warn(
|
|
100
|
-
`config.patch baseHash mismatch (attempt ${attempt + 1}/${MAX_RETRIES + 1}). Retrying in ${delay}ms...`,
|
|
101
|
-
);
|
|
102
|
-
await sleep(delay);
|
|
103
|
-
continue;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
// All retries exhausted or non-retryable error
|
|
107
|
-
const errMsg = err instanceof Error ? err.message : String(err);
|
|
108
|
-
logger.error(`config.patch failed after ${attempt + 1} attempt(s): ${errMsg}`);
|
|
109
|
-
|
|
110
|
-
return {
|
|
111
|
-
success: false,
|
|
112
|
-
fallbackMessage:
|
|
113
|
-
'Config updated. Run `openclaw gateway restart` or send SIGUSR1 to apply.',
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
// Should not reach here, but just in case
|
|
119
|
-
return {
|
|
120
|
-
success: false,
|
|
121
|
-
fallbackMessage:
|
|
122
|
-
'Config updated. Run `openclaw gateway restart` or send SIGUSR1 to apply.',
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
// ── Helpers ────────────────────────────────────────────────────────────
|
|
127
|
-
|
|
128
|
-
function isHashMismatchError(err: unknown): boolean {
|
|
129
|
-
if (err && typeof err === 'object') {
|
|
130
|
-
// Check for common error shape
|
|
131
|
-
if ('code' in err && (err as { code: string }).code === 'BASE_HASH_MISMATCH') {
|
|
132
|
-
return true;
|
|
133
|
-
}
|
|
134
|
-
if ('message' in err) {
|
|
135
|
-
const msg = (err as { message: string }).message;
|
|
136
|
-
return msg.toLowerCase().includes('basehash') || msg.toLowerCase().includes('hash mismatch');
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
return false;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
function sleep(ms: number): Promise<void> {
|
|
143
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* Check if configWrites is enabled in the plugin config via RPC.
|
|
148
|
-
*/
|
|
149
|
-
export async function getConfigWrites(rpc: RpcInterface | null | undefined): Promise<boolean> {
|
|
150
|
-
if (!rpc) return false;
|
|
151
|
-
try {
|
|
152
|
-
const config = await rpc.call('config.get', {});
|
|
153
|
-
const skills = config['skills'] as Record<string, unknown> | undefined;
|
|
154
|
-
const entries = skills?.['entries'] as Record<string, unknown> | undefined;
|
|
155
|
-
const tmConfig = entries?.['telegram-manager'] as Record<string, unknown> | undefined;
|
|
156
|
-
return tmConfig?.['configWrites'] === true;
|
|
157
|
-
} catch {
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
* Reset the cooldown timer (for testing purposes).
|
|
164
|
-
*/
|
|
165
|
-
export function resetCooldown(): void {
|
|
166
|
-
lastRestartTimestamp = 0;
|
|
167
|
-
}
|