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.
Files changed (44) hide show
  1. package/dist/lib/include-generator.d.ts +1 -1
  2. package/dist/lib/include-generator.d.ts.map +1 -1
  3. package/dist/lib/include-generator.js +33 -2
  4. package/dist/lib/include-generator.js.map +1 -1
  5. package/dist/plugin.js +29 -2
  6. package/dist/setup.js +33 -15
  7. package/dist/setup.js.map +1 -1
  8. package/package.json +2 -3
  9. package/src/commands/archive.ts +0 -89
  10. package/src/commands/doctor-all.ts +0 -243
  11. package/src/commands/doctor.ts +0 -100
  12. package/src/commands/help.ts +0 -11
  13. package/src/commands/init.ts +0 -376
  14. package/src/commands/list.ts +0 -28
  15. package/src/commands/rename.ts +0 -140
  16. package/src/commands/snooze.ts +0 -69
  17. package/src/commands/status.ts +0 -59
  18. package/src/commands/sync.ts +0 -46
  19. package/src/commands/upgrade.ts +0 -64
  20. package/src/index.ts +0 -91
  21. package/src/lib/audit.ts +0 -44
  22. package/src/lib/auth.ts +0 -96
  23. package/src/lib/capsule.ts +0 -206
  24. package/src/lib/config-restart.ts +0 -167
  25. package/src/lib/doctor-checks.ts +0 -639
  26. package/src/lib/include-generator.ts +0 -174
  27. package/src/lib/registry.ts +0 -197
  28. package/src/lib/security.ts +0 -174
  29. package/src/lib/telegram.ts +0 -311
  30. package/src/lib/types.ts +0 -172
  31. package/src/setup.ts +0 -475
  32. package/src/templates/base/COMMANDS.md +0 -3
  33. package/src/templates/base/CRON.md +0 -3
  34. package/src/templates/base/LINKS.md +0 -3
  35. package/src/templates/base/NOTES.md +0 -3
  36. package/src/templates/base/README.md +0 -3
  37. package/src/templates/base/TODO.md +0 -11
  38. package/src/templates/overlays/coding/ARCHITECTURE.md +0 -3
  39. package/src/templates/overlays/coding/DEPLOY.md +0 -3
  40. package/src/templates/overlays/marketing/CAMPAIGNS.md +0 -3
  41. package/src/templates/overlays/marketing/METRICS.md +0 -3
  42. package/src/templates/overlays/research/FINDINGS.md +0 -3
  43. package/src/templates/overlays/research/SOURCES.md +0 -3
  44. 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
- }