🚀 feat: Artifact Editing & Downloads (#5428)

* refactor: expand container

* chore: bump @codesandbox/sandpack-react to latest

* WIP: first pass, show editor

* feat: implement ArtifactCodeEditor and ArtifactTabs components for enhanced artifact management

* refactor: fileKey

* refactor: auto scrolling code editor and add messageId to artifact

* feat: first pass, editing artifact

* feat: first pass, robust artifact replacement

* fix: robust artifact replacement & re-render when expected

* feat: Download Artifacts

* refactor: improve artifact editing UX

* fix: layout shift of new download button

* fix: enhance missing output checks and logging in StreamRunManager
This commit is contained in:
Danny Avila 2025-01-23 18:19:04 -05:00 committed by GitHub
parent 87383fec27
commit ed57bb4711
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
34 changed files with 1156 additions and 237 deletions

View file

@ -10,7 +10,7 @@ export const userPlugins = () => '/api/user/plugins';
export const deleteUser = () => '/api/user/delete';
export const messages = (conversationId: string, messageId?: string) =>
`/api/messages/${conversationId}${messageId ? `/${messageId}` : ''}`;
`/api/messages/${conversationId}${messageId != null && messageId ? `/${messageId}` : ''}`;
const shareRoot = '/api/share';
export const shareMessages = (shareId: string) => `${shareRoot}/${shareId}`;

View file

@ -76,6 +76,13 @@ export function updateMessage(payload: t.TUpdateMessageRequest): Promise<unknown
return request.put(endpoints.messages(conversationId, messageId), { text });
}
export const editArtifact = async ({
messageId,
...params
}: m.TEditArtifactRequest): Promise<m.TEditArtifactResponse> => {
return request.post(`/api/messages/artifact/${messageId}`, params);
};
export function updateMessageContent(payload: t.TUpdateMessageContent): Promise<unknown> {
const { conversationId, messageId, index, text } = payload;
if (!conversationId) {

View file

@ -315,3 +315,19 @@ export type TDeleteSharedLinkResponse = {
shareId: string;
message: string;
};
export type TEditArtifactRequest = {
index: number;
messageId: string;
original: string;
updated: string;
};
export type TEditArtifactResponse = Pick<types.TMessage, 'content' | 'text' | 'conversationId'>;
export type EditArtifactOptions = MutationOptions<
TEditArtifactResponse,
TEditArtifactRequest,
unknown,
Error
>;