/** * The moments timeline (S9b) view-model helpers: grouping and the zero-verb * candidate reasons. Everything here is STRUCTURED-DATA → SENTENCE glue; the * banned-words CI test (`tests/moment-copy.spec.ts`) audits the rendered * strings, so no imperative or predictive verb may appear — the system * proposes refusable rows, it never urges, ranks, or predicts. * @module dsh-client-ui-mimir/client/moments-view */ import type { ResearchMomentIndexView, ResearchMomentView } from 'dsh-mimir/types'; /** Words the candidate copy must never contain (prediction-ban, enforced by CI). */ export declare const MOMENT_BANNED_WORDS: readonly ["接近", "逼近", "突破", "在即", "建议", "应该", "值得", "快要", "approaching", "breakthrough", "near", "should", "consider", "worth", "on track"]; /** The three reading groups of the unified timeline. */ export type MomentGroup = 'canonical' | 'candidate' | 'declined'; /** Group one row: canonical (pin/eureka) → candidate (unrefused) → declined. */ export declare function groupOf(moment: ResearchMomentView): MomentGroup; /** The (at, id)-ordered rows split into the three groups, order preserved. */ export declare function groupMoments(view: ResearchMomentIndexView): Readonly>; /** * The one-line reason of a candidate row: its sources' phrases joined, plus * the magnitude — pure description, zero verbs. The closeness footnote is * appended ONLY when the profile speaks (the caller checks `view.speaks`). */ export declare function formatCandidateReason(moment: ResearchMomentView, t: (key: string) => string): string; //# sourceMappingURL=moments-view.d.ts.map