@creezio/observability 0.22.0

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 (209) hide show
  1. package/README.md +328 -0
  2. package/dist/.creezio-src-hash.json +4 -0
  3. package/dist/api-endpoints/http-routes.d.ts +11 -0
  4. package/dist/api-endpoints/http-routes.d.ts.map +1 -0
  5. package/dist/api-endpoints/http-routes.js +11 -0
  6. package/dist/api-endpoints/http-routes.js.map +1 -0
  7. package/dist/api-endpoints/index.d.ts +4 -0
  8. package/dist/api-endpoints/index.d.ts.map +1 -0
  9. package/dist/api-endpoints/index.js +3 -0
  10. package/dist/api-endpoints/index.js.map +1 -0
  11. package/dist/api-endpoints/registry.d.ts +66 -0
  12. package/dist/api-endpoints/registry.d.ts.map +1 -0
  13. package/dist/api-endpoints/registry.js +102 -0
  14. package/dist/api-endpoints/registry.js.map +1 -0
  15. package/dist/api-mount.d.ts +7 -0
  16. package/dist/api-mount.d.ts.map +1 -0
  17. package/dist/api-mount.js +114 -0
  18. package/dist/api-mount.js.map +1 -0
  19. package/dist/helpers.d.ts +23 -0
  20. package/dist/helpers.d.ts.map +1 -0
  21. package/dist/helpers.js +36 -0
  22. package/dist/helpers.js.map +1 -0
  23. package/dist/index.d.ts +35 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +24 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/memory-store.d.ts +3 -0
  28. package/dist/memory-store.d.ts.map +1 -0
  29. package/dist/memory-store.js +113 -0
  30. package/dist/memory-store.js.map +1 -0
  31. package/dist/ops/emit.d.ts +8 -0
  32. package/dist/ops/emit.d.ts.map +1 -0
  33. package/dist/ops/emit.js +15 -0
  34. package/dist/ops/emit.js.map +1 -0
  35. package/dist/ops/fleet-activity.d.ts +50 -0
  36. package/dist/ops/fleet-activity.d.ts.map +1 -0
  37. package/dist/ops/fleet-activity.js +123 -0
  38. package/dist/ops/fleet-activity.js.map +1 -0
  39. package/dist/ops/fleet-agent.d.ts +102 -0
  40. package/dist/ops/fleet-agent.d.ts.map +1 -0
  41. package/dist/ops/fleet-agent.js +352 -0
  42. package/dist/ops/fleet-agent.js.map +1 -0
  43. package/dist/ops/fleet-samples.d.ts +33 -0
  44. package/dist/ops/fleet-samples.d.ts.map +1 -0
  45. package/dist/ops/fleet-samples.js +223 -0
  46. package/dist/ops/fleet-samples.js.map +1 -0
  47. package/dist/ops/journal.d.ts +56 -0
  48. package/dist/ops/journal.d.ts.map +1 -0
  49. package/dist/ops/journal.js +307 -0
  50. package/dist/ops/journal.js.map +1 -0
  51. package/dist/ops/rules.d.ts +16 -0
  52. package/dist/ops/rules.d.ts.map +1 -0
  53. package/dist/ops/rules.js +98 -0
  54. package/dist/ops/rules.js.map +1 -0
  55. package/dist/ops/types.d.ts +69 -0
  56. package/dist/ops/types.d.ts.map +1 -0
  57. package/dist/ops/types.js +119 -0
  58. package/dist/ops/types.js.map +1 -0
  59. package/dist/request-logs/config.d.ts +19 -0
  60. package/dist/request-logs/config.d.ts.map +1 -0
  61. package/dist/request-logs/config.js +36 -0
  62. package/dist/request-logs/config.js.map +1 -0
  63. package/dist/request-logs/http-routes.d.ts +8 -0
  64. package/dist/request-logs/http-routes.d.ts.map +1 -0
  65. package/dist/request-logs/http-routes.js +29 -0
  66. package/dist/request-logs/http-routes.js.map +1 -0
  67. package/dist/request-logs/index.d.ts +6 -0
  68. package/dist/request-logs/index.d.ts.map +1 -0
  69. package/dist/request-logs/index.js +5 -0
  70. package/dist/request-logs/index.js.map +1 -0
  71. package/dist/request-logs/middleware.d.ts +11 -0
  72. package/dist/request-logs/middleware.d.ts.map +1 -0
  73. package/dist/request-logs/middleware.js +198 -0
  74. package/dist/request-logs/middleware.js.map +1 -0
  75. package/dist/request-logs/request-logs.d.ts +60 -0
  76. package/dist/request-logs/request-logs.d.ts.map +1 -0
  77. package/dist/request-logs/request-logs.js +260 -0
  78. package/dist/request-logs/request-logs.js.map +1 -0
  79. package/dist/schema.d.ts +3 -0
  80. package/dist/schema.d.ts.map +1 -0
  81. package/dist/schema.js +21 -0
  82. package/dist/schema.js.map +1 -0
  83. package/dist/sqlite-driver.d.ts +16 -0
  84. package/dist/sqlite-driver.d.ts.map +1 -0
  85. package/dist/sqlite-driver.js +15 -0
  86. package/dist/sqlite-driver.js.map +1 -0
  87. package/dist/sqlite-store.d.ts +12 -0
  88. package/dist/sqlite-store.d.ts.map +1 -0
  89. package/dist/sqlite-store.js +176 -0
  90. package/dist/sqlite-store.js.map +1 -0
  91. package/dist/types.d.ts +67 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +9 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/usage/adapters.d.ts +31 -0
  96. package/dist/usage/adapters.d.ts.map +1 -0
  97. package/dist/usage/adapters.js +37 -0
  98. package/dist/usage/adapters.js.map +1 -0
  99. package/dist/usage/http-routes.d.ts +23 -0
  100. package/dist/usage/http-routes.d.ts.map +1 -0
  101. package/dist/usage/http-routes.js +150 -0
  102. package/dist/usage/http-routes.js.map +1 -0
  103. package/dist/usage/index.d.ts +11 -0
  104. package/dist/usage/index.d.ts.map +1 -0
  105. package/dist/usage/index.js +7 -0
  106. package/dist/usage/index.js.map +1 -0
  107. package/dist/usage/ui-brand.d.ts +23 -0
  108. package/dist/usage/ui-brand.d.ts.map +1 -0
  109. package/dist/usage/ui-brand.js +18 -0
  110. package/dist/usage/ui-brand.js.map +1 -0
  111. package/dist/usage/usage-analytics-productivity.d.ts +73 -0
  112. package/dist/usage/usage-analytics-productivity.d.ts.map +1 -0
  113. package/dist/usage/usage-analytics-productivity.js +317 -0
  114. package/dist/usage/usage-analytics-productivity.js.map +1 -0
  115. package/dist/usage/usage-analytics-shared.d.ts +5 -0
  116. package/dist/usage/usage-analytics-shared.d.ts.map +1 -0
  117. package/dist/usage/usage-analytics-shared.js +20 -0
  118. package/dist/usage/usage-analytics-shared.js.map +1 -0
  119. package/dist/usage/usage-analytics.d.ts +127 -0
  120. package/dist/usage/usage-analytics.d.ts.map +1 -0
  121. package/dist/usage/usage-analytics.js +338 -0
  122. package/dist/usage/usage-analytics.js.map +1 -0
  123. package/dist-cjs/api-endpoints/http-routes.js +14 -0
  124. package/dist-cjs/api-endpoints/http-routes.js.map +1 -0
  125. package/dist-cjs/api-endpoints/index.js +10 -0
  126. package/dist-cjs/api-endpoints/index.js.map +1 -0
  127. package/dist-cjs/api-endpoints/registry.js +107 -0
  128. package/dist-cjs/api-endpoints/registry.js.map +1 -0
  129. package/dist-cjs/api-mount.js +117 -0
  130. package/dist-cjs/api-mount.js.map +1 -0
  131. package/dist-cjs/helpers.js +41 -0
  132. package/dist-cjs/helpers.js.map +1 -0
  133. package/dist-cjs/index.js +118 -0
  134. package/dist-cjs/index.js.map +1 -0
  135. package/dist-cjs/memory-store.js +119 -0
  136. package/dist-cjs/memory-store.js.map +1 -0
  137. package/dist-cjs/ops/emit.js +18 -0
  138. package/dist-cjs/ops/emit.js.map +1 -0
  139. package/dist-cjs/ops/fleet-activity.js +131 -0
  140. package/dist-cjs/ops/fleet-activity.js.map +1 -0
  141. package/dist-cjs/ops/fleet-agent.js +358 -0
  142. package/dist-cjs/ops/fleet-agent.js.map +1 -0
  143. package/dist-cjs/ops/fleet-samples.js +229 -0
  144. package/dist-cjs/ops/fleet-samples.js.map +1 -0
  145. package/dist-cjs/ops/journal.js +326 -0
  146. package/dist-cjs/ops/journal.js.map +1 -0
  147. package/dist-cjs/ops/rules.js +102 -0
  148. package/dist-cjs/ops/rules.js.map +1 -0
  149. package/dist-cjs/ops/types.js +126 -0
  150. package/dist-cjs/ops/types.js.map +1 -0
  151. package/dist-cjs/package.json +3 -0
  152. package/dist-cjs/request-logs/config.js +42 -0
  153. package/dist-cjs/request-logs/config.js.map +1 -0
  154. package/dist-cjs/request-logs/http-routes.js +32 -0
  155. package/dist-cjs/request-logs/http-routes.js.map +1 -0
  156. package/dist-cjs/request-logs/index.js +27 -0
  157. package/dist-cjs/request-logs/index.js.map +1 -0
  158. package/dist-cjs/request-logs/middleware.js +203 -0
  159. package/dist-cjs/request-logs/middleware.js.map +1 -0
  160. package/dist-cjs/request-logs/request-logs.js +277 -0
  161. package/dist-cjs/request-logs/request-logs.js.map +1 -0
  162. package/dist-cjs/schema.js +24 -0
  163. package/dist-cjs/schema.js.map +1 -0
  164. package/dist-cjs/sqlite-driver.js +18 -0
  165. package/dist-cjs/sqlite-driver.js.map +1 -0
  166. package/dist-cjs/sqlite-store.js +182 -0
  167. package/dist-cjs/sqlite-store.js.map +1 -0
  168. package/dist-cjs/types.js +12 -0
  169. package/dist-cjs/types.js.map +1 -0
  170. package/dist-cjs/usage/adapters.js +47 -0
  171. package/dist-cjs/usage/adapters.js.map +1 -0
  172. package/dist-cjs/usage/http-routes.js +154 -0
  173. package/dist-cjs/usage/http-routes.js.map +1 -0
  174. package/dist-cjs/usage/index.js +34 -0
  175. package/dist-cjs/usage/index.js.map +1 -0
  176. package/dist-cjs/usage/ui-brand.js +23 -0
  177. package/dist-cjs/usage/ui-brand.js.map +1 -0
  178. package/dist-cjs/usage/usage-analytics-productivity.js +321 -0
  179. package/dist-cjs/usage/usage-analytics-productivity.js.map +1 -0
  180. package/dist-cjs/usage/usage-analytics-shared.js +23 -0
  181. package/dist-cjs/usage/usage-analytics-shared.js.map +1 -0
  182. package/dist-cjs/usage/usage-analytics.js +353 -0
  183. package/dist-cjs/usage/usage-analytics.js.map +1 -0
  184. package/fleet-collector/AGENTS.md +7 -0
  185. package/fleet-collector/README.md +83 -0
  186. package/fleet-collector/configure-fleet-npm.sh +108 -0
  187. package/fleet-collector/env.mjs +174 -0
  188. package/fleet-collector/ops-api.mjs +455 -0
  189. package/fleet-collector/public/admin.html +696 -0
  190. package/fleet-collector/public/index.html +941 -0
  191. package/fleet-collector/server.mjs +564 -0
  192. package/fleet-collector/test-fleet-collector.mjs +413 -0
  193. package/fleet-collector/test-server-admin.mjs +475 -0
  194. package/package.json +109 -0
  195. package/scripts/test-api-endpoints-registry.mjs +60 -0
  196. package/ui/analytics-client.tsx +834 -0
  197. package/ui/analytics-productivity-panel.tsx +513 -0
  198. package/ui/api-endpoints-client.tsx +228 -0
  199. package/ui/index.ts +39 -0
  200. package/ui/primitives/badge.tsx +37 -0
  201. package/ui/primitives/button.tsx +44 -0
  202. package/ui/primitives/card.tsx +44 -0
  203. package/ui/primitives/cn.ts +6 -0
  204. package/ui/primitives/input.tsx +19 -0
  205. package/ui/primitives/tabs.tsx +51 -0
  206. package/ui/request-logs-client.tsx +327 -0
  207. package/ui/session-usage-analytics-provider.tsx +28 -0
  208. package/ui/usage-analytics-client.ts +479 -0
  209. package/ui/usage-analytics-provider.tsx +84 -0
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BREAK_MAX_MS = exports.BREAK_MIN_MS = void 0;
4
+ exports.getProductivityReport = getProductivityReport;
5
+ /**
6
+ * Agrégations productivité : heatmap, heures actives, pauses, score.
7
+ * Basé sur les événements usage_events (heartbeats, clics, pages, idle…).
8
+ */
9
+ const adapters_js_1 = require("./adapters.js");
10
+ const usage_analytics_js_1 = require("./usage-analytics.js");
11
+ /** Seuil pause courte (gap activité). */
12
+ exports.BREAK_MIN_MS = 5 * 60_000;
13
+ /** Au-delà → coupure de journée / session, pas une pause. */
14
+ exports.BREAK_MAX_MS = 4 * 60 * 60_000;
15
+ /** Granularité activité (fallback sans heartbeat). */
16
+ const BUCKET_MS = 5 * 60_000;
17
+ function buildWhere(filters) {
18
+ const parts = ["1=1"];
19
+ const params = [];
20
+ if (filters.from) {
21
+ parts.push("created_at >= ?");
22
+ params.push(filters.from);
23
+ }
24
+ if (filters.to) {
25
+ parts.push("created_at <= ?");
26
+ params.push(filters.to);
27
+ }
28
+ if (filters.userId) {
29
+ parts.push("user_id = ?");
30
+ params.push(filters.userId);
31
+ }
32
+ if (filters.kind && filters.kind !== "all") {
33
+ parts.push("user_kind = ?");
34
+ params.push(filters.kind);
35
+ }
36
+ return { sql: parts.join(" AND "), params };
37
+ }
38
+ function dayKey(d) {
39
+ return d.toISOString().slice(0, 10);
40
+ }
41
+ function scoreProductivity(input) {
42
+ const activeHours = input.activeMs / 3_600_000;
43
+ const expectedPerDay = 6.5; // journée type CRM
44
+ const coverage = input.daysActive > 0
45
+ ? Math.min(1, activeHours / (expectedPerDay * input.daysActive))
46
+ : 0;
47
+ const focus = input.activeMs + input.idleMs > 0
48
+ ? input.activeMs / (input.activeMs + input.idleMs)
49
+ : 0;
50
+ const density = activeHours > 0 ? Math.min(1, (input.clicks + input.events * 0.15) / (activeHours * 40)) : 0;
51
+ const raw = coverage * 0.45 + focus * 0.35 + density * 0.2;
52
+ return Math.round(Math.max(0, Math.min(100, raw * 100)));
53
+ }
54
+ function analyzeUserEvents(userId, username, kind, events, period) {
55
+ const sorted = [...events].sort((a, b) => a.created_at.localeCompare(b.created_at));
56
+ const heatmapMap = new Map();
57
+ const dailyMap = new Map();
58
+ const ensureDay = (date) => {
59
+ let d = dailyMap.get(date);
60
+ if (!d) {
61
+ d = {
62
+ activeBuckets: new Set(),
63
+ heartbeatMs: 0,
64
+ idleMs: 0,
65
+ events: 0,
66
+ clicks: 0,
67
+ pageViews: 0,
68
+ heartbeats: 0,
69
+ firstSeen: null,
70
+ lastSeen: null,
71
+ times: [],
72
+ };
73
+ dailyMap.set(date, d);
74
+ }
75
+ return d;
76
+ };
77
+ for (const e of sorted) {
78
+ const t = new Date(e.created_at);
79
+ if (Number.isNaN(t.getTime()))
80
+ continue;
81
+ const date = dayKey(t);
82
+ const day = ensureDay(date);
83
+ day.events += 1;
84
+ day.times.push(t.getTime());
85
+ if (!day.firstSeen)
86
+ day.firstSeen = e.created_at;
87
+ day.lastSeen = e.created_at;
88
+ if (e.event_type === "ui.click")
89
+ day.clicks += 1;
90
+ if (e.event_type === "page.view")
91
+ day.pageViews += 1;
92
+ if (e.event_type === "presence.heartbeat") {
93
+ day.heartbeats += 1;
94
+ day.heartbeatMs += Math.min(e.duration_ms || 60_000, 120_000);
95
+ }
96
+ if (e.event_type === "presence.idle" && e.duration_ms) {
97
+ day.idleMs += e.duration_ms;
98
+ }
99
+ // Bucket activité 5 min
100
+ const bucket = Math.floor(t.getTime() / BUCKET_MS);
101
+ day.activeBuckets.add(bucket);
102
+ const weekday = t.getUTCDay();
103
+ const hour = t.getUTCHours();
104
+ const hk = `${weekday}:${hour}`;
105
+ let cell = heatmapMap.get(hk);
106
+ if (!cell) {
107
+ cell = { weekday, hour, events: 0, activeMs: 0 };
108
+ heatmapMap.set(hk, cell);
109
+ }
110
+ cell.events += 1;
111
+ if (e.event_type === "presence.heartbeat") {
112
+ cell.activeMs += Math.min(e.duration_ms || 60_000, 120_000);
113
+ }
114
+ }
115
+ // Pauses + focus blocks depuis timestamps
116
+ const allTimes = sorted
117
+ .map((e) => new Date(e.created_at).getTime())
118
+ .filter((n) => !Number.isNaN(n));
119
+ const breaks = [];
120
+ const focusBlocks = [];
121
+ let blockStart = allTimes[0] ?? 0;
122
+ let blockEvents = 0;
123
+ let last = allTimes[0] ?? 0;
124
+ for (let i = 0; i < allTimes.length; i++) {
125
+ const cur = allTimes[i];
126
+ if (i === 0) {
127
+ blockStart = cur;
128
+ blockEvents = 1;
129
+ last = cur;
130
+ continue;
131
+ }
132
+ const gap = cur - last;
133
+ if (gap >= exports.BREAK_MIN_MS && gap <= exports.BREAK_MAX_MS) {
134
+ // clôturer focus block
135
+ if (last > blockStart) {
136
+ focusBlocks.push({
137
+ startedAt: new Date(blockStart).toISOString(),
138
+ endedAt: new Date(last).toISOString(),
139
+ durationMs: last - blockStart,
140
+ events: blockEvents,
141
+ });
142
+ }
143
+ breaks.push({
144
+ startedAt: new Date(last).toISOString(),
145
+ endedAt: new Date(cur).toISOString(),
146
+ durationMs: gap,
147
+ day: dayKey(new Date(last)),
148
+ });
149
+ blockStart = cur;
150
+ blockEvents = 1;
151
+ }
152
+ else if (gap > exports.BREAK_MAX_MS) {
153
+ if (last > blockStart) {
154
+ focusBlocks.push({
155
+ startedAt: new Date(blockStart).toISOString(),
156
+ endedAt: new Date(last).toISOString(),
157
+ durationMs: last - blockStart,
158
+ events: blockEvents,
159
+ });
160
+ }
161
+ blockStart = cur;
162
+ blockEvents = 1;
163
+ }
164
+ else {
165
+ blockEvents += 1;
166
+ }
167
+ last = cur;
168
+ }
169
+ if (allTimes.length && last > blockStart) {
170
+ focusBlocks.push({
171
+ startedAt: new Date(blockStart).toISOString(),
172
+ endedAt: new Date(last).toISOString(),
173
+ durationMs: last - blockStart,
174
+ events: blockEvents,
175
+ });
176
+ }
177
+ const breakMsByDay = new Map();
178
+ for (const b of breaks) {
179
+ const cur = breakMsByDay.get(b.day) || { ms: 0, n: 0 };
180
+ cur.ms += b.durationMs;
181
+ cur.n += 1;
182
+ breakMsByDay.set(b.day, cur);
183
+ }
184
+ const daily = Array.from(dailyMap.entries())
185
+ .sort(([a], [b]) => a.localeCompare(b))
186
+ .map(([date, d]) => {
187
+ const bucketActive = d.activeBuckets.size * BUCKET_MS;
188
+ const activeMs = d.heartbeatMs > 0 ? d.heartbeatMs : bucketActive;
189
+ const br = breakMsByDay.get(date) || { ms: 0, n: 0 };
190
+ return {
191
+ date,
192
+ activeMs,
193
+ idleMs: d.idleMs,
194
+ breakMs: br.ms,
195
+ breaksCount: br.n,
196
+ events: d.events,
197
+ clicks: d.clicks,
198
+ pageViews: d.pageViews,
199
+ heartbeats: d.heartbeats,
200
+ firstSeen: d.firstSeen,
201
+ lastSeen: d.lastSeen,
202
+ productivityScore: scoreProductivity({
203
+ activeMs,
204
+ idleMs: d.idleMs,
205
+ events: d.events,
206
+ clicks: d.clicks,
207
+ daysActive: 1,
208
+ }),
209
+ };
210
+ });
211
+ const activeMs = daily.reduce((s, d) => s + d.activeMs, 0);
212
+ const idleMs = daily.reduce((s, d) => s + d.idleMs, 0);
213
+ const breakMs = breaks.reduce((s, b) => s + b.durationMs, 0);
214
+ const clicks = daily.reduce((s, d) => s + d.clicks, 0);
215
+ const pageViews = daily.reduce((s, d) => s + d.pageViews, 0);
216
+ const eventsCount = daily.reduce((s, d) => s + d.events, 0);
217
+ const daysActive = daily.filter((d) => d.activeMs > 0 || d.events > 0).length;
218
+ const heatmap = Array.from(heatmapMap.values()).sort((a, b) => a.weekday - b.weekday || a.hour - b.hour);
219
+ let peakHour = null;
220
+ let peakWeekday = null;
221
+ let peakVal = -1;
222
+ for (const c of heatmap) {
223
+ const v = c.activeMs + c.events * 1000;
224
+ if (v > peakVal) {
225
+ peakVal = v;
226
+ peakHour = c.hour;
227
+ peakWeekday = c.weekday;
228
+ }
229
+ }
230
+ const activeHours = activeMs / 3_600_000;
231
+ const summary = {
232
+ userId,
233
+ username,
234
+ kind,
235
+ activeMs,
236
+ idleMs,
237
+ breakMs,
238
+ avgActivePerDayMs: daysActive > 0 ? Math.round(activeMs / daysActive) : 0,
239
+ avgBreakMs: breaks.length ? Math.round(breakMs / breaks.length) : 0,
240
+ breaksCount: breaks.length,
241
+ focusBlocksCount: focusBlocks.length,
242
+ avgFocusBlockMs: focusBlocks.length
243
+ ? Math.round(focusBlocks.reduce((s, f) => s + f.durationMs, 0) / focusBlocks.length)
244
+ : 0,
245
+ peakHour,
246
+ peakWeekday,
247
+ eventsPerActiveHour: activeHours > 0 ? Math.round((eventsCount / activeHours) * 10) / 10 : 0,
248
+ focusRatio: activeMs + idleMs > 0
249
+ ? Math.round((activeMs / (activeMs + idleMs)) * 1000) / 1000
250
+ : 0,
251
+ productivityScore: scoreProductivity({
252
+ activeMs,
253
+ idleMs,
254
+ events: eventsCount,
255
+ clicks,
256
+ daysActive: Math.max(daysActive, 1),
257
+ }),
258
+ daysActive,
259
+ events: eventsCount,
260
+ clicks,
261
+ pageViews,
262
+ };
263
+ // Cap listes pour l'API
264
+ const recentBreaks = breaks.slice(-40).reverse();
265
+ const topFocus = [...focusBlocks].sort((a, b) => b.durationMs - a.durationMs).slice(0, 20);
266
+ return {
267
+ summary,
268
+ heatmap,
269
+ daily,
270
+ breaks: recentBreaks,
271
+ focusBlocks: topFocus,
272
+ };
273
+ }
274
+ function getProductivityReport(filters) {
275
+ (0, usage_analytics_js_1.ensureUsageAnalyticsSchema)();
276
+ const { sql, params } = buildWhere(filters);
277
+ const rows = (0, adapters_js_1.uaQueryAll)(`SELECT created_at, event_type, duration_ms, user_id, username, user_kind
278
+ FROM usage_events
279
+ WHERE ${sql}
280
+ AND user_id IS NOT NULL
281
+ AND event_type NOT IN ('session.context')
282
+ ORDER BY created_at ASC
283
+ LIMIT 50000`, params);
284
+ const period = { from: filters.from || "", to: filters.to || "" };
285
+ const byUser = new Map();
286
+ for (const r of rows) {
287
+ if (!r.user_id)
288
+ continue;
289
+ const list = byUser.get(r.user_id) || [];
290
+ list.push(r);
291
+ byUser.set(r.user_id, list);
292
+ }
293
+ const leaderboard = [];
294
+ let detail = null;
295
+ for (const [uid, evs] of Array.from(byUser.entries())) {
296
+ const username = evs.find((e) => e.username)?.username || uid;
297
+ const kind = evs.find((e) => e.user_kind)?.user_kind || "human";
298
+ const analyzed = analyzeUserEvents(uid, username, kind, evs, period);
299
+ if (analyzed.summary)
300
+ leaderboard.push(analyzed.summary);
301
+ if (filters.userId && uid === filters.userId)
302
+ detail = analyzed;
303
+ }
304
+ leaderboard.sort((a, b) => b.productivityScore - a.productivityScore || b.activeMs - a.activeMs);
305
+ // Sans userId : rapport du top user pour la heatmap, + leaderboard
306
+ if (!detail && leaderboard[0]) {
307
+ const topId = leaderboard[0].userId;
308
+ const evs = byUser.get(topId) || [];
309
+ detail = analyzeUserEvents(topId, leaderboard[0].username, leaderboard[0].kind, evs, period);
310
+ }
311
+ return {
312
+ period,
313
+ summary: detail?.summary || null,
314
+ heatmap: detail?.heatmap || [],
315
+ daily: detail?.daily || [],
316
+ breaks: detail?.breaks || [],
317
+ focusBlocks: detail?.focusBlocks || [],
318
+ leaderboard,
319
+ };
320
+ }
321
+ //# sourceMappingURL=usage-analytics-productivity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-analytics-productivity.js","sourceRoot":"","sources":["../../src/usage/usage-analytics-productivity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ /** Types / helpers partagés client + serveur (sans dépendance SQLite). */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.formatDuration = formatDuration;
5
+ function formatDuration(ms) {
6
+ if (!ms || ms < 0)
7
+ return "0s";
8
+ const s = Math.round(ms / 1000);
9
+ if (s < 60)
10
+ return `${s}s`;
11
+ const m = Math.floor(s / 60);
12
+ const rs = s % 60;
13
+ if (m < 60)
14
+ return rs ? `${m}m ${rs}s` : `${m}m`;
15
+ const h = Math.floor(m / 60);
16
+ const rm = m % 60;
17
+ if (h < 48)
18
+ return rm ? `${h}h ${rm}m` : `${h}h`;
19
+ const d = Math.floor(h / 24);
20
+ const rh = h % 24;
21
+ return rh ? `${d}j ${rh}h` : `${d}j`;
22
+ }
23
+ //# sourceMappingURL=usage-analytics-shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-analytics-shared.js","sourceRoot":"","sources":["../../src/usage/usage-analytics-shared.ts"],"names":[],"mappings":";AAAA,0EAA0E;;AAK1E,wCAaC;AAbD,SAAgB,cAAc,CAAC,EAAU;IACvC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IAChC,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,GAAG,CAAC,GAAG,CAAC;IAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;IACjD,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAClB,OAAO,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;AACvC,CAAC"}