@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.
- package/README.md +328 -0
- package/dist/.creezio-src-hash.json +4 -0
- package/dist/api-endpoints/http-routes.d.ts +11 -0
- package/dist/api-endpoints/http-routes.d.ts.map +1 -0
- package/dist/api-endpoints/http-routes.js +11 -0
- package/dist/api-endpoints/http-routes.js.map +1 -0
- package/dist/api-endpoints/index.d.ts +4 -0
- package/dist/api-endpoints/index.d.ts.map +1 -0
- package/dist/api-endpoints/index.js +3 -0
- package/dist/api-endpoints/index.js.map +1 -0
- package/dist/api-endpoints/registry.d.ts +66 -0
- package/dist/api-endpoints/registry.d.ts.map +1 -0
- package/dist/api-endpoints/registry.js +102 -0
- package/dist/api-endpoints/registry.js.map +1 -0
- package/dist/api-mount.d.ts +7 -0
- package/dist/api-mount.d.ts.map +1 -0
- package/dist/api-mount.js +114 -0
- package/dist/api-mount.js.map +1 -0
- package/dist/helpers.d.ts +23 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +36 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -0
- package/dist/memory-store.d.ts +3 -0
- package/dist/memory-store.d.ts.map +1 -0
- package/dist/memory-store.js +113 -0
- package/dist/memory-store.js.map +1 -0
- package/dist/ops/emit.d.ts +8 -0
- package/dist/ops/emit.d.ts.map +1 -0
- package/dist/ops/emit.js +15 -0
- package/dist/ops/emit.js.map +1 -0
- package/dist/ops/fleet-activity.d.ts +50 -0
- package/dist/ops/fleet-activity.d.ts.map +1 -0
- package/dist/ops/fleet-activity.js +123 -0
- package/dist/ops/fleet-activity.js.map +1 -0
- package/dist/ops/fleet-agent.d.ts +102 -0
- package/dist/ops/fleet-agent.d.ts.map +1 -0
- package/dist/ops/fleet-agent.js +352 -0
- package/dist/ops/fleet-agent.js.map +1 -0
- package/dist/ops/fleet-samples.d.ts +33 -0
- package/dist/ops/fleet-samples.d.ts.map +1 -0
- package/dist/ops/fleet-samples.js +223 -0
- package/dist/ops/fleet-samples.js.map +1 -0
- package/dist/ops/journal.d.ts +56 -0
- package/dist/ops/journal.d.ts.map +1 -0
- package/dist/ops/journal.js +307 -0
- package/dist/ops/journal.js.map +1 -0
- package/dist/ops/rules.d.ts +16 -0
- package/dist/ops/rules.d.ts.map +1 -0
- package/dist/ops/rules.js +98 -0
- package/dist/ops/rules.js.map +1 -0
- package/dist/ops/types.d.ts +69 -0
- package/dist/ops/types.d.ts.map +1 -0
- package/dist/ops/types.js +119 -0
- package/dist/ops/types.js.map +1 -0
- package/dist/request-logs/config.d.ts +19 -0
- package/dist/request-logs/config.d.ts.map +1 -0
- package/dist/request-logs/config.js +36 -0
- package/dist/request-logs/config.js.map +1 -0
- package/dist/request-logs/http-routes.d.ts +8 -0
- package/dist/request-logs/http-routes.d.ts.map +1 -0
- package/dist/request-logs/http-routes.js +29 -0
- package/dist/request-logs/http-routes.js.map +1 -0
- package/dist/request-logs/index.d.ts +6 -0
- package/dist/request-logs/index.d.ts.map +1 -0
- package/dist/request-logs/index.js +5 -0
- package/dist/request-logs/index.js.map +1 -0
- package/dist/request-logs/middleware.d.ts +11 -0
- package/dist/request-logs/middleware.d.ts.map +1 -0
- package/dist/request-logs/middleware.js +198 -0
- package/dist/request-logs/middleware.js.map +1 -0
- package/dist/request-logs/request-logs.d.ts +60 -0
- package/dist/request-logs/request-logs.d.ts.map +1 -0
- package/dist/request-logs/request-logs.js +260 -0
- package/dist/request-logs/request-logs.js.map +1 -0
- package/dist/schema.d.ts +3 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +21 -0
- package/dist/schema.js.map +1 -0
- package/dist/sqlite-driver.d.ts +16 -0
- package/dist/sqlite-driver.d.ts.map +1 -0
- package/dist/sqlite-driver.js +15 -0
- package/dist/sqlite-driver.js.map +1 -0
- package/dist/sqlite-store.d.ts +12 -0
- package/dist/sqlite-store.d.ts.map +1 -0
- package/dist/sqlite-store.js +176 -0
- package/dist/sqlite-store.js.map +1 -0
- package/dist/types.d.ts +67 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/usage/adapters.d.ts +31 -0
- package/dist/usage/adapters.d.ts.map +1 -0
- package/dist/usage/adapters.js +37 -0
- package/dist/usage/adapters.js.map +1 -0
- package/dist/usage/http-routes.d.ts +23 -0
- package/dist/usage/http-routes.d.ts.map +1 -0
- package/dist/usage/http-routes.js +150 -0
- package/dist/usage/http-routes.js.map +1 -0
- package/dist/usage/index.d.ts +11 -0
- package/dist/usage/index.d.ts.map +1 -0
- package/dist/usage/index.js +7 -0
- package/dist/usage/index.js.map +1 -0
- package/dist/usage/ui-brand.d.ts +23 -0
- package/dist/usage/ui-brand.d.ts.map +1 -0
- package/dist/usage/ui-brand.js +18 -0
- package/dist/usage/ui-brand.js.map +1 -0
- package/dist/usage/usage-analytics-productivity.d.ts +73 -0
- package/dist/usage/usage-analytics-productivity.d.ts.map +1 -0
- package/dist/usage/usage-analytics-productivity.js +317 -0
- package/dist/usage/usage-analytics-productivity.js.map +1 -0
- package/dist/usage/usage-analytics-shared.d.ts +5 -0
- package/dist/usage/usage-analytics-shared.d.ts.map +1 -0
- package/dist/usage/usage-analytics-shared.js +20 -0
- package/dist/usage/usage-analytics-shared.js.map +1 -0
- package/dist/usage/usage-analytics.d.ts +127 -0
- package/dist/usage/usage-analytics.d.ts.map +1 -0
- package/dist/usage/usage-analytics.js +338 -0
- package/dist/usage/usage-analytics.js.map +1 -0
- package/dist-cjs/api-endpoints/http-routes.js +14 -0
- package/dist-cjs/api-endpoints/http-routes.js.map +1 -0
- package/dist-cjs/api-endpoints/index.js +10 -0
- package/dist-cjs/api-endpoints/index.js.map +1 -0
- package/dist-cjs/api-endpoints/registry.js +107 -0
- package/dist-cjs/api-endpoints/registry.js.map +1 -0
- package/dist-cjs/api-mount.js +117 -0
- package/dist-cjs/api-mount.js.map +1 -0
- package/dist-cjs/helpers.js +41 -0
- package/dist-cjs/helpers.js.map +1 -0
- package/dist-cjs/index.js +118 -0
- package/dist-cjs/index.js.map +1 -0
- package/dist-cjs/memory-store.js +119 -0
- package/dist-cjs/memory-store.js.map +1 -0
- package/dist-cjs/ops/emit.js +18 -0
- package/dist-cjs/ops/emit.js.map +1 -0
- package/dist-cjs/ops/fleet-activity.js +131 -0
- package/dist-cjs/ops/fleet-activity.js.map +1 -0
- package/dist-cjs/ops/fleet-agent.js +358 -0
- package/dist-cjs/ops/fleet-agent.js.map +1 -0
- package/dist-cjs/ops/fleet-samples.js +229 -0
- package/dist-cjs/ops/fleet-samples.js.map +1 -0
- package/dist-cjs/ops/journal.js +326 -0
- package/dist-cjs/ops/journal.js.map +1 -0
- package/dist-cjs/ops/rules.js +102 -0
- package/dist-cjs/ops/rules.js.map +1 -0
- package/dist-cjs/ops/types.js +126 -0
- package/dist-cjs/ops/types.js.map +1 -0
- package/dist-cjs/package.json +3 -0
- package/dist-cjs/request-logs/config.js +42 -0
- package/dist-cjs/request-logs/config.js.map +1 -0
- package/dist-cjs/request-logs/http-routes.js +32 -0
- package/dist-cjs/request-logs/http-routes.js.map +1 -0
- package/dist-cjs/request-logs/index.js +27 -0
- package/dist-cjs/request-logs/index.js.map +1 -0
- package/dist-cjs/request-logs/middleware.js +203 -0
- package/dist-cjs/request-logs/middleware.js.map +1 -0
- package/dist-cjs/request-logs/request-logs.js +277 -0
- package/dist-cjs/request-logs/request-logs.js.map +1 -0
- package/dist-cjs/schema.js +24 -0
- package/dist-cjs/schema.js.map +1 -0
- package/dist-cjs/sqlite-driver.js +18 -0
- package/dist-cjs/sqlite-driver.js.map +1 -0
- package/dist-cjs/sqlite-store.js +182 -0
- package/dist-cjs/sqlite-store.js.map +1 -0
- package/dist-cjs/types.js +12 -0
- package/dist-cjs/types.js.map +1 -0
- package/dist-cjs/usage/adapters.js +47 -0
- package/dist-cjs/usage/adapters.js.map +1 -0
- package/dist-cjs/usage/http-routes.js +154 -0
- package/dist-cjs/usage/http-routes.js.map +1 -0
- package/dist-cjs/usage/index.js +34 -0
- package/dist-cjs/usage/index.js.map +1 -0
- package/dist-cjs/usage/ui-brand.js +23 -0
- package/dist-cjs/usage/ui-brand.js.map +1 -0
- package/dist-cjs/usage/usage-analytics-productivity.js +321 -0
- package/dist-cjs/usage/usage-analytics-productivity.js.map +1 -0
- package/dist-cjs/usage/usage-analytics-shared.js +23 -0
- package/dist-cjs/usage/usage-analytics-shared.js.map +1 -0
- package/dist-cjs/usage/usage-analytics.js +353 -0
- package/dist-cjs/usage/usage-analytics.js.map +1 -0
- package/fleet-collector/AGENTS.md +7 -0
- package/fleet-collector/README.md +83 -0
- package/fleet-collector/configure-fleet-npm.sh +108 -0
- package/fleet-collector/env.mjs +174 -0
- package/fleet-collector/ops-api.mjs +455 -0
- package/fleet-collector/public/admin.html +696 -0
- package/fleet-collector/public/index.html +941 -0
- package/fleet-collector/server.mjs +564 -0
- package/fleet-collector/test-fleet-collector.mjs +413 -0
- package/fleet-collector/test-server-admin.mjs +475 -0
- package/package.json +109 -0
- package/scripts/test-api-endpoints-registry.mjs +60 -0
- package/ui/analytics-client.tsx +834 -0
- package/ui/analytics-productivity-panel.tsx +513 -0
- package/ui/api-endpoints-client.tsx +228 -0
- package/ui/index.ts +39 -0
- package/ui/primitives/badge.tsx +37 -0
- package/ui/primitives/button.tsx +44 -0
- package/ui/primitives/card.tsx +44 -0
- package/ui/primitives/cn.ts +6 -0
- package/ui/primitives/input.tsx +19 -0
- package/ui/primitives/tabs.tsx +51 -0
- package/ui/request-logs-client.tsx +327 -0
- package/ui/session-usage-analytics-provider.tsx +28 -0
- package/ui/usage-analytics-client.ts +479 -0
- 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,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 @@
|
|
|
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"}
|