clawatch 1.0.14 → 1.0.20

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 (115) hide show
  1. package/backend/dist/alertChecker.d.ts.map +1 -1
  2. package/backend/dist/alertChecker.js +130 -1
  3. package/backend/dist/alertChecker.js.map +1 -1
  4. package/backend/dist/db.d.ts.map +1 -1
  5. package/backend/dist/db.js +1 -0
  6. package/backend/dist/db.js.map +1 -1
  7. package/backend/dist/projects.d.ts +9 -0
  8. package/backend/dist/projects.d.ts.map +1 -1
  9. package/backend/dist/projects.js +87 -23
  10. package/backend/dist/projects.js.map +1 -1
  11. package/backend/dist/routes.d.ts.map +1 -1
  12. package/backend/dist/routes.js +687 -54
  13. package/backend/dist/routes.js.map +1 -1
  14. package/backend/dist/sessions.d.ts +14 -7
  15. package/backend/dist/sessions.d.ts.map +1 -1
  16. package/backend/dist/sessions.js +199 -43
  17. package/backend/dist/sessions.js.map +1 -1
  18. package/backend/dist/sync.d.ts.map +1 -1
  19. package/backend/dist/sync.js +293 -33
  20. package/backend/dist/sync.js.map +1 -1
  21. package/dist/cli.js +222 -91
  22. package/dist/cli.js.map +1 -1
  23. package/dist/collector.d.ts.map +1 -1
  24. package/dist/collector.js +67 -62
  25. package/dist/collector.js.map +1 -1
  26. package/dist/config.d.ts +16 -1
  27. package/dist/config.d.ts.map +1 -1
  28. package/dist/config.js +69 -5
  29. package/dist/config.js.map +1 -1
  30. package/frontend/.next/BUILD_ID +1 -1
  31. package/frontend/.next/build-manifest.json +4 -4
  32. package/frontend/.next/server/app/_global-error/page/build-manifest.json +2 -2
  33. package/frontend/.next/server/app/_global-error/page.js.nft.json +1 -1
  34. package/frontend/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  35. package/frontend/.next/server/app/_global-error.html +2 -2
  36. package/frontend/.next/server/app/_global-error.rsc +8 -8
  37. package/frontend/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +2 -2
  38. package/frontend/.next/server/app/_global-error.segments/_full.segment.rsc +8 -8
  39. package/frontend/.next/server/app/_global-error.segments/_head.segment.rsc +4 -4
  40. package/frontend/.next/server/app/_global-error.segments/_index.segment.rsc +3 -3
  41. package/frontend/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  42. package/frontend/.next/server/app/_not-found/page/build-manifest.json +2 -2
  43. package/frontend/.next/server/app/_not-found/page.js.nft.json +1 -1
  44. package/frontend/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  45. package/frontend/.next/server/app/_not-found.html +1 -1
  46. package/frontend/.next/server/app/_not-found.rsc +9 -9
  47. package/frontend/.next/server/app/_not-found.segments/_full.segment.rsc +9 -9
  48. package/frontend/.next/server/app/_not-found.segments/_head.segment.rsc +4 -4
  49. package/frontend/.next/server/app/_not-found.segments/_index.segment.rsc +4 -4
  50. package/frontend/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +2 -2
  51. package/frontend/.next/server/app/_not-found.segments/_not-found.segment.rsc +3 -3
  52. package/frontend/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  53. package/frontend/.next/server/app/dashboard/page/build-manifest.json +2 -2
  54. package/frontend/.next/server/app/dashboard/page.js.nft.json +1 -1
  55. package/frontend/.next/server/app/dashboard/page_client-reference-manifest.js +1 -1
  56. package/frontend/.next/server/app/dashboard/projects/[id]/page/build-manifest.json +2 -2
  57. package/frontend/.next/server/app/dashboard/projects/[id]/page.js.nft.json +1 -1
  58. package/frontend/.next/server/app/dashboard/projects/[id]/page_client-reference-manifest.js +1 -1
  59. package/frontend/.next/server/app/dashboard/sessions/[id]/page/build-manifest.json +2 -2
  60. package/frontend/.next/server/app/dashboard/sessions/[id]/page.js.nft.json +1 -1
  61. package/frontend/.next/server/app/dashboard/sessions/[id]/page_client-reference-manifest.js +1 -1
  62. package/frontend/.next/server/app/dashboard.html +1 -1
  63. package/frontend/.next/server/app/dashboard.rsc +10 -10
  64. package/frontend/.next/server/app/dashboard.segments/_full.segment.rsc +10 -10
  65. package/frontend/.next/server/app/dashboard.segments/_head.segment.rsc +4 -4
  66. package/frontend/.next/server/app/dashboard.segments/_index.segment.rsc +4 -4
  67. package/frontend/.next/server/app/dashboard.segments/_tree.segment.rsc +2 -2
  68. package/frontend/.next/server/app/dashboard.segments/dashboard/__PAGE__.segment.rsc +4 -4
  69. package/frontend/.next/server/app/dashboard.segments/dashboard.segment.rsc +3 -3
  70. package/frontend/.next/server/app/index.html +1 -1
  71. package/frontend/.next/server/app/index.rsc +10 -10
  72. package/frontend/.next/server/app/index.segments/__PAGE__.segment.rsc +4 -4
  73. package/frontend/.next/server/app/index.segments/_full.segment.rsc +10 -10
  74. package/frontend/.next/server/app/index.segments/_head.segment.rsc +4 -4
  75. package/frontend/.next/server/app/index.segments/_index.segment.rsc +4 -4
  76. package/frontend/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  77. package/frontend/.next/server/app/page/build-manifest.json +2 -2
  78. package/frontend/.next/server/app/page.js.nft.json +1 -1
  79. package/frontend/.next/server/app/page_client-reference-manifest.js +1 -1
  80. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__008d27c3._.js +1 -1
  81. package/frontend/.next/server/chunks/ssr/{[root-of-the-server]__bdeac1dc._.js → [root-of-the-server]__32661fd1._.js} +2 -2
  82. package/frontend/.next/server/chunks/ssr/{[root-of-the-server]__8511f4a3._.js → [root-of-the-server]__9b38782c._.js} +2 -2
  83. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__a64655ed._.js +2 -2
  84. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__d2832b3e._.js +3 -0
  85. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__f437da88._.js +1 -1
  86. package/frontend/.next/server/chunks/ssr/_2bfdd77b._.js +1 -1
  87. package/frontend/.next/server/chunks/ssr/_b0ae6d33._.js +1 -1
  88. package/frontend/.next/server/chunks/ssr/_e17fe96b._.js +3 -0
  89. package/frontend/.next/server/chunks/ssr/_f26b1aca._.js +1 -1
  90. package/frontend/.next/server/chunks/ssr/node_modules_next_dist_client_components_9774470f._.js +1 -1
  91. package/frontend/.next/server/chunks/ssr/{node_modules_next_dist_27457240._.js → node_modules_next_dist_esm_eedfc1fd._.js} +2 -2
  92. package/frontend/.next/server/middleware-build-manifest.js +2 -2
  93. package/frontend/.next/server/pages/404.html +1 -1
  94. package/frontend/.next/server/pages/500.html +2 -2
  95. package/frontend/.next/static/chunks/641e855850e79de9.css +3 -0
  96. package/frontend/.next/static/chunks/{d702a24e2b6c48fa.js → 6b50f8d2ee1d2bea.js} +2 -2
  97. package/frontend/.next/static/chunks/88faea50dcf8f778.js +1 -0
  98. package/frontend/.next/static/chunks/8ffedcb68f4a998f.js +1 -0
  99. package/frontend/.next/static/chunks/{d2be314c3ece3fbe.js → a2dfb6fc5208ab9b.js} +1 -1
  100. package/frontend/.next/static/chunks/a909e37955d0604e.js +1 -0
  101. package/frontend/.next/static/chunks/ba72b58eb8cb3f4e.js +1 -0
  102. package/frontend/.next/static/chunks/e975763f7a359fb5.js +1 -0
  103. package/frontend/.next/static/chunks/{turbopack-0df1acbb994b2a74.js → turbopack-1e12e8d4e4225e2f.js} +1 -1
  104. package/frontend/package.json +1 -0
  105. package/package.json +4 -3
  106. package/frontend/.next/server/chunks/ssr/[root-of-the-server]__48e09bc8._.js +0 -3
  107. package/frontend/.next/server/chunks/ssr/src_app_dashboard_page_tsx_196c74b5._.js +0 -3
  108. package/frontend/.next/static/chunks/284aee0eb323076c.js +0 -1
  109. package/frontend/.next/static/chunks/2b7d8037bb74445e.css +0 -3
  110. package/frontend/.next/static/chunks/520be2943f8ae266.js +0 -1
  111. package/frontend/.next/static/chunks/58873fd2347d1c88.js +0 -1
  112. package/frontend/.next/static/chunks/a308a3cc32b8bc4a.js +0 -1
  113. /package/frontend/.next/static/{MXEzMiO_GmJh6uODpfgzU → bKa8vfUmSWQxqmsnhQLtj}/_buildManifest.js +0 -0
  114. /package/frontend/.next/static/{MXEzMiO_GmJh6uODpfgzU → bKa8vfUmSWQxqmsnhQLtj}/_clientMiddlewareManifest.json +0 -0
  115. /package/frontend/.next/static/{MXEzMiO_GmJh6uODpfgzU → bKa8vfUmSWQxqmsnhQLtj}/_ssgManifest.js +0 -0
