Render a single-call envelope containing both injectable text and exact memory exposure metadata for run provenance.
(items: &[MemoryItem], md: &str, request: &Context, limit: usize)
| 884 | /// Render a single-call envelope containing both injectable text and exact |
| 885 | /// memory exposure metadata for run provenance. |
| 886 | fn render_json(items: &[MemoryItem], md: &str, request: &Context, limit: usize) -> String { |
| 887 | let values: Vec<serde_json::Value> = items |
| 888 | .iter() |
| 889 | .map(|item| { |
| 890 | serde_json::json!({ |
| 891 | "memory_id": item.memory_id, |
| 892 | "kg_node_id": item.kg_node_id, |
| 893 | "revision_hash": item.revision_hash, |
| 894 | "content_hash": item.content_hash, |
| 895 | "path": item.path, |
| 896 | "name": item.name, |
| 897 | "kind": item.kind, |
| 898 | "status": item.status, |
| 899 | "score": (item.score * 1000.0).round() / 1000.0, |
| 900 | "why_matched": item.why_matched, |
| 901 | "body": item.body, |
| 902 | "preview": preview(&item.body), |
| 903 | "updated_at": item.updated_at, |
| 904 | "introduced_by": item.introduced_by, |
| 905 | "recorded": item.introduced_by != 0, |
| 906 | "truncated": item.truncated, |
| 907 | }) |
| 908 | }) |
| 909 | .collect(); |
| 910 | let envelope = serde_json::json!({ |
| 911 | "schema_version": JSON_SCHEMA_VERSION, |
| 912 | "context_markdown": md, |
| 913 | "retrieval": { |
| 914 | "query": &request.query, |
| 915 | "intent": &request.intent, |
| 916 | "files": &request.files, |
| 917 | "limit": limit, |
| 918 | "budget_chars": request.budget_chars, |
| 919 | "ranker_version": RANKER_VERSION, |
| 920 | }, |
| 921 | "memories": values, |
| 922 | }); |
| 923 | serde_json::to_string_pretty(&envelope).unwrap_or_else(|_| "{}".to_string()) |
| 924 | } |
| 925 | |
| 926 | fn prompt_metadata(value: &str) -> String { |
| 927 | value |