# Subsystem: js

## static/js/estorides.js
- Doc: Estorides front-end controller
- Layer: utility
- Language: js
- Symbols:
  - `setVisible` (function, line 12)
  - `isLanQueryLocal` (function, line 24)
  - `lanRunFields` (function, line 33)
  - `ensureLanConsent` (function, line 46)
  - `detectQueryTypeLocal` (function, line 128)
  - `showToast` (function, line 139)
  - `updateQueryChip` (function, line 149)
  - `setRunProgress` (function, line 159)
  - `showEmptyState` (function, line 180)
  - `summariseObservation` (function, line 186)
  - `buildResultCard` (function, line 211)
  - `requestToolInstall` (function, line 270)
  - `pollToolInstall` (function, line 293)
  - `_installErrMsg` (function, line 316)
  - `populateCategoryFilter` (function, line 326)
  - `applyResultFilters` (function, line 332)
  - `bindResultFilters` (function, line 353)
  - `showFriendlyError` (function, line 361)
  - `focusGraphNodeByValue` (function, line 374)
  - `switchSidebarTab` (function, line 383)
  - `switchCanvasTab` (function, line 387)
  - `clearMap` (function, line 409)
  - `plotPoints` (function, line 414)
  - `replotStreamData` (function, line 518)
  - `stopRunStream` (function, line 530)
  - `renderLanResults` (function, line 551)
  - `startLanScan` (function, line 620)
  - `runQuery` (function, line 685)
  - `runQueryBlocking` (function, line 773)
  - `searchEntity` (function, line 807)
  - `handleRunStreamEvent` (function, line 858)
  - `appendStreamObservation` (function, line 896)
  - `appendStreamEntity` (function, line 918)
  - `clearAll` (function, line 947)
  - `setStatus` (function, line 975)
  - `renderResult` (function, line 981)
  - `loadAnalysisModels` (function, line 1029)
  - `renderAnalysisModels` (function, line 1036)
  - `makeModelPill` (function, line 1048)
  - `renderAnalysis` (function, line 1061)
  - `renderMarkdownInto` (function, line 1076)
  - `setThinkingVisible` (function, line 1091)
  - `toggleThinking` (function, line 1098)
  - `reanalyze` (function, line 1103)
  - `analyseEntity` (function, line 1193)
  - `expandNode` (function, line 1226)
  - `mergeExpansionIntoGraph` (function, line 1256)
  - `drawGraphWithExtras` (function, line 1320)
  - `pushLink` (function, line 1344)
  - `is3DActive` (function, line 1367)
  - `resolverTypeFor` (function, line 1395)
  - `saveLevelOverrides` (function, line 1411)
  - `levelOf` (function, line 1415)
  - `clusterColor` (function, line 1419)
  - `safeColor` (function, line 1429)
  - `deriveClusters` (function, line 1438)
  - `hideTooltip` (function, line 1451)
  - `purifyHTML` (function, line 1465)
  - `setSanitizedHTML` (function, line 1476)
  - `showTooltipAt` (function, line 1485)
  - `hideContextMenu` (function, line 1495)
  - `showBridgeTooltip` (function, line 1500)
  - `showNodeTooltip` (function, line 1529)
  - `showContextMenu` (function, line 1548)
  - `setNodeLevel` (function, line 1623)
  - `applyLevelStyles` (function, line 1632)
  - `focusNode` (function, line 1640)
  - `runTransform` (function, line 1654)
  - `runTransformStream` (function, line 1675)
  - `undoGraph` (function, line 1735)
  - `selectNode` (function, line 1770)
  - `add` (function, line 1781)
  - `addText` (function, line 1787)
  - `renderGraphCore` (function, line 1874)
  - `drawHulls` (function, line 1962)
  - `_redrawGraph` (function, line 1993)
  - `setStatusDot` (function, line 1999)
  - `showWorkingIndicator` (function, line 2005)
  - `hideWorkingIndicator` (function, line 2010)
  - `toggleTierSection` (function, line 2015)
  - `renderTieredResults` (function, line 2023)
  - `escapeAttr` (function, line 2089)
  - `buildMapCoords` (function, line 2125)
  - `validCoord` (function, line 2221)
  - `colorFor` (function, line 2225)
  - `renderEntities` (function, line 2244)
  - `renderGraphSummary` (function, line 2296)
  - `colorForKind` (function, line 2325)
  - `renderTimeline` (function, line 2333)
  - `fmtTime` (function, line 2383)
  - `filterTimeline` (function, line 2394)
  - `drawGraph` (function, line 2443)
  - `loadCases` (function, line 2473)
  - `openCaseDetail` (function, line 2499)
  - `restoreCaseToWorkspace` (function, line 2554)
  - `buildCaseMapCoords` (function, line 2575)
  - `renderCaseItem` (function, line 2593)
  - `debounce` (function, line 2619)
  - `escapeHTML` (function, line 2669)
  - `truncate` (function, line 2674)
  - `caseActionSave` (function, line 2697)
  - `caseActionDiff` (function, line 2718)
  - `renderCaseDiffPanel` (function, line 2738)
  - `caseActionReport` (function, line 2779)
  - `showReportModal` (function, line 2815)
  - `_sanitizeInput` (function, line 2840)
  - `openModal` (function, line 2843)
  - `promptModal` (function, line 2878)
  - `confirmModal` (function, line 2902)
  - `loadSidebarWidth` (function, line 2994)
  - `saveSidebarWidth` (function, line 3005)
  - `loadSidebarCollapsed` (function, line 3008)
  - `saveSidebarCollapsed` (function, line 3016)
  - `switchSidebarTab` (function, line 3074)
  - `loadFusionTab` (function, line 3087)
  - `loadFusionStats` (function, line 3093)
  - `loadFusionTopChanged` (function, line 3112)
  - `loadFusionSearch` (function, line 3141)
  - `doSearch` (function, line 3148)
  - `loadFusionEntityDetail` (function, line 3186)
  - `_sseUrl` (function, line 3258)
  - `setStatus` (function, line 3282)
  - `setDiscoverProgress` (function, line 3289)
  - `hideDiscoverProgress` (function, line 3301)
  - `startDiscover` (function, line 3307)
  - `stopDiscover` (function, line 3390)
  - `handleDiscoverEvent` (function, line 3407)
  - `addDiscoverEntityToTab` (function, line 3446)
  - `escapeHtml` (function, line 3474)
  - `maybePlotDiscoverEntity` (function, line 3479)
  - `flushDiscoverEntities` (function, line 3486)
  - `check` (function, line 3505)
  - `t` (function, line 25)
  - `safe` (function, line 60)
  - `done` (function, line 70)
  - `onYes` (function, line 77)
  - `onNo` (function, line 78)
  - `set` (function, line 105)
  - `TELEMETRY` (function, line 114)
  - `toolBinary` (function, line 215)
  - `status` (function, line 221)
  - `out` (function, line 319)
  - `text` (function, line 333)
  - `cat` (function, line 334)
  - `status` (function, line 335)
  - `scope` (function, line 621)
  - `msg` (function, line 662)
  - `sig` (function, line 920)
  - `boxQ` (function, line 1122)
  - `scheduleRender` (function, line 1146)
  - `flush` (function, line 1151)
  - `pump` (function, line 1172)
  - `k` (function, line 1270)
  - `CLUSTER_PALETTE` (function, line 1388)
  - `c` (function, line 1421)
  - `cid` (function, line 1441)
  - `labelFor` (function, line 1503)
  - `c` (function, line 1504)
  - `tr` (function, line 1598)
  - `barH` (function, line 1644)
  - `flush` (function, line 1681)
  - `k` (function, line 1748)
  - `tr` (function, line 1838)
  - `barH` (function, line 1893)
  - `obs` (function, line 2337)
  - `frac` (function, line 2370)
  - `q` (function, line 2474)
  - `entities` (function, line 2500)
  - `obs` (function, line 2501)
  - `saved` (function, line 2597)
  - `rows` (function, line 2746)
  - `removed` (function, line 2749)
  - `actions` (function, line 2849)
  - `close` (function, line 2863)
  - `tag` (function, line 2964)
  - `_sseAuthToken` (function, line 3254)
  - `sig` (function, line 3451)
  - `to` (class, line 474)
  - `on` (class, line 2178)
  - `attribute` (class, line 3194)
- Depends on: `estorides_core/discoverer.py`, `estorides_core/scope.py`, `estorides_export/report.py`

## static/js/graph_bundle.js
- Doc: Estorides Bundles — circle 2D + sphere 3D hierarchical edge bundling.
- Layer: utility
- Language: js
- Symbols:
  - `djb2KindColor` (function, line 32)
  - `mk` (function, line 60)
  - `clip` (function, line 66)
  - `tabActive` (function, line 70)
  - `ink` (function, line 74)
  - `colorOf` (function, line 88)
  - `keyOf` (function, line 94)
  - `bspline` (function, line 99)
  - `curve` (function, line 120)
  - `buildCurves` (function, line 137)
  - `resize` (function, line 148)
  - `radius` (function, line 160)
  - `center` (function, line 164)
  - `makeProjector` (function, line 165)
  - `depthAlpha` (function, line 175)
  - `focusState` (function, line 177)
  - `edgeState` (function, line 185)
  - `nodeLit` (function, line 205)
  - `strokeCurve` (function, line 216)
  - `pointOn` (function, line 226)
  - `g` (function, line 229)
  - `draw` (function, line 231)
  - `drawGroups` (function, line 291)
  - `nodeRadius` (function, line 333)
  - `screenNodes` (function, line 337)
  - `drawNodes` (function, line 343)
  - `labelSet` (function, line 355)
  - `drawLabels` (function, line 367)
  - `drawHud` (function, line 405)
  - `add` (function, line 411)
  - `hitNode` (function, line 420)
  - `hitGroup` (function, line 443)
  - `tipFor` (function, line 461)
  - `flowsOf` (function, line 483)
  - `rank` (function, line 492)
  - `inspectInGraph` (function, line 497)
  - `nodeButton` (function, line 504)
  - `groupButton` (function, line 512)
  - `listInto` (function, line 519)
  - `renderPanel` (function, line 529)
  - `renderLegend` (function, line 613)
  - `focusNode` (function, line 645)
  - `focusGroup` (function, line 650)
  - `facing` (function, line 655)
  - `aimAt` (function, line 661)
  - `setView` (function, line 667)
  - `setColor` (function, line 671)
  - `setDir` (function, line 675)
  - `setBeta` (function, line 679)
  - `sync` (function, line 687)
  - `writeHash` (function, line 697)
  - `readHash` (function, line 709)
  - `ingest` (function, line 726)
  - `refresh` (function, line 762)
  - `frame` (function, line 786)
  - `init` (function, line 812)
  - `search` (function, line 913)
  - `t0` (function, line 275)
  - `tt` (function, line 279)
  - `mid` (function, line 306)
  - `tag` (function, line 958)
  - `v` (function, line 78)

