Liking cljdoc? Tell your friends :D

com.blockether.vis.internal.attachments

User-message image attachments.

Dropping a file onto the terminal pastes its PATH into the input (the terminal's drop behavior — same mechanism pi relies on). At turn start the engine scans the user message for path-shaped tokens that resolve to real image files, reads them, and attaches them to the initial user message as multimodal content blocks. Channel-neutral: every channel gets the same behavior because the scan runs in the engine, not the channel.

Only files the model can genuinely consume are attached: the MIME type is sniffed from magic bytes (pi-parity: jpeg / non-animated png / gif / webp / bmp), never trusted from the extension alone. Files over max-image-bytes are skipped with a reason the prompt assembler surfaces to the model (providers downscale server-side; vis does no client-side resizing — AWT/ImageIO is unavailable under GraalVM native-image on macOS).

User-message image attachments.

Dropping a file onto the terminal pastes its PATH into the input (the
terminal's drop behavior — same mechanism pi relies on). At turn start
the engine scans the user message for path-shaped tokens that resolve
to real image files, reads them, and attaches them to the initial user
message as multimodal content blocks. Channel-neutral: every channel
gets the same behavior because the scan runs in the engine,
not the channel.

Only files the model can genuinely consume are attached: the MIME type
is sniffed from magic bytes (pi-parity: jpeg / non-animated png / gif /
webp / bmp), never trusted from the extension alone. Files over
`max-image-bytes` are skipped with a reason the prompt assembler
surfaces to the model (providers downscale server-side; vis does no
client-side resizing — AWT/ImageIO is unavailable under GraalVM
native-image on macOS).
raw docstring

collect-user-imagesclj

(collect-user-images text)
(collect-user-images text
                     {:keys [workspace-root max-bytes max-images]
                      :or {max-bytes max-image-bytes
                           max-images max-image-count}})

Scan text (one user message) for paths of readable image files and load them as attachments.

Options: :workspace-root - base for relative candidates (default: cwd). :max-bytes - per-image cap (default max-image-bytes). :max-images - attachment count cap (default max-image-count).

Returns {:attached [{:path :media-type :base64 :size :size-label}] :skipped [{:path :reason}]}:skipped names sniffed image files that were rejected (size cap / count cap) so the prompt assembler can tell the model WHY an image it can see referenced is absent. Non-image or non-existent candidates are silently ignored. Never throws — a failure to read one file skips that file.

Scan `text` (one user message) for paths of readable image files and
load them as attachments.

Options:
  :workspace-root - base for relative candidates (default: cwd).
  :max-bytes      - per-image cap (default [[max-image-bytes]]).
  :max-images     - attachment count cap (default [[max-image-count]]).

Returns `{:attached [{:path :media-type :base64 :size :size-label}]
          :skipped  [{:path :reason}]}` — `:skipped` names sniffed
image files that were rejected (size cap / count cap) so the prompt
assembler can tell the model WHY an image it can see referenced is
absent. Non-image or non-existent candidates are silently ignored.
Never throws — a failure to read one file skips that file.
sourceraw docstring

detect-image-mimeclj

(detect-image-mime b)

Sniff a supported image MIME type from the leading bytes of a file. Returns "image/png" | "image/jpeg" | "image/gif" | "image/webp" | "image/bmp", or nil when the bytes are not a supported still image. Animated PNGs and JPEG-LS return nil (provider-rejected shapes).

Sniff a supported image MIME type from the leading bytes of a file.
Returns "image/png" | "image/jpeg" | "image/gif" | "image/webp" |
"image/bmp", or nil when the bytes are not a supported still image.
Animated PNGs and JPEG-LS return nil (provider-rejected shapes).
sourceraw docstring

max-image-bytesclj

Per-image byte cap. Anthropic's API limit is 5MB/image; OpenAI allows more, but the smallest common bound keeps one attachment valid on every wire.

Per-image byte cap. Anthropic's API limit is 5MB/image; OpenAI allows
more, but the smallest common bound keeps one attachment valid on
every wire.
sourceraw docstring

max-image-countclj

Attachment count cap per user message. Guards against a pathological message (e.g. a pasted directory listing) ballooning the request.

Attachment count cap per user message. Guards against a pathological
message (e.g. a pasted directory listing) ballooning the request.
sourceraw docstring

prepare-inline-attachmentsclj

(prepare-inline-attachments attachments)
(prepare-inline-attachments attachments
                            {:keys [max-bytes max-images]
                             :or {max-bytes max-image-bytes
                                  max-images max-image-count}})

Validate already-encoded image attachments delivered INLINE (web/API upload) rather than as filesystem paths. Each entry is {:base64 :filename :media-type?}; the base64 may be a bare payload or a data:...;base64, URL. Decodes each, sniffs the MIME from magic bytes (the declared :media-type is NEVER trusted), enforces the same per-image and count caps as collect-user-images, and returns the same {:attached [...] :skipped [...]} shape so the assemble seam treats disk-scanned and inline images uniformly. Never throws.

Validate already-encoded image attachments delivered INLINE (web/API upload)
rather than as filesystem paths. Each entry is `{:base64 :filename :media-type?}`;
the base64 may be a bare payload or a `data:...;base64,` URL. Decodes each,
sniffs the MIME from magic bytes (the declared `:media-type` is NEVER trusted),
enforces the same per-image and count caps as [[collect-user-images]], and
returns the same `{:attached [...] :skipped [...]}` shape so the assemble seam
treats disk-scanned and inline images uniformly. Never throws.
sourceraw docstring

scan-image-descriptorsclj

(scan-image-descriptors text)
(scan-image-descriptors text {:keys [workspace-root]})

Resolve every image the user text points at, WITHOUT loading pixel bytes. Returns [{:path :media-type :size :size-label :filename}] for files whose magic bytes sniff to a supported still image — ordered, de-duped. Cheap enough to run on every paste (only a small file-head read per candidate). Never throws.

Resolve every image the user text points at, WITHOUT loading pixel bytes.
Returns `[{:path :media-type :size :size-label :filename}]` for files whose
magic bytes sniff to a supported still image — ordered, de-duped. Cheap
enough to run on every paste (only a small file-head read per candidate).
Never throws.
sourceraw docstring

size-labelclj

(size-label n)
source

text->chip-previewclj

(text->chip-preview text)

One-line, path-free rendering of ONE user message for compact previews (queue rows, tab titles, notifications).

Every image-shaped path token collapses to a short name.png chip (see text->inline-chips), the prose around it survives, and whitespace collapses to single spaces. Pure string work — no filesystem access, no pixel bytes — so it is safe on a paint path and on text whose files have since been deleted. That is the whole point: a queued message authored by dropping a screenshot used to render as a raw /var/folders/…/clipboard-….png, which tells the user nothing about what they queued.

Returns nil when the message is nothing but images — the caller should paint attachment chips alone rather than an empty row. The ORIGINAL text is never mutated; callers keep it for re-send/edit so the paths still re-attach.

One-line, path-free rendering of ONE user message for compact previews
(queue rows, tab titles, notifications).

Every image-shaped path token collapses to a short `name.png` chip (see
`text->inline-chips`), the prose around it survives, and whitespace collapses
to single spaces. Pure string work — no filesystem access, no pixel bytes — so
it is safe on a paint path and on text whose files have since been deleted.
That is the whole point: a queued message authored by dropping a screenshot
used to render as a raw `/var/folders/…/clipboard-….png`, which tells the user
nothing about what they queued.

Returns nil when the message is nothing but images — the caller should paint
attachment chips alone rather than an empty row. The ORIGINAL text is never
mutated; callers keep it for re-send/edit so the paths still re-attach.
sourceraw docstring

text->inline-chipsclj

(text->inline-chips text)

text with every image-shaped PATH token replaced by a short name.png chip, and NOTHING else touched — line breaks, indentation and the prose around each path all survive.

Pure string work: no filesystem access, no pixel bytes, so it is safe on a paint path and on text whose files have since been deleted. Use it wherever a user message is DISPLAYED (transcript bubble, notification body); the original text is never mutated, so re-send/edit still ships the path that re-attaches the picture.

`text` with every image-shaped PATH token replaced by a short `name.png`
chip, and NOTHING else touched — line breaks, indentation and the prose around
each path all survive.

Pure string work: no filesystem access, no pixel bytes, so it is safe on a
paint path and on text whose files have since been deleted. Use it wherever a
user message is DISPLAYED (transcript bubble, notification body); the original
text is never mutated, so re-send/edit still ships the path that re-attaches
the picture.
sourceraw docstring

cljdoc builds & hosts documentation for Clojure/Script libraries

Keyboard shortcuts
Ctrl+kJump to recent docs
Move to previous article
Move to next article
Ctrl+/Jump to the search field
× close