57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
import type { ReplyToMode } from "../../config/types.js";
|
|
|
|
export type ReplyReferencePlanner = {
|
|
/** Returns the effective reply/thread id for the next send and updates state. */
|
|
use(): string | undefined;
|
|
/** Mark that a reply was sent (needed when no reference is used). */
|
|
markSent(): void;
|
|
/** Whether a reply has been sent in this flow. */
|
|
hasReplied(): boolean;
|
|
};
|
|
|
|
export function createReplyReferencePlanner(options: {
|
|
replyToMode: ReplyToMode;
|
|
/** Existing thread/reference id (always used when present). */
|
|
existingId?: string;
|
|
/** Id to start a new thread/reference when allowed (e.g., parent message id). */
|
|
startId?: string;
|
|
/** Disable reply references entirely (e.g., when posting inside a new thread). */
|
|
allowReference?: boolean;
|
|
/** Seed the planner with prior reply state. */
|
|
hasReplied?: boolean;
|
|
}): ReplyReferencePlanner {
|
|
let hasReplied = options.hasReplied ?? false;
|
|
const allowReference = options.allowReference !== false;
|
|
const existingId = options.existingId?.trim();
|
|
const startId = options.startId?.trim();
|
|
|
|
const use = (): string | undefined => {
|
|
if (!allowReference) return undefined;
|
|
if (existingId) {
|
|
hasReplied = true;
|
|
return existingId;
|
|
}
|
|
if (!startId) return undefined;
|
|
if (options.replyToMode === "off") return undefined;
|
|
if (options.replyToMode === "all") {
|
|
hasReplied = true;
|
|
return startId;
|
|
}
|
|
if (!hasReplied) {
|
|
hasReplied = true;
|
|
return startId;
|
|
}
|
|
return undefined;
|
|
};
|
|
|
|
const markSent = () => {
|
|
hasReplied = true;
|
|
};
|
|
|
|
return {
|
|
use,
|
|
markSent,
|
|
hasReplied: () => hasReplied,
|
|
};
|
|
}
|