"use client"; import Link from "next/link"; import { useMemo, useState, type ReactNode } from "react"; import type { AlertEvent, ClassifierHitEvent, FlowPacket, IslandflowAiCompiledScreen, IslandflowAiPlanType, IslandflowAiRateLimitSnapshot, IslandflowAiReasoningEffort, IslandflowAiTaskKind, OptionFlowFilters, OptionPrint, SmartMoneyEvent } from "@islandflow/types"; import { useDesktopAi } from "./desktop-ai"; const numberFormatter = new Intl.NumberFormat("en-US"); const usdFormatter = new Intl.NumberFormat("en-US", { style: "currency", currency: "USD", minimumFractionDigits: 2, maximumFractionDigits: 4 }); const humanizeValue = (value: string | null | undefined): string => { if (!value) { return "Unknown"; } return value .replace(/_/g, " ") .replace(/\b\w/g, (char) => char.toUpperCase()); }; const formatTokens = (value: number): string => numberFormatter.format(value); const formatUsd = (value: number | null): string => (value === null ? "Unavailable" : usdFormatter.format(value)); const formatTimestamp = (value: number | null): string => { if (!value) { return "Not reported"; } return new Intl.DateTimeFormat("en-US", { dateStyle: "medium", timeStyle: "short" }).format(value); }; const formatPercent = (value: number): string => `${Math.round(value)}%`; const getTaskStatusLabel = (value: string): string => humanizeValue(value); const findTask = (tasks: T[], taskId: string | null): T | null => { if (!taskId) { return null; } return tasks.find((task) => task.taskId === taskId) ?? null; }; const getCompiledScreenSummary = (compiled: IslandflowAiCompiledScreen): string[] => { const filters = compiled.compiledFilters; if (!filters) { return []; } const parts: string[] = []; if (filters.view) { parts.push(`View: ${filters.view}`); } if (filters.securityTypes?.length) { parts.push(`Security: ${filters.securityTypes.join(", ")}`); } if (filters.optionTypes?.length) { parts.push(`Options: ${filters.optionTypes.join(", ")}`); } if (filters.nbboSides?.length) { parts.push(`NBBO: ${filters.nbboSides.join(", ")}`); } if (typeof filters.minNotional === "number") { parts.push(`Min notional: $${numberFormatter.format(filters.minNotional)}`); } return parts; }; const CopilotPane = ({ title, eyebrow, actions, wide = false, children }: { title: string; eyebrow?: string; actions?: ReactNode; wide?: boolean; children: ReactNode; }) => { return (
{eyebrow ?
{eyebrow}
: null}

{title}

{actions ?
{actions}
: null}
{children}
); }; const UsageBreakdown = ({ title, breakdown, normalizedCostUsd, turnCount, activeDays }: { title: string; breakdown: { totalTokens: number; inputTokens: number; cachedInputTokens: number; outputTokens: number; reasoningOutputTokens: number; }; normalizedCostUsd: number | null; turnCount: number; activeDays: number; }) => { return (

{title}

{formatUsd(normalizedCostUsd)}
Total tokens {formatTokens(breakdown.totalTokens)}
Input {formatTokens(breakdown.inputTokens)}
Cached input {formatTokens(breakdown.cachedInputTokens)}
Output {formatTokens(breakdown.outputTokens)}
Reasoning {formatTokens(breakdown.reasoningOutputTokens)}
Turns {formatTokens(turnCount)}
Active days {formatTokens(activeDays)}
); }; const RateLimitBoard = ({ limit }: { limit: IslandflowAiRateLimitSnapshot }) => { return (
{limit.limitName ?? "Default rate window"}

{limit.planType ? `Plan ${humanizeValue(limit.planType)}` : "Plan not reported"}

{limit.reachedType ? {humanizeValue(limit.reachedType)} : null}
{limit.primary ? (
Primary {formatPercent(limit.primary.usedPercent)}

Resets {formatTimestamp(limit.primary.resetsAt)}

) : null} {limit.secondary ? (
Secondary {formatPercent(limit.secondary.usedPercent)}

Resets {formatTimestamp(limit.secondary.resetsAt)}

) : null}
{limit.creditsBalance || limit.unlimitedCredits !== null ? (

Credits:{" "} {limit.unlimitedCredits ? "unlimited" : limit.creditsBalance ? limit.creditsBalance : limit.hasCredits === false ? "none" : "not reported"}

) : null}
); }; const TaskOutput = ({ taskId, emptyMessage }: { taskId: string | null; emptyMessage: string; }) => { const { state } = useDesktopAi(); const task = findTask(state.tasks, taskId); if (!task) { return

{emptyMessage}

; } return (
{task.title}

{task.subtitle} · {getTaskStatusLabel(task.status)}

{getTaskStatusLabel(task.status)}
{task.error ?

{task.error}

: null} {task.text ?
{task.text}
: null} {task.compiledScreen ? : null}
); }; const CompiledScreenResult = ({ compiled }: { compiled: IslandflowAiCompiledScreen }) => { const summary = getCompiledScreenSummary(compiled); return (
{summary.length > 0 ? (
{summary.map((item) => ( {item} ))}
) : (

No filter fields were compiled from this prompt.

)} {compiled.unhandledClauses.length > 0 ? (
Unhandled clauses
{compiled.unhandledClauses.map((item) => (
{item}
))}
) : null}
); }; const AccountSummary = ({ loggedIn, email, planType }: { loggedIn: boolean; email: string | null; planType: IslandflowAiPlanType | null; }) => { return (

Desktop-only official Codex bridge

Analyst Copilot

Managed ChatGPT login stays user-scoped, deterministic smart-money classification stays in charge, and every AI turn is tracked with exact token telemetry from the app-server.

Account {loggedIn ? email ?? "Connected" : "Disconnected"}
Plan {loggedIn ? humanizeValue(planType) : "Not connected"}
); }; const LoginStatePanel = () => { const { bridgeAvailable, state, loginWithBrowser, loginWithDeviceCode, cancelLogin, logout } = useDesktopAi(); const [busyAction, setBusyAction] = useState(null); const [actionError, setActionError] = useState(null); const loginState = state.account.login; const actionsDisabled = busyAction !== null || !bridgeAvailable; const runAction = async (label: string, action: () => Promise) => { setBusyAction(label); setActionError(null); try { await action(); } catch (error) { setActionError(error instanceof Error ? error.message : String(error)); } finally { setBusyAction(null); } }; return ( {state.account.loggedIn ? ( ) : ( <> )} {(loginState.status === "browser_pending" || loginState.status === "device_code_pending") && !state.account.loggedIn ? ( ) : null} } >
Profile slots
{state.profiles.map((profile) => (
{profile.label}

{profile.description}

{profile.selected ? "Selected" : profile.statusLabel}
))}
Session status
Transport {humanizeValue(state.transportStatus)}
Auth mode {humanizeValue(state.account.authMode)}
OpenAI auth required {state.account.requiresOpenaiAuth ? "Yes" : "No"}
{state.transportError ?

{state.transportError}

: null} {loginState.message ?

{loginState.message}

: null} {loginState.status === "browser_pending" ? (
Browser login in progress

Finish the ChatGPT sign-in flow in your browser. Islandflow will update automatically.

) : null} {loginState.status === "device_code_pending" ? (
Device code
{loginState.userCode}

Visit {loginState.verificationUrl} in any browser and enter the code above.

) : null} {actionError ?

{actionError}

: null}
); }; export function DesktopAiSettingsRoute() { const { bridgeAvailable, shellAvailable, state, updatePreferences } = useDesktopAi(); const [busyPreference, setBusyPreference] = useState<"model" | "reasoning" | null>(null); const [preferenceError, setPreferenceError] = useState(null); const rateLimits = Object.values(state.rateLimitsByLimitId); const selectedModel = state.preferences.model ?? ""; const selectedReasoning = state.preferences.reasoningEffort ?? ""; const savePreference = async ( key: "model" | "reasoning", next: Partial<{ model: string | null; reasoningEffort: IslandflowAiReasoningEffort | null }> ) => { setBusyPreference(key); setPreferenceError(null); try { await updatePreferences(next); } catch (error) { setPreferenceError(error instanceof Error ? error.message : String(error)); } finally { setBusyPreference(null); } }; return (
{!shellAvailable ? (

AI controls are intentionally read-only in the browser build. Open Islandflow Desktop to use managed ChatGPT login, structured Copilot turns, and app-server token telemetry.

) : null}
{state.models.map((model) => (
{model.displayName}

{model.description}

{model.model} {model.pricing ? {formatUsd(model.pricing.inputUsdPer1MTokens)} / 1M input : null}
))}
{state.models.find((model) => model.model === state.preferences.model)?.pricing ? (

Normalized estimates use current API pricing for the selected model, not your literal ChatGPT subscription bill.

) : null} {preferenceError ?

{preferenceError}

: null}
{rateLimits.length === 0 ? (

No rate-limit snapshots have been reported yet.

) : (
{rateLimits.map((limit) => ( ))}
)}
{state.usage.recentTurns.length === 0 ? (

No tracked turns yet.

) : (
{state.usage.recentTurns.map((turn) => (
{turn.taskTitle ?? "Ad hoc turn"}

{turn.model ?? "default"} · {formatTimestamp(turn.updatedAt)}

{formatTokens(turn.breakdown.totalTokens)} tok {formatUsd(turn.normalizedCostUsd)}
))}
)}
{state.tasks.length === 0 ? (

No Copilot tasks have been run yet.

) : (
{state.tasks.map((task) => (
{task.title}

{task.subtitle} · {humanizeValue(task.model)}

{getTaskStatusLabel(task.status)}
))}
)}
); } export const requireDesktopActionCopy = ( shellAvailable: boolean, bridgeAvailable: boolean, loggedIn: boolean ): string => { if (!shellAvailable) { return "This control is desktop-only. Open Islandflow Desktop to run Copilot tasks."; } if (!bridgeAvailable) { return "Islandflow Desktop is open, but this window is missing the native AI bridge. Reload the window or restart the app."; } if (!loggedIn) { return "Connect a ChatGPT or Codex account in Settings before running Copilot analysis."; } return ""; }; const SmartMoneyTaskButton = ({ label, kind, symbol, disabled, busyKind, onRun }: { label: string; kind: IslandflowAiTaskKind; symbol: string; disabled: boolean; busyKind: IslandflowAiTaskKind | null; onRun: (kind: IslandflowAiTaskKind) => void; }) => { return ( ); }; export function SmartMoneyCopilotPanel({ event, flowPacket, evidencePrints, relatedPackets }: { event: SmartMoneyEvent; flowPacket: FlowPacket | null; evidencePrints: OptionPrint[]; relatedPackets: FlowPacket[]; }) { const { bridgeAvailable, shellAvailable, state, runTask } = useDesktopAi(); const [busyKind, setBusyKind] = useState(null); const [activeTaskId, setActiveTaskId] = useState(null); const [taskError, setTaskError] = useState(null); const disabledCopy = requireDesktopActionCopy(shellAvailable, bridgeAvailable, state.account.loggedIn); const actionsDisabled = !bridgeAvailable || !state.account.loggedIn; const handleRun = async (kind: IslandflowAiTaskKind) => { setBusyKind(kind); setTaskError(null); try { const result = await runTask({ kind: kind as | "smart-money-explain" | "smart-money-skeptic" | "smart-money-burst-summary" | "watchlist-synthesis", context: { event, flowPacket, evidencePrints, relatedPackets } }); setActiveTaskId(result.taskId); } catch (error) { setTaskError(error instanceof Error ? error.message : String(error)); } finally { setBusyKind(null); } }; return (
Analyst Copilot

Structured interpretation only, the deterministic classifier remains the source of truth.

AI settings
void handleRun(kind)} /> void handleRun(kind)} /> void handleRun(kind)} /> void handleRun(kind)} />
{disabledCopy ?

{disabledCopy}

: null} {taskError ?

{taskError}

: null}
); } export function ReplayCopilotPanel({ ticker, flowFilters, alerts, smartMoneyEvents, classifierHits, flowPackets, optionPrints }: { ticker: string | null; flowFilters: OptionFlowFilters; alerts: AlertEvent[]; smartMoneyEvents: SmartMoneyEvent[]; classifierHits: ClassifierHitEvent[]; flowPackets: FlowPacket[]; optionPrints: OptionPrint[]; }) { const { bridgeAvailable, shellAvailable, state, runTask } = useDesktopAi(); const [activeTaskId, setActiveTaskId] = useState(null); const [busy, setBusy] = useState(false); const [taskError, setTaskError] = useState(null); const disabledCopy = requireDesktopActionCopy(shellAvailable, bridgeAvailable, state.account.loggedIn); const actionsDisabled = busy || !bridgeAvailable || !state.account.loggedIn; const handleRun = async () => { setBusy(true); setTaskError(null); try { const result = await runTask({ kind: "replay-postmortem", context: { ticker, flowFilters, alerts, smartMoneyEvents, classifierHits, flowPackets, optionPrints } }); setActiveTaskId(result.taskId); } catch (error) { setTaskError(error instanceof Error ? error.message : String(error)); } finally { setBusy(false); } }; return ( AI settings } >

Copilot uses the current replay slice only: ticker scope, flow filters, visible alerts, classifier hits, packets, and option prints.

{disabledCopy ?

{disabledCopy}

: null} {taskError ?

{taskError}

: null}
); } export function ScreenCompilerPanel({ currentFilters, onApplyFilters }: { currentFilters: OptionFlowFilters; onApplyFilters: (next: OptionFlowFilters) => void; }) { const { bridgeAvailable, shellAvailable, state, runTask } = useDesktopAi(); const [prompt, setPrompt] = useState(""); const [activeTaskId, setActiveTaskId] = useState(null); const [busy, setBusy] = useState(false); const [taskError, setTaskError] = useState(null); const activeTask = useMemo(() => findTask(state.tasks, activeTaskId), [state.tasks, activeTaskId]); const disabledCopy = requireDesktopActionCopy(shellAvailable, bridgeAvailable, state.account.loggedIn); const actionsDisabled = busy || !bridgeAvailable || !state.account.loggedIn; const handleCompile = async () => { const trimmedPrompt = prompt.trim(); if (!trimmedPrompt) { setTaskError("Write a screen request first."); return; } setBusy(true); setTaskError(null); try { const result = await runTask({ kind: "screen-compile", context: { prompt: trimmedPrompt, currentFilters } }); setActiveTaskId(result.taskId); } catch (error) { setTaskError(error instanceof Error ? error.message : String(error)); } finally { setBusy(false); } }; const compiledFilters = activeTask?.compiledScreen?.compiledFilters ?? null; return ( AI settings } >