List a conversation's whole file tree, not just its top level

grab-conversation-files asked listBotFiles for the top level only, and a
bot saves into folders (reports/, seo/coderank/, tmp/...). The page
therefore carried none of the files a reply named, so every [file:ID]
chip rendered as dead plain text and the files could not be opened at
all: the bot had done the work and the user had no way to reach it.

The props now take the whole tree, and a chip that still isn't among
them (a message older than the page's first page of files) fetches its
one file by id, cached per id so a deleted one doesn't refetch on every
render.
This commit is contained in:
2026-10-22 07:37:21 +01:00
parent f1b7ba535f
commit de863618ba
4 changed files with 128 additions and 7 deletions
@@ -4,6 +4,7 @@ import H2 from "@moduletrace/twui/layout/H2";
import Span from "@moduletrace/twui/layout/Span";
import Stack from "@moduletrace/twui/layout/Stack";
import Input from "@moduletrace/twui/form/Input";
import Link from "@moduletrace/twui/layout/Link";
import { FolderOpen } from "lucide-react";
import fetchApi from "@moduletrace/twui/utils/fetch/fetchApi";
import type { APIResponseObject } from "@moduletrace/bunext/types";
@@ -114,6 +115,15 @@ export default function BotFilesModal({ bot, workspace, menu, on_open }: Props)
} MB used in this folder.`}
</Span>
) : null}
<Link
href={`/admin/files?volume=${workspace?.id ? "workspaces" : "bots"}&owner=${
workspace?.id || bot.id
}`}
title="Browse every folder in Files"
className="text-[12px] font-bold leading-4 text-ink underline underline-offset-2 hover:opacity-80"
>
Browse this folder in Files
</Link>
</Stack>
<Stack className="w-full mt-4 gap-2! items-stretch">