( dateTs: number, conversationHistory: Anthropic.MessageParam[], defaultUri: vscode.Uri, )
| 34 | } |
| 35 | |
| 36 | export async function downloadTask( |
| 37 | dateTs: number, |
| 38 | conversationHistory: Anthropic.MessageParam[], |
| 39 | defaultUri: vscode.Uri, |
| 40 | ): Promise<vscode.Uri | undefined> { |
| 41 | // File name |
| 42 | const fileName = getTaskFileName(dateTs) |
| 43 | |
| 44 | // Generate markdown |
| 45 | const markdownContent = conversationHistory |
| 46 | .map((message) => { |
| 47 | const role = message.role === "user" ? "**User:**" : "**Assistant:**" |
| 48 | const content = Array.isArray(message.content) |
| 49 | ? message.content.map((block) => formatContentBlockToMarkdown(block as ExtendedContentBlock)).join("\n") |
| 50 | : message.content |
| 51 | return `${role}\n\n${content}\n\n` |
| 52 | }) |
| 53 | .join("---\n\n") |
| 54 | |
| 55 | // Prompt user for save location |
| 56 | const saveUri = await vscode.window.showSaveDialog({ |
| 57 | filters: { Markdown: ["md"] }, |
| 58 | defaultUri, |
| 59 | }) |
| 60 | |
| 61 | if (saveUri) { |
| 62 | // Write content to the selected location |
| 63 | await vscode.workspace.fs.writeFile(saveUri, Buffer.from(markdownContent)) |
| 64 | vscode.window.showTextDocument(saveUri, { preview: true }) |
| 65 | return saveUri |
| 66 | } |
| 67 | return undefined |
| 68 | } |
| 69 | |
| 70 | export function formatContentBlockToMarkdown(block: ExtendedContentBlock): string { |
| 71 | switch (block.type) { |
no test coverage detected