(null);
const useTerminal = (): TerminalState => {
const value = useContext(TerminalContext);
if (!value) {
throw new Error("Terminal context missing");
}
return value;
};
const NAV_ITEMS = [
{ href: "/", label: "Overview" },
{ href: "/tape", label: "Tape" },
{ href: "/signals", label: "Signals" },
{ href: "/charts", label: "Charts" },
{ href: "/replay", label: "Replay" }
];
type PageFrameProps = {
title: string;
actions?: ReactNode;
children: ReactNode;
};
const PageFrame = ({ title, actions, children }: PageFrameProps) => {
return (
{title}
{actions ? {actions}
: null}
{children}
);
};
type PaneProps = {
title: string;
status?: ReactNode;
actions?: ReactNode;
className?: string;
children: ReactNode;
};
const Pane = ({ title, status, actions, className = "", children }: PaneProps) => {
const classes = ["terminal-pane", className].filter(Boolean).join(" ");
return (
{title}
{status ?
{status}
: null}
{actions ?
{actions}
: null}
{children}
);
};
const ShellMetricStrip = () => {
const state = useTerminal();
const focus = state.activeTickers.length > 0 ? state.activeTickers.join(", ") : "ALL";
const replay = state.replaySource ? state.replaySource.toUpperCase() : "AUTO";
return (
Mode
{state.mode === "live" ? "LIVE" : "REPLAY"}
Focus
{focus}
Source
{replay}
Last
{state.lastSeen ? formatTime(state.lastSeen) : "WAITING"}
);
};
const FeedStatusBar = () => {
const state = useTerminal();
const feeds = [
{ label: "Opt", feed: state.options },
{ label: "Eq", feed: state.equities },
{ label: "Flow", feed: state.flow },
{ label: "Alert", feed: state.alerts },
{ label: "Rule", feed: state.classifierHits },
{ label: "Dark", feed: state.inferredDark }
];
return (
{feeds.map(({ label, feed }) => (
{label}
))}
);
};
const OverviewBrief = () => {
const state = useTerminal();
return (
Options
{formatFlowMetric(state.filteredOptions.length)}
Equities
{formatFlowMetric(state.filteredEquities.length)}
Flow
{formatFlowMetric(state.filteredFlow.length)}
Alerts
{formatFlowMetric(state.filteredAlerts.length)}
Rules
{formatFlowMetric(state.filteredClassifierHits.length)}
Dark
{formatFlowMetric(state.filteredInferredDark.length)}
);
};
type OptionsPaneProps = {
limit?: number;
};
const OptionsPane = ({ limit }: OptionsPaneProps) => {
const state = useTerminal();
const items = limit ? state.filteredOptions.slice(0, limit) : state.filteredOptions;
return (
}
actions={
}
>
{items.length === 0 ? (
{state.tickerSet.size > 0
? "No option prints match the current filter."
: state.mode === "live"
? "No option prints yet. Start ingest-options."
: "Replay queue empty. Ensure ClickHouse has data."}
) : (
items.map((print) => {
const contractId = normalizeContractId(print.option_contract_id);
const quote = state.nbboMap.get(contractId);
const nbboAge = quote ? Math.abs(print.ts - quote.ts) : null;
const nbboStale = nbboAge !== null && nbboAge > NBBO_MAX_AGE_MS_SAFE;
const nbboMid = quote ? (quote.bid + quote.ask) / 2 : null;
const nbboSide = classifyNbboSide(print.price, quote);
const notional = print.price * print.size * 100;
return (
{formatContractLabel(contractId)}
${formatPrice(print.price)}
{formatSize(print.size)}x
{print.exchange}
Notional ${formatUsd(notional)}
{print.conditions?.length ? {print.conditions.join(", ")} : null}
{quote ? (
Bid ${formatPrice(quote.bid)}
Ask ${formatPrice(quote.ask)}
Mid ${formatPrice(nbboMid ?? 0)}
{Math.round(nbboAge ?? 0)}ms
{nbboSide ? (
{nbboSide}
A
Ask
AA
Above Ask
B
Bid
BB
Below Bid
) : null}
{nbboStale ? Stale : null}
) : (
NBBO missing
)}
{formatTime(print.ts)}
);
})
)}
);
};
type EquitiesPaneProps = {
limit?: number;
};
const EquitiesPane = ({ limit }: EquitiesPaneProps) => {
const state = useTerminal();
const items = limit ? state.filteredEquities.slice(0, limit) : state.filteredEquities;
return (
}
actions={
}
>
{items.length === 0 ? (
{state.tickerSet.size > 0
? "No equity prints match the current filter."
: state.mode === "live"
? "No equity prints yet. Start ingest-equities."
: "Replay queue empty. Ensure ClickHouse has data."}
) : (
items.map((print) => (
{print.underlying_id}
${formatPrice(print.price)}
{formatSize(print.size)}x
{print.exchange}
{print.offExchangeFlag ? (
Off-Ex
) : (
Lit
)}
{formatTime(print.ts)}
))
)}
);
};
type FlowPaneProps = {
limit?: number;
title?: string;
};
const FlowPane = ({ limit, title = "Flow" }: FlowPaneProps) => {
const state = useTerminal();
const items = limit ? state.filteredFlow.slice(0, limit) : state.filteredFlow;
return (
}
actions={
}
>
{items.length === 0 ? (
{state.tickerSet.size > 0
? "No flow packets match the current filter."
: state.mode === "live"
? "No flow packets yet. Start compute."
: "Replay queue empty. Ensure ClickHouse has data."}
) : (
items.map((packet) => {
const features = packet.features ?? {};
const contract = String(features.option_contract_id ?? packet.id ?? "unknown");
const count = parseNumber(features.count, packet.members.length);
const totalSize = parseNumber(features.total_size, 0);
const totalNotional = parseNumber(features.total_notional, Number.NaN);
const notional = Number.isFinite(totalNotional)
? totalNotional
: parseNumber(features.total_premium, 0) * 100;
const startTs = parseNumber(features.start_ts, packet.source_ts);
const endTs = parseNumber(features.end_ts, startTs);
const windowMs = parseNumber(features.window_ms, 0);
const structureType =
typeof features.structure_type === "string" ? features.structure_type : "";
const structureLegs = parseNumber(features.structure_legs, 0);
const structureRights =
typeof features.structure_rights === "string" ? features.structure_rights : "";
const structureStrikes = parseNumber(features.structure_strikes, 0);
const nbboBid = parseNumber(features.nbbo_bid, Number.NaN);
const nbboAsk = parseNumber(features.nbbo_ask, Number.NaN);
const nbboMid = parseNumber(features.nbbo_mid, Number.NaN);
const nbboSpread = parseNumber(features.nbbo_spread, Number.NaN);
const aggressiveBuyRatio = parseNumber(features.nbbo_aggressive_buy_ratio, Number.NaN);
const aggressiveSellRatio = parseNumber(
features.nbbo_aggressive_sell_ratio,
Number.NaN
);
const aggressiveCoverage = parseNumber(features.nbbo_coverage_ratio, Number.NaN);
const insideRatio = parseNumber(features.nbbo_inside_ratio, Number.NaN);
const nbboAge = parseNumber(packet.join_quality.nbbo_age_ms, Number.NaN);
const nbboStale = parseNumber(packet.join_quality.nbbo_stale, 0) > 0;
const nbboMissing = parseNumber(packet.join_quality.nbbo_missing, 0) > 0;
return (
{contract}
{formatFlowMetric(count)} prints
{formatFlowMetric(totalSize)} size
Notional ${formatUsd(notional)}
{windowMs > 0 ? {formatFlowMetric(windowMs, "ms")} : null}
{structureType ? (
{structureType.replace(/_/g, " ")}
{structureRights ? ` ${structureRights}` : ""}
{structureLegs > 0 ? ` ${structureLegs}L` : ""}
{structureStrikes > 0 ? ` ${structureStrikes}K` : ""}
) : null}
{Number.isFinite(aggressiveCoverage) && aggressiveCoverage > 0 ? (
Agg {formatPct(aggressiveBuyRatio)} / {formatPct(aggressiveSellRatio)}
{Number.isFinite(insideRatio) && insideRatio > 0
? ` · In ${formatPct(insideRatio)}`
: ""}
{` · ${formatPct(aggressiveCoverage)} cov`}
) : null}
{Number.isFinite(nbboBid) && Number.isFinite(nbboAsk) ? (
NBBO ${formatPrice(nbboBid)} x ${formatPrice(nbboAsk)}
) : null}
{Number.isFinite(nbboMid) ? Mid ${formatPrice(nbboMid)} : null}
{Number.isFinite(nbboSpread) ? (
Spread ${formatPrice(nbboSpread)}
) : null}
{Number.isFinite(nbboAge) ? {Math.round(nbboAge)}ms : null}
{nbboStale ? NBBO stale : null}
{nbboMissing ? NBBO missing : null}
{formatTime(startTs)} → {formatTime(endTs)}
);
})
)}
);
};
type AlertsPaneProps = {
limit?: number;
withStrip?: boolean;
};
const AlertsPane = ({ limit, withStrip = false }: AlertsPaneProps) => {
const state = useTerminal();
const items = limit ? state.filteredAlerts.slice(0, limit) : state.filteredAlerts;
return (
}
actions={
}
>
{withStrip ? : null}
{items.length === 0 ? (
{state.tickerSet.size > 0
? "No alerts match the current filter."
: state.mode === "live"
? "No alerts yet. Start compute."
: "Replay queue empty. Ensure ClickHouse has data."}
) : (
items.map((alert) => {
const primary = alert.hits[0];
const direction = primary ? normalizeDirection(primary.direction) : "neutral";
return (
);
})
)}
);
};
type ClassifierPaneProps = {
limit?: number;
};
const ClassifierPane = ({ limit }: ClassifierPaneProps) => {
const state = useTerminal();
const items = limit ? state.filteredClassifierHits.slice(0, limit) : state.filteredClassifierHits;
return (
}
actions={
}
>
{items.length === 0 ? (
{state.tickerSet.size > 0
? "No classifier hits match the current filter."
: state.mode === "live"
? "No classifier hits yet. Start compute."
: "Replay queue empty. Ensure ClickHouse has data."}
) : (
items.map((hit) => {
const direction = normalizeDirection(hit.direction);
return (
);
})
)}
);
};
type DarkPaneProps = {
limit?: number;
};
const DarkPane = ({ limit }: DarkPaneProps) => {
const state = useTerminal();
const items = limit ? state.filteredInferredDark.slice(0, limit) : state.filteredInferredDark;
return (
}
actions={
}
>
{items.length === 0 ? (
{state.tickerSet.size > 0
? "No inferred dark events match the current filter."
: state.mode === "live"
? "No inferred dark events yet. Start compute."
: "Replay queue empty. Ensure ClickHouse has data."}
) : (
items.map((event) => {
const underlying = inferDarkUnderlying(event, state.equityPrintMap, state.equityJoinMap);
const evidenceCount = event.evidence_refs.length;
return (
);
})
)}
);
};
type ChartPaneProps = {
title?: string;
};
const ChartPane = ({ title = "Chart" }: ChartPaneProps) => {
const state = useTerminal();
return (
{CANDLE_INTERVALS.map((interval) => (
))}
{state.chartTicker}
}
>
);
};
const FocusPane = () => {
const state = useTerminal();
const hits = state.chartClassifierHits.slice(-10).reverse();
const dark = state.chartInferredDark.slice(-10).reverse();
return (
Ticker
{state.chartTicker}
Rules
{hits.length === 0 ? (
No rule hits for {state.chartTicker}.
) : (
{hits.map((hit) => (
))}
)}
Dark
{dark.length === 0 ? (
No inferred dark events for {state.chartTicker}.
) : (
{dark.map((event) => (
))}
)}
);
};
const ReplayConsole = () => {
const state = useTerminal();
const replayActive = state.mode === "replay";
return (
{replayActive ? "Switch Live" : "Switch Replay"}
}
>
Mode
{replayActive ? "Replay" : "Live"}
Source
{state.replaySource ? state.replaySource.toUpperCase() : "Auto"}
Replay Clock
{state.options.replayTime ? formatTime(state.options.replayTime) : "—"}
Packets
{formatFlowMetric(state.filteredFlow.length)}
);
};
export function TerminalAppShell({ children }: { children: ReactNode }) {
const state = useTerminalState();
const pathname = usePathname();
return (
{state.selectedAlert ? (
state.setSelectedAlert(null)}
/>
) : null}
{state.selectedClassifierHit ? (
state.setSelectedClassifierHit(null)}
/>
) : null}
{state.selectedDarkEvent ? (
state.setSelectedDarkEvent(null)}
/>
) : null}
);
}
export function OverviewRoute() {
return (
);
}
export function TapeRoute() {
return (
);
}
export function SignalsRoute() {
return (
);
}
export function ChartsRoute() {
return (
);
}
export function ReplayRoute() {
return (
);
}