@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.
Files changed (68) hide show
  1. package/backend/dist/__tests__/sync-refactor.test.d.ts +2 -0
  2. package/backend/dist/__tests__/sync-refactor.test.d.ts.map +1 -0
  3. package/backend/dist/__tests__/sync-refactor.test.js +212 -0
  4. package/backend/dist/__tests__/sync-refactor.test.js.map +1 -0
  5. package/backend/dist/index.d.ts.map +1 -1
  6. package/backend/dist/index.js +2 -0
  7. package/backend/dist/index.js.map +1 -1
  8. package/backend/dist/routes/filesystem.d.ts.map +1 -1
  9. package/backend/dist/routes/filesystem.js +49 -0
  10. package/backend/dist/routes/filesystem.js.map +1 -1
  11. package/backend/dist/routes/sync.d.ts.map +1 -1
  12. package/backend/dist/routes/sync.js +119 -1
  13. package/backend/dist/routes/sync.js.map +1 -1
  14. package/backend/dist/sync-config.d.ts +10 -0
  15. package/backend/dist/sync-config.d.ts.map +1 -1
  16. package/backend/dist/sync-config.js +53 -3
  17. package/backend/dist/sync-config.js.map +1 -1
  18. package/backend/dist/sync-dirty.d.ts +12 -0
  19. package/backend/dist/sync-dirty.d.ts.map +1 -0
  20. package/backend/dist/sync-dirty.js +165 -0
  21. package/backend/dist/sync-dirty.js.map +1 -0
  22. package/backend/dist/sync-migrate.d.ts +15 -0
  23. package/backend/dist/sync-migrate.d.ts.map +1 -0
  24. package/backend/dist/sync-migrate.js +92 -0
  25. package/backend/dist/sync-migrate.js.map +1 -0
  26. package/backend/dist/sync-scheduler.d.ts.map +1 -1
  27. package/backend/dist/sync-scheduler.js +3 -1
  28. package/backend/dist/sync-scheduler.js.map +1 -1
  29. package/backend/dist/sync-service.d.ts.map +1 -1
  30. package/backend/dist/sync-service.js +34 -16
  31. package/backend/dist/sync-service.js.map +1 -1
  32. package/backend/dist/sync-state.d.ts +5 -0
  33. package/backend/dist/sync-state.d.ts.map +1 -0
  34. package/backend/dist/sync-state.js +95 -0
  35. package/backend/dist/sync-state.js.map +1 -0
  36. package/backend/package-lock.json +63 -0
  37. package/backend/package.json +1 -0
  38. package/frontend/dist/assets/{ChatOverlay-BYHxECck.js → ChatOverlay-Cg09i5qF.js} +1 -1
  39. package/frontend/dist/assets/{ClaudeMemPage-AeBcDyNZ.js → ClaudeMemPage-CT87pX5z.js} +1 -1
  40. package/frontend/dist/assets/{GraphPreview-CraKSWzy.js → GraphPreview-LQt3-skN.js} +2 -2
  41. package/frontend/dist/assets/MobilePage-NHtpiQsi.js +14 -0
  42. package/frontend/dist/assets/OfficePreview-CH1bJV2V.js +2 -0
  43. package/frontend/dist/assets/{PdfPreview-BX-q3oXm.js → PdfPreview-BDDzOq58.js} +1 -1
  44. package/frontend/dist/assets/{ProjectPage-DbVFAUzJ.js → ProjectPage-BoOR1Zr9.js} +5 -5
  45. package/frontend/dist/assets/ProjectSettingsPage-ClHkL2L4.js +13 -0
  46. package/frontend/dist/assets/{SettingsPage-CoyFVnCz.js → SettingsPage-Q7dhf4gJ.js} +2 -2
  47. package/frontend/dist/assets/{SkillHubPage-CjFCt8dE.js → SkillHubPage-CI5o_FsS.js} +3 -3
  48. package/frontend/dist/assets/{check-circle-2-DqS6oPDV.js → check-circle-2-CZgbn9H8.js} +1 -1
  49. package/frontend/dist/assets/{chevron-down-BPnYeDMC.js → chevron-down-efPsOYlh.js} +1 -1
  50. package/frontend/dist/assets/{file-text-CPajDnww.js → file-text-mpbJn406.js} +1 -1
  51. package/frontend/dist/assets/index-BjydjBX7.js +75 -0
  52. package/frontend/dist/assets/index-DS0RkMkF.css +1 -0
  53. package/frontend/dist/assets/{index-DrpeVVUe.js → index-Di-Iyd_L.js} +1 -1
  54. package/frontend/dist/assets/{index-Di5Ntujm.js → index-oPZyCxeH.js} +1 -1
  55. package/frontend/dist/assets/{jszip.min-BxSvgCaf.js → jszip.min-nePKj7L6.js} +1 -1
  56. package/frontend/dist/assets/save-BYi9FbQu.js +7 -0
  57. package/frontend/dist/assets/{search-1chGdDoe.js → search-09qCXbdG.js} +1 -1
  58. package/frontend/dist/assets/select-De5oupVM.js +1 -0
  59. package/frontend/dist/assets/tabs-CQZcN-v5.js +7 -0
  60. package/frontend/dist/assets/textarea-Ge2i0ho4.js +1 -0
  61. package/frontend/dist/index.html +2 -2
  62. package/package.json +1 -1
  63. package/frontend/dist/assets/MobilePage-FMVoG0Pl.js +0 -14
  64. package/frontend/dist/assets/OfficePreview-DQ8oitRF.js +0 -2
  65. package/frontend/dist/assets/index-2wJikgEX.js +0 -75
  66. package/frontend/dist/assets/index-61v6oszV.css +0 -1
  67. package/frontend/dist/assets/select-YkUpG7ZI.js +0 -1
  68. 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
- const projects = (0, config_1.getProjects)().filter((p) => !p.archived && (0, config_1.isProjectOwner)(p, user));
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;CAC3C;AAeD,eAAO,MAAM,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,UAAU,CAUvD,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;AAID,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAc1D;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"}
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":"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"}
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"}