#![allow(missing_docs)]
use serde::{Deserialize, Serialize};
pub type WireUuid = [u8; 16];
pub type WireSessionId = u64;
pub type WireMemoryId = u128;
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum MemoryKindWire {
Episodic = 0,
Semantic = 1,
Consolidated = 2,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum EdgeKindWire {
Caused = 0,
FollowedBy = 1,
DerivedFrom = 2,
SimilarTo = 3,
Contradicts = 4,
Supports = 5,
References = 6,
PartOf = 7,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum ForgetMode {
Soft = 0,
Hard = 1,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum StageKind {
AutoEdge = 0,
TemporalEdge = 1,
Extractor = 2,
Hype = 3,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct HelloCapabilities {
pub streaming: bool,
pub compression_zstd: bool,
pub server_push: bool,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum AuthMethod {
Token = 0,
Mtls = 1,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum AuthCredentials {
Token(Vec<u8>),
Mtls(MtlsClaim),
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct MtlsClaim {
#[serde(with = "serde_bytes")]
pub cert_fingerprint: [u8; 32],
pub asserted_subject: String,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct SpacePermissions {
pub can_encode: bool,
pub can_recall: bool,
pub can_plan: bool,
pub can_reason: bool,
pub can_forget: bool,
pub can_admin: bool,
pub can_act_as: bool,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ServerFeatures {
pub max_payload_size: u32,
pub max_concurrent_streams: u32,
pub idle_timeout_seconds: u32,
pub auth_methods: Vec<AuthMethod>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct HelloPayload {
pub client_id: String,
pub supported_versions: Vec<u8>,
pub capabilities: HelloCapabilities,
#[serde(with = "serde_bytes")]
pub client_connection_token: Option<[u8; 32]>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct WelcomePayload {
pub server_id: String,
pub chosen_version: u8,
#[serde(with = "serde_bytes")]
pub connection_id: [u8; 16],
pub capabilities: HelloCapabilities,
pub server_features: ServerFeatures,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct AuthPayload {
pub method: AuthMethod,
pub credentials: AuthCredentials,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct AuthOkPayload {
#[serde(with = "serde_bytes")]
pub space_id: WireUuid,
pub bound_shard_id: u16,
pub permissions: SpacePermissions,
pub namespace: String,
pub server_time_unix_nanos: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ActAs {
pub namespace: String,
pub space_id: String,
#[serde(default, skip_serializing_if = "is_zero_u32")]
pub grant: u32,
}
pub mod act_as_grant {
pub const SCHEMA_UPLOAD: u32 = 1 << 4;
pub const ADMIN: u32 = 1 << 5;
}
#[allow(clippy::trivially_copy_pass_by_ref)] fn is_zero_u32(v: &u32) -> bool {
*v == 0
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub struct EdgeRequest {
pub target: WireMemoryId,
pub kind: EdgeKindWire,
pub weight: f32,
}
#[derive(
Clone,
Copy,
Debug,
Default,
Eq,
PartialEq,
serde_repr::Serialize_repr,
serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum WaitMode {
#[default]
Ack = 0,
Derived = 1,
}
impl WaitMode {
#[must_use]
pub fn is_ack(&self) -> bool {
matches!(self, WaitMode::Ack)
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeRequest {
pub text: String,
pub session_id: WireSessionId,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub txn_id: Option<WireUuid>,
pub occurred_at_unix_nanos: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
#[serde(default, skip_serializing_if = "WaitMode::is_ack")]
pub wait: WaitMode,
#[serde(default, skip_serializing_if = "is_false")]
pub allow_duplicates: bool,
}
#[allow(clippy::trivially_copy_pass_by_ref)]
fn is_false(b: &bool) -> bool {
!*b
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeVectorDirectRequest {
pub text: String,
#[serde(skip, default)]
pub vector: Vec<f32>,
#[serde(with = "serde_bytes")]
pub model_fingerprint: [u8; 16],
pub session_id: WireSessionId,
pub kind: MemoryKindWire,
pub salience_hint: f32,
pub edges: Vec<EdgeRequest>,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub txn_id: Option<WireUuid>,
pub deduplicate: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeResponse {
pub memory_id: WireMemoryId,
pub was_deduplicated: bool,
pub salience: f32,
pub auto_edges_added: u32,
pub lsn: u64,
#[serde(with = "serde_bytes")]
pub space_id: WireUuid,
pub session_id: WireSessionId,
pub kind: MemoryKindWire,
pub created_at_unix_nanos: u64,
pub edges_out_count: u32,
#[serde(with = "serde_bytes")]
pub embedding_model_fp: [u8; 16],
pub pending_stages: Vec<StageKind>,
pub has_active_schema: bool,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub trace: Option<EncodeTrace>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeTrace {
pub stages: Vec<EncodeTraceStage>,
pub artifacts: EncodeTraceArtifacts,
pub total_latency_us: u64,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeTraceStage {
pub name: String,
pub status: EncodeTraceStageStatus,
pub latency_us: u64,
pub detail: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub artifact: Option<EncodeStageArtifact>,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum EncodeTraceStageStatus {
Ok = 0,
Skipped = 1,
Failed = 2,
Timeout = 3,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeTraceArtifacts {
pub entities: Vec<EncodeTraceEntity>,
pub statements: Vec<EncodeTraceStatement>,
pub relations: Vec<EncodeTraceRelation>,
pub indexes: Vec<EncodeTraceIndex>,
pub dedup: EncodeTraceDedup,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeTraceEntity {
#[serde(with = "serde_bytes")]
pub id: [u8; 16],
pub name: String,
pub type_qname: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeTraceStatement {
#[serde(with = "serde_bytes")]
pub id: [u8; 16],
pub subject_name: String,
pub predicate: String,
pub object_name: String,
pub confidence: f32,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub event_at_unix_nanos: Option<u64>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeTraceRelation {
pub source_name: String,
pub predicate: String,
pub target_name: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeTraceIndex {
pub name: String,
pub status: EncodeTraceStageStatus,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EncodeTraceDedup {
pub was_deduplicated: bool,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub matched_memory_id: Option<[u8; 16]>,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct EncodeStageArtifact {
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub vector: Vec<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub record: Option<EncodeStageRecord>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub hype_questions: Vec<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub keyword_fields: Vec<EncodeStageKeywordField>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub graph: Option<EncodeStageGraph>,
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeStageRecord {
#[serde(with = "serde_bytes")]
pub memory_id: [u8; 16],
pub kind: u8,
pub salience: f32,
pub created_at_unix_nanos: u64,
pub occurred_at_unix_nanos: u64,
pub vector_dim: u32,
pub text_len: u32,
pub lsn: u64,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeStageKeywordField {
pub field: String,
pub terms: Vec<String>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeGraphNode {
#[serde(with = "serde_bytes")]
pub id: [u8; 16],
pub name: String,
pub kind: String,
pub type_qname: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EncodeGraphEdge {
#[serde(with = "serde_bytes")]
pub source: [u8; 16],
#[serde(with = "serde_bytes")]
pub target: [u8; 16],
pub predicate: String,
pub kind: String,
pub confidence: f32,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub event_at_unix_nanos: Option<u64>,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct EncodeStageGraph {
pub nodes: Vec<EncodeGraphNode>,
pub edges: Vec<EncodeGraphEdge>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct MemoryInspectRequest {
#[serde(with = "serde_bytes")]
pub memory_id: [u8; 16],
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct MemoryInspectResponse {
pub found: bool,
#[serde(with = "serde_bytes")]
pub memory_id: [u8; 16],
pub text: String,
pub artifact: EncodeStageArtifact,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum AnswerKindWire {
Single,
Many,
None,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum RecallScopeWire {
#[default]
Space,
Namespace,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RecallRequest {
pub cue_text: String,
pub subject_name: String,
pub max_results: u32,
pub confidence_threshold: f32,
pub session_filter: Option<Vec<WireSessionId>>,
pub age_bound_unix_nanos: Option<u64>,
pub as_of_record_time_unix_nanos: Option<u64>,
pub kind_filter: Option<Vec<MemoryKindWire>>,
pub salience_floor: f32,
pub include_edges: bool,
pub include_graph: bool,
pub include_text: bool,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub request_id: Option<WireUuid>,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub txn_id: Option<WireUuid>,
#[serde(default)]
pub trace: bool,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
#[serde(default)]
pub scope: RecallScopeWire,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RecallResponseFrame {
pub answer_kind: AnswerKindWire,
pub memories: Vec<MemoryResult>,
pub is_final: bool,
pub cumulative_count: u32,
pub estimated_remaining: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub trace: Option<RecallTrace>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RecallTrace {
pub retrievers: Vec<RecallTraceRetriever>,
pub filter_chain: RecallTraceFilterChain,
pub rerank: Option<RecallTraceRerank>,
pub total_latency_ms: f64,
pub fusion: Option<RecallTraceFusion>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RecallTraceRetriever {
pub name: RetrieverNameWire,
pub status: RecallTraceRetrieverStatus,
pub status_detail: String,
pub latency_ms: f64,
pub candidate_count: u32,
pub candidates: Vec<RecallTraceCandidate>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RecallTraceCandidate {
pub item_id: WireMemoryId,
pub kind: RecallCandidateKind,
pub text: String,
pub score: f32,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum RecallCandidateKind {
Memory = 0,
Statement = 1,
Entity = 2,
Relation = 3,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum RecallTraceRetrieverStatus {
Success = 0,
Skipped = 1,
Timeout = 2,
Failure = 3,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum RankedItemKindWire {
Memory = 0,
Statement = 1,
Entity = 2,
Relation = 3,
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub struct RecallTraceDroppedId {
pub kind: RankedItemKindWire,
pub id: u128,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RecallTraceFilterChain {
pub before: u32,
pub after_type: u32,
pub after_temporal: u32,
pub after_confidence: u32,
pub after_tombstone: u32,
pub after_supersession: u32,
pub after_as_of: u32,
pub after_limit: u32,
pub dropped_by_type: Vec<WireMemoryId>,
pub dropped_by_temporal: Vec<WireMemoryId>,
pub dropped_by_confidence: Vec<WireMemoryId>,
pub dropped_by_tombstone: Vec<WireMemoryId>,
pub dropped_by_supersession: Vec<RecallTraceDroppedId>,
pub dropped_by_as_of: Vec<RecallTraceDroppedId>,
pub dropped_by_limit: Vec<RecallTraceDroppedId>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RecallTraceRerank {
pub applied: bool,
pub candidates: u32,
pub latency_ms: f64,
pub before_order: Vec<WireMemoryId>,
pub after_order: Vec<WireMemoryId>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RecallTraceFusion {
pub items: Vec<RecallTraceFusionItem>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RecallTraceFusionItem {
pub memory_id: WireMemoryId,
pub rrf_score: f32,
pub lane_scores: Vec<(RetrieverNameWire, f32)>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct MemoryResult {
pub memory_id: WireMemoryId,
pub text: String,
pub similarity_score: f32,
pub confidence: f32,
pub salience: f32,
pub kind: MemoryKindWire,
#[serde(with = "serde_bytes")]
pub space_id: WireUuid,
pub session_id: WireSessionId,
pub created_at_unix_nanos: u64,
pub last_accessed_at_unix_nanos: u64,
pub edges: Option<Vec<EdgeView>>,
pub contributing_retrievers: Vec<RetrieverNameWire>,
pub fused_score: f32,
pub rerank_score: Option<f32>,
pub salience_initial: f32,
pub access_count: u32,
pub lsn: u64,
pub flags: u32,
pub consolidated_at_unix_nanos: Option<u64>,
pub occurred_at_unix_nanos: Option<u64>,
pub edges_out_count: u32,
pub edges_in_count: u32,
pub graph: Option<GraphEnrichment>,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum RetrieverNameWire {
Semantic = 0,
Lexical = 1,
Graph = 2,
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub struct EdgeView {
pub target: WireMemoryId,
pub kind: EdgeKindWire,
pub weight: f32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct GraphEnrichment {
pub entities: Vec<EnrichedEntity>,
pub statements: Vec<EnrichedStatement>,
pub relations: Vec<EnrichedRelation>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EnrichedEntity {
#[serde(with = "serde_bytes")]
pub id: [u8; 16],
pub name: String,
pub type_qname: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EnrichedStatement {
#[serde(with = "serde_bytes")]
pub id: [u8; 16],
pub subject_name: String,
pub predicate: String,
pub object_label: String,
#[serde(default, with = "crate::wire::cbor::opt_byte_array16")]
pub object_entity_id: Option<[u8; 16]>,
pub confidence: f32,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub event_at_unix_nanos: Option<u64>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EnrichedRelation {
pub from_name: String,
pub predicate: String,
pub to_name: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ForgetRequest {
pub memory_id: WireMemoryId,
pub mode: ForgetMode,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub txn_id: Option<WireUuid>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ForgetResponse {
pub memory_id: WireMemoryId,
pub was_already_forgotten: bool,
pub edges_removed: u32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct LinkRequest {
pub source: WireMemoryId,
pub target: WireMemoryId,
pub kind: EdgeKindWire,
pub weight: f32,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub txn_id: Option<WireUuid>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub struct LinkResponse {
pub source: WireMemoryId,
pub target: WireMemoryId,
pub kind: EdgeKindWire,
pub weight: f32,
pub created_at_unix_nanos: u64,
pub already_existed: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct UnlinkRequest {
pub source: WireMemoryId,
pub target: WireMemoryId,
pub kind: EdgeKindWire,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub txn_id: Option<WireUuid>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct UnlinkResponse {
pub source: WireMemoryId,
pub target: WireMemoryId,
pub kind: EdgeKindWire,
pub removed: bool,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum MemoryListSortWire {
Created = 0,
Salience = 1,
Occurred = 2,
LastAccessed = 3,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum MemoryListDirWire {
Asc = 0,
Desc = 1,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum MemoryListTimeAxisWire {
Created = 0,
Occurred = 1,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct MemoryListRequest {
pub sort: MemoryListSortWire,
pub dir: MemoryListDirWire,
pub limit: u32,
pub cursor: Vec<u8>,
pub kinds: Vec<MemoryKindWire>,
pub include_tombstoned: bool,
pub time_axis: MemoryListTimeAxisWire,
pub from_unix_nanos: u64,
pub to_unix_nanos: u64,
pub salience_min: f32,
pub salience_max: f32,
pub text_contains: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct MemoryListItem {
#[serde(with = "serde_bytes")]
pub memory_id: [u8; 16],
#[serde(with = "serde_bytes")]
pub space_id: [u8; 16],
pub session_id: WireSessionId,
pub text: String,
pub kind: u8,
pub state: u8,
pub created_at_unix_nanos: u64,
pub occurred_at_unix_nanos: u64,
pub last_accessed_at_unix_nanos: u64,
pub salience: f32,
pub access_count: u32,
#[serde(with = "serde_bytes")]
pub source_request_id: [u8; 16],
pub statement_count: u32,
pub entity_count: u32,
pub relation_count: u32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct MemoryListResponseFrame {
pub items: Vec<MemoryListItem>,
pub next_cursor: Vec<u8>,
pub cumulative_count: u32,
pub is_final: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct GraphNode {
#[serde(with = "serde_bytes")]
pub id: [u8; 16],
pub kind: u8,
pub label: String,
pub type_qname: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct GraphEdge {
#[serde(with = "serde_bytes")]
pub from_id: [u8; 16],
#[serde(with = "serde_bytes")]
pub to_id: [u8; 16],
pub kind: u8,
pub label: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct GraphFetchRequest {
pub limit: u32,
pub cursor: Vec<u8>,
pub include_statements: bool,
pub include_memories: bool,
pub include_memory_edges: bool,
pub include_tombstoned: bool,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct GraphFetchResponseFrame {
pub nodes: Vec<GraphNode>,
pub edges: Vec<GraphEdge>,
pub next_cursor: Vec<u8>,
pub is_final: bool,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum PlanStrategy {
Auto = 0,
AStar = 1,
Mcts = 2,
AttractorRollout = 3,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum PlanState {
ByMemoryId(WireMemoryId),
ByText(String),
ByVector { offset: u32, dim: u16 },
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PlanBudget {
pub max_steps: u32,
pub max_wall_time_ms: u32,
pub max_branches_explored: u32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PlanRequest {
pub start: PlanState,
pub goal: PlanState,
pub budget: PlanBudget,
pub strategy_hint: Option<PlanStrategy>,
pub session_filter: Option<Vec<WireSessionId>>,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub request_id: Option<WireUuid>,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub txn_id: Option<WireUuid>,
#[serde(default)]
pub trace: bool,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum PlanStatus {
GoalReached = 0,
BudgetExhausted = 1,
NoPathFound = 2,
Cancelled = 3,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum TransitionKind {
Initial,
Causal,
Temporal,
Similarity,
Other(String),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PlanStep {
pub step_index: u32,
pub memory_id: WireMemoryId,
pub text: String,
pub transition_kind: TransitionKind,
pub confidence: f32,
pub estimated_distance_to_goal: f32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PlanResponseFrame {
pub steps: Vec<PlanStep>,
pub is_final: bool,
pub plan_status: Option<PlanStatus>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub trace: Option<PlanTrace>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PlanTrace {
pub explored: Vec<PlanTraceNode>,
pub meeting_points: Vec<PlanTraceMeetingPoint>,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum PlanTraceDirection {
Forward = 0,
Backward = 1,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PlanTraceNode {
pub memory_id: WireMemoryId,
pub text: String,
pub direction: PlanTraceDirection,
pub depth: u32,
pub parent_edge: Option<WireMemoryId>,
pub alignment_score: Option<f32>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct PlanTraceMeetingPoint {
pub memory_id: WireMemoryId,
pub text: String,
pub included_in_result: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum ObservationInput {
ByMemoryId(WireMemoryId),
ByText(String),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonRequest {
pub observation: ObservationInput,
pub depth: u32,
pub confidence_threshold: f32,
pub session_filter: Option<Vec<WireSessionId>>,
pub max_inferences: u32,
pub budget_wall_time_ms: u32,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub request_id: Option<WireUuid>,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub txn_id: Option<WireUuid>,
#[serde(default)]
pub trace: bool,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum ReasonStatus {
Complete = 0,
BudgetExhausted = 1,
DepthLimitReached = 2,
Cancelled = 3,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum InferenceKind {
CausalExplanation,
EvidenceAccumulation,
AnalogicalInference,
Other(String),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct InferenceStep {
pub step_index: u32,
pub claim: String,
pub supporting_memories: Vec<WireMemoryId>,
pub contradicting_memories: Vec<WireMemoryId>,
pub confidence: f32,
pub inference_kind: InferenceKind,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonResponseFrame {
pub inferences: Vec<InferenceStep>,
pub is_final: bool,
pub reason_status: Option<ReasonStatus>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub trace: Option<ReasonTrace>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonTrace {
pub base: ReasonTraceBase,
pub walk: ReasonTraceWalk,
pub scoring: Vec<ReasonTraceScoreBreakdown>,
pub centroid: ReasonTraceCentroid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonTraceBase {
pub candidates: Vec<ReasonTraceCandidate>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonTraceCandidate {
pub memory_id: WireMemoryId,
pub text: String,
pub score: f32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonTraceWalk {
pub considered: Vec<ReasonTraceEdgeCandidate>,
pub dropped_by_edge_kind: Vec<ReasonTraceEdgeCandidate>,
pub dropped_by_tombstone: Vec<ReasonTraceIdWithText>,
pub dropped_by_visited: Vec<ReasonTraceIdWithText>,
pub dropped_by_confidence: Vec<ReasonTraceScoredId>,
pub dropped_by_max_supporting: Vec<ReasonTraceIdWithText>,
pub dropped_by_max_contradicting: Vec<ReasonTraceIdWithText>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonTraceEdgeCandidate {
pub memory_id: WireMemoryId,
pub text: String,
pub edge_kind: EdgeKindWire,
pub depth: u32,
pub from_memory_id: WireMemoryId,
pub raw_score: f32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonTraceIdWithText {
pub memory_id: WireMemoryId,
pub text: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonTraceScoredId {
pub memory_id: WireMemoryId,
pub text: String,
pub score: f32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonTraceScoreBreakdown {
pub memory_id: WireMemoryId,
pub text: String,
pub base_similarity: f32,
pub decay: f32,
pub weight_product: f32,
pub alignment: f32,
pub analogical_fit: f32,
pub final_score: f32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ReasonTraceCentroid {
pub computed: bool,
pub skipped_reason: Option<String>,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum ErrorCategoryWire {
Protocol = 0,
Authentication = 1,
Authorization = 2,
Validation = 3,
NotFound = 4,
Conflict = 5,
ResourceExhausted = 6,
Internal = 7,
Unavailable = 8,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr)]
#[repr(u16)]
pub enum ErrorCodeWire {
BadMagic = 0x0001,
BadHeaderCrc = 0x0002,
BadPayloadCrc = 0x0003,
BadOpcode = 0x0004,
BadVersion = 0x0005,
BadFrame = 0x0006,
OversizePayload = 0x0007,
ReservedFieldNonZero = 0x0008,
BadFlagCombination = 0x0009,
MalformedPayload = 0x000A,
MalformedVector = 0x000B,
VersionNotSupported = 0x0020,
NoSuchAuthMethod = 0x0021,
Unauthenticated = 0x0022,
NotAuthenticated = 0x0023,
AuthBackendUnavailable = 0x0024,
SessionExpired = 0x0025,
PermissionDenied = 0x0030,
AdminPermissionRequired = 0x0031,
WrongShard = 0x0032,
ActAsDenied = 0x0033,
InvalidArgument = 0x0040,
MissingRequiredField = 0x0041,
TextTooLarge = 0x0042,
TextEmpty = 0x0043,
BadSessionId = 0x0044,
BadMemoryKind = 0x0045,
BadEdgeKind = 0x0046,
BadStrategyHint = 0x0047,
TopKOutOfRange = 0x0048,
BudgetTooLarge = 0x0049,
BadModelFingerprint = 0x004A,
PredicateNotInSchema = 0x004B,
RelationTypeNotInSchema = 0x004C,
MemoryNotFound = 0x0050,
ContextNotFound = 0x0051,
SubscriptionNotFound = 0x0052,
SnapshotNotFound = 0x0053,
TxnNotFound = 0x0054,
IdempotencyConflict = 0x0060,
TransactionConflict = 0x0061,
TransactionTimeout = 0x0062,
StreamIdInUse = 0x0063,
SubscriptionLsnTooOld = 0x0064,
CardinalityViolation = 0x0065,
LlmCredentialMissing = 0x0066,
OutOfSlots = 0x0070,
OutOfDisk = 0x0071,
OutOfMemory = 0x0072,
RateLimited = 0x0073,
StreamLimitExceeded = 0x0074,
ConnectionLimitExceeded = 0x0075,
TransactionLimitExceeded = 0x0076,
TransactionTooLarge = 0x0077,
Internal = 0x0080,
StorageError = 0x0081,
IndexError = 0x0082,
EmbeddingError = 0x0083,
MetadataError = 0x0084,
Cancelled = 0x0085,
ShardUnavailable = 0x0090,
Overloaded = 0x0091,
Restarting = 0x0092,
Maintenance = 0x0093,
RetrieverDegraded = 0x0094,
LlmCredentialUnavailable = 0x0095,
SchemaInvalid = 0x0120,
SchemaMigrationRequired = 0x0121,
EntityNotFound = 0x0130,
EntityTypeMismatch = 0x0131,
EntityAmbiguous = 0x0132,
EntityMergeConflict = 0x0133,
StatementNotFound = 0x0140,
StatementObjectTypeMismatch = 0x0141,
StatementContradictsExisting = 0x0142,
QueryTimeout = 0x0160,
QueryOverBudget = 0x0161,
ExtractorDisabled = 0x0170,
ExtractorBudgetExceeded = 0x0171,
ExtractionFailed = 0x0172,
Unknown = 0xFFFF,
}
impl ErrorCodeWire {
#[must_use]
pub fn from_raw(raw: u16) -> Self {
match raw {
0x0001 => Self::BadMagic,
0x0002 => Self::BadHeaderCrc,
0x0003 => Self::BadPayloadCrc,
0x0004 => Self::BadOpcode,
0x0005 => Self::BadVersion,
0x0006 => Self::BadFrame,
0x0007 => Self::OversizePayload,
0x0008 => Self::ReservedFieldNonZero,
0x0009 => Self::BadFlagCombination,
0x000A => Self::MalformedPayload,
0x000B => Self::MalformedVector,
0x0020 => Self::VersionNotSupported,
0x0021 => Self::NoSuchAuthMethod,
0x0022 => Self::Unauthenticated,
0x0023 => Self::NotAuthenticated,
0x0024 => Self::AuthBackendUnavailable,
0x0025 => Self::SessionExpired,
0x0030 => Self::PermissionDenied,
0x0031 => Self::AdminPermissionRequired,
0x0032 => Self::WrongShard,
0x0033 => Self::ActAsDenied,
0x0040 => Self::InvalidArgument,
0x0041 => Self::MissingRequiredField,
0x0042 => Self::TextTooLarge,
0x0043 => Self::TextEmpty,
0x0044 => Self::BadSessionId,
0x0045 => Self::BadMemoryKind,
0x0046 => Self::BadEdgeKind,
0x0047 => Self::BadStrategyHint,
0x0048 => Self::TopKOutOfRange,
0x0049 => Self::BudgetTooLarge,
0x004A => Self::BadModelFingerprint,
0x004B => Self::PredicateNotInSchema,
0x004C => Self::RelationTypeNotInSchema,
0x0050 => Self::MemoryNotFound,
0x0051 => Self::ContextNotFound,
0x0052 => Self::SubscriptionNotFound,
0x0053 => Self::SnapshotNotFound,
0x0054 => Self::TxnNotFound,
0x0060 => Self::IdempotencyConflict,
0x0061 => Self::TransactionConflict,
0x0062 => Self::TransactionTimeout,
0x0063 => Self::StreamIdInUse,
0x0064 => Self::SubscriptionLsnTooOld,
0x0065 => Self::CardinalityViolation,
0x0070 => Self::OutOfSlots,
0x0071 => Self::OutOfDisk,
0x0072 => Self::OutOfMemory,
0x0073 => Self::RateLimited,
0x0074 => Self::StreamLimitExceeded,
0x0075 => Self::ConnectionLimitExceeded,
0x0076 => Self::TransactionLimitExceeded,
0x0077 => Self::TransactionTooLarge,
0x0080 => Self::Internal,
0x0081 => Self::StorageError,
0x0082 => Self::IndexError,
0x0083 => Self::EmbeddingError,
0x0084 => Self::MetadataError,
0x0085 => Self::Cancelled,
0x0090 => Self::ShardUnavailable,
0x0091 => Self::Overloaded,
0x0092 => Self::Restarting,
0x0093 => Self::Maintenance,
0x0094 => Self::RetrieverDegraded,
0x0120 => Self::SchemaInvalid,
0x0121 => Self::SchemaMigrationRequired,
0x0130 => Self::EntityNotFound,
0x0131 => Self::EntityTypeMismatch,
0x0132 => Self::EntityAmbiguous,
0x0133 => Self::EntityMergeConflict,
0x0140 => Self::StatementNotFound,
0x0141 => Self::StatementObjectTypeMismatch,
0x0142 => Self::StatementContradictsExisting,
0x0160 => Self::QueryTimeout,
0x0161 => Self::QueryOverBudget,
0x0170 => Self::ExtractorDisabled,
0x0171 => Self::ExtractorBudgetExceeded,
0x0172 => Self::ExtractionFailed,
0x0066 => Self::LlmCredentialMissing,
0x0095 => Self::LlmCredentialUnavailable,
_ => Self::Unknown,
}
}
}
impl<'de> serde::Deserialize<'de> for ErrorCodeWire {
fn deserialize<D: serde::Deserializer<'de>>(d: D) -> Result<Self, D::Error> {
Ok(Self::from_raw(u16::deserialize(d)?))
}
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ErrorDetails {
pub field: Option<String>,
pub expected: Option<String>,
pub actual: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct ErrorResponse {
pub code: ErrorCodeWire,
pub category: ErrorCategoryWire,
pub message: String,
pub details: Option<ErrorDetails>,
pub retry_after_ms: Option<u32>,
}
impl ErrorResponse {
#[must_use]
pub fn code_is_unknown(&self) -> bool {
self.code == ErrorCodeWire::Unknown
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum StatementKindWire {
Fact,
Preference,
Event,
Attribute,
Relation,
Directive,
Custom(u8),
}
impl StatementKindWire {
#[must_use]
pub fn to_storage_byte(self) -> u8 {
match self {
StatementKindWire::Fact => 0,
StatementKindWire::Preference => 1,
StatementKindWire::Event => 2,
StatementKindWire::Attribute => 3,
StatementKindWire::Relation => 4,
StatementKindWire::Directive => 5,
StatementKindWire::Custom(b) => b,
}
}
#[must_use]
pub fn from_storage_byte(byte: u8) -> Self {
match byte {
0 => StatementKindWire::Fact,
1 => StatementKindWire::Preference,
2 => StatementKindWire::Event,
3 => StatementKindWire::Attribute,
4 => StatementKindWire::Relation,
5 => StatementKindWire::Directive,
b => StatementKindWire::Custom(b),
}
}
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum StatementValueWire {
Text(String),
Integer(i64),
Float(f64),
Bool(bool),
UnixNanos(u64),
Blob(Vec<u8>),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum StatementObjectWire {
EntityRef(#[serde(with = "serde_bytes")] WireUuid),
Value(StatementValueWire),
MemoryRef(#[serde(with = "serde_bytes")] [u8; 16]),
StatementRef(#[serde(with = "serde_bytes")] WireUuid),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum EvidenceRefWire {
Inline(#[serde(with = "crate::wire::cbor::vec_byte_array16")] Vec<[u8; 16]>),
Overflow(#[serde(with = "serde_bytes")] WireUuid),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityCreateRequest {
pub entity_type_id: u32,
pub canonical_name: String,
pub aliases: Vec<String>,
pub attributes_blob: Vec<u8>,
#[serde(default)]
pub session_id: WireSessionId,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityUpdateRequest {
#[serde(with = "serde_bytes")]
pub entity_id: WireUuid,
pub canonical_name: String,
pub aliases: Vec<String>,
pub attributes_blob: Vec<u8>,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityUpdateResponse {
pub entity: EntityView,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityRenameRequest {
#[serde(with = "serde_bytes")]
pub entity_id: WireUuid,
pub new_canonical_name: String,
pub move_to_alias: bool,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityRenameResponse {
pub entity: EntityView,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityMergeRequest {
#[serde(with = "serde_bytes")]
pub survivor: WireUuid,
#[serde(with = "serde_bytes")]
pub merged: WireUuid,
pub confidence: f32,
pub reason: String,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EntityMergeResponse {
#[serde(with = "serde_bytes")]
pub audit_id: WireUuid,
pub grace_period_seconds: u64,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityUnmergeRequest {
#[serde(with = "serde_bytes")]
pub merged_entity: WireUuid,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EntityUnmergeResponse {
#[serde(with = "serde_bytes")]
pub restored_entity_id: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityTombstoneRequest {
#[serde(with = "serde_bytes")]
pub entity_id: WireUuid,
pub reason: String,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EntityTombstoneResponse {
pub tombstoned_at_unix_nanos: u64,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EntityCreateResponse {
#[serde(with = "serde_bytes")]
pub entity_id: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementCreateRequest {
pub kind: StatementKindWire,
#[serde(with = "serde_bytes")]
pub subject: WireUuid,
pub predicate: String,
pub object: StatementObjectWire,
pub confidence: f32,
pub evidence: EvidenceRefWire,
pub extractor_id: u32,
pub valid_from_unix_nanos: u64,
pub valid_to_unix_nanos: u64,
pub event_at_unix_nanos: u64,
pub schema_version: u32,
#[serde(default)]
pub session_id: WireSessionId,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StatementCreateResponse {
#[serde(with = "serde_bytes")]
pub statement_id: WireUuid,
#[serde(with = "serde_bytes")]
pub auto_superseded: WireUuid,
#[serde(with = "serde_bytes")]
pub chain_root: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementSupersedeRequest {
#[serde(with = "serde_bytes")]
pub old_statement_id: WireUuid,
pub new_statement: StatementCreateRequest,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StatementSupersedeResponse {
#[serde(with = "serde_bytes")]
pub new_statement_id: WireUuid,
#[serde(with = "serde_bytes")]
pub chain_root: WireUuid,
pub version: u32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementTombstoneRequest {
#[serde(with = "serde_bytes")]
pub statement_id: WireUuid,
pub reason: u8,
pub reason_message: String,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StatementTombstoneResponse {
pub tombstoned_at_unix_nanos: u64,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementRetractRequest {
#[serde(with = "serde_bytes")]
pub statement_id: WireUuid,
pub reason: u8,
pub reason_message: String,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StatementRetractResponse {
pub retracted_at_unix_nanos: u64,
pub will_zero_at_unix_nanos: u64,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementHistoryRequest {
#[serde(with = "serde_bytes")]
pub anchor_id: WireUuid,
pub include_tombstoned: bool,
pub limit: u32,
pub cursor: Vec<u8>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementHistoryResponseFrame {
pub items: Vec<StatementView>,
#[serde(with = "serde_bytes")]
pub chain_root: WireUuid,
pub total_versions: u32,
pub next_cursor: Vec<u8>,
pub is_final: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationCreateRequest {
pub relation_type: String,
#[serde(with = "serde_bytes")]
pub from_entity: WireUuid,
#[serde(with = "serde_bytes")]
pub to_entity: WireUuid,
pub properties_blob: Vec<u8>,
pub evidence: EvidenceRefWire,
pub extractor_id: u32,
pub confidence: f32,
pub valid_from_unix_nanos: u64,
pub valid_to_unix_nanos: u64,
#[serde(default)]
pub session_id: WireSessionId,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct RelationCreateResponse {
#[serde(with = "serde_bytes")]
pub relation_id: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaUploadRequest {
pub schema_document: String,
pub dry_run: bool,
pub allow_breaking: bool,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaValidationErrorWire {
pub code: String,
pub message: String,
pub line: u32,
pub column: u32,
pub length: u32,
pub severity: u8,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaUploadResponse {
pub namespace: String,
pub schema_version: u32,
pub validation_errors: Vec<SchemaValidationErrorWire>,
pub backward_compatible: bool,
pub migration_summary_blob: Vec<u8>,
}
pub mod schema_drop_target {
pub const PREDICATE: u8 = 0;
pub const RELATION_TYPE: u8 = 1;
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaDropRequest {
pub namespace: String,
pub target_kind: u8,
pub target_name: String,
pub force: bool,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaDropResponse {
pub namespace: String,
pub schema_version: u32,
pub target_kind: u8,
pub target_name: String,
pub dropped: bool,
pub live_rows: u32,
pub validation_errors: Vec<SchemaValidationErrorWire>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaReplaceRequest {
pub schema_document: String,
pub force_drop_existing: bool,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaReplaceResponse {
pub namespace: String,
pub schema_version: u32,
pub dropped_count: u32,
pub validation_errors: Vec<SchemaValidationErrorWire>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum CancellationReason {
ClientUnneeded,
Timeout,
Other(String),
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct CancelStreamRequest {
pub target_stream_id: u32,
pub reason: CancellationReason,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct CancelStreamAck {
pub target_stream_id: u32,
pub cancelled_at_unix_nanos: u64,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct TimeRangeWire {
pub from_unix_ms: Option<u64>,
pub to_unix_ms: Option<u64>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[repr(u8)]
pub enum RetrieverWire {
Semantic = 0,
Lexical = 1,
Graph = 2,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum RetrieverSelectionWire {
Auto,
Explicit(Vec<RetrieverWire>),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct FusionConfigWire {
pub k: u32,
pub semantic_weight: f32,
pub lexical_weight: f32,
pub graph_weight: f32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct QueryRequest {
pub text: String,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub entity_anchor: Option<WireUuid>,
pub kind_filter: Vec<u8>,
pub predicate_filter: Vec<String>,
pub session_filter: Option<Vec<WireSessionId>>,
pub time_filter: Option<TimeRangeWire>,
pub as_of_record_time_unix_nanos: Option<u64>,
pub confidence_min: Option<f32>,
pub include_tombstoned: bool,
pub include_superseded: bool,
pub limit: u32,
pub retrievers: RetrieverSelectionWire,
pub fusion_config: Option<FusionConfigWire>,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct MaterializeProceduralRequest {
#[serde(with = "serde_bytes")]
pub space_id: WireUuid,
pub session_filter: Option<Vec<WireSessionId>>,
pub top_k: u32,
pub min_confidence: f32,
pub categories: Vec<String>,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct MaterializeProceduralResponse {
pub system_block: String,
#[serde(with = "crate::wire::cbor::vec_byte_array16")]
pub statement_ids: Vec<WireUuid>,
pub total_candidates: u32,
pub trimmed_by_budget: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SpaceView {
pub space_id: String,
pub created_at_unix_nanos: u64,
pub last_active_unix_nanos: u64,
pub memory_count: u64,
pub session_count: u32,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SpaceCreateRequest {
#[serde(skip_serializing_if = "Option::is_none", default)]
pub metadata: Option<Vec<u8>>,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SpaceCreateResponse {
pub space_id: String,
pub created: bool,
pub created_at_unix_nanos: u64,
pub last_active_unix_nanos: u64,
pub memory_count: u64,
pub session_count: u32,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SpaceListRequest {
pub limit: u32,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SpaceListResponse {
pub spaces: Vec<SpaceView>,
pub cross_shard_complete: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SpaceDeleteRequest {
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SpaceDeleteResponse {
pub space_id: String,
pub existed: bool,
pub memories_forgotten: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SessionView {
pub session_id: WireSessionId,
pub created_at_unix_nanos: u64,
pub last_active_unix_nanos: u64,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub title: Option<String>,
pub memory_count: u32,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SessionCreateRequest {
pub session_id: WireSessionId,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub title: Option<String>,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SessionCreateResponse {
#[serde(with = "serde_bytes")]
pub space_id: WireUuid,
pub session_id: WireSessionId,
pub created: bool,
pub created_at_unix_nanos: u64,
pub last_active_unix_nanos: u64,
pub memory_count: u32,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SessionListRequest {
pub limit: u32,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SessionListResponse {
#[serde(with = "serde_bytes")]
pub space_id: WireUuid,
pub sessions: Vec<SessionView>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SessionDeleteRequest {
pub session_id: WireSessionId,
#[serde(default)]
pub hard: bool,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SessionDeleteResponse {
#[serde(with = "serde_bytes")]
pub space_id: WireUuid,
pub session_id: WireSessionId,
pub existed: bool,
pub memories_forgotten: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct TxnBeginRequest {
#[serde(with = "serde_bytes")]
pub txn_id: WireUuid,
pub timeout_seconds: u32,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct TxnBeginResponse {
#[serde(with = "serde_bytes")]
pub txn_id: WireUuid,
pub timeout_seconds: u32,
pub started_at_unix_nanos: u64,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct TxnCommitRequest {
#[serde(with = "serde_bytes")]
pub txn_id: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct TxnCommitResponse {
#[serde(with = "serde_bytes")]
pub txn_id: WireUuid,
pub committed_at_unix_nanos: u64,
pub operations_applied: u32,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct TxnAbortRequest {
#[serde(with = "serde_bytes")]
pub txn_id: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct TxnAbortResponse {
#[serde(with = "serde_bytes")]
pub txn_id: WireUuid,
pub operations_discarded: u32,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum EventType {
Encoded = 0,
Forgotten = 1,
Reclaimed = 2,
KindChanged = 3,
EntityCreated = 16,
EntityUpdated = 17,
EntityRenamed = 18,
EntityMerged = 19,
EntityUnmerged = 20,
EntityTombstoned = 21,
StatementCreated = 22,
StatementSuperseded = 23,
StatementTombstoned = 24,
RelationCreated = 25,
RelationSuperseded = 26,
StageCompleted = 27,
SchemaUpdated = 29,
RelationTombstoned = 30,
EdgeAdded = 31,
EdgeRemoved = 32,
EdgeSuperseded = 33,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum StageOutcome {
Ok = 0,
Empty = 1,
Failed = 2,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum StageAuditStatus {
Succeeded = 0,
PartiallyApplied = 1,
Failed = 2,
Skipped = 3,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StageAutoEdgePayload {
pub edges_written: u32,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StageTemporalEdgePayload {
pub edges_written: u32,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StageExtractorPayload {
pub entity_count: u32,
pub statement_count: u32,
pub relation_count: u32,
pub audit_status: StageAuditStatus,
pub error_message: String,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StageHypePayload {
pub questions_written: u32,
pub cost_micro_usd: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum StagePayload {
AutoEdge(StageAutoEdgePayload),
TemporalEdge(StageTemporalEdgePayload),
Extractor(StageExtractorPayload),
Hype(StageHypePayload),
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub struct SimilarityFilter {
pub reference_memory_id: WireMemoryId,
pub threshold: f32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct SubscriptionFilter {
pub session_filter: Option<Vec<WireSessionId>>,
pub kinds: Option<Vec<MemoryKindWire>>,
pub similar_to: Option<SimilarityFilter>,
#[serde(with = "crate::wire::cbor::opt_vec_byte_array16")]
pub spaces: Option<Vec<WireUuid>>,
pub memory_ids: Option<Vec<WireMemoryId>>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct SubscribeRequest {
pub filter: SubscriptionFilter,
pub include_history: bool,
pub from_lsn: Option<u64>,
pub max_inflight: u32,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EdgeEventPayload {
pub from_kind: u8,
#[serde(with = "serde_bytes")]
pub from_id: WireUuid,
pub to_kind: u8,
#[serde(with = "serde_bytes")]
pub to_id: WireUuid,
pub edge_kind_tag: u8,
pub edge_kind_byte: u8,
pub relation_type_id: Option<u32>,
pub weight: f32,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub relation_id: Option<WireUuid>,
#[serde(with = "crate::wire::cbor::opt_byte_array16")]
pub superseded_relation_id: Option<WireUuid>,
pub origin: u8,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct SubscriptionEvent {
pub event_type: EventType,
pub memory_id: WireMemoryId,
pub session_id: WireSessionId,
pub text: String,
pub kind: MemoryKindWire,
pub salience: f32,
pub timestamp_unix_nanos: u64,
pub lsn: u64,
pub graph_payload: Option<GraphEventPayload>,
pub edge_payload: Option<EdgeEventPayload>,
pub stage_kind: Option<StageKind>,
pub stage_outcome: Option<StageOutcome>,
pub stage_payload: Option<StagePayload>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct UnsubscribeRequest {
pub target_stream_id: u32,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct UnsubscribeResponse {
pub target_stream_id: u32,
pub final_lsn: u64,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub enum GraphEventPayload {
EntityCreated(EntityCreatedEvent),
EntityUpdated(EntityUpdatedEvent),
EntityRenamed(EntityRenamedEvent),
EntityMerged(EntityMergedEvent),
EntityUnmerged(EntityUnmergedEvent),
EntityTombstoned(EntityTombstonedEvent),
StatementCreated(StatementCreatedEvent),
StatementSuperseded(StatementSupersededEvent),
StatementTombstoned(StatementTombstonedEvent),
RelationCreated(RelationCreatedEvent),
RelationSuperseded(RelationSupersededEvent),
RelationTombstoned(RelationTombstonedEvent),
SchemaUpdated(SchemaUpdatedEvent),
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityCreatedEvent {
#[serde(with = "serde_bytes")]
pub entity_id: WireUuid,
pub entity_type_id: u32,
pub canonical_name: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityUpdatedEvent {
#[serde(with = "serde_bytes")]
pub entity_id: WireUuid,
pub entity_type_id: u32,
pub canonical_name: String,
pub embedding_version_changed: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityRenamedEvent {
#[serde(with = "serde_bytes")]
pub entity_id: WireUuid,
pub old_canonical_name: String,
pub new_canonical_name: String,
pub old_moved_to_alias: bool,
}
#[derive(Clone, Copy, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityMergedEvent {
#[serde(with = "serde_bytes")]
pub survivor: WireUuid,
#[serde(with = "serde_bytes")]
pub merged: WireUuid,
#[serde(with = "serde_bytes")]
pub audit_id: WireUuid,
pub confidence: f32,
pub statements_rerouted: u32,
pub relations_rerouted: u32,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EntityUnmergedEvent {
#[serde(with = "serde_bytes")]
pub restored_entity_id: WireUuid,
#[serde(with = "serde_bytes")]
pub from_survivor: WireUuid,
#[serde(with = "serde_bytes")]
pub audit_id: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityTombstonedEvent {
#[serde(with = "serde_bytes")]
pub entity_id: WireUuid,
pub reason: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementCreatedEvent {
#[serde(with = "serde_bytes")]
pub statement_id: WireUuid,
pub kind: u8,
#[serde(with = "serde_bytes")]
pub subject: WireUuid,
pub predicate: String,
pub confidence: f32,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StatementSupersededEvent {
#[serde(with = "serde_bytes")]
pub old_statement_id: WireUuid,
#[serde(with = "serde_bytes")]
pub new_statement_id: WireUuid,
#[serde(with = "serde_bytes")]
pub chain_root: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementTombstonedEvent {
#[serde(with = "serde_bytes")]
pub statement_id: WireUuid,
pub reason: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationCreatedEvent {
#[serde(with = "serde_bytes")]
pub relation_id: WireUuid,
pub relation_type: String,
#[serde(with = "serde_bytes")]
pub from: WireUuid,
#[serde(with = "serde_bytes")]
pub to: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct RelationSupersededEvent {
#[serde(with = "serde_bytes")]
pub old_relation_id: WireUuid,
#[serde(with = "serde_bytes")]
pub new_relation_id: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationTombstonedEvent {
#[serde(with = "serde_bytes")]
pub relation_id: WireUuid,
pub reason: String,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaUpdatedEvent {
pub namespace: String,
pub from_version: u32,
pub to_version: u32,
pub backward_compatible: bool,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct GetCapabilitiesRequest {
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct Capabilities {
pub rerank: bool,
pub llm_extractor: bool,
pub classifier_extractor: bool,
pub pattern_extractor: bool,
pub schema_namespaces: Vec<String>,
pub vector_dim: u16,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct GetCapabilitiesResponse {
pub capabilities: Capabilities,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct ExtractorListRequest {}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ExtractorListItem {
pub extractor_id: u32,
pub namespace: String,
pub name: String,
pub kind: u8,
pub schema_version: u32,
pub created_at_unix_nanos: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct ExtractorListResponseFrame {
pub items: Vec<ExtractorListItem>,
pub total: u32,
pub is_final: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityView {
#[serde(with = "serde_bytes")]
pub entity_id: WireUuid,
pub entity_type_id: u32,
pub canonical_name: String,
pub normalized_name: String,
pub aliases: Vec<String>,
pub attributes_blob: Vec<u8>,
pub mention_count: u32,
pub created_at_unix_nanos: u64,
pub updated_at_unix_nanos: u64,
#[serde(with = "serde_bytes")]
pub merged_into: WireUuid,
pub embedding_version: u32,
pub flags: u32,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EntityGetRequest {
#[serde(with = "serde_bytes")]
pub entity_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityGetResponse {
pub entity: EntityView,
pub resolved_from: Vec<WireUuid>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityListRequest {
pub entity_type_id: u32,
pub name_prefix: String,
pub mention_count_min: u32,
pub include_tombstoned: bool,
pub include_merged: bool,
pub limit: u32,
pub cursor: Vec<u8>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityListItem {
pub entity: EntityView,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityListResponseFrame {
pub items: Vec<EntityListItem>,
pub next_cursor: Vec<u8>,
pub cumulative_count: u32,
pub is_final: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct EntityResolveRequest {
pub candidate_name: String,
pub resolution_context: String,
pub entity_type_hint: u32,
pub allow_create: bool,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(
Clone, Copy, Debug, Eq, PartialEq, serde_repr::Serialize_repr, serde_repr::Deserialize_repr,
)]
#[repr(u8)]
pub enum ResolutionOutcomeWire {
Resolved = 1,
Created = 2,
Ambiguous = 3,
NotFound = 4,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct EntityResolveResponse {
pub outcome: ResolutionOutcomeWire,
pub tier: u8,
pub confidence: f32,
#[serde(with = "serde_bytes")]
pub resolved_entity: WireUuid,
#[serde(with = "crate::wire::cbor::vec_byte_array16")]
pub candidate_ids: Vec<WireUuid>,
#[serde(with = "serde_bytes")]
pub audit_id: WireUuid,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementView {
#[serde(with = "serde_bytes")]
pub statement_id: WireUuid,
pub kind: StatementKindWire,
#[serde(with = "serde_bytes")]
pub subject: WireUuid,
#[serde(with = "serde_bytes")]
pub subject_pending_audit_id: WireUuid,
pub predicate: String,
pub object: StatementObjectWire,
pub confidence: f32,
pub evidence: EvidenceRefWire,
pub extractor_id: u32,
pub extracted_at_unix_nanos: u64,
pub schema_version: u32,
pub valid_from_unix_nanos: u64,
pub valid_to_unix_nanos: u64,
pub event_at_unix_nanos: u64,
pub version: u32,
#[serde(with = "serde_bytes")]
pub superseded_by: WireUuid,
#[serde(with = "serde_bytes")]
pub supersedes: WireUuid,
#[serde(with = "serde_bytes")]
pub chain_root: WireUuid,
pub tombstoned: bool,
pub tombstoned_at_unix_nanos: u64,
pub tombstone_reason: u8,
pub flags: u32,
pub is_stateful: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct StatementGetRequest {
#[serde(with = "serde_bytes")]
pub statement_id: WireUuid,
pub follow_supersession: bool,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementGetResponse {
pub statement: StatementView,
pub returned_via_supersession: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementListRequest {
#[serde(with = "serde_bytes")]
pub subject: WireUuid,
pub predicate: String,
pub kind: u8,
pub min_confidence: f32,
pub time_range_start_unix_nanos: u64,
pub time_range_end_unix_nanos: u64,
pub only_current: bool,
pub include_tombstoned: bool,
pub limit: u32,
pub cursor: Vec<u8>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct StatementListResponseFrame {
pub items: Vec<StatementView>,
pub next_cursor: Vec<u8>,
pub cumulative_count: u32,
pub is_final: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationView {
#[serde(with = "serde_bytes")]
pub relation_id: WireUuid,
#[serde(with = "serde_bytes")]
pub chain_root: WireUuid,
pub relation_type: String,
#[serde(with = "serde_bytes")]
pub from_entity: WireUuid,
#[serde(with = "serde_bytes")]
pub to_entity: WireUuid,
pub properties_blob: Vec<u8>,
pub evidence: EvidenceRefWire,
pub extractor_id: u32,
pub extracted_at_unix_nanos: u64,
pub confidence: f32,
pub valid_from_unix_nanos: u64,
pub valid_to_unix_nanos: u64,
pub version: u32,
#[serde(with = "serde_bytes")]
pub superseded_by: WireUuid,
#[serde(with = "serde_bytes")]
pub supersedes: WireUuid,
pub tombstoned: bool,
pub tombstoned_at_unix_nanos: u64,
pub flags: u32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationListFromRequest {
#[serde(with = "serde_bytes")]
pub from_entity: WireUuid,
pub relation_type_filter: String,
pub time_range_start_unix_nanos: u64,
pub time_range_end_unix_nanos: u64,
pub include_superseded: bool,
pub include_tombstoned: bool,
pub limit: u32,
pub cursor: Vec<u8>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationListFromResponseFrame {
pub items: Vec<RelationView>,
pub next_cursor: Vec<u8>,
pub cumulative_count: u32,
pub is_final: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationListToRequest {
#[serde(with = "serde_bytes")]
pub to_entity: WireUuid,
pub relation_type_filter: String,
pub time_range_start_unix_nanos: u64,
pub time_range_end_unix_nanos: u64,
pub include_superseded: bool,
pub include_tombstoned: bool,
pub limit: u32,
pub cursor: Vec<u8>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationListToResponseFrame {
pub items: Vec<RelationView>,
pub next_cursor: Vec<u8>,
pub cumulative_count: u32,
pub is_final: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaGetRequest {
pub namespace: String,
pub version: u32,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaGetResponse {
pub namespace: String,
pub schema_version: u32,
pub schema_document: String,
pub source_blob: Vec<u8>,
pub uploaded_at_unix_nanos: u64,
pub validator_version: u32,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaListRequest {
pub namespace: String,
pub limit: u32,
pub cursor: Vec<u8>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaListItemWire {
pub schema_version: u32,
pub uploaded_at_unix_nanos: u64,
pub validator_version: u32,
pub has_source_text: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaListResponseFrame {
pub namespace: String,
pub items: Vec<SchemaListItemWire>,
pub total: u32,
pub next_cursor: Vec<u8>,
pub is_final: bool,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaValidateRequest {
pub schema_document: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SchemaValidateResponse {
pub namespace: String,
pub would_be_version: u32,
pub validation_errors: Vec<SchemaValidationErrorWire>,
}
#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct ByeRequest {
pub reason: Option<String>,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct PingRequest {
pub client_timestamp_unix_nanos: u64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct PongResponse {
pub client_timestamp_unix_nanos: u64,
pub server_timestamp_unix_nanos: u64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ServerPingResponse {
pub server_timestamp_unix_nanos: u64,
}
#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ClientPongRequest {
pub server_timestamp_unix_nanos: u64,
pub client_timestamp_unix_nanos: u64,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationGetRequest {
#[serde(with = "serde_bytes")]
pub relation_id: WireUuid,
pub follow_supersession: bool,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationGetResponse {
pub relation: RelationView,
pub returned_via_supersession: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationSupersedeRequest {
#[serde(with = "serde_bytes")]
pub old_relation_id: WireUuid,
pub new_relation: RelationCreateRequest,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct RelationSupersedeResponse {
#[serde(with = "serde_bytes")]
pub new_relation_id: WireUuid,
pub version: u32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationTombstoneRequest {
#[serde(with = "serde_bytes")]
pub relation_id: WireUuid,
pub reason: String,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct RelationTombstoneResponse {
pub tombstoned_at_unix_nanos: u64,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct TraversalStepWire {
#[serde(with = "serde_bytes")]
pub relation_id: WireUuid,
#[serde(with = "serde_bytes")]
pub from: WireUuid,
#[serde(with = "serde_bytes")]
pub to: WireUuid,
pub relation_type: String,
pub depth: u32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct TraversalPathWire {
pub steps: Vec<TraversalStepWire>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationTraverseRequest {
#[serde(with = "serde_bytes")]
pub start_entity: WireUuid,
pub relation_types: Vec<String>,
pub direction: u8,
pub max_depth: u32,
pub max_nodes: u32,
pub time_at_unix_nanos: u64,
pub include_superseded: bool,
#[serde(with = "serde_bytes")]
pub request_id: WireUuid,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub act_as: Option<ActAs>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RelationTraverseResponseFrame {
pub paths: Vec<TraversalPathWire>,
pub total_paths: u32,
pub truncated: bool,
pub is_final: bool,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct QueryExplainRequest {
pub query: QueryRequest,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct QueryExplainResponse {
pub plan_text: String,
pub estimated_cost_ms: f32,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct QueryTraceRequest {
pub query: QueryRequest,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct QueryTraceResponse {
pub trace_text: String,
pub total_latency_ms: f64,
}
#[cfg(test)]
mod error_code_forward_compat_tests {
use super::*;
#[test]
fn known_codes_round_trip_through_from_raw() {
assert_eq!(
ErrorCodeWire::from_raw(0x0033),
ErrorCodeWire::ActAsDenied,
"an existing code must still decode to its own variant"
);
assert_eq!(
ErrorCodeWire::from_raw(0x0066),
ErrorCodeWire::LlmCredentialMissing
);
assert_eq!(
ErrorCodeWire::from_raw(0x0095),
ErrorCodeWire::LlmCredentialUnavailable
);
}
#[test]
fn an_unrecognised_code_decodes_to_unknown_instead_of_failing() {
assert_eq!(ErrorCodeWire::from_raw(0xDEAD), ErrorCodeWire::Unknown);
assert_eq!(ErrorCodeWire::from_raw(0x7FFF), ErrorCodeWire::Unknown);
}
#[test]
fn an_error_response_carrying_an_unknown_code_still_decodes() {
let json = serde_json::json!({
"code": 0xDEAD_u16,
"category": 8,
"message": "from a newer server",
"details": null,
"retry_after_ms": null,
});
let decoded: ErrorResponse =
serde_json::from_value(json).expect("an unknown code must not break the frame");
assert!(decoded.code_is_unknown());
assert_eq!(decoded.category, ErrorCategoryWire::Unavailable);
assert_eq!(decoded.message, "from a newer server");
}
}