Skip to content

Linear channel: inbound images arrive as unauthenticated markdown URLs, not multimodal image parts #877

Description

@Lukavyi

Problem

In Linear Agent Sessions, when a user posts an image (comment/description), the inbound payload does not carry it as a typed Attachment or as a multimodal UserContent image part. It arrives as a plain markdown image reference embedded in the text body, e.g.:

![](https://uploads.linear.app/<workspace>/<id>/<file>?signature=...)

This is built in messageFromLinearAgentSessionEvent inside the Linear channel (eve/channels/linear). Because the model only receives the raw markdown URL as text, it cannot see the image content — it has no vision input for it. The eve docs for the Linear channel also state today: "Inbound file attachments are not supported on this channel today."

This is inconsistent with the Telegram and Slack channels, where inbound photos/files are normalized into image FileParts the model can actually see.

Two additional wrinkles specific to Linear:

  • The Linear GraphQL Attachment object is a different thing — it represents integration attachments (GitHub/Figma/Slack links), not inline images pasted into a comment/description, so it can't be used to detect these images.
  • uploads.linear.app URLs are private and require Authorization: Bearer <token> (a Linear API/agent access token) to fetch the bytes — a signed query-string alone isn't enough from a plain unauthenticated fetch in all cases, so any fix needs access to the channel's configured Linear credential resolver at the point these URLs are parsed.

Expected behavior

Similar to Telegram/Slack: when messageFromLinearAgentSessionEvent builds the inbound message, it should detect uploads.linear.app markdown image references in the event body, fetch the bytes using the channel's authenticated Linear client, and attach them as image parts on the UserContent sent to the model — instead of leaving them as inert markdown text.

Workaround

We're currently carrying a local pnpm patch against the installed eve package to inject this behavor, because the conversion point lives inside eve itself and can't be reached from consumer code (e.g. via onAgentSession, which can only add context, not rewrite the inbound message). This is brittle — the patch needs to be manually ported forward on every eve version bump, and we'd like to drop it once this is handled upstream.

Happy to share the patch/approach we're using if useful as a starting point.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions