diff --git a/cagent b/cagent new file mode 100755 index 000000000..5b536dc52 Binary files /dev/null and b/cagent differ diff --git a/pkg/app/transcript/transcript.go b/pkg/app/transcript/transcript.go index 94f662faf..4704920cc 100644 --- a/pkg/app/transcript/transcript.go +++ b/pkg/app/transcript/transcript.go @@ -12,8 +12,49 @@ import ( func PlainText(sess *session.Session) string { var builder strings.Builder + // Make a copy of the session items to avoid race conditions + // Messages is a public field, so we can access it directly + items := make([]session.Item, len(sess.Messages)) + copy(items, sess.Messages) + + // Find the last summary in the session + lastSummaryIndex := -1 + var summary string + for i := len(items) - 1; i >= 0; i-- { + if items[i].Summary != "" { + lastSummaryIndex = i + summary = items[i].Summary + break + } + } + + // If a summary exists, start with it + if lastSummaryIndex >= 0 { + fmt.Fprintf(&builder, "## Session Summary\n\n%s\n", summary) + } + + // Get all messages messages := sess.GetAllMessages() - for i := range messages { + + // If we have a summary, we need to skip messages that were summarized + // We do this by tracking message indices and only including messages after the summary + var startMessageIndex int + if lastSummaryIndex >= 0 { + // Count how many messages come before the summary + messageCount := 0 + for i := 0; i <= lastSummaryIndex; i++ { + if items[i].IsMessage() { + messageCount++ + } else if items[i].IsSubSession() { + // Count all messages in the sub-session + messageCount += len(items[i].SubSession.GetAllMessages()) + } + } + startMessageIndex = messageCount + } + + // Write messages (starting after the summary if one exists) + for i := startMessageIndex; i < len(messages); i++ { msg := messages[i] if msg.Implicit {