phase 16: fix TS strict mode errors, node 24, update steering docs

This commit is contained in:
Celes Renata
2026-04-11 16:35:50 -07:00
parent faccb0b8db
commit 1fcb79503e
8 changed files with 86 additions and 66 deletions
+7 -7
View File
@@ -35,8 +35,8 @@ export function OpsCoveragePage() {
<tbody>
{matrix.map((row, i) => (
<tr key={i} className="border-b border-surface-700/50">
<td className="px-3 py-2 font-mono font-semibold text-brand-300">{row.ticker as string}</td>
<td className="px-3 py-2 text-gray-300">{row.legal_name as string}</td>
<td className="px-3 py-2 font-mono font-semibold text-brand-300">{String(row.ticker)}</td>
<td className="px-3 py-2 text-gray-300">{String(row.legal_name)}</td>
<CoverageCell count={row.market_sources as number} />
<CoverageCell count={row.news_sources as number} />
<CoverageCell count={row.filings_sources as number} />
@@ -61,7 +61,7 @@ export function OpsCoveragePage() {
const missingTypes = expected.filter((t) => !activeTypes.includes(t));
return (
<div key={i} className="flex items-center gap-3 rounded border border-yellow-700/30 bg-yellow-900/10 p-2">
<span className="font-mono font-semibold text-brand-300">{m.ticker as string}</span>
<span className="font-mono font-semibold text-brand-300">{String(m.ticker)}</span>
<span className="text-xs text-gray-500">missing:</span>
{missingTypes.map((t) => (
<StatusBadge key={t} status={t} />
@@ -81,12 +81,12 @@ export function OpsCoveragePage() {
{stale.map((s, i) => (
<div key={i} className="flex items-center justify-between rounded border border-red-700/30 bg-red-900/10 p-2">
<div className="flex items-center gap-3">
<span className="font-mono font-semibold text-brand-300">{s.ticker as string}</span>
<StatusBadge status={s.source_type as string} />
<span className="text-xs text-gray-400">{s.source_name as string}</span>
<span className="font-mono font-semibold text-brand-300">{String(s.ticker)}</span>
<StatusBadge status={String(s.source_type)} />
<span className="text-xs text-gray-400">{String(s.source_name)}</span>
</div>
<div className="text-xs text-gray-500">
Last success: {s.last_success ? new Date(s.last_success as string).toLocaleString() : 'never'}
Last success: {s.last_success ? new Date(String(s.last_success)).toLocaleString() : 'never'}
{s.recent_failures ? ` | ${s.recent_failures} failures (24h)` : ''}
</div>
</div>
+10 -10
View File
@@ -45,11 +45,11 @@ export function OpsIngestionPage() {
{/* Summary stats */}
<div className="grid grid-cols-2 gap-3 sm:grid-cols-5">
<StatCard label="Total Runs" value={s.total_runs} />
<StatCard label="Completed" value={s.completed} color="text-green-400" />
<StatCard label="Failed" value={s.failed} color="text-red-400" />
<StatCard label="Items Fetched" value={s.total_items_fetched} />
<StatCard label="New Items" value={s.total_items_new} />
<StatCard label="Total Runs" value={String(s.total_runs ?? '—')} />
<StatCard label="Completed" value={String(s.completed ?? '—')} color="text-green-400" />
<StatCard label="Failed" value={String(s.failed ?? '—')} color="text-red-400" />
<StatCard label="Items Fetched" value={String(s.total_items_fetched ?? '—')} />
<StatCard label="New Items" value={String(s.total_items_new ?? '—')} />
</div>
{/* Throughput chart */}
@@ -68,7 +68,7 @@ export function OpsIngestionPage() {
</Card>
{/* By source type */}
{s.by_source_type && (
{s.by_source_type ? (
<Card>
<h2 className="mb-3 text-sm font-medium text-gray-400">By Source Type</h2>
<div className="overflow-x-auto">
@@ -85,7 +85,7 @@ export function OpsIngestionPage() {
<tbody>
{(s.by_source_type as Array<Record<string, unknown>>).map((row, i) => (
<tr key={i} className="border-b border-surface-700/50">
<td className="px-3 py-2 text-gray-300">{row.source_type as string}</td>
<td className="px-3 py-2 text-gray-300">{String(row.source_type)}</td>
<td className="px-3 py-2 text-gray-300">{String(row.runs)}</td>
<td className="px-3 py-2 text-green-400">{String(row.completed)}</td>
<td className="px-3 py-2 text-red-400">{String(row.failed)}</td>
@@ -96,15 +96,15 @@ export function OpsIngestionPage() {
</table>
</div>
</Card>
)}
) : null}
</div>
);
}
function StatCard({ label, value, color = 'text-gray-100' }: { label: string; value: unknown; color?: string }) {
function StatCard({ label, value, color = 'text-gray-100' }: { label: string; value: string; color?: string }) {
return (
<Card className="text-center">
<div className={`text-xl font-bold ${color}`}>{value != null ? String(value) : '—'}</div>
<div className={`text-xl font-bold ${color}`}>{value}</div>
<div className="text-xs text-gray-500">{label}</div>
</Card>
);
+10 -10
View File
@@ -20,7 +20,7 @@ export function OpsModelPage() {
{/* Key metrics */}
<div className="grid grid-cols-2 gap-3 sm:grid-cols-5">
<StatCard label="Total Extractions" value={p.total_extractions} />
<StatCard label="Total Extractions" value={String(p.total_extractions ?? '—')} />
<StatCard label="Success Rate" value={p.success_rate != null ? `${((p.success_rate as number) * 100).toFixed(1)}%` : '—'} color="text-green-400" />
<StatCard label="Avg Latency" value={p.avg_duration_ms != null ? `${Math.round(p.avg_duration_ms as number)}ms` : '—'} />
<StatCard label="Retry Rate" value={p.retry_rate != null ? `${((p.retry_rate as number) * 100).toFixed(1)}%` : '—'} color="text-yellow-400" />
@@ -40,20 +40,20 @@ export function OpsModelPage() {
<div key={i} className="rounded border border-surface-700 bg-surface-950 p-3">
<div className="flex items-center justify-between">
<div className="flex items-center gap-2">
<span className="font-mono text-sm text-brand-300">{f.ticker as string}</span>
<span className="font-mono text-sm text-brand-300">{String(f.ticker)}</span>
<StatusBadge status="failed" />
<span className="text-xs text-gray-500">{f.model_name as string}</span>
<span className="text-xs text-gray-500">{String(f.model_name)}</span>
</div>
<span className="text-xs text-gray-500">{f.recorded_at ? new Date(f.recorded_at as string).toLocaleString() : ''}</span>
<span className="text-xs text-gray-500">{f.recorded_at ? new Date(String(f.recorded_at)).toLocaleString() : ''}</span>
</div>
<div className="mt-1 text-xs text-gray-400">
{f.document_title as string} ({f.document_type as string})
{f.document_title ? String(f.document_title) : ''} ({String(f.document_type)})
</div>
{f.validation_errors && (
{f.validation_errors ? (
<div className="mt-1 text-xs text-red-400">
{JSON.stringify(f.validation_errors)}
{JSON.stringify(f.validation_errors) ?? ''}
</div>
)}
) : null}
</div>
))}
</div>
@@ -63,10 +63,10 @@ export function OpsModelPage() {
);
}
function StatCard({ label, value, color = 'text-gray-100' }: { label: string; value: unknown; color?: string }) {
function StatCard({ label, value, color = 'text-gray-100' }: { label: string; value: string; color?: string }) {
return (
<Card className="text-center">
<div className={`text-xl font-bold ${color}`}>{value != null ? String(value) : '—'}</div>
<div className={`text-xl font-bold ${color}`}>{value}</div>
<div className="text-xs text-gray-500">{label}</div>
</Card>
);
+6 -6
View File
@@ -51,9 +51,9 @@ export function OrderDetailPage() {
<StatusBadge status={ev.event_type} />
<div className="flex-1">
<div className="text-xs text-gray-400">{new Date(ev.created_at).toLocaleString()}</div>
{ev.data && (
<pre className="mt-1 text-xs text-gray-500">{JSON.stringify(ev.data, null, 2)}</pre>
)}
{ev.data ? (
<pre className="mt-1 text-xs text-gray-500">{JSON.stringify(ev.data, null, 2) ?? ''}</pre>
) : null}
</div>
</div>
))}
@@ -68,9 +68,9 @@ export function OrderDetailPage() {
<div className="space-y-1">
{(order.audit_trail as Array<Record<string, unknown>>).map((entry, i) => (
<div key={i} className="flex gap-3 text-xs">
<span className="text-gray-500">{entry.created_at ? new Date(entry.created_at as string).toLocaleString() : ''}</span>
<span className="text-gray-400">{entry.event_type as string}</span>
<span className="text-gray-300">{entry.description as string}</span>
<span className="text-gray-500">{entry.created_at ? new Date(String(entry.created_at)).toLocaleString() : ''}</span>
<span className="text-gray-400">{String(entry.event_type)}</span>
<span className="text-gray-300">{String(entry.description)}</span>
</div>
))}
</div>
+9 -9
View File
@@ -79,23 +79,23 @@ export function TrendDetailPage() {
<div key={i} className="rounded-lg border border-surface-700 bg-surface-950 p-3">
<div className="flex items-center justify-between">
<div className="flex items-center gap-2">
<StatusBadge status={ev.evidence_type as string} />
<span className="text-sm text-gray-200">{(ev.title as string) ?? 'Untitled'}</span>
<StatusBadge status={String(ev.evidence_type)} />
<span className="text-sm text-gray-200">{String(ev.title ?? 'Untitled')}</span>
</div>
<span className="font-mono text-xs text-gray-500">rank: {((ev.rank_score as number) ?? 0).toFixed(3)}</span>
</div>
<div className="mt-1 flex gap-4 text-xs text-gray-500">
<span>{ev.document_type as string}</span>
<span>{ev.source_type as string}</span>
{ev.publisher && <span>{ev.publisher as string}</span>}
{ev.published_at && <span>{new Date(ev.published_at as string).toLocaleDateString()}</span>}
<span>{String(ev.document_type)}</span>
<span>{String(ev.source_type)}</span>
{ev.publisher ? <span>{String(ev.publisher)}</span> : null}
{ev.published_at ? <span>{new Date(String(ev.published_at)).toLocaleDateString()}</span> : null}
</div>
{ev.intelligence && (
{ev.intelligence ? (
<div className="mt-2 text-xs text-gray-400">
<span className="text-gray-500">Summary: </span>
{((ev.intelligence as Record<string, unknown>).summary as string) ?? '—'}
{String((ev.intelligence as Record<string, unknown>).summary ?? '—')}
</div>
)}
) : null}
</div>
))}
</div>