podwatch 1.1.8 → 1.2.0

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/updater.d.ts CHANGED
@@ -3,17 +3,18 @@
3
3
  *
4
4
  * On plugin startup (called from register()), schedules a non-blocking update
5
5
  * check after a 30-second delay. If a new version is available on npm (or the
6
- * Podwatch dashboard fallback), it downloads via `npm pack`, extracts to the
7
- * extensions directory, writes a restart sentinel, and triggers a gateway
8
- * restart via the OS service manager (systemd / launchctl).
6
+ * Podwatch dashboard fallback), it downloads the tarball via fetch(), verifies
7
+ * integrity, extracts to the extensions directory, and writes a restart sentinel.
9
8
  *
10
9
  * Safety:
11
10
  * - 30s startup delay (don't slow boot)
12
11
  * - 24-hour cooldown between checks (cached in a local file)
13
12
  * - 5s timeout on all HTTP requests
14
- * - 120s timeout on npm pack command
15
13
  * - All errors caught — never bricks the running plugin
16
- * - Logs all activity for debugging
14
+ * - Rollback: backs up old dist/ before replacing, restores on extraction failure
15
+ * - Plugin NEVER restarts its host — only writes restart sentinel
16
+ * - Auto-update defaults to ON (set autoUpdate: false to disable)
17
+ * - No handleUrgentUpdate — removed as remote code execution vector
17
18
  */
18
19
  export declare const AUTO_UPDATE_CACHE_FILE: string;
19
20
  /**
@@ -22,17 +23,10 @@ export declare const AUTO_UPDATE_CACHE_FILE: string;
22
23
  */
23
24
  export declare function resolveStateDir(): string;
24
25
  /**
25
- * Resolve the systemd service name for the gateway.
26
+ * Read the installed plugin version from disk (extensions dir package.json).
27
+ * Returns null if the file can't be read.
26
28
  */
27
- export declare function resolveGatewaySystemdServiceName(profile: string | undefined): string;
28
- /**
29
- * Resolve the launchd label for the gateway.
30
- */
31
- export declare function resolveGatewayLaunchAgentLabel(profile: string | undefined): string;
32
- /**
33
- * Normalize a systemd unit name. Appends .service if missing.
34
- */
35
- export declare function normalizeSystemdUnit(raw: string | undefined, profile: string | undefined): string;
29
+ export declare function getInstalledVersion(): string | null;
36
30
  /**
37
31
  * Compare two semver-like version strings.
38
32
  * Returns positive if remote > local, negative if local > remote, 0 if equal.
@@ -52,6 +46,8 @@ export interface UpdateCheckResult {
52
46
  source: "npm" | "dashboard";
53
47
  /** SRI integrity hash (e.g. "sha512-<base64>") from npm registry or dashboard. */
54
48
  integrityHash?: string;
49
+ /** Direct tarball URL from npm registry (for fetch-based download). */
50
+ tarballUrl?: string;
55
51
  }
56
52
  /**
57
53
  * Check for a newer version. Tries npm registry first, then dashboard API.
@@ -91,6 +87,19 @@ export declare function parseSriHash(sri: string): {
91
87
  * - Legacy hex format: plain hex SHA-256 string (from dashboard fallback)
92
88
  */
93
89
  export declare function verifyTarballIntegrity(tarballPath: string, expectedHash: string): IntegrityResult;
90
+ /**
91
+ * Back up the existing dist/ directory before replacing it.
92
+ * Returns the backup path, or null if no dist/ exists.
93
+ */
94
+ export declare function backupDist(extensionsDir: string): string | null;
95
+ /**
96
+ * Restore dist/ from backup after a failed extraction.
97
+ */
98
+ export declare function restoreFromBackup(extensionsDir: string, backupDir: string): boolean;
99
+ /**
100
+ * Clean up backup after successful extraction.
101
+ */
102
+ export declare function cleanupBackup(backupDir: string): void;
94
103
  export interface UpdateResult {
95
104
  success: boolean;
96
105
  stdout?: string;
@@ -100,26 +109,34 @@ export interface UpdateResult {
100
109
  tarballPath?: string;
101
110
  }
102
111
  /**
103
- * Download the latest podwatch tarball via npm pack.
104
- * Returns the tarball path on success for integrity verification.
112
+ * Download the podwatch tarball via fetch() from the npm registry URL.
113
+ * No shell commands needed pure HTTP download.
105
114
  */
106
- export declare function downloadTarball(): UpdateResult & {
115
+ export declare function downloadTarball(version?: string, tarballUrl?: string): Promise<UpdateResult & {
107
116
  tmpDir?: string;
108
- };
117
+ }>;
109
118
  /**
110
119
  * Install from a previously downloaded tarball by extracting to the extensions dir.
120
+ * Includes rollback: backs up old dist/ before extraction, restores on failure.
111
121
  */
112
122
  export declare function installFromTarball(tarballPath: string): UpdateResult;
113
123
  /**
114
- * Download and install the latest podwatch plugin via npm pack + extract.
124
+ * Download and install the latest podwatch plugin via fetch + extract.
115
125
  * Legacy single-step function — delegates to downloadTarball + installFromTarball.
116
- *
117
- * Steps:
118
- * 1. `npm pack podwatch` in a temp dir to get the tarball
119
- * 2. Clean old dist in the extensions directory
120
- * 3. Extract tarball contents to ~/.openclaw/extensions/podwatch/
121
126
  */
122
127
  export declare function executeUpdate(): UpdateResult;
128
+ export interface VerifyDistResult {
129
+ ok: boolean;
130
+ error?: string;
131
+ signal?: string;
132
+ timedOut?: boolean;
133
+ }
134
+ /**
135
+ * Verify that the newly installed dist/index.js is loadable.
136
+ * Tries to require() the entry point — if it throws, the new code is broken.
137
+ * Returns a detailed result indicating success or failure reason.
138
+ */
139
+ export declare function verifyNewDist(extensionsDir: string): VerifyDistResult;
123
140
  /**
124
141
  * Wait for an idle window before proceeding with a gateway restart.
125
142
  *
@@ -141,12 +158,16 @@ export interface RestartResult {
141
158
  tried: string[];
142
159
  }
143
160
  /**
144
- * Trigger a gateway restart using the OS service manager directly.
145
- * Mirrors OpenClaw's triggerOpenClawRestart logic.
161
+ * Trigger a gateway restart using the OS service manager.
162
+ *
163
+ * Safety improvements over original:
164
+ * - Only called AFTER verifyNewDist() confirms the new code loads
165
+ * - Only called AFTER integrity verification passed
166
+ * - Only called AFTER rollback backup is in place
167
+ * - Single attempt — if restart fails, logs error and moves on (no retry loop)
146
168
  *
147
- * Linux: systemctl --user restart <unit> (user first, then system fallback)
169
+ * Linux: systemctl --user restart <unit>
148
170
  * macOS: launchctl kickstart -k gui/<uid>/<label>
149
- * Fallback: log a manual restart message
150
171
  */
151
172
  export declare function triggerGatewayRestart(logger: {
152
173
  info: (msg: string) => void;
@@ -154,24 +175,23 @@ export declare function triggerGatewayRestart(logger: {
154
175
  error: (msg: string) => void;
155
176
  }): RestartResult;
156
177
  export interface UpdateOptions {
157
- /** Enable auto-update. Default: true. Set false to disable. */
178
+ /** Enable auto-update. Default: true (set to false to disable). */
158
179
  autoUpdate?: boolean;
159
180
  }
160
181
  /**
161
- * Handle an urgent update signal from the Podwatch API.
162
- * Bypasses the 24-hour cooldown and triggers an immediate update check.
163
- * Called by the transmitter when the API response includes { update: { urgent: true } }.
182
+ * Acquire an exclusive update lock. Returns true if acquired, false if
183
+ * another update is already in progress (or the lock is stale and was reclaimed).
164
184
  */
165
- export declare function handleUrgentUpdate(signalVersion: string, logger: {
166
- info: (msg: string) => void;
167
- warn: (msg: string) => void;
168
- error: (msg: string) => void;
169
- }): Promise<void>;
185
+ export declare function acquireUpdateLock(): boolean;
186
+ /**
187
+ * Release the update lock.
188
+ */
189
+ export declare function releaseUpdateLock(): void;
170
190
  /**
171
191
  * Schedule a non-blocking update check 30s after startup.
172
192
  * Safe to call synchronously — it sets a timer and returns immediately.
173
193
  *
174
- * Auto-update is on by default. Set autoUpdate: false in plugin config to disable.
194
+ * Auto-update is ON by default. Set autoUpdate: false in plugin config to disable.
175
195
  *
176
196
  * @param currentVersion The plugin's current version from package.json
177
197
  * @param endpoint The Podwatch API endpoint (for dashboard fallback)
@@ -184,17 +204,20 @@ export declare function scheduleUpdateCheck(currentVersion: string, endpoint: st
184
204
  error: (msg: string) => void;
185
205
  }, options?: UpdateOptions): void;
186
206
  /**
187
- * Internal: perform the actual update check + install + restart.
207
+ * Internal: perform the actual update check + install.
188
208
  *
189
209
  * Flow:
190
- * 1. Check autoUpdate opt-in (default false)
210
+ * 1. Check autoUpdate opt-out (default on; set autoUpdate: false to disable)
191
211
  * 2. Respect 24h cooldown
192
- * 3. Check for newer version (npm dashboard fallback)
193
- * 4. Require integrity hash from server (skip if missing)
194
- * 5. Download tarball via npm pack
195
- * 6. Verify tarball SHA-256 against server hash
196
- * 7. Extract and install
197
- * 8. Write restart sentinel + trigger gateway restart
212
+ * 3. Acquire update lock (prevents concurrent updates)
213
+ * 4. Check for newer version (npm dashboard fallback)
214
+ * 5. Require integrity hash from server (skip if missing)
215
+ * 6. Download tarball via fetch
216
+ * 7. Verify tarball integrity against server hash
217
+ * 8. Extract and install (with rollback on failure)
218
+ * 9. Verify new dist loads; rollback if broken
219
+ * 10. Write restart sentinel (gateway picks it up on next restart)
220
+ * 11. Wait for idle window, then restart gateway
198
221
  */
199
222
  export declare function runUpdateCheck(currentVersion: string, endpoint: string, logger: {
200
223
  info: (msg: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"updater.d.ts","sourceRoot":"","sources":["../src/updater.ts"],"names":[],"mappings":"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"}