deepseek-harness/snapshots/session
Chinesezjc a4d4404708 feat(ui-tool): render read_image results as the image
A settled top-level `read_image` call printed its raw attachment object as
literal text in the tool card — `{"type":"image","attachment":{…}}` —
instead of the image, because no presentation metadata told a client card
how to present the reference and the tool-card layer had no image concept.

Host: `read_image` declares an `output.presentationMeta` persisting
`{ path }` only. The attachment reference deliberately lives in the
settled result content — the single record a `tools/post-execute`
replacement rewrites — not in `meta`; the id is opaque and
provider-owned, checked for existence only.

Client: `imageCardModel` derives the card from the call head, the meta
path, the result's own image block, and a shape-matched envelope. ToolRow
gains an `image` card slot; the `read_image` toolview declares the
Tool-owned `tool.call.images` slot as its child and dispatches the
gallery through it. ui-chat down-threads the session-authorized loader
(`ChatNodeOwnerProps.loadImage`), so the tool layer supplies only derived
references plus the loader and never imports an attachment
implementation; ui-attachment fills the slot with its message gallery
renderer. The card keeps the envelope text below the gallery for the
no-attachment-plugin deployment. An image-bearing tool registers a keyed
toolview; the generic fallback keeps its flattened text. `read_image`
joins the read variant with its own locale title key; both rows share
`read-family-row.tsx`.

Verification: `read-image.spec.ts` (metadata projection, envelope by
shape, reference narrowing, real-execution round trip, rejection
branches incl. non-digest ids), `image-card.client.spec.tsx` (derivation,
row render site dispatching the slot, keyed registration with the
child-slot declaration, empty-slot fallbacks, media-type enum), keyless
snapshots (`read-image-gif` added; read-image/-dimension/-reencode
updated to the `{path}` meta), five injected-defect negative controls,
and a demo GIF recorded from this PR's head through the official
image-capable model.
2026-08-29 17:41:05 +08:00
..
advanced-toolchain refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
advanced-toolchain-runtime refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
agent-instructions test(subagent): migrate model selection fixtures 2026-08-27 12:00:02 +08:00
background-job-admission test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
bash-spill refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
bash-tool-turn refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
both-mode-turn fix(tools): keep PTC SDK calls inside run_code 2026-08-27 15:20:03 +08:00
compaction-recovery test(subagent): migrate model selection fixtures 2026-08-27 12:00:02 +08:00
cordis-inspect-jsdoc test(snapshot): restore canonical packed fixture layout 2026-08-27 23:14:33 +08:00
empty-response-retry refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
error-finish refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
fs-delete-recreate test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
fs-edit test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
fs-glob-sampling fix(subagent): gate model selection with explicit allowlist 2026-08-27 12:00:02 +08:00
fs-policy-reject test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
fs-read refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
fs-read-window refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
fs-write test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
fs-write-overwrite test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
fs-write-overwrite-bounded test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
hook-cc-invalid-matcher refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-cc-posttool-block test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
hook-cc-posttool-context refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-cc-pretool-ask refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-cc-pretool-deny refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-cc-promptsubmit-block refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-cc-promptsubmit-context refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-cc-stop-continue test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
hook-codex-invalid-matcher refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-codex-posttool-block refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-codex-posttool-context refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-codex-pretool-block refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-codex-promptsubmit-block refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-codex-promptsubmit-context refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
hook-codex-stop-continue test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
lsp-definition fix(subagent): gate model selection with explicit allowlist 2026-08-27 12:00:02 +08:00
missing-sandbox-runner refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
packed-chunks refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
parallel-tool-calls refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
partial-landlock-child-failure refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
persistent-pwsh-tool-turn refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
product-subagent-both fix(subagent): gate model selection with explicit allowlist 2026-08-27 12:00:02 +08:00
product-subagent-codex fix(subagent): gate model selection with explicit allowlist 2026-08-27 12:00:02 +08:00
product-subagent-result-diagnostic fix(subagent): gate model selection with explicit allowlist 2026-08-27 12:00:02 +08:00
ptc-read-image Merge remote-tracking branch 'github/master' into xtr/session-projection-migrations 2026-08-28 10:59:30 +08:00
ptc-turn Merge remote-tracking branch 'github/master' into xtr/session-projection-migrations 2026-08-28 10:59:30 +08:00
ptc-workspace-context Merge remote-tracking branch 'github/master' into xtr/session-projection-migrations 2026-08-28 10:59:30 +08:00
pty-tools-sandbox-backend fix(subagent): gate model selection with explicit allowlist 2026-08-27 12:00:02 +08:00
pwsh-tool-turn refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
ralph-loop fix: align model selection with current settings remotes 2026-08-27 12:18:05 +08:00
read-image feat(ui-tool): render read_image results as the image 2026-08-29 17:41:05 +08:00
read-image-dimension feat(ui-tool): render read_image results as the image 2026-08-29 17:41:05 +08:00
read-image-gif feat(ui-tool): render read_image results as the image 2026-08-29 17:41:05 +08:00
read-image-reencode feat(ui-tool): render read_image results as the image 2026-08-29 17:41:05 +08:00
read-image-text-route refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
repeat-tool-reminder refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
session-query-spill fix(subagent): gate model selection with explicit allowlist 2026-08-27 12:00:02 +08:00
session-sandbox-root fix(web): show system prompts in chat 2026-08-25 14:44:08 +08:00
skill-load rename code-mode to ptc (PTC mode), except session-persistent vocabulary 2026-08-27 23:14:31 +08:00
subagent-acp-diagnostic test(subagent): migrate model selection fixtures 2026-08-27 12:00:02 +08:00
subagent-child-question-rejection fix(subagent): gate model selection with explicit allowlist 2026-08-27 12:00:02 +08:00
subagent-depth-two-rejection fix(subagent): gate model selection with explicit allowlist 2026-08-27 12:00:02 +08:00
subagent-max-tokens-partial refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
subagent-multi refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
subagent-parallel refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
subagent-published-run-failure refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
subagent-spawn-in-process refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
text-turn test(subagent): migrate model selection fixtures 2026-08-27 12:00:02 +08:00
todo-write refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
tool-call-turn refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
web-fetch fix(snapshot): keep fixture lifecycle tests source-clean 2026-08-29 11:50:13 +08:00
web-search-endpoint-guidance fix(snapshot): keep fixture lifecycle tests source-clean 2026-08-29 11:50:13 +08:00
workflow-run refactor(test): drive sessions through owning profiles 2026-08-24 21:37:13 +08:00
workspace-edit test(snapshot): verify final workspace state 2026-08-24 21:37:14 +08:00
headless.snapshot.ts fix(snapshot): own fixture listener lifecycle 2026-08-29 11:29:46 +08:00
loopback-fixture-server.mjs fix(snapshot): keep fixture lifecycle tests source-clean 2026-08-29 11:50:13 +08:00