rpc IngestBatch (IngestRequest) returns (IngestResponse);
rpc IngestStream (stream TemporalPoint) returns (stream WriteReceipt);
rpc Query (QueryRequest) returns (QueryResponse);
rpc QueryStream (QueryRequest) returns (stream ScoredResult);
rpc WatchDrift (WatchRequest) returns (stream DriftEvent);
repeated float vector = 3;
map<string, string> metadata = 4;
repeated float query_vector = 2;
TemporalFilter temporal = 3;
float alpha = 5; // semantic vs temporal weight
string metric = 6; // "cosine" | "l2" | "dot" | "poincare"
PredictionParams prediction = 7;
int64 at_timestamp = 1; // snapshot
TimeRange range = 2; // range query
int64 predict_to = 3; // extrapolation target