diff --git a/crates/kebab-cli/src/wire.rs b/crates/kebab-cli/src/wire.rs index fd1493a..b6ca688 100644 --- a/crates/kebab-cli/src/wire.rs +++ b/crates/kebab-cli/src/wire.rs @@ -108,6 +108,12 @@ pub fn wire_doctor(d: &DoctorReport) -> Value { tag_object(v, "doctor.v1") } +/// Wrap a [`kebab_app::ResetReport`] as `reset_report.v1`. +pub fn wire_reset(r: &kebab_app::ResetReport) -> Value { + let v = serde_json::to_value(r).expect("ResetReport serializes"); + tag_object(v, "reset_report.v1") +} + #[cfg(test)] mod tests { use super::*; @@ -172,4 +178,23 @@ mod tests { let tagged = tag_object(v, "x.v1"); assert_eq!(schema_of(&tagged), Some("x.v1")); } + + #[test] + fn reset_wrapper_tags_schema_version_and_serializes_scope() { + let r = kebab_app::ResetReport { + scope: kebab_app::ResetScope::DataOnly, + removed_paths: vec![std::path::PathBuf::from("/tmp/x")], + embedding_rows_truncated: 0, + }; + let v = wire_reset(&r); + assert_eq!(schema_of(&v), Some("reset_report.v1")); + assert_eq!(v.get("scope").and_then(Value::as_str), Some("data_only")); + assert_eq!( + v.get("embedding_rows_truncated").and_then(Value::as_u64), + Some(0) + ); + let paths = v.get("removed_paths").and_then(Value::as_array).unwrap(); + assert_eq!(paths.len(), 1); + assert_eq!(paths[0].as_str(), Some("/tmp/x")); + } } diff --git a/docs/wire-schema/v1/reset_report.schema.json b/docs/wire-schema/v1/reset_report.schema.json new file mode 100644 index 0000000..ab34d8c --- /dev/null +++ b/docs/wire-schema/v1/reset_report.schema.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "https://kb.local/wire/v1/reset_report.schema.json", + "title": "ResetReport v1", + "description": "Result of `kebab reset` — what scope was requested and what was actually removed off-disk. A path that did not exist before the call is omitted (the wipe is idempotent).", + "type": "object", + "required": [ + "schema_version", + "scope", + "removed_paths", + "embedding_rows_truncated" + ], + "properties": { + "schema_version": { "const": "reset_report.v1" }, + "scope": { + "type": "string", + "enum": ["all", "data_only", "vector_only", "config_only"] + }, + "removed_paths": { + "type": "array", + "items": { "type": "string" } + }, + "embedding_rows_truncated": { "type": "integer", "minimum": 0 } + } +}