Skip to content
BreachPilot

List Pages

Purpose, data dependencies, and API calls for the seven list / catalog / dashboard pages. This file is an index only — full component breakdowns live in other.md, home.md, and run.md (linked per section).

// webui/src/App.tsx:53-64 — route registration (all lazy except HomePage)
<Route path="/" element={<HomePage />} />
<Route path="/sessions" element={<RunListPage />} />
<Route path="/stats" element={<StatsPage />} />
<Route path="/memory" element={<MemoryPage />} />
<Route path="/skills" element={<SkillsPage />} />
<Route path="/goals" element={<GoalsPage />} />
<Route path="/modules" element={<AttackModulesPage />} />
RouteComponentDetail doc
/HomePage (routes/HomePage.tsx:552)./home.md
/sessionsRunListPage (routes/RunListPage.tsx:66)./run.md
/statsStatsPage (routes/StatsPage.tsx:219)./other.md#stats
/memoryMemoryPage (routes/MemoryPage.tsx:226)./other.md#memory
/skillsSkillsPage (routes/SkillsPage.tsx:223)./other.md#skills
/goalsGoalsPage (routes/GoalsPage.tsx:94)./other.md#goals
/modulesAttackModulesPage (routes/AttackModulesPage.tsx:29)./other.md#attack-modules

Home (/)

Purpose: landing dashboard — hero, stats strip, sandbox posture, active-run banner, two action cards (/runs/new?path=recon, /runs/new?path=attack), recent sessions, safety footer. Full layout: ./home.md.

Data dependencies:

HookCall siteUse
useRuns(50, 0)HomePage.tsx:553rows, activeRun (rows.find(isActiveState)), recent (rows.slice(0, 5)), doneCount (filter(isTerminalState)), failedCount (filter(s === "failed"))
useSandboxStatus + useSandboxFixPlan / useSandboxFix / useSandboxFixStatusSandboxBanner (HomePage.tsx:448), SandboxFixDialog (HomePage.tsx:94)boot-time sandbox posture (contained / disabled / native_fallback / blocked)

API calls:

HookMethod and URL
useRunsGET /runs?limit=50&offset=0&sort=created_desc (api/hooks.ts:690)

Implementation note: sandbox endpoint paths are not enumerated here; see SandboxBanner and the sandbox hooks in api/hooks.ts.

Sessions (/sessions)

Purpose: searchable, filterable, sortable table of all runs with per-row Open / Regen title / Resume / Delete actions and an active-runs banner. Full controls table: ./run.md#run-list-sessions.

Data dependencies:

// webui/src/routes/RunListPage.tsx:72
const runs = useRuns(PAGE_SIZE, page * PAGE_SIZE, sortKey, debouncedQ, stateFilter);
ItemSourceNote
PAGE_SIZE = 50, SORT_KEY_STORAGE = "breachpilot.runSort"RunListPage.tsx:39-40sort persisted to localStorage
STATE_FILTER_OPTIONSRunListPage.tsx:42"" + 11 RunState values
RUN_SORT_OPTIONS, RunSortKey, RunStateapi/types.tssort select options
isActiveState, isTerminalState, isDemoRunapi/types.tsbanner, delete/resume gating, demo highlight
maxConcurrentuseCapabilities().data.constraints.max_concurrent_runsgates New run button

API calls:

HookMethod and URL
useRunsGET /runs?limit&offset&sort&q&state (search debounced 300ms, adaptive poll 5s active / 60s idle)
useCapabilitiesGET /capabilities
useResumeRunPOST /runs/<id>/resume (terminal rows only, navigates to new id)
useRetitleRunPOST /runs/<id>/title {regen: true}
useDeleteRunDELETE /runs/<id>?purge=true (disabled while isActiveState, confirm Dialog)
useRestoreDemoPOST /runs/demo/restore (empty-state action)

Stats (/stats)

Purpose: operational KPIs, run-activity charts, recent-runs list, and LLM telemetry overview. Full section breakdown: ./other.md#stats.

Data dependencies:

// webui/src/routes/StatsPage.tsx:220-227
const runs = useRuns(RUN_LIMIT, 0); // RUN_LIMIT = 200
const telemetry = useTelemetry();
const runDays = aggregateRunsByDay(days, rows);       // DAYS = 14
const tokenDays = aggregateTokensByDay(days, recentTelemetry);
HelperSourceOutput
aggregateRunsByDayStatsPage.tsx:178RunDay {date, total, completed, failed, other}
aggregateTokensByDayStatsPage.tsx:192TokenDay {date, total, prompt, completion, unattributed, calls}
STATE_META, STATE_ORDERStatsPage.tsx:80-105bar colors + distribution order
KpiOverview, StatCardStatsPage.tsx:387-5326 KPI cards
RunsChart, StateDistribution, RecentRunsStatsPage.tsx:534-986run analytics (RECENT_RUN_COUNT = 8)
TokenUsageChart, TelemetryOverviewStatsPage.tsx:586-865LLM charts + metrics

API calls:

HookMethod and URL
useRunsGET /runs?limit=200&offset=0
useTelemetryGET /system/telemetry (api/hooks.ts:307, staleTime 15s, poll 8s)

Memory (/memory)

Purpose: cross-run knowledge dashboard — skill confidence table, cross-mission lessons, attack-memory explorer — with overview cards and per-tab search / filter / sort. Full card breakdown: ./other.md#memory.

