{"openapi":"3.1.0","info":{"title":"agent-handoff","description":"End-to-end encrypted handoff bundle relay","version":"1.0.0"},"paths":{"/api/v1/health":{"get":{"tags":["health"],"summary":"Health","operationId":"health_api_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthResponse"}}}}}}},"/api/v1/bundles":{"post":{"tags":["bundles"],"summary":"Upload","operationId":"upload_api_v1_bundles_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadRequest"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UploadResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bundles/{bundle_id}":{"get":{"tags":["bundles"],"summary":"Fetch","operationId":"fetch_api_v1_bundles__bundle_id__get","parameters":[{"name":"bundle_id","in":"path","required":true,"schema":{"type":"string","title":"Bundle Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FetchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["bundles"],"summary":"Delete","operationId":"delete_api_v1_bundles__bundle_id__delete","parameters":[{"name":"bundle_id","in":"path","required":true,"schema":{"type":"string","title":"Bundle Id"}},{"name":"authorization","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Authorization"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"FetchResponse":{"properties":{"id":{"type":"string","title":"Id"},"ciphertext_b64":{"type":"string","title":"Ciphertext B64"},"nonce_b64":{"type":"string","title":"Nonce B64"},"hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"consumed":{"type":"boolean","title":"Consumed","default":false}},"type":"object","required":["id","ciphertext_b64","nonce_b64","expires_at"],"title":"FetchResponse"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"HealthResponse":{"properties":{"status":{"type":"string","title":"Status"},"storage":{"type":"string","title":"Storage"},"version":{"type":"string","title":"Version"}},"type":"object","required":["status","storage","version"],"title":"HealthResponse"},"UploadRequest":{"properties":{"id":{"type":"string","title":"Id","description":"Bundle ID, hex 字符"},"ciphertext_b64":{"type":"string","title":"Ciphertext B64","description":"AES-GCM 密文 + tag, base64"},"nonce_b64":{"type":"string","title":"Nonce B64","description":"12 字节 nonce, base64"},"expires_in":{"anyOf":[{"type":"integer","maximum":2592000.0,"minimum":60.0},{"type":"null"}],"title":"Expires In","description":"秒"},"hint":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Hint","description":"用户备注"}},"type":"object","required":["id","ciphertext_b64","nonce_b64"],"title":"UploadRequest","description":"客户端上传密文。"},"UploadResponse":{"properties":{"id":{"type":"string","title":"Id"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"size":{"type":"integer","title":"Size"}},"type":"object","required":["id","expires_at","size"],"title":"UploadResponse"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}