codebase-onboarder 0.7.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +140 -12
  2. package/bin/onboarder.js +0 -0
  3. package/cli/agent/command.d.ts +71 -0
  4. package/cli/agent/command.js +177 -0
  5. package/cli/agent/command.js.map +1 -0
  6. package/cli/agent/config.d.ts +31 -0
  7. package/cli/agent/config.js +98 -0
  8. package/cli/agent/config.js.map +1 -0
  9. package/cli/agent/contracts.d.ts +77 -0
  10. package/cli/agent/contracts.js +2 -0
  11. package/cli/agent/contracts.js.map +1 -0
  12. package/cli/agent/files.d.ts +19 -0
  13. package/cli/agent/files.js +109 -0
  14. package/cli/agent/files.js.map +1 -0
  15. package/cli/agent/gitSource.d.ts +18 -0
  16. package/cli/agent/gitSource.js +69 -0
  17. package/cli/agent/gitSource.js.map +1 -0
  18. package/cli/agent/github.d.ts +21 -0
  19. package/cli/agent/github.js +94 -0
  20. package/cli/agent/github.js.map +1 -0
  21. package/cli/agent/mcp.d.ts +15 -0
  22. package/cli/agent/mcp.js +78 -0
  23. package/cli/agent/mcp.js.map +1 -0
  24. package/cli/agent/process.d.ts +18 -0
  25. package/cli/agent/process.js +118 -0
  26. package/cli/agent/process.js.map +1 -0
  27. package/cli/agent/protocol.d.ts +3 -0
  28. package/cli/agent/protocol.js +26 -0
  29. package/cli/agent/protocol.js.map +1 -0
  30. package/cli/agent/runner.d.ts +34 -0
  31. package/cli/agent/runner.js +152 -0
  32. package/cli/agent/runner.js.map +1 -0
  33. package/cli/agent/stdio.d.ts +1 -0
  34. package/cli/agent/stdio.js +62 -0
  35. package/cli/agent/stdio.js.map +1 -0
  36. package/cli/agent/tools.d.ts +7 -0
  37. package/cli/agent/tools.js +225 -0
  38. package/cli/agent/tools.js.map +1 -0
  39. package/cli/chat/analysis.d.ts +26 -0
  40. package/cli/chat/analysis.js +188 -0
  41. package/cli/chat/analysis.js.map +1 -0
  42. package/cli/chat/app.d.ts +16 -0
  43. package/cli/chat/app.js +363 -0
  44. package/cli/chat/app.js.map +1 -0
  45. package/cli/chat/commands.d.ts +11 -0
  46. package/cli/chat/commands.js +122 -0
  47. package/cli/chat/commands.js.map +1 -0
  48. package/cli/chat/composer.d.ts +75 -0
  49. package/cli/chat/composer.js +467 -0
  50. package/cli/chat/composer.js.map +1 -0
  51. package/cli/chat/controller.d.ts +64 -0
  52. package/cli/chat/controller.js +402 -0
  53. package/cli/chat/controller.js.map +1 -0
  54. package/cli/chat/logo.d.ts +3 -0
  55. package/cli/chat/logo.js +14 -0
  56. package/cli/chat/logo.js.map +1 -0
  57. package/cli/chat/models.d.ts +18 -0
  58. package/cli/chat/models.js +88 -0
  59. package/cli/chat/models.js.map +1 -0
  60. package/cli/chat/profile.d.ts +5 -0
  61. package/cli/chat/profile.js +98 -0
  62. package/cli/chat/profile.js.map +1 -0
  63. package/cli/chat/render.d.ts +40 -0
  64. package/cli/chat/render.js +259 -0
  65. package/cli/chat/render.js.map +1 -0
  66. package/cli/chat/screen.d.ts +26 -0
  67. package/cli/chat/screen.js +117 -0
  68. package/cli/chat/screen.js.map +1 -0
  69. package/cli/chat/source.d.ts +29 -0
  70. package/cli/chat/source.js +116 -0
  71. package/cli/chat/source.js.map +1 -0
  72. package/cli/chat/store.d.ts +43 -0
  73. package/cli/chat/store.js +94 -0
  74. package/cli/chat/store.js.map +1 -0
  75. package/cli/chat/text.d.ts +4 -0
  76. package/cli/chat/text.js +27 -0
  77. package/cli/chat/text.js.map +1 -0
  78. package/cli/explorer/app.d.ts +1 -0
  79. package/cli/explorer/app.js +20 -1
  80. package/cli/explorer/app.js.map +1 -1
  81. package/cli/explorer/commands.js +5 -0
  82. package/cli/explorer/commands.js.map +1 -1
  83. package/cli/explorer/featureViews.d.ts +1 -0
  84. package/cli/explorer/featureViews.js +4 -0
  85. package/cli/explorer/featureViews.js.map +1 -1
  86. package/cli/main.js +47 -13
  87. package/cli/main.js.map +1 -1
  88. package/docs/HERMES_RESEARCH.md +51 -0
  89. package/package.json +2 -1
  90. package/public/app.js +98 -24
  91. package/public/app.js.map +1 -1
  92. package/public/assets/onboarder-mark.svg +11 -0
  93. package/public/browser.d.ts +3 -0
  94. package/public/browser.js.map +1 -1
  95. package/public/index.html +24 -7
  96. package/public/js/about.js +2 -2
  97. package/public/js/about.js.map +1 -1
  98. package/public/js/aiDraft.d.ts +1 -0
  99. package/public/js/aiDraft.js +66 -17
  100. package/public/js/aiDraft.js.map +1 -1
  101. package/public/js/api.d.ts +8 -5
  102. package/public/js/api.js +45 -22
  103. package/public/js/api.js.map +1 -1
  104. package/public/js/deepAnalysisView.js +2 -2
  105. package/public/js/deepAnalysisView.js.map +1 -1
  106. package/public/js/diagramPane.d.ts +1 -0
  107. package/public/js/diagramPane.js +5 -0
  108. package/public/js/diagramPane.js.map +1 -1
  109. package/public/js/docsView.js +6 -6
  110. package/public/js/docsView.js.map +1 -1
  111. package/public/js/dom.d.ts +8 -0
  112. package/public/js/dom.js.map +1 -1
  113. package/public/js/llm.d.ts +3 -1
  114. package/public/js/llm.js +15 -8
  115. package/public/js/llm.js.map +1 -1
  116. package/public/js/repoFiles.js +1 -1
  117. package/public/js/repoFiles.js.map +1 -1
  118. package/public/js/reviewView.js +1 -1
  119. package/public/js/reviewView.js.map +1 -1
  120. package/public/styles.css +25 -0
  121. package/server/gitDiff.d.ts +1 -1
  122. package/server/hermesChat.d.ts +13 -0
  123. package/server/hermesChat.js +145 -0
  124. package/server/hermesChat.js.map +1 -0
  125. package/server/http.d.ts +5 -4
  126. package/server/http.js +0 -4
  127. package/server/http.js.map +1 -1
  128. package/server/mcp/server.d.ts +1 -1
  129. package/server/mcp/server.js +2 -2
  130. package/server/mcp/server.js.map +1 -1
  131. package/server/router.js +7 -3
  132. package/server/router.js.map +1 -1
  133. package/server/tools/scan.js +16 -2
  134. package/server/tools/scan.js.map +1 -1
  135. package/server/tools.d.ts +1 -0
  136. package/server/tools.js +46 -6
  137. package/server/tools.js.map +1 -1
  138. package/shared/diagram/aiMermaid.js +16 -13
  139. package/shared/diagram/aiMermaid.js.map +1 -1
