@growth-labs/cms 0.5.8 → 0.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +26 -0
  2. package/dist/engine/content-insights.d.ts +11 -4
  3. package/dist/engine/content-insights.d.ts.map +1 -1
  4. package/dist/engine/content-insights.js +22 -7
  5. package/dist/engine/content-insights.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/routes/content-insights.d.ts +1 -1
  11. package/dist/routes/content-insights.d.ts.map +1 -1
  12. package/dist/routes/content-insights.js +20 -5
  13. package/dist/routes/content-insights.js.map +1 -1
  14. package/dist/schema/index.d.ts +1 -0
  15. package/dist/schema/index.d.ts.map +1 -1
  16. package/dist/schema/index.js +1 -0
  17. package/dist/schema/index.js.map +1 -1
  18. package/dist/schema/insights-ingest.d.ts +2386 -0
  19. package/dist/schema/insights-ingest.d.ts.map +1 -1
  20. package/dist/schema/insights-ingest.js +78 -0
  21. package/dist/schema/insights-ingest.js.map +1 -1
  22. package/dist/schema/migrations.d.ts.map +1 -1
  23. package/dist/schema/migrations.js +9 -0
  24. package/dist/schema/migrations.js.map +1 -1
  25. package/dist/schema/types.d.ts +67 -0
  26. package/dist/schema/types.d.ts.map +1 -1
  27. package/dist/schema/types.js +10 -0
  28. package/dist/schema/types.js.map +1 -1
  29. package/dist/surveys/schema.d.ts +48 -48
  30. package/dist/ui/screens/ContentInsightsScreen.d.ts +28 -0
  31. package/dist/ui/screens/ContentInsightsScreen.d.ts.map +1 -1
  32. package/dist/ui/screens/ContentInsightsScreen.js +111 -36
  33. package/dist/ui/screens/ContentInsightsScreen.js.map +1 -1
  34. package/dist/ui/screens/content-insights-data.d.ts +13 -1
  35. package/dist/ui/screens/content-insights-data.d.ts.map +1 -1
  36. package/dist/ui/screens/content-insights-data.js +29 -1
  37. package/dist/ui/screens/content-insights-data.js.map +1 -1
  38. package/migrations/0022_content_insight_dismissal_reasons.sql +8 -0
  39. package/package.json +1 -1
  40. package/src/engine/content-insights.ts +32 -7
  41. package/src/index.ts +2 -0
  42. package/src/routes/content-insights.ts +31 -5
  43. package/src/schema/index.ts +1 -0
  44. package/src/schema/insights-ingest.ts +94 -0
  45. package/src/schema/migrations.ts +9 -0
  46. package/src/schema/types.ts +92 -0
  47. package/src/ui/screens/ContentInsightsScreen.tsx +416 -195
  48. package/src/ui/screens/content-insights-data.ts +40 -2
@@ -1,17 +1,38 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  // src/ui/screens/ContentInsightsScreen.tsx — Content Insights demand-intelligence board (bead-09).
3
- // Near-clone of TopicsScreen: desk groups (geographic theater) + a pinned Best Immediate Bets
4
- // ranking + a Trackers section; each card expands into the full editorial mini-brief; dismiss
5
- // persists and filters subsequent loads. Native reads from SITE_DB via /admin/api/content-insights.
6
- // beat is rendered as a secondary chip next to signal_type (Adaptation 3 — spec §desk-taxonomy).
7
- // Broadsheet idiom only; honest loading/empty/error/schema-not-ready/last-good-board states.
3
+ // Lane-first editorial decision docket. Each card appears once in its Insight Engine action
4
+ // lane and expands into its bounded evidence plus the full editorial mini-brief. Legacy rows
5
+ // remain readable in an unclassified appendix; dismiss persists and filters subsequent loads.
8
6
  import { useCallback, useEffect, useReducer, useState } from 'react';
9
7
  import { Icon } from '../icons.js';
