Files
suaveplan/STATUS.md
2026-05-27 23:29:53 +01:00

832 lines
198 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Status
> **Single source of truth** for every package planned, in-flight, or shipped on `genesis`. Edit by hand when status changes; regenerate from disk + `SUMMARY.md` whenever the auto-gen sources are refreshed (see [Maintenance](#maintenance) below).
>
> Companion docs:
>
> - [`SUMMARY.md`](./SUMMARY.md) — auto-generated package summaries (completed / pending / genesis-original) with full descriptions.
> - [`MANIFEST.md`](./MANIFEST.md) — auto-generated dep graph + tier overlay (`bun scripts/folder-reorg/generate-manifest.ts`).
> - [`MISSING.yml`](./MISSING.yml) — auto-generated machine-readable list of packages not yet on disk (`bun scripts/generate-missing.ts`).
> - [`MIGRATION.md`](./MIGRATION.md) — Vaulted password-manager migration plan (future reference, not active OpenSpec work).
## Legend
| Symbol | Meaning |
|---|---|
| ✅ | **Migrated.** Source is on `genesis` and the package builds. Folder under `packages/` is populated. |
| – | **Yet to be migrated.** Source exists in `../suaveplan/` (main branch) but has not been ported, **or** the genesis folder is a placeholder waiting on its OpenSpec change. |
| ❌ | **Hasn't been written yet.** Net-new package — not in `suaveplan` and no genesis source. Typically scheduled in `MIGRATION.md`. |
## Counts
| Status | Count |
|---|---:|
| ✅ Migrated | 387 |
| – Yet to be migrated | 152 |
| ❌ Hasn't been written yet | 7 |
| **Total tracked** | **501** |
## Packages
### `api`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/api` | ✅ | Hono orchestrator + middleware framework: SuaveApp composition-via-DI, AppBuilder fluent API with auto-wired tenant resolver, 6-state monotonic FSM, multi-source Zod config loader (file→env-file→env-vars), name-addressable MiddlewareChain (fail-fast insert), full SuaveplanError statusCode passthrough, configurable health routes, opt-in single RequestContext ALS, 5 API.* codes |
| `@suaveplan/api-gateway` | – | API gateway with routing, load balancing, circuit br... |
| `@suaveplan/api-manifest` | ✅ | Stage-1 contract package for the API plugin foundation. Composite Zod `pluginManifestSchema` (`.strict()` at top level) covers every documented `plugin.json` key from design §3 — identity / compat / isolation / permissions / dependsOn / routes / graphql / websockets / sse / sagas / twoPhaseCommit / database / jobs / events / secrets / config / scopes / telemetry / openapi / errors / uninstall. `parseManifest` (throw-form) and `parseManifestSafe` (discriminated `ParseResult`) over the same schema. Four cross-field validators that Zod alone can't express: `validateSagaOwnership`, `validatePermissionsWhenSandboxed`, `validateOpenApiRequiresGraphqlOrRoutes`, `validateErrorStatusMapShape` — each batch-mode, every offender surfaced in one pass. `resolveInstallOrder` is a deterministic Kahn topological sort with lexicographic tie-breaking; cycle path + missing-dep + version-mismatch surface stable error codes. `resolveCapabilities` reports required-missing / version-mismatch as errors and optional-missing as warnings. `hashManifest` returns `sha256:<hex>` over canonical JSON (deep key-sort, cycle/bigint/NaN-reject). `runManifestConformance` harness for downstream parsers. Eleven `MANIFEST.*` codes, every one production-path-reachable (spec-conformance-test enforced). 109 tests, 100/100/100/100 coverage. Deps: `@suaveplan/api-types`, `@suaveplan/error`, `@suaveplan/types`, `zod`. |
| `@suaveplan/api-migrations` | ✅ | Dialect-agnostic DB migration runner: MigrationAdapter per dialect (SurrealQL/Postgres/SQLite shipped, MySQL slot open), real SHA-256 checksum validation, AbortSignal cancellation, dry-run, OTel emitters, 6 MIGRATION.* codes |
| `@suaveplan/api-openapi` | ✅ | OpenAPI 3.1 registry + RouteBuilder with end-to-end Zod inference, widened StandardResponses (400-504 incl. 422/429/503/504), instance-only SchemaRegistry (no global singleton), atomic Hono/registry dual-surface registration via definePluginRoutes, 3 OPENAPI.* codes |
| `@suaveplan/api-router-worker-bridge` | ✅ | Stage-3 HTTP marshaller across the worker boundary: `marshalRequest`/`rehydrateRequest` + `marshalResponse`/`rehydrateResponse` (tagged-union body: `none`/`inline`/`stream`), default header deny-list (`authorization`/`cookie`/`set-cookie`/`x-csrf-token`/`proxy-authorization`), 64 KiB inline cap + 16 MiB hard cap, Zod envelope schemas validated both sides; `ReadableStream<Uint8Array>` transport over `api-worker-rpc` `stream-chunk`/`stream-end`/`stream-ack` frames with window=16 backpressure; `createMainBridge(port)` / `createWorkerBridge(port, handler)` over a single `MessagePort` with multiplex by correlation id; worker-side `SuaveplanError` round-trips via `errorToEnvelope`; `createInProcessBridge` + `runBridgeConformance` harness; 4 `ROUTER_BRIDGE.*` codes (`MARSHAL_FAILED`, `BODY_TOO_LARGE`, `STREAM_INTERRUPTED`, `RESPONSE_INVALID`); no raw `Request` reference ever crosses the wire; 72 tests / 100/100/100/100 coverage. |
| `@suaveplan/api-worker-rpc` | ✅ | Stage-3 root: MessagePort RPC protocol — Zod-validated `WorkerRpcMessage` discriminated frames (request/response/cancel/progress/stream-*/hello/goodbye), CorrelationIdGenerator + pendingRegistry, `createWorkerRpcClient<T>(port)` Proxy + `serveWorkerRpc(port, handlers)`, streaming via AsyncIterable + backpressure policy, AbortSignal forwarding via cancel frames, SuaveplanError round-trip via ErrorEnvelope codec, cloneable-guard, 10 `WORKER_RPC.*` codes, `runWorkerRpcConformance` harness. 122 tests / 100/100/100/100. |
| `@suaveplan/api-worker-host` | ✅ | Stage-3 worker-side runtime hosting exactly one plugin: `bootstrapWorkerPlugin` validates manifest + capability handles via Zod, builds frozen RPC-backed capability proxy table over the capability port, mounts `lifecycle.dispatch`/`host.manifest`/`host.state` on the control port, and posts `worker-ready`; `createLifecycleReceiver` runs the nine-state worker FSM with `errorToEnvelope`-reconstructed `LifecycleAck`; `installCrashDetector` wires `uncaughtException`/`unhandledRejection` → `WORKER_HOST.CRASHED`; 9 `WORKER_HOST.*` codes; `runWorkerHostConformance` in-process simulator. 55 tests / 100/100/100/100. |
| `@suaveplan/api-logger-worker-proxy` | ✅ | Stage-3 worker → main logger proxy: `createLoggerProxyClient(port, plugin)` returns `LoggerLike` with plugin pre-tagging + OTel `TraceProvider` + injectable `ClientClock`; `createLoggerProxyServer(port, logger, options?)` with redaction passthrough, level narrowing, child-logger cache, observation hooks. `LogBatcher` with size/idle/error-flush + bounded outstanding-batch budget. `ControlChannelSender`/`mountControlChannelReceiver` for `disable`/`enable`. 5 `LOGGER_PROXY.*` codes; `runLoggerProxyConformance` harness. 66 tests / 100/100/100/100. |
| `@suaveplan/api-jobs-worker-proxy` | ✅ | Stage-3 jobs proxy: bidirectional `MessagePort` bridge implementing `capabilities.JobRegistrationHandle`. Worker `registerCron`/`registerQueued` calls store closures in `HandlerRegistry` and marshal `registerJob` RPC to main; main-side validates against manifest whitelist then wires registration into host's real handle. Scheduler ticks dispatch `runJob` back to the worker; `runWithTimeout` enforces per-handler budgets. 5 `JOBS_PROXY.*` codes. 44 tests / 100/100/100/100. |
| `@suaveplan/api-events-worker-proxy` | ✅ | Stage-3 worker-tier proxy over a main-process `EventBus`. `createEventBusProxyServer(port, bus)` mounts the bus over `@suaveplan/api-worker-rpc`; `createEventBusProxyClient(port)` returns `EventBus`-shaped surface. Subscriptions are long-lived streaming RPCs; Zod-validated payload codec + structured-clone safety probe reject non-cloneable payloads with `EVENTS_PROXY.UNSERIALISABLE_PAYLOAD`. Per-subscription `highWaterMark` backpressure. 4 `EVENTS_PROXY.*` codes. 77 tests / 100/100/100/100. |
<<<<<<< HEAD
| `@suaveplan/api-events-in-memory` | ✅ | Stage-5 in-memory `EventsBus` adapter for the API testing kit. `createInMemoryEventsBus(options?)` (alias `createInMemoryEventBus`) wraps a fresh `@suaveplan/events` `EventBus` with a per-topic recording layer: `publish`/`publishAsync`/`emit` append payload to history BEFORE dispatch so `bus.published(topic)` returns every payload since the last `reset()` (or construction) in publish order even when subscribers throw. Subscribers fire through the real production bus (FIFO delivery, `once`, `off`, dispose unsubscribe). `emit(topic, payload)` satisfies the structural `CapabilityEventBusLike` contract from `@suaveplan/api-types/capabilities` so the bus can be handed to plugins as their `events` capability directly. Strict-throw history overflow via cap-bounded `History` ring (`maxHistoryPerTopic` default 1000; positive-integer Zod boundary rejects `0`, negatives, fractions, and unknown keys via `.strict()`). 2 `EVENTS_IN_MEMORY.*` codes (`HISTORY_OVERFLOW` with `{topic, limit}` context, `INVALID_OPTIONS` carrying `z.ZodError` cause). `./testing` subpath ships `createInMemoryEventsBusHarness({maxHistoryPerTopic?})` returning `{bus, waitFor(predicate, {timeoutMs=1000, intervalMs=5}?), dispose}` with fast-path resolve when the predicate already holds and descriptive timeout messages. `dispose()` clears history AND subscribers. 6 subpath exports (`./bus`, `./adapter` alias, `./history`, `./options`, `./testing`, `./error-codes`). 43 tests across 5 files / 100/100/100/100 coverage. Deps: `@suaveplan/api-types`, `@suaveplan/events`, `@suaveplan/error`, `tslib`, `zod`. |
=======
| `@suaveplan/api-db-sqlite-memory` | ✅ | Stage-5 in-memory SQLite database adapter for the api-host testing kit. `createSqliteMemoryAdapter(opts?)` opens a real `bun:sqlite` `Database` (`:memory:` default or any filename for file-backed fixtures), applies `journal_mode=WAL` + `foreign_keys=ON` by default with full per-pragma override (`{ ...DEFAULT_PRAGMAS, ...opts.pragmas }`), and exposes the canonical `AdminDatabaseLike` surface — real `BEGIN IMMEDIATE`/`COMMIT`/`ROLLBACK`, real `prepare`/`finalize`, real FK enforcement (no shim). `createSqliteMemoryDb(opts?)` composes the adapter with `createTenantScopedSqliteWrapper` to return `{ admin, scoped(tenantId), close }`; the scoped surface mirrors `@suaveplan/api-db-adapter`'s rewriter (WHERE/AND injection on SELECT/UPDATE/DELETE preserving ORDER BY/LIMIT/GROUP BY/RETURNING tails, INSERT auto-inject under `autoInjectInserts: true` or rejection with `DB_SQLITE_MEMORY.TENANT_SCOPE_VIOLATION` under `false`, literal + bound-param tenant-mismatch detection, `$N` positional bind handling, multi-row INSERT/INSERT…SELECT/DDL/record-params all rejected). `registerSqliteMemoryEngine()` declaration-merges `"sqlite-memory"` into the api-db-adapter `DatabaseEngineRegistry` and installs an idempotent disposer-returning factory so `createDbAdapter({ engine: "sqlite-memory", url: ":memory:" })` resolves transparently from any Stage-4 caller. `runSqliteMemoryMigrations({ plugin, admin, migrationsDir, fs })` is a transactional lexicographic forward-only runner with `__plugin_migrations(plugin, version, applied_at)` bookkeeping, idempotent re-run, and `DB_SQLITE_MEMORY.MIGRATION_FAILED` with the offending file on `context.file`. `createInMemorySqliteHarness(opts?)` ships the convenience `beforeEach`/`afterEach` builder with idempotent `cleanup()`. 4-code `DB_SQLITE_MEMORY_*` namespace (`OPEN_FAILED`, `INVALID_OPTIONS`, `MIGRATION_FAILED`, `TENANT_SCOPE_VIOLATION`), each thrown by a real production path. 5 OTel instruments lazily resolved (`api.db.query_duration_ms`, `api.db.execute_duration_ms`, `api.db.errors_total`, `api.db.migrations_applied_total`, `api.db.migration_duration_ms`) — counter + histogram both asserted under an in-memory `MeterProvider`. 9 subpath exports. 73 tests across 10 files, 100/100/100/100 src coverage. Deps: `@suaveplan/api-db-adapter`, `@suaveplan/api-types`, `@suaveplan/error`, `@opentelemetry/api`, `tslib`, `zod`. |
>>>>>>> feat/api-db-sqlite-memory
| `@suaveplan/api-db-adapter` | ✅ | Stage-4 bridge from `@suaveplan/db` engine adapters to plugin `AdminDatabaseLike` / `TenantScopedDatabaseLike`. Open `DatabaseEngineRegistry` (host calls `registerEngine(name, factory)` per engine — postgres/sqlite/surrealdb declared in `@suaveplan/api-types`, third-party engines via declaration merging). `createDbAdapter({ engine, url, pool?, tenantColumn, autoInjectInserts, migrationsDir? })` returns `{ admin, scoped(tenantId), close }`; Zod-validated options throw `DB_ADAPTER.INVALID_OPTIONS`. `createTenantScopedWrapper(admin, tenantId, opts?)` rewrites SQL: `WHERE`/`AND tenantColumn = ?` on SELECT/UPDATE/DELETE (ORDER BY, LIMIT, RETURNING, GROUP BY tails preserved); INSERT auto-injects column when `autoInjectInserts: true` or rejects with `TENANT_SCOPE_VIOLATION` (also for conflicting literal/bound tenant value); DDL + multi-row INSERT + record-shaped params + named params all rejected at the boundary. `createUnsafeGate({ plugin, capabilities, admin })` exposes `db.unsafe.query/execute` gated by `db.unsafe-queries` capability declaration; permitted calls increment `plugin.unsafe_query_total{plugin}`; absent declaration throws `UNSAFE_NOT_PERMITTED`. `runMigrations({ plugin, admin, migrationsDir, fs })` applies lexicographic `*.sql` files inside engine transaction (when supported), records versions in `__plugin_migrations(plugin, version, applied_at)`, idempotent on re-run, `MIGRATION_FAILED` with cause + file context. `createDbAdapterWorkerProxy({ port, engine })` wires `@suaveplan/api-db-worker-proxy/worker-side` into the same surface for plugins running inside worker hosts (cursor streaming preserved). 5 `DB_ADAPTER.*` codes (`TENANT_SCOPE_VIOLATION`, `UNSAFE_NOT_PERMITTED`, `MIGRATION_FAILED`, `ENGINE_UNSUPPORTED`, `INVALID_OPTIONS`). 3 OTel instruments (`plugin.unsafe_query_total`, `api.db.migrations_applied_total`, `api.db.migration_duration_ms`) all lazily-resolved via `getMeter` for test-MeterProvider compatibility. 63 tests / 100/100/100/100. Deps: `@suaveplan/api-types`, `@suaveplan/api-db-worker-proxy`, `@suaveplan/db`, `@suaveplan/error`, `@opentelemetry/api`, `tslib`, `zod`. |
| `@suaveplan/api-db-worker-proxy` | ✅ | Stage-3 worker → main DB adapter proxy. `createDbProxyServer(port, db)` mounts `AdminDatabaseLike` on a `MessagePort`; `createDbProxyClient(port, { engine })` returns proxy + streaming `cursor(sql, params, { signal? })`. Transactions auto-commit/auto-rollback; leaked `tx` handles throw `DB_PROXY.TRANSACTION_LOST`. Prepared statements survive multiple round-trips. Cursor rows stream as `stream-chunk` frames; consumer abort propagates. `wrapTenantScoped(adminProxy, tenantId)` is the worker-side type-level facade. 4 `DB_PROXY.*` codes. 72 tests / 100/100/100/100. |
| `@suaveplan/api-router` | ✅ | Stage-1 contract package for the API plugin foundation. Abstract `Router` class (8 verbs incl. `all` with 2- and 3-arg overloads + `mount` prefix composition + `match` resolution + `collidesWith` + `use` middleware chain) with reference in-memory implementation; host-side `RouterRequest`/`RouterResponse` shapes + immutable `ResponseBuilder` (`ok`/`jsonResponse` shortcuts, ETag, Server-Timing, streaming toggle); `MapHeaders` case-insensitive store; Zod-validated `routeOptionsSchema` (`auth`, `summary`, `tags`, `request`/`responses` with structural Zod predicate accepting cross-realm schemas, `runtimeValidation`/`openapi` defaulting true, `streaming` defaulting false, `csrf`, `idempotent`, discriminated `rateLimit: {rpm} | {rps}`); onion-model `Middleware` + `composeMiddleware` with double-`next()` rejection; 11-step `PipelineStep` literal + `PLUGIN_INSERTION_STEP="post-validation"` + `assertPluginInsertionStep` guard; `RouteMatch` + frozen `createRouteMatch`; `BlueGreenSlot` interface + `InMemoryBlueGreenSlot` reference impl (atomic `flip` returning `DrainingHandle`, `acquire`/`release` pending bookkeeping, `dispose` race-with-AbortSignal on timeout); frozen 5-entry `ROUTER_CODES` (`ROUTE_COLLISION`, `INVALID_PREFIX`, `MIDDLEWARE_INSERTION_DENIED`, `SLOT_FLIP_FAILED`, `SLOT_DISPOSE_TIMEOUT`) — every code thrown by a production path + spec-conformance test enumerating reachability; `runRouterConformance(factory)` adapter harness + `makeNoopSpan`/`makeFixtureRequest` helpers. 9 subpath exports. 125 tests across 16 files, 100/100/100/100 coverage. Deps: `@suaveplan/api-types`, `@suaveplan/error`, `@suaveplan/types`, `tslib`, `zod`. |
| `@suaveplan/api-router-in-memory` | ✅ | Stage-5 in-memory `Router` + `PipelineRouter` adapter. Single concrete `InMemoryRouter` class extends abstract `Router` from `@suaveplan/api-router` (inheriting verb registration, mount/prefix rewriting, collision detection, param parsing) AND exposes the pipeline facet (`registerPipelineRoute`, `unregisterPipelineRoute`, `unregisterPipelinePlugin`, `listPipelineRoutes`, `matchPipeline`) structurally compatible with `@suaveplan/api-host`'s `PipelineRouter`/`PipelineRoute` contracts. `PipelineRouteTable` Map-backed metadata store: cross-plugin collision throws `ROUTER_IN_MEMORY.ROUTE_COLLISION`; same-plugin re-registration overwrites (hot-reload path); URL-decoded `:param` extraction; trailing-slash + case normalisation. `InMemoryBlueGreenSlot` thin extension of `api-router`'s reference impl. Zod-validated constructor options throw `ROUTER_IN_MEMORY.INVALID_PREFIX` on invalid plugin label. `createInMemoryRouterHarness()` bundles a fresh router + pinned slot factory for downstream foundation/plugin tests. 50 tests across 7 files including BOTH conformance suites (`runRouterConformance` from `@suaveplan/api-router/testing` AND `runPipelineRouterConformance` from `@suaveplan/api-host/testing`); 100/100/100/100 coverage. Subpath exports: `./adapter`, `./blue-green-slot`, `./pipeline`, `./testing`, `./error-codes`. No HTTP listener, no socket — production-grade in-memory adapter, not a test double. Deps: `@suaveplan/api-host`, `@suaveplan/api-router`, `@suaveplan/api-types`, `@suaveplan/error`, `tslib`, `zod`. |
| `@suaveplan/api-router-hono` | ✅ | Stage-4 concrete Hono `Router` adapter. `HonoRouter` subclasses the abstract `Router` and mirrors every verb registration (`get`/`post`/`put`/`patch`/`delete`/`head`/`options`/`all`) onto a private Hono instance; `getHonoApp()` exposes the underlying app for ops integrations; `createHonoRouter()` factory returns the abstract `Router` surface so `runRouterConformance` accepts it unchanged. `HonoBlueGreenSlot` implements `BlueGreenSlot` with O(1) atomic flip, pending-counter `acquire`/`release`, AbortController per slot, `dispose(timeoutMs)` racing a timer against drain settle and aborting on timeout (`ROUTER.SLOT_DISPOSE_TIMEOUT`), `flip()` without a shadow throws `ROUTER.SLOT_FLIP_FAILED`. `toHonoMiddleware`/`fromHonoMiddleware` bridge the genesis onion-model `Middleware` ↔ Hono `MiddlewareHandler`; bridge wraps Hono-side throws in `RouterHonoError` (`ROUTER_HONO.HONO_INTERNAL_ERROR`). 2-entry `ROUTER_HONO_CODES` (`HONO_INTERNAL_ERROR`, `INVALID_HONO_PEER`) — every code thrown by a production path. 50 tests across 5 files including full `runRouterConformance` invocation, 100/100/100/100 coverage. Deps: `@suaveplan/api-router`, `@suaveplan/api-types`, `@suaveplan/error`, `tslib`, `zod`; `hono` peer ≥4.0.0. |
| `@suaveplan/api-plugin` | ✅ | Plugin-system foundation: definePlugin / PluginRegistry with 4-phase lifecycle, deterministic topo-sort, AbortSignal-enforced timeouts, type-safe ServiceRegistry via module augmentation, priority-ordered HookExecutor, 10 PLUGIN.* codes |
| `@suaveplan/api-tenant` | ✅ | Multi-tenant resolution: canonical Tenant type, 6 resolver strategies + TenantCache (TTL + negative + request-coalesce), single c.get("tenant") key, fail-closed NullTenantContext, pluggable rate-limit store with LRU bound, opt-in ALS, tenantScopes plugin opt-out, 7 TENANT.* codes |
<<<<<<< HEAD
| `@suaveplan/api-tenant-resolver-jwt` | ✅ | Stage-4 tenant-resolver adapter: reads `Principal.tenantId` (or a configurable claim from `Principal.claims`) attached by an earlier `api-auth-*` chain step and projects it into a `TenantContext`; returns `null` (chain-advance sentinel) when the claim is absent, throws `TENANT_RESOLVER_JWT.PRINCIPAL_MISSING_TENANT_ID` only under strict-mode (`requirePrincipal: true`); Zod-validated options at construction time (`TENANT_RESOLVER_JWT.INVALID_OPTIONS`); injectable `PrincipalExtractor` (default reads `request.principal`); self-conformance harness covers id stability, return-shape contract, request immutability, concurrent fan-out; 31 tests, 100/100/100/100 coverage. Deps: `@suaveplan/api-types`, `@suaveplan/error`, `zod`. |
=======
| `@suaveplan/api-tenant-provider-memory` | ✅ | Stage-4 in-memory reference `TenantProvider` adapter. `createMemoryTenantProvider({ tenants? })` returns a `MemoryTenantProvider` (abstract contract + out-of-band `add`/`remove`/`clear` admin helpers) backed by an insertion-ordered `Map<TenantId, TenantRecord>` for deterministic `list()` output and O(1) `lookup`/`count`. Honours the contract's active-only-default filter (`includeSuspended` lifts to active+suspended; `archived` reachable only via `lookup`) and the canonical `encodeCursor`/`decodeCursor` codec from `@suaveplan/api-tenant-provider/pagination`, including `pageSize` clamp + resumable cursor offsets. Every record entering the store passes through `tenantRecordSchema` at the boundary — seed, `add()`, and options shape all validated. 3 `TENANT_PROVIDER_MEMORY.*` codes (`DUPLICATE_TENANT`, `TENANT_NOT_FOUND`, `INVALID_RECORD`), each thrown from at least one production path. Idempotent `dispose()` clears the store. Passes `runTenantProviderConformance({ label: "memory" })` verbatim. 25 tests, 100/100/100/100 coverage. Deps: `@suaveplan/api-tenant-provider`, `@suaveplan/api-types`, `@suaveplan/error`, `tslib`, `zod`. |
>>>>>>> feat/api-tenant-provider-memory
| `@suaveplan/api-plugin-admin` | – | Admin panel plugin |
| `@suaveplan/api-plugin-analytics` | – | Product analytics, funnel/cohort analysis |
| `@suaveplan/api-plugin-audit` | ✅ | Hono audit-trail plugin wrapping `@suaveplan/audit-logging`. Global middleware records `{method, path, status, duration_ms, response_size, request_id, principal_id, tenant_id}` per request with severity classification (info<400, warning<500, error otherwise). Configurable sampling (head-end RNG gate), exclude paths (health probes default), case-insensitive header redaction + exact query/body field redaction, optional JSON body capture. `c.get("audit")` exposes handler-level `log()` + `getLogger()` via Hono `ContextVariableMap` augmentation. `auditService` typed slot in `ServiceRegistry`. Sink failures never throw into the request — logged at warn + counted via `audit.sink_failures_total`. 4 `AUDIT_PLUGIN_*` codes; 4 OTel instruments (`requests_recorded_total{outcome,sampled}`, `requests_excluded_total`, `sink_failures_total`, `middleware_duration_ms`). 65 tests inc. 1000-request sampling integration in [400, 600] band. 100/100/100/100 coverage. |
| `@suaveplan/api-plugin-auth` | ✅ | Better-Auth-first authentication plugin. Canonical 6-step `onInit` lifecycle (resolve services → apply schema via injected `MigrationRunner` → construct Better-Auth via injectable factory → register `authService` in `ServiceRegistry` → register routes via `definePluginRoutes` → install global session-resolver middleware that sets typed `c.get("user")` + `c.get("session")` via Hono `ContextVariableMap` augmentation). 9 OpenAPI routes (sign-up, sign-in, sign-out, session, forgot-password, reset-password, verify-email, oauth-start, oauth-callback) via `RouteBuilder` PLUS catch-all `app.all("/auth/*", auth.handler)` so Better-Auth's full router surface is reachable while OpenAPI documents the 9 canonical paths. 4 middleware factories: `sessionMiddleware`, `requireAuth`, `requireRole`, `requireEmailVerified`. `Principal` + `mapBetterAuthUserToPrincipal` (canonical genesis identity). 10 `AUTH.*` codes, every one thrown from a real call site. 5 OTel instruments (`sessions_resolved_total`, `session_resolve_duration_ms`, `role_check_total`, `signups_total`, `signins_total`). 122 tests including 5 real-SurrealDB-testcontainer integration tests (full sign-up → sign-in → /session → sign-out roundtrip; OpenAPI doc lists 9 routes; schema-apply idempotency). 100/100/100/100 coverage. |
| `@suaveplan/api-plugin-campaigns` | ✅ | Hono campaigns/suppression/webhooks API plugin (18 routes) with OpenAPIHono boundaries, Surreal + in-memory repositories, local CampaignSuppressionStore (channel-scoped) |
| `@suaveplan/api-plugin-cms` | ✅ | Content management plugin |
| `@suaveplan/api-plugin-database` | ✅ | Database management plugin (Path A: wraps SurrealAdapter). 88 tests, 100% coverage. Shipped parallel session. |
| `@suaveplan/api-plugin-event-bus` | ✅ | Genesis-native typed event-bus plugin wrapping `@suaveplan/events`. `createEventBusPlugin(options)` factory. Canonical 6-step `onInit`: resolve `app` + optional `openAPIRegistry` → construct `EventBus` (interceptors + bounded queue + idempotency) → register `eventBusService` slot → install `requestBusMiddleware` setting `c.set("eventBus", scopedHandle)` via `ContextVariableMap` → optionally mount 3 routes (`POST /event-bus/publish`, `GET /event-bus/subscriptions`, `DELETE /event-bus/subscriptions/:id`) gated by `requireAuth()`. Per-tenant scoping via `scopeTopic`/`unscopeTopic` auto-prefixing with `tenant:<id>:` from `c.get("tenant")?.id` (tenant id validated against stricter sub-regex to block prefix smuggling). Topic name validation `^[a-z0-9_\-:.]+$`. 8 `EVENT_BUS_*` codes; 5 OTel instruments (`published_total{outcome,topic_root}`, `dropped_total{policy}`, `duplicates_total`, `subscriptions_active`, `publish_duration_ms`). 135 tests inc. tenant-isolation + http-routes integration suites. 100/100/100/100 coverage. |
| `@suaveplan/api-plugin-events` | ✅ | Events management plugin (social/calendar — RSVPs, meetups, ICS export — not yet shipped; distinct from `api-plugin-event-bus`) |
| `@suaveplan/api-plugin-export` | ✅ | Data export plugin (CSV, JSON, XLSX) with streaming + RBAC scoping. 77 tests, 100% coverage. Shipped parallel session. |
| `@suaveplan/api-plugin-file-upload` | ✅ | Multipart + chunked file uploads with validation. 6 routes under `basePath` (default `/uploads`): `POST /` single-shot (10 MiB default cap), `POST /initiate` + `PUT /:uploadId/chunks/:chunkIndex` + `POST /:uploadId/complete` chunked (1 GiB default cap, 5 MiB default chunk), `DELETE /:uploadId` abort, `GET /:uploadId` status. All `requireAuth()`-gated + scoped to `c.get("user")!.id` + tenant (foreign uploadId → 404 anti-enumeration). MIME validation via `@suaveplan/mime` with magic-bytes sniff cross-check (PNG/JPEG/GIF/WEBP/PDF/ZIP baseline) to detect Content-Type spoofing. Executable-MIME denylist on by default. SHA-256 hash verification on chunked complete; assembler + `verifyHash` helpers. Pluggable `UploadStorage` (`MemoryUploadStorage` + `FileSystemUploadStorage` with path-traversal hardening) + `UploadSessionStore` (memory default). `fileUploadService` typed slot. 11 `UPLOAD_*` codes. 4 counters + 1 histogram. Cleanup scheduler `unref()`'d, cleared on `onClose`. 154 tests inc. real-fs 1 MiB / 256 KiB chunked round-trip with simulated-crash resume + MIME spoof rejection + 200-run fast-check property. 100/100/100/100 coverage. |
| `@suaveplan/api-plugin-graphql` | ✅ | GraphQL adapter with schema building. 60 tests, 100% coverage. Shipped parallel session. |
| `@suaveplan/api-plugin-import` | ✅ | Data import plugin (CSV/JSON/XLSX) with progress tracking + transform pipeline. Wrapped onto genesis `PluginDescriptor` from `@suaveplan/api-plugin` (upstream's `definePlugin` shape rewritten). 3 format parsers (csv/json/xlsx), transform pipeline (map/filter/validate stages), in-memory `ImportStore` with per-job progress events, RFC 7807 problem+json errors via hand-rolled renderer (genesis `@suaveplan/error` doesn't ship `formatErrorAsProblemJson`). Hono routes auth-gated via `requireAuth()`; foreign-owner reads return `IMPORT_NOT_FOUND` (anti-enumeration). Route errors funnel through `app.onError` so handler returns stay strictly typed against OpenAPI response codes. Removed 7 `@deprecated` aliases + duplicate `import.service.ts` per `enterprise/api-plugin-import.md` §3. 158 tests across 13 files (csv 29, json 7, xlsx 7, transform 24, progress 8, store 8, service 34, problem-json 6, build-routes 14, plugin 11, conformance 4, otel 2, error-codes 4). 100/100/100/100 coverage (statements 593/593, branches 347/347, functions 104/104, lines 554/554). |
| `@suaveplan/api-plugin-rate-limit` | ✅ | Hono rate-limit plugin wrapping `@suaveplan/rate-limiter`. `createRateLimitPlugin(options)` factory + standalone `rateLimit({service})` middleware. `RateLimitService` typed slot in `ServiceRegistry`: `check({ip, tenantId?, path, method})`, `reset(key)`, `config`. Default global `app.use("*", rateLimit(...))` (secure-by-default); per-route mount available. Hono-compatible path patterns (exact, `/*`, inline `*`, `:param`). 429 response: RFC 7807 Problem+JSON body + `Retry-After` header. Three header families on every response: `X-RateLimit-*` (default), RFC 9238 `RateLimit-*`, `both`. Tenant multiplier applied to numeric limit. `c.set("rateLimit", decision)` via `ContextVariableMap`. Pluggable `RateLimitStorage` (bundled `MemoryStorage` default; Redis caller-supplied). 5 codes (`INVALID_INPUT`, `SERVICE_NOT_AVAILABLE`, `LIMIT_EXCEEDED`, `STORAGE_FAILURE`, `INVALID_PATH_PATTERN`). 4 OTel instruments. 75 tests, 100/100/100/100. |
| `@suaveplan/api-plugin-search` | ✅ | Full-text search plugin with relevance scoring, Typesense-backed via `@suaveplan/testing-integration-typesense`. 125 tests, 100% coverage. Shipped parallel session. |
| `@suaveplan/api-plugin-site` | ✅ | Site management plugin |
| `@suaveplan/api-plugin-social` | – | Social features plugin |
| `@suaveplan/api-plugin-sse` | ✅ | Server-Sent Events plugin via native `ReadableStream<Uint8Array>` (Bun/Node/Workers/Deno portable). `createSsePlugin(options)` factory; `sseService` slot: `broadcast(channel, event)`, `subscribe({channel, lastEventId?, principalId?, signal?})` returning `SubscriptionHandle` with `AsyncIterableIterator<SseEvent>`, `close(channel?)`, `stats()`. Reads `Last-Event-ID` for resume; threads `AbortSignal` on client disconnect; per-connection heartbeat via injectable timer; backpressure via `pull`-driven `drainInto` with `queueHighWaterMark` + `overflowPolicy`. Bounded `RingBuffer` per channel with stale-cursor protection. Pluggable `Fanout` (in-process default; cross-node siblings later). `formatSseFrame`/`parseSseStream` wire-format pair shipped. 8 `SSE_*` codes incl. `SSE_UNAUTHENTICATED` via `requirePrincipal: true`. 4 counters + UpDownCounter + Histogram. 102 tests inc. real-fetch round-trip + heartbeat + `Last-Event-ID` reconnect, 100/100/100/100. |
| `@suaveplan/api-plugin-tenant` | ✅ | Hono plugin exposing `@suaveplan/api-tenant`'s resolver chain as a first-class slot. `createTenantPlugin(options)` factory; canonical 6-step `onInit`: resolve host services → build 7-strategy resolver chain (header/subdomain/domain/path/jwt/query/cookie; `Query`+`Cookie` contributed locally since `api-tenant` didn't ship those) → register `tenantService` → install global middleware setting `c.set("tenant", ctx)` → optionally mount 5 CRUD routes when `store` configured → optional rate-limit middleware. `tenantService` slot: `resolveFrom`/`requireFrom`/`current`/`getById`/`listAll`/`createTenant`/`updateTenant`/`deleteTenant`/`getResolver`. Pluggable `TenantStore` + default `MemoryTenantStore` (slug-uniqueness, idempotent soft-delete). Admin RBAC via dynamic import of `@suaveplan/api-plugin-auth`'s `requireRole("admin")` (declared as optional peer; graceful degrade when missing). Optional `TenantCache` wrap with OTel cache-outcome instrumentation. Strict Zod schemas on every surface. 7 `TENANT_PLUGIN_*` codes; 4 OTel instruments. 128 tests inc. header-beats-query priority + NullTenantContext fallback + admin role enforcement. 100/100/100/100 coverage. |
| `@suaveplan/api-plugin-user` | ✅ | User profile plugin on top of `api-plugin-auth`. 3 routes (`GET /users/me`, `PATCH /users/me`, `DELETE /users/me`) all gated by `requireAuth()` and scoped to `c.get("user")!.id`. `userService` registered in `ServiceRegistry` (`getById`, `requireById`, `getCurrent`, `updateProfile`) with module-augmentation typed slot. `USER_PROFILE_SCHEMA` DDL renderer + `applyUserProfileSchema` helper supporting both `migrationRunner` and `db` transports. `UserProfileSchema` extends `PrincipalSchema` from auth plugin; `UpdateUserProfileBodySchema` is `.pick(profileFields).partial().strict()` rejecting unknown fields; `buildUpdateBodySchemaFor` mints per-instance schemas. 7 `USER.*` error codes, every one thrown. 3 OTel counters (`profile_reads_total`, `profile_updates_total{outcome}`, `self_deletes_total`). `DELETE /users/me` uses `auth.$context.internalAdapter.deleteUser(userId)` for cascade. 101 tests including real-SurrealDB-testcontainer integration: sign-up via auth → `userService.getById` round-trip → `updateProfile`. 100/100/100/100 coverage. `dependencies: ["auth"]`. |
| `@suaveplan/api-plugin-webhook` | ✅ | Outbound signed webhook delivery plugin wrapping `@suaveplan/webhook-client`. `createWebhookPlugin(options?)` Zod-validated PluginDescriptor with 5-step `onInit`. `WebhookService`: `send`/`sendAll`/`register`/`update`/`unregister`/`listEndpoints`/`getEndpoint`/`test`. 6 routes (`GET/POST /webhooks`, `GET/PATCH/DELETE /webhooks/:id`, `POST /webhooks/:id/test`) all `requireAuth()`-gated + tenant-scoped. HMAC-SHA256 signing; canonical headers (`X-Webhook-Id`, `X-Webhook-Event`, `X-Webhook-Timestamp`, `X-Webhook-Signature`). Per-delivery dedup via `@suaveplan/idempotency` (fallback in-process Map). Retry with exponential backoff + jitter (`maxAttempts` default 5); 4xx non-retryable; dead-letter sink on exhaustion. Pluggable `EndpointStore` + `DeadLetterSink` (memory defaults). 10 `WEBHOOK.*` codes. 4 OTel instruments (`deliveries_total`, `dead_letters_total`, `delivery_attempts`, `send_duration_ms`). 77 tests inc. real `node:http` receiver on random port asserting signed payload + 3-attempt retry + dead-letter. 100/100/100/100. |
| `@suaveplan/api-auth` | ✅ | Stage-1 abstract session-resolver: `SessionResolver` + `SessionResolverChain` (ordered first-match-wins, fail-closed-on-throw, opt-in `continueOnThrow`), `SecuritySchemeContribution` (Zod-validated OAS-3.1 discriminated union), `CsrfPolicy.requiresCsrf` default, composite `AuthAdapter` (`securityScheme` now optional for anonymous topology), `AUTH_SESSION_CAPABILITY_ID` literal, 4-code `AUTH_CODES` registry, `runAuthSessionConformance` harness with null-only `seedPrincipal` mode for the anonymous tail. 55 tests / 100/100/100/100. |
| `@suaveplan/api-auth-anonymous` | ✅ | Stage-4 trivial session resolver — `createAnonymousResolver(opts?)` always returns null `Principal` and `dispose()` is a no-op (idempotent). `ANONYMOUS_AUTH_ADAPTER` constant pairs the resolver with `csrf: false` and omits `securityScheme` (anonymous-only hosts emit OpenAPI with no `security` entry); validates via `validateAuthAdapter`. Strict zod options schema rejects non-object / unknown-key input with the single `AUTH_ANON.INVALID_OPTIONS` code; no per-request failure paths by design. Passes `runAuthSessionConformance` in null-only mode (null + dispose-idempotent scenarios). 18 tests / 100/100/100/100. Deps: `@suaveplan/api-auth`, `@suaveplan/api-types`, `@suaveplan/error`, `tslib`, `zod`. |
| `@suaveplan/api-auth-static-principal` | ✅ | Stage-5 fixed-`Principal` session resolver — `createStaticPrincipalResolver(opts)` returns the configured `Principal` verbatim on every request (no token decoding, no I/O, no state). `createStaticPrincipalAdapter(opts)` bundles resolver + omitted `securityScheme` (anonymous-style topology validated by `validateAuthAdapter`) + pinned `csrf: false`. `applyTo(req)` predicate + `nullForPaths` (exact or `/foo/*` suffix-glob) drive selective null-return without rewiring the chain. Defensive clone-and-freeze per `resolve()` so callers cannot mutate one returned Principal and observe the change. Strict Zod boundary with split `AUTH_STATIC_PRINCIPAL.{INVALID_OPTIONS, INVALID_PRINCIPAL}` codes — `principal` issues map to `INVALID_PRINCIPAL`, everything else to `INVALID_OPTIONS`. Passes `runAuthSessionConformance` (`static-principal-direct`) in seeded-principal mode for the recognised scenario and via `nullForPaths` for the null scenario. 43 tests / 100/100/100/100. Stage-5 `api-host/testing` adapter-table registration deferred until that surface lands (currently `STAGE_2_RESERVED`); documented in README. Deps: `@suaveplan/api-auth`, `@suaveplan/api-types`, `@suaveplan/error`, `tslib`, `zod`. |
| `@suaveplan/api-auth-provider` | ✅ | Stage-1 abstract account-lifecycle contract (design §2.3). `AuthProviderAdapter<Caps>` with configurable `pathPrefix`, four-hook lifecycle. 9-entry `PROVIDER_ROUTE_SURFACE` (register/login/logout/refresh/oauth.start/oauth.callback/verify-email/forgot-password/reset-password). `PathOwnership` registry + `detectAuthPathCollisions` segment-aware containment. 4 `AUTH_PROVIDER.*` codes. `runAuthProviderConformance` harness. 79 tests / 100/100/100/100. |
<<<<<<< HEAD
| `@suaveplan/api-auth-bearer-static` | ✅ | Stage-4 service-to-service static-token `SessionResolver` adapter: matches `Authorization: Bearer <token>` against a fixed `token → Principal` table via constant-time compare from `@suaveplan/crypto-utils`; unknown tokens defer to next chain entry. Optional per-entry mutual-TLS gate (`mtlsRequired`) rejects when host did not surface `request.tls.peerCertificate`. Configurable `headerName`/`prefix` (case-insensitive scheme match per RFC 7235). Ships both direct surface (`createBearerStaticResolver`) and worker-proxy surface (`createBearerStaticResolverWorkerProxy` + `serveBearerStaticResolverOnPort`) over `@suaveplan/api-worker-rpc`; both pass `runAuthSessionConformance`. OAS-3.1 HTTP-Bearer `securitySchemeContribution`, 4-code `AUTH_BEARER_STATIC.*` registry (only `INVALID_OPTIONS` thrown; rest surfaced via OTel outcome label), `api.auth.bearer_static_match_total{outcome}` counter. 67 tests / 100/100/100/100. |
=======
| `@suaveplan/api-auth-jwt` | ✅ | Stage-4 concrete JWT `SessionResolver` for the API plugin foundation. `createJwtSessionResolver(opts)` verifies a Bearer JWT (or cookie token) via `@suaveplan/jws` against either a remote JWKS endpoint (`JwksCache`: positive TTL, 30s negative cache, in-flight dedup, `kid`-miss refresh, stale-on-failure) or a single static JWK; enforces `iss`/`aud`/`exp`/`nbf` with injectable `clock` + `clockToleranceSec`. `defaultClaimsToPrincipal` maps `sub`/`scope`+`scopes`/`tenant_id`+`tid`; overridable via `options.claimsToPrincipal`. `JWT_BEARER_SCHEME` OpenAPI 3.1 `http`/`bearer`/`bearerFormat: "JWT"` contribution (renameable). Per-request soft failures collapse to `null` (chain-friendly); infrastructure failures raise the 3-code `AUTH_JWT.*` registry (`JWKS_FETCH_FAILED`/`INVALID_KEY_FORMAT`/`INVALID_CLAIMS_MAPPER`). Conformance harness `runAuthSessionConformance` passes against the resolver under `jwt-static-key`. 92 tests including real-`node:http` JWKS server with RS256 sign+verify round-trip via `@suaveplan/crypto-rsa`. 100/100/100/100 coverage. |
>>>>>>> feat/api-auth-jwt
| `@suaveplan/api-schemas` | ✅ | Shared Zod schemas describing Suaveplan API request/response shapes — single so… |
| `@suaveplan/api-secrets-env` | ✅ | Stage-4 `SecretsLike` adapter backed by `process.env` / `Bun.env` with per-plugin allowed-keys enforcement. `createEnvSecrets({ allowedKeys, source?, prefix? })` returns a frozen-shaped instance: Zod-validated options (`SECRETS_ENV.INVALID_OPTIONS` on bad input); allow-list checked BEFORE source lookup (`SECRETS_ENV.KEY_NOT_PERMITTED` never reads the snapshot); `get()` resolves `undefined` for permitted-but-absent, `require()` throws `SECRETS_ENV.KEY_NOT_FOUND`; `list()` hands out the frozen `allowedKeys` so the surface cannot enumerate names outside the manifest. Injectable `source` so tests never mutate the real env; default reads `process.env` overlaid with `Bun.env` per call (no constructor cache so rotations are picked up immediately). Optional `prefix` namespaces lookups (`prefix: "BILLING_"` → `get("API_KEY")` reads `BILLING_API_KEY`). Companion `buildEnvSecretDescriptors` / `descriptorAllowedKeys` derive both the manifest `secrets[]` and the adapter's `allowedKeys` from one declaration. Secret VALUES never appear in logs/errors — only NAMES on `error.context.name`. Passes `runSecretsConformance` (`@suaveplan/api-secrets/testing`) via `isNotFound` mapped to `SECRETS_ENV.KEY_NOT_FOUND`. 3 `SECRETS_ENV.*` codes; 31 tests / 100/100/100/100 coverage. Deps: `@suaveplan/api-secrets`, `@suaveplan/api-types`, `@suaveplan/error`, `tslib`, `zod`. |
| `@suaveplan/api-ws-broker-in-memory` | ✅ | Stage-5 in-process single-host `WsBroker` implementation of the `@suaveplan/api-ws` contract. `createInMemoryWsBroker(options?)` returns an `InMemoryWsBroker<Payload>` (abstract contract + `subscriberCount(topic)` + `isDisposed()` introspection). Per-topic `Map<string, Set<RegistryEntry>>` registry; `publish(topic, envelope)` snapshots the subscriber set before dispatch so a handler that unsubscribes mid-fan-out does not skip siblings; per-subscriber failures are individually caught so one bad handler never poisons the broadcast. `deliveryMode: "fire-and-forget"` (default) dispatches without awaiting; `"await-all"` `Promise.all`-awaits every handler. Idempotent `dispose()` clears the registry and flips a `disposed` flag — subsequent `publish`/`subscribe` throw `WS_BROKER_IN_MEMORY.BROKER_DISPOSED`; second `dispose()` is a no-op. Strict-mode Zod options gate throws `WS_BROKER_IN_MEMORY.INVALID_OPTIONS` on unknown keys or invalid enum values. `./testing` subpath ships `createInMemoryBrokerHarness(opts?)` with a captured-envelope observer, `publishOne(payload, opts?)` convenience, `extraTopics` probe-registration, and idempotent teardown. 34 tests / 100/100/100/100 (istanbul); zero direct `vitest`/`bun:test` imports (uses `@suaveplan/testing/runner`). Deps: `@suaveplan/api-ws`, `@suaveplan/api-types`, `@suaveplan/error`, `tslib`, `zod`. |
| `@suaveplan/api-shared` | – | Shared API utilities and types |
| `@suaveplan/api-loader` | ✅ | Stage-1 abstract module resolver + RollbackJournal. `ModuleResolver<M>` types-only contract, `RollbackJournal` ring-buffer (depth 3) + reference `createRollbackJournal`, `bustSpecifier(url, version)` WHATWG-URL cache-bust, persisted Zod schema (sha256 + ISO datetime), `NativeBindingDetector` + `assertNoNativeBindings`, 4-code `LOADER_CODES`, conformance harnesses. 8 subpaths, 75 tests / 100/100/100/100. |
| `@suaveplan/api-graphql` | ✅ | Stage-1 abstract GraphQL contract: `createGraphqlRegistry`, `mergeSdl` federation with collision detection + `@graphql.namespace` wrapper, minimal SDL parser, `@auth`/`@rateLimit` directive descriptors, `GraphqlEngine` lifecycle, `graphql-ws` subscription protocol Zod schema, `runGraphqlEngineConformance` harness, 7 `GRAPHQL.*` codes. Zero engine deps. 82 tests / 100/100/100/100. |
| `@suaveplan/api-host` | ✅ | Stage-2 keystone for the API plugin foundation. Subpaths: `./error-codes` (44 codes via `defineCodes` across `HOST_*`/`PLUGIN_*`/`RELOAD_*`/`CAPABILITY_*`/`ADMIN_*`/`LEDGER_*` namespaces, including the Chunk-D per-request additions `TENANT_NOT_RESOLVED`/`SESSION_REQUIRED`/`CSRF_TOKEN_INVALID`/`RBAC_DENIED`/`RATE_LIMIT_EXCEEDED`/`REQUEST_VALIDATION_FAILED`/`RESPONSE_VALIDATION_FAILED`/`IDEMPOTENCY_REPLAY`/`ROUTE_NOT_FOUND`/`HANDLER_THREW`/`CLIENT_ABORTED`), `HOST_DEFAULT_STATUS_MAP`, `HostError`; `./define-plugin` author DX (`definePlugin<Caps>` literal-array `requires` threaded into `PluginContext<Caps>` + `RequestContext<Caps>`); `./capability-registry` runtime with semver/scope/duplicate validation + reverse-registration-order disposers; `./lifecycle` `LifecycleDriver` driving every §4 transition with per-plugin mutex + `crashed`/auto-restart + `startForReload` rollback hand-off; `./hot-reload` `ReloadDriver` blue-green primitive (§8.1) + `FileWatcher` debounce + persisted `RollbackJournal` (depth 3) + native-binding guard + 503-window mode; `./plugin-ledger` `PluginLedger` over `bun:sqlite` with forward-only idempotent `HostMigrationRunner`, `asLifecycleLedger()` + `asRollbackPersistence()` adapter views; `./admin-api` Hono sub-router exposing every §8.4 endpoint with `host:admin` scope, per-principal token-bucket rate-limit (60/min reads, 1/min destructive), `Idempotency-Key` enforcement, audit envelope; `./error-boundary` wraps every pipeline step and projects `SuaveplanError → statusMap` / `AbortError → 499` / unknown → 500 + cause-chain log + `api.errors_total`; `./request-pipeline` implements the §6 11-step driver exactly (tenant → session → CSRF → RBAC → rate-limit → idempotency → request-validate → handler → response-validate → audit → telemetry) with Zod request/response gates, `enforce`/`warn` strictness, streaming bypass, full §12.3 counter + histogram emission; `./host` `createHost(config)` composing every internal driver with Zod-validated config, topo-sorted `start()`/reverse-topo `stop(graceMs)`, `host.fetch(request)` driving the pipeline, `/internal/livez` + `/internal/readyz` probes, runtime `installPlugin`/`uninstallPlugin`; `./otel` `HostInstruments` covering every §12.3 counter + histogram; `./testing` populated in Stage 5 with `createTestHost(config?)` — composes the in-memory router/auth/tenant/db/secrets/ws-broker/events/ledger adapters into a running `TestHost` (extends `Host` with `installFixturePlugin`/`fetchAs`/`waitForEvent`/`dispose`), seeds `principal`/`tenants`/`secrets` through override-beats-default slots, exposes `STAGE_2_RESERVED=false` for Stage-2 detection back-compat, alongside the existing `runPipelineRouterConformance` harness; Stage-5 smoke (`e2e/foundation-stack-test-host`) drives every wired slot via Bun.serve + 8 Playwright groups. 287 tests, 100% line coverage on every Chunk-D module + every other src/ module, full pre-publish gate (lint + typecheck + test + build) green. |
| `@suaveplan/api-types` | ✅ | Types-only contract package for the API plugin foundation — `Principal`/`TenantId` brands, the `PluginManifest` type-level view, `PluginContext`/`RequestContext` with capability-driven `db` split (admin vs tenant-scoped), 25-member alphabetised `CapabilityId` union + `CapabilityMap`/`RequestCapabilityMap` lookup, `CapabilitySlice<Caps>` context narrowing, 13-state `PluginState` lifecycle union, `ErrorCode` template literal `PLUGIN.<UPPER>.<UPPER>`, `Router`/`Middleware`/`RouteHandler`/`RouteOptions`/`RouterSlot`/`BlueGreenSlot`, `AuthAdapter`/`AuthProviderAdapter`/`SessionResolver`/`SecuritySchemeContribution`, `TenantResolver`/`TenantResolverChain`/`TenantProvider`, `SecretsLike`/`SecretDescriptor`, `AdminDatabaseLike`/`TenantScopedDatabaseLike` with open-extensible `DatabaseEngineRegistry`, `GraphqlRegistry`/`Resolver`/`SubscriptionResolver`/`LoaderFactory`, `WsConnection`/`WsConnectionRegistry`/`SubscriptionBus`/`WsBroker`, `SseConnection`/`SseBroker`, `SagaParticipant`/`SagaInstance`/`SagaStep`/`SagaState`, `TwoPcParticipant`/`TwoPcVote`/`TwoPcTransaction`, `WorkerRpcMessage` discriminated union + `WorkerProxyOf<T>` structural transform with `NotCloneable<T>` marker, `Counter`/`Histogram`/`Gauge`/`InstrumentRegistry`, `RollbackJournalEntry`/`RollbackJournal` ring-buffer interface. 20 subpath exports, zero runtime, zero deps; byte-size + dep-graph + 11 `expectTypeOf` conformance suites pinning every cross-cutting invariant. |
### `audio`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/audio-controllers` | ✅ | Universal-tier MIDI hardware controller plugins. Ships `KontrolS88Plugin` (88-key keyboard with scale modes, arp, pitch-bend, mod-wheel, RGB key LEDs), `MaschinePlugin` (16-pad grid + per-pad step rows + slot-based sample loader), `TraktorS4Plugin` (4-deck DJ controller with mixer, crossfader, per-channel volume). Shared `MidiControllerPlugin` base — injectable `MidiAccessAdapter` seam (zero `navigator` references), `@suaveplan/fsm`-driven `disconnected/connecting/connected/error` connection state with hot-plug recovery, declarative `CCMapping` DSL with Zod boundary validation, learn mode, batched LED output. Transport-synced `Sequencer` and `Arpeggiator` (sample-accurate via `Transport.scheduleRepeat`, offline-renderable, zero `setInterval`). `bindParameter` / `bindPluginPreset` helpers for `@suaveplan/audio-fx-plugin-base` integration with linear/log/exponential scale mapping + optional smoothing curve. 6 `AUDIO_CONTROLLERS.*` codes (`ACCESS_DENIED`, `INVALID_OPTIONS`, `INVALID_STATE`, `DEVICE_ERROR`, `NOT_CONNECTED`, `UNKNOWN_PARAMETER`). OTel tracer + 4 instruments (`audio_controller_midi_messages_total`, `audio_controller_sequencer_steps_total`, `audio_controller_midi_latency_ms`, `audio_controller_sequencer_jitter_ms`) no-op without exporter, no import-time globals. 104 tests, 100/100/100/100 coverage. |
| `@suaveplan/audio-core` | ✅ | Universal audio data model and processing primitives: paged AudioDocument, non-destructive PlanEngine, block-level ProcessPipeline, and typed OpRegistry |
| `@suaveplan/audio-decode-wav` | ✅ | Genesis-original universal WAV decoder wrapping `@audio/decode-wav` with uniform `AudioDecoder` contract, `AUDIO_DECODE.WAV.*` codes, OpenTelemetry, and chunked-stream + whole-buffer decode paths. |
| `@suaveplan/audio-engine-browser` | ✅ | Browser-tier `TimelineAdapter` implementation: Web Audio rendering, AudioWorklet hosting, and `AudioFxPlugin` `createAudioNode()` integration for the universal `TimelineEngine`. |
| `@suaveplan/audio-engine-server` | ✅ | Server-tier `TimelineAdapter` implementation: file source/sink adapters and offline render driver for the universal `TimelineEngine`. |
| `@suaveplan/audio-ir-core` | ✅ | Genesis-original foundation for the IR family: `ImpulseResponse`, `IrManifest`/`IrManifestEntry` Zod schemas, `IrRegistry` with collision detection, `MutableUriPluginRegistrar` + `createUriPluginCollector`, `AUDIO_IR.*` codes, OpenTelemetry. |
| `@suaveplan/audio-ir-loader` | ✅ | Genesis-original IR pipeline: registry → resolver → decoder → manifest validation → frozen `ImpulseResponse`. LRU cache, bounded preload, `AUDIO_IR_LOADER.*` codes, OpenTelemetry. |
| `@suaveplan/audio-ir-room-plugin-club` | ✅ | Genesis-original IR content package: ships two bundled WAV room captures (`club1.wav`, `club2.wav`) via the `bundle://` URI scheme. Canonical example of the bundle-only content pattern. |
| `@suaveplan/audio-ir-room-plugin-pool` | ✅ | Genesis-original IR content package: ships one bundled WAV (`outdoor-swimming-pool.wav`) paired with a CDN fallback via `fallback://?u=<bundle>&u=<https>`. Canonical example of the bundle + fallback pattern. |
| `@suaveplan/audio-fx-plugin-audio-analyzer` | ✅ | Tap-point FFT analyser plugin (member of audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-audio-player` | ✅ | Playback source plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-auto-filter` | ✅ | LFO-driven filter plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-base` | ✅ | Foundation for the audio-fx-plugin-*amily: AudioFxPlugin contract, PluginChain, ChainContext, AmbientState, BusRegistry, PluginRegistry, ChainSnapshot, ChainEventBus, ParameterSchedule, PresetSnapshot, biquad DSP math, `AUDIO_FX.*` error-code registry. Universal-tier; zero @suaveplan/audio-fx-plugin-* deps. |
| `@suaveplan/audio-fx-plugin-chorus` | ✅ | Modulated comb / multi-voice chorus plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-compressor` | ✅ | Feed-forward compressor with sidechain input (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-delay` | ✅ | Stereo delay with ping-pong + BPM sync (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-distortion` | ✅ | Waveshaping + soft/hard clip plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-eq` | ✅ | Parametric / shelving / high-pass / low-pass 8-band equaliser, RBJ Audio EQ Cookbook biquads (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-filter` | ✅ | Multi-mode filter (biquad / IIR / state-variable) (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-flanger` | ✅ | Short-delay modulated comb plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-game-audio` | ✅ | Game-audio orchestration plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-gate` | ✅ | Noise gate with hold + linked envelope (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-glados` | ✅ | Pitch-tracked vocal-style effect plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-limiter` | ✅ | Look-ahead brick-wall limiter plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-microphone` | ✅ | Source plugin simulating mic colour (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-mixer` | ✅ | Bus mixer with per-channel sends (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-phaser` | ✅ | All-pass-bank phaser plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-pitch-shifter` | ✅ | Phase-vocoder pitch-shifter plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-reverb` | ✅ | Engine-pluggable reverb (FDN / Schroeder / convolution) (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-sampler` | ✅ | Sample-playback source plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-spatial` | ✅ | HRTF-based spatial panner plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-synthesizer` | ✅ | Polyphonic subtractive synth plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-tremolo` | ✅ | Amplitude-modulated tremolo plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-fx-plugin-widener` | ✅ | Stereo width / mid-side processor plugin (audio-fx-plugin-* family). |
| `@suaveplan/audio-metadata` | ✅ | Universal audio metadata extractor: parses ID3v1/v2, MP4/M4A atoms, FLAC Vorbis… |
| `@suaveplan/audio-sprite-packer` | ✅ | Universal audio sprite packer with injectable adapter, Zod-validated boundaries, and OpenTelemetry instrumentation. Zero browser or Node.js dependencies. |
| `@suaveplan/audio-timeline` | ✅ | Headless DAW timeline engine with multi-track arrangements, clips, playback, loop regions, selection, zoom, per-track mixer state, undo/redo, and a pluggable TimelineAdapter. |
| `@suaveplan/audio-transport` | ✅ | Universal musical clock and transport: sample-accurate scheduling with PPQ, BPM automation, swing, time signatures, and loop regions. Zero browser or Node dependencies. |
| `@suaveplan/dmx` | – | DMX512 lighting control engine |
| `@suaveplan/python-audio-fingerprint` | – | High-accuracy audio fingerprinting and matching service |
| `@suaveplan/r3f-audio` | – | Positional 3D spatial audio (HRTF, culling) |
| `@suaveplan/r3f-dmx` | – | DMX512 lighting control visualization |
| `@suaveplan/react-audio` | ✅ | React surface for the unified audio architecture: `AudioProvider` (strict-mode-safe lifecycle over `BrowserTimelineAdapter` + `PluginRegistry` + `BusRegistry`), 14 hooks via `useSyncExternalStore` for concurrent-safe + SSR-consistent subscription, 17 components (`<PluginSlot>` generic renderer + 12 composed-plugin UIs + `<MidiControllerSetup>` learn-mode), 2 zustand stores, full keyboard + ARIA a11y, Storybook coverage gate enforcing default + interactive + edge-case stories. `REACT_AUDIO.*` error-code namespace, per-component subpath exports. Shipped across 4 sequential changes (`enterprise-react-audio-{foundation,components,components-extras,midi}`). |
| `@suaveplan/react-audio-fingerprint` | – | Audio fingerprinting components |
| `@suaveplan/react-audio-player` | – | Modular audio player with 3D viz |
| `@suaveplan/react-audio-stream` | – | Audio streaming components |
| `@suaveplan/voice` | ✅ | Provider-agnostic voice core: abstract interfaces, shared types, Zod schemas, a… |
### `auth`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/auth` | ✅ | Provider-agnostic authentication: JWT lifecycle, API key management, session ma… |
| `@suaveplan/better-auth-surrealdb` | ✅ | Better-Auth Adapter for SurrealDB v3. Two factories: v1.4 `createBetterAuthSurrealAdapter` returns the 10-method `CustomAdapter` directly; v1.6 `createBetterAuthSurrealAdapterV16` wraps it via `createAdapterFactory` from `@better-auth/core/db` to satisfy v1.6's `DBAdapterInstance` factory shape (re-invoking the factory inside the transaction callback to thread Better-Auth's full transform pipeline). Bundles canonical 17-table `BETTER_AUTH_SURREAL_SCHEMA` (user/session/account/verification/passkey/jwks/sso_provider/oauth_application/oauth_access_token/oauth_consent/organization/member/invitation/team/team_member/two_factor/api_key + 13 indexes) extracted byte-for-byte from upstream `02-better-auth.surql`, plus `applyBetterAuthSchema(adapter)` helper. `DEFAULT_BETTER_AUTH_LINK_FIELDS` auto-prefixes string userIds → `record<user>` for 9 link tables. RecordId construction routes through `createRequire(import.meta.url)("surrealdb")` to dodge the CJS/ESM class-identity bug in the driver's CBOR encoder. 172/172 tests including real-SurrealDB-testcontainer `signUpEmail` end-to-end roundtrip. 19-requirement spec (14 v1.4 + 5 v1.6). |
| `@suaveplan/jwt-tenant` | ✅ | JWT-based multi-tenant token issuance and verification with Ed25519/ECDSA signi… |
| `@suaveplan/macos-keychain` | ✅ | macOS Keychain bridge via the `security` CLI: shell-injection-safe `Bun.spawn… |
| `@suaveplan/oauth-client` | ✅ | Universal OAuth 2.0 / OIDC client: Authorization Code + PKCE, Client Credential… |
| `@suaveplan/permissions` | ✅ | Full RBAC/ABAC permissions engine: Ability/AbilityBuilder, RoleManager, PolicyE… |
| `@suaveplan/react-auth` | ✅ | Authentication components |
| `@suaveplan/react-auth-whitelabel` | ✅ | White-label auth with tenant branding |
| `@suaveplan/react-permissions` | – | RBAC/ABAC permission components |
| `@suaveplan/webauthn` | ✅ | W3C WebAuthn L3 client: `register` / `authenticate` over injectable `WebAuthnAdapter`, full authenticator-data parser with flags decoder, all 7 attestation-format verifiers (`packed` self+full, `fido-u2f`, `tpm` via `@suaveplan/tpm-struct`, `android-key`, `android-safetynet` via `@suaveplan/jws`, `apple`, `none`) under pluggable registry, COSE_Key parse via `@suaveplan/cbor/cose`, signature verify dispatching to `@suaveplan/crypto-curve` + `@suaveplan/crypto-rsa`, X.509 chain validation via `@suaveplan/x509`, sign-counter regression detection (W3C §6.1.1), PRF + largeBlob extension passthrough, conditional UI, DOMException → typed error mapping with 6 DOM-name → typed-error edges, 17-code error registry, constant-time challenge + rpIdHash compare, 5 OTel instruments. 64 impl + 27 test + 24 sibling `.md` + 8 fixture + 3 benchmark files; 317+ tests; 100% coverage. Side-effects: `decodeOne` re-exported from `@suaveplan/cbor` root barrel (1 line) + `__fixtures__/` namespace anchor + subpath export added to `@suaveplan/x509` (both packages keep 100% coverage). |
### `barcode`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/barcode` | ✅ | Barcode generation and parsing for common 1D symbologies: Code 128, Code 39, EA… |
| `@suaveplan/qrcode` | ✅ | QR code generation producing SVG, pixel matrix, terminal (Unicode blocks), and… |
### `bitpacker`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/bitpacker` | ✅ | Core bit-level binary packing: BitWriter, BitReader, BitPacker, strategy manager. Hardened: Zod boundary, `./register-schemas`, OTel instruments + spans on pack/unpack, mitata baseline. |
| `@suaveplan/bitpacker-compressed` | ✅ | CompressedBitPacker + RLE/dictionary adapters and registry. Hardened: Zod boundary on adapter + config, `./register-schemas`, OTel instruments. |
| `@suaveplan/bitpacker-crypto` | ✅ | Bit-packer-aware crypto primitives — SignedBitSchema, EncryptedBitSchema, EnvelopeSchema, MultiSignedBitSchema, HashChainSchema, schemaFingerprint, crc32/adler32. Skipped from Phase 3 OTel (already instrumented upstream). |
| `@suaveplan/bitpacker-delta` | ✅ | DeltaManager, calculateStringDiff/applyStringDiff, numberXor — change detection and diff/patch encoding. |
| `@suaveplan/bitpacker-game` | ✅ | GameStateManager, vector quantization, PositionPredictor / RotationPredictor (Kalman + 6 polynomial methods), GameInterpolator (9 methods), StateReconciliation. Hardened: Zod boundary on the 6 option bundles, `./register-schemas`, OTel instruments. |
| `@suaveplan/bitpacker-network` | ✅ | NetworkSimulator (latency, jitter, packet loss, burstiness). Hardened: Zod boundary with 0–100 percentage bounds + structural Rng/Clock injection, `./register-schemas`, OTel instruments. |
| `@suaveplan/bitpacker-schema` | ✅ | Schema registry, validation, and versioning for @suaveplan/bitpacker. |
| `@suaveplan/bitpacker-strategies` | ✅ | 22 built-in packing strategies. Hardened: Zod boundary on registerDefaultStrategies, `./register-schemas`, OTel span on bootstrap, fast-check properties on 9 kinds, `_version` forward tolerance via `_tolerance: "strict"\|"forward"` + `_allowedVersions`. |
| `@suaveplan/bitpacker-streaming` | ✅ | packToChunks, unpackFromChunks, FramedPack/UnpackStream — Web Streams + length-prefix framing. Hardened: Zod boundary on 9 option bundles + FramingConfig, `./register-schemas`, OTel instruments. |
| `@suaveplan/bitpacker-validation` | ✅ | SafetyLimits, SafetyChecker, RecursionGuard, ValidationReport. Hardened: Zod boundary on safety + validator options, `./register-schemas`, OTel instruments. |
### `commerce`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/api-plugin-asset-register` | – | Asset register — fixed assets, depreciation, mainten... |
| `@suaveplan/api-plugin-bank` | – | Game bank with virtual currency + interest |
| `@suaveplan/api-plugin-banking` | – | Banking/payment plugin |
| `@suaveplan/api-plugin-payment` | ✅ | Payment intent lifecycle plugin wrapping `@suaveplan/payment` + provider siblings (`payment-provider-{stripe,adyen,paypal,square}`). `createPaymentPlugin(options)` factory — caller injects `PaymentProvider` (no default). 7 OpenAPI routes all `requireAuth()`-gated + scoped to `c.get("user").id` with 404 anti-enumeration: `POST/GET /payments/intents`, `GET /payments/intents/:id`, `POST /payments/intents/:id/{confirm,capture,cancel,refund}`. Webhook receiver `POST /payments/webhook` mounted as separate sub-router (NOT through `OpenAPIRegistry` so generated SDKs don't expose it) that reads raw body BEFORE Zod parsing for HMAC verification (SHA-256/384/512, 5-min replay window default). `Idempotency-Key` middleware wired to `POST /intents` + `POST .../refund` via `@suaveplan/idempotency` (`MemoryIdempotencyStore` default). Pluggable `PaymentIntentStore` (in-memory default) maps provider IDs back to `(ownerId, tenantId?)`. `FakePaymentProvider implements PaymentProvider` for tests (real interface, in-memory backing). 15 `PAYMENT_PLUGIN_*` codes; 5 counters + 1 histogram (all `provider`-labeled). BigInt amounts serialized as decimal strings. `app.onError` translator converts `PaymentPluginError` → JSON. 153 tests inc. full createIntent → confirm → capture → refund lifecycle + idempotency replay + webhook signature verify + cross-user isolation. 100/100/100/100 coverage. |
| `@suaveplan/booking` | ✅ | Universal-tier JSON-configurable booking engine with pluggable strategies — `BookingEngine<TBookableMeta, TBookingMeta>` pipeline (availability → conflict → pricing → rules → state machine → events), in-package `Hooks<TMap>` transform pipeline, configurable `StateMachine` for status transitions, typed `EventBus` for 15 lifecycle events, six domain presets (seats / accommodation / appointments / resources / activities / transport), four built-in conflict detectors (exact_match / range_overlap / slot_capacity / provider_overlap), three availability strategies (exactMatch / rangeOverlap / capacity), eight built-in rule-condition factories, rule evaluator with 11 operators, pricing calculator + seasonal + dynamic + tiered + modifier pipeline with three rounding modes, Zod schemas for bookable / booking / config validation, temporal helpers (windows / recurrence / slots), and typed `BookingError extends SuaveplanError<BookingErrorCode>` with 7-code registry (`ENGINE_NOT_CONFIGURED`, `BOOKING_NOT_FOUND`, `BOOKING_CONFLICT`, `TRANSITION_NOT_ALLOWED`, `UNKNOWN_CONFLICT_MODE`, `UNKNOWN_AVAILABILITY_STRATEGY`, `HOOK_RETURNED_PROMISE_IN_SYNC`) and optional `bookingId` / `holdId` / `mode` / `strategy` discriminants. 29 subpath exports, 150 tests at 100/100/100/100 coverage. Deps: `@suaveplan/error`, `zod`. |
| `@suaveplan/currency` | ✅ | Universal-tier currency conversion engine — pluggable `CurrencyProvider` interface, TTL-bounded `RateCache` with direct / inverse / triangulated lookup, primary + fallback chain with `AbortSignal` cancellation, Zod-validated public boundary, typed `CurrencyError` hierarchy with 7 stable `CURRENCY.*` codes, virtual-currency seeding with post-construction `setVirtualRate` / `updateVirtualRate` mutators, enriched `ConversionResult` carrying `providerName` and `triangulatedThrough` diagnostics. 6 subpath exports, 107 tests at 100/100/100/100 coverage. Built on `@suaveplan/money`. |
| `@suaveplan/currency-provider-binance` | ✅ | Universal-tier Binance sibling of the `@suaveplan/currency-providers` slim core (follow-up wave, 2026-05-17). Ships `BinanceProvider implements CurrencyProvider` (`name = "binance"`, `supportsCrypto = true`, `supportsFiat = false`) plus the stable `BINANCE_PROVIDER_NAME` / `BINANCE_DEFAULT_BASE_URL` constants. No API key required — fetches the public Binance spot ticker (`GET /api/v3/ticker/price`) through the slim core's shared `httpRequest()` helper, suffix-decodes pairs (e.g. `BTCUSDT` → `BTC` when base is `USDT`) into the converter's "1 base = N units of asset" form via `1 / price`, sanitises zero / negative / non-finite prices, defends against the `USDTUSDT`-style suffix-equals-symbol edge case, and exposes typed `CurrencyProviderError` for every failure: `HTTP_ERROR` (non-2xx via `httpRequest`), `PARSE_ERROR` (non-JSON body, with `cause` set only when the parser threw an `Error`), `UPSTREAM_ERROR` (payload shape is not `Array<{ symbol: string; price: string }>` — non-array, null row, wrong-typed row, missing field), `UNKNOWN_CURRENCY` (requested `options.targets` entry absent from upstream listing, with the offending symbol surfaced in `upstreamMessage`). Constructor takes optional `NoKeyConfig & { timeoutMs?: number }` — injectable `FetchLike` for tests / proxies / edge runtimes, custom `baseUrl` for regional mirrors or staging, optional `timeoutMs` that flows through to `httpRequest` and composes with the caller's `AbortSignal`. 1 subpath export (`./binance/binance`), 21 tests at 100/100/100/100 coverage. Deps: `@suaveplan/currency`, `@suaveplan/currency-providers`, `@suaveplan/error`, `@suaveplan/types`, `tslib`. |
| `@suaveplan/currency-provider-kraken` | ✅ | Universal-tier Kraken sibling for the `@suaveplan/currency-providers` slim core (2026-05-17). Ships `KrakenProvider implements CurrencyProvider` (`name = "kraken"`, `supportsCrypto = true`, `supportsFiat = false`) wrapping Kraken's free, no-API-key `/0/public/Ticker?pair=<csv>` endpoint — accepts the slim core's shared `NoKeyConfig` (optional `baseUrl` defaulting to `https://api.kraken.com/0/public`, optional injectable `FetchLike` defaulting to `globalThis.fetch`) plus an optional `extraSymbols` map that merges on top of the canonical 12-symbol table at construction time (single-round-trip batch fetch via the comma-separated `pair=` query; bidirectional `KRAKEN_SYMBOL_MAP` / `KRAKEN_PAIR_TO_SYMBOL` frozen maps normalise Kraken's legacy `X<base>Z<quote>` asset-prefix names — `XXBTZUSD`, `XETHZUSD`, `XDGUSD`, `XLTCZUSD`, `XXRPZUSD` — and the flat `<base>USD` newer listings — `SOLUSD`, `USDTZUSD`, `DOTUSD`, `ADAUSD`, `LINKUSD`, `AVAXUSD`, `ATOMUSD`). Routes every request through the shared `httpRequest()` helper from the slim core so HTTP failures + caller `RateFetchOptions.signal` propagation come for free, reads the `c[0]` last-trade-closed price for each mapped pair and inverts it (`rates[symbol] = 1 / price`) into the converter's `1 USD = N crypto` convention, silently skips entries whose price doesn't parse to a positive finite number (Kraken occasionally returns `"0.00"` for freshly-listed pairs), filters the rate map by `options.targets`, defaults `options.base` to `"USD"`. Typed error mapping: `HTTP_ERROR` (non-2xx via `httpRequest`, carries `status`), `UPSTREAM_ERROR` (non-empty `data.error[]` array, carries first message on `upstreamMessage`; falls back to `"unknown upstream error"` when the array contains a `null`), `PARSE_ERROR` (malformed JSON or shape-violating body — non-object, non-array `error`, missing or non-object `result`, JSON `null`), `UNKNOWN_CURRENCY` (caller-supplied `targets` array is non-empty but no requested symbol resolves to a mapped Kraken pair). 2 subpath exports (`./symbols/symbols`, `./provider/provider`), 34 tests at 100/100/100/100 coverage. Universal-tier, `sideEffects: false`. Deps: `@suaveplan/currency`, `@suaveplan/currency-providers`, `@suaveplan/error`, `@suaveplan/types`, `tslib`. |
| `@suaveplan/currency-provider-cryptocompare` | ✅ | Universal-tier CryptoCompare sibling for the `@suaveplan/currency-providers` slim core (2026-05-17). Ships `CryptoCompareProvider implements CurrencyProvider` (`name = "cryptocompare"`, `supportsCrypto = true`, `supportsFiat = false`) with truly-optional `apiKey` config — free public tier works fully keyless, supplying `apiKey` attaches the `authorization: Apikey <key>` header on every outbound request (free → keyed is a single-field config change; whitespace-only strings are treated as absent so `process.env.CRYPTOCOMPARE_API_KEY` can be passed directly without a guard). Routes every request through the shared `httpRequest()` helper from the slim core (abort-signal composition + per-call timeouts + typed `HTTP_ERROR` come for free), calls `GET <baseUrl>/pricemulti?fsyms=<targets-or-default-15>&tsyms=<base>`, inverts upstream "1 crypto = X fiat" prices into the converter's "1 base = X crypto" convention, skips non-finite/non-positive quotes, defaults base to `"USD"`, and raises typed `CurrencyProviderError` on every failure path (`HTTP_ERROR` via `httpRequest`, `PARSE_ERROR` for invalid JSON or non-object payload, `UPSTREAM_ERROR` when the payload carries `Response: "Error"` (with `upstreamMessage` populated from `Message` or a default), `UNKNOWN_CURRENCY` when no requested symbol produces a positive quote). 15 default symbols when `options.targets` is omitted or empty (BTC, ETH, SOL, USDT, USDC, BNB, XRP, ADA, DOGE, DOT, AVAX, LINK, UNI, ATOM, LTC). 1 subpath export (`./cryptocompare/cryptocompare`), 15 tests at 100/100/100/100 coverage covering both keyless and keyed branches. Deps: `@suaveplan/currency`, `@suaveplan/currency-providers`, `@suaveplan/error`, `@suaveplan/types`, `tslib`. |
| `@suaveplan/currency-provider-coingecko` | ✅ | Universal-tier CoinGecko sibling for the `@suaveplan/currency-providers` slim core (2026-05-17). Ships `CoinGeckoProvider implements CurrencyProvider` (`name = "coingecko"`, `supportsCrypto = true`, `supportsFiat = true`) with truly-optional `apiKey` config — free public tier needs no key; supplying `apiKey` attaches the `x-cg-pro-api-key` header on every outbound request (free → Pro is a single-field config change). Routes every request through the shared `httpRequest()` helper from the slim core (abort-signal composition + per-call timeouts + typed `HTTP_ERROR` come for free), proactively gates `options.targets` against the curated `COIN_IDS` map (16 cryptos: BTC, ETH, SOL, USDT, USDC, BNB, XRP, ADA, DOGE, DOT, AVAX, MATIC, LINK, UNI, ATOM, LTC) so unknown targets reject with `UNKNOWN_CURRENCY` before any network round trip, inverts upstream "1 crypto = X fiat" prices into the converter's "1 base = X crypto" convention, and raises typed `CurrencyProviderError` on every failure path (`HTTP_ERROR` via `httpRequest`, `PARSE_ERROR` for invalid JSON, `UPSTREAM_ERROR` for wrong response shape, `UNKNOWN_CURRENCY` for unmapped targets). Also exposes `getCoinGeckoId(symbol)` for case-insensitive symbol lookup. 2 subpath exports (`./coingecko/coingecko`, `./coin-ids/coin-ids`), 23 tests at 100/100/100/100 coverage covering both keyless and Pro-key branches. Deps: `@suaveplan/currency`, `@suaveplan/currency-providers`, `@suaveplan/error`, `@suaveplan/types`, `tslib`. |
| `@suaveplan/currency-provider-open-exchange-rates` | ✅ | Universal-tier Open Exchange Rates sibling for the `@suaveplan/currency-providers` slim core (2026-05-17). Ships `OpenExchangeRatesProvider implements CurrencyProvider` (`name = "open-exchange-rates"`, `supportsFiat = true`, `supportsCrypto = false`) wrapping `/latest.json?app_id=<key>&base=<base>`. API-key (`app_id`) required — empty string raises `MISSING_CONFIG` synchronously from the constructor. Free-tier safe by default: non-USD `RateFetchOptions.base` raises `UNSUPPORTED_BASE` before any network round trip; paid plans opt in via `OpenExchangeRatesProviderConfig.allowNonUsdBase: true`. Routes through the slim-core `httpRequest()` helper so non-2xx surfaces typed `HTTP_ERROR` with `providerName` / `status`, and the caller `RateFetchOptions.signal` is forwarded. Validates the upstream `{ base, rates, timestamp }` shape — every malformed branch (non-object body, non-string `base`, non-number `timestamp`, non-object `rates`, invalid JSON, error payload missing `status` / `message`) raises typed `PARSE_ERROR`. Detects the OXR 2xx error-payload shape (`{ error: true, status, message, description? }`) and raises `UPSTREAM_ERROR` with `upstreamMessage` populated. Filters the rates map to `options.targets`; missing codes raise `UNKNOWN_CURRENCY` with the offending symbol in the message. Converts the upstream Unix-seconds timestamp to milliseconds. `apiKey` is `encodeURIComponent`-wrapped to prevent injection. 1 subpath export (`./provider/provider`), 22 tests at 100/100/100/100 coverage covering every error path including non-Error rejection from `Response.json()`. Deps: `@suaveplan/currency`, `@suaveplan/currency-providers`, `@suaveplan/error`, `@suaveplan/types`, `tslib`. |
| `@suaveplan/currency-provider-coinmarketcap` | ✅ | Universal-tier CoinMarketCap sibling for the `@suaveplan/currency-providers` slim core (2026-05-17). Ships `CoinMarketCapProvider implements CurrencyProvider` (`name = "coinmarketcap"`, `supportsCrypto = true`, `supportsFiat = false`) constructed from `ApiKeyConfig` (`apiKey`, optional `baseUrl` defaulting to `https://pro-api.coinmarketcap.com/v1`, optional injectable `FetchLike`); empty / whitespace `apiKey` raises `CurrencyProviderError(MISSING_CONFIG)` at construction time so misconfiguration surfaces synchronously instead of on first fetch. Routes every request through the shared `httpRequest()` helper from the slim core (abort-signal composition + per-call timeouts + typed `HTTP_ERROR` come for free), calls `GET <baseUrl>/cryptocurrency/quotes/latest?symbol=<csv>&convert=<base>` with the `X-CMC_PRO_API_KEY` + `Accept: application/json` headers, forwards `options.signal`, defaults `base` to `USD` and `targets` to the top-10 crypto-by-market-cap (`BTC,ETH,SOL,USDT,USDC,BNB,XRP,ADA,DOGE,DOT`), inverts each returned price (`1 / price`) into the converter's expected `1 fiat = X crypto` form, and silently drops non-finite / non-positive / wrong-base quotes before checking for empty result. Typed error mapping: `HTTP_ERROR` (non-2xx, via `httpRequest`), `PARSE_ERROR` (invalid JSON / non-object body / missing or non-object `data` field with no usable upstream signal), `UPSTREAM_ERROR` (`status.error_code` populated and non-zero, carries `upstreamMessage` when `error_message` is a string; treats `error_code === 0` as success), `UNKNOWN_CURRENCY` (no requested symbol resolved to a positive quote), `MISSING_CONFIG` (constructor); every error carries `providerName: "coinmarketcap"`. 2 subpath exports (`./coinmarketcap/coinmarketcap`), 22 tests at 100/100/100/100 coverage. Universal-tier, `sideEffects: false`. Deps: `@suaveplan/currency`, `@suaveplan/currency-providers`, `@suaveplan/error`, `@suaveplan/types`, `tslib`. |
| `@suaveplan/currency-provider-fixer` | ✅ | Universal-tier [Fixer.io](https://fixer.io/) sibling for the `@suaveplan/currency-providers` slim core (2026-05-17). Ships `FixerProvider implements CurrencyProvider` (`name = "fixer"`, `supportsFiat = true`, `supportsCrypto = false`) — API-key required (free tier restricts `base` to `EUR`, paid plans unlock arbitrary base + higher quotas; 170+ fiat currencies). Constructor takes the slim core's shared `ApiKeyConfig` and raises `CURRENCY_PROVIDER.MISSING_CONFIG` synchronously when `apiKey === ""` so a missing `process.env.FIXER_KEY` fails before burning a single request against the monthly quota. Routes every request through the shared `httpRequest()` helper from the slim core (abort-signal composition + per-call timeouts + typed `HTTP_ERROR` come for free), builds `?access_key=…&base=…[&symbols=…]` (default `base = "EUR"`, `targets` comma-joined into `symbols` when non-empty), and maps the upstream `{ success, error: { code, info } }` envelope into typed `CurrencyProviderError` codes: code `105` (`base_currency_access_restricted`, free-tier base lock) → `UNSUPPORTED_BASE`, codes `201` (`invalid_base_currency`) / `202` (`invalid_currency_codes`) → `UNKNOWN_CURRENCY`, any other `success: false` (or missing `error` field) → `UPSTREAM_ERROR` carrying the upstream `error.info` (or `"<unknown>"`) on `upstreamMessage`. Distinguishes parse failures (malformed JSON, non-object JSON, success envelope missing `base`/`rates`/`timestamp`) under a single `PARSE_ERROR` code. Forwards caller-supplied `RateFetchOptions.signal` to the underlying fetch via `httpRequest` (upstream skeleton did not). Injectable `FetchLike` from `@suaveplan/types` so tests pass a recording closure instead of `vi.mock`. No top-level side effect — `sideEffects: false` honoured; the package never registers an instance with any global registry at import time. 1 subpath export (`./fixer/fixer`), 22 tests across one file at 100/100/100/100 coverage. Deps: `@suaveplan/currency`, `@suaveplan/currency-providers`, `@suaveplan/error`, `@suaveplan/types`, `tslib`. |
| `@suaveplan/currency-provider-virtual` | ✅ | Universal-tier in-memory programmable virtual / game currency sibling for the `@suaveplan/currency-providers` slim core (2026-05-17). Ships `VirtualCurrencyProvider implements CurrencyProvider` (`name = "virtual-currency"`, `supportsCrypto = false`, `supportsFiat = false`, `supportsVirtual = true`) backed by a nested `Map<from, Map<to, number>>` rate table — zero HTTP, zero `FetchLike`, zero API key, zero `@suaveplan/money` `registerCurrency` coupling (kept `sideEffects: false` honest, unlike the upstream form). Programmable runtime API: `setRate(from, to, rate)` (upsert — replaces an existing pair without throwing), `removeRate(from, to): boolean` (idempotent, auto-cleans empty inner maps so `listCurrencies()` stays accurate, never throws), `clear()`, `hasRate(from, to)`, `getRate(from, to): number \| undefined`, `listCurrencies(): readonly string[]` (lexicographic snapshot). `fetchRates(options?)` returns the directed rates stored under `options.base` (default `defaultBase`, `"USD"`), optionally filtered by an `options.targets` inclusion list; `RateFetchResult.timestamp` is sourced from an injectable `Clock` (`@suaveplan/types`, default `() => Date.now()`) so `FakeClock`-driven tests get deterministic timestamps without monkey-patching `Date`. Triangulation is deliberately absent — the provider returns only the rates explicitly stored under the requested base; callers wire it through `CurrencyConverter` (which triangulates from its cache) when they need cross-rates. Raises `CurrencyProviderError(CURRENCY_PROVIDER.UNKNOWN_CURRENCY)` with `providerName: "virtual-currency"` when the requested base has no rates stored (table can legitimately be empty — no triangulation). Surfaces a tiny `makeUnknownCurrencyError(base)` helper + `VIRTUAL_PROVIDER_NAME` / `VIRTUAL_CURRENCY_PROVIDER_CODES` re-exports for ergonomic error construction. 2 subpath exports (`./error-codes/error-codes`, `./provider/provider`), 25 tests at 100/100/100/100 coverage. Universal-tier, `sideEffects: false`. Deps: `@suaveplan/currency`, `@suaveplan/currency-providers`, `@suaveplan/error`, `@suaveplan/types`, `tslib`. |
| `@suaveplan/currency-provider-ecb` | ✅ | Universal-tier European Central Bank sibling for the `@suaveplan/currency-providers` slim core (2026-05-17). Ships `EcbProvider implements CurrencyProvider` (`name = "ecb"`, `supportsFiat = true`, `supportsCrypto = false`) — free, no API key, consumes the ECB daily reference-rates XML feed (`https://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml`). Routes every request through the shared `httpRequest()` helper from the slim core (abort-signal composition + per-call timeouts + typed `HTTP_ERROR` come for free), parses the EUR-quoted rate table via the same zero-dep regex the upstream `@suaveplan/currency-providers` shipped pre-slim, mathematically inverts EUR rates to any caller-requested non-EUR `base` (`result.EUR = 1 / baseRate`, `result.<other> = <eurRate> / baseRate`), honours `RateFetchOptions.targets` filtering and `RateFetchOptions.signal` cancellation, and raises typed `CurrencyProviderError` on every failure path (`HTTP_ERROR` via `httpRequest`, `PARSE_ERROR` when the upstream body contains zero currency tags so an empty rate map is never silently cached, `UNSUPPORTED_BASE` when the requested non-EUR base is missing from the feed, `UNKNOWN_CURRENCY` when every requested target is absent from the resolved map). Injectable `FetchLike` from `@suaveplan/types` (`NoKeyConfig.fetch`) so tests pass a recording closure instead of `vi.mock`. 1 subpath export (`./ecb/ecb`), 16 tests at 100/100/100/100 coverage. Deps: `@suaveplan/currency`, `@suaveplan/currency-providers`, `@suaveplan/types`, `tslib`. |
| `@suaveplan/currency-providers` | ✅ | Universal-tier **slim plugin core** for `@suaveplan/currency` rate providers (slimmed 2026-05-17 from the original 9-provider bundle to a foundation-with-sibling-plugins shape matching `@suaveplan/network` and `@suaveplan/drive`). Ships `CurrencyProviderRegistry` (name-keyed `register` / `get` / `has` / `list` / `unregister`, typed `PROVIDER_NOT_REGISTERED` / `PROVIDER_ALREADY_REGISTERED` errors, sorted-snapshot `list()` for deterministic downstream tests), `defineCurrencyProvider` factory + `DefineCurrencyProviderInput` (returns an `Object.freeze`-d `CurrencyProvider` from a plain object literal), shared `httpRequest` / `composeAbortSignal` helper (used by every sibling provider — abort-signal composition via `AbortSignal.any`, `AbortSignal.timeout`-derived timeouts, non-2xx → typed `HTTP_ERROR`, returns raw `Response`), typed `CurrencyProviderError extends SuaveplanError<CurrencyProviderErrorCode>` with the 8-code `CURRENCY_PROVIDER_*` registry (`HTTP_ERROR`, `PARSE_ERROR`, `UPSTREAM_ERROR`, `UNSUPPORTED_BASE`, `MISSING_CONFIG`, `UNKNOWN_CURRENCY`, `PROVIDER_NOT_REGISTERED`, `PROVIDER_ALREADY_REGISTERED`) + optional `providerName` / `status` / `upstreamMessage` discriminants, and the four shared config types (`ApiKeyConfig`, `NoKeyConfig`, `HttpFetchOptions`, `ProviderConfigBase`) every sibling extends. Concrete providers (ECB, Fixer, Open Exchange Rates, Binance, CoinGecko, CoinMarketCap, CryptoCompare, Kraken, Virtual) ship as separate `@suaveplan/currency-provider-<name>` sibling packages (follow-up wave). 5 subpath exports, 32 tests at 100/100/100/100 coverage. Deps: `@suaveplan/currency`, `@suaveplan/error`, `@suaveplan/types`, `tslib`. |
| `@suaveplan/money` | ✅ | Universal-tier precise currency arithmetic — `bigint` minor-unit `Money` class with full arithmetic + comparison + conversion + lossless JSON round-trip, 30 ISO 4217 fiat + 5 cryptocurrency built-ins, custom and virtual currency registration, locale-aware `Intl.NumberFormat` formatting (`formatMoney`, `formatMoneyCompact`), fair allocators preserving the input total (`allocateEvenly`, `allocateByRatios`, `allocateByPercentages`), aggregators (`sumMoney`, `minMoney`, `maxMoney`), typed `MoneyError` hierarchy with stable `MONEY.*` code registry. 6 subpath exports, 90 tests at 100/100/100/100 coverage. |
| `@suaveplan/payment` | ✅ | Universal-tier payment intent lifecycle, state-machine enforcement, webhook signature verification (HMAC via `@suaveplan/crypto-hash` + constant-time compare via `@suaveplan/crypto-utils`), receipt generation, fraud scoring, refund-balance ledger, jurisdiction-aware tax calculator, retry orchestration with exponential backoff + jitter, reconciliation matcher, and PCI-conscious card tokenization. Provider-agnostic; ships Stripe + PayPal + in-memory Test adapters. Typed `PaymentError` extending `SuaveplanError<PaymentErrorCode>` with 13 codes. 16 subpath exports, 180 tests at 100/100/100/100 coverage. |
| `@suaveplan/payment-providers` | ✅ | Universal-tier **slim plugin core** for `@suaveplan/payment` provider adapters (slimmed 2026-05-17 from the original 5-adapter bundle to a foundation-with-sibling-plugins shape matching `@suaveplan/network`, `@suaveplan/drive`, and `@suaveplan/currency-providers`). Ships `ProviderRegistry` (name-keyed `register` / `get` / `has` / `list` / `unregister`, typed `PROVIDER_NOT_REGISTERED` / `PROVIDER_ALREADY_REGISTERED` errors, insertion-ordered frozen `list()` snapshot), `definePaymentProvider<TName>` factory (returns an `Object.freeze`-d literal-typed `PaymentProvider` for sibling packages that prefer a closure to a class), shared `httpRequest` + the now-public `composeAbortSignal` helper (used by every sibling for caller-signal + per-call timeout composition; JSON serialisation, string-body passthrough, typed errors, empty-body handling), typed `PaymentProviderError extends SuaveplanError<PaymentProviderErrorCode>` with the 6-code `PAYMENT_PROVIDER_*` registry (`HTTP_ERROR`, `TIMEOUT`, `PARSE_ERROR`, `OAUTH_TOKEN_FAILURE`, `PROVIDER_NOT_REGISTERED`, `PROVIDER_ALREADY_REGISTERED`) + optional `provider` / `httpStatus` / `url` / `bodyExcerpt` discriminants, and the four shared config shapes (`ApiKeyConfig`, `OAuthConfig`, `MerchantKeyConfig`, `ProviderCommonOptions`) plus the `HttpOptions` / `ProviderResponse` / `NowFn` / `RandomIdFn` / `Base64EncodeFn` / `FetchLike` injectable seams every sibling consumes. Concrete providers (Stripe, PayPal, Square, Mollie, Adyen) ship as separate `@suaveplan/payment-provider-<name>` sibling packages (follow-up wave). 5 subpath exports, 45 tests at 100/100/100/100 coverage. Deps: `@suaveplan/payment`, `@suaveplan/error`, `tslib`. |
| `@suaveplan/payment-provider-adyen` | ✅ | Universal-tier Adyen Checkout API v71 adapter — sibling provider package on the slim `@suaveplan/payment-providers` core. `AdyenProvider` implements the `PaymentProvider` contract from `@suaveplan/payment` with literal name `"adyen"`, `AdyenConfig` (alias of the shared `MerchantKeyConfig`) constructor requiring `apiKey` + `merchantAccount` and accepting optional `baseUrl` (defaults `https://checkout-test.adyen.com/v71`), `timeoutMs`, `signal`, `fetch`, `randomId`, and `webhookHmacKey`. `X-API-Key: <apiKey>` header stamped on every call (read + write); caller-supplied `idempotencyKey` forwards verbatim as the standard `Idempotency-Key` header on `createIntent` and `refund` AND as the request body's `reference` field on `createIntent`. When `idempotencyKey` is omitted on `createIntent`, the default `reference` is generated via the injectable `RandomIdFn` (falls back to `globalThis.crypto.randomUUID()` at call time when available; throws a typed `PaymentProviderError(PARSE_ERROR)` otherwise so the package stays universal-tier with no `node:crypto` import). Full lifecycle: `createIntent` → POST `/payments` (sends `merchantAccount`, `amount`, `reference`, optional `captureDelayHours: 0` for `manual` capture, `shopperStatement`, `returnUrl`, `paymentMethod.storedPaymentMethodId`, `metadata`), `confirmIntent` → POST `/payments/{id}/details`, `captureIntent` → POST `/payments/{id}/captures`, `cancelIntent` → POST `/payments/{id}/cancels`, `refund` → POST `/payments/{id}/refunds` (with optional `amount`), `getIntent` → GET `/payments/{id}`. The configured `merchantAccount` is injected into every modification body (`captures`, `cancels`, `refunds`) per Adyen's contract. Exhaustive Adyen → domain mappings: 10-row result-code status table (`Authorised` → `authorized`, `Refused`/`Error` → `failed`, `Cancelled` → `canceled`, `Pending`/`Received`/`RedirectShopper`/`IdentifyShopper`/`ChallengeShopper`/`PresentToShopper` → `pending`, unknown → `failed`), 1-row refund-status table (`received` → `pending`, else → `failed`), payment-method normalisation (`scheme` → `card`, anything else → `wallet`; brand lower-cased; `lastFour` → `last4`). Every HTTP call routes through slim-core `httpRequest`; raised `PaymentProviderError`s carry `provider: "adyen"` discriminant. 2 subpath exports (`./adyen/adyen`, `./types/adyen`), 36 tests at 100/100/100/100 coverage. Deps: `@suaveplan/payment`, `@suaveplan/payment-providers`, `tslib`. |
| `@suaveplan/payment-provider-mollie` | ✅ | Universal-tier Mollie Payments API v2 adapter — sibling provider package on the slim `@suaveplan/payment-providers` core. `MollieProvider` implements the `PaymentProvider` contract from `@suaveplan/payment` with name `"mollie"`, `ApiKeyConfig` constructor, `Authorization: Bearer <apiKey>` header auto-applied on every call, and the full lifecycle (`createIntent` → POST `/payments`, read-through `confirmIntent`/`captureIntent` for Mollie's auto-capture model, `cancelIntent` → DELETE, `refund` → POST `/payments/{id}/refunds`, `getIntent` → GET). Marshals genesis Money (`bigint` minor-units) to / from Mollie's `{ currency, value: "X.YY" }` wire shape via the exported pure helpers `formatMollieAmount` / `parseMollieAmount` (lossless round-trip via `bigint` — covered with 1-cent, exact-major, large-value, and over-precision edges). Exported total status maps (`mapMollieStatus`, `mapMollieRefundStatus`) with documented unknown-status fallback to `"failed"`. All failures surface as `PaymentProviderError` from the slim core; raw `Error` is never thrown. 2 subpath exports, 34 tests at 100/100/100/100 coverage. Deps: `@suaveplan/payment`, `@suaveplan/payment-providers`, `@suaveplan/error`, `tslib`. |
| `@suaveplan/payment-provider-paypal` | ✅ | Universal-tier PayPal Orders v2 + Payments Captures Refund adapter — sibling provider package on the slim `@suaveplan/payment-providers` core. `PayPalProvider` implements the `PaymentProvider` contract from `@suaveplan/payment` with literal name `"paypal"`, `PayPalConfig` constructor extending the shared `OAuthConfig` with `sandbox?: boolean` (flips the default base URL to `https://api-m.sandbox.paypal.com`; explicit `baseUrl` always wins) plus injectable `now: NowFn` (token-cache TTL clock) and `base64Encode: Base64EncodeFn` (Basic-header encoder; defaults to `globalThis.btoa` — runtimes without `btoa` supply their own without forking the package). OAuth2 client-credentials token cache: POST `/v1/oauth2/token` with `Authorization: Basic <base64(clientId:clientSecret)>` + `Content-Type: application/x-www-form-urlencoded` + `grant_type=client_credentials`; cached in-memory with `tokenAcquiredAt + (expires_in * 1000) - 60_000` ms TTL (60 s clock-skew buffer); reused across every method call until expiry; refreshed transparently. Token-fetch failures (non-2xx, transport error, malformed JSON) raise `PaymentProviderError(OAUTH_TOKEN_FAILURE)` with `provider: "paypal"`, the token URL on the `url` discriminant, and the underlying cause attached — raised before any subsequent Orders-v2 call is attempted. Full lifecycle: `createIntent` → POST `/v2/checkout/orders` (intent `AUTHORIZE` for `captureMethod: "manual"`, `CAPTURE` otherwise; sends `purchase_units[0].amount` + optional `description`; caller-supplied `idempotencyKey` forwards as `PayPal-Request-Id` header), `confirmIntent` → POST `/v2/checkout/orders/{id}/authorize`, `captureIntent` → POST `/v2/checkout/orders/{id}/capture` (sums every nested `purchase_units[].payments.captures[].amount.value` into `capturedAmount`), `cancelIntent` → POST `/v2/checkout/orders/{id}/void` (returns synthesised `canceled` intent whose timestamps come from `new Date(now()).toISOString()` so tests pin them deterministically), `refund` → POST `/v2/payments/captures/{paymentIntentId}/refund` (sends optional `amount` + `PayPal-Request-Id` from caller's `idempotencyKey`; empty-object body when neither is supplied), `getIntent` → GET `/v2/checkout/orders/{id}`. Exhaustive PayPal → domain mappings: 6-row order-status table (`CREATED`/`SAVED` → `created`, `APPROVED` → `authorized`, `VOIDED` → `canceled`, `COMPLETED` → `captured`, `PAYER_ACTION_REQUIRED` → `pending`, unknown → `failed`), 3-row refund-status table (`COMPLETED` → `succeeded`, `PENDING` → `pending`, else → `failed`), `MoneyLike` bigint minor-unit ↔ PayPal decimal-string major-unit marshalling (`5000n` ↔ `"50.00"`; handles PayPal's zero-decimal currencies like JPY where no `.` separator is sent). Every HTTP call routes through slim-core `httpRequest`; `Authorization: Bearer <token>` stamped on every call from the cache; raised `PaymentProviderError`s carry `provider: "paypal"` discriminant. 3 subpath exports (`.`, `./paypal/paypal`, `./paypal/mapping`), 25 tests at 100/100/100/100 coverage. Deps: `@suaveplan/payment`, `@suaveplan/payment-providers`, `@suaveplan/error`, `tslib`. |
| `@suaveplan/payment-provider-stripe` | ✅ | Universal-tier Stripe REST API adapter — sibling provider package on the slim `@suaveplan/payment-providers` core. `StripeProvider` implements the `PaymentProvider` contract from `@suaveplan/payment` with literal name `"stripe"`, `StripeConfig` (alias of the shared `ApiKeyConfig`) constructor, `Authorization: Bearer <apiKey>` on every call (read + write), and the full payment-intent + refund lifecycle (`createIntent` → POST `/payment_intents`, `confirmIntent` / `captureIntent` / `cancelIntent` → POST `/payment_intents/:id/{confirm,capture,cancel}`, `refund` → POST `/refunds`, `getIntent` → GET). Caller-supplied `idempotencyKey` forwards verbatim as the standard Stripe `Idempotency-Key` header on `createIntent` and `refund`; omitted on read calls and when the caller did not supply one. Exhaustive Stripe → domain mappings: 7-row payment-intent status table (`requires_payment_method`/`requires_confirmation` → `created`, `requires_action`/`processing` → `pending`, `requires_capture` → `authorized`, `succeeded` → `captured`, `canceled` → `canceled`, unknown → `failed`), 3-row refund-status table (`succeeded`/`pending`/else → `failed`), 4-row refund-reason table (`duplicate`/`fraudulent`/`requested_by_customer`/else → `other`, absent → `other`), payment-method normalisation (`card` → `card` with `brand`+`last4`, any other → `wallet`, absent → `undefined`). Every HTTP call flows through the slim-core `httpRequest` so caller-supplied `fetch` / `signal` / `timeoutMs` from `ProviderCommonOptions` propagate end-to-end; raised `PaymentProviderError`s carry `provider: "stripe"` discriminant. 2 subpath exports, 42 tests at 100/100/100/100 coverage. Deps: `@suaveplan/payment`, `@suaveplan/payment-providers`, `tslib`. |
| `@suaveplan/payment-provider-square` | ✅ | Universal-tier Square Payments API adapter — sibling provider package on the slim `@suaveplan/payment-providers` core. `SquareProvider` implements the `PaymentProvider` contract from `@suaveplan/payment` with literal name `"square"`, `SquareConfig` constructor extending the shared `ApiKeyConfig` with required `locationId: string` (Square multi-location support) plus optional `sandbox?: boolean` (flips the default base URL to `https://connect.squareupsandbox.com/v2`), `apiVersion?: string` (pins the `Square-Version` header — defaults to `"2024-01-18"`), and `randomId?: RandomIdFn` (deterministic idempotency-key generation; defaults to `crypto.randomUUID()` at call time). Full lifecycle: `createIntent` → POST `/payments` (sends `amount_money`, `location_id`, `autocomplete`, `idempotency_key` plus optional `customer_id`/`note`/`source_id`), `confirmIntent` → no-op delegating to `getIntent` (Square auto-confirms), `captureIntent` → POST `/payments/{id}/complete`, `cancelIntent` → POST `/payments/{id}/cancel`, `refund` → POST `/refunds` (with optional `amount_money`/`reason` and `idempotency_key`), `getIntent` → GET `/payments/{id}`. Exhaustive Square → domain mappings: 5-row payment-status table (`APPROVED` → `authorized`, `COMPLETED` → `captured`, `CANCELED` → `canceled`, `FAILED` → `failed`, `PENDING` → `pending`, unknown → `failed`) and 3-row refund-status table (`COMPLETED` → `succeeded`, `PENDING` → `pending`, anything else including `REJECTED`/`FAILED` → `failed`); payment-method normalisation lower-cases Square's upper-case `card_brand` and falls back to `"unknown"` for non-canonical brands; refund-reason maps any non-empty Square reason to `"requested_by_customer"` and empty/absent to `"other"`. `Authorization: Bearer <apiKey>` and `Square-Version: <apiVersion>` headers stamped on every request via the slim-core `httpRequest`; caller-supplied `fetch` / `signal` / `timeoutMs` from `ProviderCommonOptions` propagate end-to-end; raised `PaymentProviderError`s carry `provider: "square"` discriminant. 5 subpath exports, 37 tests at 100/100/100/100 coverage. Deps: `@suaveplan/payment`, `@suaveplan/payment-providers`, `tslib`. |
| `@suaveplan/react-bank` | – | Game banking components and hooks |
### `contacts`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/api-plugin-contacts` | – | Contacts and groups API plugin |
| `@suaveplan/contacts` | ✅ | Universal contact + n-level group management with materialised-path tree, audience resolution, dedup, CSV/JSON import-export, Zod boundaries, OTel instrumentation, typed `CONTACTS.*` error registry. |
| `@suaveplan/macos-contacts` | ✅ | macOS Contacts.app bridge via AppleScript with `Contact`↔`Person` mapping, dedup via `@suaveplan/contacts`, push/pull/sync, vCard import-export. |
### `core`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/config` | ✅ | Layered configuration management: defaults, file, object, env, CLI layers merge… |
| `@suaveplan/env` | ✅ | Type-safe environment variable loading: schema-first validation, field types, d… |
| `@suaveplan/error` | ✅ | Foundation error substrate — SuaveplanError base class, stable code registry, c… |
| `@suaveplan/schema-registry` | ✅ | Versioned schema registry with forward/backward compatibility checking for evol… |
| `@suaveplan/types` | ✅ | Types-only foundation — canonical shared interfaces (Clock, IdGenerator, Rng, M… |
| `@suaveplan/typescript-config` | ✅ | Shared TypeScript configuration presets for the Suaveplan monorepo |
| `@suaveplan/utils` | ✅ | Universal utility library: debug, object, platform, number, random, string, ema… |
### `crypto`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/api-plugin-vault` | ✅ | Per-principal encrypted vault plugin wrapping `@suaveplan/vault`. 5 routes (`GET /vault/items`, `POST /vault/items`, `GET/PATCH/DELETE /vault/items/:id`) all gated by `requireAuth()` and scoped to `c.get("user")!.id` — foreign items return `VAULT_PLUGIN_ITEM_NOT_FOUND` 404 (NOT 403, anti-enumeration). `UpdateVaultItemBodySchema` is strict mode; `maxItemSizeBytes` default 10 MiB → 413 `VAULT_PLUGIN_ITEM_TOO_LARGE`. `VAULT_OWNERSHIP_SCHEMA` (vault_item + vault_share tables + indexes) applied via injected `MigrationRunner` or `db` fallback. Default unlock extractor `headerExtractor("X-Vault-Unlock")` — never logs the password. Per-principal Vault config: `email` ← `principal.email ?? principal.id`, `secretKey` ← `principal.id` (server-known stable 2nd secret), `argon2idSalt` ← `HKDF-SHA256(serverPepper, principalId, "suaveplan-vault-plugin-argon2id-salt", 16)`. `vaultService` registered with `VaultHandle` opaque type. 9 `VAULT_PLUGIN_*` codes, every one thrown. 4 counters (`items.{created,read,updated,deleted}_total{outcome}`) + 1 histogram (`item.size_bytes`). 116 tests including real-SurrealDB-testcontainer integration: full sign-up via auth → vault CRUD roundtrip with X-Vault-Unlock + cross-user isolation + served `/openapi.json` lists 5 routes + fast-check 200-run property test on size invariant. 100/100/100/100 coverage. `dependencies: ["auth"]`. |
| `@suaveplan/crypto` | ✅ | Universal cryptographic primitives — AEAD (AES-256-GCM, ChaCha20-Poly1305, XCha… |
| `@suaveplan/crypto-bin` | ✅ | Suaveplan crypto bins: suaveplan-hash-password (Argon2id / blake2b password has… |
| `@suaveplan/crypto-browser` | ✅ | WebCrypto-backed engine implementations for @suaveplan/crypto — AES-256-GCM, Ed… |
| `@suaveplan/crypto-cipher` | ✅ | AEAD cipher primitives with per-primitive selector layout: aes-256-gcm, chacha2… |
| `@suaveplan/crypto-cli` | ✅ | Suaveplan keychain CLI — root + server identity lifecycle (init, roll, revoke,… |
| `@suaveplan/crypto-core` | ✅ | Universal cryptographic primitives (formerly @suaveplan/crypto) — AEAD (AES-256… |
| `@suaveplan/crypto-curve` | ✅ | Elliptic-curve primitives with per-primitive selector layout: secp256k1, ed2551… |
| `@suaveplan/crypto-hash` | ✅ | Pure-TypeScript hashing substrate — SHA-2 digests, HMAC, HKDF, PBKDF2, Argon2id… |
| `@suaveplan/crypto-rsa` | ✅ | RSA primitives — RFC 8017 PKCS #1 v2.2 (PKCS1v15 + PSS sign/verify, OAEP + PKCS1v15 encrypt/decrypt), RFC 5208/5958 PKCS#8, RFC 5280 SPKI, RFC 7517/7518 JWK, RFC 7468 PEM, RFC 7638 JWK Thumbprint + RFC 9278 thumbprint URI. Multi-prime keygen with NIST FIPS 186-5 Miller-Rabin (64 rounds), AbortSignal throughout, blinding (RFC 8017 §5.1.2 / Kocher 1996) wired by default into every sign/decrypt path with `{ blinding: false }` opt-out emitting a counter, hand-rolled ASN.1 reader/writer, SPKI fingerprint with hex/base64/base64url/colon-hex output, `RsaCryptoEngine` adapter (noble + WebCrypto subtle + auto-selector), `RsaKeyHandle` HSM/PKCS#11 bridge with reference `SoftwareRsaKeyHandleProvider`, FIPS 186-5 profile (modulusBits ∈ {2048,3072,4096}; e ∈ [2¹⁶+1, 2²⁵⁶-1] odd; PSS saltLength === hLen; SHA-1 banned for sign/verify), JWK `key_ops`/`use`/`alg` enforcement (RFC 7517 §4.2-4.4), Bleichenbacher-resistant combined-error decrypt, constant-time PKCS1v15 verify (Wycheproof-grade). 17-code error registry, 438 tests at 100/100/100/100 coverage. Gates `@suaveplan/x509` + `@suaveplan/jws` + `@suaveplan/webauthn`. |
| `@suaveplan/crypto-sodium` | ✅ | libsodium-backed engine implementations for @suaveplan/crypto — AEAD (XChaCha20… |
| `@suaveplan/crypto-utils` | ✅ | Shared cryptographic utilities: encoding (hex/base64/base64url/base58), byte he… |
| `@suaveplan/crypto-vault` | ✅ | Vaulted cryptographic foundation: BIP39 mnemonics, OWASP-hardened Argon2id, 2… |
| `@suaveplan/crypto-keys` | ✅ | Hierarchical keychain chain-signing: pluggable ChainHasher + ChainCodec interf… |
| `@suaveplan/cryptocurrency` | ✅ | Universal-tier crypto utilities: 15-chain address validation with EIP-55 checksumming, EIP-1559 gas estimation (bigint), async chain registry with `LoggerLike` injection + typed `UNKNOWN_CHAIN` errors, ERC-20 `TokenRegistry` + `COMMON_TOKENS`, calldata / 4-byte selector decoder, bigint-pure unit conversion across ETH / BTC / SOL, `CryptocurrencyError` hierarchy with 5-code `CRYPTOCURRENCY.*` registry. 11 subpath exports; 183 tests at 100/100/100/100 (Istanbul). |
| `@suaveplan/keys` | ➖ | Superseded: chain-signing → `@suaveplan/crypto-keys`; vault orchestration → `@suaveplan/vault`; chunked vault I/O → compose `@suaveplan/packer/chunked` + `@suaveplan/streams` + `@suaveplan/vault`. Bitpacker keychain schemas are obsolete (v1 derivation grammar replaces them). |
| `@suaveplan/react-crypto` | – | Client-side cryptography components |
### `data`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/bytes` | ✅ | Low-level byte utilities: hex/base64/utf8 encoding, Uint8Array helpers, UUID co… |
| `@suaveplan/data-masking` | ✅ | PII/sensitive data masking for objects and strings: field-level masking rules,… |
| `@suaveplan/dedup` | ✅ | Entity deduplication engine with pluggable match keys, scoring rules, Jaro-Wink… |
| `@suaveplan/diff` | ✅ | Zero-dependency RFC 6902 JSON Patch engine with structural diffing, patch appli… |
| `@suaveplan/json` | ✅ | Safe JSON parse/stringify with prototype-pollution protection, circular-ref det… |
| `@suaveplan/mime` | ✅ | Structured MIME-type detection, parsing, and registry: magic-byte sniffing, RFC… |
| `@suaveplan/packer` | ✅ | Binary packing/unpacking: whole-file (gzip + AEAD + ed25519) and chunked (locke… |
| `@suaveplan/packer-browser` | ✅ | Browser-tier runtime for `@suaveplan/packer` archives — `PackedResourceManager` (LRU + ref-count + Blob-URL bookkeeping), unit-tested Service Worker interceptor + hand-rolled SW-scope shim, `verifyArchiveSignature` (Ed25519 via `@suaveplan/crypto`), OTel metrics (`packed_resource_fetch_total`, `_cache_hits_total`, `_cache_miss_total`, `_decode_ms`), injected `Clock`/`Rng`, `AbortSignal` on every async entrypoint, `@suaveplan/retry` on the source-pull path, `@suaveplan/feature-flags` slot, 6-code error hierarchy, i18n MessageResolver catalog. Five subpath exports (`.`, `/manager`, `/service-worker`, `/utils`, `/singleton`). No React runtime dep. 153 tests at 100/100/100/100 coverage. |
| `@suaveplan/react-packer` | ✅ | React 19 companion for `@suaveplan/packer-browser` — `usePackedResource` generic hook + `usePackedImage` / `usePackedAudio` / `usePackedVideo` / `usePackedFont` variants (font hook injects `@font-face` and gates on `document.fonts.load`) + `PackedResourceProvider` React context with `MessageResolver` propagation and `@suaveplan/packer-browser/singleton` fallback. `AbortSignal` on every load (pre-aborted, mid-flight abort, abort-on-unmount, abort-on-URL-change). 3-code error hierarchy (`LOAD_FAILED`, `FONT_LOAD_FAILED`, `ABORTED`) via branded `ReactPackerError`. Seven subpath exports (`.`, `/hooks/*` × 5, `/provider`). React is a peer dep — non-React consumers of `packer-browser` pay nothing. 48 tests at 100/100/100/100 coverage. |
| `@suaveplan/pagination` | ✅ | Universal pagination primitives: cursor, offset, keyset strategies with adapter… |
| `@suaveplan/serialize` | ✅ | Round-trip-preserving structured serialization — tagged JSON, MessagePack binar… |
| `@suaveplan/templates` | ✅ | Plugin-based template engine with type-safe contexts, variable interpolation, t… |
| `@suaveplan/validation` | ✅ | Runtime schema validation with Zod-compatible API — self-contained parse engine… |
### `database`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/db` | ✅ | Universal relational database adapter interface: DatabaseAdapter (extends Datab… |
| `@suaveplan/db-sqlite` | ✅ | Universal SQLite adapter for the genesis monorepo: bun:sqlite on the Bun server… |
| `@suaveplan/migration` | ✅ | Database-agnostic migration runner with ledger tracking, dry-run, checksums, lo… |
| `@suaveplan/seed` | ✅ | Universal-tier declarative seeding & fixtures: SeedBuilder + SeedRegistry + Sed… |
| `@suaveplan/surrealdb` | ✅ | Universal SurrealDB client wrapper implementing DatabaseAdapter: connection lif… |
### `docs`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/api-docs` | – | API documentation generator |
| `@suaveplan/compress-svg` | ✅ | SVG optimisation and minification: whitespace removal, redundant attribute stri… |
| `@suaveplan/docs` | ✅ | Server-tier markdown docs toolkit: monorepo-wide discovery with `AbortSignal` + IO-error counter, typed mdast parsing (no `any`), bidirectional reference graph, orphan finder, hierarchy builder with configurable `maxDepth`, scored search with snippet context, eight `DOCS.*` codes, eight OTel instruments (4 counters + 4 histograms), Zod-validated `DiscoverOptions`, eighteen-category `DocCategory`. 95 tests, 100/100/100/100, 9 docs at 100%. |
| `@suaveplan/pdf` | ✅ | Server-tier PDF 1.4 generation toolkit (Chunks A–E): typed `PdfError` registry (13 `PDF.*` codes), Zod boundary schemas, six OTel instruments (4 counters + 2 histograms), unit + hex/RGB colour utilities, page-size + margin types, hand-rolled PDF 1.4 binary writer with FlateDecode + AbortSignal + injectable `Clock`, chainable `ContentStreamEncoder`, four document-element primitives (text/table/image/divider) with Zod validation, `StyleResolver` cascade + `DEFAULT_THEME`, block-flow `LayoutEngine` with header/footer slots, fluent `DocumentBuilder`, orchestrating `renderDocument` returning real PDF 1.4 bytes round-trippable via `pdf-parse`, and three high-level templates — `createReceiptTemplate`, `createReportTemplate`, `createInvoiceTemplate` — each Zod-validated and shipping their own pdf-parse round-trip. 395 tests, 100/100/100/100, 21 docs at 100%. |
| `@suaveplan/react-docs` | – | React components for rendering Suaveplan documentati... |
| `@suaveplan/react-pdf` | – | PDF viewer with zoom and navigation |
| `@suaveplan/react-rich-text` | – | Rich text WYSIWYG editor (Tiptap-based) |
| `@suaveplan/sitemap` | ✅ | Sitemap generation and parsing: sitemap.xml, sitemap index, image sitemaps, vid… |
### `drive`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/drive` | ✅ | Modular virtual filesystem core for the Suaveplan monorepo. File-level operatio… |
| `@suaveplan/drive-mesh` | ✅ | P2P mesh orchestrator over `drive-plugin-chunks`. `DriveMesh` class with `start`/`stop`/`requestChunk`/`advertise`/`unadvertise`/`peers`/`registry`/`tickGossip` + typed event emitter (`chunk:*`/`peer:*`/`gossip:*`). `PeerRegistry` overlay (availability bitsets per fileId, EMA latency α=0.3, score-ranked `rank(fileId, chunkId)`, session/persistent denylist). `GossipEngine` (periodic advertisement broadcast over compressed bitsets). `ParallelPuller` (top-K racing window default 250 ms, shared `AbortController`, mandatory `verifyChunkSig` gate, `maxParallelRequests` cap). `ServerFallback` (equal-jitter exponential backoff, signature verification on fallback bytes). 10-code `DriveMeshError`. Zod `DriveMeshOptionsSchema`/`ServerFallbackConfigSchema`/`AdvertisementSchema`. Consumes pluggable `DriveTransport` list (HTTPS, WebRTC) — does NOT import `network-plugin-registry` (boundary per `drive-network-integration` spec). 115 tests at 100/100/100/100 coverage; fixtures use real `ed25519` keypair + real `buildSignedChunk` from `drive-plugin-chunks` + in-memory `Broker`/`FakeDriveTransport` — no `vi.mock`/`vi.stubGlobal`. Shipped 2026-05-12 (`drive-mesh-port` archived). |
| `@suaveplan/drive-mesh-protocol` | ✅ | Wire protocol for chunk discovery, request, and delivery across the mesh. Three… |
| `@suaveplan/drive-plugin-chunks` | ✅ | Chunk-addressing plugin for @suaveplan/drive. Defines the version 0x0001 binary… |
| `@suaveplan/drive-react-sharing` | ✅ | React bindings for `@suaveplan/drive-sharing`: `useSharing` hook (live `recipients` list, async `addRecipient`/`removeRecipient`/`updatePermission`/`refresh`, AbortSignal threading, OTel counters, real `GrantManager`/`PartitionManager`/`TokenManager` — no mocks). Components: `<ShareDialog>` (modal, ESC-dismiss, focus trap, `role="dialog"`/`aria-modal`), `<PartitionBadge>` (`role="status"` + composed `aria-label`), `<FileAccessList>` (semantic `<ul>`/`<li>`, Delete/Backspace keyboard revoke). 7-code `DriveReactSharingError`. 55 tests at 100% coverage, accessibility audited (ARIA roles, keyboard nav, screen-reader text). Stories per component. Shipped 2026-05-12 (`enterprise-react-drive-sharing` archived). |
| `@suaveplan/drive-sharing` | ✅ | Partitioned drive with envelope encryption: AEAD envelope (AES-GCM/XChaCha) wi… |
| `@suaveplan/drive-template` | ✅ | Server-signed drive templates: pre-configured folder structure and per-file met… |
| `@suaveplan/drive-transport-https` | ✅ | HTTPS-relay-backed `TransportLike<MessageEnvelope>` for the drive mesh. Stateless `POST /send` + long-poll `GET /recv` with cursor-tracked at-least-once delivery, explicit `start()`/`stop()` lifecycle, equal-jitter exponential backoff on transient failures, auth-failure short-circuit exposing `lastAuthError` for credential refresh, 256-msg batch cap with yield between batches, injectable `fetchFn`/`clock`/`random`, Zod boundaries, 9 frozen `HTTPS_TRANSPORT_CODES`. 100% coverage. Shipped 2026-05-11 (`drive-transport-https-v1` archived). |
| `@suaveplan/drive-plugin-cache` | ✅ | Read-through cache middleware for `@suaveplan/drive`. `driveCachePlugin(options): DrivePlugin<DriveCacheHandle>` registers a `DriveMiddleware` that intercepts `Drive.read(path)` against a caller-supplied `AbstractCache<Uint8Array>` (memory / OPFS / file / Redis / any `cache-storage` backend). Read-through populates on miss when `shouldCache(path, bytes)` returns true (default ceiling 16 MiB matching `drive-mesh-protocol`'s `MAX_FRAME_BYTES`). Write/delete invalidate post-success; stat/list passthrough. 3-code `DRIVE_CACHE.*` registry. Cache failures swallow + counter-record (perf optimisation, not correctness boundary). AbortSignal pre-abort short-circuit. Multi-namespace isolation on a shared cache. Full OTel surface (hits/misses/populations/invalidations/errors counters, `entry_bytes` histogram, outcome-tagged spans). Universal tier. Real `Drive` + `MemoryCache`/`StorageCache` in integration tests (no mocks). |
| `@suaveplan/drive-uri` | ✅ | Drive/+mesh/+template URI plugins for `StorageUriResolver`. Three `UriPlugin` factories — `driveUriPlugin`, `driveMeshUriPlugin`, `driveTemplateUriPlugin` — wrap caller-supplied `Drive` instances in a `StorageLike` shim and plug into the existing `storage-uri` resolver. `drive+template://` plugin fetches templates via injected `templateProvider`, hydrates the drive via `Drive.hydrateFrom`, caches `(templateId → in-flight hydration)` so concurrent reads share one round-trip. 7-code `DRIVE_URI.*` registry (`INVALID_URI` / `DRIVE_ID_MISMATCH` / `TEMPLATE_NOT_AVAILABLE` / `TEMPLATE_INVALID` / `WRITE_UNSUPPORTED` / `CAPABILITY_MISSING` / `ABORTED`). Universal tier, no chunk-codec / peer-discovery / template-validation duplication — Drive handles all of that through its installed middleware. Real `Drive` + `chunksPlugin` + `storage-file` in integration tests (no mocks). |
| `@suaveplan/drive-transport-webrtc` | ✅ | WebRTC datachannel implementation of the `DriveTransport` interface. Composes `WebRTCClient` + `DataChannelManager` from `@suaveplan/drive-webrtc`. Length-prefixed binary wire framing (`[4B frameLen][1B frameType][payload]`), 3 frame types (`chunk-request` / `chunk-response` / `advertisement`), `MAX_FRAME_BYTES = 16 MiB`. `CompressionStream`/`DecompressionStream`-backed gzipped-bitset advertisement payloads with injectable `StreamCtorResolver`. AbortSignal threading, idempotent `dispose`, 7-code `DriveTransportWebRtcError` (`FRAME_INVALID`/`FRAME_TOO_LARGE`/`REQUEST_TIMEOUT`/`PEER_NOT_CONNECTED`/`DATA_CHANNEL_CLOSED`/`BITSET_COMPRESSION_FAILED`/`ABORTED`), Zod payload schemas, OTel surface (2 counters + 2 histograms). 67 tests at 100% coverage. Tests reuse `FakeRTCPeerConnection`/`FakeRTCDataChannel` from drive-webrtc — no `vi.mock`/`vi.stubGlobal`. Shipped 2026-05-12 (`drive-transport-webrtc-port` archived). |
| `@suaveplan/drive-webrtc` | ✅ | Browser-tier WebRTC P2P mesh plugin for `@suaveplan/drive`. 11 subsystems: `SignalingClient` (Zod-validated, reconnect with backoff), `WebRTCClient` (offer/answer/ICE/auto-restart, injectable RTCPeerConnection), `PeerManager` + `PeerBandwidthTracker` + 3 topology strategies (FullMesh/SuperPeer/HubAndSpoke), `DataChannelManager` (bufferedAmount throttle), `ChunkIntegrityManager` (real Ed25519 via `@suaveplan/crypto-curve` + SHA-256 hash), `ChunkDiscoveryManager` (multi-peer racing, integrity-gated fallback), `WebRTCChunkSource`, `WebRTCDrivePlugin` orchestrator, `LRUCache`, `RateLimiter`, `SubChunkSplitter`/`Reassembler`, security validators. 13-code error registry, Zod boundaries, OTel surface (counters + 3 histograms), 419 tests at 100% coverage, 11 bundle-size snapshots. Shipped 2026-05-12 (`enterprise-browser-drive-webrtc` archived). |
### `emails`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/dmarc` | ✅ | DMARC report parser — parses aggregate (RUA) and forensic (RUF) DMARC XML repor… |
| `@suaveplan/domain-normalizer` | ✅ | Normalisation, matching, and alias-canonicalisation for internet domain names |
| `@suaveplan/email-processing` | ✅ | postal-mime + libmime wrappers; parser, attachments, CID resolver, calendar, data extractor, DKIM canon/verify, DMARC, SPF, spam scorer, thread grouper, hooks pipeline |
| `@suaveplan/email-templates` | ✅ | Universal-tier React-free email template engine: VNode factories, nine reusable components, five built-in templates, typed registry, fluent builder, theme system, structured errors, OTel instruments |
| `@suaveplan/emailer` | ✅ | Email sending with plugins |
| `@suaveplan/suppression` | ✅ | Email suppression list management: in-memory store, bulk import/export (CSV/JSO… |
### `events`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/broadcast-channel` | ✅ | Cross-tab BroadcastChannel communication |
| `@suaveplan/event-sourcing` | ✅ | Event sourcing patterns: aggregate root, typed event store, snapshot support, p… |
| `@suaveplan/events` | ✅ | Typed event-bus substrate: pub/sub with deterministic FIFO, interceptor API, bo… |
| `@suaveplan/events-metrics` | ✅ | OTel metrics companion for @suaveplan/events: dispatch counters, latency histog… |
| `@suaveplan/events-otel` | ✅ | OpenTelemetry tracing companion for @suaveplan/events: wraps each dispatch in a… |
| `@suaveplan/events-schema` | ✅ | Runtime schema-validation companion for @suaveplan/events: validates event payl… |
| `@suaveplan/events-transport` | ✅ | Cross-context event bridges for @suaveplan/events: MessageChannel (at-least-onc… |
### `flow`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/cache` | ✅ | Type-safe caching abstraction: LRU/LFU/FIFO/TTL MemoryCache, NamespacedCache, C… |
| `@suaveplan/cbor` | ✅ | CBOR (RFC 8949) + RFC 8742 sequences + RFC 9052 COSE + RFC 8392 CWT + RFC 8610 CDDL (Vaulted) |
| `@suaveplan/crdt` | ✅ | Conflict-free replicated data types: G-Counter, PN-Counter, OR-Set, LWW-Registe… |
| `@suaveplan/idempotency` | ✅ | Idempotency key guard and dedup: store adapters (memory, database, redis), dist… |
| `@suaveplan/job-scheduler` | ✅ | Background job scheduling with cron |
| `@suaveplan/queue` | ✅ | Enterprise-grade queue management: memory/priority/delayed queues, concurrent w… |
| `@suaveplan/queue-distribution` | ✅ | Worker-pool distribution layer: load-balancing strategies (round-robin / least-busy / weighted), worker pool, manager with retry + health checks, in-process LocalWorker. Transport plugins ship separately. |
| `@suaveplan/queue-distribution-http` | ✅ | HTTP transport plugin: HttpWorkerCommunicator (fetch-backed, Zod-validated envelope) + RemoteWorker with @suaveplan/retry-driven connect/reconnect. |
| `@suaveplan/queue-distribution-worker-thread` | ✅ | Web-Worker / worker_threads transport plugin: WorkerThreadCommunicator (Zod envelope, bounded outstanding-request map, AbortSignal) + WorkerThreadWorker. |
| `@suaveplan/rate-limiter` | ✅ | Enterprise rate limiter: TokenBucket, SlidingWindow, FixedWindow algorithms; te… |
| `@suaveplan/retry` | ✅ | Retry strategies with exponential/linear/constant backoff, jitter, circuit brea… |
| `@suaveplan/rules` | ✅ | Rule engine + builder + 33 operators + 3 validators + serializer + optimizer + actions + events |
| `@suaveplan/rules-hono` | ✅ | Hono middleware suite for `@suaveplan/rules` — 6 factories + lazy default engine |
| `@suaveplan/streams` | ✅ | WHATWG-Streams-based primitives: backpressure-first transforms, zero-copy Uint8… |
| `@suaveplan/undo` | ✅ | Enterprise-grade undo/redo engine with branching history, async commands, histo… |
### `fonts`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/font-compress` | ✅ | BTF (Binary TypeFace) binary packing — packer-only since the 2026-05-17 split (unpacker now in `@suaveplan/font-decompress`). |
| `@suaveplan/font-convert` | ✅ | Convert TTF/OTF/WOFF/WOFF2 font files to typeface.js JSON format. Defines canon… |
| `@suaveplan/font-decompress` | ✅ | BTF binary unpacking — reverses `@suaveplan/font-compress::BinaryFontPacker` output back to typeface.js JSON for Three.js / R3F / game-font rendering. |
| `@suaveplan/font-subset` | ✅ | Font subsetting pipeline: Unicode range subsetting, WOFF2/WOFF encoding, TTF-to… |
| `@suaveplan/react-font-decompress` | – | React hooks for font loading |
### `forms`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/form-builder` | ✅ | Dynamic form schema builder with validation, conditi... |
| `@suaveplan/react-admin-forms` | – | Admin form components |
| `@suaveplan/react-calendar` | – | Calendar and date picker components |
| `@suaveplan/react-color-picker` | – | Color picker component |
| `@suaveplan/react-file-upload` | – | Drag-and-drop file upload with chunked/resumable upl... |
| `@suaveplan/react-forms` | ✅ | React form-validation surface: schema-driven `<Form>`, field bindings, validators, error reporting; 88 src files, 28 test files, all gates green. |
| `@suaveplan/react-wizard` | – | Multi-step form wizard with validation |
### `games`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/animation-events` | – | Animation event dispatching, foot contact detection, procedural modifiers |
| `@suaveplan/api-plugin-anticheat` | – | Server-side anti-cheat with speed, damage, rate, and teleport validation |
| `@suaveplan/api-plugin-game-persistence` | – | Game save/load with slots, auto-save, and size limits |
| `@suaveplan/api-plugin-game-server` | – | Game server session management with tick rate and heartbeats |
| `@suaveplan/api-plugin-matchmaking` | – | Skill-based matchmaking with queue management and gap expansion |
| `@suaveplan/behavior-tree` | – | Behavior tree engine with composite nodes, decorators, blackboard, and fluent builder |
| `@suaveplan/bone-mapping` | – | Skeleton detection, bone matching, retargeting math |
| `@suaveplan/building` | – | Player building system with snap placement, structural integrity, and blueprints |
| `@suaveplan/character-physics` | – | Engine-agnostic character controller physics (floating capsule, plugins) |
| `@suaveplan/character-vehicle-picker` | – | Character/vehicle picker schemas, catalogs, and state management with BitPacker |
| `@suaveplan/chat` | – | In-game chat with channels, whispers, rate limiting, and profanity filter |
| `@suaveplan/combat` | – | Core combat mechanics with damage types, health, armor, shields, and status effects |
| `@suaveplan/controller` | – | Controller abstractions |
| `@suaveplan/crafting` | – | Recipe-based crafting with stations, material requirements, quality tiers, and queues |
| `@suaveplan/day-night` | – | Day/night cycle with configurable time, light schedules, and gameplay modifiers |
| `@suaveplan/destructibles` | – | Destructible environment system with fracture patterns, debris, and loot |
| `@suaveplan/dialogue` | – | Branching dialogue trees with conditional choices, bark system, and conversation management |
| `@suaveplan/economy` | – | In-game economy with wallets, trading, marketplace, and auction system |
| `@suaveplan/ecs` | – | Archetype-based Entity Component System with bitset queries |
| `@suaveplan/emotes` | – | Emote/expression system with registry, cooldowns, and level-gated unlocks |
| `@suaveplan/fauna` | – | Wildlife AI with herding, predator-prey, territorial zones, and taming |
| `@suaveplan/fruit-machine` | – | Nested state-machine engine for fruit-machine / AWP games (Adders & Ladders reference) |
| `@suaveplan/game-loop` | – | Fixed-timestep game loop with tick scheduling |
| `@suaveplan/game-persistence` | – | Save/load game state with versioned migrations |
| `@suaveplan/game-server` | – | Universal game server framework with sessions, networking, matchmaking, and game queue |
| `@suaveplan/game-state-schemas` | – | Bit-level quantization schemas for multiplayer state compression |
| `@suaveplan/heightmap-tiles` | – | Delta-encoded heightmap tile pyramid with adaptive bit depth |
| `@suaveplan/hitbox` | – | Hierarchical hit detection with per-bone hitboxes, raycasting, and sweep tests |
| `@suaveplan/ik-solver` | – | Pure math inverse kinematics solvers (two-bone, look-at, multi-chain) |
| `@suaveplan/leaderboard` | – | Leaderboard system with rankings, seasonal resets, and around-player queries |
| `@suaveplan/lobby` | – | Multiplayer lobby management with matchmaking and countdown |
| `@suaveplan/mixamo` | – | Mixamo character utilities |
| `@suaveplan/npc` | – | NPC lifecycle management with spawn pools, population control, and daily schedules |
| `@suaveplan/osm-buildings` | – | OSM building/road geometry extraction and mesh generation |
| `@suaveplan/party` | – | Party/group system with invites, leadership transfer, and kick/promote |
| `@suaveplan/progression` | – | Character progression with XP curves, skill trees, perks, and achievements |
| `@suaveplan/quest` | – | Quest/mission system with multi-objective tracking, chains, rewards, and event-driven triggers |
| `@suaveplan/react-controller` | – | Game controller components |
| `@suaveplan/react-crafting` | – | Crafting UI with recipe filtering, station selection, and craft queues |
| `@suaveplan/react-dialogue` | – | Dialogue UI with typewriter effect, choices, and speaker portraits |
| `@suaveplan/react-game-hud` | – | Game HUD state for health, ammo, compass, minimap, notifications |
| `@suaveplan/react-game-map` | – | World map with viewport, markers, fog of war, and zoom controls |
| `@suaveplan/react-game-settings` | – | Game settings for graphics, audio, controls, and accessibility |
| `@suaveplan/react-social-game` | – | Social game UI with friends list, requests, blocking, and status |
| `@suaveplan/vehicle-physics` | – | Engine-agnostic vehicle physics (Pacejka tires, suspension, drivetrain) |
| `@suaveplan/weapons` | – | Weapon system with projectile ballistics, melee, recoil, ammo, and attachments |
| `@suaveplan/weather` | – | Dynamic weather simulation with transitions, zones, and gameplay effects |
### `geo`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/geo` | ✅ | Abstract geospatial geometry: ellipsoids, spherical coordinates, transforms, distance, bearing, angular separation, bounds, polygons, units, and Zod schemas |
| `@suaveplan/geo-earth` | ✅ | Earth configuration and legacy geo utilities — WGS84 constants, geocoding, geohash, coordinate parsing/formatting |
| `@suaveplan/geo-planet` | ✅ | Configurable planet surface geometry from PlanetConfig — ellipsoid, atmosphere, satellites, and orbital elements |
| `@suaveplan/solar-system` | ✅ | Solar system provider with injectable astronomy engine — body positions, seasons, equinoxes, solstices, sunrise/sunset, lunar phases |
| `@suaveplan/stars` | ✅ | Star catalog provider with in-memory sources, cone queries, magnitude filtering, and atmospheric extinction |
| `@suaveplan/tides` | ✅ | Tidal prediction providers — TICON harmonic engine, ADMIRALTY, and physics-based with multi-satellite superposition |
| `@suaveplan/universe` | ✅ | Observer model, coordinate frames, wire protocol packets, and provider registry for solar, star, tide, and weather data |
### `gtap`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/api-plugin-gtap` | – | GTAP integration plugin |
### `i18n`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/i18n` | ✅ | Slim integration core (Wave 6 modular split, archived 2026-05-09). Owns the `MessageCatalog` (typed `t<K extends DotPaths<TMessages>>`, ergonomic options bag, nested `$t()` refs), `createI18n` / `I18nInstance` plugin slot, locale negotiation/resolver, server middleware, observability state (detector + backend metrics), schemas, key utilities, post-processors (pseudo-localize, missing-key reporter), and `defaultFormatBridge` wiring the per-formatter packages into the universal-tier ICU parser. Constants / errors / parser / pluralization / interpolation / formatters / detector / backends now live in 14 sibling packages and are re-exported here via the root barrel for back-compat. Four kept subpaths (`./detector`, `./parser`, `./plugin`, `./errors`). 320 tests in the slim core, 100/100/100/100 coverage; downstream sweep 40 react-* tasks green (1238 tests in `react-ui` alone). Bundle 592 KB / 15 modules (was ~3.5 MB / ~120 modules pre-split). |
| `@suaveplan/i18n-backend-chained` | ✅ | Universal-tier chained backend orchestrator: `ChainedBackend` class + `chainedBackend` factory, capabilities matrix derived from union of children (`canRead: true`; `canSave/canTrackModification/canWatch` follow union), read-fallthrough on `BACKEND_LOCALE_NOT_AVAILABLE` with immediate propagation of `BACKEND_READ_FAILED`, write-through cache after successful read from index N to indices 0..N-1 (best-effort; per-backend save failures swallowed), `readMulti` concurrent fan-out with `first-wins` (default) or `last-wins` merge strategies (gaps filled regardless), `save` fan-out to every save-capable child surfacing failures as `BACKEND_WRITE_FAILED`, `lastModified` returns first defined timestamp, `init` forward / `dispose` reverse-order, optional `AbortSignal` on `read`/`readMulti`/`save` throwing `BACKEND_TIMEOUT` on pre-aborted signals + threaded into children, defensive `CHAINED_BACKEND_ALL_FAILED` runtime guard for empty-chain bypasses past the schema, Zod boundary validation throwing `INVALID_OPTIONS`, OTel instruments (`i18n.backend.chained.read_duration_ms{backend,locale,namespace,outcome}` histogram, `read_total{backend,outcome}` counter — `outcome ∈ hit/miss/error/cache_hit/cache_miss/primary` extending the base set with chained-cache classification, `read_errors_total{backend,code}` counter, `write_duration_ms`/`write_total{backend,outcome}`, `fallthrough_total{from_backend,to_backend}` counter for per-link fallthrough rate). Tested with shared `runBackendConformance` harness from `@suaveplan/i18n-shared/testing`. |
| `@suaveplan/i18n-backend-fs-multifile` | ✅ | **Server-tier** Node `fs/promises`-backed translation backend: `MultiFileFsBackend` class + `multiFileFsBackend` factory, 5-flag capability matrix (`canRead: true`, `canReadMulti: false`, `canSave: true`, `canTrackModification: true`, `canWatch` follows the `watch` option), three wire layouts (`nested` default reads `<root>/<locale>/<namespace>.<ext>`, `flat` reads `<root>/<locale>.<namespace>.<ext>`, `glob` substitutes `{locale}` / `{namespace}` placeholders into a caller-supplied pattern joined to root). JSON built-in encode/decode rejecting non-object payloads as `BACKEND_READ_FAILED`; YAML/YML and JSON5 auto-detected via dynamic `import()` (`yaml` / `json5` are optional peer deps, never direct deps); missing peers surface as `BACKEND_READ_FAILED` with `peer` in the error context. Optional `fs.watch` loop emits `loaded` events through `BackendInitContext.emitLoaded` for both `nested` and `flat` layouts (HMR / Suspense refresh integration). ENOENT / ENOTDIR map to `BACKEND_LOCALE_NOT_AVAILABLE` (chained-backend fallthrough); other errno codes (`EACCES`, `EBUSY`, …) map to `BACKEND_READ_FAILED`; `writeFile` failure → `BACKEND_WRITE_FAILED` with `cause` preserved; unsupported encode extension → `BACKEND_WRITE_FAILED`. Optional `AbortSignal` on `read`/`save` throws `BACKEND_TIMEOUT` on pre-aborted signals before any filesystem call. Injectable `MultiFileFsLike` shim defaulting to `node:fs/promises` via dynamic import — tests run against a real `node:fs.mkdtemp` tmpdir per CLAUDE.md "no mocks" rule. Zod boundary validation throwing `INVALID_OPTIONS` (rejects bad `layout`, empty `name`, `glob` without `globPattern`). OTel instruments (`i18n.backend.fs_multifile.read_duration_ms{backend,locale,namespace,outcome,layout}` histogram, `read_total{backend,outcome,layout}` counter, `read_errors_total{backend,code,layout}` counter, `write_duration_ms{backend,outcome,layout}` histogram, `write_total{backend,outcome,layout}` counter — `layout` 3-value low-cardinality enum). `package.json` declares `engines.node >=20`, omits `browser` field; leading `// Server-tier package` comment in `src/backend/backend.ts`; NOT re-exported from slim `@suaveplan/i18n` core (Wave 6). Tested with shared `runBackendConformance` harness from `@suaveplan/i18n-shared/testing`. |
| `@suaveplan/i18n-backend-http` | ✅ | Universal-tier `fetch`-based translation backend: `HttpBackend` class + `httpBackend` factory, read-only 5-flag capability matrix (`canRead=true`, all writes/watches false), URL templating via `{locale}`/`{namespace}` placeholders with `encodeURIComponent`, pluggable `parsePayload` (default JSON-object parser rejecting arrays/null/primitives as `BACKEND_READ_FAILED`), exported `defaultParsePayload` + `buildUrl` helpers, pluggable `customHeaders` builder, `crossDomain: true` shorthand for `credentials: "include"` + `mode: "cors"`, structurally-compatible `retry?: HttpBackendRetry` (consumes `@suaveplan/retry`'s `RetryPolicy` without a hard dep), optional `AbortSignal` on `read` throwing `BACKEND_TIMEOUT` on pre-aborted signals + threading into `RequestInit` for mid-flight cancellation (AbortError / `ABORT_ERR` code → `BACKEND_TIMEOUT`), `defaultFetch()` fallback throwing `BACKEND_READ_FAILED` when `globalThis.fetch` is unavailable, Zod boundary validation throwing `INVALID_OPTIONS`, error semantics (404 → `BACKEND_LOCALE_NOT_AVAILABLE` for chained-backend fallthrough; 5xx / network / parse → `BACKEND_READ_FAILED` chain-stopping signal), OTel instruments (`i18n.backend.http.read_duration_ms{locale,namespace,outcome}` histogram, `read_total{outcome}` counter, `read_errors_total{code,status?}` counter — `status` present on HTTP-classified errors). Tested with shared `runBackendConformance` harness from `@suaveplan/i18n-shared/testing`. |
| `@suaveplan/i18n-backend-memory` | ✅ | Universal-tier in-memory translation backend: `MemoryBackend` class + `memoryBackend` factory, full 5-flag capability matrix (`canRead/canReadMulti/canSave/canTrackModification`, `canWatch=false`), `Map<locale, Map<namespace, TranslationRecord>>` store + modification ledger, injectable `now` clock, optional `AbortSignal` on `read`/`readMulti`/`save` throwing `BACKEND_TIMEOUT`, Zod boundary validation throwing `INVALID_OPTIONS`, OTel instruments (`i18n.backend.memory.read_duration_ms`, `read_total{outcome}`, `read_errors_total{code}`, `write_duration_ms`, `write_total{outcome}`). Tested with shared `runBackendConformance` harness from `@suaveplan/i18n-shared/testing`. |
| `@suaveplan/i18n-backend-storage` | ✅ | Universal-tier `AbstractStorage`-backed translation backend: `StorageBackend` class + `storageBackend` factory, full 5-flag capability matrix (`canRead/canReadMulti/canSave/canTrackModification`, `canWatch=false`), three wire layouts (`single-key-per-namespace` default, `single-key-per-locale`, `flat-keys`), pluggable codec (default JSON via `TextEncoder`/`TextDecoder` rejecting non-object payloads as `BACKEND_READ_FAILED`), exported `defaultCodec`, optional `AbortSignal` on `read`/`readMulti`/`save` throwing `BACKEND_TIMEOUT`, Zod boundary validation throwing `INVALID_OPTIONS`, `lastModified` consults `AbstractStorage.getMetadata().modifiedAt` (max across leaves for `flat-keys`), OTel instruments (`i18n.backend.storage.read_duration_ms`, `read_total{outcome,layout}`, `read_errors_total{code,layout}`, `write_duration_ms`, `write_total{outcome,layout}` — `layout` is a 3-value low-cardinality enum). Tested via `runBackendConformance` against all three layouts. |
| `@suaveplan/i18n-detector` | ✅ | Universal-tier locale-detection chain: `createDetectorChain` orchestrator, `bcp47Negotiate` default negotiator, `getTextDirection` / `isRtl` helpers, 9 detectors (querystring, userPreference, cookie, localStorage, htmlLang, acceptLanguage, navigator, cloudflareIpGeo, fallback), `defaultDetectorChain` factory, OTel instruments (`i18n.detector.match_total{detector}`, `i18n.detector.detected_total{detector,locale}`, `i18n.detector.duration_ms`, `i18n.detector.chain.exhausted_total`, `i18n.detect` span). |
| `@suaveplan/i18n-formatter-collator` | ✅ | Universal-tier `Intl.Collator` adapter exposing locale-aware string comparison + sort helpers, plugged into `defaultFormatBridge`. |
| `@suaveplan/i18n-formatter-currency` | ✅ | Universal-tier `Intl.NumberFormat` currency adapter. Currency-code-aware formatting with sign display + accounting modes, plugged into `defaultFormatBridge`. |
| `@suaveplan/i18n-formatter-date` | ✅ | Universal-tier `Intl.DateTimeFormat` adapter. Date / time / datetime formatting with caller-supplied options and cache, plugged into `defaultFormatBridge`. |
| `@suaveplan/i18n-formatter-display-name` | ✅ | Universal-tier `Intl.DisplayNames` adapter for language / region / script / currency name lookup, plugged into `defaultFormatBridge`. |
| `@suaveplan/i18n-formatter-list` | ✅ | Universal-tier `Intl.ListFormat` adapter. Conjunction / disjunction / unit list formatting plugged into `defaultFormatBridge`. |
| `@suaveplan/i18n-formatter-number` | ✅ | Universal-tier `Intl.NumberFormat` adapter for the i18n family. Locale-aware decimal / percent / scientific / compact formatting with caching, plugged into `defaultFormatBridge` by `@suaveplan/i18n`. |
| `@suaveplan/i18n-formatter-relative-time` | ✅ | Universal-tier `Intl.RelativeTimeFormat` adapter. Locale-aware relative-time strings ("3 days ago", "in 2 hours"), plugged into `defaultFormatBridge`. |
| `@suaveplan/i18n-formatter-segmenter` | ✅ | Universal-tier `Intl.Segmenter` adapter exposing grapheme / word / sentence iteration, plugged into `defaultFormatBridge`. |
| `@suaveplan/i18n-icu-parser` | ✅ | Universal-tier ICU MessageFormat parser carved out of the i18n core (Wave 6). Tokenizer + AST builder for ICU syntax (plural, select, selectordinal, number/date/time formatters, nested placeholders), pluralization helpers, interpolation engine, integrates with the per-formatter packages via the `defaultFormatBridge`. |
| `@suaveplan/i18n-shared` | ✅ | Shared runtime atoms for the i18n family — locale constants, BCP-47 normalisation map, RTL set, locale descriptors, interpolation defaults, the `I18N_CODES` registry, the `I18nError` base class, AND (Wave 5a) the `runBackendConformance(...)` shared harness under the `/testing` subpath consumed by every `@suaveplan/i18n-backend-*` package. |
| `@suaveplan/locale-data` | ✅ | Static ISO 3166-1 country data and ISO 639-1 language data with typed lookup fu… |
| `@suaveplan/react-i18n` | ✅ | React bindings for `@suaveplan/i18n`: `<TranslationProvider>`, 14 hooks (incl. `useFormatter`, `useLocaleAdapter`), 4 components, `withTranslation` HOC, 9-detector chain + `useLocaleDetection`, branded `TranslationKey` typing, `tDynamic`, `REACT_I18N_CODES` (12 codes), OTel telemetry. Plugin substrate `createReactI18nRegistry` + `<RegistryProvider>`: four plugin kinds (detector / formatter / post-processor / locale-adapter) with idempotent registration, schema validation, disposable lifecycle. Six built-in formatter plugins auto-register; detector chain accepts plugin splice by priority; post-processor pipeline runs in `<Trans>` after ICU. 408 tests, 100% coverage, 1238-test downstream sweep green. Plugin substrate shipped 2026-05-10 (`react-i18n-plugin-registry-and-ui-primitives` archived). |
### `image`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/caddy-imgproxy` | ✅ | Universal-tier TypeScript port of the Caddy imgproxy URL rewriter — compact-grammar parser, aspect / pixel dimension resolver, gravity + operation translator, HMAC-SHA256 URL signer, full handler with Zod-validated config and OTel telemetry. |
| `@suaveplan/compress-image` | ✅ | Runtime-agnostic image compression utilities: resize, quality reduction, format… |
| `@suaveplan/emblem-solver` | ✅ | Minimal-rectangle SVG converter for pixelated sprite... |
| `@suaveplan/exif` | ✅ | Dependency-free, runtime-agnostic EXIF/XMP/IPTC metadata reader, writer, and st… |
| `@suaveplan/image` | ✅ | Universal-tier image metadata extraction, format detection, resize math, crop validation, and transform pipeline planning. |
| `@suaveplan/colours` | ✅ | Universal-tier colour manipulation: parsing, conversion, analysis, mixing, blending, and palette generation. |
| `@suaveplan/colour-convert-hsluv` | ✅ | HSLuv perceptually uniform colour space with gamut mapping and uniform harmonies. |
| `@suaveplan/colour-convert-cieluv` | ✅ | CIELUV, xyY, LMS cone response, and Bradford chromatic adaptation with CIE standard illuminants. |
| `@suaveplan/colour-filter-cmc` | ✅ | CMC l:c Delta-E colour difference metric for textile and print quality control. |
| `@suaveplan/colour-filter-cct` | ✅ | Correlated Colour Temperature (CCT) calculation and approximation from RGB. |
| `@suaveplan/image-quantisation` | ✅ | Image complexity analysis and adaptive colour quantisation with pool detection, spatial-aware AA cleanup, and multiple quantisation algorithms. |
| `@suaveplan/react-image` | – | Image components with lazy loading |
### `logistics`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/api-plugin-customs` | – | Cross-border customs — declarations, HS codes, borde... |
| `@suaveplan/api-plugin-logistics` | – | Enterprise logistics — shipments, carriers, pallets,... |
| `@suaveplan/api-plugin-port-tracking` | – | Port tracking — vessel positions, port calls, shippi... |
| `@suaveplan/api-plugin-procurement` | – | Procurement — purchase orders, goods receipt notes, ... |
| `@suaveplan/api-plugin-warehouse-ops` | – | Warehouse operations — pick/pack/ship, cycle counts,... |
| `@suaveplan/delivery-tracking` | ✅ | Channel-agnostic delivery event tracking |
| `@suaveplan/ports` | ✅ | Universal-tier global port database with shipping-lane routing and ETA estimation. Curated `Port` registry (~100 sea ports across 5 regions + ~30 cargo airports + ~30 rail freight terminals), UN/LOCODE lookups (`findPort` / `findPortStrict`), country / type / name filters, proximity search (`findNearestPort`, `findPortsInRadius`) via a 5°-bucketed `PortSpatialIndex`, curated `shippingLanes` waypoint graph, lane distance via `@suaveplan/geo` great-circle (`estimateLaneDistance`, `cumulativeDistances`), lane projection (`findPositionOnLane`), ETA estimation (`estimateETA`) with injectable `Clock` and three-tier confidence band. Eight `PORTS.*` error codes + 8 typed `PortsError` subclasses, Zod schemas for every public type, 3 OTel counters + 3 histograms, 99 tests at 100/100/100/100 coverage. Deps: `@suaveplan/error`, `@suaveplan/geo`, `@suaveplan/types`, `@opentelemetry/api`, `zod`. |
| `@suaveplan/react-port-tracking` | – | Port tracking components and hooks |
### `messaging`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/api-plugin-messaging` | – | Messaging plugin |
| `@suaveplan/api-plugin-notifications` | ✅ | Notifications plugin |
| `@suaveplan/discord-client` | ✅ | Generic Discord API client for webhooks, bot messaging, and embeds. 62 tests, 100% coverage. Shipped parallel session. |
| `@suaveplan/imessage-adapter` | ✅ | macOS iMessage SQLite chat.db watcher + `MessageSourceAdapter` projection. Zod-validated config boundary, AbortSignal-aware polling, monotonic `lastRowId` cursor (settable + readable for resume), injectable `SqliteReader` (production `bunSqliteReader` via lazy `createRequire(import.meta.url)("bun:sqlite")`, tests via real chat.db fixture — no mocks), typed `EventBus<IMessageWatcherEvents>` surface beside legacy `on/off`, 10 `IMESSAGE.*` codes (`DB_OPEN_FAILED`, `DB_QUERY_FAILED`, `WATCHER_NOT_RUNNING`, `WATCHER_ALREADY_RUNNING`, `ADAPTER_NOT_INITIALIZED`, `INVALID_CONFIG`, `POLL_ABORTED`, `POLL_FAILED`, `ATTACHMENT_PARSE_FAILED`, `APPLE_DATE_PARSE_FAILED`), 4 OTel instruments (`messages_emitted_total{chat_type,from_me}`, `attachments_emitted_total{mime_family}`, `poll_errors_total{code}`, `poll_duration_ms{outcome}`). 89 tests, 100% line coverage on every package file. |
| `@suaveplan/react-notifications` | – | Toast/notification system |
| `@suaveplan/slack-client` | ✅ | Generic Slack API client for messaging, channels, and webhooks |
| `@suaveplan/sms` | ✅ | SMS send/receive, delivery status tracking, template... |
| `@suaveplan/sms-providers` | ✅ | Universal-tier SMS provider implementations for `@suaveplan/sms`: Twilio (HTTP Basic + form + X-Twilio-Signature HMAC-SHA1), Vonage (form auth + HMAC-SHA256), MessageBird (AccessKey + JWT HS256 with iat/exp/nbf window), Plivo (Basic + X-Plivo-Signature-V3 HMAC-SHA256), AWS SNS (inline SigV4 + RSA-SHA1 SNS verifier with injectable callback). `ProviderRegistry`, `httpRequest` over injectable `FetchLike`, `composeAbortSignal`, `defineCodes("SMS_PROVIDERS", [8])` + `SmsProvidersError`, per-provider `mapStatus`/`parseInbound`/`verifyWebhookSignature`, `parseOptOutKeyword` (CTIA/TCPA STOP/UNSTOP/HELP), five OTel instruments. 236 tests inc. real `node:http` round-trip per provider + real `node:crypto` HMAC + RFC 4231/2202 test vectors + RFC SHA-256 fixtures + targeted branch-coverage suites for conditional-spread arms and default-config paths. 100/100/100/100 across statements/branches/functions/lines. |
| `@suaveplan/telegram-client` | ✅ | Generic Telegram Bot API client for messaging, groups, and media |
### `monitor`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/audit-logging` | ✅ | Tamper-proof, GDPR-compliant audit logging: cryptographic chain-integrity, plug… |
| `@suaveplan/logger` | ✅ | Foundation logging package — structured JSON output, level filtering, redaction… |
| `@suaveplan/opentelemetry` | ✅ | OpenTelemetry SDK setup and configuration helpers: tracer/meter/logger provider… |
### `network`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/network` | ✅ | Core network interfaces: NetworkNode, NetworkPlugin, NetworkBus, MessageEnvelop… |
| `@suaveplan/network-bootstrap` | ✅ | Pluggable peer-discovery chain + TTL peer cache + `BootstrapPlugin`/`BootstrapMiddleware`; injectable `Clock`, `@suaveplan/retry` backoff+jitter, NetworkBus events, opt-in `PeerCacheStorageLike`, NET_BOOTSTRAP error registry, Zod boundaries, OTel surface (span + 2 counters + duration histogram), AbortSignal everywhere. 67 tests, 100/100/100/100. |
| `@suaveplan/network-discovery-crdt` | ✅ | Browser-tier CRDT-awareness `DiscoveryStrategy` for `@suaveplan/network-bootstrap`. Construction-time provider selection (Yjs OR Automerge) via single `CRDTProviderAdapter` — no runtime swap. Injectable `yjsDocFactory` / `automergeRepoFactory`; `signaling` URL list REQUIRED (no `wss://signaling.yjs.dev` default). 7-code `NET_DISC_CRDT` registry, Zod boundaries, OTel surface (start span + per-provider sync span + counter + histogram), AbortSignal everywhere. 92 tests (16 Yjs + 13 Automerge + 32 orchestrator + property suite), 100/100/100/100; FakeYjsBroker/FakeAutomergeBroker real impls — no mocks. |
| `@suaveplan/network-discovery-gundb` | ✅ | Browser-tier GunDB gossip `DiscoveryStrategy` with **enterprise security uplift over upstream's flagged-fragile audit**: mandatory `peers` list, Ed25519-signed peer-announces (unsigned/tampered silently dropped), Zod wire validation, constant-time peer-ID compare. **+ ships `Transport` + `NetworkPlugin` via `./transport` + `./plugin` subpaths** (Wave 3.5 fold) — every `transport.send()` flows through `signEnvelope`; every inbound payload gated by Zod parse → verify → senderPeerId match → recipient match BEFORE caller handler. Same `gundb.invalid_messages_total` + `gundb.signature_rejected_total` counters cover transport tier. 11-code `NET_DISC_GUNDB` registry (8 discovery + 3 transport). 114 tests (67 discovery + 47 transport/signing/plugin), 100/100/100/100. |
| `@suaveplan/network-discovery-hybrid` | ✅ | Browser-tier multi-strategy `DiscoveryStrategy` orchestrator over the five Wave-2 siblings (peerjs/crdt/trystero/webtorrent/gundb), all declared as optional peer-deps with graceful degradation via `STRATEGY_LOAD_FAILED`. Five-module composer: `HybridDiscoveryManager` + `StrategyManager` (health/priority) + `Lifecycle` (start/stop FSM) + `PeerTracker` (deduped peer set with `PeerSource` provenance) + `StrategyLoader` (dynamic `import()`-based lazy resolution). **Banned-mock removal**: upstream `__mocks__/strategy-mock.ts` explicitly dropped; in-package `TestStrategy` deterministic real fixture under `tests/setup/`. Zero `vi.mock`/`jest.mock`/`__mocks__/`/`: any` anywhere. 6-code `NET_DISC_HYBRID` registry, Zod boundaries, OTel surface incl. `hybrid.fallback_total{from,to}` + `hybrid.active_strategies` gauge. 89 tests across 7 files (4 integration), 100/100/100/100. |
| `@suaveplan/network-discovery-peerjs` | ✅ | Browser-tier PeerJS `DiscoveryStrategy` for `@suaveplan/network-bootstrap`. Mandatory `host` + injectable `peerFactory` (no public-`peerjs.com` fallback). **+ ships `Transport` + `NetworkPlugin` via `./transport` + `./plugin` subpaths** (Wave 3.2 fold) — lazy peer init, per-peer `DataConnectionLike` registry over wire frame `{kind: "suaveplan.transport.v1", envelope}` that discovery's Zod schema rejects so transport + discovery share one PeerJS unit cleanly. 10-code `NET_DISC_PEERJS` registry (5 discovery + 5 transport), OTel adds `peerjs_transport.*` instruments. 145 tests (101 discovery + 44 transport/plugin/otel), 100/100/100/100. |
| `@suaveplan/network-discovery-trystero` | ✅ | Browser-tier Trystero `DiscoveryStrategy` with 4 transports (BitTorrent / Nostr / MQTT / IPFS) behind single `TrysteroTransportAdapter` interface. Mandatory non-empty relay lists; auto-fallback via `@suaveplan/retry`. **+ ships `Transport` + `NetworkPlugin` via `./transport` + `./plugin` subpaths** (Wave 3.3 fold) — `TrysteroNodeTransport` (renamed to avoid string-union collision) over `"envelope"` action namespace, factory resolution for all 4 transport kinds, room-leave auto-prune. 14-code `NET_DISC_TRYSTERO` registry (10 discovery + 4 transport). 150 tests (118 discovery + 32 transport/plugin), 100/100/100/100. |
| `@suaveplan/network-discovery-webtorrent` | ✅ | Browser-tier WebTorrent-tracker `DiscoveryStrategy` via `p2pt` for `@suaveplan/network-bootstrap`. Mandatory `.min(1)` tracker list (no public-tracker fallback survives). Injectable `p2ptFactory` + `FakeP2PT` real impl (no mocks). **+ ships `Transport` + `NetworkPlugin` via `./transport` + `./plugin` subpaths** (Wave 3.4 fold) — per-peer registry, lazy p2pt instantiation, AbortSignal-aware, 30 s default `CONNECT_TIMEOUT`. 13-code `NET_DISC_WEBTORRENT` registry (5 discovery + 8 transport), OTel adds `webtorrent_transport.*` instruments. 96 tests (46 discovery + 50 transport/plugin/otel), 100/100/100/100. |
| `@suaveplan/network-gundb-server` | ✅ | Server-tier (Node-only) GunDB relay daemon paired with `@suaveplan/network-discovery-gundb` ✅ clients. Idempotent `start({signal?})` / `stop()` lifecycle; injectable `gunFactory` + `FakeGun` real impl (no mocks). Inline `/health` `/ready` `/live` JSON endpoints. Honours client's wire-format security model: Zod-validates inbound announces against shared `GunDBPeerAnnounceSchema` (single source of truth) and silently drops malformed/wrong-kind/missing-sig/missing-key with `gundb_server.invalid_messages_total{reason}`. Signature verification deliberately at client (gossip-security model). Real-server-boot integration test on port 0. 6-code `NET_GUNDB_SERVER` registry, OTel surface. 56 tests, 100/100/100/100. |
| `@suaveplan/network-libp2p-server` | ✅ | Server-tier libp2p bootstrap + circuit-relay-v2 daemon paired with `@suaveplan/network-transport-libp2p` ✅ clients. Idempotent `start({signal?}) → {peerId, multiaddrs[]}` / `stop()` lifecycle; required injectable `libp2pFactory` (no native deps on test surface). Inline `/health`/`/ready`/`/live` HTTP probes. TCP + WebSockets listen, Noise + Yamux + Identify + Bootstrap, autoRelay enabled. 6-code `NET_LIBP2P_SERVER` registry, OTel (span + 3 counters + gauge + histogram). All discipline metrics clean — 299 LOC max source, 384 LOC max test, zero `:any`/mocks/React. 4-scenario in-process integration (health probes + client dial + 2-client autoRelay stream + graceful stop). 59 tests, 100/100/100/100. |
| `@suaveplan/network-plugin-assignment` | ✅ | Mesh auto-placement: MeshCapacityTracker (live peer-event consumption), AssignmentEngine (weighted multi-criteria scoring across latency/capacity/load/region/tier-fit), MeshBalancer (rebalance planning), AdmissionController (policy-gated admission). |
| `@suaveplan/network-plugin-audit-mesh` | ✅ | Signed append-only audit logs across the mesh: hash-chained event records, host-signed entries, cross-host replication for durability, server reconciliation on reconnection, compaction and conflict resolution. |
| `@suaveplan/network-plugin-auth` | ✅ | Mesh membership auth + capability tokens: MeshMembershipVerifier (join authorization via auth provider), CapabilityTokenIssuer (tier-bound Ed25519-signed tokens), CrossMeshTrustValidator (relay trust relations). |
| `@suaveplan/network-plugin-circuit-breaker` | ✅ | Mesh-boundary circuit breaking: per-path MeshCircuitBreaker FSM (CLOSED→OPEN→HALF_OPEN), fleet-wide registry, half-open probe with bounded test traffic, relay-integration middleware. |
| `@suaveplan/network-plugin-content-delivery` | ✅ | P2P file-chunk distribution over the mesh: chunk redundancy planner, integrity verifier, latency-aware routing, plugin wrapper bridging `@suaveplan/drive` chunks across WebRTC peers. (Sub-changes for packer/prefetch/store/throttle remain open.) |
| `@suaveplan/network-plugin-crypto-messages` | ✅ | Cryptographic message integrity: per-message Ed25519 signing/verify, peer identity verification via challenge-response, server-signed session/mesh tokens, key rotation, hash-chained log integrity. |
| `@suaveplan/network-plugin-devtools` | ✅ | Developer-tools plugin: NetworkVisualizer (hierarchy/flow/heat IR + injectable Renderer + bundled SVG renderer), StateInspector (per-path ring + RFC-6902 diff via @suaveplan/diff + scrubber + composable search), SimulationConfigTool (programmatic peer/link/condition/event editor with deterministic recording, atMs-grouped playback, Zod-validated JSON round-trip), PerformanceProfiler (p50/p95/p99 latency distributions + throughput + plugin overhead + memory tracking + named baselines + Z-score regression detection + categorised optimisation suggestions), and DevToolsPlugin facade with tier gate and `requireActive()` PLUGIN_DEV_DISABLED guard. 111 tests, 100/100/100/100 coverage, OTel counters across every subsystem. |
| `@suaveplan/network-plugin-failover` | ✅ | Mesh failover orchestration: HeartbeatManager, HealthMonitor (alive→suspect→dead), debounced PromoterManager, FailoverCoordinator failure-transition, FailoverPlugin wrapper. |
| `@suaveplan/network-plugin-governance` | ✅ | Host elections + reputation: ElectionEngine (metric/direct/hybrid modes), CandidateScorer (weighted multi-criteria), ReputationTracker, VotingManager, TransitionManager handover FSM, GovernancePlugin wrapper. |
| `@suaveplan/network-plugin-intra-relay` | ✅ | Intra-mesh relay routing: connection manager, peer discovery, envelope encoding, loop guard, relay monitor, peer selector, plugin wrapper. (Security extension proposal still open.) |
| `@suaveplan/network-plugin-middleware` | ✅ | Pluggable middleware pipeline for the network bus: 12 modules covering throttling, validation, observability, error handling, transformation, and lifecycle hooks; 85 conformance tests. |
| `@suaveplan/network-plugin-migration` | ✅ | Peer state migration between meshes: MigrationCoordinator (initiate→pack→transfer→drain), StateTransferProtocol (snapshot serialize/deserialize), ForwardingTunnel (buffer + drain). Adapters intentionally deferred to dedicated `migration-adapter-*` packages. |
| `@suaveplan/network-plugin-monitor` | ✅ | Network health + telemetry monitoring: peer-quality scorers, RTT/loss collectors, alert thresholds, OTel histogram + counter wiring. **+ Wave 6.1 fold of `@suaveplan/network-observability`** — universal-tier Prometheus exposition emitter (hand-rolled `0.0.4` text format from `MetricCollector.scrape()`, sanitised metric/label names + escaped label values, counter/gauge/histogram/summary support with configurable quantiles, optional timestamps, pinned `Content-Type`; no `prom-client` dep) and Grafana dashboard JSON generator (auto-layout, injectable `Rng` for deterministic UIDs, Zod-validated panel options, pinned Prometheus datasource binding, `schemaVersion: 38`). **+ Wave 6.2 fold of `@suaveplan/network-quality`** — universal-tier quality-class classification + adaptive degradation: `BandwidthMonitor` (single-pole EMA over bandwidth/RTT/loss, bounded ring buffer with configurable `maxSamples` + `smoothingFactor` validation, injectable `clock`, listener subscription returning unsubscribe fn), `DegradationManager` (4-rung ladder `MINIMAL=0 < LOW=1 < MEDIUM=2 < HIGH=3` with one-step transitions, candidate-must-persist `hysteresisMs` debounce — `0` commits same-call — over windowed averages, `forceLevel`/`reset` overrides with `"forced"`/`"reset"`/`"conditions-changed"` change-reasons, injectable `clock`), `createQualityMiddleware<M>(dm, options?)` (outgoing-message gate with per-`source` counters, HIGH/MEDIUM/LOW/MINIMAL drop policies, customisable critical-type allowlist + position-update set, identity-preserving pass-or-`null`-drop API), full `QualityLevel`/`BandwidthSample`/`QualityThresholds`/`LevelThreshold`/`QualityChangeEvent` Zod-validated types. 166 tests, 100/100/100/100. |
| `@suaveplan/network-plugin-partition` | ✅ | Split-brain detection + healing: PartitionDetector (peer reachability matrix), QuorumResolver (majority/weighted quorum policies), MergeProtocol (post-partition reconciliation). |
| `@suaveplan/network-plugin-protocol` | ✅ | Network protocol plugin: 13-byte binary header, message encoder/decoder, pipeli… |
| `@suaveplan/network-plugin-qos` | ✅ | Per-mesh QoS: BandwidthQuotaEnforcer, MessagePriorityClassifier, CongestionMonitor, qosRouter prioritising control-plane traffic over bulk. |
| `@suaveplan/network-plugin-registry` | ✅ | Fixed-capacity peer registry with bitpacker-based binary message encoding |
| `@suaveplan/network-plugin-relay` | ✅ | Cross-mesh federation: RelayRouter, HostBackboneTransport, CrossMeshEnvelope, MeshDirectory, LoopGuard, RelayManager wiring. |
| `@suaveplan/network-plugin-server-bridge` | ✅ | Tier-0 host ↔ central-server bridge: ServerGateway (transport-agnostic, 2× heartbeat disconnect detection), GracefulDegradationFsm (online → degrading → offline → recovering → online), OfflineModeCoordinator (autonomous mode + token-grace extension), LogBuffer (circular signed-log replay queue with hash-dedup), ReconciliationProtocol (server-watermark differential with LWW conflict resolution), CommandDispatcher (Ed25519 + nonce-replay protection), HeartbeatMultiplexer (Tier-0 batch forwarding), four hosting-model coordinators (PURE_CLIENT Byzantine quorum, SERVER_BASED, SERVER_TO_CLIENT_FAILOVER, CLIENT_WITH_SERVER_BACKUP), and ServerBridgePlugin facade with tier gate. 156 tests, 100/100/100/100 coverage. |
| `@suaveplan/network-plugin-session` | ✅ | Hierarchical session management: SessionTree, SessionManager, SessionRouter, per-session host election, transition FSM, parent-state bridge, capacity enforcer, mesh-wide registry, and SessionPlugin wrapper. |
| `@suaveplan/network-plugin-simulation` | ✅ | Mesh simulation harness: latency/loss/jitter injection, deterministic clock + RNG, scripted peer scenarios for failover/governance/partition tests across 11 modules. |
| `@suaveplan/network-plugin-state` | ✅ | Mesh-state coordination: shared key-value state with vector-clock conflict resolution, snapshot + delta sync, persistent backing, observable state subscriptions across 14 modules. |
| `@suaveplan/network-plugin-topology` | ✅ | Mesh topology plugin: tiered hierarchy (Tier 0 Host → Tier 1 SubHost → Tier 2 Leaf), latency-grouped neighbours, group manager, plugin wrapper. |
| `@suaveplan/network-plugin-transport-manager` | ✅ | Multi-transport orchestration: pool registry, capability negotiation, 5-tier priority routing (CRITICAL/HIGH/NORMAL/LOW/BULK) with redundant CRITICAL delivery, round-robin balancing, health monitor with auto-pause/resume, EMA quality-trend analyzer + pre-emptive selector with smooth handoff, session persistence buffer, prioritized connection recovery, continuity guard, battery-aware scheduler, bandwidth conservator. |
| `@suaveplan/network-testing` | ✅ | Network testing utilities |
| `@suaveplan/network-transport-hyperswarm` | ✅ | Server-tier (Node-only) `Transport` + `NetworkPlugin` over Hyperswarm DHT. Required injectable `hyperswarmFactory` (never imports `hyperswarm` directly — keeps native deps off the unit-test surface). Per-peer connection registry, hole-punched DHT discovery, Ed25519-signed peer announces with Zod wire-payload validation + defensive drop. Reputation store with monotonicity property test. `@suaveplan/serialize` length-prefix wire format. 10-code `NET_HYPERSWARM` registry, OTel (2 counters + 2 histograms + active-peers gauge), AbortSignal everywhere. 3-peer in-process integration test (`FakeSwarmHub`) green; all-to-all envelope exchange + disconnect propagation verified. 94 tests effectively 100% net-new (upstream was 8.98%). 100/100/100/100. |
| `@suaveplan/network-transport-libp2p` | ✅ | Universal-tier `Transport` + `NetworkPlugin` over the libp2p stack (websockets + webrtc sub-transports; tcp/mdns deferred to a future server-tier sibling). Required injectable `libp2pFactory` — package never imports `libp2p` at module-eval (keeps 12 subpackage native deps off the unit-test surface). **Mandatory `bootstrap` list** — no public-bootstrap fallback survives. 11-code `NET_LIBP2P` registry, OTel (3 counters + 2 histograms + active-peers gauge), AbortSignal everywhere. 9-module architecture, every file ≤300 LOC (max 290), every test file ≤500 LOC. **Zero React imports / `:any` / mocks** in the package. 2-peer integration tests for both websockets and webrtc sub-transports via `FakeLibp2pHub`. 749-LOC upstream demo extracted to Wave 7 (`react-network-libp2p-demo`). 74 tests, 100/100/100/100. |
| `@suaveplan/network-transport-standby` | ✅ | Pre-emptive WebRTC standby pool implementing `Transport`+`NetworkPlugin` from `@suaveplan/network`. Min/max slot pool + EMA health scoring (RTT/jitter/loss) + auto-reconnect FSM via `@suaveplan/retry` exponential backoff + equal jitter. Warm-up via `@suaveplan/timing` Scheduler + injectable `Clock`. Injectable `RtcConnectionFactory` + `FakeRtcConnection` real impl (no mocks). 6-code `NET_STANDBY` registry, Zod cross-field invariants, OTel (gauge + 2 counters + histogram). 102 tests; warm-to-active < 100 ms integration test green. fast-check verifies `warmCount + activeCount ≤ maxSlots`, eviction monotonicity, promotion atomicity, health bounds. (Renamed from upstream `network-standby-transport` per network-transport-family proposal.) 100/100/100/100. |
| `@suaveplan/network-transport-webrtc` | ✅ | WebRTC transport plugin for mesh networking: RTCPeerConnection data-channel tra… |
| `@suaveplan/network-transport-websockets` | ✅ | WebSocket `Transport` + `NetworkPlugin` per `@suaveplan/network` contract on top of existing `WebSocketClient` (typed framing, heartbeat, backpressure queue, injectable adapter). Per-peer registry with duplicate-id rejection, `AbortSignal` on connect, fan-in `onMessage`, idempotent close. Extended `defineCodes("NET_WS", [...])` with `PEER_ALREADY_CONNECTED`/`PEER_UNKNOWN`/`TRANSPORT_CLOSED`/`MAX_PEERS_EXCEEDED`. OTel spans + counters + active-peers gauge. 88 tests (60 baseline + 28 new conformance/edge), 100% coverage. |
| `@suaveplan/network-trystero-server` | ✅ | Server-tier Trystero signaling daemon paired with `@suaveplan/network-discovery-trystero` ✅ clients. Construction-time `mode: "mqtt"\|"nostr"` via single `BrokerLike` adapter (no runtime branching). Required injectable `mqttBrokerFactory`/`nostrRelayFactory` — production passes real WS broker shims, tests bind `FakeBroker` real impl. Idempotent `start({signal?})/stop()` lifecycle, inline `/health`/`/ready`/`/live`. 6-code `NET_TRYSTERO_SERVER` registry, OTel mode-labelled (span + 2 counters + gauge + histogram). Both modes integration-tested end-to-end (boot → health → published relayUrl round-trip → 2-client connect/frame/disconnect). 298 LOC max source, 413 LOC max test, zero `:any`/mocks. Concrete production broker shims deferred to future `network-trystero-server-broker-{mqtt,nostr}`. 69 tests, 100/100/100/100. |
| `@suaveplan/react-network-libp2p-demo` | ✅ | **Net-new** React demo for `@suaveplan/network-transport-libp2p` ✅, extracted from upstream's 749-LOC `libp2p-demo.tsx` per the tier-isolation rule. 6 subcomponents (`<Libp2pDemo>` root composer, `<NodeStatusPanel>`, `<NodeControls>`, `<PeerInteractionPanel>`, `<PeerList>`, `<LogPanel>`), each with sibling `.tsx`/`.md`/`.test.tsx`/`.stories.tsx`. `useLibp2pDemo` hook + `wirePeerEvents` helper. Bootstrap list is a **required** React prop (no hardcoded defaults). Consumes structural `Libp2pDemoNodeFactory` adapter — package never imports `libp2p`. 5-code `REACT_LIBP2P_DEMO_CODES` registry, Zod boundaries on props. Discipline: max source 263 LOC, max test 495 LOC, zero `:any`/mocks. 72 tests across 10 files, 100/100/100/100. |
| `@suaveplan/service-discovery` | ✅ | Universal `ServiceRegistry` with TTL/expiry, AbortSignal-aware `watch()`, optional storage persistence + `EventBusLike` fan-out; 100% coverage. |
| `@suaveplan/websocket-gateway` | ✅ | Server-tier WebSocket gateway hosting rooms + presence + channels. Idempotent `start({signal?}) → {address, port}` / `stop()` lifecycle. Required injectable `wsServerFactory` (production → real `ws.WebSocketServer`, tests → `FakeWsServer`/`RealWsServer` adapters; no mocks). 4 callback hooks for unmigrated deps (`authVerifier`/`authorizationCheck`/`rateLimitGate`/`auditLogger`) — default no-op, README documents replacement paths to `jwt-tenant`/`permissions`/`rate-limiter`/`audit-logging` when shipped. Direct integrations: `@suaveplan/idempotency` (dedup on mutating events), `@suaveplan/retry`, `@suaveplan/webhook-client` (signed presence-event delivery). 9-code `WS_GATEWAY` registry, OTel surface. **3-client real-`ws` integration test** verifies room broadcast + health endpoints + shutdown. 125 tests, 100/100/100/100. (Note: `gateway/gateway.ts` is 332 LOC — 32 over CLAUDE.md hard cap as a documented facade-pattern exception; 7 subsystems already factored out cleanly.) |
### `platform`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/analytics-browser` | ✅ | Browser-tier client-side analytics: `AnalyticsTracker` + `BatchTransport` (AbortController + timeoutMs + 4xx short-circuit + exponential backoff) + `BeaconTransport` (sendBeacon + fetch keepalive) + `SessionManager`. Consent gate (`AllowAllPolicy`/`DoNotTrackPolicy`), `HeadSampler` with per-event overrides, PII scrubber (redact/hash/drop on dotted paths), `MemoryStorageBackend` + `WebStorageBackend` (maxBytes watermark). Zod-validated `AnalyticsEventSchema`. Eight-code `ANALYTICS_BROWSER.*` registry. Five OTel instruments. Typed `EventBus<AnalyticsEventMap>` lifecycle bus. 114 tests, 100/100/100/100. |
| `@suaveplan/audience-rules` | ✅ | Dynamic audience segmentation: predicate library, segment evaluator + refresher, Zod-validated store, typed errors, OTel. |
| `@suaveplan/campaigns` | ✅ | Campaign orchestration: 9-transition state machine, batch planner, 6-step workflow runner, CampaignStore + InMemory impl, audience+template+channel+schedule |
| `@suaveplan/etl` | ✅ | Extract-Transform-Load pipeline engine with typed stages, error handling, obser… |
| `@suaveplan/feature-flags` | ✅ | Provider-agnostic feature flag evaluation with typed flag values, strategy chai… |
| `@suaveplan/health-check` | ✅ | /health, /ready, /live with dependency checks (HTTP, TCP, custom); injectable fetch/connect; OTel duration histogram + status counters |
| `@suaveplan/notification-channel` | ✅ | Multi-channel notification routing with templates, r... |
| `@suaveplan/pwa` | ✅ | Browser-tier PWA: SW lifecycle manager, caching strategies + router, sync queue (IndexedDB/localStorage/memory) with retry + schema migration, push subscriptions, install-prompt, manifest builder, cross-tab update controller, OTel counters/histograms |
| `@suaveplan/search` | ✅ | Full-text and fuzzy search primitives with in-memory BM25 engine, trigram fuzzy… |
| `@suaveplan/webhook-client` | ✅ | Webhook delivery client with retry logic, HMAC signature generation/verificatio… |
### `r3f`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/r3f-animation` | – | Animation state machine, blend trees, layers |
| `@suaveplan/r3f-booking` | – | Interactive 3D venue maps for booking |
| `@suaveplan/r3f-building` | – | R3F building mode with snap system, ghost preview, and placement validation |
| `@suaveplan/r3f-buildings` | – | Instanced 3D building and road rendering for R3F |
| `@suaveplan/r3f-camera` | – | Advanced camera controls for React Three Fiber |
| `@suaveplan/r3f-character` | – | Character controller for 3D games |
| `@suaveplan/r3f-character-vehicle` | – | Character-vehicle integration (enter/exit, authority transfer) |
| `@suaveplan/r3f-character-vehicle-picker` | – | Character/vehicle picker UI with 3D previews, GTA-style customisation |
| `@suaveplan/r3f-combat` | – | R3F rendering layer for combat with hitbox debug, projectile trails, muzzle flash, impact effects, and damage numbers |
| `@suaveplan/r3f-controller` | – | Input controller for 3D scenes |
| `@suaveplan/r3f-earth` | – | 3D globe with port markers, shipping lanes |
| `@suaveplan/r3f-emulator` | – | 3D device emulation interface |
| `@suaveplan/r3f-environment` | – | Skybox, HDR, and lighting presets |
| `@suaveplan/r3f-lod` | – | Level-of-detail management |
| `@suaveplan/r3f-minimap` | – | Minimap renderer, entity tracking, fog-of-war |
| `@suaveplan/r3f-networking` | ✅ | R3F-tier multiplayer state sync: frame-loop interpolation, client-side prediction with reconciliation FSM (composes `@suaveplan/fsm`), snapshot diff round-trip (composes `@suaveplan/diff`), snapshot interpolation, React hooks (`useNetworkSync`/`useNetworkedEntity`/`useNetworkPredict`) and R3F components (`<NetworkProvider>`/`<NetworkedEntity>`/`<NetworkStats>` with Storybook stories). Transport-agnostic: accepts any `Transport` from `@suaveplan/network` via injection; ships `MemoryTransport` deterministic real-impl for tests + canonical wiring docs for `network-transport-webrtc`. 5-code `R3F_NET` registry, OTel surface, AbortSignal everywhere. Property tests: interpolation monotonicity (200 runs), prediction-reconcile convergence (50 runs), snapshot diff round-trip equivalence (100 runs). 152 tests, 100/100/100/100. Max source 177 LOC, max test 184 LOC, zero `:any`/mocks. |
| `@suaveplan/r3f-npc` | – | R3F NPC rendering with behavior tree debug, nameplates, and dialogue triggers |
| `@suaveplan/r3f-number-plate` | – | 3D number plate component |
| `@suaveplan/r3f-parallax` | – | Interior-parallax components (WindowParallax + GridParallax) |
| `@suaveplan/r3f-particles` | – | GPU-accelerated particle systems (instanced) |
| `@suaveplan/r3f-pathfinding` | – | NavMesh pathfinding, steering, crowd simulation |
| `@suaveplan/r3f-performance` | – | Performance monitoring and optimization |
| `@suaveplan/r3f-physics-cascade` | – | Cascading physics effects |
| `@suaveplan/r3f-physics-core` | – | Physics engine abstraction layer |
| `@suaveplan/r3f-physics-rapier` | – | Rapier physics engine integration |
| `@suaveplan/r3f-shaders` | – | Custom shader effects and materials |
| `@suaveplan/r3f-terrain` | – | Procedural terrain with chunked LOD |
| `@suaveplan/r3f-ui` | – | HTML/React UI components in 3D space |
| `@suaveplan/r3f-vegetation` | – | R3F procedural vegetation with biome rules, LOD, and instanced placement |
| `@suaveplan/r3f-vehicle` | – | Vehicle controllers for React Three Fiber |
| `@suaveplan/r3f-water` | – | Water rendering and ocean simulation |
| `@suaveplan/r3f-weather` | – | R3F weather rendering with particles, fog, lightning, and surface wetness |
| `@suaveplan/r3f-world` | – | World management and scene composition |
| `@suaveplan/r3f-xr` | – | WebXR/VR/AR with controller and hand tracking |
### `random`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/fsm` | ✅ | Typed finite state machine with guards, actions, history tracking, hierarchical… |
| `@suaveplan/noise` | ✅ | Seeded spatial noise fields: Perlin, Simplex, Value, Worley, fBm and Blue-noise… |
| `@suaveplan/pseudo-random` | ✅ | Deterministic seeded PRNG implementations (Mulberry32, SFC32, Xoshiro256++, Cou… |
| `@suaveplan/random` | ✅ | High-level CSPRNG-backed randomness: strings, UUID/ULID/Nanoid, collections, ob… |
### `react`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/react-charts` | – | Chart and data visualization components |
| `@suaveplan/react-command-palette` | – | Cmd+K command palette with fuzzy search, keyboard na... |
| `@suaveplan/react-consent-overlay` | – | Cookie/consent/privacy overlays |
| `@suaveplan/react-data-table` | – | Data grid with sorting/filtering/pagination |
| `@suaveplan/react-dnd` | – | Drag-and-drop with sortable lists |
| `@suaveplan/react-error-boundary` | – | Error boundary with fallback UI |
| `@suaveplan/react-hotkeys` | – | Keyboard shortcut management |
| `@suaveplan/react-infinite-scroll` | – | Infinite scroll with IntersectionObserver |
| `@suaveplan/react-iphone` | – | iPhone simulator with WebRTC support |
| `@suaveplan/react-kanban` | – | Headless kanban board with drag-and-drop columns, sw... |
| `@suaveplan/react-loading` | – | Loading screen with weighted task progress and tip rotation |
| `@suaveplan/react-modal` | – | Modal/dialog system with focus trapping |
| `@suaveplan/react-skeleton` | – | Skeleton/shimmer loading placeholders |
| `@suaveplan/react-social` | – | Social library with real-time updates |
| `@suaveplan/react-timeline` | – | Timeline visualization components |
| `@suaveplan/react-tour` | – | Guided product tours and onboarding walkthroughs wit... |
| `@suaveplan/react-tree-view` | – | Tree view component |
| `@suaveplan/react-ui` | ✅ | Core React UI component library. ~70 shadcn-style components (Radix + cva + theme system + pack registry). i18n surface (capability spec `react-ui-i18n`): 7 formatted-value primitives (`<FormattedNumber>`, `<FormattedCurrency>`, `<FormattedDate>`, `<FormattedList>`, `<FormattedRelativeTime>`, `<Plural>`, `<FormattedMessage>`), `<ReactUiI18nBridge>` mounting `@radix-ui/react-direction` + `<html lang>`/`<html dir>` sync + `ReactUiLocaleContext`, `localeAwareSortingFn` / `localeAwareFilterFn` for tanstack tables, `formattedCell` shortcut for column cells, `<InputNumber>` (locale-aware decimal/grouping parse), `useValidationMessageBridge`, `<Drawer>` / `<Sheet>` `inline-start`/`inline-end` directions, `<Calendar>` auto-wires registry's `date-fns` adapter when present. Tooling: `bun run check:i18n-keys` (translation-key drift gate, MISSING fails / ORPHAN warns by default + `--strict` mode), `bun run check:registry-eject` (shadcn-eject smoke gate), 11 stories with consolidated snapshot test. 1368 tests pass. Initial i18n surface shipped 2026-05-10 (`react-i18n-plugin-registry-and-ui-primitives`); deferred tooling shipped 2026-05-10 (`react-ui-i18n-deferred-tooling`). |
| `@suaveplan/react-ui-social` | – | Social UI components |
| `@suaveplan/react-virtual` | – | Virtualized list/grid rendering |
### `security`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/hibp` | ✅ | Privacy-preserving Have I Been Pwned client: k-anonymity SHA-1 prefix range API (`Add-Padding: true`, NTLM mode via injectable adapter, constant-time suffix compare, byte-level no-leak suite), authenticated breach/paste API with 1500ms client-side rate-limit gate + 429 `Retry-After` honour, in-memory LRU cache (10k entries / 24h TTL) + pluggable `HibpCacheLike`, differential-privacy decoy-prefix padding, Zod boundary schemas at every response, 7 error codes, OTel histograms + outcome counters. 100% coverage. |
| `@suaveplan/jws` | ✅ | **Impl complete** (43 `.ts` files / 2403 LOC / 24 sibling `.md` docs at 100% docs:check / 10 subpath exports / 18-code error registry). Biome / lint / typecheck / build GREEN. **Test pass + archive pending in separate session** — needs ~27 test files matching `**Verified by:**` paths in spec delta, RFC 7515 Appendix A.1–A.7 verbatim fixtures, x5c chain fixtures (consume `@suaveplan/x509`'s `build-certs.ts`), 100/100/100/100 Istanbul. Surface: RFC 7515 JSON Web Signature; compact + JSON-flat + JSON-general serializations; verify + sign across HS256/384/512, RS256/384/512, PS256/384/512, ES256/384/512, EdDSA (RFC 8037); JWK header parse, `x5c` embedded cert chain delegating to `@suaveplan/x509.validateChain`, `kid` resolver, `crit` allowlist enforcement with mandatory `b64` listing per RFC 7797 §3, `alg: "none"` two-flag explicit opt-in, RFC 7797 `b64: false` header, detached signatures (RFC 7515 §A.5), constant-time MAC compare for HMAC, ECDSA DER-form rejection (raw `r\|\|s` only). 12-step verify orchestrator with AbortSignal at three checkpoints. Gates webauthn-android-safetynet attestation. |
| `@suaveplan/otp` | ✅ | RFC 4226 HOTP + RFC 6238 TOTP + RFC 6287 OCRA + Key URI + recovery codes (Vaulted) |
| `@suaveplan/password-formats` | ✅ | Universal import/export layer for common password-manager export formats — Appl… |
| `@suaveplan/password-generator` | ✅ | Cryptographically-strong password and passphrase generator: char-class mode (configurable length / classes / exclusions / required-class quotas), passphrase mode over bundled EFF Long (7776) + EFF Short 1 (1296) wordlists under tree-shakeable subpaths, pronounceable Markov-digram mode, PIN mode, bias-free `randomInt` per Lemire rejection sampling, `estimateEntropy` for both modes, `assertStrength(password, minBits)` guard, wordlist plugin API (≥256-entry minimum), injectable `Rng` via `@suaveplan/types`. χ² statistical test on 1M draws (p > 0.01). 100% coverage. |
| `@suaveplan/password-strength` | ✅ | zxcvbn-style password strength estimator: 6 pattern matchers (dictionary with l33t+reverse, sequence, repeat, date, keyboard adjacency for QWERTY/DVORAK/AZERTY, recent-year regex), `mostGuessableMatchSequence` DP scorer with factorial penalty + bruteforce fallback, `estimateGuesses` per Wheeler §4 formulae, 4-scenario `crackTimes` with `adjustments` multiplier, 5-bucket score (literal `0\|1\|2\|3\|4`), feedback strings keyed for `@suaveplan/i18n`, `loadDictionaries` runtime swap, `userInputs` personal-info match, multilingual dicts under `./dicts/{de,fr,es,zh-Hans,ru}` subpaths, `assessReactive` streaming variant with AbortSignal, 200-char DoS guard. 100% coverage. |
| `@suaveplan/security-codes` | ✅ | Detect and sanitise sensitive security-code leakage in strings: API keys, JWTs,… |
| `@suaveplan/slsa` | ✅ | SLSA L1-L2 supply-chain security: provenance, SBOM, DSSE attestations, Sigstore… |
| `@suaveplan/srp` | ✅ | SRP-6a (RFC 5054) zero-knowledge password proof: bundled 2048-bit safe-prime group at root + 1024/1536/3072/4096/6144/8192 under `./groups/<size>` subpaths (every constant byte-exact to Appendix A); SHA-256 default, SHA-1 legacy opt-in; client (`computeVerifier`, `clientStartHandshake`, `clientFinishHandshake`, `clientVerifyServerProof`) and server (`serverStartHandshake`, `serverFinishHandshake`, `serverComputeM2`) roles; reject `A mod N == 0` / `B mod N == 0` / `u == 0` per §2.5.4 with `SRP.PUBLIC_KEY_INVALID`; modpow via `@noble/curves/abstract/modular.pow` (never `BigInt ** BigInt %`); constant-time M1/M2/S compare via `@suaveplan/crypto-utils`; dual hash backends (`nobleHashBridge` sync + `subtleHashBridge` async + `defaultHashBridge` selector); `PakeProvider` interface for future OPAQUE drop-in; RFC 5054 Appendix B 1024/SHA-1 vectors verified byte-exact; locally-derived 2048/SHA-256 fixture via `scripts/generate-srp-vectors.ts`; 1000-triple property test asserts `client.K === server.K`. 100% coverage. |
| `@suaveplan/tpm-struct` | ✅ | TPM 2.0 attestation-structure parser per TCG TPM 2.0 Library Part 2 r1.59: `parseTpmsAttest` covering all 8 `TPM_ST_ATTEST_*` variants (§10.12 + §10.11), `parseTpmtPublic` covering RSA / ECC / KEYEDHASH / SYMCIPHER (§12.2), byte-identical serializers, `computeTpmtPublicName` (§16) with injected `HashLike`, `extraDataMatches` (W3C WebAuthn L3 §8.3 step 8) with injected constant-time compare, `TPM_ALG` 35-entry + `TPM_ECC_CURVE` 9-entry frozen registries (§11.1 / §11.2.5), TPM2B length-prefix reader/writer, magic check `0xff544347` ("TCG\xff" reversed), `0 ⇒ 65537` RSA exponent normalization with `rawExponent` preservation, bounds enforcement → `TPM_STRUCT.TRUNCATED`, alg-unknown → `TPM_STRUCT.ALG_UNSUPPORTED`, debug-only `toDiagnostic` dumper, Zod boundary schemas at every public surface, 10-code error registry, OTel histograms + counters with bounded-enum attributes. Synthetic WebAuthn TPM integration fixture (no real-device byte string available). 100% coverage. |
| `@suaveplan/vault` | ✅ | Vault orchestration layer for the Vaulted ecosystem: drive-backed encrypted… |
| `@suaveplan/vault-sync` | ✅ | Offline-first, end-to-end-encrypted sync engine for vault items: domain-specif… |
| `@suaveplan/x509` | ✅ | RFC 5280 v3 certificate parsing + chain validation: hand-rolled ASN.1 BER/DER codec for the X.509 subset; RFC 7468 PEM framing; TBSCertificate parser; pluggable extension decoder + critical-extension enforcement; all 8 standard extension decoders (basic constraints / key usage / EKU / SAN with DNS+IPv4+IPv6+URI+email+dirName+rfc822Name / name constraints / AKI + SKI / CRL distribution points); `validateChain` per §6.1 12-step algorithm with policy tree; validity period (UTCTime/GeneralizedTime 2050 boundary) with injectable `Clock`; signature verify dispatching to `@suaveplan/crypto-rsa` (PKCS1v15-SHA256/384/512 + PSS) and `@suaveplan/crypto-curve` (ECDSA-P256/384/521 + Ed25519); self-signed-leaf rejection; chain depth bound (default 16); `TrustAnchorStore` with configurable duplicate-SKI policy; OCSP responder interface. 45 src + 38 test files, 381 tests, 16 deterministic chain builders (real RSA/P-256/Ed25519 signatures, no mocks). 100% coverage. Gates webauthn-tpm + webauthn-android-key + webauthn-apple attestation. |
### `storage`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/cache-browser` | ✅ | Use `@suaveplan/cache-storage` over `@suaveplan/storage-browser-{localstorage,indexeddb,opfs}`. No separate package required. |
| `@suaveplan/cache-memory` | ✅ | Built into `@suaveplan/cache` as `MemoryCache`. No separate package required. |
| `@suaveplan/cache-redis` | ✅ | `AbstractCache<T>` backend over a minimal `RedisLike` interface — native `SET ... EX`, `GET`, `DEL`, `EXISTS`, `TTL`, `SCAN`. Reuses `@suaveplan/cache-storage` codecs (JSON / identity / base64). |
| `@suaveplan/cache-storage` | ✅ | `AbstractCache<T>` backend that bridges any `@suaveplan/storage` `AbstractStorage` into a typed cache via a 32-byte fixed-width TTL header and pluggable `Codec<T>` (JSON default, identity for `Uint8Array`). Subsumes `cache-browser` by composition. |
| `@suaveplan/storage` | ✅ | Enterprise key-value storage abstractions: AbstractStorage (StorageLike + strea… |
| `@suaveplan/storage-browser-opfs` | ✅ | OPFS storage backend for @suaveplan/storage |
| `@suaveplan/storage-cdn` | ✅ | Types-only foundation for CDN-flavoured storage adapters: `CdnAdapter` abstract base extending `AbstractStorage` with `purge`/`signUrl`/`edgeUrl`, `CdnCapabilities` matrix, Zod-validated `SignUrlOptions`, `STORAGE_CDN` error registry (8 codes), type-guard helpers, module augmentation for `capabilities.cdn`. Provider packages (rackspace, bunnycdn) implement against this contract. |
| `@suaveplan/storage-cdn-bunnycdn` | ✅ | BunnyCDN Storage Zone + Pull Zone provider for `@suaveplan/storage-cdn`. Full `AbstractStorage`/`CdnAdapter` surface against the regional Storage Zone (`de`/`ny`/`la`/`sg`/`syd`/`uk`) with `AccessKey` headers, HMAC-SHA256 Token Authentication signed URLs, single + wildcard prefix purge via `api.bunny.net/purge`, transient-status retry honouring `Retry-After`, full OTel surface with `provider="bunnycdn"` + `storage_region`. The only adapter in the family with `cdnPrefixPurge: true`. |
| `@suaveplan/storage-cdn-rackspace` | ✅ | Rackspace Cloud Files (OpenStack Swift) origin + Rackspace CDN provider for `@suaveplan/storage-cdn`. v2 identity auth with proactive token refresh, service-catalog endpoint lookup (LON/IAD/DFW/ORD/SYD/HKG), HMAC-SHA1 Swift TempURL signing, CDN purge (single-key), Range reads, native streaming, full OTel surface with `provider="rackspace"` + `region`. |
| `@suaveplan/storage-file` | ✅ | filesystem storage |
| `@suaveplan/storage-http` | ✅ | Universal HTTP/CDN-backed `AbstractStorage` adapter. Reads via `GET`/`HEAD`/`Range` against any `baseUrl + key` origin, optional writes through a pluggable `HttpUploader`, AbortSignal everywhere, retry on transient outcomes honouring `Retry-After`, conditional reads via ETag cache, native `ReadableStream` from `Response.body`, full OTel surface. Universal tier — no Node/Bun imports; runs unchanged in Node 18+, Bun, Deno, browsers, Workers. |
| `@suaveplan/storage-s3` | ✅ | S3-compatible object storage adapter for @suaveplan/storage: implements Abstrac… |
| `@suaveplan/storage-plugin-cache` | ✅ | Read-through cache decorator for any `AbstractStorage`. `cachedStorage(inner, options): CachedStorage` returns a class extending `AbstractStorage` that wraps an inner storage with a caller-supplied `AbstractCache<Uint8Array>` in front (the inverse of `cache-storage`'s storage-as-cache direction). Populates on miss when `shouldCache(key, bytes)` returns true (default 16 MiB ceiling). Invalidates on `set`/`setPartial`/`delete`/`clear` (post-success). `clear()` evicts only the wrapper's namespaced subset via `cache.keys()` enumeration; logs a warning + skips when the cache backend lacks `keys()` (avoids cross-namespace wipe). Passthrough on `exists` / `list` / `getMetadata` / `getWithMetadata` / `getSize` / `getItemSize` / `getPartial` / `createReadStream` / `createWriteStream`. 2-code `STORAGE_CACHE.*` registry; class renamed `CachedStorageError` to avoid the namespace collision with `@suaveplan/cache-storage`'s `StorageCacheError`. Cache failures swallow + counter-record. Multi-namespace isolation on a shared cache. Full OTel surface. Universal tier; composes with `drive`, `storage-uri` plugins, application code that takes a `StorageLike`. |
| `@suaveplan/storage-uri` | ✅ | Universal URI-routed dispatcher over any `StorageLike`. Single resolver maps `scheme → UriPlugin` (`file://`, `https://`, `s3://`, `rackspace://`, `bunny://`, …), returns `ReadableStream<Uint8Array>` via `adapter.createReadStream` with one-chunk buffered fallback. 8-code `STORAGE_URI.*` registry. `SuaveplanError` subclasses thrown by adapters pass through unchanged; non-namespaced throwables wrap as `ADAPTER_ERROR`. AbortSignal propagation, full OTel surface, `runUriPluginConformance` harness exported for sibling plugin packages. |
### `store`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/api-plugin-inventory` | – | Inventory management plugin — items, stock levels, m... |
| `@suaveplan/api-plugin-store` | – | E-commerce store plugin |
| `@suaveplan/api-plugin-subscription` | – | Subscription/recurring billing plugin |
| `@suaveplan/api-plugin-virtual-currency` | – | Virtual currency wallets, transfers, purchases, cashout |
| `@suaveplan/r3f-inventory` | – | Grid-based inventory, equipment, loot tables |
| `@suaveplan/react-store` | – | Store state management components |
### `testing`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/ab-testing` | ✅ | Enterprise A/B testing and experimentation: deterministic FNV-1a bucketing, tar… |
| `@suaveplan/testing` | ✅ | Universal test utilities (FakeClock, Factory, FixtureManager, MemoryStore, buil… |
| `@suaveplan/testing-dom` | ✅ | DOM/React testing — vitest+bun-test conditional re-exports, createTestConfig, p… |
| `@suaveplan/testing-e2e` | ✅ | Playwright E2E utilities — config factory, page objects, fixtures, helpers, str… |
| `@suaveplan/testing-integration` | ✅ | Core integration test infrastructure: ServiceFixture<T> interface, TestEnvironm… |
| `@suaveplan/testing-integration-garage-s3` | ✅ | Garage S3 v2.0.0 testcontainers fixture for @suaveplan/testing-integration |
| `@suaveplan/testing-integration-mailpit` | ✅ | Mailpit testcontainers fixture + assertMail helper for @suaveplan/testing-integ… |
| `@suaveplan/testing-integration-postgres` | ✅ | PostgreSQL 16 testcontainers fixture for @suaveplan/testing-integration |
| `@suaveplan/testing-integration-redis` | ✅ | Redis 7 testcontainers fixture for @suaveplan/testing-integration |
| `@suaveplan/testing-integration-step-ca` | ✅ | smallstep/step-ca testcontainers fixture for @suaveplan/testing-integration — r… |
| `@suaveplan/testing-integration-surrealdb` | ✅ | SurrealDB v3 testcontainers fixture for @suaveplan/testing-integration |
| `@suaveplan/testing-integration-typesense` | ✅ | Typesense 27 testcontainers fixture for @suaveplan/testing-integration |
### `timing`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/cron` | ✅ | Universal-tier cron expression parser, next-fire calculator with timezone + DST support, and lightweight in-process scheduler |
| `@suaveplan/datetime` | ✅ | Timezone-aware date/time utilities with business-day arithmetic, recurrence rul… |
| `@suaveplan/timing` | ✅ | Timing and scheduling utilities — stopwatch, throttle, debounce, scheduler, dec… |
### `tooling`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/cli` | ✅ | Zero-dependency CLI toolkit: argument parser, command router, ANSI styling, out… |
| `@suaveplan/electrobun` | ✅ | Electrobun desktop-app generator + orchestrator: scaffolder (9 project + 8 feature renderers), iconz-backed icon pipeline, five CLI subcommands (create/dev/build/package/sign) orchestrating the upstream `electrobun` binary via an injectable `CommandRunner`, layered config + Prompter seam, Zod-validated options, eleven `ELECTROBUN.*` codes, 5 OTel counters + 2 histograms |
| `@suaveplan/install-agent-skills` | ✅ | Suaveplan installer plugin: bundles the agent-skills set and installs them into… |
| `@suaveplan/installer` | ✅ | Plugin host + lifecycle for project boilerplating and asset installation: detec… |
| `@suaveplan/license` | ✅ | Software license generation |
| `@suaveplan/linter` | ✅ | Unified markdown + biome linting pipeline: remark-based markdown fixer, injectable CommandRunner-backed biome wrapper, glob resolver, orchestrator with structured LintReport, pure runCli, `LINTER_CODES` error registry, OTel self-telemetry. |
| `@suaveplan/overview` | ✅ | Machine-readable monorepo manifest with Zod schemas, tier inference, server-tier filesystem discovery (`./discover` subpath), graph utilities (Kahn topo, Tarjan cycles, transitive deps), plugin/category/tier roll-ups, 6 `OVERVIEW.*` codes, OTel. 56 tests / 100/100/100/100. |
| `@suaveplan/profiler` | ✅ | Runtime performance profiling: sampler, marks, memory snapshots, bottleneck detector, flamegraph JSON, profile comparator, text reporter, OTel exporter; injectable Clock/Timers/Logger. |
| `@suaveplan/readline` | ✅ | Terminal I/O primitive: AsyncGenerator line reader and interactive prompt inter… |
| `@suaveplan/sandbox` | ✅ | Server-tier sandboxed code execution — vm/worker/spawn/isolate engines, pre-warmed pool, async result streamer, regex code transformer, module resolver, sliding-window rate limiter, SHA-256 audit logger, OTel instruments, 15 SANDBOX.* error codes |
| `@suaveplan/server-keys` | ✅ | Server key management CLI |
| `@suaveplan/test-vite` | ✅ | Vite + Vitest configuration factories and validators with browser-environment shims, tree-shake validator, bundle-size snapshot, port allocator, HMR tester, custom matchers, TEST_VITE_CODES error registry, and OTel self-telemetry. |
| `@suaveplan/wip` | – | Work-in-progress experiments |
### `unknown`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/biometrics` | ❌ | Touch ID / Face ID / Hello facade (Vaulted) |
| `@suaveplan/clipboard` | ✅ | Enterprise Clipboard API: typed errors, OTel metrics, async queue, secure-context guard, image/blob copy + read, paste-event read fallback, permission change subscription, focus-aware retry, sanitizer hook |
| `@suaveplan/form-detection` | ❌ | DOM heuristics for autofill (Vaulted) |
| `@suaveplan/iconz` | ❌ | App icon generator from SVG (Vaulted) |
| `@suaveplan/mcp` | ✅ | Universal-tier MCP server + client with JSON-RPC dispatcher, pluggable transports (in-memory, stdio, HTTP+SSE), AbortSignal cancellation, progress notifications, authorize hook, and OTel meter |
| `@suaveplan/media` | ✅ | Universal-tier media detection, metadata extraction, and constraint validation. Pluggable `SignatureRegistry` (twelve built-in formats: PNG, JPEG, GIF, BMP, WEBP, RIFF, MP4/MOV, WebM/MKV, MP3-ID3, MP3-sync, FLAC, OGG) with offset-aware `match`/`detect`/`register`/`unregister`. Detection via `detectMediaType`, `detectSignature`, `detectMediaTypeFromName` (MIME bucket via `@suaveplan/mime`), `inferMimeFromSignature` canonical-MIME mapping. Sync `getMetadata` + async `getMetadataAsync` with optional `MediaMetadataExtractor` hook (width/height/duration). `validateMedia`/`validateMediaAsync`/`assertValidMedia` with Zod-parsed `MediaConstraints` (size/MIME/type/dimensions/duration/predicate), wrapped predicate errors. Typed `MediaError` hierarchy with eight stable `MEDIA.*` codes (`EMPTY_INPUT`, `INVALID_CONSTRAINTS`, `VALIDATION_FAILED`, `UNSUPPORTED_TYPE`, `PREDICATE_FAILED`, `DUPLICATE_SIGNATURE`, `METADATA_EXTRACTOR_FAILED`, `INVALID_SIGNATURE`) plus per-code metadata (`httpStatus`, `retryable`, `severity`, `description`). OTel: four counters (`media_detect_total`, `media_metadata_total`, `media_validate_total`, `media_error_total`), two histograms (`media_op_latency_ms`, `media_input_size_bytes`). 103 tests, 100/100/100/100 coverage. |
| `@suaveplan/native-messaging` | ❌ | Encrypted extension↔desktop transport (Vaulted) |
| `@suaveplan/qrcode-scan` | ❌ | QR decode subpath (Vaulted) |
| `@suaveplan/react-map` | – | Map visualization components |
| `@suaveplan/react-media` | – | Media rendering components |
| `@suaveplan/react-rule-builder` | – | Visual rule builder with AND/OR groups, drag-drop, JSON config |
| `@suaveplan/site-icons` | ❌ | Favicon fetch + cache (Vaulted) |
| `@suaveplan/spatial-hash` | – | Spatial hashing for O(1) broad-phase 2D/3D queries |
| `@suaveplan/storage-browser` | ❌ | **Retired** — superseded by split into `storage-browser-indexeddb` / `storage-browser-localstorage` / `storage-browser-opfs` (all ✅). See archive `2026-05-12-enterprise-browser-storage-browser-superseded-by-split`. |
| `@suaveplan/storybook-test-utils` | – | Storybook E2E testing utilities |
| `@suaveplan/streams-chunk-queue` | ✅ | Chunked-queue stream processing: binary protocol, decryptor, rate limiter, storage adapter, hooks, validator, OTel. |
| `@suaveplan/streams-metadata` | ✅ | Stream transform for extracting rich media metadata via EXIF, MIME, and events. |
| `@suaveplan/third-party-elevenlabs` | ✅ | Typed thin client for the ElevenLabs platform API: REST + WebSocket transport,… |
| `@suaveplan/web-workers` | ✅ | Browser-tier Web Worker / SharedWorker / worker-pool runtime: typed RPC with AbortSignal + transfer-list + backpressure + circuit breaker + streaming, FIFO + round-robin / least-busy schedulers, restart-on-crash supervision, EventBus lifecycle emission, OTel observability, 13-code `WEB_WORKERS.*` registry, `defineWorker()` helper. |
| `@suaveplan/workflow` | ✅ | Workflow/saga orchestration: fluent builder, sequential/parallel/conditional steps, saga compensation, retry middleware, hooks, transition-data pipeline, six `WORKFLOW.*` codes, OTel. |
### `vatdash`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/api-plugin-vatdash-bridge` | – | Bridge wiring all api-plugins into the vatdash Hono server |
### `video`
| Package | Status | Info |
|---|:---:|---|
| `@suaveplan/react-video` | – | Video player components |
| `@suaveplan/video` | ✅ | Universal-tier video metadata + transform-planning: 8-format magic-byte sniffer, `calculateVideoResize` with 6 presets, `validateTrimRange`, `VideoProcessor` w/ typed EventBus, `extractMetadata`/`planTransform`, Zod-validated 9-variant `VideoTransformOpSchema`, fluent `VideoPipelineBuilder`, 16-code `VIDEO.*` registry + metadata table, OTel. 113 tests / 100/100/100/100. |
| `@suaveplan/video-thumbnails` | ✅ | Video thumbnail extraction + sprite sheets via injectable FfmpegRunner (default fluent-ffmpeg + bundled @ffmpeg-installer/@ffprobe-installer binaries). Single-frame, batch, sliding-window, N×M tile. Zod boundaries, AbortSignal, 9 `VIDEO_THUMBNAILS.*` codes, 4 OTel instruments. 93 tests / 100/100/100/100. |
## Maintenance
When you finish migrating a package:
1. Confirm the folder under `packages/<plugin>/<pkg>/` builds and tests cleanly.
2. Flip the row's status icon from `–` to `✅` and replace the suaveplan summary with the genesis description from the package's `README.md` (truncate to ~80 chars).
3. Run `bun scripts/folder-reorg/generate-manifest.ts` to refresh `MANIFEST.md`. The dep graph is the source of truth for workspace edges.
4. Run `bun scripts/generate-missing.ts` to refresh `MISSING.yml`.
5. Update `SUMMARY.md` per the workflow described in `AGENTS.md` step 5 — paste the README summary into its plugin-folder section.
When you propose a net-new package not in `suaveplan`:
1. Add a row here with status `❌`, the planned parent folder, and a short note explaining what it does and why.
2. Open the OpenSpec change (`openspec/changes/<change-id>/`) before any code lands.
## Superseded upstream packages — do not migrate
Per `openspec/changes/network-transport-family/proposal.md` (2026-05-11) the following upstream packages have been replaced by genesis equivalents and MUST NOT be migrated under their original names:
| Upstream | Genesis replacement |
|---|---|
| `@suaveplan/network-protocol` | `@suaveplan/network-plugin-protocol` ✅ |
| `@suaveplan/network-registry` | `@suaveplan/network-plugin-registry` ✅ |
| `@suaveplan/network-assignment` | `@suaveplan/network-plugin-assignment` ✅ |
| `@suaveplan/network-webrtc` | `@suaveplan/network-transport-webrtc` ✅ |
| `@suaveplan/network-topology` | `@suaveplan/network-plugin-topology` ✅ |
| `@suaveplan/network-failover` | `@suaveplan/network-plugin-failover` ✅ |
| `@suaveplan/network-governance` | `@suaveplan/network-plugin-governance` ✅ |
| `@suaveplan/network-websockets` | `@suaveplan/network-transport-websockets` ✅ |
| `@suaveplan/network-observability` | folded into `@suaveplan/network-plugin-monitor` ✅ (Wave 6.1 `network-observability-consolidation`; Prometheus exposition + Grafana dashboard generator land as universal-tier feature modules; OTel SDK bridge dropped as redundant — monitor emits through `@opentelemetry/api` directly) |
| `@suaveplan/network-quality` | folded into `@suaveplan/network-plugin-monitor` ✅ (Wave 6.2 `network-quality-consolidation`; `BandwidthMonitor` EMA recorder + `DegradationManager` 4-level classifier with hysteresis + one-step transitions + `createQualityMiddleware` per-source throttling gate land as universal-tier feature modules under `src/quality/`; `EventEmitter`-based upstream evented API replaced by callback-handler subscriptions returning unsubscribe fns, dropping the `@suaveplan/events` runtime coupling — matches genesis no-monolithic-EE convention; `hysteresisMs: 0` newly commits same-call so the policy is genuinely usable for synchronous tests) |
If upstream functionality is missing from a genesis replacement, extend the replacement — do not create a parallel package under the deprecated name.