## static/js/graph_force.js
- Doc: Estorides force-graph module (spec/graph_force3d.md).
- Layer: utility
- Language: js
- Symbols:
  - `reducedMotion` (function, line 52)
  - `toast` (function, line 57)
  - `fail` (function, line 65)
  - `settings` (function, line 72)
  - `adaptLocal` (function, line 79)
  - `currentRaw` (function, line 137)
  - `rebuildRaw` (function, line 153)
  - `indexRaw` (function, line 179)
  - `lkey` (function, line 218)
  - `colorOf` (function, line 219)
  - `dimmed` (function, line 220)
  - `hiddenKind` (function, line 221)
  - `visiblePayload` (function, line 226)
  - `computeHighlight` (function, line 275)
  - `tip` (function, line 298)
  - `refreshFamList` (function, line 315)
  - `famAnchor` (function, line 320)
  - `famOf` (function, line 330)
  - `clusterForce` (function, line 335)
  - `force` (function, line 337)
  - `ringOf` (function, line 352)
  - `radialForce` (function, line 360)
  - `force` (function, line 362)
  - `collideForce` (function, line 377)
  - `force` (function, line 379)
  - `radius` (function, line 402)
  - `linkStrengthFn` (function, line 406)
  - `setEngineButtons` (function, line 422)
  - `show3DChrome` (function, line 435)
  - `mount3D` (function, line 458)
  - `startOverlayLoop` (function, line 546)
  - `overlayTick` (function, line 551)
  - `convexHullPts` (function, line 561)
  - `cross` (function, line 564)
  - `inflateHull` (function, line 580)
  - `traceSmooth` (function, line 592)
  - `rr` (function, line 610)
  - `glyphPath` (function, line 619)
  - `tierColorOf` (function, line 647)
  - `drawGlyph3D` (function, line 651)
  - `drawLabel3D` (function, line 703)
  - `paintOverlay3D` (function, line 724)
  - `stageLocal` (function, line 839)
  - `hitNode3D` (function, line 845)
  - `segDist` (function, line 854)
  - `hitEdge3D` (function, line 861)
  - `hoverAt3D` (function, line 876)
  - `bindStagePointer` (function, line 887)
  - `refresh3D` (function, line 939)
  - `reload3D` (function, line 945)
  - `resize3D` (function, line 950)
  - `applyLayout3D` (function, line 961)
  - `onSelect3D` (function, line 982)
  - `expandSelected` (function, line 999)
  - `focusSelected` (function, line 1009)
  - `copyDeepLink` (function, line 1020)
  - `done` (function, line 1022)
  - `reheat` (function, line 1030)
  - `toggleBridges` (function, line 1038)
  - `snapshot3D` (function, line 1048)
  - `toggleOrbit` (function, line 1074)
  - `onEdge3D` (function, line 1088)
  - `clearSelection` (function, line 1112)
  - `focusFamily` (function, line 1125)
  - `markFamilies` (function, line 1150)
  - `hud` (function, line 1156)
  - `stat` (function, line 1160)
  - `renderLegend` (function, line 1187)
  - `applyFilters` (function, line 1241)
  - `runSearch` (function, line 1276)
  - `pickHit` (function, line 1342)
  - `to3D` (function, line 1353)
  - `to2D` (function, line 1362)
  - `readHash` (function, line 1371)
  - `writeHash` (function, line 1386)
  - `syncIsolateBtn` (function, line 1393)
  - `wireToolbar` (function, line 1398)
  - `toggle` (function, line 1423)
  - `ordered` (function, line 96)
  - `cid` (function, line 104)
  - `fam` (function, line 105)
  - `src` (function, line 162)
  - `s` (function, line 189)
  - `t` (function, line 190)
  - `entities` (function, line 205)
  - `links` (function, line 233)
  - `s` (function, line 234)
  - `t` (function, line 235)
  - `s` (function, line 246)
  - `t` (function, line 247)
  - `s` (function, line 253)
  - `t` (function, line 254)
  - `s` (function, line 259)
  - `t` (function, line 260)
  - `a` (function, line 327)
  - `m` (function, line 392)
  - `col` (function, line 788)
  - `topN` (function, line 816)
  - `s` (function, line 1138)
  - `t` (function, line 1139)
  - `nodes` (function, line 1249)
  - `edges` (function, line 1256)
  - `s` (function, line 1257)
  - `t` (function, line 1258)
  - `fn` (function, line 1267)
  - `tag` (function, line 1511)
  - `short` (function, line 21)
  - `esc` (function, line 25)
  - `mid` (function, line 600)

## static/js/source_manager.js
- Doc: Estorides Source Manager — form-based YAML editor
- Layer: utility
- Language: js
- Symbols:
  - `authHeaders` (function, line 7)
  - `apiFetch` (function, line 15)
  - `getCheckedTags` (function, line 67)
  - `setCheckedTags` (function, line 74)
  - `readForm` (function, line 84)
  - `writeForm` (function, line 120)
  - `updateYamlPreview` (function, line 183)
  - `renderList` (function, line 193)
  - `escHtml` (function, line 223)
  - `escAttr` (function, line 224)
  - `toast` (function, line 227)
  - `loadSources` (function, line 236)
  - `clearEditor` (function, line 251)
  - `selectSource` (function, line 261)
  - `saveSource` (function, line 273)
  - `deleteSource` (function, line 304)
  - `newSource` (function, line 334)
  - `from` (class, line 255)