10
- import { audienceQuestionGroups, bestBets, competitorWatchGroups, demandDeskGroups, discoveryKindOf, formatDemandEvidence, initInsightsState, insightsReducer, trackers, } from './content-insights-data.js';
8
+ import { discoveryKindOf, formatDemandEvidence, initInsightsState, insightsReducer, laneGroups, shouldRenderInsightLanes, } from './content-insights-data.js';
9
+ /** Build the exact bounded route body; route validation remains authoritative. */
10
+ export function buildDismissRequest(intentKey, reasonCode, note) {
11
+ if (reasonCode === '')
12
+ return null;
13
+ const normalizedNote = note.trim();
14
+ if (normalizedNote.length > 500)
15
+ return null;
16
+ if (reasonCode === 'other' && normalizedNote.length < 3)
17
+ return null;
18
+ return {
19
+ intentKey,
20
+ reasonCode,
21
+ ...(normalizedNote.length > 0 ? { note: normalizedNote } : {}),
22
+ };
23
+ }
24
+ /** A non-2xx response must leave the card and its editor intact for correction. */
25
+ export function shouldRemoveDismissedCard(responseOk) {
26
+ return responseOk;
27
+ }
11
28
  export function ContentInsightsScreen() {
12
29
  const [s, dispatch] = useReducer(insightsReducer, undefined, initInsightsState);
13
30
  const [expanded, setExpanded] = useState(null);
14
31
  const [dismissing, setDismissing] = useState(null);
32
+ const [dismissEditorFor, setDismissEditorFor] = useState(null);
33
+ const [dismissReasonCode, setDismissReasonCode] = useState('');
34
+ const [dismissNote, setDismissNote] = useState('');
35
+ const [dismissError, setDismissError] = useState(null);
15
36
  const fetchBoard = useCallback(async () => {
16
37
  dispatch({ type: 'fetch-start' });
17
38
  try {
@@ -34,45 +55,61 @@ export function ContentInsightsScreen() {
34
55
  useEffect(() => {
35
56
  void fetchBoard();
36
57
  }, [fetchBoard]);
58
+ const openDismissEditor = (card) => {
59
+ setDismissEditorFor(card.intent_key);
60
+ setDismissReasonCode('');
61
+ setDismissNote('');
62
+ setDismissError(null);
63
+ };
64
+ const closeDismissEditor = () => {
65
+ setDismissEditorFor(null);
66
+ setDismissReasonCode('');
67
+ setDismissNote('');
68
+ setDismissError(null);
69
+ };
37
70
  const dismiss = async (card) => {
71
+ const body = buildDismissRequest(card.intent_key, dismissReasonCode, dismissNote);
72
+ if (body == null) {
73
+ setDismissError(dismissReasonCode === 'other'
74
+ ? 'Other requires an editorial note of at least 3 characters.'
75
+ : 'Choose a dismissal reason before saving.');
76
+ return;
77
+ }
38
78
  setDismissing(card.intent_key);
79
+ setDismissError(null);
39
80
  try {
40
81
  const res = await fetch('/admin/api/content-insights/dismiss', {
41
82
  method: 'POST',
42
83
  headers: { 'content-type': 'application/json' },
43
- body: JSON.stringify({ intentKey: card.intent_key }),
84
+ body: JSON.stringify(body),
44
85
  });
45
- if (res.ok)
86
+ if (shouldRemoveDismissedCard(res.ok)) {
46
87
  dispatch({ type: 'dismiss-ok', intentKey: card.intent_key });
88
+ closeDismissEditor();
89
+ }
90
+ else {
91
+ setDismissError(`Could not save dismissal — ${res.status} ${res.statusText}`);
92
+ }
93
+ }
94
+ catch (error) {
95
+ setDismissError(`Could not save dismissal — ${String(error)}`);
47
96
  }
48
97
  finally {
49
98
  setDismissing(null);
50
99
  }
51
100
  };
52
- // DEMAND board groups (GSC) — the two opportunity sub-kinds render in their own
53
- // labelled sections (Competitor Watch + What Readers Are Asking) below.
54
- const groups = demandDeskGroups(s.insights);
55
- const competitorGroups = competitorWatchGroups(s.insights);
56
- const audienceGroups = audienceQuestionGroups(s.insights);
57
- const bets = bestBets(s.insights);
58
- const trackerCards = trackers(s.insights);
59
- return (_jsxs("div", { className: "page page-wide content-insights-screen fade-in", style: { maxWidth: 1340 }, children: [_jsxs("div", { className: "page-head", children: [_jsxs("div", { children: [_jsx("h1", { className: "page-title", children: "Content Insights" }), _jsx("div", { className: "page-sub", children: "Editor-ready demand intelligence \u2014 what to write next, grounded in real search demand and validated opportunity." })] }), _jsxs("button", { type: "button", className: "btn", onClick: () => void fetchBoard(), children: [_jsx(Icon, { name: "refresh", size: 16 }), " Refresh"] })] }), s.loading && !s.loaded && (_jsx("div", { className: "kicker", style: { padding: 18 }, children: "Loading the board\u2026" })), s.error && (_jsxs("div", { className: "panel panel-pad", style: { color: 'var(--red)' }, children: ["Couldn't load Content Insights \u2014 ", s.error, ' ', _jsxs("button", { type: "button", className: "btn sm", onClick: () => void fetchBoard(), children: [_jsx(Icon, { name: "refresh", size: 14 }), " Retry"] })] })), s.schemaNotReady && (_jsx(EmptyPanel, { icon: "layers", message: "Content Insights isn't provisioned on this site yet (migration 0016 not applied)." })), s.loaded && !s.error && !s.schemaNotReady && s.insights.length === 0 && (_jsx(EmptyPanel, { icon: "sparkle", message: "No insights yet \u2014 the daily research run hasn't landed a board." })), bets.length > 0 && (_jsxs("div", { className: "panel", style: { overflow: 'hidden', marginBottom: 'var(--gap)' }, children: [_jsx("div", { style: { padding: '15px 18px 12px' }, children: _jsx("div", { className: "card-title", children: "Best immediate bets" }) }), _jsx("hr", { className: "masthead-rule", style: { margin: '0 18px' } }), _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 10, padding: 18 }, children: bets.map((c) => (_jsx(InsightCardRow, { card: c, expanded: expanded === c.intent_key, onToggle: () => setExpanded(expanded === c.intent_key ? null : c.intent_key), onDismiss: () => void dismiss(c), dismissing: dismissing === c.intent_key }, c.intent_key))) })] })), groups.map((g) => (_jsxs("div", { className: "panel", style: { overflow: 'hidden', marginBottom: 'var(--gap)' }, children: [_jsxs("div", { style: {
60
- padding: '15px 18px 12px',
61
- display: 'flex',
62
- alignItems: 'baseline',
63
- gap: 10,
64
- }, children: [_jsx("div", { className: "card-title", style: { textTransform: 'capitalize' }, children: g.desk }), _jsxs("span", { className: "kicker", children: [g.cards.length, " ideas"] })] }), _jsx("hr", { className: "masthead-rule", style: { margin: '0 18px' } }), _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 10, padding: 18 }, children: g.cards.map((c) => (_jsx(InsightCardRow, { card: c, expanded: expanded === c.intent_key, onToggle: () => setExpanded(expanded === c.intent_key ? null : c.intent_key), onDismiss: () => void dismiss(c), dismissing: dismissing === c.intent_key }, c.intent_key))) })] }, g.desk))), competitorGroups.length > 0 && (_jsx(OpportunitySection, { title: "Competitor Watch", subtitle: "What rivals are publishing that we're missing", groups: competitorGroups, expanded: expanded, setExpanded: setExpanded, dismiss: dismiss, dismissing: dismissing })), audienceGroups.length > 0 && (_jsx(OpportunitySection, { title: "What Readers Are Asking", subtitle: "Real reader questions (Google People-Also-Ask) we don't yet answer", groups: audienceGroups, expanded: expanded, setExpanded: setExpanded, dismiss: dismiss, dismissing: dismissing })), trackerCards.length > 0 && (_jsxs("div", { className: "panel", style: { overflow: 'hidden' }, children: [_jsx("div", { style: { padding: '15px 18px 12px' }, children: _jsx("div", { className: "card-title", children: "Trackers" }) }), _jsx("hr", { className: "masthead-rule", style: { margin: '0 18px' } }), _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 10, padding: 18 }, children: trackerCards.map((c) => (_jsx(InsightCardRow, { card: c, expanded: expanded === c.intent_key, onToggle: () => setExpanded(expanded === c.intent_key ? null : c.intent_key), onDismiss: () => void dismiss(c), dismissing: dismissing === c.intent_key }, c.intent_key))) })] }))] }));
65
- }
66
- /** One labelled opportunity SECTION (Competitor Watch / What Readers Are Asking),
67
- * grouped by desk inside. Reuses the desk-panel + InsightCardRow rendering so the
68
- * two new sub-kinds match the rest of the board. */
69
- function OpportunitySection({ title, subtitle, groups, expanded, setExpanded, dismiss, dismissing, }) {
70
- return (_jsxs("div", { className: "panel", style: { overflow: 'hidden', marginBottom: 'var(--gap)' }, children: [_jsxs("div", { style: { padding: '15px 18px 6px' }, children: [_jsx("div", { className: "card-title", children: title }), _jsx("div", { className: "kicker", style: { marginTop: 2 }, children: subtitle })] }), _jsx("hr", { className: "masthead-rule", style: { margin: '0 18px' } }), groups.map((g) => (_jsxs("div", { children: [_jsxs("div", { style: {
71
- padding: '12px 18px 6px',
72
- display: 'flex',
73
- alignItems: 'baseline',
74
- gap: 10,
75
- }, children: [_jsx("div", { className: "card-title", style: { textTransform: 'capitalize', fontSize: '0.95em' }, children: g.desk }), _jsxs("span", { className: "kicker", children: [g.cards.length, " ideas"] })] }), _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 10, padding: '0 18px 14px' }, children: g.cards.map((c) => (_jsx(InsightCardRow, { card: c, expanded: expanded === c.intent_key, onToggle: () => setExpanded(expanded === c.intent_key ? null : c.intent_key), onDismiss: () => void dismiss(c), dismissing: dismissing === c.intent_key }, c.intent_key))) })] }, g.desk)))] }));
101
+ const groups = laneGroups(s.insights);
102
+ return (_jsxs("div", { className: "page page-wide content-insights-screen fade-in", style: { maxWidth: 1340 }, children: [_jsxs("div", { className: "page-head", children: [_jsxs("div", { children: [_jsx("h1", { className: "page-title", children: "Content Insights" }), _jsx("div", { className: "page-sub", children: "Editor-ready demand intelligence \u2014 what to write next, grounded in real search demand and validated opportunity." })] }), _jsxs("button", { type: "button", className: "btn", onClick: () => void fetchBoard(), children: [_jsx(Icon, { name: "refresh", size: 16 }), " Refresh"] })] }), s.loading && !s.loaded && (_jsx("div", { className: "kicker", style: { padding: 18 }, children: "Loading the board\u2026" })), s.error && (_jsxs("div", { className: "panel panel-pad", style: { color: 'var(--red)' }, children: ["Couldn't load Content Insights \u2014 ", s.error, ' ', _jsxs("button", { type: "button", className: "btn sm", onClick: () => void fetchBoard(), children: [_jsx(Icon, { name: "refresh", size: 14 }), " Retry"] })] })), s.schemaNotReady && (_jsx(EmptyPanel, { icon: "layers", message: "Content Insights isn't provisioned on this site yet (migration 0016 not applied)." })), shouldRenderInsightLanes(s) && (_jsx("section", { "aria-label": "Insight Engine decision lanes", children: groups.map((group) => (_jsxs("section", { className: "panel", "aria-labelledby": `insight-lane-${group.lane ?? 'legacy'}`, style: {
103
+ overflow: 'hidden',
104
+ marginBottom: 'var(--gap)',
105
+ borderLeft: `3px solid ${group.lane == null ? 'var(--hairline)' : 'var(--gold)'}`,
106
+ }, children: [_jsxs("header", { style: {
107
+ padding: '15px 18px 12px',
108
+ display: 'flex',
109
+ alignItems: 'baseline',
110
+ justifyContent: 'space-between',
111
+ gap: 12,
112
+ }, children: [_jsx("h2", { id: `insight-lane-${group.lane ?? 'legacy'}`, className: "card-title serif", style: { margin: 0 }, children: group.label }), _jsxs("span", { className: "kicker tnum", children: [group.cards.length, " ", group.cards.length === 1 ? 'idea' : 'ideas'] })] }), _jsx("hr", { className: "masthead-rule", style: { margin: '0 18px' } }), _jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 10, padding: 18 }, children: group.cards.length === 0 ? (_jsx("div", { className: "kicker", style: { padding: '10px 0', color: 'var(--ink-faint)' }, children: "No ideas in this lane." })) : (group.cards.map((card) => (_jsx(InsightCardRow, { card: card, expanded: expanded === card.intent_key, onToggle: () => setExpanded(expanded === card.intent_key ? null : card.intent_key), dismissEditorOpen: dismissEditorFor === card.intent_key, onOpenDismissEditor: () => openDismissEditor(card), onCancelDismissEditor: closeDismissEditor, onSubmitDismiss: () => void dismiss(card), dismissReasonCode: dismissReasonCode, dismissNote: dismissNote, dismissError: dismissError, onDismissReasonCodeChange: setDismissReasonCode, onDismissNoteChange: setDismissNote, dismissing: dismissing === card.intent_key }, card.intent_key)))) })] }, group.lane ?? 'legacy'))) }))] }));
76
113
  }
