Package-level declarations
Types
Safe browser metadata for the Session view; credentials never appear here.
Reads and (opt-in) edits an app's own SQLite databases. Read-only SELECT/PRAGMA statements are always allowed; any statement that can mutate data or schema is refused with DatabaseExecResult.WriteBlocked unless DatabaseInspector.execute's writeEnabled is true. Callers pass writeEnabled from EditingCapabilities.database. Declared in sdk:server-api -- a plain boundary module with no Android dependency -- so both the Android engine implementation (sdk:full) and the platform-independent Ktor routes (sdk:server-ktor) can share this one contract without a circular module dependency, the same way io.devconsole.state.SessionFeatureFlags reaches GET/POST /api/v1/flags.
Browses an app's own file storage. Every path is resolved against a fixed set of app-owned roots and canonicalized; anything escaping a root (.., symlinks, absolute paths) is refused. Text previews are redacted. Only regular files are ever touched -- never a directory tree -- across every operation here, including create/replace/rename. Every mutation (and readBytes, since it returns raw unredacted bytes) is ungated here -- callers (the Compose adapter in sdk:full, and the browser server routes in sdk:server-ktor) enforce the EditingCapabilities.files opt-in. Declared in sdk:server-api -- a plain boundary module with no Android dependency -- so both surfaces can share this one contract without a circular module dependency, the same way io.devconsole.state.SessionFeatureFlags reaches GET/POST /api/v1/flags.
Keeps Android-version policy outside the transport so it can be tested without framework APIs.
Reads and edits an app's SharedPreferences. Reads are redacted; editing is ungated here -- every caller (the Compose adapter in sdk:full, and the browser server routes in sdk:server-ktor) enforces the EditingCapabilities.preferences opt-in before calling put/remove. Declared in sdk:server-api -- a plain boundary module with no Android dependency -- so both the Android engine implementation and the platform-independent Ktor routes can share this one contract without a circular module dependency, the same way io.devconsole.state.SessionFeatureFlags reaches GET/POST /api/v1/flags.
Stable, non-sensitive metadata exposed to an authenticated dashboard.
In-memory authority for the browser session store: creation, TTL/refresh, CSRF tokens, listing, and revocation. One access tier -- every session is equivalent; mutating routes gate on the host's EditingCapabilities flags instead of a session-level role. SessionCodeAuthority is the sole way a session gets minted, via createSession.
SESSION_CODE access flow: an 8-character, unambiguous-alphabet code with its own TTL, exchanged directly for a browser session -- no on-device Approve/Deny round trip. Possession of the code within its TTL is the authorization decision; mutating routes still separately require the relevant EditingCapabilities flag on the host.
Result of SessionCodeAuthority.exchange.
Session-code data; never persisted. Possessing code within expiresAtEpochMs is the entire trust decision -- there is no on-device approval step. See SessionCodeAuthority.exchange and docs/THREAT_MODEL.md.
Result of minting a session (SessionAuthority.createSession).
Session-count policy. Every authenticated session is equivalent (no role ladder -- see SessionAuthority); maxAuthenticatedSessions is the only cap that still applies, mirroring what used to be PairingSessionPolicy.maxAuthenticatedSessions before the CONTROL/ADMIN-specific caps were removed along with the role ladder itself.