AkurAI Build
Menu

popagent

public

Latest change 6edc7e928c57dab23c0973ed3f7ee70b3ebb72d5 - Initial popagent baseline by AkurAI Build

import type { ChatMessage } from "./api-types";

type TextPart = { type: "text"; text: string } & Record<string, unknown>;

function isTextPart(part: unknown): part is TextPart {
  return typeof part === "object" && part !== null
    && "type" in part && "text" in part
    && part.type === "text" && typeof part.text === "string";
}

export function latestUserText(messages: ChatMessage[]): string | undefined {
  for (let index = messages.length - 1; index >= 0; index--) {
    const message = messages[index];
    if (!message || message.role !== "user") continue;
    const text = message.parts.filter(isTextPart).map((part) => part.text).join("\n").trim();
    if (text) return text;
  }
}

export function replaceLatestUserText(messages: ChatMessage[], replacement: string): void {
  for (let index = messages.length - 1; index >= 0; index--) {
    const message = messages[index];
    if (!message || message.role !== "user") continue;
    let replaced = false;
    message.parts = message.parts.filter((part) => {
      if (!isTextPart(part)) return true;
      if (replaced) return false;
      part.text = replacement;
      replaced = true;
      return true;
    });
    return;
  }
}