77
114
  function evidenceChip(card) {
78
115
  if ('query' in card.evidence)
@@ -85,7 +122,20 @@ function evidenceChip(card) {
85
122
  }
86
123
  return `${card.evidence.basis} · ${card.evidence.source_count} sources`;
87
124
  }
88
- function InsightCardRow({ card, expanded, onToggle, onDismiss, dismissing, }) {
125
+ function formatPercent(value) {
126
+ return `${(value * 100).toLocaleString('en-US', { maximumFractionDigits: 2 })}%`;
127
+ }
128
+ function formatEvidenceNumber(value) {
129
+ return value.toLocaleString('en-US', { maximumFractionDigits: 2 });
130
+ }
131
+ function formatSignedEvidenceNumber(value) {
132
+ const formatted = formatEvidenceNumber(value);
133
+ return value > 0 ? `+${formatted}` : formatted;
134
+ }
135
+ export function InsightCardRow({ card, expanded, onToggle, dismissEditorOpen, onOpenDismissEditor, onCancelDismissEditor, onSubmitDismiss, dismissReasonCode, dismissNote, dismissError, onDismissReasonCodeChange, onDismissNoteChange, dismissing, }) {
136
+ const detailsId = `insight-details-${card.id}`;
137
+ const dismissReasonId = `insight-dismiss-reason-${card.id}`;
138
+ const dismissNoteId = `insight-dismiss-note-${card.id}`;
89
139
  return (_jsxs("div", { style: {
90
140
  border: '1px solid var(--border)',
91
141
  borderRadius: 'var(--radius)',
@@ -96,20 +146,45 @@ function InsightCardRow({ card, expanded, onToggle, onDismiss, dismissing, }) {
96
146
  gridTemplateColumns: 'minmax(0,1fr) auto',
97
147
  alignItems: 'center',
98
148
  gap: 12,
99
- }, children: [_jsxs("button", { type: "button", onClick: onToggle, style: {
149
+ }, children: [_jsxs("button", { type: "button", onClick: onToggle, "aria-expanded": expanded, "aria-controls": detailsId, style: {
100
150
  textAlign: 'left',
101
151
  background: 'none',
102
152
  border: 'none',
103
153
  cursor: 'pointer',
104
154
  minWidth: 0,
105
- }, children: [_jsx("div", { style: { fontSize: 14, fontWeight: 600, color: 'var(--ink)' }, children: card.headline }), _jsx("div", { className: "kicker", style: { marginTop: 4 }, children: card.brief.why_now }), _jsx("div", { className: "mono", style: { marginTop: 4, fontSize: 12, color: 'var(--ink-faint)' }, children: evidenceChip(card) })] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 8 }, children: [_jsx("span", { className: "pill pdot", children: card.signal_type }), card.beat != null && _jsx("span", { className: "pill pdot", children: card.beat }), _jsxs("button", { type: "button", className: "btn danger sm", onClick: onDismiss, disabled: dismissing, children: [_jsx(Icon, { name: "x", size: 13 }), " ", dismissing ? 'Dismissing…' : 'Dismiss'] })] })] }), expanded && (_jsxs("div", { style: {
155
+ }, children: [_jsx("div", { style: { fontSize: 14, fontWeight: 600, color: 'var(--ink)' }, children: card.headline }), _jsx("div", { className: "kicker", style: { marginTop: 4 }, children: card.brief.why_now }), _jsx("div", { className: "mono", style: { marginTop: 4, fontSize: 12, color: 'var(--ink-faint)' }, children: evidenceChip(card) })] }), _jsxs("div", { style: {
156
+ display: 'flex',
157
+ alignItems: 'center',
158
+ justifyContent: 'flex-end',
159
+ flexWrap: 'wrap',
160
+ gap: 8,
161
+ }, children: [_jsx("span", { className: "pill pdot", children: card.desk }), _jsx("span", { className: "pill pdot", children: card.signal_type }), (card.signal_type === 'opportunity' || card.brief.discoveryKind != null) && (_jsx("span", { className: "pill pdot", children: discoveryKindOf(card) })), card.suggestion_type === 'tracker' && _jsx("span", { className: "pill pdot", children: "tracker" }), card.beat != null && _jsx("span", { className: "pill pdot", children: card.beat }), card.is_best_bet === 1 && (_jsxs("span", { className: "pill pdot", children: ["best bet", card.best_bet_rank != null ? ` #${card.best_bet_rank}` : ''] })), _jsxs("button", { type: "button", className: "btn danger sm", onClick: dismissEditorOpen ? onCancelDismissEditor : onOpenDismissEditor, disabled: dismissing, children: [_jsx(Icon, { name: "x", size: 13 }), " ", dismissEditorOpen ? 'Cancel dismissal' : 'Dismiss'] })] })] }), dismissEditorOpen && (_jsxs("form", { onSubmit: (event) => {
162
+ event.preventDefault();
163
+ onSubmitDismiss();
164
+ }, style: {
165
+ marginTop: 12,
166
+ borderTop: '1px solid var(--border)',
167
+ paddingTop: 12,
168
+ display: 'grid',
169
+ gap: 10,
170
+ }, children: [_jsxs("div", { children: [_jsxs("label", { htmlFor: dismissReasonId, className: "kicker", children: ["Dismiss reason ", _jsx("span", { "aria-hidden": "true", children: "*" })] }), _jsxs("select", { id: dismissReasonId, className: "selectbox", value: dismissReasonCode, onChange: (event) => onDismissReasonCodeChange(event.currentTarget.value), required: true, "aria-describedby": `${dismissReasonId}-help`, children: [_jsx("option", { value: "", disabled: true, children: "Choose a reason" }), _jsx("option", { value: "off_topic", children: "Off topic" }), _jsx("option", { value: "already_covered", children: "Already covered" }), _jsx("option", { value: "cant_win", children: "Can\u2019t win" }), _jsx("option", { value: "wrong_format", children: "Wrong format" }), _jsx("option", { value: "not_now", children: "Not now" }), _jsx("option", { value: "other", children: "Other" })] }), _jsx("div", { id: `${dismissReasonId}-help`, className: "kicker", style: { marginTop: 4 }, children: "Reason is required." })] }), _jsxs("div", { children: [_jsxs("label", { htmlFor: dismissNoteId, className: "kicker", children: ["Editorial note ", dismissReasonCode === 'other' && '(required)'] }), _jsx("textarea", { id: dismissNoteId, className: "textarea", value: dismissNote, onChange: (event) => onDismissNoteChange(event.currentTarget.value), maxLength: 500, required: dismissReasonCode === 'other', "aria-describedby": `${dismissNoteId}-help` }), _jsxs("div", { id: `${dismissNoteId}-help`, className: "kicker", style: { marginTop: 4 }, children: ["500 characters maximum", dismissReasonCode === 'other' && ' · Required for Other (at least 3 characters)'] })] }), dismissError != null && (_jsx("div", { role: "alert", style: { color: 'var(--red)', fontSize: 13 }, children: dismissError })), _jsxs("div", { style: { display: 'flex', justifyContent: 'flex-end', gap: 8 }, children: [_jsx("button", { type: "button", className: "btn sm", onClick: onCancelDismissEditor, disabled: dismissing, children: "Cancel" }), _jsxs("button", { type: "submit", className: "btn danger sm", disabled: dismissing, children: [_jsx(Icon, { name: "x", size: 13 }), " ", dismissing ? 'Saving…' : 'Save dismissal'] })] })] })), expanded && (_jsxs("div", { id: detailsId, style: {
106
171
  marginTop: 12,
107
172
  borderTop: '1px solid var(--border)',
108
173
  paddingTop: 12,
109
174
  fontSize: 13.5,
110
175
  color: 'var(--ink-soft)',
111
176
  lineHeight: 1.6,
112
- }, children: [_jsxs("div", { children: [_jsx("strong", { children: "Angle:" }), " ", card.brief.angle] }), _jsxs("div", { style: { marginTop: 8 }, children: [_jsx("strong", { children: "Cluster:" }), " ", card.brief.cluster.canonical, card.brief.cluster.spokes.length > 0 && ` — ${card.brief.cluster.spokes.join(', ')}`] }), card.brief.sources.length > 0 && (_jsxs("div", { style: { marginTop: 8 }, children: [_jsx("strong", { children: "Sources:" }), _jsx("ul", { style: { margin: '4px 0 0', paddingLeft: 18 }, children: card.brief.sources.map((src) => (_jsx("li", { children: _jsx("a", { href: src.url, target: "_blank", rel: "noreferrer", children: src.title }) }, src.url))) })] }))] }))] }));
177
+ }, children: [card.evidence.scoreBreakdown != null && (_jsxs("div", { className: "mono tnum", style: {
178
+ display: 'flex',
179
+ flexWrap: 'wrap',
180
+ gap: '6px 18px',
181
+ padding: '9px 10px',
182
+ marginBottom: 12,
183
+ background: 'var(--accent-tint)',
184
+ borderLeft: '2px solid var(--accent)',
185
+ fontSize: 12,
186
+ }, children: [_jsxs("span", { children: [_jsx("strong", { children: "Actual CTR:" }), " ", formatPercent(card.evidence.scoreBreakdown.actualCtr)] }), _jsxs("span", { children: [_jsx("strong", { children: "Expected CTR:" }), ' ', formatPercent(card.evidence.scoreBreakdown.expectedCtr)] }), _jsxs("span", { children: [_jsx("strong", { children: "Expected click gain:" }), ' ', formatEvidenceNumber(card.evidence.scoreBreakdown.expectedClicksGain)] }), _jsxs("span", { children: [_jsx("strong", { children: "Lane weight:" }), ' ', formatPercent(card.evidence.scoreBreakdown.laneWeight)] }), _jsxs("span", { children: [_jsx("strong", { children: "Score:" }), " ", formatEvidenceNumber(card.evidence.scoreBreakdown.score)] }), _jsxs("span", { children: [_jsx("strong", { children: "Target position:" }), ' ', formatEvidenceNumber(card.evidence.scoreBreakdown.targetPosition)] }), _jsxs("span", { children: [_jsx("strong", { children: "Breakdown topical fit:" }), ' ', formatPercent(card.evidence.scoreBreakdown.topicalFit)] }), _jsxs("span", { children: [_jsx("strong", { children: "Winnability prior:" }), ' ', formatPercent(card.evidence.scoreBreakdown.winnabilityPrior)] })] })), 'query' in card.evidence &&
187
+ (card.evidence.coveredBy != null || card.evidence.coverageSource != null) && (_jsxs("div", { style: { marginBottom: 12 }, children: [card.evidence.coveredBy != null && (_jsxs("div", { children: [_jsx("strong", { children: "Covered by:" }), ' ', _jsx("a", { href: card.evidence.coveredBy, target: "_blank", rel: "noreferrer", children: card.evidence.coveredBy })] })), card.evidence.coverageSource != null && (_jsxs("div", { children: [_jsx("strong", { children: "Coverage source:" }), " ", card.evidence.coverageSource] }))] })), card.evidence.semantic != null && (_jsxs("div", { style: { marginBottom: 12 }, children: [_jsx("div", { className: "kicker", style: { marginBottom: 4 }, children: "Semantic evidence" }), _jsxs("div", { children: [_jsx("strong", { children: "Topical fit:" }), " ", formatPercent(card.evidence.semantic.topicalFit), " \u00B7", ' ', _jsx("strong", { children: "Disposition:" }), " ", card.evidence.semantic.disposition, " \u00B7", ' ', _jsx("strong", { children: "Coverage similarity:" }), ' ', formatPercent(card.evidence.semantic.coverageSimilarity), " \u00B7", ' ', card.evidence.semantic.coverageAligned ? 'aligned' : 'not aligned', " \u00B7", ' ', card.evidence.semantic.sharedConcepts, " shared concepts"] }), card.evidence.semantic.nearest.length > 0 && (_jsx("ul", { style: { margin: '4px 0 0', paddingLeft: 18 }, children: card.evidence.semantic.nearest.map((entry) => (_jsxs("li", { children: [entry.title, " (", formatPercent(entry.similarity), ")"] }, `${entry.slug}-${entry.title}`))) }))] })), card.evidence.judge != null && (_jsxs("div", { style: { marginBottom: 12 }, children: [_jsx("div", { className: "kicker", style: { marginBottom: 4 }, children: "Judge decision" }), _jsxs("div", { children: [_jsx("strong", { children: "Judge:" }), " ", card.evidence.judge.verdict, " \u00B7", ' ', card.evidence.judge.reason_code, " \u00B7 ", formatPercent(card.evidence.judge.confidence), ' ', "confidence"] }), _jsx("div", { children: card.evidence.judge.intent_statement }), card.evidence.judge.winnability != null && (_jsxs("div", { style: { marginTop: 4 }, children: [_jsx("strong", { children: "Winnability:" }), " ", card.evidence.judge.winnability.verdict, " \u00B7", ' ', formatPercent(card.evidence.judge.winnability.confidence), " confidence \u2014", ' ', card.evidence.judge.winnability.serp_summary] }))] })), _jsxs("div", { children: [_jsx("strong", { children: "Angle:" }), " ", card.brief.angle] }), _jsxs("div", { style: { marginTop: 8 }, children: [_jsx("strong", { children: "Cluster:" }), " ", card.brief.cluster.canonical, card.brief.cluster.spokes.length > 0 && ` — ${card.brief.cluster.spokes.join(', ')}`] }), card.brief.format != null && (_jsxs("div", { style: { marginTop: 8 }, children: [_jsx("strong", { children: "Format:" }), " ", card.brief.format] })), card.brief.content_outline != null && card.brief.content_outline.length > 0 && (_jsxs("div", { style: { marginTop: 8 }, children: [_jsx("strong", { children: "Content outline:" }), _jsx("ol", { style: { margin: '4px 0 0', paddingLeft: 20 }, children: card.brief.content_outline.map((item) => (_jsxs("li", { children: [item.question, item.demand != null && (_jsxs("div", { className: "mono", style: { fontSize: 12, color: 'var(--ink-muted)' }, children: [item.demand.query, " \u00B7 pos ", item.demand.position.toFixed(1), " \u00B7", ' ', item.demand.impressions.toLocaleString('en-US'), " impr \u00B7 trend", ' ', formatSignedEvidenceNumber(item.demand.trend)] }))] }, item.question))) })] })), card.brief.sources.length > 0 && (_jsxs("div", { style: { marginTop: 8 }, children: [_jsx("strong", { children: "Sources:" }), _jsx("ul", { style: { margin: '4px 0 0', paddingLeft: 18 }, children: card.brief.sources.map((src) => (_jsx("li", { children: _jsx("a", { href: src.url, target: "_blank", rel: "noreferrer", children: src.title }) }, src.url))) })] }))] }))] }));
113
188
  }
