|
@@ -52,7 +52,6 @@ import { DialogMessage } from "./dialog-message"
|
|
|
import type { PromptInfo } from "../../component/prompt/history"
|
|
import type { PromptInfo } from "../../component/prompt/history"
|
|
|
import { iife } from "@/util/iife"
|
|
import { iife } from "@/util/iife"
|
|
|
import { DialogConfirm } from "@tui/ui/dialog-confirm"
|
|
import { DialogConfirm } from "@tui/ui/dialog-confirm"
|
|
|
-import { DialogPrompt } from "@tui/ui/dialog-prompt"
|
|
|
|
|
import { DialogTimeline } from "./dialog-timeline"
|
|
import { DialogTimeline } from "./dialog-timeline"
|
|
|
import { DialogForkFromTimeline } from "./dialog-fork-from-timeline"
|
|
import { DialogForkFromTimeline } from "./dialog-fork-from-timeline"
|
|
|
import { DialogSessionRename } from "../../component/dialog-session-rename"
|
|
import { DialogSessionRename } from "../../component/dialog-session-rename"
|
|
@@ -67,7 +66,7 @@ import stripAnsi from "strip-ansi"
|
|
|
import { Footer } from "./footer.tsx"
|
|
import { Footer } from "./footer.tsx"
|
|
|
import { usePromptRef } from "../../context/prompt"
|
|
import { usePromptRef } from "../../context/prompt"
|
|
|
import { Filesystem } from "@/util/filesystem"
|
|
import { Filesystem } from "@/util/filesystem"
|
|
|
-import { DialogSubagent } from "./dialog-subagent.tsx"
|
|
|
|
|
|
|
+import { DialogExportOptions } from "../../ui/dialog-export-options"
|
|
|
|
|
|
|
|
addDefaultParsers(parsers.parsers)
|
|
addDefaultParsers(parsers.parsers)
|
|
|
|
|
|
|
@@ -784,8 +783,22 @@ export function Session() {
|
|
|
for (const part of parts) {
|
|
for (const part of parts) {
|
|
|
if (part.type === "text" && !part.synthetic) {
|
|
if (part.type === "text" && !part.synthetic) {
|
|
|
transcript += `${part.text}\n\n`
|
|
transcript += `${part.text}\n\n`
|
|
|
|
|
+ } else if (part.type === "reasoning") {
|
|
|
|
|
+ if (showThinking()) {
|
|
|
|
|
+ transcript += `_Thinking:_\n\n${part.text}\n\n`
|
|
|
|
|
+ }
|
|
|
} else if (part.type === "tool") {
|
|
} else if (part.type === "tool") {
|
|
|
- transcript += `\`\`\`\nTool: ${part.tool}\n\`\`\`\n\n`
|
|
|
|
|
|
|
+ transcript += `\`\`\`\nTool: ${part.tool}\n`
|
|
|
|
|
+ if (showDetails() && part.state.input) {
|
|
|
|
|
+ transcript += `\n**Input:**\n\`\`\`json\n${JSON.stringify(part.state.input, null, 2)}\n\`\`\``
|
|
|
|
|
+ }
|
|
|
|
|
+ if (showDetails() && part.state.status === "completed" && part.state.output) {
|
|
|
|
|
+ transcript += `\n**Output:**\n\`\`\`\n${part.state.output}\n\`\`\``
|
|
|
|
|
+ }
|
|
|
|
|
+ if (showDetails() && part.state.status === "error" && part.state.error) {
|
|
|
|
|
+ transcript += `\n**Error:**\n\`\`\`\n${part.state.error}\n\`\`\``
|
|
|
|
|
+ }
|
|
|
|
|
+ transcript += `\n\`\`\`\n\n`
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -812,6 +825,14 @@ export function Session() {
|
|
|
const sessionData = session()
|
|
const sessionData = session()
|
|
|
const sessionMessages = messages()
|
|
const sessionMessages = messages()
|
|
|
|
|
|
|
|
|
|
+ const defaultFilename = `session-${sessionData.id.slice(0, 8)}.md`
|
|
|
|
|
+
|
|
|
|
|
+ const options = await DialogExportOptions.show(dialog, defaultFilename, showThinking(), showDetails())
|
|
|
|
|
+
|
|
|
|
|
+ if (options === null) return
|
|
|
|
|
+
|
|
|
|
|
+ const { filename: customFilename, thinking: includeThinking, toolDetails: includeToolDetails } = options
|
|
|
|
|
+
|
|
|
let transcript = `# ${sessionData.title}\n\n`
|
|
let transcript = `# ${sessionData.title}\n\n`
|
|
|
transcript += `**Session ID:** ${sessionData.id}\n`
|
|
transcript += `**Session ID:** ${sessionData.id}\n`
|
|
|
transcript += `**Created:** ${new Date(sessionData.time.created).toLocaleString()}\n`
|
|
transcript += `**Created:** ${new Date(sessionData.time.created).toLocaleString()}\n`
|
|
@@ -826,22 +847,28 @@ export function Session() {
|
|
|
for (const part of parts) {
|
|
for (const part of parts) {
|
|
|
if (part.type === "text" && !part.synthetic) {
|
|
if (part.type === "text" && !part.synthetic) {
|
|
|
transcript += `${part.text}\n\n`
|
|
transcript += `${part.text}\n\n`
|
|
|
|
|
+ } else if (part.type === "reasoning") {
|
|
|
|
|
+ if (includeThinking) {
|
|
|
|
|
+ transcript += `_Thinking:_\n\n${part.text}\n\n`
|
|
|
|
|
+ }
|
|
|
} else if (part.type === "tool") {
|
|
} else if (part.type === "tool") {
|
|
|
- transcript += `\`\`\`\nTool: ${part.tool}\n\`\`\`\n\n`
|
|
|
|
|
|
|
+ transcript += `\`\`\`\nTool: ${part.tool}\n`
|
|
|
|
|
+ if (includeToolDetails && part.state.input) {
|
|
|
|
|
+ transcript += `\n**Input:**\n\`\`\`json\n${JSON.stringify(part.state.input, null, 2)}\n\`\`\``
|
|
|
|
|
+ }
|
|
|
|
|
+ if (includeToolDetails && part.state.status === "completed" && part.state.output) {
|
|
|
|
|
+ transcript += `\n**Output:**\n\`\`\`\n${part.state.output}\n\`\`\``
|
|
|
|
|
+ }
|
|
|
|
|
+ if (includeToolDetails && part.state.status === "error" && part.state.error) {
|
|
|
|
|
+ transcript += `\n**Error:**\n\`\`\`\n${part.state.error}\n\`\`\``
|
|
|
|
|
+ }
|
|
|
|
|
+ transcript += `\n\`\`\`\n\n`
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
transcript += `---\n\n`
|
|
transcript += `---\n\n`
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // Prompt for optional filename
|
|
|
|
|
- const customFilename = await DialogPrompt.show(dialog, "Export filename", {
|
|
|
|
|
- value: `session-${sessionData.id.slice(0, 8)}.md`,
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
- // Cancel if user pressed escape
|
|
|
|
|
- if (customFilename === null) return
|
|
|
|
|
-
|
|
|
|
|
// Save to file in current working directory
|
|
// Save to file in current working directory
|
|
|
const exportDir = process.cwd()
|
|
const exportDir = process.cwd()
|
|
|
const filename = customFilename.trim()
|
|
const filename = customFilename.trim()
|