The home ADR 0050 left open for a usage reading. mesh-control is a CLI and
cannot consume events, so the store that keeps the current usage picture is a
MODULE — the audit-logger's sibling: it consumes `module.*.usage.*` and upserts
each reading into its own provisioned postgres store, latest per
(licence, consumer, period, metric), in the clear. One vendor-neutral table
holds BOTH grains; they differ only in `consumer` (the holding module for the
licence grain, the session for the finer one). The consumer creates its table
on startup and, as a restart-until-ready service, self-heals rather than
gating the apply on a run-once that must reach a provider over the overlay.
The vendor->row normalisation moves into the adapter, as ADR 0054 requires:
anthropic-manager (licence grain, utilization%) and anthropic-consumer (session
grain, token/cost) now emit already-normalised { rows: UsageRow[], raw } on
their existing keys, so the store stays vendor-blind.
Proven end to end by the mesh-lab model-usage bed (green): a usage event
emitted into the mesh is upserted at both grains, latest-per-key, in the clear.
Claude-Session: https://claude.ai/code/session_01LrgweAeERJYBg88c5cKDzF
16 lines
859 B
TypeScript
16 lines
859 B
TypeScript
// Ambient types for `pg` (node-postgres), which ships its types only via the separate `@types/pg`
|
|
// package. Rather than pull that in at tsc time, this declares the exact slice model-usage uses —
|
|
// the same precedent anthropic-manager sets for `tweetnacl-sealedbox-js` (a local ambient .d.ts,
|
|
// listed in tsconfig `include`, default-imported). The real `pg` is installed into the module's
|
|
// runtime image (package.json `dependencies`; novox/hq ADR 0052), so this types the code without
|
|
// deciding what runs.
|
|
declare module "pg" {
|
|
/** A lazily-connecting connection pool. Only the connection string, one query form, and end() are
|
|
* used here. */
|
|
export class Pool {
|
|
constructor(config?: { connectionString?: string });
|
|
query(text: string, params?: unknown[]): Promise<{ rows: any[]; rowCount: number }>;
|
|
end(): Promise<void>;
|
|
}
|
|
}
|