import { type Guild } from "discord.js"; import type { TaskCardInput, TaskCardResult } from "./base.js"; export interface PostTaskCardInput extends TaskCardInput { guild: Guild; handle: string; orgCwd: string; } export declare function postTaskCard(input: PostTaskCardInput): Promise; /** * v1.3.0 Part C (P0) — live works card. Opened on the first projectable stage * of a turn (grey ⏳ embed + thread); narration lines stream into the thread as * stages fire; `finalize` recolours the embed to the resolved kind and posts * the Chief reply. Replaces the batch `postTaskCard` for turns that actually * decompose/dispatch — chat turns and non-spawning turns keep the batch path. */ export interface OpenLiveTaskCardInput { guild: Guild; handle: string; orgCwd: string; userRequest: string; chiefName: string; /** * v1.3.0 Part B — customId for the 🛑 button (see `buildStopButtonId`). * Encodes (orgSlug, userId) so the InteractionCreate handler can cancel the * right turn. */ stopButtonId: string; } export declare class LiveTaskCard { private readonly cardMessage; private readonly thread; private readonly workflowId; private readonly orgCwd; private readonly userRequest; private readonly chiefName; private readonly kstStarted; private constructor(); static open(input: OpenLiveTaskCardInput): Promise; /** Stream one narration line into the thread as its stage fires. */ appendNarration(line: string): Promise; /** * Close the live card: recolour the embed to the resolved kind + completed * status and post the Chief reply into the thread. Note we do NOT rename the * thread to the resolved kind — Discord rate-limits thread renames hard, and * the embed already carries the kind. */ finalize(input: { kind: TaskCardInput["kind"]; chiefReply: string; }): Promise; /** * v1.3.0 Part B — the turn was aborted (🛑 button or `/cancel`). Recolour the * embed to the cancelled state and drop the button. Best-effort; never * throws (the abort path must not fail on a Discord edit). */ cancel(): Promise; }