Fix structured attachment rendering (#69)

* review: harden readonly git checks and lint verification

* test: satisfy readonly reviewer sandbox typing

* test: fix readonly reviewer sandbox assertions

* test: remove impossible readonly sandbox guards

* test: relax readonly sandbox assertions

* test: cast readonly sandbox expectation shape

* test: cast readonly sandbox expectation through unknown

* Phase 0 — STEP_DONE/TASK_DONE split + owner-follow-up integration smoke

* Add STEP_DONE guards, verdict storage, and stale delivery suppression

* style: format paired stepdone telemetry files

* Route STEP_DONE through reviewer

* Add structured Discord attachments

* style: format structured attachment test

* Fix room thread bot output parity

* Remove duplicate work item attachment migration from owner branch

* Remove legacy dashboard rooms renderer

* Extract dashboard parsed body renderer

* Extract dashboard redaction helpers

* Extract dashboard RoomCardV2 component

* Include RoomCardV2 test in vitest suite

* Extract dashboard RoomBoardV2 component

* Extract dashboard EmptyState component

* Extract dashboard InboxPanel component

* Split dashboard InboxPanel card renderer

* Extract dashboard TaskPanel component

* Extract dashboard UsagePanel component

* Fix dashboard room thread chunk rendering

* Extract dashboard ServicePanel component

* Render dashboard live progress markdown

* Extract dashboard SettingsPanel component

* Fix structured attachment rendering
This commit is contained in:
Eyejoker
2026-04-28 17:36:11 +09:00
committed by GitHub
parent 96d99f63e0
commit 6197e90c8c
18 changed files with 837 additions and 104 deletions

View File

@@ -2,6 +2,7 @@ import type {
IpcMessageForwardResult,
IpcMessagePayload,
} from './ipc-types.js';
import { normalizeEjclawStructuredOutput } from './agent-protocol.js';
import type { RegisteredGroup } from './types.js';
export async function forwardAuthorizedIpcMessage(
@@ -80,13 +81,25 @@ export async function forwardAuthorizedIpcMessage(
};
}
await sendMessage(
msg.chatJid,
msg.text,
msg.senderRole,
msg.runId,
msg.attachments,
);
const normalized = normalizeEjclawStructuredOutput(msg.text);
if (normalized.output?.visibility === 'silent') {
return {
outcome: 'sent',
chatJid: msg.chatJid,
targetGroup: targetGroup?.folder ?? null,
isMainOverride,
senderRole: msg.senderRole ?? null,
};
}
const structured =
normalized.output?.visibility === 'public' ? normalized.output : null;
const text = structured?.text ?? normalized.result ?? msg.text;
const attachments =
msg.attachments && msg.attachments.length > 0
? msg.attachments
: (structured?.attachments ?? undefined);
await sendMessage(msg.chatJid, text, msg.senderRole, msg.runId, attachments);
return {
outcome: 'sent',
chatJid: msg.chatJid,