114
189
  function EmptyPanel({ icon, message, }) {
115
190
  return (_jsxs("div", { style: {
@@ -1 +1 @@
1
- {"version":3,"file":"ContentInsightsScreen.js","sourceRoot":"","sources":["../../../src/ui/screens/ContentInsightsScreen.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ContentInsightsScreen.js","sourceRoot":"","sources":["../../../src/ui/screens/ContentInsightsScreen.tsx"],"names":[],"mappings":"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"}
@@ -1,10 +1,15 @@
1
- import type { ContentInsightRow, InsightEvidence } from '../../schema/types.js';
1
+ import type { ContentInsightRow, InsightEvidence, InsightLane } from '../../schema/types.js';
2
2
  /** InsightCard is ContentInsightRow — alias to prevent drift. */
3
3
  export type InsightCard = ContentInsightRow;
4
4
  export interface DeskGroup {
5
5
  desk: string;
6
6
  cards: InsightCard[];
7
7
  }
8
+ export interface InsightLaneGroup {
9
+ lane: InsightLane | null;
10
+ label: string;
11
+ cards: InsightCard[];
12
+ }
8
13
  export interface InsightsState {
9
14
  loading: boolean;
10
15
  error: string | null;
@@ -30,6 +35,13 @@ export type InsightsAction = {
30
35
  };
31
36
  export declare function initInsightsState(): InsightsState;
32
37
  export declare function insightsReducer(state: InsightsState, action: InsightsAction): InsightsState;
38
+ /** Show lane panels only after a successful board load, retaining the last good board on errors. */
39
+ export declare function shouldRenderInsightLanes(state: InsightsState): boolean;
40
+ /**
41
+ * Project a board into the five Insight Engine action lanes. Legacy cards stay
42
+ * readable in one conditional appendix instead of being dropped or duplicated.
43
+ */
44
+ export declare function laneGroups(cards: InsightCard[]): InsightLaneGroup[];
33
45
  /** Group cards by desk (desks alphabetical), each desk's cards sorted by desk_rank then headline. */
34
46
  export declare function deskGroups(cards: InsightCard[]): DeskGroup[];
35
47
  /** Which open-web discovery stream an opportunity card came from (theater split).
@@ -1 +1 @@
1
- {"version":3,"file":"content-insights-data.d.ts","sourceRoot":"","sources":["../../../src/ui/screens/content-insights-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAE/E,iEAAiE;AACjE,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAA;AAE3C,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,WAAW,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,cAAc,EAAE,OAAO,CAAA;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,OAAO,CAAA;CACf;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5C,wBAAgB,iBAAiB,IAAI,aAAa,CASjD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,aAAa,CAsB3F;AAED,qGAAqG;AACrG,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAe5D;AAED;;2EAE2E;AAC3E,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,GAAG,mBAAmB,CAErF;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAIvE;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAMxE;AAED;mFACmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAElE;AAED,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAO5D;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAE5D;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAE3F"}
1
+ {"version":3,"file":"content-insights-data.d.ts","sourceRoot":"","sources":["../../../src/ui/screens/content-insights-data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAE5F,iEAAiE;AACjE,MAAM,MAAM,WAAW,GAAG,iBAAiB,CAAA;AAE3C,MAAM,WAAW,SAAS;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,WAAW,EAAE,CAAA;CACpB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,WAAW,EAAE,CAAA;CACpB;AAUD,MAAM,WAAW,aAAa;IAC7B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,cAAc,EAAE,OAAO,CAAA;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,OAAO,CAAA;CACf;AAED,MAAM,MAAM,cAAc,GACvB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GACvB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,kBAAkB,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAA;AAE5C,wBAAgB,iBAAiB,IAAI,aAAa,CASjD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,cAAc,GAAG,aAAa,CAsB3F;AAED,oGAAoG;AACpG,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAEtE;AAED;;;GAGG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,gBAAgB,EAAE,CAanE;AAED,qGAAqG;AACrG,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAe5D;AAED;;2EAE2E;AAC3E,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,GAAG,mBAAmB,CAErF;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAIvE;AAED,kFAAkF;AAClF,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAMxE;AAED;mFACmF;AACnF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,CAElE;AAED,iFAAiF;AACjF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAO5D;AAED,4EAA4E;AAC5E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAE5D;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,OAAO,CAAC,eAAe,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAE3F"}
@@ -1,3 +1,10 @@
1
+ const CANONICAL_LANES = [
2
+ { lane: 'commission', label: 'Commission' },
3
+ { lane: 'refresh', label: 'Refresh' },
4
+ { lane: 'optimize-ctr', label: 'Optimize CTR' },
5
+ { lane: 'consolidate', label: 'Consolidate' },
6
+ { lane: 'monitor', label: 'Monitor' },
7
+ ];
1
8
  export function initInsightsState() {
2
9
  return {
3
10
  loading: true,
@@ -22,7 +29,7 @@ export function insightsReducer(state, action) {
22
29
  loaded: true,
23
30
  };
24
31
  case 'fetch-error':
25
- return { ...state, loading: false, error: action.error, loaded: true };
32
+ return { ...state, loading: false, error: action.error, loaded: state.loaded };
26
33
  case 'schema-not-ready':
27
34
  return { ...state, loading: false, error: null, schemaNotReady: true, loaded: true };
28
35
  case 'dismiss-ok':
@@ -31,6 +38,27 @@ export function insightsReducer(state, action) {
31
38
  return state;
32
39
  }
33
40
  }
41
+ /** Show lane panels only after a successful board load, retaining the last good board on errors. */
42
+ export function shouldRenderInsightLanes(state) {
43
+ return state.loaded && !state.schemaNotReady;
44
+ }
45
+ /**
46
+ * Project a board into the five Insight Engine action lanes. Legacy cards stay
47
+ * readable in one conditional appendix instead of being dropped or duplicated.
48
+ */
49
+ export function laneGroups(cards) {
50
+ const sorted = (items) => items.sort((a, b) => a.desk_rank - b.desk_rank || a.headline.localeCompare(b.headline));
51
+ const groups = CANONICAL_LANES.map(({ lane, label }) => ({
52
+ lane,
53
+ label,
54
+ cards: sorted(cards.filter((card) => card.evidence.lane === lane)),
55
+ }));
56
+ const legacy = sorted(cards.filter((card) => card.evidence.lane == null));
57
+ if (legacy.length > 0) {
58
+ groups.push({ lane: null, label: 'Legacy / unclassified', cards: legacy });
59
+ }
60
+ return groups;
61
+ }
34
62
  /** Group cards by desk (desks alphabetical), each desk's cards sorted by desk_rank then headline. */
35
63
  export function deskGroups(cards) {
36
64
  const byDesk = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"content-insights-data.js","sourceRoot":"","sources":["../../../src/ui/screens/content-insights-data.ts"],"names":[],"mappings":"AA0BA,MAAM,UAAU,iBAAiB;IAChC,OAAO;QACN,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,KAAK;QACrB,QAAQ,EAAE,EAAE;QACZ,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,KAAK;KACb,CAAA;AACF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAoB,EAAE,MAAsB;IAC3E,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,aAAa;YACjB,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,CAAA;QACvE,KAAK,UAAU;YACd,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,IAAI;gBACX,cAAc,EAAE,KAAK;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,IAAI;aACZ,CAAA;QACF,KAAK,aAAa;YACjB,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QACvE,KAAK,kBAAkB;YACtB,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;QACrF,KAAK,YAAY;YAChB,OAAO,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,MAAM,CAAC,SAAS,CAAC,EAAE,CAAA;QAC/F;YACC,OAAO,KAAK,CAAA;IACd,CAAC;AACF,CAAC;AAED,qGAAqG;AACrG,MAAM,UAAU,UAAU,CAAC,KAAoB;IAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAyB,CAAA;IAC/C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;QACrC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACZ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;IACzB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;SAClC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACf,IAAI;QACJ,KAAK,EAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAmB,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAC3E;KACD,CAAC,CAAC,CAAA;AACL,CAAC;AAED;;2EAE2E;AAC3E,MAAM,UAAU,eAAe,CAAC,IAAiB;IAChD,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,KAAK,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAA;AAC7F,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,qBAAqB,CAAC,KAAoB;IACzD,OAAO,UAAU,CAChB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,aAAa,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,CAC3F,CAAA;AACF,CAAC;AAED,kFAAkF;AAClF,MAAM,UAAU,sBAAsB,CAAC,KAAoB;IAC1D,OAAO,UAAU,CAChB,KAAK,CAAC,MAAM,CACX,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,aAAa,IAAI,eAAe,CAAC,CAAC,CAAC,KAAK,mBAAmB,CACpF,CACD,CAAA;AACF,CAAC;AAED;mFACmF;AACnF,MAAM,UAAU,gBAAgB,CAAC,KAAoB;IACpD,OAAO,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,aAAa,CAAC,CAAC,CAAA;AACxE,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC5C,OAAO,KAAK;SACV,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC;SAClC,IAAI,CACJ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACR,CAAC,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,aAAa,IAAI,MAAM,CAAC,gBAAgB,CAAC,CAC5F,CAAA;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,QAAQ,CAAC,KAAoB;IAC5C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,KAAK,SAAS,CAAC,CAAA;AAC5D,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,oBAAoB,CAAC,CAA8C;IAClF,OAAO,OAAO,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;AACzH,CAAC"}
1
+ {"version":3,"file":"content-insights-data.js","sourceRoot":"","sources":["../../../src/ui/screens/content-insights-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ -- 0022_content_insight_dismissal_reasons: retain bounded editor rationale on
2
+ -- site-scoped Insight Engine dismissals. Nullable fields preserve legacy rows.
3
+
4
+ ALTER TABLE content_insight_dismissals
5
+ ADD COLUMN reason_code TEXT CHECK (reason_code IS NULL OR reason_code IN ('off_topic', 'already_covered', 'cant_win', 'wrong_format', 'not_now', 'other'));
6
+
7
+ ALTER TABLE content_insight_dismissals
8
+ ADD COLUMN note TEXT CHECK (note IS NULL OR length(note) <= 500);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@growth-labs/cms",
3
- "version": "0.5.8",
3
+ "version": "0.5.10",
4
4
  "type": "module",
5
5
  "bin": {
6
6
  "growth-labs-cms-migrations": "./dist/cli/migrations.js"
@@ -1,10 +1,32 @@
1
1
  import type { InsightsIngestPayload } from '../schema/insights-ingest.js'
2
- import type { ContentInsightRow, InsightBrief, InsightEvidence } from '../schema/types.js'
2
+ import type {
3
+ ContentInsightRow,
4
+ InsightBrief,
5
+ InsightDismissalReasonCode,
6
+ InsightEvidence,
7
+ } from '../schema/types.js'
3
8
  import type { D1Database } from './d1.js'
4
9
 
5
- /** True when the error is a missing content_insights table (drift 409 schema_not_ready). */
10
+ /** True when an Insights read/write depends on a table missing from an older schema. */
6
11
  export function isMissingInsightsTable(error: unknown): boolean {
7
- return error instanceof Error && /no such table: content_insights/i.test(error.message)
12
+ return (
13
+ error instanceof Error &&
14
+ /no such table: (?:content_insights|content_insight_dismissals)\b/i.test(error.message)
15
+ )
16
+ }
17
+
18
+ /**
19
+ * True only for schema drift that a reason-coded dismissal requires. This is
20
+ * deliberately scoped to the dismissal route: bare D1 missing-column errors do
21
+ * not identify their table, while the engine statement here only names
22
+ * content_insight_dismissals.
23
+ */
24
+ export function isMissingInsightDismissalSchema(error: unknown): boolean {
25
+ if (isMissingInsightsTable(error)) return true
26
+ if (!(error instanceof Error)) return false
27
+ return /(?:no such column:\s*(?:reason_code|note)\b|table\s+content_insight_dismissals\s+has no column named\s+(?:reason_code|note)\b)/i.test(
28
+ error.message,
29
+ )
8
30
  }
9
31
 
10
32
  interface RawInsightRow extends Omit<ContentInsightRow, 'evidence' | 'brief'> {
@@ -45,19 +67,22 @@ export async function listInsightBoard(
45
67
  return (result.results || []).map(decodeRow)
46
68
  }
47
69
 
48
- /** Persist a dismissal for (site_id, intent_key). Idempotent via INSERT OR REPLACE on the PK. */
70
+ /** Persist an editor-attributed dismissal for (site_id, intent_key), replacing trusted reason data. */
49
71
  export async function dismissInsight(
50
72
  db: D1Database,
51
73
  siteId: string,
52
74
  intentKey: string,
53
75
  dismissedBy: string | null,
76
+ reasonCode: InsightDismissalReasonCode,
77
+ note: string | null,
54
78
  ): Promise<void> {
55
79
  await db
56
80
  .prepare(
57
- `INSERT OR REPLACE INTO content_insight_dismissals (site_id, intent_key, dismissed_at, dismissed_by)
58
- VALUES (?, ?, unixepoch(), ?)`,
81
+ `INSERT OR REPLACE INTO content_insight_dismissals
82
+ (site_id, intent_key, dismissed_at, dismissed_by, reason_code, note)
83
+ VALUES (?, ?, unixepoch(), ?, ?, ?)`,
59
84
  )
60
- .bind(siteId, intentKey, dismissedBy)
85
+ .bind(siteId, intentKey, dismissedBy, reasonCode, note)
61
86
  .run()
62
87
  }
63
88
 
package/src/index.ts CHANGED
@@ -68,6 +68,8 @@ export {
68
68
  type ContentType,
69
69
  type ContentVisibility,
70
70
  type FoundryCallbackEventRow,
71
+ type InsightDismissalReasonCode,
72
+ InsightDismissalReasonCodeSchema,
71
73
  type MastheadUserRow,
72
74
  type MediaAssetRow,
73
75
  NON_CMS_TABLES,
@@ -1,6 +1,7 @@
1
1
  import { z } from 'zod'
2
2
  import {
3
3
  dismissInsight,
4
+ isMissingInsightDismissalSchema,
4
5
  isMissingInsightsTable,
5
6
  listInsightBoard,
6
7
  replaceInsightsBoard,
@@ -8,11 +9,19 @@ import {
8
9
  } from '../engine/content-insights.js'
9
10
  import { verifyHmac } from '../engine/foundry-dispatch.js'
10
11
  import { InsightsIngestPayloadSchema } from '../schema/insights-ingest.js'
12
+ import { InsightDismissalReasonCodeSchema } from '../schema/types.js'
11
13
  import type { CmsRouteConfig } from './config.js'
12
14
  import { resolveConfig } from './config.js'
13
15
  import { json, type RouteContext } from './context.js'
14
16
 
15
- const DismissSchema = z.object({ intentKey: z.string().min(1) })
17
+ const DismissSchema = z
18
+ .object({
19
+ intentKey: z.string().min(1),
20
+ reasonCode: InsightDismissalReasonCodeSchema,
21
+ note: z.string().max(500).optional(),
22
+ })
23
+ .strict()
24
+ const IntentKeySchema = z.object({ intentKey: z.string().min(1) })
16
25
 
17
26
  /** Resolve YYYY-MM-DD; defaults to the current UTC date when no ?runDate is given. */
18
27
  function resolveRunDate(ctx: RouteContext): string {
@@ -57,7 +66,7 @@ export interface ContentInsightsRouteConfig extends CmsRouteConfig {
57
66
  export interface ContentInsightsRouteHandlers {
58
67
  /** GET /content/insights?runDate= — the current board, dismissed intents filtered out. */
59
68
  board(ctx: RouteContext): Promise<Response>
60
- /** POST /content/insights/dismiss { intentKey } — persist a dismissal. */
69
+ /** POST /content/insights/dismiss { intentKey, reasonCode, note? } — persist a dismissal. */
61
70
  dismiss(ctx: RouteContext): Promise<Response>
62
71
  /** POST /content/insights/undismiss { intentKey } — clear a dismissal. */
63
72
  undismiss(ctx: RouteContext): Promise<Response>
@@ -91,11 +100,28 @@ export function createContentInsightsRoutes(
91
100
  const parsed = DismissSchema.safeParse(await ctx.request.json().catch(() => null))
92
101
  if (!parsed.success)
93
102
  return json({ error: 'Invalid request', details: parsed.error.flatten() }, 400)
103
+ const note = parsed.data.note?.trim() || null
104
+ if (parsed.data.reasonCode === 'other' && (note == null || note.length < 3)) {
105
+ return json(
106
+ {
107
+ error: 'Invalid request',
108
+ details: { note: ['A note of at least 3 characters is required for other.'] },
109
+ },
110
+ 400,
111
+ )
112
+ }
94
113
  try {
95
- await dismissInsight(ctx.db, siteId, parsed.data.intentKey, ctx.userId ?? null)
114
+ await dismissInsight(
115
+ ctx.db,
116
+ siteId,
117
+ parsed.data.intentKey,
118
+ ctx.userId ?? null,
119
+ parsed.data.reasonCode,
120
+ note,
121
+ )
96
122
  return json({ dismissed: true })
97
123
  } catch (error) {
98
- if (isMissingInsightsTable(error)) return json({ error: 'schema_not_ready' }, 409)
124
+ if (isMissingInsightDismissalSchema(error)) return json({ error: 'schema_not_ready' }, 409)
99
125
  throw error
100
126
  }
101
127
  },
@@ -103,7 +129,7 @@ export function createContentInsightsRoutes(
103
129
  async undismiss(ctx) {
104
130
  const denied = await resolved.authz.requirePublisher(ctx)
105
131
  if (denied) return denied
106
- const parsed = DismissSchema.safeParse(await ctx.request.json().catch(() => null))
132
+ const parsed = IntentKeySchema.safeParse(await ctx.request.json().catch(() => null))
107
133
  if (!parsed.success)
108
134
  return json({ error: 'Invalid request', details: parsed.error.flatten() }, 400)
109
135
  try {
@@ -48,3 +48,4 @@ export type {
48
48
  WorkspaceMembershipRow,
49
49
  WorkspaceSettingsRow,
50
50
  } from './types.js'
51
+ export { type InsightDismissalReasonCode, InsightDismissalReasonCodeSchema } from './types.js'