75 lines
2.3 KiB
TypeScript
75 lines
2.3 KiB
TypeScript
import { normalizeChatType } from "../channels/chat-type.js";
|
|
import { resolveSenderLabel, type SenderLabelParams } from "../channels/sender-label.js";
|
|
|
|
export type AgentEnvelopeParams = {
|
|
channel: string;
|
|
from?: string;
|
|
timestamp?: number | Date;
|
|
host?: string;
|
|
ip?: string;
|
|
body: string;
|
|
};
|
|
|
|
function formatTimestamp(ts?: number | Date): string | undefined {
|
|
if (!ts) return undefined;
|
|
const date = ts instanceof Date ? ts : new Date(ts);
|
|
if (Number.isNaN(date.getTime())) return undefined;
|
|
|
|
const yyyy = String(date.getUTCFullYear()).padStart(4, "0");
|
|
const mm = String(date.getUTCMonth() + 1).padStart(2, "0");
|
|
const dd = String(date.getUTCDate()).padStart(2, "0");
|
|
const hh = String(date.getUTCHours()).padStart(2, "0");
|
|
const min = String(date.getUTCMinutes()).padStart(2, "0");
|
|
|
|
// Compact ISO-like UTC timestamp with minutes precision.
|
|
// Example: 2025-01-02T03:04Z
|
|
return `${yyyy}-${mm}-${dd}T${hh}:${min}Z`;
|
|
}
|
|
|
|
export function formatAgentEnvelope(params: AgentEnvelopeParams): string {
|
|
const channel = params.channel?.trim() || "Channel";
|
|
const parts: string[] = [channel];
|
|
if (params.from?.trim()) parts.push(params.from.trim());
|
|
if (params.host?.trim()) parts.push(params.host.trim());
|
|
if (params.ip?.trim()) parts.push(params.ip.trim());
|
|
const ts = formatTimestamp(params.timestamp);
|
|
if (ts) parts.push(ts);
|
|
const header = `[${parts.join(" ")}]`;
|
|
return `${header} ${params.body}`;
|
|
}
|
|
|
|
export function formatInboundEnvelope(params: {
|
|
channel: string;
|
|
from: string;
|
|
body: string;
|
|
timestamp?: number | Date;
|
|
chatType?: string;
|
|
senderLabel?: string;
|
|
sender?: SenderLabelParams;
|
|
}): string {
|
|
const chatType = normalizeChatType(params.chatType);
|
|
const isDirect = !chatType || chatType === "direct";
|
|
const resolvedSender = params.senderLabel?.trim() || resolveSenderLabel(params.sender ?? {});
|
|
const body = !isDirect && resolvedSender ? `${resolvedSender}: ${params.body}` : params.body;
|
|
return formatAgentEnvelope({
|
|
channel: params.channel,
|
|
from: params.from,
|
|
timestamp: params.timestamp,
|
|
body,
|
|
});
|
|
}
|
|
|
|
export function formatThreadStarterEnvelope(params: {
|
|
channel: string;
|
|
author?: string;
|
|
timestamp?: number | Date;
|
|
body: string;
|
|
}): string {
|
|
return formatAgentEnvelope({
|
|
channel: params.channel,
|
|
from: params.author,
|
|
timestamp: params.timestamp,
|
|
body: params.body,
|
|
});
|
|
}
|