@blueforge-studio/app-logs
SDK for app-logs, the BlueForge opt-in event lane: a batching producer client for LogEventV1 events and a reader client for events/summary queries. Zero runtime dependencies.
Informations sur le paquet
Versions
| Version | Publiée |
|---|---|
| 0.1.0 | 2026-10-25 |
Chaîne d'approvisionnement par version
| Version | Sig | SBOM | Att |
|---|---|---|---|
| 0.1.0 |
Cliquez sur une version pour voir ses détails.
Chaîne d'approvisionnement
Provenance
- Publié par
- web:5
- Quand
- 2026-10-25T21:36:34Z
- sha256 (calculé par le registre)
- 20687bf4bee657c306b98819cb9808cf60ae914e40fbf1a7e7559a90db18c91d
Observé par le registre au moment de la publication.
Déclaré par la compilation
L'éditeur n'a rien déclaré sur sa compilation.
Pièces jointes
- Signature
- aucune
- SBOM
- aucune
Dépendances
README
@blueforge-studio/app-logs
Producer + reader SDK for app-logs, the BlueForge opt-in event lane
(design: docs/superpowers/specs/2026-10-23-app-logging-design.md in
forge-control). Zero runtime dependencies.
import { createLogProducer, createLogReader } from '@blueforge-studio/app-logs'
// Env (operator-provisioned, mirrors APP_DEVDB_*):
// FORGE_LOGS_URL full ingest URL
// FORGE_LOGS_PROJECT project UUID
// FORGE_LOGS_SECRET producer secret (ingest); reader secret (read-back)
const logs = createLogProducer({
ingestUrl: process.env.FORGE_LOGS_URL!,
secret: process.env.FORGE_LOGS_SECRET!,
project: process.env.FORGE_LOGS_PROJECT!,
enabled: () => consentStore.has('analytics') && flags.mediaLog !== 'off',
})
logs.emit({
kind: 'audio.play',
session_ref: liveHandle.session_ref,
visitor_ref: liveHandle.visitor_ref,
props: { hop: 'clip_served', path: '/clips/a.mp3', lang: 'da' }, // origin-relative paths!
})
await logs.flush() // explicit flush = one deterministic receipt (CI/relay pattern)
logs.drop() // consent revoke: discard the unsent buffer
Receipt: {accepted, deduped, quota_dropped} — the three always sum to the
batch size. Batches: ≤500 events, ≤256 KB. Retries: network + 502/503/504
only (never 4xx), secret redacted from every error.
Read-back (verify what you shipped):
const reader = createLogReader({ baseUrl: FORGE_LOGS_URL, readerSecret: READER })
const page = await reader.events({ project, session_ref, kind: 'audio.play' })
An event you cannot read back is not verified. Producer secrets cannot read.