import type { ExtensionAPI } from "@earendil-works/pi-coding-agent"; /** The three immutable share envelopes accepted by the main conversation. */ export type ShareKind = "single" | "all" | "refined"; export type ShareTarget = Readonly<{ question: string; answer: string; entryId?: string; attemptId?: string }>; export type ShareDraft = Readonly<{ kind: ShareKind; header: string; targets: readonly ShareTarget[]; body: string }>; const headers: Record = { single: "[/btw note: the user asked this as a side question and chose to share the answer with you]", all: "[/btw note: the user asked these side questions and chose to share the answers with you]", refined: "[/btw note: the user asked a side question and chose to share a refined summary with you]", }; export function createShareDraft(kind: "single", target: ShareTarget): ShareDraft; export function createShareDraft(kind: "all", targets: readonly ShareTarget[]): ShareDraft; export function createShareDraft(kind: "refined", body: string, target?: ShareTarget): ShareDraft; export function createShareDraft(kind: ShareKind, value: ShareTarget | readonly ShareTarget[] | string, target?: ShareTarget): ShareDraft { const supplied = kind === "refined" ? (target ? [target] : []) : (Array.isArray(value) ? value : [value as ShareTarget]); const targets = supplied.map((item) => Object.freeze({ ...item })); const body = kind === "refined" ? String(value).trim() : targets.map(({ question, answer }) => `Q: ${question}\nA: ${answer}`).join("\n\n"); return Object.freeze({ kind, header: headers[kind], targets: Object.freeze(targets), body }); } export const shareHeader = (kind: ShareKind): string => headers[kind]; export const singleShareDraft = (target: ShareTarget): ShareDraft => createShareDraft("single", target); export const allShareDraft = (targets: readonly ShareTarget[]): ShareDraft => createShareDraft("all", targets); export const refinedShareDraft = (body: string, target?: ShareTarget): ShareDraft => createShareDraft("refined", body, target); export const renderShareDraft = (draft: ShareDraft): string => `${draft.header}\n${draft.body}`; /** The self-describing note appended to the main conversation when one answer is shared. */ export function buildPromoteNote(question: string, answer: string): string { return renderShareDraft(createShareDraft("single", { question, answer })); } /** Whole-thread variant: every shared Q/A of the thread in one note. */ export function buildMultiPromoteNote(pairs: { question: string; answer: string }[]): string { return renderShareDraft(createShareDraft("all", pairs)); } /** Refined variant: a shadow-pass rewrite of the Q/A instead of the raw text. */ export function buildRefinedPromoteNote(summary: string): string { return renderShareDraft(createShareDraft("refined", summary)); } /** Queue the note as one user-visible message to the main session. */ export function sendPromote(pi: ExtensionAPI, note: string): void { pi.sendMessage( { customType: "btw-promote", content: note, display: true }, { triggerTurn: false, deliverAs: "nextTurn" }, ); }