package/public/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/public/app.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ScanProgress } from '../shared/contracts.js';\nimport { abortable, throwIfAborted } from '/shared/analyzer/scanControl.js';\nimport { eventElement } from '/js/dom.js';\nimport type { AppElements } from '/js/dom.js';\n// Onboarder — bootstrap, routing, and wiring.\n//\n// Two ways a repo arrives here:\n// 1. The server scans it (local path, git URL, or this app's own source)\n// and hands back { scan, facts, manifest } as JSON.\n// 2. The user picks a folder and the exact same analyzer runs in this tab.\n// After that everything is one code path over plain data.\n//\n// What is left in this file is the part that has to know about everything else:\n// the landing page, `setView`/`renderCanvas` deciding what the stage shows, and\n// `syncInspector` keeping the side panel agreeing with it. Each view that is more\n// than a diagram call lives in its own module under js/ — mapView, atlas, docsView,\n// codeTab, about, aiDraft — and is handed its host element and a set of callbacks\n// here. The callbacks are the reason the module graph stays acyclic: a feature\n// module never imports back into app.js.\n\nimport { scanRepo } from '/shared/analyzer/scan.js';\nimport { computeFacts, scanIndex } from '/shared/analyzer/graph.js';\nimport { analyzeStack } from '/shared/analyzer/stack.js';\nimport { detectManifest } from '/shared/analyzer/services.js';\nimport { computeLayers, detectPatterns, couplingMatrix } from '/shared/analyzer/patterns.js';\nimport { explainOverview } from '/shared/analyzer/explainLocal.js';\nimport { dirOf, pathFilter } from '/shared/analyzer/pathUtil.js';\nimport {\n overviewDiagram, folderDiagram, fileDetailDiagram, servicesDiagram, emptyDiagram,\n layersDiagram, healthDiagram, securityDiagram, historyDiagram, setDiagramTheme, diagramThemeBlock,\n} from '/shared/diagram/mermaid.js';\nimport { analyzeHealth } from '/shared/analyzer/health.js';\nimport { summarizeSecurity } from '/shared/analyzer/security.js';\nimport { escapeHtml } from '/js/html.js';\nimport {\n scanOnServer, cleanupClone, streamExplain,\n fetchMcpStatus, startMcpServer, stopMcpServer, fetchMcpCommand,\n} from '/js/api.js';\nimport { canPickFolder, pickDirectory, browserFileSource } from '/js/fileSourceBrowser.js';\nimport { renderInto, wireNodeClicks, makePanzoom, downloadSvg } from '/js/diagramPane.js';\nimport { setViewerTheme } from '/js/codeViewer.js';\nimport * as llm from '/js/llm.js';\nimport { buildTree, renderTree, resetOpenState, expandedToDepth } from '/js/tree.js';\nimport { initMap, renderMap } from '/js/mapView.js';\nimport { gatherFileContext } from '/js/repoFiles.js';\nimport * as inspector from '/js/inspector.js';\nimport { buildTourStops, describeStop } from '/js/tour.js';\nimport { initAbout, renderAbout } from '/js/about.js';\nimport { initDocs, renderDocs } from '/js/docsView.js';\nimport { initCodeTab, renderCode, revealLineInCode } from '/js/codeTab.js';\nimport { initAnalysisPanel, renderAnalysisPanel, subscribeAnalysis } from '/js/analysisPanel.js';\nimport { initDeepAnalysis, renderDeepAnalysis } from '/js/deepAnalysisView.js';\nimport { initAiDraft, updateAiBtn, wireAIClicks } from '/js/aiDraft.js';\nimport { initAtlas, renderAtlasList, openCardDiagram } from '/js/atlas.js';\nimport { initForceGraph } from '/js/forceGraph.js';\nimport { initHeatmap } from '/js/heatmap.js';\nimport { initSearch } from '/js/search.js';\nimport { withTransition } from '/js/transitions.js';\nimport { renderInsights } from '/js/insightsView.js';\nimport { createServerDrawer } from '/js/serverSettings.js';\nimport { renderDiffView, stopDiff } from '/js/diffView.js';\nimport { renderReviewView, stopReview } from '/js/reviewView.js';\nimport { renderWorkflows } from '/js/workflowsView.js';\nimport { renderSbom } from '/js/sbomView.js';\nimport { initMobilePanels } from '/js/mobilePanels.js';\nimport {\n state as appState, isExplorerView, loadRepo, unloadRepo,\n focusFile, focusFolder, clearFocus as clearFocusState, inspectorSubject, aiViewKey,\n} from '/js/state.js';\n\nconst $ = (id) => document.getElementById(id);\n\nconst dom: Partial<AppElements> = {};\n[\n 'landing', 'landingError', 'landingStatus', 'cancelScanBtn', 'scanProgress', 'pathForm', 'pathInput', 'gitForm', 'gitInput',\n 'pickBtn', 'demoBtn', 'explorer', 'viewTabs', 'repoChip', 'newRepoBtn', 'settingsBtn',\n 'landingAbout', 'creditsHide', 'creditsRemove', 'creditsBar', 'creditsShow', 'creditsBarRemove',\n 'treeFilter', 'fileTree', 'crumbs', 'copyMermaidBtn', 'svgBtn', 'fitBtn',\n 'canvas', 'canvasContent', 'canvasEmpty', 'stageFoot', 'themeBtn', 'aiDrawBtn', 'docView', 'aboutView', 'codeView',\n 'mmToggleBtn', 'stageFilters', 'modeSwitch', 'nodeFilter', 'testsToggle', 'depthSelect',\n 'tourbar', 'tourTitle', 'tourCount', 'tourPrev', 'tourNext', 'tourExit',\n 'drawerScrim', 'settingsDrawer', 'drawerClose', 'setBaseUrl', 'setApiKey', 'setModel',\n 'saveSettings', 'testSettings', 'settingsStatus', 'toast', 'brandNote', 'askBtn', 'askInput',\n 'graphView', 'graphCanvas', 'graphControls', 'graphReset', 'graphZoomIn', 'graphZoomOut', 'graphFit', 'graphSearchInput', 'graphTooltip',\n 'heatmapView', 'heatmapCanvas', 'heatmapTooltip', 'blameGutter', 'codeTabContainer',\n 'insightsView', 'diffView', 'reviewView', 'workflowsView', 'sbomView', 'searchTriggerBtn', 'inspSecurityTools', 'analysisView',\n 'mcpBtn', 'mcpBtnLabel', 'mcpDot', 'mcpDrawer', 'mcpScrim', 'mcpClose', 'mcpPanelDot', 'mcpPanelState',\n 'mcpStart', 'mcpStop', 'mcpStatus', 'mcpConfig', 'mcpCommandInput', 'mcpCopy', 'mcpTabJson', 'mcpTabToml',\n 'mcpConfigBlock', 'mcpToolsHint', 'serverBtn',\n].forEach((id) => (dom[id] = $(id)));\n\nlet forceGraphCtl = null;\nlet graphScan = null;\nlet graphHealth = null;\nlet heatmapCtl = null;\nlet searchCtl = null;\n\nconst state = appState;\n\nconst panzoom = makePanzoom(dom.canvas, dom.canvasContent);\nconst mobilePanels = initMobilePanels();\n\n// ---------------------------------------------------------------- landing --\n\nlet activeScan: AbortController | null = null;\n\nfunction landingBusy(message) {\n dom.landingError.hidden = true;\n dom.landing.setAttribute('aria-busy', 'true');\n dom.landingStatus.textContent = message;\n dom.landingStatus.hidden = false;\n for (const btn of dom.landing.querySelectorAll('button')) btn.disabled = true;\n dom.cancelScanBtn.hidden = false;\n dom.cancelScanBtn.disabled = false;\n dom.scanProgress.hidden = false;\n dom.scanProgress.removeAttribute('value');\n}\n\nfunction landingIdle(error?: any) {\n dom.landingStatus.hidden = true;\n dom.cancelScanBtn.hidden = true;\n dom.scanProgress.hidden = true;\n dom.landing.removeAttribute('aria-busy');\n for (const btn of dom.landing.querySelectorAll('button')) btn.disabled = false;\n dom.pickBtn.disabled = !canPickFolder();\n if (error) {\n dom.landingError.textContent = error;\n dom.landingError.hidden = false;\n }\n}\n\nfunction beginScan(message: string): AbortController {\n activeScan?.abort();\n const controller = new AbortController();\n activeScan = controller;\n landingBusy(message);\n return controller;\n}\n\nfunction updateScanProgress(progress: ScanProgress): void {\n if (progress.phase === 'walk') dom.landingStatus.textContent = `Walking the file tree… ${progress.found} files`;\n if (progress.phase === 'parse' || progress.phase === 'resolve') {\n dom.landingStatus.textContent = `${progress.phase === 'parse' ? 'Reading code' : 'Tracing imports'}… ${progress.done} / ${progress.total} files`;\n dom.scanProgress.max = Math.max(1, progress.total);\n dom.scanProgress.value = progress.done;\n }\n}\n\ndom.cancelScanBtn.addEventListener('click', () => {\n activeScan?.abort();\n activeScan = null;\n landingIdle();\n dom.landingStatus.hidden = false;\n dom.landingStatus.textContent = 'Scan cancelled. Choose a repository when you’re ready.';\n});\n\nasync function loadFromServer(payload, busyText) {\n const controller = beginScan(busyText);\n try {\n const result = await scanOnServer(payload, { signal: controller.signal });\n if (activeScan !== controller) return;\n enterExplorer(result, {});\n } catch (err) {\n if (activeScan === controller) landingIdle(err.message);\n } finally {\n if (activeScan === controller) activeScan = null;\n }\n}\n\ndom.pathForm.addEventListener('submit', (event) => {\n event.preventDefault();\n const path = dom.pathInput.value.trim();\n if (!path) return landingIdle('Give me a path first — something like ~/work/that-repo.');\n loadFromServer({ path }, 'Walking the file tree…');\n});\n\ndom.gitForm.addEventListener('submit', (event) => {\n event.preventDefault();\n const gitUrl = dom.gitInput.value.trim();\n if (!gitUrl) return landingIdle('Paste a git URL first.');\n loadFromServer({ gitUrl }, 'Cloning, then scanning. Big repos take a minute…');\n});\n\ndom.demoBtn.addEventListener('click', () => {\n loadFromServer({ demo: true }, 'Reading our own source…');\n});\n\n// The landing credits card can be tucked away or permanently removed; the choice sticks.\nconst CREDITS_KEY = 'onboarder.credits';\nfunction applyCreditsVisibility() {\n const status = localStorage.getItem(CREDITS_KEY);\n if (status === 'removed') {\n dom.landingAbout?.remove();\n dom.creditsBar?.remove();\n return;\n }\n const hidden = status === 'hidden';\n if (dom.landingAbout) dom.landingAbout.hidden = hidden;\n if (dom.creditsBar) dom.creditsBar.hidden = !hidden;\n}\n\nfunction removeCreditsPermanently() {\n localStorage.setItem(CREDITS_KEY, 'removed');\n applyCreditsVisibility();\n}\n\ndom.creditsHide?.addEventListener('click', () => {\n localStorage.setItem(CREDITS_KEY, 'hidden');\n applyCreditsVisibility();\n});\ndom.creditsShow?.addEventListener('click', () => {\n localStorage.setItem(CREDITS_KEY, 'shown');\n applyCreditsVisibility();\n});\ndom.creditsRemove?.addEventListener('click', removeCreditsPermanently);\ndom.creditsBarRemove?.addEventListener('click', removeCreditsPermanently);\n\napplyCreditsVisibility();\n\ndom.pickBtn.addEventListener('click', async () => {\n if (!canPickFolder()) {\n return landingIdle('This browser can’t pick folders. Chrome or Edge can; the other two options work anywhere.');\n }\n let handle;\n try {\n handle = await pickDirectory();\n } catch {\n return; // the picker was dismissed — no news is good news\n }\n const controller = beginScan('Walking the file tree…');\n try {\n const source = browserFileSource(handle);\n const scan = await scanRepo(source, {\n signal: controller.signal,\n onProgress: updateScanProgress,\n });\n dom.landingStatus.textContent = 'Counting connections…';\n const manifest = await abortable(detectManifest(source), controller.signal);\n throwIfAborted(controller.signal);\n if (activeScan !== controller) return;\n const facts = computeFacts(scan, manifest);\n enterExplorer({ scan, facts, manifest }, { browserSource: source });\n } catch (err) {\n if (activeScan === controller) landingIdle(err.message);\n } finally {\n if (activeScan === controller) activeScan = null;\n }\n});\n\nif (!canPickFolder()) {\n dom.pickBtn.disabled = true;\n dom.pickBtn.title = 'Folder picking needs Chrome or Edge.';\n}\n\n// -------------------------------------------------------------- explorer --\n\nfunction enterExplorer(payload, opts) {\n loadRepo(payload, {\n browserSource: opts.browserSource || null,\n history: payload.history || null, // computed server-side; null for browser picks\n });\n state.stack = analyzeStack(state.manifest, state.scan.stats.languages);\n\n resetOpenState();\n state.treeData = buildTree(state.scan.allFiles);\n state.patterns = buildPatterns(state.scan, state.facts, state.manifest);\n state.health = analyzeHealth(state.scan, state.facts);\n state.security = summarizeSecurity(state.scan);\n dom.nodeFilter.value = '';\n dom.testsToggle.classList.add('is-on');\n dom.depthSelect.value = '0';\n\n if (searchCtl) {\n searchCtl.updateFiles(state.scan.files, state.scanId);\n searchCtl.hide();\n } else {\n searchCtl = initSearch(state.scan.files, { getScanId: () => state.scanId });\n }\n\n // Compute everything first, then flip the UI over — a failure here should\n // land on the landing page with the error visible, not a half-dead explorer.\n landingIdle();\n dom.landing.hidden = true;\n dom.explorer.hidden = false;\n dom.viewTabs.hidden = false;\n dom.repoChip.hidden = false;\n dom.newRepoBtn.hidden = false;\n dom.searchTriggerBtn.hidden = false;\n dom.repoChip.innerHTML =\n `<span class=\"repo-name\">${escapeHtml(state.scan.name)}</span>` +\n `<span class=\"repo-sub\">${escapeHtml(repoSubLabel())}</span>`;\n dom.repoChip.title = state.scan.root;\n dom.brandNote.textContent = state.scan.stats.filesParsed + ' files · ' + state.scan.stats.edgeCount + ' connections';\n\n renderSidebar();\n setView(state.scanId ? 'review' : 'map');\n}\n\n// The big name is the repo's own; the small line says where it actually lives.\nfunction repoSubLabel() {\n if (state.scan.tempId) return state.scan.tempId + ' · temp clone';\n if (state.browserSource) return 'picked in the browser';\n return state.scan.root;\n}\n\nfunction buildPatterns(scan, facts, manifest) {\n const layersInfo = computeLayers(scan, facts);\n return {\n layersInfo,\n findings: detectPatterns(scan, facts, manifest, layersInfo),\n coupling: couplingMatrix(scan, facts),\n };\n}\n\ndom.newRepoBtn.addEventListener('click', () => {\n stopReview();\n stopDiff();\n mobilePanels.close();\n if (state.cloneId) cleanupClone(state.cloneId);\n // The graph and heatmap views attach `window` resize listeners when\n // they initialize. The view tab is unmounted by hiding the container,\n // not by removing the listener, so without this call every new repo\n // would attach another listener to the same global and the page would\n // fan out work on every resize. Destroy tears them down before the\n // next `init*` rebuilds them for a new repo.\n if (forceGraphCtl) { forceGraphCtl.destroy(); forceGraphCtl = null; }\n if (heatmapCtl) { heatmapCtl.destroy(); heatmapCtl = null; }\n graphScan = null; graphHealth = null;\n unloadRepo();\n dom.explorer.hidden = true;\n dom.tourbar.hidden = true;\n dom.viewTabs.hidden = true;\n dom.repoChip.hidden = true;\n dom.newRepoBtn.hidden = true;\n dom.brandNote.textContent = 'a map for any codebase';\n dom.landing.hidden = false;\n landingIdle();\n});\n\nfunction renderSidebar() {\n renderTree(dom.fileTree, state.treeData, {\n facts: state.facts,\n filter: dom.treeFilter.value,\n selected: state.selected,\n parsedPaths: state.scan.files.map((f) => f.path),\n onFile: openFile,\n onFolder: (folder) => {\n focusFolder(folder);\n state.folder = folder;\n state.detail = null;\n if (state.view === 'files') renderCanvas();\n syncInspector();\n },\n });\n}\n\nlet sidebarFrame: number | null = null;\ndom.treeFilter.addEventListener('input', () => {\n if (sidebarFrame !== null) cancelAnimationFrame(sidebarFrame);\n sidebarFrame = requestAnimationFrame(() => { sidebarFrame = null; if (state.scan) renderSidebar(); });\n});\n\n// ------------------------------------------------------------------ views --\n\ndom.viewTabs.addEventListener('click', (event) => {\n const tab = eventElement(event)?.closest<HTMLElement>('.view-tab');\n if (!tab) return;\n const view = tab.dataset.view === 'explorer' ? state.lastExplorer || 'map' : tab.dataset.view;\n if (state.view === view) return;\n withTransition(() => setView(view));\n});\n\n// The inspector's single source of truth. Whatever is focused — a file, a\n// folder — is shown in every tab; with nothing focused, each view shows its\n// own default panel. Every selection path funnels here, so the panel is\n// always in step with the canvas, tree, code and docs. Which subject that is\n// comes from `inspectorSubject` in state.js, which is pure and tested; this\n// function only does the showing.\nfunction syncInspector() {\n const subject = inspectorSubject(state);\n const opts = { ...state, backLabel: subject.backLabel };\n switch (subject.kind) {\n case 'file': return inspector.showFile(subject.path, opts);\n case 'folder': return inspector.showFolder(subject.path, opts);\n case 'patterns': return inspector.showPatterns(state);\n case 'health': return inspector.showHealth(state);\n case 'security': return inspector.showSecurity(state);\n case 'history': return inspector.showHistory(state);\n default: return inspector.showOverview(state);\n }\n}\n\nfunction clearFocus() {\n clearFocusState();\n syncInspector();\n}\n\nfunction setView(view) {\n if (view !== 'review') stopReview();\n if (view !== 'diff') stopDiff();\n dom.explorer.classList.toggle('review-workspace', view === 'review');\n state.view = view;\n if (isExplorerView(view)) state.lastExplorer = view;\n for (const tab of dom.viewTabs.querySelectorAll<HTMLElement>('.view-tab')) {\n tab.classList.toggle(\n 'is-active',\n tab.dataset.view === view || (tab.dataset.view === 'explorer' && isExplorerView(view))\n );\n }\n for (const chip of dom.modeSwitch.querySelectorAll<HTMLElement>('.mode-chip')) {\n chip.classList.toggle('is-active', chip.dataset.mode === view);\n }\n dom.tourbar.hidden = view !== 'tour';\n\n if (view === 'tour') {\n state.tour.stops = buildTourStops(state.scan, state.facts);\n state.tour.idx = 0;\n state.selected = null; // the tour drives its own focus\n }\n\n for (const tab of dom.viewTabs.querySelectorAll<HTMLElement>('.view-tab')) tab.setAttribute('aria-current', tab.classList.contains('is-active') ? 'page' : 'false');\n renderCanvas();\n\n if (view === 'tour') showTourStop();\n else syncInspector();\n}\n\nfunction openFile(path) {\n focusFile(path);\n state.code.path = path; // the Code tab follows the current file\n if (state.view !== 'files' && state.view !== 'tour' && state.view !== 'code') {\n state.folder = dirOf(path);\n setView('files');\n return;\n }\n if (state.view === 'files') {\n state.folder = dirOf(path);\n state.detail = path;\n renderCanvas();\n }\n if (state.view === 'code') renderCode();\n syncInspector();\n renderSidebar();\n}\n\n// The Code tab, optionally at a line. Search results for symbols and content\n// hits come through here: the scan already knows where a symbol was declared and\n// where a phrase matched, so opening the file at line 1 would throw away the\n// only part of the answer the person did not already know.\nfunction openFileInCode(path, line) {\n focusFile(path);\n state.code.path = path;\n if (line) revealLineInCode(line);\n setView('code');\n}\n\nfunction openDeepDive(path) {\n focusFile(path);\n state.folder = dirOf(path);\n state.detail = path;\n setView('files');\n}\n\nfunction onNodeClick(payload) {\n if (payload.kind === 'folder') {\n state.folder = payload.path;\n state.detail = null;\n focusFolder(payload.path);\n setView('files');\n } else if (payload.kind === 'file') {\n openFile(payload.path);\n }\n}\n\ninspector.onInspectorNavigate(openFile);\n\ndocument.addEventListener('search-select', (event) => {\n const detail = (event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail || {};\n if (!detail.path) return;\n // The palette says where a result belongs. A file's home is the graph; a\n // symbol or a content hit belongs in the Code tab, at its line.\n if (detail.target === 'code') return openFileInCode(detail.path, detail.line);\n return openFile(detail.path);\n});\n\ndocument.addEventListener('file-select', (event) => {\n if ((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail?.path) openFile((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail.path);\n});\n\ndocument.addEventListener('graph-node-click', (event) => {\n if ((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail?.path) openFile((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail.path);\n});\n\ndocument.addEventListener('heatmap-node-click', (event) => {\n if ((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail?.path) openFile((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail.path);\n});\n\nasync function renderCanvas() {\n const isDocs = state.view === 'docs';\n const isAbout = state.view === 'about';\n const isCode = state.view === 'code';\n const isGraph = state.view === 'graph';\n const isHeatmap = state.view === 'heatmap';\n const isInsights = state.view === 'insights';\n const isDiff = state.view === 'diff';\n const isReview = state.view === 'review';\n const isWorkflows = state.view === 'workflows';\n const isSbom = state.view === 'sbom';\n const isAnalysis = state.view === 'analysis';\n const isPage = isDocs || isAbout || isCode || isGraph || isHeatmap || isInsights || isDiff || isReview || isWorkflows || isSbom || isAnalysis;\n forceGraphCtl?.setActive(isGraph && !searchCtl?.isShowing());\n const isAtlasList = state.view === 'atlas' && !state.atlasOpen;\n \n dom.canvas.hidden = isPage;\n dom.docView.hidden = !isDocs;\n dom.aboutView.hidden = !isAbout;\n dom.codeView.hidden = !isCode;\n if (dom.codeTabContainer) dom.codeTabContainer.hidden = !isCode;\n if (dom.graphView) dom.graphView.hidden = !isGraph;\n if (dom.heatmapView) dom.heatmapView.hidden = !isHeatmap;\n if (dom.insightsView) dom.insightsView.hidden = !isInsights;\n if (dom.diffView) dom.diffView.hidden = !isDiff;\n if (dom.reviewView) dom.reviewView.hidden = !isReview;\n if (dom.workflowsView) dom.workflowsView.hidden = !isWorkflows;\n if (dom.sbomView) dom.sbomView.hidden = !isSbom;\n if (dom.analysisView) dom.analysisView.hidden = !isAnalysis;\n \n dom.copyMermaidBtn.hidden = isPage || isAtlasList;\n dom.svgBtn.hidden = isPage;\n dom.fitBtn.hidden = isPage || isAtlasList;\n dom.stageFilters.hidden = isPage;\n dom.mmToggleBtn.hidden = isPage || state.view !== 'map';\n if (!isAtlasList) dom.canvasContent.classList.remove('atlas-mode');\n\n if (isPage) {\n dom.aiDrawBtn.hidden = true;\n if (isDocs) renderDocs();\n else if (isCode) renderCode();\n else if (isAbout) renderAbout();\n else if (isInsights) renderInsights(dom.insightsView, state);\n else if (isDiff) renderDiffView(dom.diffView, state);\n else if (isReview) renderReviewView(dom.reviewView, state);\n else if (isWorkflows) renderWorkflows(dom.workflowsView, state);\n else if (isSbom) renderSbom(dom.sbomView, state);\n else if (isAnalysis) renderDeepAnalysis(dom.analysisView, state);\n \n if (isGraph) {\n if (!forceGraphCtl) forceGraphCtl = initForceGraph(dom.graphCanvas);\n forceGraphCtl.setActive(!searchCtl?.isShowing());\n if (graphScan !== state.scan || graphHealth !== state.health) {\n const edges = state.scan.edges || [];\n const facts = state.facts || {};\n const healthMap = new Map<string, { risk: number; complexity?: number }>((state.health?.perFile || []).map(h => [h.path, h]));\n const nodes = state.scan.files.map(f => {\n const h = healthMap.get(f.path);\n return {\n path: f.path,\n fanIn: facts.fanIn?.[f.path] || 0,\n fanOut: facts.fanOut?.[f.path] || 0,\n community: facts.communities?.[f.path] || 0,\n risk: h?.risk || 0,\n complexity: h?.complexity || f.cognitive || 0,\n lang: f.lang || 'unknown',\n };\n });\n forceGraphCtl.update(nodes, edges, facts.communities || {});\n graphScan = state.scan; graphHealth = state.health;\n }\n forceGraphCtl.resize();\n }\n \n if (isHeatmap) {\n const healthByPath = new Map<string, { risk: number }>((state.health?.perFile || []).map(f => [f.path, f]));\n const heatFiles = state.scan.files.map(f => ({\n path: f.path,\n risk: healthByPath.get(f.path)?.risk || 0,\n loc: f.size\n }));\n if (!heatmapCtl) heatmapCtl = initHeatmap(dom.heatmapCanvas, heatFiles);\n else heatmapCtl.update(heatFiles);\n }\n\n renderCrumbs();\n renderFoot();\n return;\n }\n\n const { scan, facts, manifest } = state;\n const key = aiViewKey();\n updateAiBtn(key);\n\n // Tree-map furniture only belongs to the Map; SVG export can't take cells.\n dom.svgBtn.hidden = isPage || isAtlasList || state.view === 'map';\n const filterable = ['map', 'files', 'patterns'].includes(state.view);\n dom.nodeFilter.hidden = !filterable && state.view !== 'atlas';\n dom.testsToggle.hidden = !filterable && state.view !== 'atlas';\n dom.depthSelect.hidden = state.view !== 'map';\n if (state.view === 'map') {\n // Copy Mermaid still hands over the classic folder overview.\n state.currentDiagram = { source: overviewDiagram(scan, facts).source, nodes: {} };\n renderMap(true);\n renderCrumbs();\n renderFoot();\n return;\n }\n\n if (isAtlasList) {\n dom.aiDrawBtn.hidden = true;\n dom.canvasEmpty.hidden = true; // the list is its own content; no placeholder\n renderAtlasList();\n renderCrumbs();\n renderFoot();\n return;\n }\n\n // An active AI draft replaces the static diagram for its exact view.\n if (state.aiActiveKey === key && state.aiDiagrams[key]) {\n const ai = state.aiDiagrams[key];\n const source = diagramThemeBlock() + '\\n' + ai.body; // theme follows the toggle\n dom.canvasEmpty.hidden = true;\n try {\n await renderInto(dom.canvasContent, source);\n wireAIClicks();\n requestAnimationFrame(() => panzoom.fit());\n } catch (err) {\n console.error(err);\n delete state.aiDiagrams[key];\n state.aiActiveKey = null;\n toast('That AI sketch would not draw — back to the static map.');\n renderCanvas();\n return;\n }\n state.currentDiagram = { source, nodes: {} };\n renderCrumbs();\n renderFoot(ai.caption);\n return;\n }\n\n // Honest empty states: better than a sparse, confusing diagram.\n const nothing = nothingToShow();\n if (nothing) {\n dom.canvasContent.innerHTML = '';\n dom.canvasEmpty.textContent = nothing;\n dom.canvasEmpty.hidden = false;\n state.currentDiagram = { source: '', nodes: {} };\n renderCrumbs();\n renderFoot();\n return;\n }\n\n let d;\n if (state.view === 'patterns') {\n d = layersDiagram(scan, facts, state.patterns.layersInfo, { include: pathFilter(state.filters) });\n } else if (state.view === 'health') {\n d = healthDiagram(scan, facts, state.health, { include: pathFilter(state.filters) });\n } else if (state.view === 'security') {\n d = securityDiagram(scan, facts, state.security, { include: pathFilter(state.filters) });\n } else if (state.view === 'history') {\n d = historyDiagram(scan, facts, state.history);\n } else if (state.view === 'services') {\n d = servicesDiagram(scan, manifest);\n } else if (state.view === 'tour') {\n const stop = state.tour.stops[state.tour.idx];\n d = stop ? fileDetailDiagram(scan, facts, stop.path) : emptyDiagram('No tour stops could be picked from this repo.');\n } else if (state.view === 'atlas' && state.atlasOpen) {\n d = openCardDiagram();\n } else {\n d = state.detail\n ? fileDetailDiagram(scan, facts, state.detail)\n : folderDiagram(scan, facts, state.folder, { include: pathFilter(state.filters) });\n }\n\n state.currentDiagram = d;\n dom.canvasEmpty.hidden = true;\n try {\n await renderInto(dom.canvasContent, d.source);\n wireNodeClicks(dom.canvasContent, d.nodes, onNodeClick);\n requestAnimationFrame(() => panzoom.fit());\n } catch (err) {\n console.error(err);\n dom.canvasEmpty.textContent = 'That diagram would not draw: ' + err.message;\n dom.canvasEmpty.hidden = false;\n }\n renderCrumbs();\n renderFoot();\n}\n\n// Returns a message when the current view has nothing worth drawing, else\n// null. The inspector still has plenty to say in these cases — this is only\n// about the canvas.\nfunction nothingToShow() {\n const { scan, facts } = state;\n const parsed = scan.stats.filesParsed;\n const edges = scan.stats.edgeCount;\n\n if (state.view === 'patterns') {\n if (!parsed) return 'No code files parsed, so there are no patterns to read.';\n if (!edges) return 'No import connections anywhere — a shape needs edges, and there are none.';\n }\n\n if (state.view === 'files') {\n if (state.detail) {\n const f = scanIndex(scan).fileAt(state.detail);\n if (!f) return 'That file is not in the scan.';\n const fin = facts.fanIn[state.detail] || 0;\n const fout = facts.fanOut[state.detail] || 0;\n if (!fin && !fout) {\n return f.functions.length\n ? `${f.name} stands alone — nothing imports it and it imports nothing.`\n : `${f.name} stands alone — nothing imports it, it imports nothing, and no functions to chart.`;\n }\n } else {\n const here = scanIndex(scan).filesIn(state.folder);\n if (!here.length) return 'Nothing parsed in this folder.';\n const localSet = new Set(here.map((x) => x.path));\n const touched = scan.edges.some((e) => localSet.has(e.from) || localSet.has(e.to));\n if (!touched) return 'The files here import nothing we can see, and nothing imports them.';\n }\n }\n\n if (state.view === 'services') {\n if (!state.manifest?.services?.length) {\n return 'No services detected — no docker-compose, Procfile, or workspace setup we recognize.';\n }\n }\n\n return null;\n}\n\n// ------------------------------------------------------- filters & routing --\n\n// Typing re-renders, so it is debounced; the toggles are single clicks and are\n// not. The Map redraws in place, everything else goes through the canvas router.\nlet filterTimer = null;\nfunction applyFilters() {\n if (state.view === 'map') renderMap(false);\n else renderCanvas();\n}\nfunction applyFiltersSoon() {\n clearTimeout(filterTimer);\n filterTimer = setTimeout(applyFilters, 160);\n}\n\ndom.modeSwitch.addEventListener('click', (event) => {\n const chip = eventElement(event)?.closest<HTMLElement>('.mode-chip');\n if (chip) setView(chip.dataset.mode);\n});\ndom.nodeFilter.addEventListener('input', () => {\n state.filters.text = dom.nodeFilter.value;\n applyFiltersSoon();\n});\ndom.testsToggle.addEventListener('click', () => {\n state.filters.showTests = !state.filters.showTests;\n dom.testsToggle.classList.toggle('is-on', state.filters.showTests);\n applyFilters();\n});\ndom.depthSelect.addEventListener('change', () => {\n state.filters.depth = Number(dom.depthSelect.value);\n if (state.filters.depth > 0) state.mm.expanded = expandedToDepth(state.treeData, state.filters.depth);\n if (state.view === 'map') renderMap(true);\n});\n\n// ---------------------------------------------------------- crumbs & foot --\n\nfunction renderCrumbs() {\n const parts = [];\n parts.push(`<button data-go=\"map\">${escapeHtml(state.scan.name)}</button>`);\n\n if (state.view === 'files' || state.view === 'tour') {\n const folder = state.view === 'tour' ? dirOf(state.tour.stops[state.tour.idx]?.path || '') : state.folder;\n if (folder) {\n const segs = folder.split('/');\n segs.forEach((seg, i) => {\n parts.push(`<button data-folder=\"${escapeHtml(segs.slice(0, i + 1).join('/'))}\">${escapeHtml(seg)}</button>`);\n });\n }\n const detail = state.view === 'tour' ? state.tour.stops[state.tour.idx]?.path : state.detail;\n if (detail) parts.push(`<span>${escapeHtml(detail.split('/').pop())}</span>`);\n } else if (state.view === 'services') {\n parts.push('<span>services</span>');\n } else if (state.view === 'atlas') {\n parts.push('<button data-atlas=\"list\">atlas</button>');\n if (state.atlasOpen) {\n const t = state.atlasOpen.title;\n parts.push(`<span>${escapeHtml(t.length > 34 ? '…' + t.slice(-33) : t)}</span>`);\n }\n } else if (state.view === 'about') {\n parts.push('<span>about</span>');\n } else if (state.view === 'docs') {\n parts.push('<span>docs</span>');\n } else if (state.view === 'patterns') {\n parts.push('<span>patterns</span>');\n } else if (state.view === 'history') {\n parts.push('<span>history</span>');\n }\n\n dom.crumbs.innerHTML = parts.join('<span class=\"sep\">/</span>');\n for (const b of dom.crumbs.querySelectorAll('button')) {\n b.addEventListener('click', () => {\n if (b.dataset.atlas) {\n state.atlasOpen = null;\n renderCanvas();\n return;\n }\n if (b.dataset.go === 'map') return setView('map');\n state.folder = b.dataset.folder || '';\n state.detail = null;\n setView('files');\n });\n }\n}\n\nfunction renderFoot(aiCaption?: any) {\n const s = state.scan.stats;\n const f = state.facts;\n const langList = Object.entries(s.languages).map(([k, v]) => `${v} ${k}`).join(', ');\n dom.stageFoot.innerHTML = [\n aiCaption ? `<span class=\"ai-cap\" title=\"${escapeHtml(aiCaption)}\">“${escapeHtml(aiCaption)}”</span>` : '',\n `<span class=\"foot-stats\">\n <b>${s.filesParsed}</b> files ·\n <b>${s.edgeCount}</b> connections ·\n <b>${f.entries.length}</b> entries ·\n <b>${f.hubs.length}</b> hubs ·\n <b>${f.orphans.length}</b> unconnected\n ${f.cycles.length ? ` · <b class=\"warn\">${f.cycles.length}</b> circular` : ''}\n </span>`,\n `<span class=\"foot-right\">\n ${langList ? `<span class=\"langs\" title=\"${escapeHtml(langList)}\">${escapeHtml(langList)}</span>` : ''}\n <span>scanned in <b>${s.tookMs}</b> ms</span>\n </span>`,\n ].filter(Boolean).join('');\n}\n\n// ------------------------------------------------------------------- tour --\n\nfunction showTourStop() {\n const { stops, idx } = state.tour;\n const stop = stops[idx];\n if (!stop) {\n dom.tourTitle.textContent = 'No stops could be picked from this repo.';\n dom.tourCount.textContent = '0 / 0';\n inspector.showOverview(state);\n return;\n }\n dom.tourTitle.textContent = stop.path;\n dom.tourTitle.title = stop.why;\n dom.tourCount.textContent = describeStop(stop, idx, stops.length).count;\n focusFile(stop.path);\n syncInspector();\n renderSidebar();\n}\n\ndom.tourPrev.addEventListener('click', () => {\n if (state.tour.idx > 0) {\n state.tour.idx--;\n renderCanvas();\n showTourStop();\n }\n});\ndom.tourNext.addEventListener('click', () => {\n if (state.tour.idx < state.tour.stops.length - 1) {\n state.tour.idx++;\n renderCanvas();\n showTourStop();\n }\n});\ndom.tourExit.addEventListener('click', () => setView('map'));\n\n// ---------------------------------------------------------- stage actions --\n\ndom.copyMermaidBtn.addEventListener('click', async () => {\n try {\n await navigator.clipboard.writeText(state.currentDiagram.source);\n toast('Mermaid source copied.');\n } catch {\n toast('The clipboard said no.');\n }\n});\n\ndom.svgBtn.addEventListener('click', () => {\n const name = (state.scan?.name || 'codebase') + '-' + state.view + '.svg';\n if (downloadSvg(dom.canvasContent, name)) toast('SVG saved.');\n});\n\ndom.fitBtn.addEventListener('click', () => panzoom.fit());\ndom.searchTriggerBtn.addEventListener('click', () => searchCtl?.show(dom.searchTriggerBtn));\ndocument.addEventListener('search-visibility', () => forceGraphCtl?.setActive(state.view === 'graph' && !searchCtl?.isShowing()));\ndom.graphSearchInput?.addEventListener('input', (e) => forceGraphCtl?.search((e.currentTarget as HTMLInputElement).value));\ndom.graphFit?.addEventListener('click', () => forceGraphCtl?.fit());\n\n// ------------------------------------------------------------- AI explain --\n\ninspector.initInspector({\n onAskAI: askAI,\n onClearFocus: clearFocus,\n // The inspector's \"Code\" button means the Code tab, not the Explorer —\n // openFile would drop the person back on the map they came from.\n onOpenCode: openFileInCode,\n onDeepDive: openDeepDive,\n onToast: toast,\n});\n\n// The About view owns its own rendering; it borrows these three from the shell.\ninitAbout({\n host: dom.aboutView,\n onToast: toast,\n onOpenSettings: openSettings,\n repoOverview,\n});\n\ninitDocs({\n host: dom.docView,\n onToast: toast,\n onOpenSettings: openSettings,\n onOpenFile: openFile,\n repoOverview,\n});\n\ninitCodeTab({\n host: dom.codeView,\n blameGutter: dom.blameGutter,\n onSyncInspector: syncInspector,\n onRenderSidebar: renderSidebar,\n onOpenFile: openFile,\n onDeepDive: openDeepDive,\n onToast: toast,\n getTheme,\n});\n\n// The deep-analysis panel lives in the security view's inspector. It runs the\n// external engines through the server, then merges what they find back into the\n// scan so the grade and the finding list update to include them.\ninitAnalysisPanel({\n host: dom.inspSecurityTools,\n onToast: toast,\n onOpenFile: openFileInCode,\n});\n\n// The full-page Deep Analysis view. Same store, same run, more room: the whole\n// report with file links and an AI explainer.\ninitDeepAnalysis({\n host: dom.analysisView,\n onToast: toast,\n onOpenFile: openFileInCode,\n onOpenSettings: openSettings,\n repoOverview,\n});\n\n// A run started from either surface changes the scan's findings, so whatever\n// panel is on screen has to be told. The merge itself happens in the store.\nsubscribeAnalysis(() => {\n if (state.scan) syncInspector();\n});\n\ninitAiDraft({\n host: dom.aiDrawBtn,\n statusEl: dom.canvasEmpty, // the placeholder doubles as the progress line\n nodeHost: dom.canvasContent,\n onRender: renderCanvas,\n onOpenFile: openFile,\n onOpenSettings: openSettings,\n onToast: toast,\n});\n\ninitAtlas({\n host: dom.canvasContent,\n canvas: dom.canvas,\n onSyncInspector: syncInspector,\n onRender: renderCanvas,\n onHome: () => panzoom.home(),\n});\n\ninitMap({\n host: dom.canvasContent,\n toggleBtn: dom.mmToggleBtn,\n onSyncInspector: syncInspector,\n onRenderSidebar: renderSidebar,\n onOpenFile: openFile,\n onOpenFolder: (folder) => {\n state.folder = folder;\n state.detail = null;\n setView('files');\n },\n onToast: toast,\n onFit: () => requestAnimationFrame(() => panzoom.fit()),\n});\n\nfunction repoOverview() {\n return explainOverview(state.scan, state.facts, state.manifest).replace(/[*`]/g, '');\n}\n\nasync function askAI() {\n if (!llm.isConfigured()) {\n openSettings();\n toast('Add an endpoint and model first.');\n return;\n }\n if (!state.selected) return;\n\n const settings = llm.getSettings();\n const ctx = await gatherFileContext(state.selected);\n const messages = llm.fileMessages({\n repoName: state.scan.name,\n overview: repoOverview(),\n ...ctx,\n });\n\n const writer = inspector.explainStreamWriter();\n try {\n // Reasoning models (like the bundled Nemotron default) think before they\n // write, so the budget needs room for both the thinking and the answer.\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: 1600 })) {\n writer.push(delta);\n }\n writer.finish(`Written by ${settings.model}, from the real source and the import graph.`);\n } catch (err) {\n writer.fail(err.message + ' Check the API key drawer, top right.');\n }\n}\n\n// Free-form questions. The selected file's context rides along when there is\n// one; otherwise the model reasons from the repo overview alone.\nasync function askCustom() {\n const question = dom.askInput.value.trim();\n if (!question) return toast('Type a question first.');\n if (!state.scan) return;\n if (!llm.isConfigured()) {\n openSettings();\n toast('Add an endpoint and model first.');\n return;\n }\n\n const settings = llm.getSettings();\n const file = state.selected ? await gatherFileContext(state.selected) : null;\n const messages = llm.questionMessages({\n repoName: state.scan.name,\n overview: repoOverview(),\n question,\n file,\n });\n\n dom.askBtn.disabled = true;\n dom.askBtn.textContent = '…';\n const writer = inspector.explainStreamWriter(`<p class=\"ask-q\">“${escapeHtml(question)}”</p>`);\n try {\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: 1600 })) {\n writer.push(delta);\n }\n writer.finish(`Answered by ${settings.model}.`);\n } catch (err) {\n writer.fail(err.message + ' Check the API key drawer, top right.');\n } finally {\n dom.askBtn.disabled = false;\n dom.askBtn.textContent = 'Ask';\n }\n}\n\ndom.askBtn.addEventListener('click', askCustom);\ndom.askInput.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') askCustom();\n});\n\n// ---------------------------------------------------------- settings bits --\n\nfunction openSettings() {\n // Same reason the MCP drawer closes settings: one scrim at a time.\n if (!dom.mcpDrawer.hidden) closeMcp();\n serverDrawer.close();\n const s = llm.getSettings();\n dom.setBaseUrl.value = s.baseUrl;\n dom.setApiKey.value = s.apiKey;\n dom.setModel.value = s.model;\n dom.settingsStatus.textContent = '';\n dom.settingsDrawer.hidden = false;\n dom.drawerScrim.hidden = false;\n}\n\nfunction closeSettings() {\n dom.settingsDrawer.hidden = true;\n dom.drawerScrim.hidden = true;\n}\n\ndom.settingsBtn.addEventListener('click', openSettings);\ndom.drawerClose.addEventListener('click', closeSettings);\n\n// ------------------------------------------------------------- server bits --\n\n// The third drawer. Its content and round-trips live in js/serverSettings.js;\n// what stays here is the choreography it shares with the other two drawers —\n// one scrim at a time, Escape to dismiss.\nconst serverDrawer = createServerDrawer({ toast });\n\nfunction openServer() {\n closeSettings();\n if (!dom.mcpDrawer.hidden) closeMcp();\n serverDrawer.open();\n}\n\ndom.serverBtn.addEventListener('click', () => (serverDrawer.isOpen() ? serverDrawer.close() : openServer()));\n\n// ------------------------------------------------------------------- mcp --\n\n// The topbar button, the drawer, and the polling behind them.\n//\n// The shape is deliberately the same as the settings drawer above — one scrim,\n// one panel, a Close button, Escape to dismiss — because the person who learned\n// one has already learned the other. What differs is the content: this panel has\n// a live status, two actions, and a config block, so it polls. Polling continues\n// while closed, slowly, because the dot on the button has to stay truthful when\n// the drawer is not there to explain it.\n\nlet mcpPoll = null;\nlet mcpBusy = false;\nlet mcpCommand = null; // fetched once; the command does not change while it runs\n\n// The dot's three states, and the copy that goes with each. `starting` is\n// separate from `running` because the handshake takes a beat, and claiming\n// success before it is known would be a lie the person acts on.\nfunction mcpDotClass(state) {\n if (state === 'running') return 'is-running';\n if (state === 'starting' || state === 'stopping') return 'is-starting';\n if (state === 'error' || state === 'unavailable') return 'is-error';\n return '';\n}\n\nfunction mcpStateLabel(data) {\n switch (data.state) {\n case 'running': return `Running · ${data.toolCount} tools`;\n case 'starting': return 'Starting…';\n case 'stopping': return 'Stopping…';\n case 'error': return 'Failed to start';\n case 'unavailable': return 'Not available';\n default: return 'Stopped';\n }\n}\n\nfunction formatUptime(ms) {\n if (!ms && ms !== 0) return '0s';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${s % 60}s`;\n return `${Math.floor(m / 60)}h ${m % 60}m`;\n}\n\nfunction renderMcpStatus(data) {\n if (!data) {\n // No server answered. The button is still there — it always is — but it says\n // so rather than showing a confident \"stopped\" for a process we cannot see.\n dom.mcpDot.className = 'mcp-dot is-error';\n dom.mcpBtnLabel.textContent = 'MCP';\n dom.mcpPanelDot.className = 'mcp-dot mcp-dot-lg is-error';\n dom.mcpPanelState.textContent = 'The server did not answer.';\n dom.mcpStart.disabled = true;\n dom.mcpStop.disabled = true;\n dom.mcpStatus.textContent = 'Is the Onboarder server running?';\n return;\n }\n\n const cls = mcpDotClass(data.state);\n dom.mcpDot.className = 'mcp-dot ' + cls;\n dom.mcpPanelDot.className = 'mcp-dot mcp-dot-lg ' + cls;\n dom.mcpBtnLabel.textContent = data.running ? 'MCP on' : 'MCP';\n dom.mcpBtn.title = data.running\n ? `MCP server running · ${data.toolCount} tools · pid ${data.pid}`\n : 'Start the MCP server so AI agents can read this repository';\n dom.mcpPanelState.textContent = mcpStateLabel(data);\n\n // Both buttons stay visible and swap roles through `disabled`, so the panel\n // does not reflow as the state changes underneath it.\n const busy = data.state === 'starting' || data.state === 'stopping';\n dom.mcpStart.disabled = busy || data.state === 'unavailable' || data.running;\n dom.mcpStop.disabled = busy || data.state === 'unavailable' || !data.running;\n\n const bits = [];\n if (data.running) {\n bits.push(`pid ${data.pid}`);\n bits.push(`up ${formatUptime(data.uptimeMs)}`);\n }\n if (data.lastError) bits.push(data.lastError);\n dom.mcpStatus.textContent = bits.join(' · ');\n\n // The config only appears once there is a server to configure against. Shown\n // earlier, it would be a command for a process that is not running.\n dom.mcpConfig.hidden = !data.running;\n if (data.running) {\n dom.mcpToolsHint.textContent = `${data.toolCount} tools: ${(data.tools || []).join(', ')}`;\n }\n}\n\nfunction scheduleMcpPoll(ms) {\n clearTimeout(mcpPoll);\n mcpPoll = setTimeout(pollMcp, ms);\n}\n\nasync function pollMcp() {\n renderMcpStatus(await fetchMcpStatus());\n // Closed: a slow heartbeat, so the dot is right when the person comes back\n // without the tab asking the server anything it does not need to answer.\n scheduleMcpPoll(dom.mcpDrawer.hidden ? 8000 : 2500);\n}\n\nasync function loadMcpCommand() {\n if (mcpCommand) return mcpCommand;\n mcpCommand = await fetchMcpCommand();\n if (mcpCommand) {\n dom.mcpCommandInput.value = mcpCommand.command;\n renderMcpConfigBlock();\n }\n return mcpCommand;\n}\n\nasync function openMcp() {\n // Two drawers over one page would stack their scrims, and the top one would win\n // every click. Closing settings first keeps the invariant the Escape handler\n // assumes, and matches what the person was doing — switching panels.\n closeSettings();\n serverDrawer.close();\n dom.mcpDrawer.hidden = false;\n dom.mcpScrim.hidden = false;\n await pollMcp();\n await loadMcpCommand();\n scheduleMcpPoll(2500);\n}\n\nfunction closeMcp() {\n dom.mcpDrawer.hidden = true;\n dom.mcpScrim.hidden = true;\n scheduleMcpPoll(8000);\n}\n\n// The two config shapes a client is most likely to want: JSON for the harnesses\n// that read a config file, TOML for the ones that do not. Both are built from\n// what the server reported, so neither can drift from the command that actually\n// starts it.\nfunction renderMcpConfigBlock() {\n const ex = mcpCommand?.examples?.[0];\n if (!ex) return;\n const command = shortCommand(ex.command);\n const json = { mcpServers: { onboarder: { command, args: ex.args } } };\n const toml = [\n '[mcp_servers.onboarder]',\n `command = ${JSON.stringify(command)}`,\n `args = [${ex.args.map((a) => JSON.stringify(a)).join(', ')}]`,\n ].join('\\n');\n dom.mcpConfigBlock.textContent = dom.mcpTabToml.classList.contains('is-on')\n ? toml\n : JSON.stringify(json, null, 2);\n}\n\n// The server reports its own `process.execPath` so the config works even where\n// the harness's PATH has no node. But an absolute path is noise in a snippet\n// people read, so the common case is shown short and the input above keeps the\n// exact one.\nfunction shortCommand(cmd) {\n return typeof cmd === 'string' && cmd.endsWith('/node') ? 'node' : cmd;\n}\n\nfunction pickMcpTab(toml) {\n dom.mcpTabJson.classList.toggle('is-on', !toml);\n dom.mcpTabToml.classList.toggle('is-on', toml);\n dom.mcpTabJson.setAttribute('aria-selected', String(!toml));\n dom.mcpTabToml.setAttribute('aria-selected', String(toml));\n renderMcpConfigBlock();\n}\n\ndom.mcpTabJson.addEventListener('click', () => pickMcpTab(false));\ndom.mcpTabToml.addEventListener('click', () => pickMcpTab(true));\ndom.mcpBtn.addEventListener('click', () => (dom.mcpDrawer.hidden ? openMcp() : closeMcp()));\ndom.mcpClose.addEventListener('click', closeMcp);\ndom.mcpScrim.addEventListener('click', closeMcp);\n\ndom.mcpCopy.addEventListener('click', async () => {\n try {\n await navigator.clipboard.writeText(dom.mcpConfigBlock.textContent);\n toast('Config copied');\n } catch {\n // Clipboard access can be refused outright; selecting the text is the one\n // fallback that always works, so the person can copy it themselves.\n dom.mcpCommandInput.select();\n }\n});\n\nasync function setMcpState(action) {\n if (mcpBusy) return;\n mcpBusy = true;\n // Optimistic: the dot goes amber immediately rather than after a round-trip\n // during which the button would still read \"stopped\" and invite a second click.\n renderMcpStatus({ state: action === 'start' ? 'starting' : 'stopping', running: action === 'stop', toolCount: 0, tools: [] });\n try {\n const data = action === 'start' ? await startMcpServer() : await stopMcpServer();\n renderMcpStatus(data);\n if (action === 'start') await loadMcpCommand();\n } catch (err) {\n renderMcpStatus({ state: 'error', running: action === 'stop', lastError: err.message, tools: [] });\n toast(err.message);\n } finally {\n mcpBusy = false;\n scheduleMcpPoll(1500);\n }\n}\n\ndom.mcpStart.addEventListener('click', () => setMcpState('start'));\ndom.mcpStop.addEventListener('click', () => setMcpState('stop'));\n\n// One heartbeat at load. This first fetch is also what decides whether the button\n// already reads \"MCP on\" for a server that was left running from before.\nscheduleMcpPoll(0);\n\n\ndom.drawerScrim.addEventListener('click', closeSettings);\n\ndom.saveSettings.addEventListener('click', () => {\n llm.saveSettings({ baseUrl: dom.setBaseUrl.value, apiKey: dom.setApiKey.value, model: dom.setModel.value });\n dom.settingsStatus.className = 'drawer-status ok';\n dom.settingsStatus.textContent = 'Saved in this browser.';\n});\n\ndom.testSettings.addEventListener('click', async () => {\n const settings = {\n baseUrl: dom.setBaseUrl.value.trim().replace(/\\/+$/, ''),\n apiKey: dom.setApiKey.value,\n model: dom.setModel.value.trim(),\n };\n if (!settings.baseUrl || !settings.model) {\n dom.settingsStatus.className = 'drawer-status err';\n dom.settingsStatus.textContent = 'Base URL and model are both needed.';\n return;\n }\n dom.settingsStatus.className = 'drawer-status';\n dom.settingsStatus.textContent = 'Asking the endpoint…';\n try {\n let heard = '';\n for await (const delta of streamExplain({\n ...settings,\n maxTokens: 64,\n messages: [{ role: 'user', content: 'Reply with the single word: ready' }],\n })) {\n heard += delta;\n }\n dom.settingsStatus.className = 'drawer-status ok';\n dom.settingsStatus.textContent = heard\n ? `Connected — ${settings.model} answered.`\n : `Connected. It answered with silence, but that is a thinking model spending its whole token budget on thought — explanations use a bigger one.`;\n } catch (err) {\n dom.settingsStatus.className = 'drawer-status err';\n dom.settingsStatus.textContent = err.message;\n }\n});\n\n// ------------------------------------------------------------------- misc --\n\nlet toastTimer = null;\nfunction toast(message) {\n dom.toast.textContent = message;\n dom.toast.hidden = false;\n clearTimeout(toastTimer);\n toastTimer = setTimeout(() => (dom.toast.hidden = true), 2600);\n}\n\ndocument.addEventListener('keydown', (event) => {\n if (eventElement(event)?.matches('input, textarea, select')) return;\n // Escape closes whichever drawer is open. The three are kept mutually\n // exclusive when they open, so at most one is ever showing — but checking\n // each here means the behavior does not depend on that invariant holding.\n if (event.key === 'Escape') {\n if (!dom.mcpDrawer.hidden) return closeMcp();\n if (serverDrawer.isOpen()) return serverDrawer.close();\n return closeSettings();\n }\n if (!state.scan) return;\n if (event.key === '1') setView(state.lastExplorer || 'map');\n if (event.key === '2') setView('code');\n if (event.key === '3') setView('docs');\n if (event.key === '4') setView('about');\n if (event.key === '/') {\n event.preventDefault();\n dom.treeFilter.focus();\n }\n if (state.view === 'tour') {\n if (event.key === ']') dom.tourNext.click();\n if (event.key === '[') dom.tourPrev.click();\n }\n});\n\n// ------------------------------------------------------------------ theme --\n\nconst THEME_KEY = 'onboarder.theme';\n\nfunction getTheme() {\n const saved = localStorage.getItem(THEME_KEY);\n if (saved === 'dark' || saved === 'light') return saved;\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n}\n\nfunction applyTheme(theme) {\n document.documentElement.dataset.theme = theme;\n setDiagramTheme(theme);\n setViewerTheme(theme);\n dom.themeBtn.textContent = theme === 'dark' ? 'Light' : 'Dark';\n dom.themeBtn.title = theme === 'dark' ? 'Switch to the light theme' : 'Switch to the dark theme';\n}\n\ndom.themeBtn.addEventListener('click', () => {\n const next = getTheme() === 'dark' ? 'light' : 'dark';\n localStorage.setItem(THEME_KEY, next);\n applyTheme(next);\n if (state.scan && (isExplorerView(state.view) || state.view === 'graph' || state.view === 'heatmap')) renderCanvas(); // Only canvas/diagram views need a theme redraw.\n});\n\napplyTheme(getTheme());\n"]}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/public/app.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ScanProgress } from '../shared/contracts.js';\nimport { abortable, throwIfAborted } from '/shared/analyzer/scanControl.js';\nimport { eventElement } from '/js/dom.js';\nimport type { AppElements } from '/js/dom.js';\n// Onboarder — bootstrap, routing, and wiring.\n//\n// Two ways a repo arrives here:\n// 1. The server scans it (local path, git URL, or this app's own source)\n// and hands back { scan, facts, manifest } as JSON.\n// 2. The user picks a folder and the exact same analyzer runs in this tab.\n// After that everything is one code path over plain data.\n//\n// What is left in this file is the part that has to know about everything else:\n// the landing page, `setView`/`renderCanvas` deciding what the stage shows, and\n// `syncInspector` keeping the side panel agreeing with it. Each view that is more\n// than a diagram call lives in its own module under js/ — mapView, atlas, docsView,\n// codeTab, about, aiDraft — and is handed its host element and a set of callbacks\n// here. The callbacks are the reason the module graph stays acyclic: a feature\n// module never imports back into app.js.\n\nimport { scanRepo } from '/shared/analyzer/scan.js';\nimport { computeFacts, scanIndex } from '/shared/analyzer/graph.js';\nimport { analyzeStack } from '/shared/analyzer/stack.js';\nimport { detectManifest } from '/shared/analyzer/services.js';\nimport { computeLayers, detectPatterns, couplingMatrix } from '/shared/analyzer/patterns.js';\nimport { explainOverview } from '/shared/analyzer/explainLocal.js';\nimport { dirOf, pathFilter } from '/shared/analyzer/pathUtil.js';\nimport {\n overviewDiagram, folderDiagram, fileDetailDiagram, servicesDiagram, emptyDiagram,\n layersDiagram, healthDiagram, securityDiagram, historyDiagram, setDiagramTheme, diagramThemeBlock,\n} from '/shared/diagram/mermaid.js';\nimport { analyzeHealth } from '/shared/analyzer/health.js';\nimport { summarizeSecurity } from '/shared/analyzer/security.js';\nimport { escapeHtml } from '/js/html.js';\nimport {\n scanOnServer, cleanupClone, streamExplain,\n fetchMcpStatus, startMcpServer, stopMcpServer, fetchMcpCommand, fetchHermesStatus,\n} from '/js/api.js';\nimport { canPickFolder, pickDirectory, browserFileSource } from '/js/fileSourceBrowser.js';\nimport { renderInto, validateDiagram, wireNodeClicks, makePanzoom, downloadSvg } from '/js/diagramPane.js';\nimport { setViewerTheme } from '/js/codeViewer.js';\nimport * as llm from '/js/llm.js';\nimport { buildTree, renderTree, resetOpenState, expandedToDepth } from '/js/tree.js';\nimport { initMap, renderMap } from '/js/mapView.js';\nimport { gatherFileContext } from '/js/repoFiles.js';\nimport * as inspector from '/js/inspector.js';\nimport { buildTourStops, describeStop } from '/js/tour.js';\nimport { initAbout, renderAbout } from '/js/about.js';\nimport { initDocs, renderDocs } from '/js/docsView.js';\nimport { initCodeTab, renderCode, revealLineInCode } from '/js/codeTab.js';\nimport { initAnalysisPanel, renderAnalysisPanel, subscribeAnalysis } from '/js/analysisPanel.js';\nimport { initDeepAnalysis, renderDeepAnalysis } from '/js/deepAnalysisView.js';\nimport { initAiDraft, updateAiBtn, wireAIClicks, stopAiDraft } from '/js/aiDraft.js';\nimport { initAtlas, renderAtlasList, openCardDiagram } from '/js/atlas.js';\nimport { initForceGraph } from '/js/forceGraph.js';\nimport { initHeatmap } from '/js/heatmap.js';\nimport { initSearch } from '/js/search.js';\nimport { withTransition } from '/js/transitions.js';\nimport { renderInsights } from '/js/insightsView.js';\nimport { createServerDrawer } from '/js/serverSettings.js';\nimport { renderDiffView, stopDiff } from '/js/diffView.js';\nimport { renderReviewView, stopReview } from '/js/reviewView.js';\nimport { renderWorkflows } from '/js/workflowsView.js';\nimport { renderSbom } from '/js/sbomView.js';\nimport { initMobilePanels } from '/js/mobilePanels.js';\nimport {\n state as appState, isExplorerView, loadRepo, unloadRepo,\n focusFile, focusFolder, clearFocus as clearFocusState, inspectorSubject, aiViewKey,\n} from '/js/state.js';\n\nconst $ = (id) => document.getElementById(id);\n\nconst dom: Partial<AppElements> = {};\n[\n 'landing', 'landingError', 'landingStatus', 'cancelScanBtn', 'scanProgress', 'pathForm', 'pathInput', 'gitForm', 'gitInput',\n 'pickBtn', 'demoBtn', 'explorer', 'viewTabs', 'repoChip', 'newRepoBtn', 'settingsBtn',\n 'landingAbout', 'creditsHide', 'creditsRemove', 'creditsBar', 'creditsShow', 'creditsBarRemove',\n 'treeFilter', 'fileTree', 'crumbs', 'copyMermaidBtn', 'svgBtn', 'fitBtn',\n 'canvas', 'canvasContent', 'canvasEmpty', 'stageFoot', 'themeBtn', 'aiDrawBtn', 'docView', 'aboutView', 'codeView',\n 'mmToggleBtn', 'stageFilters', 'modeSwitch', 'nodeFilter', 'testsToggle', 'depthSelect',\n 'tourbar', 'tourTitle', 'tourCount', 'tourPrev', 'tourNext', 'tourExit',\n 'drawerScrim', 'settingsDrawer', 'drawerClose', 'setBaseUrl', 'setApiKey', 'setModel',\n 'saveSettings', 'testSettings', 'settingsStatus', 'toast', 'brandNote', 'askBtn', 'askInput',\n 'setConnection', 'apiConnection', 'hermesConnection', 'hermesConnectionStatus', 'hermesModel', 'hermesProvider', 'refreshHermes', 'aiConnectionNote',\n 'graphView', 'graphCanvas', 'graphControls', 'graphReset', 'graphZoomIn', 'graphZoomOut', 'graphFit', 'graphSearchInput', 'graphTooltip',\n 'heatmapView', 'heatmapCanvas', 'heatmapTooltip', 'blameGutter', 'codeTabContainer',\n 'insightsView', 'diffView', 'reviewView', 'workflowsView', 'sbomView', 'searchTriggerBtn', 'inspSecurityTools', 'analysisView',\n 'mcpBtn', 'mcpBtnLabel', 'mcpDot', 'mcpDrawer', 'mcpScrim', 'mcpClose', 'mcpPanelDot', 'mcpPanelState',\n 'mcpStart', 'mcpStop', 'mcpStatus', 'mcpConfig', 'mcpCommandInput', 'mcpCopy', 'mcpTabJson', 'mcpTabToml',\n 'mcpConfigBlock', 'mcpToolsHint', 'serverBtn',\n].forEach((id) => (dom[id] = $(id)));\n\nlet forceGraphCtl = null;\nlet graphScan = null;\nlet graphHealth = null;\nlet heatmapCtl = null;\nlet searchCtl = null;\n\nconst state = appState;\n\nconst panzoom = makePanzoom(dom.canvas, dom.canvasContent);\nconst mobilePanels = initMobilePanels();\n\n// ---------------------------------------------------------------- landing --\n\nlet activeScan: AbortController | null = null;\n\nfunction landingBusy(message) {\n dom.landingError.hidden = true;\n dom.landing.setAttribute('aria-busy', 'true');\n dom.landingStatus.textContent = message;\n dom.landingStatus.hidden = false;\n for (const btn of dom.landing.querySelectorAll('button')) btn.disabled = true;\n dom.cancelScanBtn.hidden = false;\n dom.cancelScanBtn.disabled = false;\n dom.scanProgress.hidden = false;\n dom.scanProgress.removeAttribute('value');\n}\n\nfunction landingIdle(error?: any) {\n dom.landingStatus.hidden = true;\n dom.cancelScanBtn.hidden = true;\n dom.scanProgress.hidden = true;\n dom.landing.removeAttribute('aria-busy');\n for (const btn of dom.landing.querySelectorAll('button')) btn.disabled = false;\n dom.pickBtn.disabled = !canPickFolder();\n if (error) {\n dom.landingError.textContent = error;\n dom.landingError.hidden = false;\n }\n}\n\nfunction beginScan(message: string): AbortController {\n activeScan?.abort();\n const controller = new AbortController();\n activeScan = controller;\n landingBusy(message);\n return controller;\n}\n\nfunction updateScanProgress(progress: ScanProgress): void {\n if (progress.phase === 'walk') dom.landingStatus.textContent = `Walking the file tree… ${progress.found} files`;\n if (progress.phase === 'parse' || progress.phase === 'resolve') {\n dom.landingStatus.textContent = `${progress.phase === 'parse' ? 'Reading code' : 'Tracing imports'}… ${progress.done} / ${progress.total} files`;\n dom.scanProgress.max = Math.max(1, progress.total);\n dom.scanProgress.value = progress.done;\n }\n}\n\ndom.cancelScanBtn.addEventListener('click', () => {\n activeScan?.abort();\n activeScan = null;\n landingIdle();\n dom.landingStatus.hidden = false;\n dom.landingStatus.textContent = 'Scan cancelled. Choose a repository when you’re ready.';\n});\n\nasync function loadFromServer(payload, busyText) {\n const controller = beginScan(busyText);\n try {\n const result = await scanOnServer(payload, { signal: controller.signal });\n if (activeScan !== controller) return;\n enterExplorer(result, {});\n } catch (err) {\n if (activeScan === controller) landingIdle(err.message);\n } finally {\n if (activeScan === controller) activeScan = null;\n }\n}\n\ndom.pathForm.addEventListener('submit', (event) => {\n event.preventDefault();\n const path = dom.pathInput.value.trim();\n if (!path) return landingIdle('Give me a path first — something like ~/work/that-repo.');\n loadFromServer({ path }, 'Walking the file tree…');\n});\n\ndom.gitForm.addEventListener('submit', (event) => {\n event.preventDefault();\n const gitUrl = dom.gitInput.value.trim();\n if (!gitUrl) return landingIdle('Paste a git URL first.');\n loadFromServer({ gitUrl }, 'Cloning, then scanning. Big repos take a minute…');\n});\n\ndom.demoBtn.addEventListener('click', () => {\n loadFromServer({ demo: true }, 'Reading our own source…');\n});\n\n// The landing credits card can be tucked away or permanently removed; the choice sticks.\nconst CREDITS_KEY = 'onboarder.credits';\nfunction applyCreditsVisibility() {\n const status = localStorage.getItem(CREDITS_KEY);\n if (status === 'removed') {\n dom.landingAbout?.remove();\n dom.creditsBar?.remove();\n return;\n }\n const hidden = status === 'hidden';\n if (dom.landingAbout) dom.landingAbout.hidden = hidden;\n if (dom.creditsBar) dom.creditsBar.hidden = !hidden;\n}\n\nfunction removeCreditsPermanently() {\n localStorage.setItem(CREDITS_KEY, 'removed');\n applyCreditsVisibility();\n}\n\ndom.creditsHide?.addEventListener('click', () => {\n localStorage.setItem(CREDITS_KEY, 'hidden');\n applyCreditsVisibility();\n});\ndom.creditsShow?.addEventListener('click', () => {\n localStorage.setItem(CREDITS_KEY, 'shown');\n applyCreditsVisibility();\n});\ndom.creditsRemove?.addEventListener('click', removeCreditsPermanently);\ndom.creditsBarRemove?.addEventListener('click', removeCreditsPermanently);\n\napplyCreditsVisibility();\n\ndom.pickBtn.addEventListener('click', async () => {\n if (!canPickFolder()) {\n return landingIdle('This browser can’t pick folders. Chrome or Edge can; the other two options work anywhere.');\n }\n let handle;\n try {\n handle = await pickDirectory();\n } catch {\n return; // the picker was dismissed — no news is good news\n }\n const controller = beginScan('Walking the file tree…');\n try {\n const source = browserFileSource(handle);\n const scan = await scanRepo(source, {\n signal: controller.signal,\n onProgress: updateScanProgress,\n });\n dom.landingStatus.textContent = 'Counting connections…';\n const manifest = await abortable(detectManifest(source), controller.signal);\n throwIfAborted(controller.signal);\n if (activeScan !== controller) return;\n const facts = computeFacts(scan, manifest);\n enterExplorer({ scan, facts, manifest }, { browserSource: source });\n } catch (err) {\n if (activeScan === controller) landingIdle(err.message);\n } finally {\n if (activeScan === controller) activeScan = null;\n }\n});\n\nif (!canPickFolder()) {\n dom.pickBtn.disabled = true;\n dom.pickBtn.title = 'Folder picking needs Chrome or Edge.';\n}\n\n// -------------------------------------------------------------- explorer --\n\nfunction enterExplorer(payload, opts) {\n stopAiDraft();\n loadRepo(payload, {\n browserSource: opts.browserSource || null,\n history: payload.history || null, // computed server-side; null for browser picks\n });\n state.stack = analyzeStack(state.manifest, state.scan.stats.languages);\n\n resetOpenState();\n state.treeData = buildTree(state.scan.allFiles);\n state.patterns = buildPatterns(state.scan, state.facts, state.manifest);\n state.health = analyzeHealth(state.scan, state.facts);\n state.security = summarizeSecurity(state.scan);\n dom.nodeFilter.value = '';\n dom.testsToggle.classList.add('is-on');\n dom.depthSelect.value = '0';\n\n if (searchCtl) {\n searchCtl.updateFiles(state.scan.files, state.scanId);\n searchCtl.hide();\n } else {\n searchCtl = initSearch(state.scan.files, { getScanId: () => state.scanId });\n }\n\n // Compute everything first, then flip the UI over — a failure here should\n // land on the landing page with the error visible, not a half-dead explorer.\n landingIdle();\n dom.landing.hidden = true;\n dom.explorer.hidden = false;\n dom.viewTabs.hidden = false;\n dom.repoChip.hidden = false;\n dom.newRepoBtn.hidden = false;\n dom.searchTriggerBtn.hidden = false;\n dom.repoChip.innerHTML =\n `<span class=\"repo-name\">${escapeHtml(state.scan.name)}</span>` +\n `<span class=\"repo-sub\">${escapeHtml(repoSubLabel())}</span>`;\n dom.repoChip.title = state.scan.root;\n dom.brandNote.textContent = state.scan.stats.filesParsed + ' files · ' + state.scan.stats.edgeCount + ' connections';\n\n renderSidebar();\n setView(state.scanId ? 'review' : 'map');\n}\n\n// The big name is the repo's own; the small line says where it actually lives.\nfunction repoSubLabel() {\n if (state.scan.tempId) return state.scan.tempId + ' · temp clone';\n if (state.browserSource) return 'picked in the browser';\n return state.scan.root;\n}\n\nfunction buildPatterns(scan, facts, manifest) {\n const layersInfo = computeLayers(scan, facts);\n return {\n layersInfo,\n findings: detectPatterns(scan, facts, manifest, layersInfo),\n coupling: couplingMatrix(scan, facts),\n };\n}\n\ndom.newRepoBtn.addEventListener('click', () => {\n stopAiDraft();\n stopReview();\n stopDiff();\n mobilePanels.close();\n if (state.cloneId) cleanupClone(state.cloneId);\n // The graph and heatmap views attach `window` resize listeners when\n // they initialize. The view tab is unmounted by hiding the container,\n // not by removing the listener, so without this call every new repo\n // would attach another listener to the same global and the page would\n // fan out work on every resize. Destroy tears them down before the\n // next `init*` rebuilds them for a new repo.\n if (forceGraphCtl) { forceGraphCtl.destroy(); forceGraphCtl = null; }\n if (heatmapCtl) { heatmapCtl.destroy(); heatmapCtl = null; }\n graphScan = null; graphHealth = null;\n unloadRepo();\n dom.explorer.hidden = true;\n dom.tourbar.hidden = true;\n dom.viewTabs.hidden = true;\n dom.repoChip.hidden = true;\n dom.newRepoBtn.hidden = true;\n dom.brandNote.textContent = 'a map for any codebase';\n dom.landing.hidden = false;\n landingIdle();\n});\n\nfunction renderSidebar() {\n renderTree(dom.fileTree, state.treeData, {\n facts: state.facts,\n filter: dom.treeFilter.value,\n selected: state.selected,\n parsedPaths: state.scan.files.map((f) => f.path),\n onFile: openFile,\n onFolder: (folder) => {\n focusFolder(folder);\n state.folder = folder;\n state.detail = null;\n if (state.view === 'files') renderCanvas();\n syncInspector();\n },\n });\n}\n\nlet sidebarFrame: number | null = null;\ndom.treeFilter.addEventListener('input', () => {\n if (sidebarFrame !== null) cancelAnimationFrame(sidebarFrame);\n sidebarFrame = requestAnimationFrame(() => { sidebarFrame = null; if (state.scan) renderSidebar(); });\n});\n\n// ------------------------------------------------------------------ views --\n\ndom.viewTabs.addEventListener('click', (event) => {\n const tab = eventElement(event)?.closest<HTMLElement>('.view-tab');\n if (!tab) return;\n const view = tab.dataset.view === 'explorer' ? state.lastExplorer || 'map' : tab.dataset.view;\n if (state.view === view) return;\n withTransition(() => setView(view));\n});\n\n// The inspector's single source of truth. Whatever is focused — a file, a\n// folder — is shown in every tab; with nothing focused, each view shows its\n// own default panel. Every selection path funnels here, so the panel is\n// always in step with the canvas, tree, code and docs. Which subject that is\n// comes from `inspectorSubject` in state.js, which is pure and tested; this\n// function only does the showing.\nfunction syncInspector() {\n const subject = inspectorSubject(state);\n const opts = { ...state, backLabel: subject.backLabel };\n switch (subject.kind) {\n case 'file': return inspector.showFile(subject.path, opts);\n case 'folder': return inspector.showFolder(subject.path, opts);\n case 'patterns': return inspector.showPatterns(state);\n case 'health': return inspector.showHealth(state);\n case 'security': return inspector.showSecurity(state);\n case 'history': return inspector.showHistory(state);\n default: return inspector.showOverview(state);\n }\n}\n\nfunction clearFocus() {\n clearFocusState();\n syncInspector();\n}\n\nfunction setView(view) {\n if (view !== 'review') stopReview();\n if (view !== 'diff') stopDiff();\n dom.explorer.classList.toggle('review-workspace', view === 'review');\n state.view = view;\n if (isExplorerView(view)) state.lastExplorer = view;\n for (const tab of dom.viewTabs.querySelectorAll<HTMLElement>('.view-tab')) {\n tab.classList.toggle(\n 'is-active',\n tab.dataset.view === view || (tab.dataset.view === 'explorer' && isExplorerView(view))\n );\n }\n for (const chip of dom.modeSwitch.querySelectorAll<HTMLElement>('.mode-chip')) {\n chip.classList.toggle('is-active', chip.dataset.mode === view);\n }\n dom.tourbar.hidden = view !== 'tour';\n\n if (view === 'tour') {\n state.tour.stops = buildTourStops(state.scan, state.facts);\n state.tour.idx = 0;\n state.selected = null; // the tour drives its own focus\n }\n\n for (const tab of dom.viewTabs.querySelectorAll<HTMLElement>('.view-tab')) tab.setAttribute('aria-current', tab.classList.contains('is-active') ? 'page' : 'false');\n renderCanvas();\n\n if (view === 'tour') showTourStop();\n else syncInspector();\n}\n\nfunction openFile(path) {\n focusFile(path);\n state.code.path = path; // the Code tab follows the current file\n if (state.view !== 'files' && state.view !== 'tour' && state.view !== 'code') {\n state.folder = dirOf(path);\n setView('files');\n return;\n }\n if (state.view === 'files') {\n state.folder = dirOf(path);\n state.detail = path;\n renderCanvas();\n }\n if (state.view === 'code') renderCode();\n syncInspector();\n renderSidebar();\n}\n\n// The Code tab, optionally at a line. Search results for symbols and content\n// hits come through here: the scan already knows where a symbol was declared and\n// where a phrase matched, so opening the file at line 1 would throw away the\n// only part of the answer the person did not already know.\nfunction openFileInCode(path, line) {\n focusFile(path);\n state.code.path = path;\n if (line) revealLineInCode(line);\n setView('code');\n}\n\nfunction openDeepDive(path) {\n focusFile(path);\n state.folder = dirOf(path);\n state.detail = path;\n setView('files');\n}\n\nfunction onNodeClick(payload) {\n if (payload.kind === 'folder') {\n state.folder = payload.path;\n state.detail = null;\n focusFolder(payload.path);\n setView('files');\n } else if (payload.kind === 'file') {\n openFile(payload.path);\n }\n}\n\ninspector.onInspectorNavigate(openFile);\n\ndocument.addEventListener('search-select', (event) => {\n const detail = (event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail || {};\n if (!detail.path) return;\n // The palette says where a result belongs. A file's home is the graph; a\n // symbol or a content hit belongs in the Code tab, at its line.\n if (detail.target === 'code') return openFileInCode(detail.path, detail.line);\n return openFile(detail.path);\n});\n\ndocument.addEventListener('file-select', (event) => {\n if ((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail?.path) openFile((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail.path);\n});\n\ndocument.addEventListener('graph-node-click', (event) => {\n if ((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail?.path) openFile((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail.path);\n});\n\ndocument.addEventListener('heatmap-node-click', (event) => {\n if ((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail?.path) openFile((event as CustomEvent<{ path?: string; target?: string; line?: number }>).detail.path);\n});\n\nasync function renderCanvas() {\n updateAiBtn();\n const isDocs = state.view === 'docs';\n const isAbout = state.view === 'about';\n const isCode = state.view === 'code';\n const isGraph = state.view === 'graph';\n const isHeatmap = state.view === 'heatmap';\n const isInsights = state.view === 'insights';\n const isDiff = state.view === 'diff';\n const isReview = state.view === 'review';\n const isWorkflows = state.view === 'workflows';\n const isSbom = state.view === 'sbom';\n const isAnalysis = state.view === 'analysis';\n const isPage = isDocs || isAbout || isCode || isGraph || isHeatmap || isInsights || isDiff || isReview || isWorkflows || isSbom || isAnalysis;\n forceGraphCtl?.setActive(isGraph && !searchCtl?.isShowing());\n const isAtlasList = state.view === 'atlas' && !state.atlasOpen;\n \n dom.canvas.hidden = isPage;\n dom.docView.hidden = !isDocs;\n dom.aboutView.hidden = !isAbout;\n dom.codeView.hidden = !isCode;\n if (dom.codeTabContainer) dom.codeTabContainer.hidden = !isCode;\n if (dom.graphView) dom.graphView.hidden = !isGraph;\n if (dom.heatmapView) dom.heatmapView.hidden = !isHeatmap;\n if (dom.insightsView) dom.insightsView.hidden = !isInsights;\n if (dom.diffView) dom.diffView.hidden = !isDiff;\n if (dom.reviewView) dom.reviewView.hidden = !isReview;\n if (dom.workflowsView) dom.workflowsView.hidden = !isWorkflows;\n if (dom.sbomView) dom.sbomView.hidden = !isSbom;\n if (dom.analysisView) dom.analysisView.hidden = !isAnalysis;\n \n dom.copyMermaidBtn.hidden = isPage || isAtlasList;\n dom.svgBtn.hidden = isPage;\n dom.fitBtn.hidden = isPage || isAtlasList;\n dom.stageFilters.hidden = isPage;\n dom.mmToggleBtn.hidden = isPage || state.view !== 'map';\n if (!isAtlasList) dom.canvasContent.classList.remove('atlas-mode');\n\n if (isPage) {\n dom.aiDrawBtn.hidden = true;\n if (isDocs) renderDocs();\n else if (isCode) renderCode();\n else if (isAbout) renderAbout();\n else if (isInsights) renderInsights(dom.insightsView, state);\n else if (isDiff) renderDiffView(dom.diffView, state);\n else if (isReview) renderReviewView(dom.reviewView, state);\n else if (isWorkflows) renderWorkflows(dom.workflowsView, state);\n else if (isSbom) renderSbom(dom.sbomView, state);\n else if (isAnalysis) renderDeepAnalysis(dom.analysisView, state);\n \n if (isGraph) {\n if (!forceGraphCtl) forceGraphCtl = initForceGraph(dom.graphCanvas);\n forceGraphCtl.setActive(!searchCtl?.isShowing());\n if (graphScan !== state.scan || graphHealth !== state.health) {\n const edges = state.scan.edges || [];\n const facts = state.facts || {};\n const healthMap = new Map<string, { risk: number; complexity?: number }>((state.health?.perFile || []).map(h => [h.path, h]));\n const nodes = state.scan.files.map(f => {\n const h = healthMap.get(f.path);\n return {\n path: f.path,\n fanIn: facts.fanIn?.[f.path] || 0,\n fanOut: facts.fanOut?.[f.path] || 0,\n community: facts.communities?.[f.path] || 0,\n risk: h?.risk || 0,\n complexity: h?.complexity || f.cognitive || 0,\n lang: f.lang || 'unknown',\n };\n });\n forceGraphCtl.update(nodes, edges, facts.communities || {});\n graphScan = state.scan; graphHealth = state.health;\n }\n forceGraphCtl.resize();\n }\n \n if (isHeatmap) {\n const healthByPath = new Map<string, { risk: number }>((state.health?.perFile || []).map(f => [f.path, f]));\n const heatFiles = state.scan.files.map(f => ({\n path: f.path,\n risk: healthByPath.get(f.path)?.risk || 0,\n loc: f.size\n }));\n if (!heatmapCtl) heatmapCtl = initHeatmap(dom.heatmapCanvas, heatFiles);\n else heatmapCtl.update(heatFiles);\n }\n\n renderCrumbs();\n renderFoot();\n return;\n }\n\n const { scan, facts, manifest } = state;\n const key = aiViewKey();\n updateAiBtn(key);\n\n // Tree-map furniture only belongs to the Map; SVG export can't take cells.\n const showingSketch = state.aiActiveKey === key && Boolean(state.aiDiagrams[key]);\n dom.svgBtn.hidden = isPage || isAtlasList || (state.view === 'map' && !showingSketch);\n dom.mmToggleBtn.hidden = state.view !== 'map' || showingSketch;\n const filterable = ['map', 'files', 'patterns'].includes(state.view);\n dom.nodeFilter.hidden = showingSketch || (!filterable && state.view !== 'atlas');\n dom.testsToggle.hidden = showingSketch || (!filterable && state.view !== 'atlas');\n dom.depthSelect.hidden = showingSketch || state.view !== 'map';\n if (state.view === 'map' && !showingSketch) {\n // Copy Mermaid still hands over the classic folder overview.\n state.currentDiagram = { source: overviewDiagram(scan, facts).source, nodes: {} };\n renderMap(true);\n renderCrumbs();\n renderFoot();\n return;\n }\n\n if (isAtlasList) {\n dom.aiDrawBtn.hidden = true;\n dom.canvasEmpty.hidden = true; // the list is its own content; no placeholder\n renderAtlasList();\n renderCrumbs();\n renderFoot();\n return;\n }\n\n // An active AI draft replaces the static diagram for its exact view.\n if (state.aiActiveKey === key && state.aiDiagrams[key]) {\n const ai = state.aiDiagrams[key];\n const source = diagramThemeBlock() + '\\n' + ai.body; // theme follows the toggle\n dom.canvasEmpty.hidden = true;\n try {\n await renderInto(dom.canvasContent, source);\n wireAIClicks();\n requestAnimationFrame(() => panzoom.fit());\n } catch (err) {\n console.error(err);\n delete state.aiDiagrams[key];\n state.aiActiveKey = null;\n toast('That AI sketch would not draw — back to the static map.');\n renderCanvas();\n return;\n }\n state.currentDiagram = { source, nodes: {} };\n renderCrumbs();\n renderFoot(ai.caption);\n return;\n }\n\n // Honest empty states: better than a sparse, confusing diagram.\n const nothing = nothingToShow();\n if (nothing) {\n dom.canvasContent.innerHTML = '';\n dom.canvasEmpty.textContent = nothing;\n dom.canvasEmpty.hidden = false;\n state.currentDiagram = { source: '', nodes: {} };\n renderCrumbs();\n renderFoot();\n return;\n }\n\n let d;\n if (state.view === 'patterns') {\n d = layersDiagram(scan, facts, state.patterns.layersInfo, { include: pathFilter(state.filters) });\n } else if (state.view === 'health') {\n d = healthDiagram(scan, facts, state.health, { include: pathFilter(state.filters) });\n } else if (state.view === 'security') {\n d = securityDiagram(scan, facts, state.security, { include: pathFilter(state.filters) });\n } else if (state.view === 'history') {\n d = historyDiagram(scan, facts, state.history);\n } else if (state.view === 'services') {\n d = servicesDiagram(scan, manifest);\n } else if (state.view === 'tour') {\n const stop = state.tour.stops[state.tour.idx];\n d = stop ? fileDetailDiagram(scan, facts, stop.path) : emptyDiagram('No tour stops could be picked from this repo.');\n } else if (state.view === 'atlas' && state.atlasOpen) {\n d = openCardDiagram();\n } else {\n d = state.detail\n ? fileDetailDiagram(scan, facts, state.detail)\n : folderDiagram(scan, facts, state.folder, { include: pathFilter(state.filters) });\n }\n\n state.currentDiagram = d;\n dom.canvasEmpty.hidden = true;\n try {\n await renderInto(dom.canvasContent, d.source);\n wireNodeClicks(dom.canvasContent, d.nodes, onNodeClick);\n requestAnimationFrame(() => panzoom.fit());\n } catch (err) {\n console.error(err);\n dom.canvasEmpty.textContent = 'That diagram would not draw: ' + err.message;\n dom.canvasEmpty.hidden = false;\n }\n renderCrumbs();\n renderFoot();\n}\n\n// Returns a message when the current view has nothing worth drawing, else\n// null. The inspector still has plenty to say in these cases — this is only\n// about the canvas.\nfunction nothingToShow() {\n const { scan, facts } = state;\n const parsed = scan.stats.filesParsed;\n const edges = scan.stats.edgeCount;\n\n if (state.view === 'patterns') {\n if (!parsed) return 'No code files parsed, so there are no patterns to read.';\n if (!edges) return 'No import connections anywhere — a shape needs edges, and there are none.';\n }\n\n if (state.view === 'files') {\n if (state.detail) {\n const f = scanIndex(scan).fileAt(state.detail);\n if (!f) return 'That file is not in the scan.';\n const fin = facts.fanIn[state.detail] || 0;\n const fout = facts.fanOut[state.detail] || 0;\n if (!fin && !fout) {\n return f.functions.length\n ? `${f.name} stands alone — nothing imports it and it imports nothing.`\n : `${f.name} stands alone — nothing imports it, it imports nothing, and no functions to chart.`;\n }\n } else {\n const here = scanIndex(scan).filesIn(state.folder);\n if (!here.length) return 'Nothing parsed in this folder.';\n const localSet = new Set(here.map((x) => x.path));\n const touched = scan.edges.some((e) => localSet.has(e.from) || localSet.has(e.to));\n if (!touched) return 'The files here import nothing we can see, and nothing imports them.';\n }\n }\n\n if (state.view === 'services') {\n if (!state.manifest?.services?.length) {\n return 'No services detected — no docker-compose, Procfile, or workspace setup we recognize.';\n }\n }\n\n return null;\n}\n\n// ------------------------------------------------------- filters & routing --\n\n// Typing re-renders, so it is debounced; the toggles are single clicks and are\n// not. The Map redraws in place, everything else goes through the canvas router.\nlet filterTimer = null;\nfunction applyFilters() {\n if (state.view === 'map' && state.aiActiveKey !== aiViewKey()) renderMap(false);\n else renderCanvas();\n}\nfunction applyFiltersSoon() {\n clearTimeout(filterTimer);\n filterTimer = setTimeout(applyFilters, 160);\n}\n\ndom.modeSwitch.addEventListener('click', (event) => {\n const chip = eventElement(event)?.closest<HTMLElement>('.mode-chip');\n if (chip) setView(chip.dataset.mode);\n});\ndom.nodeFilter.addEventListener('input', () => {\n state.filters.text = dom.nodeFilter.value;\n applyFiltersSoon();\n});\ndom.testsToggle.addEventListener('click', () => {\n state.filters.showTests = !state.filters.showTests;\n dom.testsToggle.classList.toggle('is-on', state.filters.showTests);\n applyFilters();\n});\ndom.depthSelect.addEventListener('change', () => {\n state.filters.depth = Number(dom.depthSelect.value);\n if (state.filters.depth > 0) state.mm.expanded = expandedToDepth(state.treeData, state.filters.depth);\n if (state.view === 'map') renderMap(true);\n});\n\n// ---------------------------------------------------------- crumbs & foot --\n\nfunction renderCrumbs() {\n const parts = [];\n parts.push(`<button data-go=\"map\">${escapeHtml(state.scan.name)}</button>`);\n\n if (state.view === 'files' || state.view === 'tour') {\n const folder = state.view === 'tour' ? dirOf(state.tour.stops[state.tour.idx]?.path || '') : state.folder;\n if (folder) {\n const segs = folder.split('/');\n segs.forEach((seg, i) => {\n parts.push(`<button data-folder=\"${escapeHtml(segs.slice(0, i + 1).join('/'))}\">${escapeHtml(seg)}</button>`);\n });\n }\n const detail = state.view === 'tour' ? state.tour.stops[state.tour.idx]?.path : state.detail;\n if (detail) parts.push(`<span>${escapeHtml(detail.split('/').pop())}</span>`);\n } else if (state.view === 'services') {\n parts.push('<span>services</span>');\n } else if (state.view === 'atlas') {\n parts.push('<button data-atlas=\"list\">atlas</button>');\n if (state.atlasOpen) {\n const t = state.atlasOpen.title;\n parts.push(`<span>${escapeHtml(t.length > 34 ? '…' + t.slice(-33) : t)}</span>`);\n }\n } else if (state.view === 'about') {\n parts.push('<span>about</span>');\n } else if (state.view === 'docs') {\n parts.push('<span>docs</span>');\n } else if (state.view === 'patterns') {\n parts.push('<span>patterns</span>');\n } else if (state.view === 'history') {\n parts.push('<span>history</span>');\n }\n\n dom.crumbs.innerHTML = parts.join('<span class=\"sep\">/</span>');\n for (const b of dom.crumbs.querySelectorAll('button')) {\n b.addEventListener('click', () => {\n if (b.dataset.atlas) {\n state.atlasOpen = null;\n renderCanvas();\n return;\n }\n if (b.dataset.go === 'map') return setView('map');\n state.folder = b.dataset.folder || '';\n state.detail = null;\n setView('files');\n });\n }\n}\n\nfunction renderFoot(aiCaption?: any) {\n const s = state.scan.stats;\n const f = state.facts;\n const langList = Object.entries(s.languages).map(([k, v]) => `${v} ${k}`).join(', ');\n dom.stageFoot.innerHTML = [\n aiCaption ? `<span class=\"ai-cap\" title=\"${escapeHtml(aiCaption)}\">“${escapeHtml(aiCaption)}”</span>` : '',\n `<span class=\"foot-stats\">\n <b>${s.filesParsed}</b> files ·\n <b>${s.edgeCount}</b> connections ·\n <b>${f.entries.length}</b> entries ·\n <b>${f.hubs.length}</b> hubs ·\n <b>${f.orphans.length}</b> unconnected\n ${f.cycles.length ? ` · <b class=\"warn\">${f.cycles.length}</b> circular` : ''}\n </span>`,\n `<span class=\"foot-right\">\n ${langList ? `<span class=\"langs\" title=\"${escapeHtml(langList)}\">${escapeHtml(langList)}</span>` : ''}\n <span>scanned in <b>${s.tookMs}</b> ms</span>\n </span>`,\n ].filter(Boolean).join('');\n}\n\n// ------------------------------------------------------------------- tour --\n\nfunction showTourStop() {\n const { stops, idx } = state.tour;\n const stop = stops[idx];\n if (!stop) {\n dom.tourTitle.textContent = 'No stops could be picked from this repo.';\n dom.tourCount.textContent = '0 / 0';\n inspector.showOverview(state);\n return;\n }\n dom.tourTitle.textContent = stop.path;\n dom.tourTitle.title = stop.why;\n dom.tourCount.textContent = describeStop(stop, idx, stops.length).count;\n focusFile(stop.path);\n syncInspector();\n renderSidebar();\n}\n\ndom.tourPrev.addEventListener('click', () => {\n if (state.tour.idx > 0) {\n state.tour.idx--;\n renderCanvas();\n showTourStop();\n }\n});\ndom.tourNext.addEventListener('click', () => {\n if (state.tour.idx < state.tour.stops.length - 1) {\n state.tour.idx++;\n renderCanvas();\n showTourStop();\n }\n});\ndom.tourExit.addEventListener('click', () => setView('map'));\n\n// ---------------------------------------------------------- stage actions --\n\ndom.copyMermaidBtn.addEventListener('click', async () => {\n try {\n await navigator.clipboard.writeText(state.currentDiagram.source);\n toast('Mermaid source copied.');\n } catch {\n toast('The clipboard said no.');\n }\n});\n\ndom.svgBtn.addEventListener('click', () => {\n const name = (state.scan?.name || 'codebase') + '-' + state.view + '.svg';\n if (downloadSvg(dom.canvasContent, name)) toast('SVG saved.');\n});\n\ndom.fitBtn.addEventListener('click', () => panzoom.fit());\ndom.searchTriggerBtn.addEventListener('click', () => searchCtl?.show(dom.searchTriggerBtn));\ndocument.addEventListener('search-visibility', () => forceGraphCtl?.setActive(state.view === 'graph' && !searchCtl?.isShowing()));\ndom.graphSearchInput?.addEventListener('input', (e) => forceGraphCtl?.search((e.currentTarget as HTMLInputElement).value));\ndom.graphFit?.addEventListener('click', () => forceGraphCtl?.fit());\n\n// ------------------------------------------------------------- AI explain --\n\ninspector.initInspector({\n onAskAI: askAI,\n onClearFocus: clearFocus,\n // The inspector's \"Code\" button means the Code tab, not the Explorer —\n // openFile would drop the person back on the map they came from.\n onOpenCode: openFileInCode,\n onDeepDive: openDeepDive,\n onToast: toast,\n});\n\n// The About view owns its own rendering; it borrows these three from the shell.\ninitAbout({\n host: dom.aboutView,\n onToast: toast,\n onOpenSettings: openSettings,\n repoOverview,\n});\n\ninitDocs({\n host: dom.docView,\n onToast: toast,\n onOpenSettings: openSettings,\n onOpenFile: openFile,\n repoOverview,\n});\n\ninitCodeTab({\n host: dom.codeView,\n blameGutter: dom.blameGutter,\n onSyncInspector: syncInspector,\n onRenderSidebar: renderSidebar,\n onOpenFile: openFile,\n onDeepDive: openDeepDive,\n onToast: toast,\n getTheme,\n});\n\n// The deep-analysis panel lives in the security view's inspector. It runs the\n// external engines through the server, then merges what they find back into the\n// scan so the grade and the finding list update to include them.\ninitAnalysisPanel({\n host: dom.inspSecurityTools,\n onToast: toast,\n onOpenFile: openFileInCode,\n});\n\n// The full-page Deep Analysis view. Same store, same run, more room: the whole\n// report with file links and an AI explainer.\ninitDeepAnalysis({\n host: dom.analysisView,\n onToast: toast,\n onOpenFile: openFileInCode,\n onOpenSettings: openSettings,\n repoOverview,\n});\n\n// A run started from either surface changes the scan's findings, so whatever\n// panel is on screen has to be told. The merge itself happens in the store.\nsubscribeAnalysis(() => {\n if (state.scan) syncInspector();\n});\n\ninitAiDraft({\n host: dom.aiDrawBtn,\n statusEl: dom.canvasEmpty, // the placeholder doubles as the progress line\n nodeHost: dom.canvasContent,\n onRender: renderCanvas,\n onValidate: source => validateDiagram(diagramThemeBlock() + '\\n' + source),\n onOpenFile: openFile,\n onOpenSettings: openSettings,\n onToast: toast,\n});\n\ninitAtlas({\n host: dom.canvasContent,\n canvas: dom.canvas,\n onSyncInspector: syncInspector,\n onRender: renderCanvas,\n onHome: () => panzoom.home(),\n});\n\ninitMap({\n host: dom.canvasContent,\n toggleBtn: dom.mmToggleBtn,\n onSyncInspector: syncInspector,\n onRenderSidebar: renderSidebar,\n onOpenFile: openFile,\n onOpenFolder: (folder) => {\n state.folder = folder;\n state.detail = null;\n setView('files');\n },\n onToast: toast,\n onFit: () => requestAnimationFrame(() => panzoom.fit()),\n});\n\nfunction repoOverview() {\n return explainOverview(state.scan, state.facts, state.manifest).replace(/[*`]/g, '');\n}\n\nasync function askAI() {\n if (!llm.isConfigured()) {\n openSettings();\n toast('Choose Hermes or an endpoint in AI connection first.');\n return;\n }\n if (!state.selected) return;\n\n const settings = llm.getSettings();\n const ctx = await gatherFileContext(state.selected);\n const messages = llm.fileMessages({\n repoName: state.scan.name,\n overview: repoOverview(),\n ...ctx,\n });\n\n const writer = inspector.explainStreamWriter();\n try {\n // Reasoning models (like the bundled Nemotron default) think before they\n // write, so the budget needs room for both the thinking and the answer.\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: 1600 })) {\n writer.push(delta);\n }\n writer.finish(`Written by ${settings.model}, from the real source and the import graph.`);\n } catch (err) {\n writer.fail(err.message + ' Check the AI connection drawer, top right.');\n }\n}\n\n// Free-form questions. The selected file's context rides along when there is\n// one; otherwise the model reasons from the repo overview alone.\nasync function askCustom() {\n const question = dom.askInput.value.trim();\n if (!question) return toast('Type a question first.');\n if (!state.scan) return;\n if (!llm.isConfigured()) {\n openSettings();\n toast('Choose Hermes or an endpoint in AI connection first.');\n return;\n }\n\n const settings = llm.getSettings();\n const file = state.selected ? await gatherFileContext(state.selected) : null;\n const messages = llm.questionMessages({\n repoName: state.scan.name,\n overview: repoOverview(),\n question,\n file,\n });\n\n dom.askBtn.disabled = true;\n dom.askBtn.textContent = '…';\n const writer = inspector.explainStreamWriter(`<p class=\"ask-q\">“${escapeHtml(question)}”</p>`);\n try {\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: 1600 })) {\n writer.push(delta);\n }\n writer.finish(`Answered by ${settings.model}.`);\n } catch (err) {\n writer.fail(err.message + ' Check the AI connection drawer, top right.');\n } finally {\n dom.askBtn.disabled = false;\n dom.askBtn.textContent = 'Ask';\n }\n}\n\ndom.askBtn.addEventListener('click', askCustom);\ndom.askInput.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') askCustom();\n});\n\n// ---------------------------------------------------------- settings bits --\n\nlet hermesInfo = null;\nlet connectionCheck: AbortController | null = null;\nlet connectionTest: AbortController | null = null;\n\nasync function refreshHermes() {\n connectionCheck?.abort();\n const controller = connectionCheck = new AbortController();\n hermesInfo = null;\n dom.hermesConnectionStatus.textContent = 'Checking your Hermes configuration…';\n dom.hermesModel.textContent = dom.hermesProvider.textContent = '—';\n dom.saveSettings.disabled = dom.testSettings.disabled = true;\n dom.refreshHermes.disabled = true;\n try {\n const info = await fetchHermesStatus(controller.signal);\n if (controller.signal.aborted) return;\n hermesInfo = info;\n dom.hermesConnectionStatus.textContent = info.message;\n dom.hermesModel.textContent = info.model || 'Choose in your terminal';\n dom.hermesProvider.textContent = info.provider || 'Not configured';\n dom.saveSettings.disabled = dom.testSettings.disabled = !info.available || !info.configured;\n } catch (err) {\n if (!controller.signal.aborted) dom.hermesConnectionStatus.textContent = err.message;\n } finally {\n if (connectionCheck === controller) dom.refreshHermes.disabled = false;\n }\n}\n\nfunction syncAIConnection() {\n connectionCheck?.abort(); connectionTest?.abort();\n const hermes = dom.setConnection.value === 'hermes';\n dom.apiConnection.hidden = hermes;\n dom.hermesConnection.hidden = !hermes;\n dom.saveSettings.disabled = dom.testSettings.disabled = false;\n dom.settingsStatus.textContent = '';\n dom.aiConnectionNote.textContent = hermes\n ? 'Hermes keeps your login on the server. Only the connection choice is saved in this browser. AI features send the displayed repository context to your Hermes provider.'\n : 'Endpoint settings are saved in this browser. The key is forwarded through your server and never written to its disk or logs.';\n if (hermes) void refreshHermes();\n}\n\nfunction readAISettings() {\n return { connection: dom.setConnection.value, hermesModel: hermesInfo?.model || '',\n baseUrl: dom.setBaseUrl.value.trim().replace(/\\/+$/, ''), apiKey: dom.setApiKey.value, model: dom.setModel.value.trim() };\n}\n\ndom.setConnection.addEventListener('change', syncAIConnection);\ndom.refreshHermes.addEventListener('click', () => { void refreshHermes(); });\n\nfunction openSettings() {\n // Same reason the MCP drawer closes settings: one scrim at a time.\n if (!dom.mcpDrawer.hidden) closeMcp();\n serverDrawer.close();\n const s = llm.getSettings(false);\n dom.setConnection.value = s.connection;\n dom.setBaseUrl.value = s.baseUrl;\n dom.setApiKey.value = s.apiKey;\n dom.setModel.value = s.model;\n dom.settingsStatus.textContent = '';\n dom.settingsDrawer.hidden = false;\n dom.drawerScrim.hidden = false;\n syncAIConnection();\n}\n\nfunction closeSettings() {\n connectionCheck?.abort(); connectionTest?.abort();\n dom.settingsDrawer.hidden = true;\n dom.drawerScrim.hidden = true;\n}\n\ndom.settingsBtn.addEventListener('click', openSettings);\ndom.drawerClose.addEventListener('click', closeSettings);\n\n// ------------------------------------------------------------- server bits --\n\n// The third drawer. Its content and round-trips live in js/serverSettings.js;\n// what stays here is the choreography it shares with the other two drawers —\n// one scrim at a time, Escape to dismiss.\nconst serverDrawer = createServerDrawer({ toast });\n\nfunction openServer() {\n closeSettings();\n if (!dom.mcpDrawer.hidden) closeMcp();\n serverDrawer.open();\n}\n\ndom.serverBtn.addEventListener('click', () => (serverDrawer.isOpen() ? serverDrawer.close() : openServer()));\n\n// ------------------------------------------------------------------- mcp --\n\n// The topbar button, the drawer, and the polling behind them.\n//\n// The shape is deliberately the same as the settings drawer above — one scrim,\n// one panel, a Close button, Escape to dismiss — because the person who learned\n// one has already learned the other. What differs is the content: this panel has\n// a live status, two actions, and a config block, so it polls. Polling continues\n// while closed, slowly, because the dot on the button has to stay truthful when\n// the drawer is not there to explain it.\n\nlet mcpPoll = null;\nlet mcpBusy = false;\nlet mcpCommand = null; // fetched once; the command does not change while it runs\n\n// The dot's three states, and the copy that goes with each. `starting` is\n// separate from `running` because the handshake takes a beat, and claiming\n// success before it is known would be a lie the person acts on.\nfunction mcpDotClass(state) {\n if (state === 'running') return 'is-running';\n if (state === 'starting' || state === 'stopping') return 'is-starting';\n if (state === 'error' || state === 'unavailable') return 'is-error';\n return '';\n}\n\nfunction mcpStateLabel(data) {\n switch (data.state) {\n case 'running': return `Running · ${data.toolCount} tools`;\n case 'starting': return 'Starting…';\n case 'stopping': return 'Stopping…';\n case 'error': return 'Failed to start';\n case 'unavailable': return 'Not available';\n default: return 'Stopped';\n }\n}\n\nfunction formatUptime(ms) {\n if (!ms && ms !== 0) return '0s';\n const s = Math.floor(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${s % 60}s`;\n return `${Math.floor(m / 60)}h ${m % 60}m`;\n}\n\nfunction renderMcpStatus(data) {\n if (!data) {\n // No server answered. The button is still there — it always is — but it says\n // so rather than showing a confident \"stopped\" for a process we cannot see.\n dom.mcpDot.className = 'mcp-dot is-error';\n dom.mcpBtnLabel.textContent = 'MCP';\n dom.mcpPanelDot.className = 'mcp-dot mcp-dot-lg is-error';\n dom.mcpPanelState.textContent = 'The server did not answer.';\n dom.mcpStart.disabled = true;\n dom.mcpStop.disabled = true;\n dom.mcpStatus.textContent = 'Is the Onboarder server running?';\n return;\n }\n\n const cls = mcpDotClass(data.state);\n dom.mcpDot.className = 'mcp-dot ' + cls;\n dom.mcpPanelDot.className = 'mcp-dot mcp-dot-lg ' + cls;\n dom.mcpBtnLabel.textContent = data.running ? 'MCP on' : 'MCP';\n dom.mcpBtn.title = data.running\n ? `MCP server running · ${data.toolCount} tools · pid ${data.pid}`\n : 'Start the MCP server so AI agents can read this repository';\n dom.mcpPanelState.textContent = mcpStateLabel(data);\n\n // Both buttons stay visible and swap roles through `disabled`, so the panel\n // does not reflow as the state changes underneath it.\n const busy = data.state === 'starting' || data.state === 'stopping';\n dom.mcpStart.disabled = busy || data.state === 'unavailable' || data.running;\n dom.mcpStop.disabled = busy || data.state === 'unavailable' || !data.running;\n\n const bits = [];\n if (data.running) {\n bits.push(`pid ${data.pid}`);\n bits.push(`up ${formatUptime(data.uptimeMs)}`);\n }\n if (data.lastError) bits.push(data.lastError);\n dom.mcpStatus.textContent = bits.join(' · ');\n\n // The config only appears once there is a server to configure against. Shown\n // earlier, it would be a command for a process that is not running.\n dom.mcpConfig.hidden = !data.running;\n if (data.running) {\n dom.mcpToolsHint.textContent = `${data.toolCount} tools: ${(data.tools || []).join(', ')}`;\n }\n}\n\nfunction scheduleMcpPoll(ms) {\n clearTimeout(mcpPoll);\n mcpPoll = setTimeout(pollMcp, ms);\n}\n\nasync function pollMcp() {\n renderMcpStatus(await fetchMcpStatus());\n // Closed: a slow heartbeat, so the dot is right when the person comes back\n // without the tab asking the server anything it does not need to answer.\n scheduleMcpPoll(dom.mcpDrawer.hidden ? 8000 : 2500);\n}\n\nasync function loadMcpCommand() {\n if (mcpCommand) return mcpCommand;\n mcpCommand = await fetchMcpCommand();\n if (mcpCommand) {\n dom.mcpCommandInput.value = mcpCommand.command;\n renderMcpConfigBlock();\n }\n return mcpCommand;\n}\n\nasync function openMcp() {\n // Two drawers over one page would stack their scrims, and the top one would win\n // every click. Closing settings first keeps the invariant the Escape handler\n // assumes, and matches what the person was doing — switching panels.\n closeSettings();\n serverDrawer.close();\n dom.mcpDrawer.hidden = false;\n dom.mcpScrim.hidden = false;\n await pollMcp();\n await loadMcpCommand();\n scheduleMcpPoll(2500);\n}\n\nfunction closeMcp() {\n dom.mcpDrawer.hidden = true;\n dom.mcpScrim.hidden = true;\n scheduleMcpPoll(8000);\n}\n\n// The two config shapes a client is most likely to want: JSON for the harnesses\n// that read a config file, TOML for the ones that do not. Both are built from\n// what the server reported, so neither can drift from the command that actually\n// starts it.\nfunction renderMcpConfigBlock() {\n const ex = mcpCommand?.examples?.[0];\n if (!ex) return;\n const command = shortCommand(ex.command);\n const json = { mcpServers: { onboarder: { command, args: ex.args } } };\n const toml = [\n '[mcp_servers.onboarder]',\n `command = ${JSON.stringify(command)}`,\n `args = [${ex.args.map((a) => JSON.stringify(a)).join(', ')}]`,\n ].join('\\n');\n dom.mcpConfigBlock.textContent = dom.mcpTabToml.classList.contains('is-on')\n ? toml\n : JSON.stringify(json, null, 2);\n}\n\n// The server reports its own `process.execPath` so the config works even where\n// the harness's PATH has no node. But an absolute path is noise in a snippet\n// people read, so the common case is shown short and the input above keeps the\n// exact one.\nfunction shortCommand(cmd) {\n return typeof cmd === 'string' && cmd.endsWith('/node') ? 'node' : cmd;\n}\n\nfunction pickMcpTab(toml) {\n dom.mcpTabJson.classList.toggle('is-on', !toml);\n dom.mcpTabToml.classList.toggle('is-on', toml);\n dom.mcpTabJson.setAttribute('aria-selected', String(!toml));\n dom.mcpTabToml.setAttribute('aria-selected', String(toml));\n renderMcpConfigBlock();\n}\n\ndom.mcpTabJson.addEventListener('click', () => pickMcpTab(false));\ndom.mcpTabToml.addEventListener('click', () => pickMcpTab(true));\ndom.mcpBtn.addEventListener('click', () => (dom.mcpDrawer.hidden ? openMcp() : closeMcp()));\ndom.mcpClose.addEventListener('click', closeMcp);\ndom.mcpScrim.addEventListener('click', closeMcp);\n\ndom.mcpCopy.addEventListener('click', async () => {\n try {\n await navigator.clipboard.writeText(dom.mcpConfigBlock.textContent);\n toast('Config copied');\n } catch {\n // Clipboard access can be refused outright; selecting the text is the one\n // fallback that always works, so the person can copy it themselves.\n dom.mcpCommandInput.select();\n }\n});\n\nasync function setMcpState(action) {\n if (mcpBusy) return;\n mcpBusy = true;\n // Optimistic: the dot goes amber immediately rather than after a round-trip\n // during which the button would still read \"stopped\" and invite a second click.\n renderMcpStatus({ state: action === 'start' ? 'starting' : 'stopping', running: action === 'stop', toolCount: 0, tools: [] });\n try {\n const data = action === 'start' ? await startMcpServer() : await stopMcpServer();\n renderMcpStatus(data);\n if (action === 'start') await loadMcpCommand();\n } catch (err) {\n renderMcpStatus({ state: 'error', running: action === 'stop', lastError: err.message, tools: [] });\n toast(err.message);\n } finally {\n mcpBusy = false;\n scheduleMcpPoll(1500);\n }\n}\n\ndom.mcpStart.addEventListener('click', () => setMcpState('start'));\ndom.mcpStop.addEventListener('click', () => setMcpState('stop'));\n\n// One heartbeat at load. This first fetch is also what decides whether the button\n// already reads \"MCP on\" for a server that was left running from before.\nscheduleMcpPoll(0);\n\n\ndom.drawerScrim.addEventListener('click', closeSettings);\n\ndom.saveSettings.addEventListener('click', () => {\n stopAiDraft();\n llm.saveSettings(readAISettings());\n dom.settingsStatus.className = 'drawer-status ok';\n dom.settingsStatus.textContent = dom.setConnection.value === 'hermes' ? 'Hermes connected. Your AI features now use its configured login.' : 'Saved in this browser.';\n updateAiBtn();\n if (state.scan) { syncInspector(); void renderCanvas(); }\n});\n\ndom.testSettings.addEventListener('click', async () => {\n const settings = readAISettings();\n if (settings.connection !== 'hermes' && (!settings.baseUrl || !settings.model)) {\n dom.settingsStatus.className = 'drawer-status err';\n dom.settingsStatus.textContent = 'Base URL and model are both needed.';\n return;\n }\n dom.settingsStatus.className = 'drawer-status';\n dom.settingsStatus.textContent = settings.connection === 'hermes' ? 'Asking Hermes… first response may take a moment.' : 'Asking the endpoint…';\n const controller = connectionTest = new AbortController();\n dom.testSettings.disabled = true;\n try {\n let heard = '';\n for await (const delta of streamExplain({\n ...settings,\n signal: controller.signal,\n maxTokens: 64,\n messages: [{ role: 'user', content: 'Reply with the single word: ready' }],\n })) {\n heard += delta;\n }\n if (controller.signal.aborted) return;\n dom.settingsStatus.className = 'drawer-status ok';\n dom.settingsStatus.textContent = heard\n ? `Connected — ${settings.connection === 'hermes' ? 'Hermes · ' + settings.hermesModel : settings.model} answered. Save to use this connection.`\n : `Connected. It answered with silence, but that is a thinking model spending its whole token budget on thought — explanations use a bigger one.`;\n } catch (err) {\n if (controller.signal.aborted) return;\n dom.settingsStatus.className = 'drawer-status err';\n dom.settingsStatus.textContent = err.message;\n } finally {\n if (connectionTest === controller && !controller.signal.aborted) dom.testSettings.disabled = false;\n }\n});\n\n// ------------------------------------------------------------------- misc --\n\nlet toastTimer = null;\nfunction toast(message) {\n dom.toast.textContent = message;\n dom.toast.hidden = false;\n clearTimeout(toastTimer);\n toastTimer = setTimeout(() => (dom.toast.hidden = true), 2600);\n}\n\ndocument.addEventListener('keydown', (event) => {\n if (eventElement(event)?.matches('input, textarea, select')) return;\n // Escape closes whichever drawer is open. The three are kept mutually\n // exclusive when they open, so at most one is ever showing — but checking\n // each here means the behavior does not depend on that invariant holding.\n if (event.key === 'Escape') {\n if (!dom.mcpDrawer.hidden) return closeMcp();\n if (serverDrawer.isOpen()) return serverDrawer.close();\n return closeSettings();\n }\n if (!state.scan) return;\n if (event.key === '1') setView(state.lastExplorer || 'map');\n if (event.key === '2') setView('code');\n if (event.key === '3') setView('docs');\n if (event.key === '4') setView('about');\n if (event.key === '/') {\n event.preventDefault();\n dom.treeFilter.focus();\n }\n if (state.view === 'tour') {\n if (event.key === ']') dom.tourNext.click();\n if (event.key === '[') dom.tourPrev.click();\n }\n});\n\n// ------------------------------------------------------------------ theme --\n\nconst THEME_KEY = 'onboarder.theme';\n\nfunction getTheme() {\n const saved = localStorage.getItem(THEME_KEY);\n if (saved === 'dark' || saved === 'light') return saved;\n return window.matchMedia?.('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n}\n\nfunction applyTheme(theme) {\n document.documentElement.dataset.theme = theme;\n setDiagramTheme(theme);\n setViewerTheme(theme);\n dom.themeBtn.textContent = theme === 'dark' ? 'Light' : 'Dark';\n dom.themeBtn.title = theme === 'dark' ? 'Switch to the light theme' : 'Switch to the dark theme';\n}\n\ndom.themeBtn.addEventListener('click', () => {\n const next = getTheme() === 'dark' ? 'light' : 'dark';\n localStorage.setItem(THEME_KEY, next);\n applyTheme(next);\n if (state.scan && (isExplorerView(state.view) || state.view === 'graph' || state.view === 'heatmap')) renderCanvas(); // Only canvas/diagram views need a theme redraw.\n});\n\napplyTheme(getTheme());\n"]}
@@ -0,0 +1,11 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256" fill="none" role="img" aria-labelledby="title desc">
2
+ <title id="title">Onboarder — code compass</title>
3
+ <desc id="desc">An amber O surrounds a north-pointing compass and three connected repository nodes.</desc>
4
+ <rect x="12" y="12" width="232" height="232" rx="64" fill="#20242F"/>
5
+ <path d="M128 38c50 0 90 40 90 90s-40 90-90 90-90-40-90-90 40-90 90-90Z" stroke="#F5C451" stroke-width="10"/>
6
+ <path d="M128 166V94M88 128h80" stroke="#F5C451" stroke-width="8" stroke-linecap="round" stroke-linejoin="round"/>
7
+ <path d="m128 72-15 25h30l-15-25Z" fill="#F5C451"/>
8
+ <circle cx="84" cy="128" r="10" fill="#FFE9AD"/>
9
+ <circle cx="172" cy="128" r="10" fill="#FFE9AD"/>
10
+ <circle cx="128" cy="174" r="10" fill="#FFE9AD"/>
11
+ </svg>
@@ -59,6 +59,9 @@ declare global {
59
59
  };
