@farazirfan/costar-server-executor 1.7.54 → 1.7.56
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/cron/local-run-log.d.ts +35 -0
- package/dist/cron/local-run-log.d.ts.map +1 -0
- package/dist/cron/local-run-log.js +153 -0
- package/dist/cron/local-run-log.js.map +1 -0
- package/dist/cron/local-store.d.ts +86 -0
- package/dist/cron/local-store.d.ts.map +1 -0
- package/dist/cron/local-store.js +199 -0
- package/dist/cron/local-store.js.map +1 -0
- package/dist/db/local-database.d.ts +134 -0
- package/dist/db/local-database.d.ts.map +1 -0
- package/dist/db/local-database.js +419 -0
- package/dist/db/local-database.js.map +1 -0
- package/dist/middleware/auth.d.ts +13 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +67 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/routes/db-ops.d.ts +11 -0
- package/dist/routes/db-ops.d.ts.map +1 -0
- package/dist/routes/db-ops.js +266 -0
- package/dist/routes/db-ops.js.map +1 -0
- package/dist/routes/sandbox-ops.d.ts +15 -0
- package/dist/routes/sandbox-ops.d.ts.map +1 -0
- package/dist/routes/sandbox-ops.js +306 -0
- package/dist/routes/sandbox-ops.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +61 -1
- package/dist/server.js.map +1 -1
- package/dist/services/backup-service.d.ts +49 -0
- package/dist/services/backup-service.d.ts.map +1 -0
- package/dist/services/backup-service.js +113 -0
- package/dist/services/backup-service.js.map +1 -0
- package/dist/services/s3-file-watcher.d.ts +79 -0
- package/dist/services/s3-file-watcher.d.ts.map +1 -0
- package/dist/services/s3-file-watcher.js +191 -0
- package/dist/services/s3-file-watcher.js.map +1 -0
- package/dist/startup/migrate.d.ts +32 -0
- package/dist/startup/migrate.d.ts.map +1 -0
- package/dist/startup/migrate.js +180 -0
- package/dist/startup/migrate.js.map +1 -0
- package/dist/web-server.d.ts +7 -0
- package/dist/web-server.d.ts.map +1 -1
- package/dist/web-server.js +59 -18
- package/dist/web-server.js.map +1 -1
- package/package.json +2 -1
- package/public/index.html +607 -2
package/dist/server.js
CHANGED
|
@@ -19,6 +19,9 @@ import { createSkillsManager } from "./skills/index.js";
|
|
|
19
19
|
import { syncBundledSkillsToWorkspace } from "./skills/sync.js";
|
|
20
20
|
import { startWebServer } from "./web-server.js";
|
|
21
21
|
import { interceptConsoleLogs } from "./utils/log-buffer.js";
|
|
22
|
+
import { S3FileWatcher } from "./services/s3-file-watcher.js";
|
|
23
|
+
import { initDatabase, closeDatabase } from "./db/local-database.js";
|
|
24
|
+
import { runStartupMigrations } from "./startup/migrate.js";
|
|
22
25
|
/**
|
|
23
26
|
* Validate server configuration
|
|
24
27
|
*/
|
|
@@ -98,6 +101,7 @@ async function initializeServer(config) {
|
|
|
98
101
|
cronScheduler: null,
|
|
99
102
|
heartbeatRunner: null,
|
|
100
103
|
skillsManager: null,
|
|
104
|
+
s3FileWatcher: null,
|
|
101
105
|
webServer: null,
|
|
102
106
|
shuttingDown: false,
|
|
103
107
|
};
|
|
@@ -112,6 +116,18 @@ async function initializeServer(config) {
|
|
|
112
116
|
});
|
|
113
117
|
}
|
|
114
118
|
console.log("[SERVER] Supabase initialized");
|
|
119
|
+
// 1b. Initialize local SQLite database (Phase 4)
|
|
120
|
+
console.log("[SERVER] Initializing local database...");
|
|
121
|
+
try {
|
|
122
|
+
await initDatabase();
|
|
123
|
+
console.log("[SERVER] Local database initialized");
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
console.warn("[SERVER] Local database init failed (non-fatal, better-sqlite3 may not be installed):", err);
|
|
127
|
+
}
|
|
128
|
+
// 1c. Run startup migrations (cron Supabase → local, auto-generate CLIENT_API_TOKEN)
|
|
129
|
+
// OpenClaw pattern: detect on load, migrate if needed, idempotent
|
|
130
|
+
await runStartupMigrations(config.userId);
|
|
115
131
|
// 2. Ensure workspace directory and create template files
|
|
116
132
|
console.log("[SERVER] Setting up workspace...");
|
|
117
133
|
const workspaceDir = config.workspaceDir || getDefaultWorkspaceDir();
|
|
@@ -251,7 +267,28 @@ async function initializeServer(config) {
|
|
|
251
267
|
});
|
|
252
268
|
console.log(`[SERVER] Update checks scheduled (auto-update: ${config.enableAutoUpdate !== false ? "enabled" : "disabled"})`);
|
|
253
269
|
}
|
|
254
|
-
// 10. Start
|
|
270
|
+
// 10. Start S3 file watcher (decoupled sync — Phase 1C)
|
|
271
|
+
const sandboxId = process.env.SANDBOX_ID || "";
|
|
272
|
+
const awsBucket = process.env.AWS_BUCKET_NAME || "";
|
|
273
|
+
const awsRegion = process.env.AWS_REGION || "us-east-1";
|
|
274
|
+
const watchDir = "/home/user/task";
|
|
275
|
+
if (sandboxId && awsBucket && fs.existsSync(watchDir)) {
|
|
276
|
+
console.log("[SERVER] Starting S3 file watcher...");
|
|
277
|
+
state.s3FileWatcher = new S3FileWatcher({
|
|
278
|
+
watchDir,
|
|
279
|
+
bucketName: awsBucket,
|
|
280
|
+
region: awsRegion,
|
|
281
|
+
sandboxId,
|
|
282
|
+
debounceMs: 5000,
|
|
283
|
+
});
|
|
284
|
+
await state.s3FileWatcher.start();
|
|
285
|
+
console.log(`[SERVER] S3 file watcher active: ${watchDir} → s3://${awsBucket}/${sandboxId}/`);
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
console.log(`[SERVER] S3 file watcher skipped (SANDBOX_ID=${sandboxId ? "set" : "unset"}, AWS_BUCKET_NAME=${awsBucket ? "set" : "unset"}, watchDir=${fs.existsSync(watchDir) ? "exists" : "missing"})`);
|
|
289
|
+
}
|
|
290
|
+
// 11. Start web dashboard (if enabled)
|
|
291
|
+
const clientApiToken = process.env.CLIENT_API_TOKEN || "";
|
|
255
292
|
if (config.enableWeb !== false) {
|
|
256
293
|
const webPort = config.webPort || 3000;
|
|
257
294
|
const webDeps = {
|
|
@@ -263,9 +300,18 @@ async function initializeServer(config) {
|
|
|
263
300
|
userId: config.userId,
|
|
264
301
|
triggerUpdate,
|
|
265
302
|
packageVersion,
|
|
303
|
+
clientApiToken,
|
|
304
|
+
sandboxId: sandboxId || undefined,
|
|
305
|
+
s3FileWatcher: state.s3FileWatcher,
|
|
266
306
|
};
|
|
267
307
|
state.webServer = startWebServer(webDeps, webPort);
|
|
268
308
|
console.log(`[SERVER] Web dashboard available at http://localhost:${webPort}`);
|
|
309
|
+
if (clientApiToken) {
|
|
310
|
+
console.log("[SERVER] Auth middleware active (CLIENT_API_TOKEN set)");
|
|
311
|
+
}
|
|
312
|
+
else {
|
|
313
|
+
console.log("[SERVER] WARNING: No CLIENT_API_TOKEN set — API endpoints unprotected");
|
|
314
|
+
}
|
|
269
315
|
}
|
|
270
316
|
console.log("[SERVER] Server initialization complete");
|
|
271
317
|
return state;
|
|
@@ -282,6 +328,12 @@ async function cleanupServer(state) {
|
|
|
282
328
|
state.heartbeatRunner.stop();
|
|
283
329
|
state.heartbeatRunner = null;
|
|
284
330
|
}
|
|
331
|
+
// Stop S3 file watcher
|
|
332
|
+
if (state.s3FileWatcher) {
|
|
333
|
+
console.log("[SERVER] Stopping S3 file watcher...");
|
|
334
|
+
await state.s3FileWatcher.stop();
|
|
335
|
+
state.s3FileWatcher = null;
|
|
336
|
+
}
|
|
285
337
|
// Stop cron scheduler
|
|
286
338
|
if (state.cronScheduler) {
|
|
287
339
|
console.log("[SERVER] Stopping cron scheduler...");
|
|
@@ -294,6 +346,14 @@ async function cleanupServer(state) {
|
|
|
294
346
|
state.webServer.server.close();
|
|
295
347
|
state.webServer = null;
|
|
296
348
|
}
|
|
349
|
+
// Close local database
|
|
350
|
+
try {
|
|
351
|
+
closeDatabase();
|
|
352
|
+
console.log("[SERVER] Local database closed");
|
|
353
|
+
}
|
|
354
|
+
catch {
|
|
355
|
+
// Ignore
|
|
356
|
+
}
|
|
297
357
|
// Clear agent reference
|
|
298
358
|
state.agent = null;
|
|
299
359
|
state.skillsManager = null;
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 Backup Service — Disaster Recovery for Sandbox Data
|
|
3
|
+
* Periodically backs up ~/.costar/ to S3.
|
|
4
|
+
* Part of Phase 6: Direct Client → Sandbox Architecture.
|
|
5
|
+
*
|
|
6
|
+
* Uses `aws s3 sync` for incremental backups.
|
|
7
|
+
* Excludes secrets (.env) and temp files.
|
|
8
|
+
*/
|
|
9
|
+
export type BackupServiceConfig = {
|
|
10
|
+
/** S3 bucket name */
|
|
11
|
+
bucketName: string;
|
|
12
|
+
/** AWS region */
|
|
13
|
+
region: string;
|
|
14
|
+
/** Sandbox ID for S3 path prefix */
|
|
15
|
+
sandboxId: string;
|
|
16
|
+
/** Backup interval in ms (default: 30 minutes) */
|
|
17
|
+
intervalMs?: number;
|
|
18
|
+
};
|
|
19
|
+
export declare class BackupService {
|
|
20
|
+
private config;
|
|
21
|
+
private timer;
|
|
22
|
+
private isRunning;
|
|
23
|
+
private stats;
|
|
24
|
+
constructor(config: BackupServiceConfig);
|
|
25
|
+
/**
|
|
26
|
+
* Start periodic backups.
|
|
27
|
+
*/
|
|
28
|
+
start(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Stop periodic backups.
|
|
31
|
+
*/
|
|
32
|
+
stop(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Run a single backup.
|
|
35
|
+
*/
|
|
36
|
+
runBackup(): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Get backup status for API.
|
|
39
|
+
*/
|
|
40
|
+
getStatus(): {
|
|
41
|
+
isRunning: boolean;
|
|
42
|
+
totalBackups: number;
|
|
43
|
+
totalErrors: number;
|
|
44
|
+
lastBackupAt: number;
|
|
45
|
+
lastDurationMs: number;
|
|
46
|
+
intervalMs: number;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=backup-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-service.d.ts","sourceRoot":"","sources":["../../src/services/backup-service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,MAAM,MAAM,mBAAmB,GAAG;IAChC,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAKX;gBAEU,MAAM,EAAE,mBAAmB;IAOvC;;OAEG;IACH,KAAK,IAAI,IAAI;IAgBb;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAkDhC;;OAEG;IACH,SAAS,IAAI;QACX,SAAS,EAAE,OAAO,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,cAAc,EAAE,MAAM,CAAC;QACvB,UAAU,EAAE,MAAM,CAAC;KACpB;CAOF"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 Backup Service — Disaster Recovery for Sandbox Data
|
|
3
|
+
* Periodically backs up ~/.costar/ to S3.
|
|
4
|
+
* Part of Phase 6: Direct Client → Sandbox Architecture.
|
|
5
|
+
*
|
|
6
|
+
* Uses `aws s3 sync` for incremental backups.
|
|
7
|
+
* Excludes secrets (.env) and temp files.
|
|
8
|
+
*/
|
|
9
|
+
import { exec } from "node:child_process";
|
|
10
|
+
import { resolveCoStarDir } from "../cli/paths.js";
|
|
11
|
+
export class BackupService {
|
|
12
|
+
config;
|
|
13
|
+
timer = null;
|
|
14
|
+
isRunning = false;
|
|
15
|
+
stats = {
|
|
16
|
+
totalBackups: 0,
|
|
17
|
+
totalErrors: 0,
|
|
18
|
+
lastBackupAt: 0,
|
|
19
|
+
lastDurationMs: 0,
|
|
20
|
+
};
|
|
21
|
+
constructor(config) {
|
|
22
|
+
this.config = {
|
|
23
|
+
...config,
|
|
24
|
+
intervalMs: config.intervalMs ?? 30 * 60 * 1000, // 30 min default
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Start periodic backups.
|
|
29
|
+
*/
|
|
30
|
+
start() {
|
|
31
|
+
if (this.timer)
|
|
32
|
+
return;
|
|
33
|
+
// Run first backup after 5 minutes (let server settle)
|
|
34
|
+
setTimeout(() => {
|
|
35
|
+
void this.runBackup();
|
|
36
|
+
}, 5 * 60 * 1000);
|
|
37
|
+
// Then every intervalMs
|
|
38
|
+
this.timer = setInterval(() => {
|
|
39
|
+
void this.runBackup();
|
|
40
|
+
}, this.config.intervalMs);
|
|
41
|
+
console.log(`[BACKUP] Started — every ${Math.round(this.config.intervalMs / 60000)} minutes`);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Stop periodic backups.
|
|
45
|
+
*/
|
|
46
|
+
stop() {
|
|
47
|
+
if (this.timer) {
|
|
48
|
+
clearInterval(this.timer);
|
|
49
|
+
this.timer = null;
|
|
50
|
+
}
|
|
51
|
+
console.log("[BACKUP] Stopped");
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Run a single backup.
|
|
55
|
+
*/
|
|
56
|
+
async runBackup() {
|
|
57
|
+
if (this.isRunning) {
|
|
58
|
+
console.log("[BACKUP] Skipping — previous backup still running");
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.isRunning = true;
|
|
62
|
+
const startTime = Date.now();
|
|
63
|
+
const costarDir = resolveCoStarDir();
|
|
64
|
+
const s3Dest = `s3://${this.config.bucketName}/backups/${this.config.sandboxId}/`;
|
|
65
|
+
// Exclude patterns
|
|
66
|
+
const excludes = [
|
|
67
|
+
"--exclude '.env'",
|
|
68
|
+
"--exclude '*.tmp.*'",
|
|
69
|
+
"--exclude 'node_modules/*'",
|
|
70
|
+
"--exclude '.cache/*'",
|
|
71
|
+
"--exclude '*.lock'",
|
|
72
|
+
].join(" ");
|
|
73
|
+
const command = `aws s3 sync "${costarDir}" "${s3Dest}" ${excludes} --region ${this.config.region} --delete`;
|
|
74
|
+
try {
|
|
75
|
+
await new Promise((resolve, reject) => {
|
|
76
|
+
exec(command, { timeout: 5 * 60 * 1000 }, (error, stdout, stderr) => {
|
|
77
|
+
if (error) {
|
|
78
|
+
console.error(`[BACKUP] Error: ${error.message}`);
|
|
79
|
+
if (stderr)
|
|
80
|
+
console.error(`[BACKUP] stderr: ${stderr}`);
|
|
81
|
+
reject(error);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (stdout.trim()) {
|
|
85
|
+
console.log(`[BACKUP] Synced: ${stdout.trim().split("\n").length} files`);
|
|
86
|
+
}
|
|
87
|
+
resolve();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
this.stats.totalBackups++;
|
|
91
|
+
this.stats.lastBackupAt = Date.now();
|
|
92
|
+
this.stats.lastDurationMs = Date.now() - startTime;
|
|
93
|
+
console.log(`[BACKUP] Completed in ${this.stats.lastDurationMs}ms`);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
this.stats.totalErrors++;
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
this.isRunning = false;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get backup status for API.
|
|
104
|
+
*/
|
|
105
|
+
getStatus() {
|
|
106
|
+
return {
|
|
107
|
+
isRunning: this.isRunning,
|
|
108
|
+
...this.stats,
|
|
109
|
+
intervalMs: this.config.intervalMs,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=backup-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-service.js","sourceRoot":"","sources":["../../src/services/backup-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 File Watcher — Decoupled S3 Sync via chokidar
|
|
3
|
+
* Watches /home/user/task/ for file changes and uploads individually.
|
|
4
|
+
* Part of Phase 1C: Direct Client → Sandbox Architecture.
|
|
5
|
+
*
|
|
6
|
+
* Replaces the old approach of running `aws s3 sync` on every command.
|
|
7
|
+
* Instead, uses chokidar to detect file changes and uploads them individually
|
|
8
|
+
* via `aws s3 cp`, debounced and batched for efficiency.
|
|
9
|
+
*/
|
|
10
|
+
export type S3FileWatcherConfig = {
|
|
11
|
+
/** Directory to watch (default: /home/user/task/) */
|
|
12
|
+
watchDir: string;
|
|
13
|
+
/** S3 bucket name */
|
|
14
|
+
bucketName: string;
|
|
15
|
+
/** AWS region */
|
|
16
|
+
region: string;
|
|
17
|
+
/** Sandbox ID for S3 path prefix */
|
|
18
|
+
sandboxId: string;
|
|
19
|
+
/** Debounce interval in ms (default: 5000) */
|
|
20
|
+
debounceMs?: number;
|
|
21
|
+
};
|
|
22
|
+
export type UploadRecord = {
|
|
23
|
+
path: string;
|
|
24
|
+
s3Url: string;
|
|
25
|
+
uploadedAt: number;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* S3 File Watcher — watches a directory and uploads changed files to S3.
|
|
29
|
+
*
|
|
30
|
+
* Uses dynamic import for chokidar (ESM-only since v4).
|
|
31
|
+
*/
|
|
32
|
+
export declare class S3FileWatcher {
|
|
33
|
+
private config;
|
|
34
|
+
private watcher;
|
|
35
|
+
private pendingUploads;
|
|
36
|
+
private debounceTimer;
|
|
37
|
+
private recentUploads;
|
|
38
|
+
private maxRecentUploads;
|
|
39
|
+
private isUploading;
|
|
40
|
+
private stats;
|
|
41
|
+
constructor(config: S3FileWatcherConfig);
|
|
42
|
+
/**
|
|
43
|
+
* Start watching for file changes.
|
|
44
|
+
*/
|
|
45
|
+
start(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Stop watching.
|
|
48
|
+
*/
|
|
49
|
+
stop(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Queue a file for upload (debounced).
|
|
52
|
+
*/
|
|
53
|
+
private queueUpload;
|
|
54
|
+
/**
|
|
55
|
+
* Upload all pending files to S3.
|
|
56
|
+
*/
|
|
57
|
+
private flushUploads;
|
|
58
|
+
/**
|
|
59
|
+
* Upload a single file to S3 via aws cli.
|
|
60
|
+
*/
|
|
61
|
+
private uploadFile;
|
|
62
|
+
/**
|
|
63
|
+
* Get recent uploads since a timestamp.
|
|
64
|
+
* Used by sandbox-ops to report changed_files in execute response.
|
|
65
|
+
*/
|
|
66
|
+
getRecentUploads(since: number): UploadRecord[];
|
|
67
|
+
/**
|
|
68
|
+
* Get watcher status for API.
|
|
69
|
+
*/
|
|
70
|
+
getStatus(): {
|
|
71
|
+
watching: boolean;
|
|
72
|
+
watchDir: string;
|
|
73
|
+
pendingUploads: number;
|
|
74
|
+
totalUploads: number;
|
|
75
|
+
totalErrors: number;
|
|
76
|
+
lastUploadAt: number;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=s3-file-watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-file-watcher.d.ts","sourceRoot":"","sources":["../../src/services/s3-file-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,MAAM,mBAAmB,GAAG;IAChC,qDAAqD;IACrD,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAmBF;;;;GAIG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAgC;IAE9C,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,gBAAgB,CAAO;IAC/B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,KAAK,CAIX;gBAEU,MAAM,EAAE,mBAAmB;IAOvC;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAqC5B;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B;;OAEG;IACH,OAAO,CAAC,WAAW;IAanB;;OAEG;YACW,YAAY;IAoB1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAwClB;;;OAGG;IACH,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAI/C;;OAEG;IACH,SAAS,IAAI;QACX,QAAQ,EAAE,OAAO,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;KACtB;CAUF"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* S3 File Watcher — Decoupled S3 Sync via chokidar
|
|
3
|
+
* Watches /home/user/task/ for file changes and uploads individually.
|
|
4
|
+
* Part of Phase 1C: Direct Client → Sandbox Architecture.
|
|
5
|
+
*
|
|
6
|
+
* Replaces the old approach of running `aws s3 sync` on every command.
|
|
7
|
+
* Instead, uses chokidar to detect file changes and uploads them individually
|
|
8
|
+
* via `aws s3 cp`, debounced and batched for efficiency.
|
|
9
|
+
*/
|
|
10
|
+
import { exec } from "node:child_process";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import fs from "node:fs";
|
|
13
|
+
/** Ignore patterns — directories/files to skip */
|
|
14
|
+
const IGNORE_PATTERNS = [
|
|
15
|
+
"**/node_modules/**",
|
|
16
|
+
"**/.git/**",
|
|
17
|
+
"**/__pycache__/**",
|
|
18
|
+
"**/dist/**",
|
|
19
|
+
"**/.next/**",
|
|
20
|
+
"**/.cache/**",
|
|
21
|
+
"**/.venv/**",
|
|
22
|
+
"**/venv/**",
|
|
23
|
+
"**/*.pyc",
|
|
24
|
+
"**/.DS_Store",
|
|
25
|
+
"**/package-lock.json",
|
|
26
|
+
"**/yarn.lock",
|
|
27
|
+
"**/pnpm-lock.yaml",
|
|
28
|
+
];
|
|
29
|
+
/**
|
|
30
|
+
* S3 File Watcher — watches a directory and uploads changed files to S3.
|
|
31
|
+
*
|
|
32
|
+
* Uses dynamic import for chokidar (ESM-only since v4).
|
|
33
|
+
*/
|
|
34
|
+
export class S3FileWatcher {
|
|
35
|
+
config;
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
+
watcher = null;
|
|
38
|
+
pendingUploads = new Set();
|
|
39
|
+
debounceTimer = null;
|
|
40
|
+
recentUploads = [];
|
|
41
|
+
maxRecentUploads = 100;
|
|
42
|
+
isUploading = false;
|
|
43
|
+
stats = {
|
|
44
|
+
totalUploads: 0,
|
|
45
|
+
totalErrors: 0,
|
|
46
|
+
lastUploadAt: 0,
|
|
47
|
+
};
|
|
48
|
+
constructor(config) {
|
|
49
|
+
this.config = {
|
|
50
|
+
...config,
|
|
51
|
+
debounceMs: config.debounceMs ?? 5000,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Start watching for file changes.
|
|
56
|
+
*/
|
|
57
|
+
async start() {
|
|
58
|
+
const { watchDir } = this.config;
|
|
59
|
+
if (!fs.existsSync(watchDir)) {
|
|
60
|
+
console.log(`[S3-WATCHER] Watch directory does not exist: ${watchDir}`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
// Dynamic import for chokidar (ESM)
|
|
65
|
+
const { watch } = await import("chokidar");
|
|
66
|
+
this.watcher = watch(watchDir, {
|
|
67
|
+
ignored: IGNORE_PATTERNS,
|
|
68
|
+
persistent: true,
|
|
69
|
+
ignoreInitial: true, // Don't upload everything on startup
|
|
70
|
+
followSymlinks: false,
|
|
71
|
+
awaitWriteFinish: {
|
|
72
|
+
stabilityThreshold: 1000,
|
|
73
|
+
pollInterval: 200,
|
|
74
|
+
},
|
|
75
|
+
});
|
|
76
|
+
this.watcher.on("add", (filePath) => this.queueUpload(filePath));
|
|
77
|
+
this.watcher.on("change", (filePath) => this.queueUpload(filePath));
|
|
78
|
+
// No "unlink" handler — we never delete from S3 (safe from data loss)
|
|
79
|
+
this.watcher.on("error", (error) => {
|
|
80
|
+
console.error("[S3-WATCHER] Watcher error:", error.message);
|
|
81
|
+
});
|
|
82
|
+
console.log(`[S3-WATCHER] Watching ${watchDir} for changes`);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
console.error("[S3-WATCHER] Failed to start file watcher:", error);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Stop watching.
|
|
90
|
+
*/
|
|
91
|
+
async stop() {
|
|
92
|
+
if (this.debounceTimer) {
|
|
93
|
+
clearTimeout(this.debounceTimer);
|
|
94
|
+
this.debounceTimer = null;
|
|
95
|
+
}
|
|
96
|
+
if (this.watcher) {
|
|
97
|
+
await this.watcher.close();
|
|
98
|
+
this.watcher = null;
|
|
99
|
+
}
|
|
100
|
+
console.log("[S3-WATCHER] Stopped");
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Queue a file for upload (debounced).
|
|
104
|
+
*/
|
|
105
|
+
queueUpload(filePath) {
|
|
106
|
+
this.pendingUploads.add(filePath);
|
|
107
|
+
// Reset debounce timer
|
|
108
|
+
if (this.debounceTimer) {
|
|
109
|
+
clearTimeout(this.debounceTimer);
|
|
110
|
+
}
|
|
111
|
+
this.debounceTimer = setTimeout(() => {
|
|
112
|
+
void this.flushUploads();
|
|
113
|
+
}, this.config.debounceMs);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Upload all pending files to S3.
|
|
117
|
+
*/
|
|
118
|
+
async flushUploads() {
|
|
119
|
+
if (this.isUploading || this.pendingUploads.size === 0)
|
|
120
|
+
return;
|
|
121
|
+
this.isUploading = true;
|
|
122
|
+
const filesToUpload = [...this.pendingUploads];
|
|
123
|
+
this.pendingUploads.clear();
|
|
124
|
+
console.log(`[S3-WATCHER] Uploading ${filesToUpload.length} file(s) to S3...`);
|
|
125
|
+
const uploadPromises = filesToUpload.map((filePath) => this.uploadFile(filePath));
|
|
126
|
+
await Promise.allSettled(uploadPromises);
|
|
127
|
+
this.isUploading = false;
|
|
128
|
+
// If more files queued during upload, flush again
|
|
129
|
+
if (this.pendingUploads.size > 0) {
|
|
130
|
+
void this.flushUploads();
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Upload a single file to S3 via aws cli.
|
|
135
|
+
*/
|
|
136
|
+
uploadFile(filePath) {
|
|
137
|
+
return new Promise((resolve) => {
|
|
138
|
+
// Skip if file no longer exists
|
|
139
|
+
if (!fs.existsSync(filePath)) {
|
|
140
|
+
resolve();
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const relativePath = path.relative(this.config.watchDir, filePath);
|
|
144
|
+
const s3Key = `${this.config.sandboxId}/${relativePath}`;
|
|
145
|
+
const s3Url = `https://${this.config.bucketName}.s3.${this.config.region}.amazonaws.com/${s3Key}`;
|
|
146
|
+
const command = `aws s3 cp "${filePath}" "s3://${this.config.bucketName}/${s3Key}" --region ${this.config.region}`;
|
|
147
|
+
exec(command, { timeout: 30_000 }, (error) => {
|
|
148
|
+
if (error) {
|
|
149
|
+
console.error(`[S3-WATCHER] Upload failed: ${relativePath} — ${error.message}`);
|
|
150
|
+
this.stats.totalErrors++;
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
this.stats.totalUploads++;
|
|
154
|
+
this.stats.lastUploadAt = Date.now();
|
|
155
|
+
// Track in ring buffer
|
|
156
|
+
this.recentUploads.push({
|
|
157
|
+
path: filePath,
|
|
158
|
+
s3Url,
|
|
159
|
+
uploadedAt: Date.now(),
|
|
160
|
+
});
|
|
161
|
+
// Prune ring buffer
|
|
162
|
+
if (this.recentUploads.length > this.maxRecentUploads) {
|
|
163
|
+
this.recentUploads = this.recentUploads.slice(-this.maxRecentUploads);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
resolve();
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get recent uploads since a timestamp.
|
|
172
|
+
* Used by sandbox-ops to report changed_files in execute response.
|
|
173
|
+
*/
|
|
174
|
+
getRecentUploads(since) {
|
|
175
|
+
return this.recentUploads.filter((u) => u.uploadedAt >= since);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get watcher status for API.
|
|
179
|
+
*/
|
|
180
|
+
getStatus() {
|
|
181
|
+
return {
|
|
182
|
+
watching: this.watcher !== null,
|
|
183
|
+
watchDir: this.config.watchDir,
|
|
184
|
+
pendingUploads: this.pendingUploads.size,
|
|
185
|
+
totalUploads: this.stats.totalUploads,
|
|
186
|
+
totalErrors: this.stats.totalErrors,
|
|
187
|
+
lastUploadAt: this.stats.lastUploadAt,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=s3-file-watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"s3-file-watcher.js","sourceRoot":"","sources":["../../src/services/s3-file-watcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Startup Migrations — One-time data migration on server start
|
|
3
|
+
*
|
|
4
|
+
* Follows OpenClaw's "detect on load, migrate if needed, idempotent" pattern.
|
|
5
|
+
* Each migration checks its own precondition (e.g., local store empty)
|
|
6
|
+
* so it's safe to run every startup without a version tracker.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Migrate cron jobs from Supabase to local JSON store.
|
|
10
|
+
*
|
|
11
|
+
* Precondition: local store has zero jobs for this user.
|
|
12
|
+
* If Supabase has jobs, copies them to the local store.
|
|
13
|
+
* Naturally idempotent — once local store has jobs, this is a no-op.
|
|
14
|
+
*/
|
|
15
|
+
export declare function migrateCronJobsFromSupabase(userId: string): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Ensure CLIENT_API_TOKEN exists.
|
|
18
|
+
*
|
|
19
|
+
* If missing from env, generates a random 48-char hex token (192 bits),
|
|
20
|
+
* writes it to ~/.costar/.env, and sets it in process.env for this run.
|
|
21
|
+
* Also updates user_sandboxes metadata in Supabase so Flutter client can read it.
|
|
22
|
+
*
|
|
23
|
+
* Follows OpenClaw's ensureGatewayStartupAuth pattern.
|
|
24
|
+
*/
|
|
25
|
+
export declare function ensureClientApiToken(userId: string): Promise<string>;
|
|
26
|
+
/**
|
|
27
|
+
* Run all startup migrations.
|
|
28
|
+
* Called once during server initialization, after Supabase is ready.
|
|
29
|
+
* All migrations are idempotent and non-fatal.
|
|
30
|
+
*/
|
|
31
|
+
export declare function runStartupMigrations(userId: string): Promise<void>;
|
|
32
|
+
//# sourceMappingURL=migrate.d.ts.map
|