@tom2012/cc-web 2026.6.12-c → 2026.6.13-b
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/backend/dist/__tests__/sync-refactor.test.d.ts +2 -0
- package/backend/dist/__tests__/sync-refactor.test.d.ts.map +1 -0
- package/backend/dist/__tests__/sync-refactor.test.js +212 -0
- package/backend/dist/__tests__/sync-refactor.test.js.map +1 -0
- package/backend/dist/index.d.ts.map +1 -1
- package/backend/dist/index.js +2 -0
- package/backend/dist/index.js.map +1 -1
- package/backend/dist/routes/filesystem.d.ts.map +1 -1
- package/backend/dist/routes/filesystem.js +49 -0
- package/backend/dist/routes/filesystem.js.map +1 -1
- package/backend/dist/routes/sync.d.ts.map +1 -1
- package/backend/dist/routes/sync.js +119 -1
- package/backend/dist/routes/sync.js.map +1 -1
- package/backend/dist/sync-config.d.ts +10 -0
- package/backend/dist/sync-config.d.ts.map +1 -1
- package/backend/dist/sync-config.js +53 -3
- package/backend/dist/sync-config.js.map +1 -1
- package/backend/dist/sync-dirty.d.ts +12 -0
- package/backend/dist/sync-dirty.d.ts.map +1 -0
- package/backend/dist/sync-dirty.js +165 -0
- package/backend/dist/sync-dirty.js.map +1 -0
- package/backend/dist/sync-migrate.d.ts +15 -0
- package/backend/dist/sync-migrate.d.ts.map +1 -0
- package/backend/dist/sync-migrate.js +92 -0
- package/backend/dist/sync-migrate.js.map +1 -0
- package/backend/dist/sync-scheduler.d.ts.map +1 -1
- package/backend/dist/sync-scheduler.js +3 -1
- package/backend/dist/sync-scheduler.js.map +1 -1
- package/backend/dist/sync-service.d.ts.map +1 -1
- package/backend/dist/sync-service.js +34 -16
- package/backend/dist/sync-service.js.map +1 -1
- package/backend/dist/sync-state.d.ts +5 -0
- package/backend/dist/sync-state.d.ts.map +1 -0
- package/backend/dist/sync-state.js +95 -0
- package/backend/dist/sync-state.js.map +1 -0
- package/backend/package-lock.json +63 -0
- package/backend/package.json +1 -0
- package/frontend/dist/assets/{ChatOverlay-BYHxECck.js → ChatOverlay-Cg09i5qF.js} +1 -1
- package/frontend/dist/assets/{ClaudeMemPage-AeBcDyNZ.js → ClaudeMemPage-CT87pX5z.js} +1 -1
- package/frontend/dist/assets/{GraphPreview-CraKSWzy.js → GraphPreview-LQt3-skN.js} +2 -2
- package/frontend/dist/assets/MobilePage-NHtpiQsi.js +14 -0
- package/frontend/dist/assets/OfficePreview-CH1bJV2V.js +2 -0
- package/frontend/dist/assets/{PdfPreview-BX-q3oXm.js → PdfPreview-BDDzOq58.js} +1 -1
- package/frontend/dist/assets/{ProjectPage-DbVFAUzJ.js → ProjectPage-BoOR1Zr9.js} +5 -5
- package/frontend/dist/assets/ProjectSettingsPage-ClHkL2L4.js +13 -0
- package/frontend/dist/assets/{SettingsPage-CoyFVnCz.js → SettingsPage-Q7dhf4gJ.js} +2 -2
- package/frontend/dist/assets/{SkillHubPage-CjFCt8dE.js → SkillHubPage-CI5o_FsS.js} +3 -3
- package/frontend/dist/assets/{check-circle-2-DqS6oPDV.js → check-circle-2-CZgbn9H8.js} +1 -1
- package/frontend/dist/assets/{chevron-down-BPnYeDMC.js → chevron-down-efPsOYlh.js} +1 -1
- package/frontend/dist/assets/{file-text-CPajDnww.js → file-text-mpbJn406.js} +1 -1
- package/frontend/dist/assets/index-BjydjBX7.js +75 -0
- package/frontend/dist/assets/index-DS0RkMkF.css +1 -0
- package/frontend/dist/assets/{index-DrpeVVUe.js → index-Di-Iyd_L.js} +1 -1
- package/frontend/dist/assets/{index-Di5Ntujm.js → index-oPZyCxeH.js} +1 -1
- package/frontend/dist/assets/{jszip.min-BxSvgCaf.js → jszip.min-nePKj7L6.js} +1 -1
- package/frontend/dist/assets/save-BYi9FbQu.js +7 -0
- package/frontend/dist/assets/{search-1chGdDoe.js → search-09qCXbdG.js} +1 -1
- package/frontend/dist/assets/select-De5oupVM.js +1 -0
- package/frontend/dist/assets/tabs-CQZcN-v5.js +7 -0
- package/frontend/dist/assets/textarea-Ge2i0ho4.js +1 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- package/frontend/dist/assets/MobilePage-FMVoG0Pl.js +0 -14
- package/frontend/dist/assets/OfficePreview-DQ8oitRF.js +0 -2
- package/frontend/dist/assets/index-2wJikgEX.js +0 -75
- package/frontend/dist/assets/index-61v6oszV.css +0 -1
- package/frontend/dist/assets/select-YkUpG7ZI.js +0 -1
- package/frontend/dist/assets/tabs-C3yC9N14.js +0 -13
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const express_1 = require("express");
|
|
4
4
|
const config_1 = require("../config");
|
|
5
5
|
const sync_config_1 = require("../sync-config");
|
|
6
|
+
const sync_state_1 = require("../sync-state");
|
|
7
|
+
const sync_dirty_1 = require("../sync-dirty");
|
|
6
8
|
const sync_scheduler_1 = require("../sync-scheduler");
|
|
7
9
|
const sync_service_1 = require("../sync-service");
|
|
8
10
|
const router = (0, express_1.Router)();
|
|
@@ -155,7 +157,10 @@ router.post('/all', async (req, res) => {
|
|
|
155
157
|
const user = requireUser(req, res);
|
|
156
158
|
if (!user)
|
|
157
159
|
return;
|
|
158
|
-
|
|
160
|
+
// Only projects that actually have a per-project remote path configured —
|
|
161
|
+
// others would just return `no-path` and add noise.
|
|
162
|
+
const cfgAll = (0, sync_config_1.getSyncConfig)(user);
|
|
163
|
+
const projects = (0, config_1.getProjects)().filter((p) => !p.archived && (0, config_1.isProjectOwner)(p, user) && !!(0, sync_config_1.getProjectPath)(cfgAll, p.id));
|
|
159
164
|
const results = [];
|
|
160
165
|
(0, sync_service_1.clearBulkCancel)(user);
|
|
161
166
|
// Latch the cancel state on exit (before the finally clears the flag);
|
|
@@ -215,6 +220,119 @@ router.post('/cancel-all', (req, res) => {
|
|
|
215
220
|
const ids = (0, sync_service_1.cancelAllForUser)(user);
|
|
216
221
|
res.json({ cancelled: ids });
|
|
217
222
|
});
|
|
223
|
+
// ── Per-project sync (path + status) ─────────────────────────────────────────
|
|
224
|
+
/** Shared builder for a single project's sync settings/status. `dirty` is
|
|
225
|
+
* push-only (pull/bidi rewrites local files → would always read dirty). */
|
|
226
|
+
function projectSyncView(user, projectId, folderPath) {
|
|
227
|
+
const cfg = (0, sync_config_1.getSyncConfig)(user);
|
|
228
|
+
const remotePath = (0, sync_config_1.getProjectPath)(cfg, projectId);
|
|
229
|
+
const excludes = cfg.projectExcludes[projectId] ?? [];
|
|
230
|
+
const lastSyncAt = (0, sync_state_1.getLastSyncAt)(user, projectId);
|
|
231
|
+
// Dirty only for pure 'push'. For 'pull'/'bidirectional' the local tree gets
|
|
232
|
+
// remote-written files whose mtime exceeds lastSyncAt → would read dirty
|
|
233
|
+
// forever right after a successful sync (false signal).
|
|
234
|
+
const dirty = remotePath && cfg.direction === 'push'
|
|
235
|
+
? (0, sync_dirty_1.getDirtyCached)(`${user}:${projectId}`, folderPath, [...cfg.defaultExcludes, ...excludes], lastSyncAt)
|
|
236
|
+
: false;
|
|
237
|
+
return {
|
|
238
|
+
path: remotePath,
|
|
239
|
+
excludes,
|
|
240
|
+
lastSyncAt,
|
|
241
|
+
dirty,
|
|
242
|
+
syncing: (0, sync_service_1.isSyncing)(user, projectId),
|
|
243
|
+
direction: cfg.direction,
|
|
244
|
+
connectionReady: !!(cfg.host && cfg.user),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
// GET /api/sync/project-status[?dirty=1] — per-project cloud status for the
|
|
248
|
+
// dashboard, OWNED projects only (projectPaths is per-user/owner; shared
|
|
249
|
+
// projects get no cloud). hasPath/lastSyncAt/syncing are instant; `dirty` is a
|
|
250
|
+
// tree walk computed only with ?dirty=1 (dashboard fetches cheap first, then
|
|
251
|
+
// upgrades). Dirty is push-only.
|
|
252
|
+
router.get('/project-status', (req, res) => {
|
|
253
|
+
const user = requireUser(req, res);
|
|
254
|
+
if (!user)
|
|
255
|
+
return;
|
|
256
|
+
const cfg = (0, sync_config_1.getSyncConfig)(user);
|
|
257
|
+
const wantDirty = req.query.dirty === '1';
|
|
258
|
+
const lastMap = (0, sync_state_1.getAllLastSyncAt)(user);
|
|
259
|
+
// Dirty only for pure 'push' (see projectSyncView).
|
|
260
|
+
const pushOnly = cfg.direction === 'push';
|
|
261
|
+
const items = {};
|
|
262
|
+
for (const p of (0, config_1.getProjects)()) {
|
|
263
|
+
if (p.archived || !(0, config_1.isProjectOwner)(p, user))
|
|
264
|
+
continue;
|
|
265
|
+
const remotePath = (0, sync_config_1.getProjectPath)(cfg, p.id);
|
|
266
|
+
const hasPath = !!remotePath;
|
|
267
|
+
const lastSyncAt = lastMap[p.id] ?? 0;
|
|
268
|
+
let dirty = null;
|
|
269
|
+
if (wantDirty) {
|
|
270
|
+
dirty = hasPath && pushOnly
|
|
271
|
+
? (0, sync_dirty_1.getDirtyCached)(`${user}:${p.id}`, p.folderPath, [...cfg.defaultExcludes, ...(cfg.projectExcludes[p.id] ?? [])], lastSyncAt)
|
|
272
|
+
: false;
|
|
273
|
+
}
|
|
274
|
+
items[p.id] = { hasPath, dirty, lastSyncAt, syncing: (0, sync_service_1.isSyncing)(user, p.id) };
|
|
275
|
+
}
|
|
276
|
+
res.json({ items });
|
|
277
|
+
});
|
|
278
|
+
// GET /api/sync/project/:id/settings — per-project sync settings page data (owner)
|
|
279
|
+
router.get('/project/:id/settings', (req, res) => {
|
|
280
|
+
const user = requireUser(req, res);
|
|
281
|
+
if (!user)
|
|
282
|
+
return;
|
|
283
|
+
const project = (0, config_1.getProject)(req.params.id);
|
|
284
|
+
if (!project) {
|
|
285
|
+
res.status(404).json({ error: 'Project not found' });
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (!(0, config_1.isProjectOwner)(project, user)) {
|
|
289
|
+
res.status(403).json({ error: 'Forbidden' });
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
res.json(projectSyncView(user, project.id, project.folderPath));
|
|
293
|
+
});
|
|
294
|
+
// PUT /api/sync/project/:id/settings body: { path?: string, excludes?: string[] } (owner)
|
|
295
|
+
router.put('/project/:id/settings', (req, res) => {
|
|
296
|
+
const user = requireUser(req, res);
|
|
297
|
+
if (!user)
|
|
298
|
+
return;
|
|
299
|
+
const project = (0, config_1.getProject)(req.params.id);
|
|
300
|
+
if (!project) {
|
|
301
|
+
res.status(404).json({ error: 'Project not found' });
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
if (!(0, config_1.isProjectOwner)(project, user)) {
|
|
305
|
+
res.status(403).json({ error: 'Forbidden' });
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
const body = (req.body ?? {});
|
|
309
|
+
const cfg = (0, sync_config_1.getSyncConfig)(user);
|
|
310
|
+
if (typeof body.path === 'string') {
|
|
311
|
+
const trimmed = body.path.trim().replace(/\/+$/, '');
|
|
312
|
+
if (trimmed && !(0, sync_config_1.isValidRemotePath)(trimmed)) {
|
|
313
|
+
res.status(400).json({ error: '远端路径必须是绝对路径,且不能包含空格、glob 或 shell 特殊字符(macOS openrsync 无 --protect-args,只能在写入时拦截)' });
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (trimmed)
|
|
317
|
+
cfg.projectPaths[project.id] = trimmed;
|
|
318
|
+
else
|
|
319
|
+
delete cfg.projectPaths[project.id];
|
|
320
|
+
}
|
|
321
|
+
if (Array.isArray(body.excludes)) {
|
|
322
|
+
const ex = body.excludes
|
|
323
|
+
.filter((x) => typeof x === 'string')
|
|
324
|
+
.map((s) => s.trim())
|
|
325
|
+
.filter(Boolean)
|
|
326
|
+
.slice(0, 200);
|
|
327
|
+
if (ex.length)
|
|
328
|
+
cfg.projectExcludes[project.id] = ex;
|
|
329
|
+
else
|
|
330
|
+
delete cfg.projectExcludes[project.id];
|
|
331
|
+
}
|
|
332
|
+
(0, sync_config_1.setSyncConfig)(cfg);
|
|
333
|
+
(0, sync_dirty_1.invalidateDirty)(`${user}:${project.id}`); // path/excludes changed → recompute
|
|
334
|
+
res.json(projectSyncView(user, project.id, project.folderPath));
|
|
335
|
+
});
|
|
218
336
|
// GET /api/sync/status → { inFlight: string[] }
|
|
219
337
|
router.get('/status', (req, res) => {
|
|
220
338
|
const user = requireUser(req, res);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/routes/sync.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/routes/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,8 @@ export interface SyncConfig {
|
|
|
34
34
|
cron: string;
|
|
35
35
|
};
|
|
36
36
|
projectExcludes: Record<string, string[]>;
|
|
37
|
+
projectPaths: Record<string, string>;
|
|
38
|
+
projectPathsMigrated?: boolean;
|
|
37
39
|
}
|
|
38
40
|
export declare const DEFAULT_CONFIG: Omit<SyncConfig, 'username'>;
|
|
39
41
|
export declare function encryptPassword(plain: string): {
|
|
@@ -46,6 +48,14 @@ export declare function isValidKeyPath(p: string | undefined | null): boolean;
|
|
|
46
48
|
* or start with `.`/`-` so `rsync ... remote:root/<name>/` stays inside
|
|
47
49
|
* `remoteRoot`. `path.posix.join` does not protect against `..`. */
|
|
48
50
|
export declare function sanitizeFolderName(raw: string): string | null;
|
|
51
|
+
export declare function isValidRemotePath(p: string | undefined | null): boolean;
|
|
52
|
+
/** Read a project's remote sync path ('' when unset). */
|
|
53
|
+
export declare function getProjectPath(cfg: SyncConfig, projectId: string): string;
|
|
54
|
+
/** Set (or clear, when remotePath is empty) a project's remote sync path.
|
|
55
|
+
* Validates non-empty paths so this helper can never persist an unsafe value
|
|
56
|
+
* (the remote path is interpreted by the remote shell — see isValidRemotePath).
|
|
57
|
+
* Throws on an invalid non-empty path. */
|
|
58
|
+
export declare function setProjectPath(username: string, projectId: string, remotePath: string): void;
|
|
49
59
|
export declare function getSyncConfig(username: string): SyncConfig;
|
|
50
60
|
export declare function setSyncConfig(cfg: SyncConfig): void;
|
|
51
61
|
export declare function listUsersWithSyncConfig(): string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-config.d.ts","sourceRoot":"","sources":["../src/sync-config.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,CAAC;AAC9D,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,UAAU,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,aAAa,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"sync-config.d.ts","sourceRoot":"","sources":["../src/sync-config.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,CAAC;AAC9D,MAAM,MAAM,UAAU,GAAG,KAAK,GAAG,UAAU,CAAC;AAE5C,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,aAAa,CAAC;IACzB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,QAAQ,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,oBAAoB,CAAC,EAAE,OAAO,CAAC;CAChC;AAeD,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAWvD,CAAC;AA0BF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAU1E;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,CAezE;AASD,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAGpE;AAED;;sEAEsE;AACtE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO7D;AAgBD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAKvE;AAED,yDAAyD;AACzD,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;2CAG2C;AAC3C,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CAQ5F;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAmB1D;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAInD;AAED,wBAAgB,uBAAuB,IAAI,MAAM,EAAE,CAgBlD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,aAAa,GAAG,YAAY,CAAC,GAAG;IAC9F,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAKA"}
|
|
@@ -38,6 +38,9 @@ exports.encryptPassword = encryptPassword;
|
|
|
38
38
|
exports.decryptPassword = decryptPassword;
|
|
39
39
|
exports.isValidKeyPath = isValidKeyPath;
|
|
40
40
|
exports.sanitizeFolderName = sanitizeFolderName;
|
|
41
|
+
exports.isValidRemotePath = isValidRemotePath;
|
|
42
|
+
exports.getProjectPath = getProjectPath;
|
|
43
|
+
exports.setProjectPath = setProjectPath;
|
|
41
44
|
exports.getSyncConfig = getSyncConfig;
|
|
42
45
|
exports.setSyncConfig = setSyncConfig;
|
|
43
46
|
exports.listUsersWithSyncConfig = listUsersWithSyncConfig;
|
|
@@ -68,6 +71,7 @@ exports.DEFAULT_CONFIG = {
|
|
|
68
71
|
defaultExcludes: DEFAULT_EXCLUDES,
|
|
69
72
|
schedule: { enabled: false, cron: '0 3 * * *' },
|
|
70
73
|
projectExcludes: {},
|
|
74
|
+
projectPaths: {},
|
|
71
75
|
};
|
|
72
76
|
const SYNC_DIR = path.join(config_1.DATA_DIR, 'sync-config');
|
|
73
77
|
function ensureDir() {
|
|
@@ -146,22 +150,68 @@ function sanitizeFolderName(raw) {
|
|
|
146
150
|
return null;
|
|
147
151
|
return raw;
|
|
148
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* A per-project remote sync path lands after `host:` in the rsync spec and is
|
|
155
|
+
* interpreted by the REMOTE shell (glob + word-split). The macOS openrsync this
|
|
156
|
+
* project targets has NO `--protect-args`/`-s` to disable that — so we cannot
|
|
157
|
+
* neutralise it at the rsync layer (adding the flag would make every sync fail
|
|
158
|
+
* to spawn). Instead we reject, at write time, any path containing whitespace,
|
|
159
|
+
* control chars, or shell/glob metacharacters. Must be an absolute path.
|
|
160
|
+
*
|
|
161
|
+
* Modeled on INVALID_KEYPATH. `\s` covers space/tab/newline; the explicit
|
|
162
|
+
* \x00-\x1f covers the remaining control range. The metachars block command
|
|
163
|
+
* substitution, redirection, pipes, globbing and quoting tricks.
|
|
164
|
+
*/
|
|
165
|
+
const INVALID_REMOTE_PATH = /[\s'"\\`$;|&<>(){}*?[\]~\x00-\x1f]/;
|
|
166
|
+
function isValidRemotePath(p) {
|
|
167
|
+
if (!p)
|
|
168
|
+
return false; // empty = not configured (treated as "no path")
|
|
169
|
+
if (!p.startsWith('/'))
|
|
170
|
+
return false; // must be absolute
|
|
171
|
+
if (p.length > 1024)
|
|
172
|
+
return false;
|
|
173
|
+
return !INVALID_REMOTE_PATH.test(p);
|
|
174
|
+
}
|
|
175
|
+
/** Read a project's remote sync path ('' when unset). */
|
|
176
|
+
function getProjectPath(cfg, projectId) {
|
|
177
|
+
return cfg.projectPaths?.[projectId] ?? '';
|
|
178
|
+
}
|
|
179
|
+
/** Set (or clear, when remotePath is empty) a project's remote sync path.
|
|
180
|
+
* Validates non-empty paths so this helper can never persist an unsafe value
|
|
181
|
+
* (the remote path is interpreted by the remote shell — see isValidRemotePath).
|
|
182
|
+
* Throws on an invalid non-empty path. */
|
|
183
|
+
function setProjectPath(username, projectId, remotePath) {
|
|
184
|
+
if (remotePath && !isValidRemotePath(remotePath)) {
|
|
185
|
+
throw new Error('Invalid remote path');
|
|
186
|
+
}
|
|
187
|
+
const cfg = getSyncConfig(username);
|
|
188
|
+
if (remotePath)
|
|
189
|
+
cfg.projectPaths[projectId] = remotePath;
|
|
190
|
+
else
|
|
191
|
+
delete cfg.projectPaths[projectId];
|
|
192
|
+
setSyncConfig(cfg);
|
|
193
|
+
}
|
|
149
194
|
// ── Read / Write ─────────────────────────────────────────────────────────────
|
|
150
195
|
function getSyncConfig(username) {
|
|
151
196
|
ensureDir();
|
|
152
197
|
const file = userFile(username);
|
|
198
|
+
// structuredClone: DEFAULT_CONFIG holds mutable nested objects (projectPaths,
|
|
199
|
+
// projectExcludes, defaultExcludes, schedule). A shallow `{...DEFAULT_CONFIG}`
|
|
200
|
+
// spread would share those by reference, so any in-place mutation of the
|
|
201
|
+
// returned config (e.g. setProjectPath) would corrupt the shared default for
|
|
202
|
+
// every other user. Deep-clone on every read so each config is independent.
|
|
153
203
|
if (!fs.existsSync(file))
|
|
154
|
-
return { username, ...exports.DEFAULT_CONFIG };
|
|
204
|
+
return structuredClone({ username, ...exports.DEFAULT_CONFIG });
|
|
155
205
|
try {
|
|
156
206
|
const raw = fs.readFileSync(file, 'utf-8');
|
|
157
207
|
const parsed = JSON.parse(raw);
|
|
158
208
|
// username comes from the argument (authoritative) — if the file's
|
|
159
209
|
// `username` field is missing / stale / tampered, the argument wins.
|
|
160
210
|
const { username: _ignored, ...rest } = parsed;
|
|
161
|
-
return { ...exports.DEFAULT_CONFIG, ...rest, username };
|
|
211
|
+
return structuredClone({ ...exports.DEFAULT_CONFIG, ...rest, username });
|
|
162
212
|
}
|
|
163
213
|
catch {
|
|
164
|
-
return { username, ...exports.DEFAULT_CONFIG };
|
|
214
|
+
return structuredClone({ username, ...exports.DEFAULT_CONFIG });
|
|
165
215
|
}
|
|
166
216
|
}
|
|
167
217
|
function setSyncConfig(cfg) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-config.js","sourceRoot":"","sources":["../src/sync-config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"sync-config.js","sourceRoot":"","sources":["../src/sync-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True if any non-excluded file under `localPath` has an mtime newer than
|
|
3
|
+
* `lastSyncAt` (and not in the future). `lastSyncAt === 0` (never synced) →
|
|
4
|
+
* any present file makes it dirty. Returns false on the first sign of "clean"
|
|
5
|
+
* exhaustion, on read errors, or if the entry cap is hit (best-effort).
|
|
6
|
+
*/
|
|
7
|
+
export declare function computeDirty(localPath: string, excludes: string[], lastSyncAt: number): boolean;
|
|
8
|
+
/** Cached computeDirty keyed by `${username}:${projectId}`. */
|
|
9
|
+
export declare function getDirtyCached(key: string, localPath: string, excludes: string[], lastSyncAt: number): boolean;
|
|
10
|
+
/** Drop the cached result (call after a successful sync so the card updates). */
|
|
11
|
+
export declare function invalidateDirty(key: string): void;
|
|
12
|
+
//# sourceMappingURL=sync-dirty.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-dirty.d.ts","sourceRoot":"","sources":["../src/sync-dirty.ts"],"names":[],"mappings":"AAyEA;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CA4C/F;AAOD,+DAA+D;AAC/D,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAMT;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEjD"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.computeDirty = computeDirty;
|
|
37
|
+
exports.getDirtyCached = getDirtyCached;
|
|
38
|
+
exports.invalidateDirty = invalidateDirty;
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
function globToRegExp(glob, anchoredPath) {
|
|
42
|
+
let re = '';
|
|
43
|
+
for (const ch of glob) {
|
|
44
|
+
if (ch === '*')
|
|
45
|
+
re += anchoredPath ? '[^/]*' : '.*';
|
|
46
|
+
else if (ch === '?')
|
|
47
|
+
re += '.';
|
|
48
|
+
else
|
|
49
|
+
re += ch.replace(/[.+^${}()|[\]\\]/g, '\\$&');
|
|
50
|
+
}
|
|
51
|
+
return new RegExp(`^${re}$`);
|
|
52
|
+
}
|
|
53
|
+
function makeMatcher(excludes) {
|
|
54
|
+
const dirNames = new Set(); // `name/` → directories named `name` at any depth
|
|
55
|
+
const exactNames = new Set(); // `name` → file OR dir basename at any depth
|
|
56
|
+
const baseGlobs = []; // `*.log` → basename glob at any depth
|
|
57
|
+
const pathGlobs = []; // `a/b` → anchored relpath glob (best-effort)
|
|
58
|
+
for (let raw of excludes) {
|
|
59
|
+
raw = (raw || '').trim();
|
|
60
|
+
if (!raw || raw.startsWith('#'))
|
|
61
|
+
continue;
|
|
62
|
+
const isDir = raw.endsWith('/');
|
|
63
|
+
let p = isDir ? raw.slice(0, -1) : raw;
|
|
64
|
+
p = p.replace(/^\.?\//, ''); // strip a leading `/` or `./`
|
|
65
|
+
if (!p)
|
|
66
|
+
continue;
|
|
67
|
+
if (p.includes('/'))
|
|
68
|
+
pathGlobs.push(globToRegExp(p, true));
|
|
69
|
+
else if (p.includes('*') || p.includes('?'))
|
|
70
|
+
baseGlobs.push(globToRegExp(p, false));
|
|
71
|
+
else if (isDir)
|
|
72
|
+
dirNames.add(p);
|
|
73
|
+
else
|
|
74
|
+
exactNames.add(p);
|
|
75
|
+
}
|
|
76
|
+
const matchBase = (name) => exactNames.has(name) || baseGlobs.some((r) => r.test(name));
|
|
77
|
+
const matchPath = (rel) => pathGlobs.length > 0 && pathGlobs.some((r) => r.test(rel));
|
|
78
|
+
return {
|
|
79
|
+
excludesDir: (name, rel) => dirNames.has(name) || matchBase(name) || matchPath(rel),
|
|
80
|
+
excludesFile: (name, rel) => matchBase(name) || matchPath(rel),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
// ── walk ─────────────────────────────────────────────────────────────────────
|
|
84
|
+
const MAX_ENTRIES = 50000; // safety valve for pathological trees
|
|
85
|
+
// Slack on the "ignore future-dated files" guard. File mtimeMs is fractional
|
|
86
|
+
// (sub-ms) while Date.now() is integer ms, so a file touched in the same
|
|
87
|
+
// millisecond as the check can read a hair "in the future" — without slack it
|
|
88
|
+
// would be wrongly skipped. The guard only needs to catch grossly-future
|
|
89
|
+
// timestamps (NFS/touch year-2099 pinning dirty forever), so a couple seconds
|
|
90
|
+
// of slack is safe.
|
|
91
|
+
const FUTURE_SLACK_MS = 2000;
|
|
92
|
+
/**
|
|
93
|
+
* True if any non-excluded file under `localPath` has an mtime newer than
|
|
94
|
+
* `lastSyncAt` (and not in the future). `lastSyncAt === 0` (never synced) →
|
|
95
|
+
* any present file makes it dirty. Returns false on the first sign of "clean"
|
|
96
|
+
* exhaustion, on read errors, or if the entry cap is hit (best-effort).
|
|
97
|
+
*/
|
|
98
|
+
function computeDirty(localPath, excludes, lastSyncAt) {
|
|
99
|
+
const m = makeMatcher(excludes);
|
|
100
|
+
const now = Date.now();
|
|
101
|
+
let walked = 0;
|
|
102
|
+
function walk(dir, rel) {
|
|
103
|
+
let dirents;
|
|
104
|
+
try {
|
|
105
|
+
dirents = fs.readdirSync(dir, { withFileTypes: true });
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return false; // unreadable dir → ignore
|
|
109
|
+
}
|
|
110
|
+
for (const d of dirents) {
|
|
111
|
+
if (++walked > MAX_ENTRIES)
|
|
112
|
+
return false;
|
|
113
|
+
const name = d.name;
|
|
114
|
+
const childRel = rel ? `${rel}/${name}` : name;
|
|
115
|
+
if (d.isDirectory()) {
|
|
116
|
+
// Don't follow symlinked dirs (isDirectory() is false for symlinks) —
|
|
117
|
+
// avoids loops and escaping the tree.
|
|
118
|
+
if (m.excludesDir(name, childRel))
|
|
119
|
+
continue;
|
|
120
|
+
if (walk(path.join(dir, name), childRel))
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
else if (d.isFile() || d.isSymbolicLink()) {
|
|
124
|
+
if (m.excludesFile(name, childRel))
|
|
125
|
+
continue;
|
|
126
|
+
let st;
|
|
127
|
+
try {
|
|
128
|
+
st = fs.lstatSync(path.join(dir, name)); // own mtime, don't follow links
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
const mt = st.mtimeMs;
|
|
134
|
+
// Newer than last sync but not grossly future-dated (a bogus future
|
|
135
|
+
// mtime — NFS/touch — must not pin the project dirty forever).
|
|
136
|
+
if (mt > lastSyncAt && mt <= now + FUTURE_SLACK_MS)
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
try {
|
|
143
|
+
return walk(localPath, '');
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// ── TTL cache ────────────────────────────────────────────────────────────────
|
|
150
|
+
const TTL_MS = 10000;
|
|
151
|
+
const cache = new Map();
|
|
152
|
+
/** Cached computeDirty keyed by `${username}:${projectId}`. */
|
|
153
|
+
function getDirtyCached(key, localPath, excludes, lastSyncAt) {
|
|
154
|
+
const c = cache.get(key);
|
|
155
|
+
if (c && Date.now() - c.at < TTL_MS)
|
|
156
|
+
return c.dirty;
|
|
157
|
+
const dirty = computeDirty(localPath, excludes, lastSyncAt);
|
|
158
|
+
cache.set(key, { dirty, at: Date.now() });
|
|
159
|
+
return dirty;
|
|
160
|
+
}
|
|
161
|
+
/** Drop the cached result (call after a successful sync so the card updates). */
|
|
162
|
+
function invalidateDirty(key) {
|
|
163
|
+
cache.delete(key);
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=sync-dirty.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-dirty.js","sourceRoot":"","sources":["../src/sync-dirty.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-shot migration for the per-project-path refactor.
|
|
3
|
+
*
|
|
4
|
+
* Before: every project synced to `<remoteRoot>/<sanitized name>` automatically.
|
|
5
|
+
* After: each project has its own `projectPaths[id]`. To not break existing
|
|
6
|
+
* setups, seed each user's owned projects with `remoteRoot/<name>` — the exact
|
|
7
|
+
* target the old code computed — when they have a `remoteRoot` but no
|
|
8
|
+
* `projectPaths` yet.
|
|
9
|
+
*
|
|
10
|
+
* Idempotent: a user with ANY `projectPaths` entry is skipped (already migrated
|
|
11
|
+
* or already using the new per-project config). Run once at startup. Kept OUT
|
|
12
|
+
* of `getSyncConfig` (hot path) to avoid a per-read project scan + write.
|
|
13
|
+
*/
|
|
14
|
+
export declare function migrateRemoteRootToProjectPaths(): void;
|
|
15
|
+
//# sourceMappingURL=sync-migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-migrate.d.ts","sourceRoot":"","sources":["../src/sync-migrate.ts"],"names":[],"mappings":"AASA;;;;;;;;;;;;GAYG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAqCtD"}
|