/** * Shared chat activity (tool / approval / ask / A2A) helpers. * * Used by the web SPA reducer and the Ink TUI so both surfaces merge * `onToolActivity` + approval/ask dock events the same way. */ import type { ToolActivityStep } from './types.js'; export type ChatActivityStepKind = ToolActivityStep['kind'] | 'approval' | 'ask'; export interface ChatActivityStep { id: string; kind: ChatActivityStepKind; label: string; status: ToolActivityStep['status']; startedAt: number; finishedAt?: number; preview?: string; todoItems?: ToolActivityStep['todoItems']; } export interface ChatActivity { runId: string; status: 'running' | 'success' | 'error'; startedAt: number; finishedAt?: number; durationMs?: number; outputChars?: number; error?: string; steps: ChatActivityStep[]; } export declare function createChatActivity(runId: string, startedAt?: number): ChatActivity; /** Upsert one live tool/skill/agent/status step onto an activity. */ export declare function mergeActivityStep(activity: ChatActivity, step: ChatActivityStep): ChatActivity; export declare function mergeToolActivityStep(activity: ChatActivity, step: ToolActivityStep): ChatActivity; export declare function appendApprovalStep(activity: ChatActivity, opts: { messageId: string; toolName: string; inputJson?: string; startedAt?: number; }): ChatActivity; export declare function resolveApprovalStep(activity: ChatActivity, opts: { messageId: string; decision: 'allow' | 'deny' | 'timeout' | string; finishedAt?: number; }): ChatActivity; export declare function appendAskStep(activity: ChatActivity, opts: { messageId: string; label: string; body?: string; startedAt?: number; }): ChatActivity; export declare function resolveAskStep(activity: ChatActivity, opts: { messageId: string; finalText?: string; finishedAt?: number; }): ChatActivity; export declare function finishActivity(activity: ChatActivity, opts: { status: 'success' | 'error'; finishedAt?: number; error?: string; outputChars?: number; }): ChatActivity; export declare function approvalDecisionToStepStatus(decision: string): ChatActivityStep['status']; /** Live A2A / agent step preferred for "Waiting for subagent" copy. */ export declare function findWaitingAgentStep(activity: ChatActivity): ChatActivityStep | undefined; export declare function findLiveActivityStep(activity: ChatActivity): ChatActivityStep | undefined; export declare function formatActivityDuration(ms: number | undefined): string | null; /** Per-kind tallies for collapsed “Worked · N tools · M skills” titles. */ export interface ChatActivityKindCounts { tools: number; skills: number; agents: number; approvals: number; asks: number; total: number; } export declare function countActivityStepKinds(activity: ChatActivity): ChatActivityKindCounts; /** * Compact English/Chinese-style summary fragments after “Worked” / * “已完成”, e.g. `["2 tools", "1 skill"]`. Empty when there are no steps. * Callers join with ` · ` and append duration separately. */ export declare function formatActivityKindSummaryParts(counts: ChatActivityKindCounts, locale?: 'en' | 'zh'): string[]; //# sourceMappingURL=chat-activity.d.ts.map