import type { ExtensionContext } from "@earendil-works/pi-coding-agent"; import { extractMessageText, truncateText } from "./messages.ts"; import { readNotifySettings, type NotifySettings } from "./settings.ts"; import { renderTemplate } from "./template.ts"; import type { NotificationRuntimeValues, NotifyConfig } from "./types.ts"; const DEFAULT_TITLE = "π - {project}"; const DEFAULT_BODY = "{message}"; export function getConfig( ctx: ExtensionContext | undefined, startedAt: number | undefined, messages: unknown[] | undefined, runtime: NotificationRuntimeValues, now = Date.now(), settings: NotifySettings = readNotifySettings(), ): NotifyConfig { const durationMs = startedAt === undefined ? 0 : Math.max(0, now - startedAt); const messageMax = settings.messageMax; const userMessage = truncateText(extractMessageText(messages, "user"), messageMax); const assistantMessage = truncateText(extractMessageText(messages, "assistant"), messageMax); const messageSource = settings.messageSource; const selectedMessage = messageSource === "user" ? userMessage : messageSource === "assistant" ? assistantMessage : ""; const message = selectedMessage || "Ready for input"; const toolErrorCount = Math.max(0, runtime.toolErrorCount ?? 0); const values = { user_message: userMessage, assistant_message: assistantMessage, message, status: toolErrorCount > 0 ? `ready · ${toolErrorCount} tool error${toolErrorCount === 1 ? "" : "s"}` : "ready", status_icon: toolErrorCount > 0 ? "⚠" : "✓", tool_error_count: String(toolErrorCount), }; return { enabled: settings.enabled, title: renderTemplate(settings.title || DEFAULT_TITLE, ctx, durationMs, values), body: renderTemplate(settings.body || DEFAULT_BODY, ctx, durationMs, values), durationMs, minDurationMs: settings.minDurationMs, notificationId: runtime.notificationId, visibility: settings.visibility, action: settings.action, soundCommand: settings.soundCommand, }; } export function shouldNotify(config: NotifyConfig, enabledOverride?: boolean): boolean { return (enabledOverride ?? config.enabled) && config.durationMs >= config.minDurationMs; }