Data dependencies:

// webui/src/routes/MemoryPage.tsx:227-230
const memory = useMemory();
const rawConfidence = memory.data?.confidence ?? [];
const rawLessons = memory.data?.lessons ?? [];
const rawAttack = memory.data?.attack_memory ?? [];
HelperSourceRole
deriveMemoryOverviewMemoryPage.tsx:796 overview counts + avg confidence
filterAndSortConfidenceMemoryPage.tsx:106query + min-obs + 5 sorts
filterAndSortLessonsMemoryPage.tsx:137query + outcome filter + 3 sorts
filterAndSortAttackMemoryMemoryPage.tsx:176query + target/category/result + 4 sorts
ConfidenceTable, LessonsList, AttackMemoryListMemoryPage.tsx:983-1174tab bodies
MemoryOverviewCards, MemoryStatMemoryPage.tsx:774-907overview strip

API calls:

HookMethod and URL
useMemoryGET /system/memory (api/hooks.ts:318, staleTime 15s) → MemoryResponse {lessons, confidence, attack_memory}

Skills (/skills)

Purpose: skill catalog with enable / auto / block states, detail viewer, add-from-markdown dialog, and delete flow. Full layout breakdown: ./other.md#skills.

Data dependencies:

ItemSourceNote
readSkillsConfig, SkillsConfig, skillState, STATE_METASkillsPage.tsx:82-116enabled / blocked / auto from default_enabled + exclude_names
topTags, filteredSkillsPage.tsx:254-28520 most frequent tags; search + tag + status + sort
SKILL_TEMPLATESkillsPage.tsx:127new-skill starter markdown
SkillMarkdownSkillsPage.tsx:159ReactMarkdown + remarkGfm renderer
SkillDetailView, SkillRowActions, HeaderStatSkillsPage.tsx:977-1274detail pane, state popover, stat strip

API calls:

HookMethod and URL
useSkillsGET /skills
useSkillSearchGET /skills/search?q= (debounced 250ms)
useSkillDetailGET /skills/<name>
useInstallSkillPOST /skills {name, markdown} (name validated /^[a-z0-9][a-z0-9-]{1,63}$/)
useRemoveSkillDELETE /skills/<name>
useConfigGET /config (skills block via readSkillsConfig)
usePatchConfigPATCH /config {skills: …} (enable / auto / block, master switch, lookup/inject)

Goals (/goals)

Purpose: preset + custom goal catalog with risk filtering and deep links into the New Run wizard. Full card breakdown: ./other.md#goals.

Data dependencies:

ItemSourceNote
RISK_METAGoalsPage.tsx:50safe / gated / high labels, icons, requirements
FILTERS, RiskFilterGoalsPage.tsx:39-83all / safe / gated / high / custom
GoalStats, RiskFilterButton, RiskLegendGoalsPage.tsx:345-430counts, pills, legend
GoalCard, CustomGoalCardGoalsPage.tsx:432-564preset vs custom cards
startPresetGoalsPage.tsx:149navigate(/runs/new?path=<recon if safe else attack>&goal=<name>)
startCustomGoalsPage.tsx:153navigate(/runs/new?path=attack&customGoal=<id>)

API calls:

HookMethod and URL
useGoalsGET /goals (api/hooks.ts:564, staleTime Infinity) → {goals: GoalPreset[], custom_goals: CustomGoal[]}
useCreateGoalPOST /goals {name, objective} (CustomGoalDialog)
useUpdateGoalPATCH /goals/<id> {name, objective}
useDeleteGoalDELETE /goals/<id> (confirm Dialog)

Modules (/modules)

Purpose: read-only registry of pre-packaged exploit recipes with family + text filtering. Full row breakdown: ./other.md#attack-modules.

// webui/src/routes/AttackModulesPage.tsx:34-48
const modules = useAttackModules();
const list = (modules.data?.modules ?? []).filter(/* family + query */);
const families = [...new Set(modules.map(m => m.family))].sort();
ItemSourceNote
FAMILY_LABELSAttackModulesPage.tsx:1115 families (webWeb, network_smbSMB / Network, …)
FamilyChipAttackModulesPage.tsx:95pill filter with per-family counts
ModuleRowAttackModulesPage.tsx:112mono name + family Badge + destructive_ics danger Badge + services / ports / CVEs

API calls:

HookMethod and URL
useAttackModulesGET /attack/modules (api/hooks.ts:555, staleTime 60s) → AttackModulesResponse {modules: AttackModuleSummary[]}
  • Other pages — full component breakdowns for Stats, Memory, Skills, Goals, and Modules
  • Home page — hero, stats strip, and recent sessions detail
  • Run pages — Sessions table controls and Live Run surface
  • Run-create components — New Run wizard internals
  • API integration — hooks, query keys, and polling conventions
  • WebUI state — queries, WebSocket events, and invalidation

Source map

  • webui/src/App.tsx
  • webui/src/routes/HomePage.tsx
  • webui/src/routes/RunListPage.tsx
  • webui/src/routes/StatsPage.tsx
  • webui/src/routes/MemoryPage.tsx
  • webui/src/routes/SkillsPage.tsx
  • webui/src/routes/GoalsPage.tsx
  • webui/src/routes/AttackModulesPage.tsx
  • webui/src/api/hooks.ts
  • webui/src/api/types.ts
source: repo docs (build sync)Edit this page on GitHub →