reflectt-node 0.1.4 → 0.1.6

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 (160) hide show
  1. package/README.md +63 -146
  2. package/defaults/TEAM-ROLES.yaml +221 -31
  3. package/dist/activationEvents.d.ts +13 -2
  4. package/dist/activationEvents.d.ts.map +1 -1
  5. package/dist/activationEvents.js +172 -38
  6. package/dist/activationEvents.js.map +1 -1
  7. package/dist/activity.d.ts +72 -0
  8. package/dist/activity.d.ts.map +1 -0
  9. package/dist/activity.js +510 -0
  10. package/dist/activity.js.map +1 -0
  11. package/dist/alert-preflight.d.ts +33 -0
  12. package/dist/alert-preflight.d.ts.map +1 -1
  13. package/dist/alert-preflight.js +218 -2
  14. package/dist/alert-preflight.js.map +1 -1
  15. package/dist/assignment.d.ts.map +1 -1
  16. package/dist/assignment.js +11 -6
  17. package/dist/assignment.js.map +1 -1
  18. package/dist/boardHealthWorker.d.ts.map +1 -1
  19. package/dist/boardHealthWorker.js +25 -12
  20. package/dist/boardHealthWorker.js.map +1 -1
  21. package/dist/canvas-slots.d.ts +1 -1
  22. package/dist/channels.d.ts +1 -1
  23. package/dist/chat-approval-detector.d.ts.map +1 -1
  24. package/dist/chat-approval-detector.js +29 -11
  25. package/dist/chat-approval-detector.js.map +1 -1
  26. package/dist/chat.d.ts +14 -0
  27. package/dist/chat.d.ts.map +1 -1
  28. package/dist/chat.js +68 -4
  29. package/dist/chat.js.map +1 -1
  30. package/dist/cli.js +349 -28
  31. package/dist/cli.js.map +1 -1
  32. package/dist/cloud.d.ts +28 -1
  33. package/dist/cloud.d.ts.map +1 -1
  34. package/dist/cloud.js +62 -25
  35. package/dist/cloud.js.map +1 -1
  36. package/dist/compliance-detector.d.ts +42 -0
  37. package/dist/compliance-detector.d.ts.map +1 -0
  38. package/dist/compliance-detector.js +286 -0
  39. package/dist/compliance-detector.js.map +1 -0
  40. package/dist/continuity-loop.d.ts.map +1 -1
  41. package/dist/continuity-loop.js +7 -3
  42. package/dist/continuity-loop.js.map +1 -1
  43. package/dist/dashboard.d.ts +6 -2
  44. package/dist/dashboard.d.ts.map +1 -1
  45. package/dist/dashboard.js +84 -28
  46. package/dist/dashboard.js.map +1 -1
  47. package/dist/db.d.ts.map +1 -1
  48. package/dist/db.js +24 -1
  49. package/dist/db.js.map +1 -1
  50. package/dist/doctor.d.ts.map +1 -1
  51. package/dist/doctor.js +17 -6
  52. package/dist/doctor.js.map +1 -1
  53. package/dist/executionSweeper.d.ts +2 -0
  54. package/dist/executionSweeper.d.ts.map +1 -1
  55. package/dist/executionSweeper.js +60 -4
  56. package/dist/executionSweeper.js.map +1 -1
  57. package/dist/focus.d.ts +20 -0
  58. package/dist/focus.d.ts.map +1 -0
  59. package/dist/focus.js +57 -0
  60. package/dist/focus.js.map +1 -0
  61. package/dist/health.d.ts +1 -0
  62. package/dist/health.d.ts.map +1 -1
  63. package/dist/health.js +47 -15
  64. package/dist/health.js.map +1 -1
  65. package/dist/hostConnectGuard.d.ts +25 -0
  66. package/dist/hostConnectGuard.d.ts.map +1 -0
  67. package/dist/hostConnectGuard.js +27 -0
  68. package/dist/hostConnectGuard.js.map +1 -0
  69. package/dist/index.js +257 -39
  70. package/dist/index.js.map +1 -1
  71. package/dist/insight-mutation.d.ts +26 -0
  72. package/dist/insight-mutation.d.ts.map +1 -1
  73. package/dist/insight-mutation.js +103 -12
  74. package/dist/insight-mutation.js.map +1 -1
  75. package/dist/insight-task-bridge.d.ts +1 -1
  76. package/dist/insight-task-bridge.d.ts.map +1 -1
  77. package/dist/insight-task-bridge.js +6 -3
  78. package/dist/insight-task-bridge.js.map +1 -1
  79. package/dist/insights.d.ts +20 -0
  80. package/dist/insights.d.ts.map +1 -1
  81. package/dist/insights.js +129 -4
  82. package/dist/insights.js.map +1 -1
  83. package/dist/mcp.d.ts.map +1 -1
  84. package/dist/mcp.js +9 -8
  85. package/dist/mcp.js.map +1 -1
  86. package/dist/notificationDedupeGuard.d.ts +33 -0
  87. package/dist/notificationDedupeGuard.d.ts.map +1 -0
  88. package/dist/notificationDedupeGuard.js +88 -0
  89. package/dist/notificationDedupeGuard.js.map +1 -0
  90. package/dist/openclaw.d.ts.map +1 -1
  91. package/dist/openclaw.js +3 -2
  92. package/dist/openclaw.js.map +1 -1
  93. package/dist/policy.d.ts +1 -1
  94. package/dist/policy.d.ts.map +1 -1
  95. package/dist/policy.js +3 -1
  96. package/dist/policy.js.map +1 -1
  97. package/dist/prAutoMerge.d.ts.map +1 -1
  98. package/dist/prAutoMerge.js +23 -0
  99. package/dist/prAutoMerge.js.map +1 -1
  100. package/dist/presence.d.ts +16 -1
  101. package/dist/presence.d.ts.map +1 -1
  102. package/dist/presence.js +97 -9
  103. package/dist/presence.js.map +1 -1
  104. package/dist/pulse.d.ts +60 -0
  105. package/dist/pulse.d.ts.map +1 -0
  106. package/dist/pulse.js +139 -0
  107. package/dist/pulse.js.map +1 -0
  108. package/dist/reflection-automation.d.ts.map +1 -1
  109. package/dist/reflection-automation.js +38 -0
  110. package/dist/reflection-automation.js.map +1 -1
  111. package/dist/release.d.ts +2 -0
  112. package/dist/release.d.ts.map +1 -1
  113. package/dist/release.js +14 -1
  114. package/dist/release.js.map +1 -1
  115. package/dist/request-tracker.d.ts +6 -0
  116. package/dist/request-tracker.d.ts.map +1 -1
  117. package/dist/request-tracker.js +31 -12
  118. package/dist/request-tracker.js.map +1 -1
  119. package/dist/scopeOverlap.d.ts +32 -0
  120. package/dist/scopeOverlap.d.ts.map +1 -0
  121. package/dist/scopeOverlap.js +219 -0
  122. package/dist/scopeOverlap.js.map +1 -0
  123. package/dist/server.d.ts.map +1 -1
  124. package/dist/server.js +736 -117
  125. package/dist/server.js.map +1 -1
  126. package/dist/service-probe.d.ts.map +1 -1
  127. package/dist/service-probe.js +39 -2
  128. package/dist/service-probe.js.map +1 -1
  129. package/dist/shipped-heartbeat.d.ts +1 -1
  130. package/dist/shipped-heartbeat.js +1 -1
  131. package/dist/taskPrecheck.js +6 -6
  132. package/dist/taskPrecheck.js.map +1 -1
  133. package/dist/tasks-next-diagnostics.d.ts +15 -0
  134. package/dist/tasks-next-diagnostics.d.ts.map +1 -0
  135. package/dist/tasks-next-diagnostics.js +33 -0
  136. package/dist/tasks-next-diagnostics.js.map +1 -0
  137. package/dist/tasks.d.ts +3 -2
  138. package/dist/tasks.d.ts.map +1 -1
  139. package/dist/tasks.js +41 -16
  140. package/dist/tasks.js.map +1 -1
  141. package/dist/team-config.d.ts.map +1 -1
  142. package/dist/team-config.js +20 -0
  143. package/dist/team-config.js.map +1 -1
  144. package/dist/todoHoardingGuard.d.ts +35 -0
  145. package/dist/todoHoardingGuard.d.ts.map +1 -0
  146. package/dist/todoHoardingGuard.js +150 -0
  147. package/dist/todoHoardingGuard.js.map +1 -0
  148. package/dist/types.d.ts +4 -2
  149. package/dist/types.d.ts.map +1 -1
  150. package/dist/version.d.ts +2 -0
  151. package/dist/version.d.ts.map +1 -0
  152. package/dist/version.js +16 -0
  153. package/dist/version.js.map +1 -0
  154. package/dist/working-contract.d.ts.map +1 -1
  155. package/dist/working-contract.js +59 -3
  156. package/dist/working-contract.js.map +1 -1
  157. package/package.json +5 -1
  158. package/public/dashboard.js +161 -20
  159. package/public/docs.md +68 -8
  160. package/public/polls-mock.html +1 -1
