|
39 | 39 | "description": "True if content landed in the memory store (as new row or a merge into an existing one).", |
40 | 40 | }, |
41 | 41 | "memory_id": { |
42 | | - "type": "string", |
43 | | - "description": "UUID of the resulting memory row. Present when stored=true.", |
| 42 | + "type": "integer", |
| 43 | + "description": "ID of the resulting memory row (PG bigint). Present when stored=true.", |
44 | 44 | }, |
45 | 45 | "action": { |
46 | 46 | "type": "string", |
|
52 | 52 | "description": "Human-readable explanation of the gate decision (e.g. 'low surprise', 'high entity overlap').", |
53 | 53 | }, |
54 | 54 | "merged_with": { |
55 | | - "type": "string", |
56 | | - "description": "UUID of the existing memory when action=merged.", |
| 55 | + "type": "integer", |
| 56 | + "description": "ID of the existing memory (PG bigint) when action=merged.", |
57 | 57 | }, |
58 | 58 | "heat": { |
59 | 59 | "type": "number", |
@@ -260,15 +260,15 @@ def _parse_args( |
260 | 260 | async def _handler_impl(args: dict[str, Any] | None = None) -> dict[str, Any]: |
261 | 261 | """Store a memory with thermodynamic properties and predictive coding gate.""" |
262 | 262 | if not args or not args.get("content"): |
263 | | - return {"stored": False, "reason": "no_content"} |
| 263 | + return {"stored": False, "action": "rejected", "reason": "no_content"} |
264 | 264 |
|
265 | 265 | # Phase 7: harden user-controlled content at the ingestion boundary |
266 | 266 | # (NFC normalization, control/bidi strip, byte cap). |
267 | 267 | from mcp_server.shared.content_hardening import harden_content |
268 | 268 |
|
269 | 269 | args["content"] = harden_content(args["content"]) |
270 | 270 | if not args["content"]: |
271 | | - return {"stored": False, "reason": "no_content"} |
| 271 | + return {"stored": False, "action": "rejected", "reason": "no_content"} |
272 | 272 |
|
273 | 273 | ( |
274 | 274 | content, |
|
0 commit comments