From e5c3e6dafb560cdc73f374011ecccb71fe249000 Mon Sep 17 00:00:00 2001 From: iyen Date: Fri, 11 Sep 2026 18:41:12 +0900 Subject: [PATCH] fix(service): default emotion media to non-sensitive --- openclaw/README.md | 2 ++ service/src/final-response-routes.test.ts | 2 +- service/src/final-response-routes.ts | 2 +- service/src/final-response-use-case.test.ts | 2 +- service/src/final-response-use-case.ts | 6 +++--- service/src/verifier.test.ts | 2 +- tests/fixtures/final-response-v1.json | 4 ++-- 7 files changed, 11 insertions(+), 9 deletions(-) diff --git a/openclaw/README.md b/openclaw/README.md index 7888432..95660bc 100644 --- a/openclaw/README.md +++ b/openclaw/README.md @@ -76,6 +76,8 @@ Requests use bearer auth and JSON bodies containing the OpenClaw hook context. S OpenClaw calls `reply_payload_sending` before final payload delivery. The adapter calls the service verdict endpoint and attaches `verdict.media` to the payload. OpenClaw owns the final text send and payload delivery mechanics; the Hent-ai service owns media selection, policy, profile/channel lookup, and verdict state. +Ordinary Hent-ai emotion assets are returned with `sensitiveMedia: false` so durable final delivery can attach them. Assets explicitly classified as sensitive must retain `sensitiveMedia: true`; compatible OpenClaw hosts reject those attachments while preserving the reply text. + Expected service response: ```json diff --git a/service/src/final-response-routes.test.ts b/service/src/final-response-routes.test.ts index 04318e8..09d0018 100644 --- a/service/src/final-response-routes.test.ts +++ b/service/src/final-response-routes.test.ts @@ -46,7 +46,7 @@ describe("final-response route adapter", () => { filename: "neutral.png", contentType: "image/png", url: "/static/sets/legacy/neutral.png", - sensitiveMedia: true, + sensitiveMedia: false, metadata: { storageKey: "sets/legacy/neutral.png" }, }, }, diff --git a/service/src/final-response-routes.ts b/service/src/final-response-routes.ts index bcde42c..f8513bd 100644 --- a/service/src/final-response-routes.ts +++ b/service/src/final-response-routes.ts @@ -34,7 +34,7 @@ export function mediaResponseForChannel(db: ServiceDatabase, channelId: string | filename: asset.filename, contentType: asset.contentType, url: asset.objectUrl, - sensitiveMedia: true, + sensitiveMedia: false, metadata: { storageKey: asset.storageKey }, }, }; diff --git a/service/src/final-response-use-case.test.ts b/service/src/final-response-use-case.test.ts index 26a39e3..6604726 100644 --- a/service/src/final-response-use-case.test.ts +++ b/service/src/final-response-use-case.test.ts @@ -112,7 +112,7 @@ describe("final-response application use case", () => { filename: "semantic-neutral.png", contentType: "image/png", url: "/static/sets/set/semantic-neutral.png", - sensitiveMedia: true, + sensitiveMedia: false, metadata: { storageKey: "sets/set/semantic-neutral.png" }, }, }, diff --git a/service/src/final-response-use-case.ts b/service/src/final-response-use-case.ts index c12b61a..b41c0f9 100644 --- a/service/src/final-response-use-case.ts +++ b/service/src/final-response-use-case.ts @@ -6,7 +6,7 @@ import type { SemanticAssetMedia, SemanticAssetRouter } from "./semantic-assets/ import type { FinalResponseVerifier, VerifierJudgment } from "./verifier.js"; export const FINAL_VERDICT_SCHEMA_VERSION = "FinalEmotionVerdictV1"; -export const SERVICE_MEDIA_RESPONSE_SCHEMA_VERSION = "ServiceMediaResponseV1"; +export const SERVICE_MEDIA_RESPONSE_SCHEMA_VERSION = "ServiceMediaResponseV2-ExplicitSensitivity"; export const VERIFIER_CACHE_POLICY_VERSION = "VerifierCachePolicyV4-NormalizedAffect"; export const ASSET_POLICY_VERSION = "ServiceAssetPolicyV2-AffectSpaceV2"; @@ -17,7 +17,7 @@ export type ServiceMedia = { filename: string; contentType: string; url: string; - sensitiveMedia: true; + sensitiveMedia: boolean; metadata: { storageKey: string }; }; @@ -130,7 +130,7 @@ function serviceMediaFrom(media: SemanticAssetMedia): ServiceMedia { filename: media.filename, contentType: media.contentType, url: media.objectUrl, - sensitiveMedia: true, + sensitiveMedia: false, metadata: { storageKey: media.storageKey }, }; } diff --git a/service/src/verifier.test.ts b/service/src/verifier.test.ts index c7a4b8e..7eefd39 100644 --- a/service/src/verifier.test.ts +++ b/service/src/verifier.test.ts @@ -90,7 +90,7 @@ describe("final-response verifier boundary", () => { await withServer(db, verifier, async (baseUrl) => { expect(FINAL_VERDICT_SCHEMA_VERSION).toBe("FinalEmotionVerdictV1"); - expect(SERVICE_MEDIA_RESPONSE_SCHEMA_VERSION).toBe("ServiceMediaResponseV1"); + expect(SERVICE_MEDIA_RESPONSE_SCHEMA_VERSION).toBe("ServiceMediaResponseV2-ExplicitSensitivity"); expect(VERIFIER_CACHE_POLICY_VERSION).toBe("VerifierCachePolicyV4-NormalizedAffect"); expect(ASSET_POLICY_VERSION).toBe("ServiceAssetPolicyV2-AffectSpaceV2"); expect(finalResponseFixture.versions).toEqual({ diff --git a/tests/fixtures/final-response-v1.json b/tests/fixtures/final-response-v1.json index 21db8d3..1ee50eb 100644 --- a/tests/fixtures/final-response-v1.json +++ b/tests/fixtures/final-response-v1.json @@ -1,7 +1,7 @@ { "versions": { "finalVerdict": "FinalEmotionVerdictV1", - "mediaResponse": "ServiceMediaResponseV1", + "mediaResponse": "ServiceMediaResponseV2-ExplicitSensitivity", "verifierCachePolicy": "VerifierCachePolicyV4-NormalizedAffect", "assetPolicy": "ServiceAssetPolicyV2-AffectSpaceV2" }, @@ -14,7 +14,7 @@ "filename": "neutral.png", "contentType": "image/png", "url": "/static/sets/set/neutral.png", - "sensitiveMedia": true, + "sensitiveMedia": false, "metadata": { "storageKey": "sets/set/neutral.png" }