60
60
  mermaid: {
61
61
  initialize(options: unknown): void;
62
+ parse(source: string): Promise<false | {
63
+ diagramType: string;
64
+ }>;
62
65
  render(id: string, source: string): Promise<{
63
66
  svg: string;
64
67
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/public/browser.ts"],"names":[],"mappings":"","sourcesContent":["/** Narrow declarations for the vendored browser integrations. */\nexport interface BrowserFileHandle {\n kind: 'file';\n name: string;\n getFile(): Promise<File>;\n}\nexport interface BrowserDirectoryHandle {\n kind: 'directory';\n name: string;\n entries(): AsyncIterableIterator<[string, BrowserDirectoryHandle | BrowserFileHandle]>;\n}\nexport interface AmdLoader {\n (modules: string[], ready: () => void, failed?: () => void): void;\n config(options: { paths: Record<string, string> }): void;\n}\nexport interface MonacoModel { getLineCount(): number }\nexport interface MonacoEditor {\n getModel(): MonacoModel | null;\n setValue(value: string): void;\n setScrollTop(value: number): void;\n setScrollLeft(value: number): void;\n revealLineInCenter(line: number): void;\n setPosition(position: { lineNumber: number; column: number }): void;\n}\nexport interface MonacoApi {\n editor: {\n defineTheme(name: string, theme: unknown): void;\n create(container: HTMLElement, options: unknown): MonacoEditor;\n setTheme(name: string): void;\n setModelLanguage(model: MonacoModel, language: string): void;\n };\n languages: { typescript?: {\n typescriptDefaults: { setDiagnosticsOptions(options: unknown): void };\n javascriptDefaults: { setDiagnosticsOptions(options: unknown): void };\n } };\n}\ndeclare global {\ninterface Window {\n showDirectoryPicker?: (options: { mode: 'read' }) => Promise<BrowserDirectoryHandle>;\n require: AmdLoader;\n monaco: MonacoApi;\n MonacoEnvironment: { getWorkerUrl(workerId: string, label: string): string };\n mermaid: {\n initialize(options: unknown): void;\n render(id: string, source: string): Promise<{ svg: string }>;\n };\n}\nconst monaco: MonacoApi;\n\n}\n"]}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/public/browser.ts"],"names":[],"mappings":"","sourcesContent":["/** Narrow declarations for the vendored browser integrations. */\nexport interface BrowserFileHandle {\n kind: 'file';\n name: string;\n getFile(): Promise<File>;\n}\nexport interface BrowserDirectoryHandle {\n kind: 'directory';\n name: string;\n entries(): AsyncIterableIterator<[string, BrowserDirectoryHandle | BrowserFileHandle]>;\n}\nexport interface AmdLoader {\n (modules: string[], ready: () => void, failed?: () => void): void;\n config(options: { paths: Record<string, string> }): void;\n}\nexport interface MonacoModel { getLineCount(): number }\nexport interface MonacoEditor {\n getModel(): MonacoModel | null;\n setValue(value: string): void;\n setScrollTop(value: number): void;\n setScrollLeft(value: number): void;\n revealLineInCenter(line: number): void;\n setPosition(position: { lineNumber: number; column: number }): void;\n}\nexport interface MonacoApi {\n editor: {\n defineTheme(name: string, theme: unknown): void;\n create(container: HTMLElement, options: unknown): MonacoEditor;\n setTheme(name: string): void;\n setModelLanguage(model: MonacoModel, language: string): void;\n };\n languages: { typescript?: {\n typescriptDefaults: { setDiagnosticsOptions(options: unknown): void };\n javascriptDefaults: { setDiagnosticsOptions(options: unknown): void };\n } };\n}\ndeclare global {\ninterface Window {\n showDirectoryPicker?: (options: { mode: 'read' }) => Promise<BrowserDirectoryHandle>;\n require: AmdLoader;\n monaco: MonacoApi;\n MonacoEnvironment: { getWorkerUrl(workerId: string, label: string): string };\n mermaid: {\n initialize(options: unknown): void;\n parse(source: string): Promise<false | { diagramType: string }>;\n render(id: string, source: string): Promise<{ svg: string }>;\n };\n}\nconst monaco: MonacoApi;\n\n}\n"]}