| import type { Message } from 'ai'; |
| import { generateId } from './fileUtils'; |
| import { detectProjectCommands, createCommandsMessage, escapeBoltTags } from './projectCommands'; |
|
|
| export const createChatFromFolder = async ( |
| files: File[], |
| binaryFiles: string[], |
| folderName: string, |
| ): Promise<Message[]> => { |
| const fileArtifacts = await Promise.all( |
| files.map(async (file) => { |
| return new Promise<{ content: string; path: string }>((resolve, reject) => { |
| const reader = new FileReader(); |
|
|
| reader.onload = () => { |
| const content = reader.result as string; |
| const relativePath = file.webkitRelativePath.split('/').slice(1).join('/'); |
| resolve({ |
| content, |
| path: relativePath, |
| }); |
| }; |
| reader.onerror = reject; |
| reader.readAsText(file); |
| }); |
| }), |
| ); |
|
|
| const commands = await detectProjectCommands(fileArtifacts); |
| const commandsMessage = createCommandsMessage(commands); |
|
|
| const binaryFilesMessage = |
| binaryFiles.length > 0 |
| ? `\n\nSkipped ${binaryFiles.length} binary files:\n${binaryFiles.map((f) => `- ${f}`).join('\n')}` |
| : ''; |
|
|
| const filesMessage: Message = { |
| role: 'assistant', |
| content: `I've imported the contents of the "${folderName}" folder.${binaryFilesMessage} |
| |
| <boltArtifact id="imported-files" title="Imported Files" type="bundled" > |
| ${fileArtifacts |
| .map( |
| (file) => `<boltAction type="file" filePath="${file.path}"> |
| ${escapeBoltTags(file.content)} |
| </boltAction>`, |
| ) |
| .join('\n\n')} |
| </boltArtifact>`, |
| id: generateId(), |
| createdAt: new Date(), |
| }; |
|
|
| const userMessage: Message = { |
| role: 'user', |
| id: generateId(), |
| content: `Import the "${folderName}" folder`, |
| createdAt: new Date(), |
| }; |
|
|
| const messages = [userMessage, filesMessage]; |
|
|
| if (commandsMessage) { |
| messages.push({ |
| role: 'user', |
| id: generateId(), |
| content: 'Setup the codebase and Start the application', |
| }); |
| messages.push(commandsMessage); |
| } |
|
|
| return messages; |
| }; |
|
|