#ifndef VERSEVDI_CORE_H #define VERSEVDI_CORE_H #include #include #ifdef __cplusplus extern "C" { #endif #define VERSE_CORE_ABI_VERSION_1 UINT32_C(1) typedef uint32_t verse_status_t; #define VERSE_STATUS_OK UINT32_C(0) #define VERSE_STATUS_INVALID_ARGUMENT UINT32_C(1) #define VERSE_STATUS_INVALID_STATE UINT32_C(2) #define VERSE_STATUS_UNSUPPORTED_ABI UINT32_C(3) #define VERSE_STATUS_AUTHORITY_REJECTED UINT32_C(4) #define VERSE_STATUS_TLS UINT32_C(5) #define VERSE_STATUS_TRANSPORT UINT32_C(6) #define VERSE_STATUS_PROTOCOL UINT32_C(7) #define VERSE_STATUS_EXPIRED UINT32_C(8) #define VERSE_STATUS_QUEUE_FULL UINT32_C(9) #define VERSE_STATUS_CANCELLED UINT32_C(10) #define VERSE_STATUS_REENTRANT UINT32_C(11) #define VERSE_STATUS_BUSY UINT32_C(12) #define VERSE_STATUS_INTERNAL UINT32_C(13) #define VERSE_STATE_CONNECTING UINT32_C(1) #define VERSE_STATE_CONNECTED UINT32_C(2) #define VERSE_STATE_CANCELLED UINT32_C(3) #define VERSE_INPUT_KEYBOARD UINT32_C(1) #define VERSE_INPUT_MOUSE_BUTTON UINT32_C(2) #define VERSE_INPUT_RELATIVE_MOUSE UINT32_C(3) #define VERSE_INPUT_TEXT UINT32_C(4) #define VERSE_INPUT_CONTROLLER UINT32_C(5) #define VERSE_INPUT_ABSOLUTE_MOUSE UINT32_C(6) #define VERSE_INPUT_SCROLL UINT32_C(7) typedef struct verse_core verse_core_t; /* data may be NULL only when length is zero. The view never transfers ownership. */ typedef struct verse_bytes_view { const uint8_t *data; size_t length; } verse_bytes_view_t; typedef struct verse_state_event_v1 { uint32_t struct_size; uint32_t abi_version; uint32_t state; uint32_t reason; } verse_state_event_v1_t; typedef struct verse_error_event_v1 { uint32_t struct_size; uint32_t abi_version; uint32_t code; uint32_t retryable; uint32_t phase; uint32_t reserved; } verse_error_event_v1_t; typedef struct verse_stats_event_v1 { uint32_t struct_size; uint32_t abi_version; uint64_t dropped_callbacks; uint64_t dropped_media_units; uint64_t dropped_input_events; } verse_stats_event_v1_t; typedef struct verse_media_event_v1 { uint32_t struct_size; uint32_t abi_version; uint32_t channel; uint32_t sequence; uint64_t timestamp_ms; verse_bytes_view_t encoded_unit; } verse_media_event_v1_t; typedef struct verse_control_event_v1 { uint32_t struct_size; uint32_t abi_version; uint32_t kind; uint32_t reserved; verse_bytes_view_t payload; } verse_control_event_v1_t; /* * Signers run synchronously. transcript/tls_message is borrowed only for the call; * signature_out is exactly 64 writable bytes. Admission may return OK, * AUTHORITY_REJECTED, CANCELLED, or INTERNAL. TLS may return OK, TLS, CANCELLED, * or INTERNAL. Any other value is normalized to INTERNAL. */ typedef verse_status_t (*verse_sign_admission_v1_fn)( void *signer_context, verse_bytes_view_t transcript, uint8_t signature_out[64]); typedef verse_status_t (*verse_sign_tls_ed25519_v1_fn)( void *signer_context, verse_bytes_view_t tls_message, uint8_t signature_out[64]); /* * Event callbacks are serialized with one another. Each event and nested byte view * is borrowed only for its callback and must not be retained. */ typedef void (*verse_state_event_v1_fn)( void *context, const verse_state_event_v1_t *event); typedef void (*verse_error_event_v1_fn)( void *context, const verse_error_event_v1_t *event); typedef void (*verse_stats_event_v1_fn)( void *context, const verse_stats_event_v1_t *event); typedef void (*verse_media_event_v1_fn)( void *context, const verse_media_event_v1_t *event); typedef void (*verse_control_event_v1_fn)( void *context, const verse_control_event_v1_t *event); /* * create copies this table. context and every non-NULL callback must remain valid * until destroy succeeds; BUSY does not end that lifetime. */ typedef struct verse_core_config_v1 { uint32_t struct_size; uint32_t abi_version; void *context; verse_sign_admission_v1_fn sign_admission; verse_sign_tls_ed25519_v1_fn sign_tls_ed25519; verse_state_event_v1_fn on_state; verse_error_event_v1_fn on_error; verse_stats_event_v1_fn on_stats; verse_media_event_v1_fn on_media; verse_control_event_v1_fn on_control; } verse_core_config_v1_t; typedef struct verse_connect_request_v1 { uint32_t struct_size; uint32_t abi_version; verse_bytes_view_t manifest_json; verse_bytes_view_t tunnel_credential_json; } verse_connect_request_v1_t; /* values are kind-specific signed fields; every unused field and flags must be zero. */ typedef struct verse_input_event_v1 { uint32_t struct_size; uint32_t abi_version; uint32_t kind; uint32_t flags; int32_t values[12]; } verse_input_event_v1_t; uint32_t verse_core_abi_version(void); /* * During a signer callback, every API below except verse_core_abi_version returns * REENTRANT for every handle. During an event callback, only cancel on that event's * originating handle is allowed; all other calls and cross-handle cancel return * REENTRANT. Connect copies both byte inputs before returning, so callers may * mutate or release their buffers afterward. */ verse_status_t verse_core_create_v1( const verse_core_config_v1_t *config, verse_core_t **out_core); verse_status_t verse_core_connect_v1( verse_core_t *core, const verse_connect_request_v1_t *request); verse_status_t verse_core_send_input_v1( verse_core_t *core, const verse_input_event_v1_t *event); verse_status_t verse_core_request_idr_v1(verse_core_t *core); /* Idempotent and nonblocking; it does not wait for an internal state lock. */ verse_status_t verse_core_cancel_v1(verse_core_t *core); /* * OK suppresses all later callbacks, releases session resources, and invalidates * core. Calls admitted before destruction are accounted safely, but no API call * may begin after OK. BUSY retains core, context, and callback ownership and * requires a later retry. */ verse_status_t verse_core_destroy_v1(verse_core_t *core, uint32_t timeout_ms); #if defined(__APPLE__) && defined(__aarch64__) _Static_assert(sizeof(verse_bytes_view_t) == 16, "verse_bytes_view_t arm64 layout"); _Static_assert(sizeof(verse_core_config_v1_t) == 72, "verse_core_config_v1_t arm64 layout"); _Static_assert(offsetof(verse_core_config_v1_t, sign_admission) == 16, "config callback offset"); _Static_assert(sizeof(verse_connect_request_v1_t) == 40, "verse_connect_request_v1_t arm64 layout"); _Static_assert(offsetof(verse_connect_request_v1_t, manifest_json) == 8, "request view offset"); _Static_assert(sizeof(verse_input_event_v1_t) == 64, "verse_input_event_v1_t arm64 layout"); _Static_assert(sizeof(verse_state_event_v1_t) == 16, "verse_state_event_v1_t arm64 layout"); _Static_assert(sizeof(verse_error_event_v1_t) == 24, "verse_error_event_v1_t arm64 layout"); _Static_assert(sizeof(verse_stats_event_v1_t) == 32, "verse_stats_event_v1_t arm64 layout"); _Static_assert(sizeof(verse_media_event_v1_t) == 40, "verse_media_event_v1_t arm64 layout"); _Static_assert(sizeof(verse_control_event_v1_t) == 32, "verse_control_event_v1_t arm64 layout"); #endif #ifdef __cplusplus } #endif #endif