@@ -4,6 +4,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.syncAllData = syncAllData;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
7
9
  const db_1 = __importDefault(require("./db"));
8
10
  const sessions_1 = require("./sessions");
9
11
  // --- Stop words to ignore when extracting keywords ---
@@ -57,48 +59,275 @@ function extractKeywords(title) {
57
59
  );
58
60
  return [...new Set(words)];
59
61
  }
62
+ // --- Hardcoded pattern overrides ---
63
+ // TITLE_PATTERNS: broader, used for title matching (short text, less noise)
64
+ // CONTENT_PATTERNS: stricter, used for content sampling (avoids false positives from thinking/tool text)
65
+ const TITLE_PATTERNS = [
66
+ [/cla\s*watch|clawatch|clawwatch|datadog.*agent|observability.*agent|alert.*filter|alert.*pagina|acknowledge.?all.*alert|severity.*filter|dashboard.*alert/i, "ClaWatch"],
67
+ [/clawmetry/i, "Clawmetry"],
68
+ [/racing.?game|race.*game|game.*race|crossing.*finish/i, "Racing Game"],
69
+ [/weather.*country|weather.*mvp|weather.*app/i, "Weather App"],
70
+ [/linkedin.*connect|connection.*graph|orggraph/i, "LinkedIn Graph"],
71
+ [/lovable.*ai|ai.*assistant.*platform/i, "Lovable for AI"],
72
+ [/landing.*page|hero.*section|hero.*terminal/i, "Landing Pages"],
73
+ [/genygen|genway/i, "Genygen"],
74
+ [/datadog.*openclaw|observability.*platform/i, "ClaWatch"],
75
+ [/flight.*track|טיסה|טיסות/i, "Flight Tracker"],
76
+ ];
77
+ // Content patterns: only exact product/feature names, no loose keyword combos
78
+ const CONTENT_PATTERNS = [
79
+ [/clawatch|clawwatch|cla\s*watch/i, "ClaWatch"],
80
+ [/clawmetry/i, "Clawmetry"],
81
+ [/racing.?game/i, "Racing Game"],
82
+ [/weather.*country|weather.*mvp/i, "Weather App"],
83
+ [/linkedin.*graph|orggraph/i, "LinkedIn Graph"],
84
+ [/lovable.*ai/i, "Lovable for AI"],
85
+ [/genygen/i, "Genygen"],
86
+ [/flight.?tracker/i, "Flight Tracker"],
87
+ ];
88
+ // --- Union-Find for clustering ---
89
+ class UnionFind {
90
+ parent = new Map();
91
+ rank = new Map();
92
+ find(x) {
93
+ if (!this.parent.has(x)) {
94
+ this.parent.set(x, x);
95
+ this.rank.set(x, 0);
96
+ }
97
+ if (this.parent.get(x) !== x) {
98
+ this.parent.set(x, this.find(this.parent.get(x)));
99
+ }
100
+ return this.parent.get(x);
101
+ }
102
+ union(x, y) {
103
+ const rx = this.find(x);
104
+ const ry = this.find(y);
105
+ if (rx === ry)
106
+ return;
107
+ const rankX = this.rank.get(rx);
108
+ const rankY = this.rank.get(ry);
109
+ if (rankX < rankY) {
110
+ this.parent.set(rx, ry);
111
+ }
112
+ else if (rankX > rankY) {
113
+ this.parent.set(ry, rx);
114
+ }
115
+ else {
116
+ this.parent.set(ry, rx);
117
+ this.rank.set(rx, rankX + 1);
118
+ }
119
+ }
120
+ }
60
121
  /**
61
- * Auto-detect projects by matching session titles against known patterns.
62
- * Uses pattern-based matching: looks for distinctive multi-word phrases,
63
- * product names, and identifiable project references.
122
+ * Count pattern matches in a session's JSONL content.
123
+ * Returns the count of matches for a given pattern, sampling up to maxBytes.
124
+ * Requires multiple hits to avoid false positives from tool calls / infra noise.
125
+ */
126
+ function countPatternInContent(sessionId, agentId, pattern, maxBytes = 32768) {
127
+ const profiles = (0, sessions_1.discoverProfiles)();
128
+ for (const profile of profiles) {
129
+ // Also check topic sessions (sessionId-topic-*.jsonl)
130
+ const sessionsDir = path_1.default.join(profile.dir, "agents", agentId, "sessions");
131
+ if (!fs_1.default.existsSync(sessionsDir))
132
+ continue;
133
+ const filePath = path_1.default.join(sessionsDir, `${sessionId}.jsonl`);
134
+ if (!fs_1.default.existsSync(filePath))
135
+ continue;
136
+ try {
137
+ const stat = fs_1.default.statSync(filePath);
138
+ const fd = fs_1.default.openSync(filePath, "r");
139
+ let content = "";
140
+ // Read from the beginning
141
+ const headSize = Math.min(stat.size, maxBytes);
142
+ const headBuf = Buffer.alloc(headSize);
143
+ fs_1.default.readSync(fd, headBuf, 0, headSize, 0);
144
+ content += headBuf.toString("utf-8");
145
+ // Also read from the end if file is larger (catches late project references)
146
+ if (stat.size > maxBytes * 2) {
147
+ const tailSize = Math.min(stat.size - maxBytes, maxBytes);
148
+ const tailBuf = Buffer.alloc(tailSize);
149
+ fs_1.default.readSync(fd, tailBuf, 0, tailSize, stat.size - tailSize);
150
+ content += tailBuf.toString("utf-8");
151
+ }
152
+ fs_1.default.closeSync(fd);
153
+ const matches = content.match(new RegExp(pattern.source, "gi"));
154
+ return matches ? matches.length : 0;
155
+ }
156
+ catch {
157
+ return 0;
158
+ }
159
+ }
160
+ return 0;
161
+ }
162
+ // Minimum pattern hits in content to count as a project match.
163
+ // Prevents false positives from single mentions in tool calls or quoted text.
164
+ const CONTENT_MATCH_THRESHOLD = 3;
165
+ /**
166
+ * Auto-detect projects using:
167
+ * 1. Hardcoded pattern matching (first pass — checks title + content sample)
168
+ * 2. Keyword-based Jaccard clustering (second pass, everything else)
64
169
  */
