summaryrefslogtreecommitdiffhomepage
path: root/packages/transport-http
diff options
context:
space:
mode:
authorAdam Malczewski <[email protected]>2026-06-27 20:06:47 +0900
committerAdam Malczewski <[email protected]>2026-06-27 20:06:47 +0900
commit2e741d1c1ac309327aff4fed0e248bc5baa342d4 (patch)
treefb84708f55e07572e4c69447884365d9b457755c /packages/transport-http
parent2c91dc63802a386b1612ea0ed8c1e96b6f4421db (diff)
downloaddispatch-2e741d1c1ac309327aff4fed0e248bc5baa342d4.tar.gz
dispatch-2e741d1c1ac309327aff4fed0e248bc5baa342d4.zip
feat(vision): store images in tmp dir instead of SQLite — compact URLs + purge on compaction/close
Diffstat (limited to 'packages/transport-http')
-rw-r--r--packages/transport-http/src/app.ts31
1 files changed, 31 insertions, 0 deletions
diff --git a/packages/transport-http/src/app.ts b/packages/transport-http/src/app.ts
index ea216e1..16c4167 100644
--- a/packages/transport-http/src/app.ts
+++ b/packages/transport-http/src/app.ts
@@ -201,6 +201,37 @@ export function createApp(opts: CreateServerOptions): Hono {
app.get("/health", (c) => c.json({ ok: true }));
+ // ── Tmp image serving (vision handoff) ──────────────────────────────────────
+ app.get("/images/:conversationId/:imageId", async (c) => {
+ const conversationId = c.req.param("conversationId");
+ const imageId = c.req.param("imageId");
+ if (imageId.includes("/") || imageId.includes("..")) {
+ return c.json({ error: "Invalid image ID" }, 400);
+ }
+ const imageDir = process.env.DISPATCH_IMAGE_DIR ?? "/tmp/dispatch/images";
+ const { join } = await import("node:path");
+ const { readFile: fsReadFile } = await import("node:fs/promises");
+ const filePath = join(imageDir, conversationId, imageId);
+ try {
+ const buf = await fsReadFile(filePath);
+ const ext = imageId.toLowerCase();
+ const mime = ext.endsWith(".png")
+ ? "image/png"
+ : ext.endsWith(".jpg") || ext.endsWith(".jpeg")
+ ? "image/jpeg"
+ : ext.endsWith(".webp")
+ ? "image/webp"
+ : ext.endsWith(".gif")
+ ? "image/gif"
+ : ext.endsWith(".bmp")
+ ? "image/bmp"
+ : "application/octet-stream";
+ return new Response(buf, { headers: { "Content-Type": mime, "Cache-Control": "no-cache" } });
+ } catch {
+ return c.json({ error: "Image not found" }, 404);
+ }
+ });
+
app.get("/conversations/:id/metrics", async (c) => {
const conversationId = c.req.param("id");