@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,358 @@
1
+ "use strict";
2
+ /**
3
+ * Agent télémétrie flotte — heartbeat + sync opt-in.
4
+ * Extrait de TempoFlow fleet-agent.ts (R4) — endpoint / consent / IDs = hooks.
5
+ * Best-effort : jamais de throw vers le boot.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.createFleetAgent = createFleetAgent;
12
+ const node_os_1 = __importDefault(require("node:os"));
13
+ const journal_js_1 = require("./journal.js");
14
+ const DEFAULT_HEARTBEAT_MS = 60_000;
15
+ const DEFAULT_COMMAND_POLL_MS = 45_000;
16
+ function createFleetAgent(opts) {
17
+ const baseUrl = opts.baseUrl.replace(/\/$/, "");
18
+ // Endpoint sentinelle « désactivé » (défaut compose-brand-os sans
19
+ // CREEZIO_FLEET_ENDPOINT) — même motif que crash-reporter /crash-disabled/ :
20
+ // aucun POST/GET réseau, pas de spam DNS/timeout dans les logs.
21
+ const ingestDisabled = /ingest-disabled/i.test(baseUrl);
22
+ const heartbeatMs = opts.heartbeatMs ?? DEFAULT_HEARTBEAT_MS;
23
+ const commandPollMs = opts.commandPollMs ?? DEFAULT_COMMAND_POLL_MS;
24
+ const log = opts.log || ((scope, line) => console.log(`[${scope}] ${line}`));
25
+ let hooks = null;
26
+ let heartbeatTimer = null;
27
+ let commandTimer = null;
28
+ let started = false;
29
+ let lastSentLogTailHash = "";
30
+ function cfg() {
31
+ return opts.getConfig();
32
+ }
33
+ function scopeOn(scope) {
34
+ return opts.isScopeActive(cfg(), scope);
35
+ }
36
+ async function postJson(pathSuffix, body) {
37
+ try {
38
+ const res = await fetch(`${baseUrl}${pathSuffix}`, {
39
+ method: "POST",
40
+ headers: { "Content-Type": "application/json" },
41
+ body: JSON.stringify(body),
42
+ signal: AbortSignal.timeout(12_000),
43
+ });
44
+ let json;
45
+ try {
46
+ json = await res.json();
47
+ }
48
+ catch {
49
+ json = undefined;
50
+ }
51
+ return { ok: res.ok, status: res.status, json };
52
+ }
53
+ catch (e) {
54
+ log("fleet", `POST ${pathSuffix} failed: ${e instanceof Error ? e.message : e}`);
55
+ return { ok: false, status: 0 };
56
+ }
57
+ }
58
+ async function getJson(pathSuffix) {
59
+ try {
60
+ const res = await fetch(`${baseUrl}${pathSuffix}`, {
61
+ method: "GET",
62
+ signal: AbortSignal.timeout(12_000),
63
+ });
64
+ let json;
65
+ try {
66
+ json = await res.json();
67
+ }
68
+ catch {
69
+ json = undefined;
70
+ }
71
+ return { ok: res.ok, status: res.status, json };
72
+ }
73
+ catch {
74
+ return { ok: false, status: 0 };
75
+ }
76
+ }
77
+ async function buildHeartbeatPayload() {
78
+ const c = cfg();
79
+ const tunnel = opts.getTunnelInfo?.() ?? null;
80
+ const payload = {
81
+ installId: opts.getInstallId(),
82
+ appVersion: opts.getAppVersion(),
83
+ appKind: hooks?.appKind ?? null,
84
+ platform: process.platform,
85
+ arch: process.arch,
86
+ osRelease: node_os_1.default.release(),
87
+ hostname: node_os_1.default.hostname().slice(0, 80),
88
+ timestamp: new Date().toISOString(),
89
+ consent: {
90
+ enabled: c.enabled,
91
+ scopes: c.scopes,
92
+ consentAt: c.consentAt,
93
+ consentVersion: c.consentVersion,
94
+ },
95
+ tunnelSlug: tunnel?.slug ?? null,
96
+ tunnelHostname: tunnel?.hostname ?? null,
97
+ };
98
+ if (scopeOn("heartbeat") && hooks) {
99
+ payload.health = await hooks.getHealth();
100
+ if (hooks.getHeartbeatExtras) {
101
+ try {
102
+ const extras = await hooks.getHeartbeatExtras();
103
+ if (extras && typeof extras === "object") {
104
+ Object.assign(payload, extras);
105
+ }
106
+ }
107
+ catch {
108
+ /* best-effort */
109
+ }
110
+ }
111
+ }
112
+ if (scopeOn("plugins") && hooks?.getPluginsSummary) {
113
+ payload.plugins = await hooks.getPluginsSummary();
114
+ }
115
+ if (scopeOn("users") && hooks?.getUsersSummary) {
116
+ payload.users = await hooks.getUsersSummary();
117
+ }
118
+ if (scopeOn("sessions") && hooks?.getSessionsSummary) {
119
+ payload.sessions = await hooks.getSessionsSummary();
120
+ }
121
+ if (scopeOn("hermes_stats") && hooks?.getHermesStats) {
122
+ payload.hermesStats = await hooks.getHermesStats();
123
+ }
124
+ if (scopeOn("ops")) {
125
+ try {
126
+ payload.lastBootSummary = (0, journal_js_1.currentBootSummary)();
127
+ }
128
+ catch {
129
+ /* best-effort */
130
+ }
131
+ }
132
+ return payload;
133
+ }
134
+ async function sendFleetHeartbeat() {
135
+ if (ingestDisabled)
136
+ return false;
137
+ if (!scopeOn("heartbeat"))
138
+ return false;
139
+ const body = await buildHeartbeatPayload();
140
+ const r = await postJson("/heartbeat", body);
141
+ if (r.ok)
142
+ log("fleet", "heartbeat ok");
143
+ return r.ok;
144
+ }
145
+ function sendFleetCrash(report) {
146
+ if (ingestDisabled)
147
+ return;
148
+ if (!scopeOn("crashes"))
149
+ return;
150
+ void postJson("/crash", {
151
+ ...report,
152
+ installId: report.installId || opts.getInstallId(),
153
+ receivedVia: "desktop-agent",
154
+ });
155
+ }
156
+ async function sendMainLogTailBundle(installId, maxBytes) {
157
+ try {
158
+ const tail = opts.logFileTail?.(maxBytes) ?? null;
159
+ if (!tail)
160
+ return;
161
+ const digest = `${tail.length}:${tail.slice(-200)}`;
162
+ if (digest === lastSentLogTailHash)
163
+ return;
164
+ lastSentLogTailHash = digest;
165
+ await postJson("/bundle", {
166
+ installId,
167
+ kind: "main_logs",
168
+ appVersion: opts.getAppVersion(),
169
+ tail,
170
+ timestamp: new Date().toISOString(),
171
+ });
172
+ }
173
+ catch {
174
+ /* best-effort */
175
+ }
176
+ }
177
+ async function syncScopedBundles() {
178
+ if (!hooks)
179
+ return;
180
+ const installId = opts.getInstallId();
181
+ if (scopeOn("request_logs") && hooks.getRequestLogsSample) {
182
+ const sample = await hooks.getRequestLogsSample();
183
+ if (sample?.length) {
184
+ await postJson("/bundle", {
185
+ installId,
186
+ kind: "request_logs",
187
+ items: sample.slice(0, 50),
188
+ timestamp: new Date().toISOString(),
189
+ });
190
+ }
191
+ }
192
+ if (scopeOn("hermes_chats") && hooks.getHermesChatsSample) {
193
+ const sample = await hooks.getHermesChatsSample();
194
+ if (sample?.length) {
195
+ await postJson("/bundle", {
196
+ installId,
197
+ kind: "hermes_chats",
198
+ items: sample.slice(0, 30),
199
+ timestamp: new Date().toISOString(),
200
+ });
201
+ }
202
+ }
203
+ if (scopeOn("assistant_chats") && hooks.getAssistantChatsSample) {
204
+ const sample = await hooks.getAssistantChatsSample();
205
+ if (sample?.length) {
206
+ await postJson("/bundle", {
207
+ installId,
208
+ kind: "assistant_chats",
209
+ items: sample.slice(0, 30),
210
+ timestamp: new Date().toISOString(),
211
+ });
212
+ }
213
+ }
214
+ if (scopeOn("actions") && hooks.getActionsSample) {
215
+ const sample = await hooks.getActionsSample();
216
+ if (sample?.length) {
217
+ await postJson("/bundle", {
218
+ installId,
219
+ kind: "actions",
220
+ items: sample.slice(0, 100),
221
+ timestamp: new Date().toISOString(),
222
+ });
223
+ }
224
+ }
225
+ if (scopeOn("ops")) {
226
+ const events = (0, journal_js_1.drainPendingOpsEvents)(100);
227
+ if (events.length) {
228
+ await postJson("/bundle", {
229
+ installId,
230
+ kind: "ops_events",
231
+ items: events,
232
+ timestamp: new Date().toISOString(),
233
+ });
234
+ }
235
+ await sendMainLogTailBundle(installId, 64_000);
236
+ }
237
+ }
238
+ async function uploadFleetDiagnostics(reason) {
239
+ if (ingestDisabled) {
240
+ return {
241
+ ok: false,
242
+ detail: "télémétrie flotte désactivée (endpoint /ingest-disabled)",
243
+ };
244
+ }
245
+ let bootSummary = null;
246
+ try {
247
+ bootSummary = (0, journal_js_1.currentBootSummary)();
248
+ }
249
+ catch {
250
+ /* best-effort */
251
+ }
252
+ const r = await postJson("/bundle", {
253
+ installId: opts.getInstallId(),
254
+ kind: "diagnostics",
255
+ reason,
256
+ appVersion: opts.getAppVersion(),
257
+ platform: process.platform,
258
+ bootSummary,
259
+ tail: opts.logFileTail?.(160_000) || "",
260
+ timestamp: new Date().toISOString(),
261
+ });
262
+ return {
263
+ ok: r.ok,
264
+ detail: r.ok
265
+ ? "diagnostics envoyés"
266
+ : `envoi diagnostics échoué (HTTP ${r.status})`,
267
+ };
268
+ }
269
+ async function pollRemoteCommands() {
270
+ if (!scopeOn("remote_commands") || !hooks?.executeRemoteCommand)
271
+ return;
272
+ const installId = opts.getInstallId();
273
+ const r = await getJson(`/commands?installId=${encodeURIComponent(installId)}`);
274
+ if (!r.ok || !r.json || typeof r.json !== "object")
275
+ return;
276
+ const cmds = r.json.commands;
277
+ if (!Array.isArray(cmds))
278
+ return;
279
+ for (const raw of cmds) {
280
+ if (!raw || typeof raw !== "object")
281
+ continue;
282
+ const c = raw;
283
+ if (!c.id || !c.command)
284
+ continue;
285
+ let result;
286
+ try {
287
+ result = await hooks.executeRemoteCommand(c.command, c.args);
288
+ }
289
+ catch (e) {
290
+ result = {
291
+ ok: false,
292
+ detail: e instanceof Error ? e.message : String(e),
293
+ };
294
+ }
295
+ await postJson("/commands/ack", {
296
+ installId,
297
+ commandId: c.id,
298
+ ok: result.ok,
299
+ detail: String(result.detail || "").slice(0, 500),
300
+ timestamp: new Date().toISOString(),
301
+ });
302
+ }
303
+ }
304
+ function notifyFleetConfigChanged() {
305
+ if (!started)
306
+ return;
307
+ if (scopeOn("heartbeat"))
308
+ void sendFleetHeartbeat();
309
+ }
310
+ function startFleetAgent(h) {
311
+ if (started) {
312
+ hooks = h;
313
+ log("fleet", "hooks agent mis à jour (boot complet)");
314
+ return;
315
+ }
316
+ started = true;
317
+ hooks = h;
318
+ if (ingestDisabled) {
319
+ log("fleet", `télémétrie désactivée (endpoint sentinelle ${baseUrl}) — aucun envoi`);
320
+ return;
321
+ }
322
+ log("fleet", `agent start endpoint=${baseUrl}`);
323
+ const tick = () => {
324
+ void (async () => {
325
+ if (!cfg().enabled)
326
+ return;
327
+ if (scopeOn("heartbeat"))
328
+ await sendFleetHeartbeat();
329
+ await syncScopedBundles();
330
+ })();
331
+ };
332
+ setTimeout(tick, 3_000);
333
+ heartbeatTimer = setInterval(tick, heartbeatMs);
334
+ commandTimer = setInterval(() => {
335
+ void pollRemoteCommands();
336
+ }, commandPollMs);
337
+ }
338
+ function stopFleetAgent() {
339
+ if (heartbeatTimer)
340
+ clearInterval(heartbeatTimer);
341
+ if (commandTimer)
342
+ clearInterval(commandTimer);
343
+ heartbeatTimer = null;
344
+ commandTimer = null;
345
+ started = false;
346
+ hooks = null;
347
+ }
348
+ return {
349
+ startFleetAgent,
350
+ stopFleetAgent,
351
+ notifyFleetConfigChanged,
352
+ sendFleetHeartbeat,
353
+ sendFleetCrash,
354
+ uploadFleetDiagnostics,
355
+ fleetEndpointBase: () => baseUrl,
356
+ };
357
+ }
358
+ //# sourceMappingURL=fleet-agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-agent.js","sourceRoot":"","sources":["../../src/ops/fleet-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ /**
3
+ * Échantillons télémétrie flotte (best-effort, lecture seule, redactée).
4
+ * Pas de better-sqlite3 dans le process Electron (ABI) — spawn Node vanilla.
5
+ * Extrait TempoFlow fleet-samples.ts (M7) — chemins = hooks marque.
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.createFleetSamples = createFleetSamples;
12
+ const node_fs_1 = __importDefault(require("node:fs"));
13
+ const node_path_1 = __importDefault(require("node:path"));
14
+ const node_child_process_1 = require("node:child_process");
15
+ function redactText(s, max = 800) {
16
+ return String(s || "")
17
+ .replace(/Bearer\s+[A-Za-z0-9._\-]+/gi, "Bearer ***")
18
+ .replace(/sk-[A-Za-z0-9]{10,}/g, "sk-***")
19
+ .replace(/api[_-]?key["']?\s*[:=]\s*["']?[^\s"']+/gi, "api_key=***")
20
+ .slice(0, max);
21
+ }
22
+ function walkRecent(dir, out, max, depth = 0) {
23
+ if (out.length >= max || depth > 3)
24
+ return;
25
+ let entries;
26
+ try {
27
+ entries = node_fs_1.default.readdirSync(dir, { withFileTypes: true });
28
+ }
29
+ catch {
30
+ return;
31
+ }
32
+ for (const e of entries) {
33
+ if (out.length >= max)
34
+ return;
35
+ const full = node_path_1.default.join(dir, e.name);
36
+ if (e.isDirectory()) {
37
+ if (e.name === "node_modules" || e.name === ".git")
38
+ continue;
39
+ walkRecent(full, out, max, depth + 1);
40
+ }
41
+ else if (/\.(json|jsonl|md|txt)$/i.test(e.name)) {
42
+ out.push(full);
43
+ }
44
+ }
45
+ }
46
+ function createFleetSamples(paths) {
47
+ function sampleAssistantChats(limit = 30) {
48
+ const dbFile = paths.assistantDbPath();
49
+ if (!node_fs_1.default.existsSync(dbFile))
50
+ return [];
51
+ const script = `
52
+ const Database = require("better-sqlite3");
53
+ const db = new Database(process.env.CREEZIO_ASSISTANT_DB, { readonly: true, fileMustExist: true });
54
+ const rows = db.prepare(\`
55
+ SELECT m.id, m.conversation_id, m.role, m.content, m.created_at, c.title
56
+ FROM messages m
57
+ LEFT JOIN conversations c ON c.id = m.conversation_id
58
+ ORDER BY m.created_at DESC
59
+ LIMIT ?
60
+ \`).all(Number(process.env.CREEZIO_SAMPLE_LIMIT || 30));
61
+ db.close();
62
+ process.stdout.write(JSON.stringify(rows));
63
+ `;
64
+ try {
65
+ const r = (0, node_child_process_1.spawnSync)(paths.nodeBinary(), ["-e", script], {
66
+ env: {
67
+ ...process.env,
68
+ CREEZIO_ASSISTANT_DB: dbFile,
69
+ CREEZIO_SAMPLE_LIMIT: String(limit),
70
+ NODE_PATH: paths.nodeModulesPathForScripts(),
71
+ },
72
+ encoding: "utf8",
73
+ timeout: 8_000,
74
+ maxBuffer: 2 * 1024 * 1024,
75
+ });
76
+ if (r.status !== 0 || !r.stdout)
77
+ return [];
78
+ const rows = JSON.parse(r.stdout);
79
+ return rows.map((row) => ({
80
+ id: row.id,
81
+ conversationId: row.conversation_id,
82
+ title: row.title,
83
+ role: row.role,
84
+ content: redactText(String(row.content || "")),
85
+ createdAt: row.created_at,
86
+ }));
87
+ }
88
+ catch {
89
+ return [];
90
+ }
91
+ }
92
+ function sampleHermesChats(limit = 20) {
93
+ const home = paths.hermesHomeDir();
94
+ const candidates = [
95
+ node_path_1.default.join(home, "sessions"),
96
+ node_path_1.default.join(home, "workspace"),
97
+ node_path_1.default.join(home, ".hermes"),
98
+ ];
99
+ const files = [];
100
+ for (const dir of candidates) {
101
+ try {
102
+ if (!node_fs_1.default.existsSync(dir))
103
+ continue;
104
+ walkRecent(dir, files, 40);
105
+ }
106
+ catch {
107
+ /* ignore */
108
+ }
109
+ }
110
+ files.sort((a, b) => node_fs_1.default.statSync(b).mtimeMs - node_fs_1.default.statSync(a).mtimeMs);
111
+ return files.slice(0, limit).map((f) => {
112
+ let preview = "";
113
+ try {
114
+ preview = redactText(node_fs_1.default.readFileSync(f, "utf8"), 600);
115
+ }
116
+ catch {
117
+ preview = "";
118
+ }
119
+ return {
120
+ path: node_path_1.default.relative(home, f).slice(0, 200),
121
+ mtime: node_fs_1.default.statSync(f).mtime.toISOString(),
122
+ preview,
123
+ };
124
+ });
125
+ }
126
+ function sampleUsers() {
127
+ const db = paths.dbPath();
128
+ if (!node_fs_1.default.existsSync(db))
129
+ return [];
130
+ const script = `
131
+ const Database = require("better-sqlite3");
132
+ const db = new Database(process.env.CREEZIO_DB, { readonly: true, fileMustExist: true });
133
+ const has = db.prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='users'").get();
134
+ if (!has) { db.close(); process.stdout.write("[]"); process.exit(0); }
135
+ const cols = db.prepare("PRAGMA table_info(users)").all().map(c => c.name);
136
+ const kindSel = cols.includes("kind") ? "kind" : "'human' AS kind";
137
+ const rows = db.prepare(\`SELECT id, username, role, \${kindSel}, active FROM users ORDER BY role, username COLLATE NOCASE\`).all();
138
+ db.close();
139
+ process.stdout.write(JSON.stringify(rows));
140
+ `;
141
+ try {
142
+ const r = (0, node_child_process_1.spawnSync)(paths.nodeBinary(), ["-e", script], {
143
+ env: {
144
+ ...process.env,
145
+ CREEZIO_DB: db,
146
+ NODE_PATH: paths.nodeModulesPathForScripts(),
147
+ },
148
+ encoding: "utf8",
149
+ timeout: 8_000,
150
+ maxBuffer: 1024 * 1024,
151
+ });
152
+ if (r.status !== 0 || !r.stdout)
153
+ return [];
154
+ const rows = JSON.parse(r.stdout);
155
+ return rows.map((row) => ({
156
+ id: String(row.id || ""),
157
+ username: String(row.username || ""),
158
+ role: String(row.role || "collaborator"),
159
+ kind: String(row.kind || "human"),
160
+ active: Number(row.active) === 1,
161
+ }));
162
+ }
163
+ catch {
164
+ return [];
165
+ }
166
+ }
167
+ function sampleSessions() {
168
+ const file = node_path_1.default.join(paths.userDataDir(), "fleet-state", "sessions.json");
169
+ try {
170
+ if (!node_fs_1.default.existsSync(file))
171
+ return [];
172
+ const map = JSON.parse(node_fs_1.default.readFileSync(file, "utf8"));
173
+ return Object.values(map).map((s) => ({
174
+ userId: String(s.userId || ""),
175
+ username: s.username ? String(s.username) : undefined,
176
+ lastSeen: s.lastSeen ? String(s.lastSeen) : undefined,
177
+ }));
178
+ }
179
+ catch {
180
+ return [];
181
+ }
182
+ }
183
+ function sampleRequestLogs(limit = 40) {
184
+ const root = paths.userDataDir();
185
+ const candidates = [
186
+ node_path_1.default.join(root, "fleet-state", "request-logs.jsonl"),
187
+ node_path_1.default.join(root, "logs", "request-logs.jsonl"),
188
+ node_path_1.default.join(root, "request-logs.jsonl"),
189
+ ];
190
+ for (const file of candidates) {
191
+ try {
192
+ if (!node_fs_1.default.existsSync(file))
193
+ continue;
194
+ const lines = node_fs_1.default
195
+ .readFileSync(file, "utf8")
196
+ .trim()
197
+ .split("\n")
198
+ .slice(-limit);
199
+ return lines.map((line) => {
200
+ try {
201
+ const j = JSON.parse(line);
202
+ return {
203
+ at: j.at || j.timestamp,
204
+ method: j.method,
205
+ path: j.path || j.url,
206
+ status: j.status,
207
+ summary: redactText(JSON.stringify(j), 400),
208
+ };
209
+ }
210
+ catch {
211
+ return { summary: redactText(line, 200) };
212
+ }
213
+ });
214
+ }
215
+ catch {
216
+ /* next */
217
+ }
218
+ }
219
+ return [];
220
+ }
221
+ return {
222
+ sampleAssistantChats,
223
+ sampleHermesChats,
224
+ sampleUsers,
225
+ sampleSessions,
226
+ sampleRequestLogs,
227
+ };
228
+ }
229
+ //# sourceMappingURL=fleet-samples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fleet-samples.js","sourceRoot":"","sources":["../../src/ops/fleet-samples.ts"],"names":[],"mappings":"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"}