65
170
  function autoDetectProjects(sessions) {
66
- // Known project patterns: [regex, display name]
67
- // These are detected from session content
68
- const PROJECT_PATTERNS = [
69
- [/cla\s*watch|clawatch|datadog.*agent|observability.*agent|agent.*observability/i, "ClaWatch"],
70
- [/clawmetry/i, "Clawmetry"],
71
- [/openclaw/i, "OpenClaw"],
72
- [/racing.?game|race.*game|game.*race|crossing.*finish/i, "Racing Game"],
73
- [/weather.*country|weather.*mvp|weather.*app/i, "Weather App"],
74
- [/linkedin.*connect|connection.*graph|orggraph/i, "LinkedIn Graph"],
75
- [/lovable.*ai|ai.*assistant.*platform/i, "Lovable for AI"],
76
- [/landing.*page|hero.*section|hero.*terminal/i, "Landing Pages"],
77
- [/genygen|genway/i, "Genygen"],
78
- [/datadog.*openclaw|observability.*platform/i, "ClaWatch"],
79
- [/flight.*track|טיסה|טיסות/i, "Flight Tracker"],
80
- ];
81
- const projects = new Map();
171
+ const result = new Map();
172
+ const patternMatched = new Set(); // session IDs matched by patterns
173
+ // --- Pass 1: Hardcoded patterns (title first, then content sample) ---
174
+ const patternProjects = new Map();
82
175
  for (const session of sessions) {
83
176
  const title = session.title || "";
84
- if (title === "Untitled session" || title.length < 5)
177
+ // Try title match first (fast path, broader patterns OK for short text)
178
+ let matched = false;
179
+ if (title !== "Untitled session" && title.length >= 5) {
180
+ for (const [pattern, projectName] of TITLE_PATTERNS) {
181
+ if (pattern.test(title)) {
182
+ const projectId = `auto_${projectName.toLowerCase().replace(/[^a-z0-9]+/g, "_")}`;
183
+ if (!patternProjects.has(projectId)) {
184
+ patternProjects.set(projectId, { name: projectName, sessionIds: new Set() });
185
+ }
186
+ patternProjects.get(projectId).sessionIds.add(session.id);
187
+ patternMatched.add(session.id);
188
+ matched = true;
189
+ break;
190
+ }
191
+ }
192
+ }
193
+ // If title didn't match, check content with stricter patterns
194
+ // Requires 3+ hits to avoid false positives from tool calls / infra noise
195
+ if (!matched) {
196
+ for (const [pattern, projectName] of CONTENT_PATTERNS) {
197
+ const hits = countPatternInContent(session.id, session.agentId, pattern);
198
+ if (hits >= CONTENT_MATCH_THRESHOLD) {
199
+ const projectId = `auto_${projectName.toLowerCase().replace(/[^a-z0-9]+/g, "_")}`;
200
+ if (!patternProjects.has(projectId)) {
201
+ patternProjects.set(projectId, { name: projectName, sessionIds: new Set() });
202
+ }
203
+ patternProjects.get(projectId).sessionIds.add(session.id);
204
+ patternMatched.add(session.id);
205
+ break;
206
+ }
207
+ }
208
+ }
209
+ }
210
+ // Allow single-session pattern matches too (they'll grow via co-occurrence)
211
+ for (const [id, project] of patternProjects) {
212
+ result.set(id, { name: project.name, sessionIds: Array.from(project.sessionIds) });
213
+ }
214
+ // --- Pass 1.5: Deep content scan for unmatched sessions ---
215
+ // Some sessions have project references deeper in the file (beyond the initial 32KB sample).
216
+ // For sessions that didn't match yet, do a larger scan sampling both the beginning and end of the file.
217
+ for (const session of sessions) {
218
+ if (patternMatched.has(session.id))
85
219
  continue;
86
- for (const [pattern, projectName] of PROJECT_PATTERNS) {
87
- if (pattern.test(title)) {
220
+ for (const [pattern, projectName] of CONTENT_PATTERNS) {
221
+ // Scan larger portion: first 32KB + last 32KB (catches late references)
222
+ const hits = countPatternInContent(session.id, session.agentId, pattern, 65536);
223
+ if (hits >= CONTENT_MATCH_THRESHOLD) {
88
224
  const projectId = `auto_${projectName.toLowerCase().replace(/[^a-z0-9]+/g, "_")}`;
89
- if (!projects.has(projectId)) {
90
- projects.set(projectId, { name: projectName, sessionIds: new Set() });
225
+ if (!result.has(projectId)) {
226
+ result.set(projectId, { name: projectName, sessionIds: [] });
91
227
  }
92
- projects.get(projectId).sessionIds.add(session.id);
93
- break; // First match wins — sessions only belong to one auto-project
228
+ result.get(projectId).sessionIds.push(session.id);
229
+ patternMatched.add(session.id);
230
+ break;
94
231
  }
95
232
  }
96
233
  }
97
- // Convert Sets to arrays and filter out single-session projects
98
- const result = new Map();
99
- for (const [id, project] of projects) {
100
- if (project.sessionIds.size >= 2) {
101
- result.set(id, { name: project.name, sessionIds: Array.from(project.sessionIds) });
234
+ // --- Pass 2: Keyword clustering for remaining sessions ---
235
+ // Build keyword sets and inverted index
236
+ const sessionKeywords = new Map();
237
+ const sessionIndexToId = [];
238
+ const invertedIndex = new Map();
239
+ for (const session of sessions) {
240
+ // Skip sessions already matched by patterns
241
+ if (patternMatched.has(session.id))
242
+ continue;
243
+ const title = session.title || "";
244
+ if (title === "Untitled session" || title.length < 5)
245
+ continue;
246
+ const keywords = extractKeywords(title);
247
+ // Need at least 2 keywords for meaningful clustering
248
+ if (keywords.length < 2)
249
+ continue;
250
+ const idx = sessionIndexToId.length;
251
+ sessionIndexToId.push(session.id);
252
+ const keywordSet = new Set(keywords);
253
+ sessionKeywords.set(idx, keywordSet);
254
+ for (const kw of keywordSet) {
255
+ if (!invertedIndex.has(kw)) {
256
+ invertedIndex.set(kw, []);
257
+ }
258
+ invertedIndex.get(kw).push(idx);
259
+ }
260
+ }
261
+ // Build similarity graph using inverted index (avoids O(n²))
262
+ const JACCARD_THRESHOLD = 0.25;
263
+ const uf = new UnionFind();
264
+ const compared = new Set();
265
+ for (const [, indices] of invertedIndex) {
266
+ for (let i = 0; i < indices.length; i++) {
267
+ for (let j = i + 1; j < indices.length; j++) {
268
+ const a = indices[i];
269
+ const b = indices[j];
270
+ const pairKey = a < b ? `${a}:${b}` : `${b}:${a}`;
271
+ if (compared.has(pairKey))
272
+ continue;
273
+ compared.add(pairKey);
274
+ const setA = sessionKeywords.get(a);
275
+ const setB = sessionKeywords.get(b);
276
+ // Jaccard similarity
277
+ let intersection = 0;
278
+ for (const kw of setA) {
279
+ if (setB.has(kw))
280
+ intersection++;
281
+ }
282
+ const union = setA.size + setB.size - intersection;
283
+ const jaccard = union > 0 ? intersection / union : 0;
284
+ if (jaccard >= JACCARD_THRESHOLD) {
285
+ uf.union(a, b);
286
+ }
287
+ }
288
+ }
289
+ }
290
+ // Collect clusters
291
+ const clusters = new Map();
292
+ for (let i = 0; i < sessionIndexToId.length; i++) {
293
+ if (!sessionKeywords.has(i))
294
+ continue;
295
+ const root = uf.find(i);
296
+ if (!clusters.has(root)) {
297
+ clusters.set(root, []);
298
+ }
299
+ clusters.get(root).push(i);
300
+ }
301
+ // Create projects from clusters (min size 2)
302
+ for (const [, members] of clusters) {
303
+ if (members.length < 2)
304
+ continue;
305
+ // Count keyword frequencies across the cluster
306
+ const kwFreq = new Map();
307
+ for (const idx of members) {
308
+ for (const kw of sessionKeywords.get(idx)) {
309
+ kwFreq.set(kw, (kwFreq.get(kw) || 0) + 1);
310
+ }
311
+ }
312
+ // Top 2-3 keywords by frequency
313
+ const topKw = Array.from(kwFreq.entries())
314
+ .sort((a, b) => b[1] - a[1])
315
+ .slice(0, 3)
316
+ .map(([kw]) => kw);
317
+ const projectId = `auto_${topKw.join("_")}`;
318
+ const projectName = topKw.map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
319
+ const sessionIds = members.map((idx) => sessionIndexToId[idx]);
320
+ // Merge with any existing result entry
321
+ if (result.has(projectId)) {
322
+ const existing = result.get(projectId);
323
+ const existingSet = new Set(existing.sessionIds);
324
+ for (const sid of sessionIds) {
325
+ existingSet.add(sid);
326
+ }
327
+ existing.sessionIds = Array.from(existingSet);
328
+ }
329
+ else {
330
+ result.set(projectId, { name: projectName, sessionIds });
102
331
  }
103
332
  }
104
333
  return result;
@@ -108,10 +337,11 @@ function autoDetectProjects(sessions) {
108
337
  * Called on backend startup to prefill data.
109
338
  */
110
339
  async function syncAllData() {
111
- console.log("[Sync] Scanning OpenClaw data...");
340
+ const profiles = (0, sessions_1.discoverProfiles)();
341
+ console.log(`[Sync] Scanning OpenClaw data across ${profiles.length} profile(s): ${profiles.map(p => p.id).join(", ") || "default"}...`);
112
342
  const start = Date.now();
113
343
  try {
114
- // Force fresh read from JSONL files
344
+ // Force fresh read from JSONL files (scans all profiles)
115
345
  (0, sessions_1.invalidateCache)();
116
346
  const sessions = await (0, sessions_1.listSessions)();
117
347
  const totalCost = sessions.reduce((s, x) => s + x.costUsd, 0);
@@ -176,15 +406,45 @@ async function syncAllData() {
176
406
  INSERT OR IGNORE INTO project_sessions (projectId, sessionId, addedAt)
177
407
  VALUES (?, ?, ?)
178
408
  `);
409
+ // Build set of sessions with manual (non-auto) project assignments
410
+ const manuallyTagged = new Set();
411
+ const allManualRows = db_1.default.prepare(`
412
+ SELECT DISTINCT sessionId FROM project_sessions
413
+ WHERE projectId NOT LIKE 'auto_%'
414
+ `).all();
415
+ for (const row of allManualRows) {
416
+ manuallyTagged.add(row.sessionId);
417
+ }
179
418
  db_1.default.transaction(() => {
419
+ // Clear all auto-project session associations first (fresh re-match)
420
+ // This ensures stale matches from previous runs are removed
421
+ db_1.default.prepare("DELETE FROM project_sessions WHERE projectId LIKE 'auto_%'").run();
180
422
  for (const [projectId, project] of detectedProjects) {
181
423
  const nowStr = new Date().toISOString();
182
424
  upsertProject.run(projectId, project.name, nowStr, nowStr);
183
425
  for (const sessionId of project.sessionIds) {
426
+ // Skip sessions that are manually tagged (unless they already have this auto-project)
427
+ if (manuallyTagged.has(sessionId))
428
+ continue;
184
429
  upsertProjectSession.run(projectId, sessionId, nowStr);
185
430
  }
186
431
  }
187
432
  })();
433
+ // Clean up stale auto-projects that are no longer detected
434
+ const staleAutoProjects = db_1.default.prepare("SELECT id FROM projects WHERE id LIKE 'auto_%'").all();
435
+ let removedCount = 0;
436
+ db_1.default.transaction(() => {
437
+ for (const { id } of staleAutoProjects) {
438
+ if (!detectedProjects.has(id)) {
439
+ db_1.default.prepare("DELETE FROM project_sessions WHERE projectId = ?").run(id);
440
+ db_1.default.prepare("DELETE FROM projects WHERE id = ?").run(id);
441
+ removedCount++;
442
+ }
443
+ }
444
+ })();
445
+ if (removedCount > 0) {
446
+ console.log(`[Sync] Cleaned up ${removedCount} stale auto-project(s)`);
447
+ }
188
448
  const elapsed = Date.now() - start;
189
449
  const topAgents = agents.sort((a, b) => b.costUsd - a.costUsd).slice(0, 5);
190
450
  console.log(`[Sync] Done — ${agents.length} agents, ${sessions.length} sessions, ${detectedProjects.size} projects in ${elapsed}ms`);
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"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"}