@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
package/README.md ADDED
@@ -0,0 +1,328 @@
1
+ # @creezio/observability
2
+
3
+ ## Rôle
4
+
5
+ `@creezio/observability` regroupe les briques d'observabilité Creezio :
6
+
7
+ - store d'événements activité / plugin usage / control-plane ;
8
+ - `ApiMount` `/platform/observability` ;
9
+ - ops journal desktop JSONL, règles de boot et émission d'événements ;
10
+ - agent flotte desktop opt-in, fleet activity et samples ;
11
+ - usage analytics UI/admin ;
12
+ - request logs API/MCP avec redaction ;
13
+ - UI admin analytics, request logs et endpoints ;
14
+ - `fleet-collector` autonome (`creezio-fleet-collector`).
15
+
16
+ Le package est marque-agnostique : endpoints, consentement, identité d'installation, chemins et labels UI sont injectés par la marque ou par env neutre.
17
+
18
+ ## Périmètre kit vs marque
19
+
20
+ **Kit**
21
+
22
+ - Fournit les schémas/stores observability.
23
+ - Enregistre les événements et agrégations génériques.
24
+ - Écrit un journal ops local best-effort, avec redaction.
25
+ - Produit les heartbeats/crash/bundles de flotte via hooks.
26
+ - Capture les logs API/MCP dans un ring buffer mémoire et miroir JSONL.
27
+ - Stocke et agrège les événements usage analytics.
28
+ - Fournit routes Hono ingest/admin et UI React admin.
29
+ - Fournit un collector HTTP autonome pour la flotte.
30
+
31
+ **Marque**
32
+
33
+ - Configure les DB adapters (`configureUsageAnalytics`) et request logs (`configureRequestLogs`).
34
+ - Configure les tokens UI analytics (`configureUsageAnalyticsUiBrand`).
35
+ - Appelle `initOpsJournal`, `track*` et `createFleetAgent` depuis l'app desktop.
36
+ - Fournit consentement, install id, version, santé services, samples et commandes distantes.
37
+ - Monte les middlewares `requestLogApiMiddleware` / `requestLogMcpMiddleware`.
38
+ - Monte les routes analytics/admin avec auth owner.
39
+ - Déploie/configure le `fleet-collector` et ses secrets.
40
+
41
+ ## Installation/build
42
+
43
+ ```bash
44
+ npm run build -w @creezio/observability
45
+ npm run typecheck -w @creezio/observability
46
+ npm run test:fleet-collector -w @creezio/observability
47
+ ```
48
+
49
+ Lancement collector :
50
+
51
+ ```bash
52
+ npm run fleet-collector -w @creezio/observability
53
+ # ou
54
+ npx creezio-fleet-collector
55
+ ```
56
+
57
+ Exports :
58
+
59
+ - `@creezio/observability` : stores, helpers, ops, fleet, usage, request logs.
60
+ - `@creezio/observability/ui` : UI admin et tracker client.
61
+ - `@creezio/observability/fleet-collector/*` : collector autonome.
62
+
63
+ ## Configuration détaillée
64
+
65
+ ### Store observability et `ApiMount`
66
+
67
+ ```ts
68
+ import {
69
+ createObservabilityApiMount,
70
+ createSqliteObservabilityStore,
71
+ } from "@creezio/observability";
72
+
73
+ const store = createSqliteObservabilityStore({ db });
74
+ const mount = createObservabilityApiMount(store);
75
+ ```
76
+
77
+ ### Usage analytics
78
+
79
+ ```ts
80
+ import {
81
+ configureUsageAnalytics,
82
+ configureUsageAnalyticsUiBrand,
83
+ } from "@creezio/observability";
84
+
85
+ configureUsageAnalytics({
86
+ getWriteDb: () => db,
87
+ getDb: () => db,
88
+ tableExists: (name) => Boolean(db.prepare("SELECT 1 FROM sqlite_master WHERE name=?").get(name)),
89
+ });
90
+
91
+ configureUsageAnalyticsUiBrand({
92
+ aidAttr: "data-brand-aid",
93
+ titlebarNoDragClass: "brand-titlebar-no-drag",
94
+ mirrorFleetAction: (payload) => recordFleetAction(payload),
95
+ });
96
+ ```
97
+
98
+ `configureUsageAnalytics({ getWriteDb })` est requis avant les routes et queries usage.
99
+
100
+ ### Request logs
101
+
102
+ ```ts
103
+ import {
104
+ configureRequestLogs,
105
+ requestLogApiMiddleware,
106
+ requestLogMcpMiddleware,
107
+ } from "@creezio/observability";
108
+
109
+ configureRequestLogs({
110
+ getFleetStateDir: () => "/var/lib/brand/fleet-state",
111
+ });
112
+
113
+ api.use("/api/v1/*", requestLogApiMiddleware);
114
+ mcp.use("/mcp/*", requestLogMcpMiddleware);
115
+ ```
116
+
117
+ Si `getFleetStateDir` est absent, le package lit :
118
+
119
+ - `CREEZIO_FLEET_STATE_DIR`
120
+ - sinon toute variable `${envPrefix}_FLEET_STATE_DIR` dérivée du manifest
121
+ marque (posée par le host — aucun préfixe marque câblé dans le kit)
122
+
123
+ ### Ops journal
124
+
125
+ ```ts
126
+ import {
127
+ initOpsJournal,
128
+ setOpsJournalHooks,
129
+ track,
130
+ trackDecision,
131
+ } from "@creezio/observability";
132
+
133
+ setOpsJournalHooks({
134
+ log: (scope, line) => logger.info(`[${scope}] ${line}`),
135
+ onAnomaly: (evt) => reportAnomaly(evt),
136
+ });
137
+
138
+ initOpsJournal(userDataDir, appVersion);
139
+
140
+ track({ level: "info", kind: "boot.start", ctx: { appVersion } });
141
+ trackDecision("service.meili", "ok", { durationMs: 120 });
142
+ ```
143
+
144
+ Le journal écrit dans `<userData>/ops`, garde une rétention bornée et ne doit jamais faire crasher l'app.
145
+
146
+ Préfixes d'événements ops (`src/ops/types.ts`) : le SoT d'émission reste
147
+ `TF2EVENT ` (préfixe historique conservé pour ne pas casser les collecteurs
148
+ déployés) ; la lecture est dual-read via `OPS_EVENT_PREFIXES` (`TF2EVENT `,
149
+ `CertivanEVENT `, …) — un parseur doit accepter tous les préfixes connus.
150
+
151
+ ### Fleet agent
152
+
153
+ ```ts
154
+ import { createFleetAgent } from "@creezio/observability";
155
+
156
+ const fleet = createFleetAgent({
157
+ baseUrl: "https://fleet.example.com/i-token",
158
+ getConfig: () => telemetryConfig,
159
+ isScopeActive: (cfg, scope) => cfg.enabled && Boolean(cfg.scopes[scope]),
160
+ getInstallId: () => installId,
161
+ getAppVersion: () => appVersion,
162
+ getTunnelInfo: () => ({ slug: "demo", hostname: "demo.example.com" }),
163
+ log: (scope, line) => logger.info(`[${scope}] ${line}`),
164
+ });
165
+
166
+ fleet.startFleetAgent({
167
+ appKind: "server",
168
+ getHealth: async () => ({ next: "ok", hermes: "ok" }),
169
+ getRequestLogsSample: async () => listRequestLogs({ limit: 20 }).logs,
170
+ getHeartbeatExtras: async () => ({ dossierStats: { open: 12 } }),
171
+ });
172
+ ```
173
+
174
+ ### Fleet collector env
175
+
176
+ Le collector lit des env neutres, avec dual-read legacy :
177
+
178
+ - `CREEZIO_FLEET_PORT` / `FLEET_PORT`
179
+ - `CREEZIO_FLEET_INGEST_TOKEN` / `FLEET_INGEST_TOKEN`
180
+ - `CREEZIO_FLEET_OPS_USER`, `_PASS`, `_TOKEN`
181
+ - `CREEZIO_FLEET_DIR` / `FLEET_DIR`
182
+ - `FLEET_PUBLIC_DOMAIN` / `CREEZIO_FLEET_DOMAIN`
183
+ - `CREEZIO_FLEET_TUNNEL_SUFFIX`
184
+ - `CREEZIO_FLEET_UI_TITLE`, `_MARK`, `_HOME_TITLE`, `_REALM`
185
+ - `CREEZIO_FLEET_UI_EXTRAS_TITLE`
186
+ - `CREEZIO_FLEET_UI_ETAT_LABELS`
187
+
188
+ Voir [fleet-collector/README.md](./fleet-collector/README.md).
189
+
190
+ ## API publique avec exemples
191
+
192
+ ### Observability store / ApiMount
193
+
194
+ Endpoints de `createObservabilityApiMount(store)` :
195
+
196
+ - `GET /events`
197
+ - `POST /events`
198
+ - `GET /usage`
199
+ - `GET /orgs`
200
+ - `GET /summary`
201
+
202
+ ```bash
203
+ curl "$API/platform/observability/events?kind=activity&limit=20"
204
+ curl -X POST "$API/platform/observability/events" \
205
+ -H "Content-Type: application/json" \
206
+ -d '{"kind":"activity","action":"page_view","userId":"u1","meta":{"path":"/dashboard"}}'
207
+ ```
208
+
209
+ ### Usage analytics routes
210
+
211
+ ```ts
212
+ import {
213
+ createUsageAnalyticsAdminRoutes,
214
+ createUsageAnalyticsIngestRoutes,
215
+ } from "@creezio/observability";
216
+
217
+ api.route(
218
+ "/usage",
219
+ createUsageAnalyticsIngestRoutes({
220
+ getSession: async (c) => c.get("session") ?? null,
221
+ getUserKind: (userId) => getUser(userId)?.kind ?? "human",
222
+ }),
223
+ );
224
+
225
+ admin.route("/", createUsageAnalyticsAdminRoutes());
226
+ ```
227
+
228
+ Endpoints :
229
+
230
+ - `POST /usage/events`
231
+ - `GET /analytics/overview`
232
+ - `GET /analytics/timeline`
233
+ - `GET /analytics/pages`
234
+ - `GET /analytics/clicks`
235
+ - `GET /analytics/users`
236
+ - `GET /analytics/events`
237
+ - `GET /analytics/productivity`
238
+ - `DELETE /analytics/events`
239
+
240
+ ### Request logs
241
+
242
+ ```ts
243
+ import {
244
+ createRequestLogsRoutes,
245
+ listRequestLogs,
246
+ } from "@creezio/observability";
247
+
248
+ admin.route("/admin", createRequestLogsRoutes());
249
+
250
+ const recentErrors = listRequestLogs({
251
+ source: "api",
252
+ errorsOnly: true,
253
+ limit: 50,
254
+ });
255
+ ```
256
+
257
+ Routes :
258
+
259
+ - `GET /request-logs?limit=100&source=api|mcp|all&q=...&errorsOnly=1`
260
+ - `DELETE /request-logs`
261
+
262
+ ### UI
263
+
264
+ ```tsx
265
+ import {
266
+ AnalyticsClient,
267
+ RequestLogsClient,
268
+ UsageAnalyticsProvider,
269
+ } from "@creezio/observability/ui";
270
+
271
+ export function AdminObservability() {
272
+ return (
273
+ <UsageAnalyticsProvider session={{ userId: "u1", username: "Owner" }}>
274
+ <AnalyticsClient />
275
+ <RequestLogsClient />
276
+ </UsageAnalyticsProvider>
277
+ );
278
+ }
279
+ ```
280
+
281
+ ## Flux
282
+
283
+ ### Usage analytics
284
+
285
+ 1. `UsageAnalyticsProvider` installe le tracker client.
286
+ 2. Les clics et pages sont annotés via `aidAttr`.
287
+ 3. Les événements sont batchés vers `POST /usage/events`.
288
+ 4. `insertUsageEvents` écrit en SQLite.
289
+ 5. Les routes admin agrègent overview, timeline, pages, clicks, users et productivité.
290
+ 6. Optionnellement, `mirrorFleetAction` copie les actions vers le buffer flotte.
291
+
292
+ ### Request logs
293
+
294
+ 1. Les middlewares lisent requête/réponse de manière best-effort.
295
+ 2. Les secrets sont redacted par nom de clé et patterns de valeur.
296
+ 3. `pushRequestLog` ajoute au ring buffer mémoire.
297
+ 4. Si un fleet state dir est configuré, un résumé JSONL est écrit pour l'agent flotte.
298
+ 5. L'UI admin lit/purge via `createRequestLogsRoutes`.
299
+
300
+ ### Ops journal et fleet
301
+
302
+ 1. `initOpsJournal` crée un boot id et un fichier JSONL.
303
+ 2. `track*` enregistre décisions, anomalies, crashes et événements externes.
304
+ 3. `createFleetAgent` construit des heartbeats opt-in selon scopes.
305
+ 4. L'agent poste `/heartbeat`, `/crash`, `/bundle` et poll `/commands`.
306
+ 5. `fleet-collector` stocke les données et expose une UI ops.
307
+
308
+ ## Intégration marques
309
+
310
+ - Configurer usage analytics avant les routes et avant l'UI tracker.
311
+ - Brancher request logs tôt dans la stack Hono, avant auth, mais redaction toujours active.
312
+ - Monter les routes admin derrière auth owner.
313
+ - Initialiser ops journal après logger et avant les services à diagnostiquer.
314
+ - Créer un `FleetAgent` uniquement si la télémétrie opt-in est disponible.
315
+ - Garder les extras métier opaques (`dossierStats`, etc.) dans `getHeartbeatExtras`.
316
+ - Déployer `fleet-collector` avec tokens forts et Basic/Bearer ops.
317
+
318
+ ## Dépendances
319
+
320
+ - Runtime : `@creezio/api-kernel`, `@creezio/platform-core`, `hono`.
321
+ - UI peer : `react`, `next`, `lucide-react`, `recharts`, Radix UI, `clsx`, `tailwind-merge`, `class-variance-authority`.
322
+ - Node runtime pour ops/fleet collector : `fs`, `path`, `os`, HTTP.
323
+
324
+ ## Voir aussi
325
+
326
+ - [AGENTS.md](./AGENTS.md)
327
+ - [docs/FILES.md](./docs/FILES.md)
328
+ - [fleet-collector/README.md](./fleet-collector/README.md)
@@ -0,0 +1,4 @@
1
+ {
2
+ "srcHash": "f55dae2107e89fb49c6f8b18dac98a2db469d0688ad0e94142ea71edbd143489",
3
+ "generatedAt": "2026-08-31T18:14:50.878Z"
4
+ }
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Admin — registre des endpoints runtime (session UI).
3
+ * Hono « nu » : hors doc OpenAPI publique. Auth owner reste côté marque.
4
+ */
5
+ import { Hono } from "hono";
6
+ import type { ApiEndpointsRegistry } from "./registry.js";
7
+ export type CreateApiEndpointsRoutesOptions = {
8
+ getRegistry: () => ApiEndpointsRegistry;
9
+ };
10
+ export declare function createApiEndpointsRoutes(opts: CreateApiEndpointsRoutesOptions): Hono;
11
+ //# sourceMappingURL=http-routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-routes.d.ts","sourceRoot":"","sources":["../../src/api-endpoints/http-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,MAAM,+BAA+B,GAAG;IAC5C,WAAW,EAAE,MAAM,oBAAoB,CAAC;CACzC,CAAC;AAEF,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,+BAA+B,GACpC,IAAI,CAMN"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Admin — registre des endpoints runtime (session UI).
3
+ * Hono « nu » : hors doc OpenAPI publique. Auth owner reste côté marque.
4
+ */
5
+ import { Hono } from "hono";
6
+ export function createApiEndpointsRoutes(opts) {
7
+ const app = new Hono();
8
+ app.get("/endpoints", (c) => c.json(opts.getRegistry()));
9
+ return app;
10
+ }
11
+ //# sourceMappingURL=http-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-routes.js","sourceRoot":"","sources":["../../src/api-endpoints/http-routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,MAAM,UAAU,wBAAwB,CACtC,IAAqC;IAErC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAEzD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { ApiEndpointRecord, ApiEndpointRouteInput, ApiEndpointsRegistry, } from "./registry.js";
2
+ export { buildApiEndpointsRegistry, buildOpenApiDocumentFromRegistry, collectHonoRoutes, } from "./registry.js";
3
+ export { createApiEndpointsRoutes, type CreateApiEndpointsRoutesOptions, } from "./http-routes.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api-endpoints/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,EACxB,KAAK,+BAA+B,GACrC,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { buildApiEndpointsRegistry, buildOpenApiDocumentFromRegistry, collectHonoRoutes, } from "./registry.js";
2
+ export { createApiEndpointsRoutes, } from "./http-routes.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api-endpoints/index.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,yBAAyB,EACzB,gCAAgC,EAChC,iBAAiB,GAClB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wBAAwB,GAEzB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Registre Admin des endpoints runtime (port TempoFlow O5 — gold).
3
+ * Enrichit les routes réellement montées avec les métadonnées OpenAPI
4
+ * quand un document est fourni.
5
+ */
6
+ export type ApiEndpointRecord = {
7
+ method: string;
8
+ path: string;
9
+ documented: boolean;
10
+ summary: string | null;
11
+ description: string | null;
12
+ tags: string[];
13
+ };
14
+ export type ApiEndpointsRegistry = {
15
+ generatedAt: string;
16
+ source: string;
17
+ openapiUrl: string;
18
+ endpoints: ApiEndpointRecord[];
19
+ };
20
+ export type ApiEndpointRouteInput = {
21
+ method: string;
22
+ path: string;
23
+ summary?: string;
24
+ description?: string;
25
+ tags?: string[];
26
+ };
27
+ type OpenApiOperation = {
28
+ summary?: string;
29
+ description?: string;
30
+ tags?: string[];
31
+ };
32
+ type OpenApiDocument = {
33
+ paths?: Record<string, Record<string, OpenApiOperation | undefined>>;
34
+ };
35
+ export declare function buildApiEndpointsRegistry(opts: {
36
+ routes: ApiEndpointRouteInput[];
37
+ openApiDocument?: OpenApiDocument | null;
38
+ openapiUrl?: string;
39
+ source?: string;
40
+ }): ApiEndpointsRegistry;
41
+ /** Document OpenAPI 3 minimal dérivé du registre runtime (lien Admin API). */
42
+ export declare function buildOpenApiDocumentFromRegistry(registry: ApiEndpointsRegistry, opts?: {
43
+ title?: string;
44
+ version?: string;
45
+ }): {
46
+ openapi: "3.0.3";
47
+ info: {
48
+ title: string;
49
+ version: string;
50
+ description: string;
51
+ };
52
+ paths: Record<string, Record<string, OpenApiOperation & {
53
+ responses: Record<string, {
54
+ description: string;
55
+ }>;
56
+ }>>;
57
+ };
58
+ /** Collecte les routes d'une app Hono (y compris sous-apps montées). */
59
+ export declare function collectHonoRoutes(app: {
60
+ routes: Array<{
61
+ method: string;
62
+ path: string;
63
+ }>;
64
+ }, pathPrefix?: string): ApiEndpointRouteInput[];
65
+ export {};
66
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/api-endpoints/registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,iBAAiB,EAAE,CAAC;CAChC,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,KAAK,gBAAgB,GAAG;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC;CACtE,CAAC;AAYF,wBAAgB,yBAAyB,CAAC,IAAI,EAAE;IAC9C,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,oBAAoB,CA6DvB;AAED,8EAA8E;AAC9E,wBAAgB,gCAAgC,CAC9C,QAAQ,EAAE,oBAAoB,EAC9B,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1C;IACD,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;CAClH,CA8BA;AAED,wEAAwE;AACxE,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE;IAAE,MAAM,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,EACxD,UAAU,SAAK,GACd,qBAAqB,EAAE,CAYzB"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Registre Admin des endpoints runtime (port TempoFlow O5 — gold).
3
+ * Enrichit les routes réellement montées avec les métadonnées OpenAPI
4
+ * quand un document est fourni.
5
+ */
6
+ const HTTP_METHODS = [
7
+ "get",
8
+ "post",
9
+ "put",
10
+ "patch",
11
+ "delete",
12
+ "options",
13
+ "head",
14
+ ];
15
+ export function buildApiEndpointsRegistry(opts) {
16
+ const operations = new Map();
17
+ for (const [pathKey, pathItem] of Object.entries(opts.openApiDocument?.paths || {})) {
18
+ if (!pathItem)
19
+ continue;
20
+ for (const method of HTTP_METHODS) {
21
+ const operation = pathItem[method];
22
+ if (!operation)
23
+ continue;
24
+ const normalizedPath = pathKey.replace(/\{([^}]+)\}/g, ":$1");
25
+ operations.set(`${method.toUpperCase()} ${normalizedPath}`, {
26
+ summary: operation.summary,
27
+ description: operation.description,
28
+ tags: operation.tags,
29
+ documented: true,
30
+ });
31
+ }
32
+ }
33
+ const seen = new Set();
34
+ const endpoints = opts.routes
35
+ .filter((route) => route.method && route.method !== "ALL")
36
+ .flatMap((route) => {
37
+ const method = route.method.toUpperCase();
38
+ const key = `${method} ${route.path}`;
39
+ if (seen.has(key))
40
+ return [];
41
+ seen.add(key);
42
+ const operation = operations.get(key);
43
+ return [
44
+ {
45
+ method,
46
+ path: route.path,
47
+ documented: Boolean(operation) || Boolean(route.description || route.summary),
48
+ summary: operation?.summary || route.summary || null,
49
+ description: operation?.description || route.description || null,
50
+ tags: operation?.tags?.length
51
+ ? operation.tags
52
+ : route.tags || [],
53
+ },
54
+ ];
55
+ })
56
+ .sort((a, b) => a.path.localeCompare(b.path) || a.method.localeCompare(b.method));
57
+ return {
58
+ generatedAt: new Date().toISOString(),
59
+ source: opts.source || "runtime routes (+ OpenAPI si fourni)",
60
+ openapiUrl: opts.openapiUrl || "/api/v1/openapi.json",
61
+ endpoints,
62
+ };
63
+ }
64
+ /** Document OpenAPI 3 minimal dérivé du registre runtime (lien Admin API). */
65
+ export function buildOpenApiDocumentFromRegistry(registry, opts) {
66
+ const paths = {};
67
+ for (const ep of registry.endpoints) {
68
+ const method = ep.method.toLowerCase();
69
+ const pathKey = ep.path.replace(/:([A-Za-z0-9_]+)/g, "{$1}");
70
+ if (!paths[pathKey])
71
+ paths[pathKey] = {};
72
+ paths[pathKey][method] = {
73
+ summary: ep.summary || `${ep.method} ${ep.path}`,
74
+ ...(ep.description ? { description: ep.description } : {}),
75
+ tags: ep.tags.length ? ep.tags : ["runtime"],
76
+ responses: { "200": { description: "OK" } },
77
+ };
78
+ }
79
+ return {
80
+ openapi: "3.0.3",
81
+ info: {
82
+ title: opts?.title || "Creezio API",
83
+ version: opts?.version || "0.1.0",
84
+ description: `Generated from ${registry.source} at ${registry.generatedAt}`,
85
+ },
86
+ paths,
87
+ };
88
+ }
89
+ /** Collecte les routes d'une app Hono (y compris sous-apps montées). */
90
+ export function collectHonoRoutes(app, pathPrefix = "") {
91
+ const prefix = pathPrefix.replace(/\/$/, "");
92
+ return app.routes
93
+ .filter((route) => route.method && route.method !== "ALL")
94
+ .map((route) => {
95
+ const sub = route.path.startsWith("/") ? route.path : `/${route.path}`;
96
+ const full = sub === "/"
97
+ ? prefix || "/"
98
+ : `${prefix}${sub}`.replace(/\/{2,}/g, "/");
99
+ return { method: route.method, path: full };
100
+ });
101
+ }
102
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/api-endpoints/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Mount API observabilité — /api/v1/platform/observability/...
3
+ */
4
+ import type { ApiMount } from "@creezio/api-kernel";
5
+ import type { ObservabilityStore } from "./types.js";
6
+ export declare function createObservabilityApiMount(store: ObservabilityStore): ApiMount;
7
+ //# sourceMappingURL=api-mount.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-mount.d.ts","sourceRoot":"","sources":["../src/api-mount.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAA0B,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAU7E,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,kBAAkB,GACxB,QAAQ,CA6GV"}