feat(web): attach images from the composer

The (+) door and the clipboard door both stage files as removable
chips, the claw's own budget enforced client-side (eight a message,
5 MiB decoded each, errors surfaced, never silent drops). The sent
row renders local previews at once; the stream's user_message echo
carries the stored ids and dedupes against it, so a replayed message
renders its thumbnails through the same bearer-guarded fetch as an
attachment card. Model options mark vision when the listing knows.
This commit is contained in:
vhaudiquet committed 2026-10-26 23:24:41 -05:00
1 parent cfb349508f
commit 6efb69331d
6 files changed
+396 -39

No files matched your search

@@ -215,6 +215,16 @@ watch(
}
},
)
/** The listing's vision verdict, spelled the way the TUI's picker
* spells it: a mark when the adapter knows the model takes images, a
* bare "no vision" when it knows it does not, nothing when the key is
* absent — unknown is no verdict at all, never a `false`. */
function visionLabel(model: ModelCard): string {
if (model.supports_vision === true) return ' ◉ vision'
if (model.supports_vision === false) return ' no vision'
return ''
}
</script>
<template>
@@ -259,7 +269,7 @@ watch(
<select v-model="draftModel" :disabled="saving || !draftProvider">
<option value="">(provider default)</option>
<option v-for="m in models" :key="m.id" :value="m.id">
{{ m.id }}
{{ m.id }}{{ visionLabel(m) }}
</option>
</select>
</SettingRow>