@@ -0,0 +1,510 @@
1
+ // SPDX-License-Identifier: Apache-2.0
2
+ // Copyright (c) Reflectt AI
3
+ //
4
+ // Activity Timeline — unified event feed with server-side grouping
5
+ // Spec: design/activity-timeline-spec-v0.md
6
+ import { createHash } from 'crypto';
7
+ import { getDb } from './db.js';
8
+ // ── Types ──────────────────────────────────────────────────────────────────
9
+ // Sources = collectors that may be partially unavailable.
10
+ // "reviews" share the tasks collector (derived from task_history) but are listed
11
+ // as a separate logical source for type filtering and partial.missing reporting.
12
+ export const ACTIVITY_SOURCES = ['tasks', 'reviews', 'chat', 'presence', 'reflections', 'insights'];
13
+ // ── Constants ──────────────────────────────────────────────────────────────
14
+ const CHAT_GROUP_WINDOW_MS = 5 * 60 * 1000; // 5 minutes
15
+ const TASK_CHURN_WINDOW_MS = 10 * 60 * 1000; // 10 minutes
16
+ const PRESENCE_FLAP_WINDOW_MS = 10 * 60 * 1000; // 10 minutes
17
+ const DEFAULT_LIMIT = 50;
18
+ const MAX_LIMIT = 200;
19
+ // ── Event ID generation ────────────────────────────────────────────────────
20
+ function makeEventId(type, uniqueRowId, tsMs) {
21
+ // Use the source row's unique ID (chat_messages.id, task_history.id, etc.)
22
+ // to avoid collisions between events of the same type in the same second.
23
+ const hash = createHash('sha256')
24
+ .update(`${type}:${uniqueRowId}:${tsMs}`)
25
+ .digest('hex')
26
+ .slice(0, 12);
27
+ return `evt-${hash}`;
28
+ }
29
+ // ── Data source collectors ─────────────────────────────────────────────────
30
+ function collectTaskEvents(db, fromMs, toMs, agentFilter) {
31
+ const events = [];
32
+ // Task history events (status changes, assignments)
33
+ const historyRows = db.prepare(`
34
+ SELECT th.id, th.task_id, th.type, th.actor, th.timestamp, th.data, t.title
35
+ FROM task_history th
36
+ LEFT JOIN tasks t ON t.id = th.task_id
37
+ WHERE th.timestamp >= ? AND th.timestamp <= ?
38
+ ORDER BY th.timestamp DESC
39
+ `).all(fromMs, toMs);
40
+ for (const row of historyRows) {
41
+ if (agentFilter && row.actor !== agentFilter)
42
+ continue;
43
+ const data = row.data ? safeJsonParse(row.data) : {};
44
+ const taskTitle = row.title || row.task_id;
45
+ if (row.type === 'status_changed' || row.type === 'status-changed') {
46
+ const from = data?.from || '?';
47
+ const to = data?.to || '?';
48
+ // Check if this is a review decision
49
+ if (to === 'done' && data?.review_action === 'approved') {
50
+ events.push({
51
+ rowId: row.id,
52
+ ts_ms: row.timestamp,
53
+ type: 'review.approved',
54
+ actor: { kind: 'agent', label: row.actor },
55
+ subject: { kind: 'task', id: row.task_id, label: taskTitle, href: `/tasks/${row.task_id}` },
56
+ summary: `${row.actor} approved "${truncate(taskTitle, 60)}"`,
57
+ severity: 'success',
58
+ source: 'reviews',
59
+ meta: data ?? undefined,
60
+ });
61
+ continue;
62
+ }
63
+ if (data?.review_action === 'rejected') {
64
+ events.push({
65
+ rowId: row.id,
66
+ ts_ms: row.timestamp,
67
+ type: 'review.rejected',
68
+ actor: { kind: 'agent', label: row.actor },
69
+ subject: { kind: 'task', id: row.task_id, label: taskTitle, href: `/tasks/${row.task_id}` },
70
+ summary: `${row.actor} rejected "${truncate(taskTitle, 60)}"`,
71
+ detail: data?.review_reason || undefined,
72
+ severity: 'warning',
73
+ source: 'reviews',
74
+ meta: data ?? undefined,
75
+ });
76
+ continue;
77
+ }
78
+ const severity = to === 'done' ? 'success'
79
+ : to === 'blocked' ? 'warning' : 'info';
80
+ events.push({
81
+ rowId: row.id, ts_ms: row.timestamp, type: 'task.status_changed',
82
+ actor: { kind: 'agent', label: row.actor },
83
+ subject: { kind: 'task', id: row.task_id, label: taskTitle, href: `/tasks/${row.task_id}` },
84
+ summary: `${row.actor} moved "${truncate(taskTitle, 50)}" ${from} → ${to}`,
85
+ severity, source: 'tasks',
86
+ meta: { from, to, ...(data ?? {}) },
87
+ groupKey: `task-churn:${row.task_id}`,
88
+ });
89
+ }
90
+ else if (row.type === 'created') {
91
+ events.push({
92
+ rowId: row.id, ts_ms: row.timestamp, type: 'task.created',
93
+ actor: { kind: 'agent', label: row.actor },
94
+ subject: { kind: 'task', id: row.task_id, label: taskTitle, href: `/tasks/${row.task_id}` },
95
+ summary: `${row.actor} created "${truncate(taskTitle, 60)}"`,
96
+ severity: 'info', source: 'tasks',
97
+ });
98
+ }
99
+ else if (row.type === 'assigned' || row.type === 'assignee_changed') {
100
+ events.push({
101
+ rowId: row.id, ts_ms: row.timestamp, type: 'task.assigned',
102
+ actor: { kind: 'agent', label: row.actor },
103
+ subject: { kind: 'task', id: row.task_id, label: taskTitle, href: `/tasks/${row.task_id}` },
104
+ summary: `${row.actor} assigned "${truncate(taskTitle, 50)}" to ${data?.assignee || '?'}`,
105
+ severity: 'info', source: 'tasks', meta: data ?? undefined,
106
+ });
107
+ }
108
+ }
109
+ // Task comments
110
+ const commentRows = db.prepare(`
111
+ SELECT tc.id, tc.task_id, tc.author, tc.content, tc.timestamp, t.title
112
+ FROM task_comments tc
113
+ LEFT JOIN tasks t ON t.id = tc.task_id
114
+ WHERE tc.timestamp >= ? AND tc.timestamp <= ?
115
+ ORDER BY tc.timestamp DESC
116
+ `).all(fromMs, toMs);
117
+ for (const row of commentRows) {
118
+ if (agentFilter && row.author !== agentFilter)
119
+ continue;
120
+ events.push({
121
+ rowId: row.id, ts_ms: row.timestamp, type: 'task.commented',
122
+ actor: { kind: 'agent', label: row.author },
123
+ subject: { kind: 'task', id: row.task_id, label: row.title || row.task_id, href: `/tasks/${row.task_id}` },
124
+ summary: `${row.author} commented on "${truncate(row.title || row.task_id, 50)}"`,
125
+ detail: truncate(row.content, 200),
126
+ severity: 'info', source: 'tasks',
127
+ });
128
+ }
129
+ return events;
130
+ }
131
+ function collectChatEvents(db, fromMs, toMs, agentFilter) {
132
+ const events = [];
133
+ const rows = db.prepare(`
134
+ SELECT id, "from", channel, content, timestamp
135
+ FROM chat_messages
136
+ WHERE timestamp >= ? AND timestamp <= ?
137
+ ORDER BY timestamp DESC
138
+ `).all(fromMs, toMs);
139
+ for (const row of rows) {
140
+ if (agentFilter && row.from !== agentFilter)
141
+ continue;
142
+ events.push({
143
+ rowId: row.id, ts_ms: row.timestamp, type: 'chat.message',
144
+ actor: { kind: 'agent', label: row.from },
145
+ subject: { kind: 'chat', id: row.channel, label: `#${row.channel}` },
146
+ summary: `${row.from} in #${row.channel}: "${truncate(row.content, 80)}"`,
147
+ severity: 'info', source: 'chat',
148
+ groupKey: `chat:${row.channel}`,
149
+ });
150
+ }
151
+ return events;
152
+ }
153
+ function collectPresenceEvents(db, fromMs, _toMs, agentFilter) {
154
+ const events = [];
155
+ const hosts = db.prepare(`
156
+ SELECT id, hostname, agents, status, last_seen_at FROM hosts WHERE last_seen_at >= ?
157
+ `).all(fromMs);
158
+ for (const host of hosts) {
159
+ const agents = host.agents ? safeJsonParse(host.agents) || [] : [];
160
+ for (const agent of agents) {
161
+ if (agentFilter && agent !== agentFilter)
162
+ continue;
163
+ const isOnline = host.status === 'online';
164
+ events.push({
165
+ rowId: `${host.id}:${agent}`, ts_ms: host.last_seen_at,
166
+ type: isOnline ? 'agent.online' : 'agent.offline',
167
+ actor: { kind: 'system', label: 'system' },
168
+ subject: { kind: 'agent', id: agent, label: agent },
169
+ summary: `${agent} ${isOnline ? 'seen online' : 'reported offline'}`,
170
+ severity: isOnline ? 'info' : 'warning',
171
+ source: 'presence', groupKey: `presence:${agent}`,
172
+ });
173
+ }
174
+ }
175
+ return events;
176
+ }
177
+ function collectReflectionEvents(db, fromMs, toMs, agentFilter) {
178
+ const events = [];
179
+ const rows = db.prepare(`
180
+ SELECT id, pain, author, severity, created_at FROM reflections
181
+ WHERE created_at >= ? AND created_at <= ? ORDER BY created_at DESC
182
+ `).all(fromMs, toMs);
183
+ for (const row of rows) {
184
+ if (agentFilter && row.author !== agentFilter)
185
+ continue;
186
+ events.push({
187
+ rowId: row.id, ts_ms: row.created_at, type: 'reflection.created',
188
+ actor: { kind: 'agent', label: row.author },
189
+ subject: { kind: 'reflection', id: row.id, label: truncate(row.pain, 60) },
190
+ summary: `${row.author} reflected: "${truncate(row.pain, 80)}"`,
191
+ severity: row.severity === 'critical' || row.severity === 'high' ? 'warning' : 'info',
192
+ source: 'reflections',
193
+ });
194
+ }
195
+ return events;
196
+ }
197
+ function collectInsightEvents(db, fromMs, toMs, agentFilter) {
198
+ const events = [];
199
+ const rows = db.prepare(`
200
+ SELECT id, title, status, task_id, authors, severity_max, updated_at FROM insights
201
+ WHERE status IN ('promoted', 'task_created') AND updated_at >= ? AND updated_at <= ?
202
+ ORDER BY updated_at DESC
203
+ `).all(fromMs, toMs);
204
+ for (const row of rows) {
205
+ const authors = row.authors ? safeJsonParse(row.authors) || [] : [];
206
+ if (agentFilter && !authors.includes(agentFilter))
207
+ continue;
208
+ events.push({
209
+ rowId: row.id, ts_ms: row.updated_at, type: 'insight.promoted',
210
+ actor: { kind: 'system', label: 'system' },
211
+ subject: { kind: 'insight', id: row.id, label: truncate(row.title, 60) },
212
+ summary: `Insight promoted: "${truncate(row.title, 60)}"${row.task_id ? ` → task ${row.task_id}` : ''}`,
213
+ severity: row.severity_max === 'critical' ? 'error' : row.severity_max === 'high' ? 'warning' : 'info',
214
+ source: 'insights', meta: { task_id: row.task_id, authors },
215
+ });
216
+ }
217
+ return events;
218
+ }
219
+ // ── Grouping engine ────────────────────────────────────────────────────────
220
+ export function groupEvents(events) {
221
+ if (events.length === 0)
222
+ return events;
223
+ // Group by groupKey — collect all events per key, then group those within window
224
+ const byKey = new Map();
225
+ const ungrouped = [];
226
+ for (const e of events) {
227
+ const gk = e.meta?._groupKey;
228
+ if (!gk) {
229
+ ungrouped.push(e);
230
+ continue;
231
+ }
232
+ let list = byKey.get(gk);
233
+ if (!list) {
234
+ list = [];
235
+ byKey.set(gk, list);
236
+ }
237
+ list.push(e);
238
+ }
239
+ const grouped = [...ungrouped];
240
+ for (const [key, items] of byKey) {
241
+ if (items.length < 2) {
242
+ grouped.push(...items);
243
+ continue;
244
+ }
245
+ // Sort by ts_ms descending (newest first)
246
+ items.sort((a, b) => b.ts_ms - a.ts_ms);
247
+ const windowMs = key.startsWith('chat:') ? CHAT_GROUP_WINDOW_MS
248
+ : key.startsWith('task-churn:') ? TASK_CHURN_WINDOW_MS
249
+ : key.startsWith('presence:') ? PRESENCE_FLAP_WINDOW_MS
250
+ : 0;
251
+ if (windowMs === 0) {
252
+ grouped.push(...items);
253
+ continue;
254
+ }
255
+ // Check if all items fall within the window
256
+ const oldest = items[items.length - 1].ts_ms;
257
+ const newest = items[0].ts_ms;
258
+ if (newest - oldest <= windowMs) {
259
+ grouped.push(createGroupedEvent(key, items, windowMs));
260
+ }
261
+ else {
262
+ // Split into sub-windows
263
+ let batch = [items[0]];
264
+ for (let i = 1; i < items.length; i++) {
265
+ if (batch[0].ts_ms - items[i].ts_ms <= windowMs) {
266
+ batch.push(items[i]);
267
+ }
268
+ else {
269
+ grouped.push(batch.length >= 2 ? createGroupedEvent(key, batch, windowMs) : batch[0]);
270
+ batch = [items[i]];
271
+ }
272
+ }
273
+ grouped.push(batch.length >= 2 ? createGroupedEvent(key, batch, windowMs) : batch[0]);
274
+ }
275
+ }
276
+ // Sort final result newest-first
277
+ grouped.sort((a, b) => b.ts_ms - a.ts_ms);
278
+ return grouped;
279
+ }
280
+ function createGroupedEvent(groupKey, children, windowMs) {
281
+ const windowMinutes = Math.round(windowMs / 60000);
282
+ const newest = children[0];
283
+ if (groupKey.startsWith('chat:')) {
284
+ const channel = children[0].subject?.label || '#general';
285
+ return {
286
+ id: makeEventId('chat.message_group', groupKey, newest.ts_ms),
287
+ ts: newest.ts, ts_ms: newest.ts_ms,
288
+ type: 'chat.message_group', severity: 'info',
289
+ subject: children[0].subject,
290
+ summary: `${children.length} messages in ${channel}`,
291
+ detail: children.slice(0, 3).map(c => c.summary).join('\n'),
292
+ group: { kind: 'chat_burst', count: children.length, window_minutes: windowMinutes, children },
293
+ };
294
+ }
295
+ if (groupKey.startsWith('task-churn:')) {
296
+ const statuses = children
297
+ .map(c => c.meta?.to)
298
+ .filter(Boolean)
299
+ .reverse();
300
+ return {
301
+ id: makeEventId('task.status_changed', groupKey, newest.ts_ms),
302
+ ts: newest.ts, ts_ms: newest.ts_ms,
303
+ type: 'task.status_changed', severity: 'info',
304
+ actor: children[0].actor, subject: children[0].subject,
305
+ summary: `Task status changed ${children.length} times: ${statuses.join(' to ')}`,
306
+ group: { kind: 'task_status_sequence', count: children.length, window_minutes: windowMinutes, children },
307
+ };
308
+ }
309
+ if (groupKey.startsWith('presence:')) {
310
+ const agent = children[0].subject?.label || 'agent';
311
+ return {
312
+ id: makeEventId('agent.online', groupKey, newest.ts_ms),
313
+ ts: newest.ts, ts_ms: newest.ts_ms,
314
+ type: 'agent.online', severity: 'info',
315
+ subject: children[0].subject,
316
+ summary: `${agent} connection changed ${children.length} times`,
317
+ group: { kind: 'presence_changes', count: children.length, window_minutes: windowMinutes, children },
318
+ };
319
+ }
320
+ return newest;
321
+ }
322
+ // ── Main query function ────────────────────────────────────────────────────
323
+ export function queryActivity(opts = {}) {
324
+ const db = getDb();
325
+ const now = Date.now();
326
+ // Parse range
327
+ const rangeMs = opts.range === '7d' ? 7 * 24 * 60 * 60 * 1000 : 24 * 60 * 60 * 1000;
328
+ const toMs = now;
329
+ const fromMs = now - rangeMs;
330
+ // Parse cursor (base64url-encoded ts_ms)
331
+ let cursorMs = null;
332
+ if (opts.after) {
333
+ try {
334
+ cursorMs = parseInt(Buffer.from(opts.after, 'base64url').toString('utf8'), 10);
335
+ if (isNaN(cursorMs))
336
+ cursorMs = null;
337
+ }
338
+ catch {
339
+ cursorMs = null;
340
+ }
341
+ }
342
+ // Pagination semantics: `after` is an opaque cursor representing the ts_ms of the
343
+ // last event seen on the previous page. We query strictly older events to avoid duplicates.
344
+ const effectiveToMs = cursorMs !== null
345
+ ? Math.max(0, cursorMs - 1)
346
+ : toMs;
347
+ const limit = Math.min(Math.max(opts.limit ?? DEFAULT_LIMIT, 1), MAX_LIMIT);
348
+ // Type filter: event prefix/type strings (e.g. "task", "chat", "chat.message")
349
+ const typeRaw = (opts.type && opts.type.length > 0)
350
+ ? opts.type.map((t) => String(t).trim()).filter(Boolean)
351
+ : null;
352
+ const typeFilter = typeRaw && typeRaw.length > 0
353
+ ? new Set(typeRaw.map((t) => t.toLowerCase()))
354
+ : null;
355
+ const sourceForType = (source) => {
356
+ if (!typeFilter)
357
+ return true;
358
+ const mapping = {
359
+ task: ['tasks'], tasks: ['tasks'],
360
+ // Reviews are derived from task history (review_action metadata), so requesting
361
+ // review events still requires collecting task history.
362
+ review: ['tasks'], reviews: ['tasks'],
363
+ chat: ['chat'], presence: ['presence'],
364
+ reflection: ['reflections'], reflections: ['reflections'],
365
+ insight: ['insights'], insights: ['insights'],
366
+ };
367
+ return [...typeFilter].some(t => {
368
+ // Exact match in mapping
369
+ if ((mapping[t] || []).includes(source))
370
+ return true;
371
+ // Prefix match: 'task.created' → 'task' → mapping['task']
372
+ const prefix = t.split('.')[0];
373
+ if (prefix && (mapping[prefix] || []).includes(source))
374
+ return true;
375
+ return false;
376
+ });
377
+ };
378
+ // Collect events from each source
379
+ const allRawEvents = [];
380
+ const missingSources = [];
381
+ const collectors = [
382
+ ['tasks', () => collectTaskEvents(db, fromMs, effectiveToMs, opts.agent)],
383
+ ['chat', () => collectChatEvents(db, fromMs, effectiveToMs, opts.agent)],
384
+ ['presence', () => collectPresenceEvents(db, fromMs, effectiveToMs, opts.agent)],
385
+ ['reflections', () => collectReflectionEvents(db, fromMs, effectiveToMs, opts.agent)],
386
+ ['insights', () => collectInsightEvents(db, fromMs, effectiveToMs, opts.agent)],
387
+ ];
388
+ for (const [source, collector] of collectors) {
389
+ if (!sourceForType(source))
390
+ continue;
391
+ try {
392
+ allRawEvents.push(...collector());
393
+ }
394
+ catch {
395
+ missingSources.push(source);
396
+ }
397
+ }
398
+ // Convert to TimelineEvents
399
+ let events = allRawEvents.map(raw => ({
400
+ id: makeEventId(raw.type, raw.rowId, raw.ts_ms),
401
+ ts: new Date(raw.ts_ms).toISOString(),
402
+ ts_ms: raw.ts_ms,
403
+ type: raw.type,
404
+ severity: raw.severity,
405
+ actor: raw.actor,
406
+ subject: raw.subject,
407
+ summary: raw.summary,
408
+ detail: raw.detail,
409
+ meta: raw.groupKey ? { ...raw.meta, _groupKey: raw.groupKey } : raw.meta,
410
+ }));
411
+ // Sort newest-first
412
+ events.sort((a, b) => b.ts_ms - a.ts_ms);
413
+ // De-dupe by id — track drops for debug mode
414
+ const seen = new Set();
415
+ const dropReasons = {};
416
+ let dedupeDrops = 0;
417
+ events = events.filter(e => {
418
+ if (seen.has(e.id)) {
419
+ dedupeDrops++;
420
+ dropReasons[`dedupe:${e.type}`] = (dropReasons[`dedupe:${e.type}`] || 0) + 1;
421
+ return false;
422
+ }
423
+ seen.add(e.id);
424
+ return true;
425
+ });
426
+ // Apply type filter at event level
427
+ let typeFilterDrops = 0;
428
+ if (typeFilter) {
429
+ const beforeFilter = events.length;
430
+ events = events.filter(e => {
431
+ const prefix = e.type.split('.')[0];
432
+ return [...typeFilter].some(t => t === prefix || t === e.type);
433
+ });
434
+ typeFilterDrops = beforeFilter - events.length;
435
+ if (typeFilterDrops > 0) {
436
+ dropReasons['type_filter'] = typeFilterDrops;
437
+ }
438
+ }
439
+ const rawCount = events.length + dedupeDrops + typeFilterDrops;
440
+ // Group events
441
+ events = groupEvents(events);
442
+ const groupedCount = events.length;
443
+ const droppedCount = dedupeDrops;
444
+ // Clean up internal _groupKey from meta
445
+ for (const e of events) {
446
+ if (e.meta && '_groupKey' in e.meta) {
447
+ const { _groupKey, ...rest } = e.meta;
448
+ e.meta = Object.keys(rest).length > 0 ? rest : undefined;
449
+ }
450
+ // Also clean children's _groupKey
451
+ if (e.group?.children) {
452
+ for (const child of e.group.children) {
453
+ if (child.meta && '_groupKey' in child.meta) {
454
+ const { _groupKey, ...rest } = child.meta;
455
+ child.meta = Object.keys(rest).length > 0 ? rest : undefined;
456
+ }
457
+ }
458
+ }
459
+ }
460
+ const total = events.length;
461
+ // Paginate
462
+ events = events.slice(0, limit);
463
+ // Generate next_cursor
464
+ const hasMore = total > limit;
465
+ const nextCursor = hasMore && events.length > 0
466
+ ? Buffer.from(String(events[events.length - 1].ts_ms)).toString('base64url')
467
+ : null;
468
+ // Timezone
469
+ const tz = Intl.DateTimeFormat().resolvedOptions().timeZone || 'UTC';
470
+ const response = {
471
+ events,
472
+ total,
473
+ range: {
474
+ from: new Date(fromMs).toISOString(),
475
+ to: new Date(toMs).toISOString(),
476
+ from_ms: fromMs,
477
+ to_ms: toMs,
478
+ tz,
479
+ },
480
+ generated_at: new Date(now).toISOString(),
481
+ generated_at_ms: now,
482
+ next_cursor: nextCursor,
483
+ };
484
+ if (missingSources.length > 0) {
485
+ response.partial = { missing: missingSources, reason: 'source_unavailable' };
486
+ }
487
+ if (opts.debug) {
488
+ response.debug = {
489
+ grouping: { rawCount, groupedCount, droppedCount, dropReasons },
490
+ };
491
+ }
492
+ return response;
493
+ }
494
+ // ── Helpers ────────────────────────────────────────────────────────────────
495
+ function truncate(s, maxLen) {
496
+ if (s.length <= maxLen)
497
+ return s;
498
+ return s.slice(0, maxLen - 1) + '…';
499
+ }
500
+ function safeJsonParse(s) {
501
+ if (!s)
502
+ return null;
503
+ try {
504
+ return JSON.parse(s);
505
+ }
506
+ catch {
507
+ return null;
508
+ }
509
+ }
510
+ //# sourceMappingURL=activity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity.js","sourceRoot":"","sources":["../src/activity.ts"],"names":[],"mappings":"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"}
@@ -32,9 +32,42 @@ export declare function getPreflightMetrics(): {
32
32
  totalChecked: number;
33
33
  suppressed: number;
34
34
  canaryFlagged: number;
35
+ wouldSuppressRate: number;
35
36
  latencyP95: number;
36
37
  mode: PreflightMode;
38
+ countsByReason: Record<string, number>;
39
+ countsByAlertType: Record<string, number>;
37
40
  };
38
41
  /** Reset metrics (for testing) */
39
42
  export declare function resetPreflightMetrics(): void;
43
+ /**
44
+ * Append a daily metrics snapshot if the date has changed.
45
+ * Called from getPreflightMetrics() and also from the health endpoint.
46
+ * Idempotent per calendar day.
47
+ */
48
+ export declare function snapshotDailyMetrics(): void;
49
+ /**
50
+ * Start periodic auto-snapshot (hourly).
51
+ * Ensures daily snapshots happen even if no health endpoint is accessed.
52
+ */
53
+ export declare function startAutoSnapshot(): void;
54
+ /**
55
+ * Stop the auto-snapshot timer (for testing/cleanup).
56
+ */
57
+ export declare function stopAutoSnapshot(): void;
58
+ /**
59
+ * Read all daily snapshots for the observation window report.
60
+ */
61
+ export declare function getDailySnapshots(): Array<{
62
+ date: string;
63
+ totalChecked: number;
64
+ suppressed: number;
65
+ canaryFlagged: number;
66
+ latencyP95: number;
67
+ mode: string;
68
+ wouldSuppressRate: number;
69
+ backfilled?: boolean;
70
+ countsByReason?: Record<string, number>;
71
+ countsByAlertType?: Record<string, number>;
72
+ }>;
40
73
  //# sourceMappingURL=alert-preflight.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"alert-preflight.d.ts","sourceRoot":"","sources":["../src/alert-preflight.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,aAAa,CAAA;CACpB;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAA;AAoCxD,wBAAgB,gBAAgB,IAAI,aAAa,CAIhD;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAkDrE;AA6JD,wBAAgB,mBAAmB,IAAI;IACrC,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,aAAa,CAAA;CACpB,CAYA;AAED,kCAAkC;AAClC,wBAAgB,qBAAqB,IAAI,IAAI,CAM5C"}
1
+ {"version":3,"file":"alert-preflight.d.ts","sourceRoot":"","sources":["../src/alert-preflight.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,mDAAmD;IACnD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,oDAAoD;IACpD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,MAAM,CAAA;IACrB,IAAI,EAAE,aAAa,CAAA;CACpB;AAED,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,SAAS,GAAG,KAAK,CAAA;AAwCxD,wBAAgB,gBAAgB,IAAI,aAAa,CAIhD;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,eAAe,CAmDrE;AA8JD,wBAAgB,mBAAmB,IAAI;IACrC,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,aAAa,CAAA;IACnB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC1C,CAsBA;AAED,kCAAkC;AAClC,wBAAgB,qBAAqB,IAAI,IAAI,CAQ5C;AAkHD;;;;GAIG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAgC3C;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAKvC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,KAAK,CAAC;IACzC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,MAAM,CAAA;IAClB,aAAa,EAAE,MAAM,CAAA;IACrB,UAAU,EAAE,MAAM,CAAA;IAClB,IAAI,EAAE,MAAM,CAAA;IACZ,iBAAiB,EAAE,MAAM,CAAA;IACzB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACvC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC3C,CAAC,CAqBD"}