use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::store::AgentKind;
use super::*;
pub const PROTOCOL_VERSION: u16 = 2;
pub const MAX_FRAME_SIZE: usize = 65_536;
#[derive(Debug, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct Request {
pub v: u16,
pub id: Uuid,
pub session: Uuid,
#[serde(default)]
pub agent: Option<AgentKind>,
pub cmd: Command,
}
#[derive(Debug, Serialize)]
#[serde(tag = "status")]
pub enum Response {
#[serde(rename = "ok")]
Ok { id: Uuid, data: serde_json::Value },
#[serde(rename = "err")]
Err {
id: Uuid,
code: ErrorCode,
message: String,
},
}
impl Response {
pub fn ok(id: Uuid, data: serde_json::Value) -> Self {
Self::Ok { id, data }
}
pub fn err(id: Uuid, code: ErrorCode, message: impl Into<String>) -> Self {
Self::Err {
id,
code,
message: message.into(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum ErrorCode {
VersionMismatch,
FrameTooLarge,
MalformedRequest,
SessionMismatch,
ValidationFailed,
NotFound,
Conflict,
InvalidStateTransition,
StoreError,
Internal,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Command {
#[serde(rename = "ping")]
Ping,
#[serde(rename = "metrics")]
Metrics,
#[serde(rename = "get")]
Get(GetInput),
#[serde(rename = "hook_evaluate")]
HookEvaluate(HookEvaluateInput),
#[serde(rename = "policy_evaluate")]
PolicyEvaluate(PolicyEvaluateInput),
#[serde(rename = "scan_prefix")]
ScanPrefix(ScanPrefixInput),
#[serde(rename = "scan_keys")]
ScanKeys(ScanKeysInput),
#[serde(rename = "history")]
History(HistoryInput),
#[serde(rename = "history_since")]
HistorySince(HistorySinceInput),
#[serde(rename = "session_check_consulted")]
SessionCheckConsulted(SessionCheckConsultedInput),
#[serde(rename = "session_check_consulted_recent")]
SessionCheckConsultedRecent(SessionCheckConsultedRecentInput),
#[serde(rename = "mem_query")]
MemQuery(MemQueryInput),
#[serde(rename = "scan_enforcement_events")]
ScanEnforcementEvents(ScanEnforcementEventsInput),
#[serde(rename = "scan_enforcement_events_with_skips")]
ScanEnforcementEventsWithSkips(ScanEnforcementEventsInput),
#[serde(rename = "scan_enforcement_events_since_ms")]
ScanEnforcementEventsSinceMs(ScanEnforcementEventsSinceMsInput),
#[serde(rename = "config_get")]
ConfigGet(ConfigGetInput),
#[serde(rename = "mem_get")]
MemGet(MemGetInput),
#[serde(rename = "mem_bootstrap")]
MemBootstrap(MemBootstrapInput),
#[serde(rename = "gotcha_upsert")]
GotchaUpsert(GotchaDraftInput),
#[serde(rename = "gotcha_confirm")]
GotchaConfirm(GotchaConfirmInput),
#[serde(rename = "gotcha_tombstone")]
GotchaTombstone(GotchaTombstoneInput),
#[serde(rename = "policy_write")]
PolicyWrite(PolicyWriteInput),
#[serde(rename = "file_enrich")]
FileEnrich(FileEnrichInput),
#[serde(rename = "file_reparse")]
FileReparse(FileReparseInput),
#[serde(rename = "file_edit_hook")]
FileEditHook(FileEditHookInput),
#[serde(rename = "doc_capture")]
DocCapture(DocCaptureInput),
#[serde(rename = "decision_upsert")]
DecisionUpsert(DecisionUpsertInput),
#[serde(rename = "dev_note_upsert")]
DevNoteUpsert(DevNoteUpsertInput),
#[serde(rename = "config_set")]
ConfigSet(ConfigSetInput),
#[serde(rename = "sandbox_audit")]
SandboxAudit(SandboxAuditInput),
#[serde(rename = "session_log")]
SessionLog(SessionLogInput),
#[serde(rename = "instructions_loaded")]
InstructionsLoaded(InstructionsLoadedInput),
#[serde(rename = "consultation_hit")]
ConsultationHit(ConsultationHitInput),
#[serde(rename = "policy_shadow_observe")]
PolicyShadowObserve(PolicyShadowObserveInput),
#[serde(rename = "session_flush")]
SessionFlush,
#[serde(rename = "session_harvest")]
SessionHarvest,
#[serde(rename = "session_clear_consults")]
SessionClearConsults,
#[serde(rename = "subagent_harvest")]
SubagentHarvest(SubagentHarvestInput),
#[serde(rename = "subagent_spawned")]
SubagentSpawned(SubagentSpawnedInput),
#[serde(rename = "subagent_edge")]
SubagentEdge(SubagentEdgeInput),
#[serde(rename = "record_import")]
RecordImport(RecordImportInput),
}