From f5dc22f7c14d6c0dd4bcedee5a85b21ecd294aed Mon Sep 17 00:00:00 2001
From: Adam Malczewski <github@tradam.dev>
Date: Sat, 27 Jun 2026 20:20:02 +0900
Subject: feat(vision): resolve persisted image URLs against the API base
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Images are now stored on disk under tmp (not SQLite) and served via
GET /images/:conversationId/:imageId. Persisted ImageChunk.url is a compact
relative HTTP path (/images/<conv>/<uuid>.png) instead of a base64 data URL.
No wire/transport-contract type change (behavior only) — re-mirrored the
delta notes.

- New pure resolveImageUrl(url, apiBase) helper (core/chunks/image-url.ts,
  +8 tests): data/absolute URLs pass through; relative paths are prepended
  with the API base (no double slash; empty base -> root-relative). Exported
  from core/chunks + re-exported from features/chat.
- ChatView: new apiBaseUrl prop; <img src> uses resolveImageUrl. The
  optimistic echo's data URL passes through; persisted relative paths
  resolve against the base. +3 tests.
- AppStore exposes httpBase (getter); App.svelte passes apiBaseUrl into
  ChatView and the heartbeat RunModal (also renders image chunks).

Verification: svelte-check 0/0; vitest 959/959 (run twice, +11); biome
clean; vite build OK. See backend-handoff.md §2j-update-2.

Not merged or pushed.
---
 src/app/App.svelte | 2 ++
 1 file changed, 2 insertions(+)

(limited to 'src/app/App.svelte')

diff --git a/src/app/App.svelte b/src/app/App.svelte
index f41d7ba..7d70f67 100644
--- a/src/app/App.svelte
+++ b/src/app/App.svelte
@@ -516,6 +516,7 @@
 							onShowEarlier={handleShowEarlier}
 							thinkingKeyBase={store.activeChat.thinkingKeyBase}
 							providerRetry={store.activeChat.providerRetry}
+							apiBaseUrl={store.httpBase}
 						/>
 					{/key}
 				</div>
@@ -610,6 +611,7 @@
 			closeChat={closeRunChat}
 			stopRun={stopHeartbeatRun}
 			onClose={() => (heartbeatRun = null)}
+			apiBaseUrl={store.httpBase}
 		/>
 	{/key}
 {/if}
-- 
cgit v1.2.3

