codebase-onboarder 0.6.0 → 0.7.0
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.
- package/README.md +174 -46
- package/bin/build-if-source.js +23 -0
- package/cli/commands.d.ts +26 -0
- package/cli/commands.js +836 -811
- package/cli/commands.js.map +1 -0
- package/cli/explorer/advanced.d.ts +14 -0
- package/cli/explorer/advanced.js +321 -329
- package/cli/explorer/advanced.js.map +1 -0
- package/cli/explorer/app.d.ts +1 -0
- package/cli/explorer/app.js +384 -313
- package/cli/explorer/app.js.map +1 -0
- package/cli/explorer/assistant.d.ts +9 -0
- package/cli/explorer/assistant.js +58 -0
- package/cli/explorer/assistant.js.map +1 -0
- package/cli/explorer/commands.d.ts +17 -0
- package/cli/explorer/commands.js +368 -302
- package/cli/explorer/commands.js.map +1 -0
- package/cli/explorer/featureViews.d.ts +124 -0
- package/cli/explorer/featureViews.js +179 -0
- package/cli/explorer/featureViews.js.map +1 -0
- package/cli/explorer/github.d.ts +21 -0
- package/cli/explorer/github.js +42 -44
- package/cli/explorer/github.js.map +1 -0
- package/cli/explorer/graphs.d.ts +7 -0
- package/cli/explorer/graphs.js +90 -95
- package/cli/explorer/graphs.js.map +1 -0
- package/cli/explorer/picker.d.ts +22 -0
- package/cli/explorer/picker.js +150 -0
- package/cli/explorer/picker.js.map +1 -0
- package/cli/explorer/report.d.ts +85 -0
- package/cli/explorer/report.js +60 -0
- package/cli/explorer/report.js.map +1 -0
- package/cli/explorer/session.d.ts +449 -0
- package/cli/explorer/session.js +143 -144
- package/cli/explorer/session.js.map +1 -0
- package/cli/explorer/views.d.ts +19 -0
- package/cli/explorer/views.js +465 -482
- package/cli/explorer/views.js.map +1 -0
- package/cli/explorer/wrap.d.ts +1 -0
- package/cli/explorer/wrap.js +28 -44
- package/cli/explorer/wrap.js.map +1 -0
- package/cli/main.d.ts +1 -0
- package/cli/main.js +214 -161
- package/cli/main.js.map +1 -0
- package/cli/prompt.d.ts +5 -0
- package/cli/prompt.js +84 -80
- package/cli/prompt.js.map +1 -0
- package/cli/scanOptions.d.ts +2 -0
- package/cli/scanOptions.js +11 -0
- package/cli/scanOptions.js.map +1 -0
- package/cli/ui.d.ts +33 -0
- package/cli/ui.js +35 -44
- package/cli/ui.js.map +1 -0
- package/cli/wizard.d.ts +187 -0
- package/cli/wizard.js +304 -284
- package/cli/wizard.js.map +1 -0
- package/package.json +15 -4
- package/public/app.d.ts +1 -0
- package/public/app.js +1057 -1009
- package/public/app.js.map +1 -0
- package/public/browser.d.ts +68 -0
- package/public/browser.js +2 -0
- package/public/browser.js.map +1 -0
- package/public/index.html +30 -13
- package/public/js/about.d.ts +6 -0
- package/public/js/about.js +152 -172
- package/public/js/about.js.map +1 -0
- package/public/js/aiDraft.d.ts +3 -0
- package/public/js/aiDraft.js +116 -124
- package/public/js/aiDraft.js.map +1 -0
- package/public/js/analysisPanel.d.ts +7 -0
- package/public/js/analysisPanel.js +166 -166
- package/public/js/analysisPanel.js.map +1 -0
- package/public/js/analysisReport.d.ts +38 -0
- package/public/js/analysisReport.js +105 -110
- package/public/js/analysisReport.js.map +1 -0
- package/public/js/api.d.ts +26 -0
- package/public/js/api.js +176 -167
- package/public/js/api.js.map +1 -0
- package/public/js/atlas.d.ts +6 -0
- package/public/js/atlas.js +50 -58
- package/public/js/atlas.js.map +1 -0
- package/public/js/blameView.d.ts +2 -0
- package/public/js/blameView.js +36 -37
- package/public/js/blameView.js.map +1 -0
- package/public/js/codeTab.d.ts +3 -0
- package/public/js/codeTab.js +175 -180
- package/public/js/codeTab.js.map +1 -0
- package/public/js/codeViewer.d.ts +5 -0
- package/public/js/codeViewer.js +162 -150
- package/public/js/codeViewer.js.map +1 -0
- package/public/js/components/FileChip.d.ts +9 -0
- package/public/js/components/FileChip.js +45 -49
- package/public/js/components/FileChip.js.map +1 -0
- package/public/js/components/MetricSparkline.d.ts +7 -0
- package/public/js/components/MetricSparkline.js +35 -44
- package/public/js/components/MetricSparkline.js.map +1 -0
- package/public/js/components/RiskBadge.d.ts +9 -0
- package/public/js/components/RiskBadge.js +55 -63
- package/public/js/components/RiskBadge.js.map +1 -0
- package/public/js/deepAnalysisView.d.ts +99 -0
- package/public/js/deepAnalysisView.js +282 -302
- package/public/js/deepAnalysisView.js.map +1 -0
- package/public/js/diagramPane.d.ts +8 -0
- package/public/js/diagramPane.js +133 -135
- package/public/js/diagramPane.js.map +1 -0
- package/public/js/diffView.d.ts +6 -0
- package/public/js/diffView.js +222 -209
- package/public/js/diffView.js.map +1 -0
- package/public/js/docsView.d.ts +2 -0
- package/public/js/docsView.js +441 -442
- package/public/js/docsView.js.map +1 -0
- package/public/js/dom.d.ts +189 -0
- package/public/js/dom.js +5 -0
- package/public/js/dom.js.map +1 -0
- package/public/js/fileSourceBrowser.d.ts +5 -0
- package/public/js/fileSourceBrowser.js +33 -41
- package/public/js/fileSourceBrowser.js.map +1 -0
- package/public/js/flameGraph.d.ts +5 -0
- package/public/js/flameGraph.js +62 -72
- package/public/js/flameGraph.js.map +1 -0
- package/public/js/forceGraph.d.ts +10 -0
- package/public/js/forceGraph.js +581 -556
- package/public/js/forceGraph.js.map +1 -0
- package/public/js/heatmap.d.ts +4 -0
- package/public/js/heatmap.js +142 -164
- package/public/js/heatmap.js.map +1 -0
- package/public/js/highlight.d.ts +2 -0
- package/public/js/highlight.js +116 -107
- package/public/js/highlight.js.map +1 -0
- package/public/js/html.d.ts +2 -0
- package/public/js/html.js +14 -44
- package/public/js/html.js.map +1 -0
- package/public/js/insightsView.d.ts +5 -0
- package/public/js/insightsView.js +93 -111
- package/public/js/insightsView.js.map +1 -0
- package/public/js/inspector.d.ts +37 -0
- package/public/js/inspector.js +416 -445
- package/public/js/inspector.js.map +1 -0
- package/public/js/llm.d.ts +113 -0
- package/public/js/llm.js +233 -272
- package/public/js/llm.js.map +1 -0
- package/public/js/mapView.d.ts +3 -0
- package/public/js/mapView.js +121 -120
- package/public/js/mapView.js.map +1 -0
- package/public/js/markdown.d.ts +3 -0
- package/public/js/markdown.js +84 -91
- package/public/js/markdown.js.map +1 -0
- package/public/js/mindmap.d.ts +32 -0
- package/public/js/mindmap.js +244 -259
- package/public/js/mindmap.js.map +1 -0
- package/public/js/mobilePanels.d.ts +5 -0
- package/public/js/mobilePanels.js +50 -0
- package/public/js/mobilePanels.js.map +1 -0
- package/public/js/repoFiles.d.ts +12 -0
- package/public/js/repoFiles.js +28 -27
- package/public/js/repoFiles.js.map +1 -0
- package/public/js/reviewView.d.ts +28 -0
- package/public/js/reviewView.js +256 -0
- package/public/js/reviewView.js.map +1 -0
- package/public/js/sbomView.d.ts +3 -0
- package/public/js/sbomView.js +59 -67
- package/public/js/sbomView.js.map +1 -0
- package/public/js/scanCache.d.ts +16 -0
- package/public/js/scanCache.js +67 -65
- package/public/js/scanCache.js.map +1 -0
- package/public/js/search.d.ts +7 -0
- package/public/js/search.js +868 -800
- package/public/js/search.js.map +1 -0
- package/public/js/searchLocal.d.ts +42 -0
- package/public/js/searchLocal.js +87 -0
- package/public/js/searchLocal.js.map +1 -0
- package/public/js/serverSettings.d.ts +5 -0
- package/public/js/serverSettings.js +153 -164
- package/public/js/serverSettings.js.map +1 -0
- package/public/js/state.d.ts +798 -0
- package/public/js/state.js +114 -122
- package/public/js/state.js.map +1 -0
- package/public/js/tour.d.ts +6 -0
- package/public/js/tour.js +5 -7
- package/public/js/tour.js.map +1 -0
- package/public/js/transitions.d.ts +2 -0
- package/public/js/transitions.js +9 -10
- package/public/js/transitions.js.map +1 -0
- package/public/js/tree.d.ts +12 -0
- package/public/js/tree.js +157 -154
- package/public/js/tree.js.map +1 -0
- package/public/js/workflowsView.d.ts +3 -0
- package/public/js/workflowsView.js +15 -22
- package/public/js/workflowsView.js.map +1 -0
- package/public/search.css +495 -0
- package/public/styles.css +163 -346
- package/public/workbench.css +166 -0
- package/server/apiAuth.d.ts +3 -0
- package/server/apiAuth.js +18 -20
- package/server/apiAuth.js.map +1 -0
- package/server/apiDiff.d.ts +2 -0
- package/server/apiDiff.js +20 -18
- package/server/apiDiff.js.map +1 -0
- package/server/apiDocs.d.ts +2 -0
- package/server/apiDocs.js +38 -40
- package/server/apiDocs.js.map +1 -0
- package/server/apiFile.d.ts +1 -0
- package/server/apiFile.js +14 -17
- package/server/apiFile.js.map +1 -0
- package/server/apiGitBlame.d.ts +2 -0
- package/server/apiGitBlame.js +50 -51
- package/server/apiGitBlame.js.map +1 -0
- package/server/apiMcp.d.ts +4 -0
- package/server/apiMcp.js +64 -66
- package/server/apiMcp.js.map +1 -0
- package/server/apiReview.d.ts +2 -0
- package/server/apiReview.js +45 -0
- package/server/apiReview.js.map +1 -0
- package/server/apiScan.d.ts +5 -0
- package/server/apiScan.js +90 -71
- package/server/apiScan.js.map +1 -0
- package/server/apiSearch.d.ts +33 -0
- package/server/apiSearch.js +184 -200
- package/server/apiSearch.js.map +1 -0
- package/server/apiSettings.d.ts +4 -0
- package/server/apiSettings.js +84 -85
- package/server/apiSettings.js.map +1 -0
- package/server/apiTools.d.ts +3 -0
- package/server/apiTools.js +55 -56
- package/server/apiTools.js.map +1 -0
- package/server/auth.d.ts +5 -0
- package/server/auth.js +54 -51
- package/server/auth.js.map +1 -0
- package/server/config.d.ts +42 -0
- package/server/config.js +189 -194
- package/server/config.js.map +1 -0
- package/server/daemon.d.ts +12 -0
- package/server/daemon.js +124 -114
- package/server/daemon.js.map +1 -0
- package/server/fileSourceNode.d.ts +2 -0
- package/server/fileSourceNode.js +34 -36
- package/server/fileSourceNode.js.map +1 -0
- package/server/gitClone.d.ts +9 -0
- package/server/gitClone.js +59 -61
- package/server/gitClone.js.map +1 -0
- package/server/gitDiff.d.ts +36 -0
- package/server/gitDiff.js +271 -169
- package/server/gitDiff.js.map +1 -0
- package/server/gitHistory.d.ts +12 -0
- package/server/gitHistory.js +80 -80
- package/server/gitHistory.js.map +1 -0
- package/server/gitRemote.d.ts +12 -0
- package/server/gitRemote.js +37 -38
- package/server/gitRemote.js.map +1 -0
- package/server/htmlText.d.ts +4 -0
- package/server/htmlText.js +16 -23
- package/server/htmlText.js.map +1 -0
- package/server/http.d.ts +5 -0
- package/server/http.js +27 -30
- package/server/http.js.map +1 -0
- package/server/httpGuards.d.ts +2 -0
- package/server/httpGuards.js +47 -43
- package/server/httpGuards.js.map +1 -0
- package/server/https.d.ts +34 -0
- package/server/https.js +121 -111
- package/server/https.js.map +1 -0
- package/server/index.d.ts +40 -0
- package/server/index.js +139 -147
- package/server/index.js.map +1 -0
- package/server/layout.d.ts +26 -0
- package/server/layout.js +59 -64
- package/server/layout.js.map +1 -0
- package/server/llmProxy.d.ts +3 -0
- package/server/llmProxy.js +137 -135
- package/server/llmProxy.js.map +1 -0
- package/server/logger.d.ts +38 -0
- package/server/logger.js +198 -211
- package/server/logger.js.map +1 -0
- package/server/mcp/analysis.d.ts +29 -0
- package/server/mcp/analysis.js +99 -120
- package/server/mcp/analysis.js.map +1 -0
- package/server/mcp/http.d.ts +9 -0
- package/server/mcp/http.js +128 -137
- package/server/mcp/http.js.map +1 -0
- package/server/mcp/runner.d.ts +68 -0
- package/server/mcp/runner.js +208 -218
- package/server/mcp/runner.js.map +1 -0
- package/server/mcp/server.d.ts +29 -0
- package/server/mcp/server.js +166 -179
- package/server/mcp/server.js.map +1 -0
- package/server/mcp/standalone.d.ts +1 -0
- package/server/mcp/standalone.js +8 -10
- package/server/mcp/standalone.js.map +1 -0
- package/server/mcp/tools.d.ts +2020 -0
- package/server/mcp/tools.js +523 -574
- package/server/mcp/tools.js.map +1 -0
- package/server/paths.d.ts +3 -0
- package/server/paths.js +17 -15
- package/server/paths.js.map +1 -0
- package/server/pidfile.d.ts +9 -0
- package/server/pidfile.js +43 -45
- package/server/pidfile.js.map +1 -0
- package/server/review.d.ts +5 -0
- package/server/review.js +35 -0
- package/server/review.js.map +1 -0
- package/server/router.d.ts +33 -0
- package/server/router.js +191 -197
- package/server/router.js.map +1 -0
- package/server/scanRequest.d.ts +3 -0
- package/server/scanRequest.js +36 -0
- package/server/scanRequest.js.map +1 -0
- package/server/searchIndex.d.ts +17 -0
- package/server/searchIndex.js +83 -80
- package/server/searchIndex.js.map +1 -0
- package/server/sessions.d.ts +14 -0
- package/server/sessions.js +62 -70
- package/server/sessions.js.map +1 -0
- package/server/startup.d.ts +118 -0
- package/server/startup.js +143 -148
- package/server/startup.js.map +1 -0
- package/server/static.d.ts +6 -0
- package/server/static.js +28 -31
- package/server/static.js.map +1 -0
- package/server/tools/install.d.ts +4 -0
- package/server/tools/install.js +176 -185
- package/server/tools/install.js.map +1 -0
- package/server/tools/parse.d.ts +8 -0
- package/server/tools/parse.js +112 -114
- package/server/tools/parse.js.map +1 -0
- package/server/tools/platform.d.ts +9 -0
- package/server/tools/platform.js +49 -47
- package/server/tools/platform.js.map +1 -0
- package/server/tools/registry.d.ts +137 -0
- package/server/tools/registry.js +173 -172
- package/server/tools/registry.js.map +1 -0
- package/server/tools/scan.d.ts +34 -0
- package/server/tools/scan.js +89 -98
- package/server/tools/scan.js.map +1 -0
- package/server/tools.d.ts +34 -0
- package/server/tools.js +94 -107
- package/server/tools.js.map +1 -0
- package/server/tunnel.d.ts +29 -0
- package/server/tunnel.js +61 -66
- package/server/tunnel.js.map +1 -0
- package/shared/analyzer/docs.d.ts +16 -0
- package/shared/analyzer/docs.js +99 -93
- package/shared/analyzer/docs.js.map +1 -0
- package/shared/analyzer/explainLocal.d.ts +4 -0
- package/shared/analyzer/explainLocal.js +122 -142
- package/shared/analyzer/explainLocal.js.map +1 -0
- package/shared/analyzer/github.d.ts +37 -0
- package/shared/analyzer/github.js +41 -43
- package/shared/analyzer/github.js.map +1 -0
- package/shared/analyzer/graph.d.ts +41 -0
- package/shared/analyzer/graph.js +393 -400
- package/shared/analyzer/graph.js.map +1 -0
- package/shared/analyzer/health.d.ts +33 -0
- package/shared/analyzer/health.js +197 -193
- package/shared/analyzer/health.js.map +1 -0
- package/shared/analyzer/history.d.ts +29 -0
- package/shared/analyzer/history.js +110 -111
- package/shared/analyzer/history.js.map +1 -0
- package/shared/analyzer/jsonConfig.d.ts +2 -0
- package/shared/analyzer/jsonConfig.js +61 -0
- package/shared/analyzer/jsonConfig.js.map +1 -0
- package/shared/analyzer/languages/csharp.d.ts +26 -0
- package/shared/analyzer/languages/csharp.js +83 -88
- package/shared/analyzer/languages/csharp.js.map +1 -0
- package/shared/analyzer/languages/generic.d.ts +23 -0
- package/shared/analyzer/languages/generic.js +94 -105
- package/shared/analyzer/languages/generic.js.map +1 -0
- package/shared/analyzer/languages/go.d.ts +24 -0
- package/shared/analyzer/languages/go.js +45 -54
- package/shared/analyzer/languages/go.js.map +1 -0
- package/shared/analyzer/languages/index.d.ts +6 -0
- package/shared/analyzer/languages/index.js +19 -20
- package/shared/analyzer/languages/index.js.map +1 -0
- package/shared/analyzer/languages/java.d.ts +20 -0
- package/shared/analyzer/languages/java.js +73 -78
- package/shared/analyzer/languages/java.js.map +1 -0
- package/shared/analyzer/languages/javascript.d.ts +12 -0
- package/shared/analyzer/languages/javascript.js +258 -209
- package/shared/analyzer/languages/javascript.js.map +1 -0
- package/shared/analyzer/languages/python.d.ts +23 -0
- package/shared/analyzer/languages/python.js +92 -100
- package/shared/analyzer/languages/python.js.map +1 -0
- package/shared/analyzer/languages/rust.d.ts +17 -0
- package/shared/analyzer/languages/rust.js +96 -98
- package/shared/analyzer/languages/rust.js.map +1 -0
- package/shared/analyzer/languages/typescript.d.ts +11 -0
- package/shared/analyzer/languages/typescript.js +117 -116
- package/shared/analyzer/languages/typescript.js.map +1 -0
- package/shared/analyzer/licenses.d.ts +18 -0
- package/shared/analyzer/licenses.js +130 -133
- package/shared/analyzer/licenses.js.map +1 -0
- package/shared/analyzer/metrics.d.ts +20 -0
- package/shared/analyzer/metrics.js +112 -104
- package/shared/analyzer/metrics.js.map +1 -0
- package/shared/analyzer/pathUtil.d.ts +10 -0
- package/shared/analyzer/pathUtil.js +29 -35
- package/shared/analyzer/pathUtil.js.map +1 -0
- package/shared/analyzer/patterns.d.ts +11 -0
- package/shared/analyzer/patterns.js +231 -253
- package/shared/analyzer/patterns.js.map +1 -0
- package/shared/analyzer/scan.d.ts +62 -0
- package/shared/analyzer/scan.js +451 -442
- package/shared/analyzer/scan.js.map +1 -0
- package/shared/analyzer/scanControl.d.ts +11 -0
- package/shared/analyzer/scanControl.js +62 -0
- package/shared/analyzer/scanControl.js.map +1 -0
- package/shared/analyzer/security.d.ts +18 -0
- package/shared/analyzer/security.js +159 -159
- package/shared/analyzer/security.js.map +1 -0
- package/shared/analyzer/services.d.ts +5 -0
- package/shared/analyzer/services.js +141 -138
- package/shared/analyzer/services.js.map +1 -0
- package/shared/analyzer/stack.d.ts +6 -0
- package/shared/analyzer/stack.js +134 -141
- package/shared/analyzer/stack.js.map +1 -0
- package/shared/analyzer/tour.d.ts +2 -0
- package/shared/analyzer/tour.js +45 -53
- package/shared/analyzer/tour.js.map +1 -0
- package/shared/analyzer/util.d.ts +8 -0
- package/shared/analyzer/util.js +130 -76
- package/shared/analyzer/util.js.map +1 -0
- package/shared/analyzer/workflows.d.ts +8 -0
- package/shared/analyzer/workflows.js +139 -134
- package/shared/analyzer/workflows.js.map +1 -0
- package/shared/contracts.d.ts +250 -0
- package/shared/contracts.js +2 -0
- package/shared/contracts.js.map +1 -0
- package/shared/diagram/aiFacts.d.ts +35 -0
- package/shared/diagram/aiFacts.js +102 -105
- package/shared/diagram/aiFacts.js.map +1 -0
- package/shared/diagram/aiMermaid.d.ts +5 -0
- package/shared/diagram/aiMermaid.js +46 -45
- package/shared/diagram/aiMermaid.js.map +1 -0
- package/shared/diagram/atlas.d.ts +16 -0
- package/shared/diagram/atlas.js +51 -60
- package/shared/diagram/atlas.js.map +1 -0
- package/shared/diagram/mermaid.d.ts +43 -0
- package/shared/diagram/mermaid.js +348 -370
- package/shared/diagram/mermaid.js.map +1 -0
- package/shared/review/contracts.d.ts +95 -0
- package/shared/review/contracts.js +2 -0
- package/shared/review/contracts.js.map +1 -0
- package/shared/review/review.d.ts +10 -0
- package/shared/review/review.js +184 -0
- package/shared/review/review.js.map +1 -0
- package/shared/search/query.d.ts +32 -0
- package/shared/search/query.js +395 -388
- package/shared/search/query.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docsView.js","sourceRoot":"","sources":["../../src/public/js/docsView.ts"],"names":[],"mappings":"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","sourcesContent":["import { eventElement } from '/js/dom.js';\n// The Docs tab: a written account of the repo.\n//\n// Three layers, in order of how much they cost. The overview page and the\n// folder-by-folder sections are written from the import graph and need no\n// network at all. Pressing \"Generate documentation\" replaces those sentences\n// with a model's, streamed in place. Opening a topic from the contents adds a\n// tab that documents one file or folder in depth, and the bar at the bottom\n// answers questions scoped to whichever of those is on screen.\n//\n// The static sentences live in `/shared/analyzer/docs.js` — pure, and tested.\n// What is here is the DOM: tabs, streaming, and the wiring between them.\n\nimport { parseFolderDoc, fileFactsLine, fileStaticDoc, folderStaticDoc, docFileRow } from '/shared/analyzer/docs.js';\nimport { explainOverview } from '/shared/analyzer/explainLocal.js';\nimport { scanIndex } from '/shared/analyzer/graph.js';\nimport { escapeHtml } from './html.js';\nimport { mdLite, mdRender } from './markdown.js';\nimport { state } from './state.js';\nimport { streamExplain } from './api.js';\nimport { findNode, countFiles } from './tree.js';\nimport { readRepoFile, gatherFileContext } from './repoFiles.js';\nimport * as llm from './llm.js';\n\nlet host = null;\nlet hooks = {\n onToast: (..._args: unknown[]) => {},\n onOpenSettings: (..._args: unknown[]) => {},\n onOpenFile: (..._args: unknown[]) => {},\n repoOverview: () => '',\n};\n\nexport function initDocs(options) {\n host = options.host;\n hooks = { ...hooks, ...options };\n}\n\n// Facts about one file or folder, bound to the loaded repo. Every prompt and\n// every static sentence on this page goes through these two, so the doc tab and\n// the folder pass can never describe the same file differently.\nconst factsLine = (path) => fileFactsLine(path, state.scan, state.facts);\nconst staticDoc = (path) => fileStaticDoc(path, state.scan, state.facts);\nconst fileRow = (path) => docFileRow(path, state.scan, state.facts);\n\n// ---- the page ---------------------------------------------------------------\n\n// One-time document build per scan; AI briefs update rows in place afterwards.\nexport function renderDocs() {\n if (state.docs.rendered) return;\n state.docs.rendered = true;\n\n const tabsEl = document.createElement('div');\n tabsEl.className = 'doc-tabs';\n const wrapEl = document.createElement('div');\n const scrollEl = document.createElement('div');\n scrollEl.className = 'doc-scroll';\n scrollEl.append(tabsEl, wrapEl);\n\n // Answers stream into this rail, above the bar, only once there's something\n // to show.\n const railEl = document.createElement('div');\n railEl.className = 'doc-qa-rail';\n railEl.hidden = true;\n\n // The sticky bottom bar: questions about whatever doc is on screen, with\n // clear/close once a conversation is underway.\n const barEl = document.createElement('form');\n barEl.className = 'doc-askbar';\n barEl.innerHTML = `\n <input type=\"text\" id=\"docAskInput\" class=\"text-input\" placeholder=\"Ask me anything about this doc…\" spellcheck=\"false\" autocomplete=\"off\">\n <button type=\"submit\" class=\"btn btn-ink\">Ask</button>`;\n const clearBtn = document.createElement('button');\n clearBtn.type = 'button';\n clearBtn.className = 'btn btn-sm btn-ghost doc-clear';\n clearBtn.textContent = 'clear';\n clearBtn.title = 'Clear the conversation';\n clearBtn.hidden = true;\n const closeBtn = document.createElement('button');\n closeBtn.type = 'button';\n closeBtn.className = 'btn btn-sm btn-ghost doc-close';\n closeBtn.textContent = 'close';\n closeBtn.title = 'Close the conversation';\n closeBtn.hidden = true;\n clearBtn.addEventListener('click', () => { railEl.innerHTML = ''; });\n closeBtn.addEventListener('click', () => {\n railEl.hidden = true;\n clearBtn.hidden = true;\n closeBtn.hidden = true;\n });\n barEl.append(clearBtn, closeBtn);\n barEl.addEventListener('submit', (event) => {\n event.preventDefault();\n askAboutRepo();\n });\n\n host.innerHTML = '';\n host.append(scrollEl, railEl, barEl);\n state.docs.tabsEl = tabsEl;\n state.docs.wrapEl = wrapEl;\n state.docs.railEl = railEl;\n state.docs.bar = barEl;\n state.docs.pageEl = buildOverviewPage();\n\n renderDocStrip();\n showActiveDoc();\n loadReadme();\n}\n\n// The landing tab: repo header, topic index, README, the documentation zone\n// (filled on demand by the AI), and the question box at the bottom.\nfunction buildOverviewPage() {\n const { scan, facts, manifest } = state;\n const root = state.treeData;\n\n const page = document.createElement('div');\n page.className = 'doc-page';\n page.innerHTML = `\n <div id=\"doc-top\">\n <h1 class=\"doc-title\">${escapeHtml(scan.name)}</h1>\n <p class=\"doc-sub\">${escapeHtml(scan.root)}</p>\n <p class=\"doc-sub\">${scan.stats.filesParsed} code files · ${scan.stats.edgeCount} connections · scanned in ${scan.stats.tookMs} ms</p>\n <p class=\"doc-ai-note\" id=\"docAiNote\">Pick a topic in the contents for a detailed AI document. “Generate documentation” writes the full folder-by-folder write-up below.</p>\n <p class=\"doc-overview\" id=\"docOverview\">${escapeHtml(explainOverview(scan, facts, manifest).replace(/[*`]/g, ''))}</p>\n </div>\n <nav class=\"doc-toc\" id=\"docToc\"></nav>\n <h2 class=\"doc-section-h doc-anchor\" id=\"doc-readme-h\">In its own words</h2>\n <div class=\"doc-readme\" id=\"docReadme\"><span class=\"doc-readme-none\">Looking for a README…</span></div>\n <h2 class=\"doc-section-h doc-anchor\" id=\"doc-layout-h\">The documentation</h2>\n <div id=\"docGenZone\">\n <p class=\"doc-gen-empty\">Nothing written yet. Press the button and the AI will document this repo folder by folder, right here.</p>\n <button class=\"btn btn-ink\" id=\"docGenBtn\">Generate documentation</button>\n </div>\n `;\n\n buildToc(page, root);\n\n page.addEventListener('click', (event) => {\n const b = eventElement(event)?.closest<HTMLElement>('[data-doc-open]');\n if (!b) return;\n const raw = b.dataset.docOpen;\n const i = raw.indexOf(':');\n openDocTab(raw.slice(0, i), raw.slice(i + 1));\n });\n page.querySelector<HTMLButtonElement>('#docGenBtn').addEventListener('click', writeDocsWithAI);\n\n return page;\n}\n\n// The contents index: page anchors up top, then every folder and file as a\n// topic — clicking any of them opens its detailed AI tab.\nfunction buildToc(page, root) {\n const toc = page.querySelector('#docToc');\n const bits = [\n `<span class=\"doc-toc-h\">Get documentation about a topic</span>`,\n `<a href=\"#doc-top\">Overview</a>`,\n `<a href=\"#doc-readme-h\">In its own words</a>`,\n `<span class=\"doc-toc-group\">Folders and files — click for the AI document</span>`,\n ];\n let folderCount = 0;\n const parsedSet = new Set(state.scan.files.map((f) => f.path));\n const walk = (node, depth) => {\n if (folderCount >= 30) return;\n folderCount++;\n const indent = Math.min(depth, 3);\n bits.push(`<button class=\"doc-toc-link doc-toc-folder doc-indent-${indent}\" data-doc-open=\"folder:${escapeHtml(node.path)}\">${escapeHtml(node.path ? node.name + '/' : '(repo root)')}</button>`);\n const files = node.files.filter((f) => parsedSet.has(f)).slice(0, 10);\n if (files.length) {\n const links = files\n .map((f) => `<button class=\"doc-toc-link\" data-doc-open=\"file:${escapeHtml(f)}\">${escapeHtml(f.split('/').pop())}</button>`)\n .join('<span class=\"doc-toc-sep\"> · </span>');\n bits.push(`<span class=\"doc-toc-files doc-indent-${indent}\">${links}${node.files.length > files.length ? ' …' : ''}</span>`);\n }\n for (const child of [...node.dirs.values()].sort((a, b) => a.name.localeCompare(b.name))) {\n walk(child, depth + 1);\n }\n };\n if (root.files.length) walk({ ...root, dirs: new Map() }, 0);\n for (const child of [...root.dirs.values()].sort((a, b) => a.name.localeCompare(b.name))) {\n walk(child, 0);\n }\n toc.innerHTML = bits.join('');\n}\n\nasync function loadReadme() {\n const box = host.querySelector('#docReadme');\n if (!box) return;\n for (const name of ['README.md', 'readme.md', 'Readme.md', 'README', 'README.txt']) {\n try {\n const text = await readRepoFile(name);\n if (text) {\n box.innerHTML = mdRender(text);\n return;\n }\n } catch {\n /* try the next spelling */\n }\n }\n box.innerHTML = '<span class=\"doc-readme-none\">This repo ships no README — the map and the patterns are all you get.</span>';\n}\n\n// ---- the sticky ask bar: questions scoped to the doc on screen -------------\n\nasync function askAboutRepo() {\n const input = host.querySelector('#docAskInput');\n const question = input?.value.trim();\n if (!question) return hooks.onToast('Type a question first.');\n if (!llm.isConfigured()) {\n hooks.onOpenSettings();\n hooks.onToast('Add an endpoint and model first.');\n return;\n }\n input.value = '';\n const rail = state.docs.railEl;\n rail.hidden = false;\n // reveal the clear/close controls now that a conversation exists\n const bar = state.docs.bar;\n if (bar) {\n const c = bar.querySelector<HTMLElement>('.doc-clear');\n const x = bar.querySelector<HTMLElement>('.doc-close');\n if (c) c.hidden = false;\n if (x) x.hidden = false;\n }\n const settings = llm.getSettings();\n\n const card = document.createElement('div');\n card.className = 'doc-qa-card';\n card.innerHTML = `<p class=\"doc-qa-q\">“${escapeHtml(question)}”</p><div class=\"doc-qa-a\"><span class=\"caret\"></span></div>`;\n rail.appendChild(card);\n card.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n\n // Scope the answer to whatever is on screen: an open file/folder doc tab\n // gets its facts (and source, for files) sent along; the overview answers\n // from the repo-wide picture.\n const active = state.docs.active || 'overview';\n let file = null;\n let scope = 'the repo overview';\n let overview = hooks.repoOverview() + ' Top-level folders: ' + [...state.treeData.dirs.keys()].join(', ') + '.';\n if (active.startsWith('file:')) {\n const path = active.slice(5);\n file = await gatherFileContext(path);\n scope = path;\n } else if (active.startsWith('folder:')) {\n scope = active.slice(7) + '/';\n overview += ` The user is currently reading the documentation for the folder \"${active.slice(7)}\".`;\n }\n\n const messages = llm.questionMessages({ repoName: state.scan.name, overview, question, file });\n let text = '';\n try {\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: 1200 })) {\n text += delta;\n card.querySelector('.doc-qa-a').innerHTML = mdLite(text) + '<span class=\"caret\"></span>';\n }\n card.querySelector('.doc-qa-a').innerHTML =\n mdLite(text) + `<p class=\"explain-src\">Answered by ${settings.model}, looking at ${escapeHtml(scope)}.</p>`;\n } catch (err) {\n card.querySelector('.doc-qa-a').innerHTML =\n `<p style=\"color:var(--warn)\">${escapeHtml(err.message)} — check the API key drawer, top right.</p>`;\n }\n}\n\n// ---- doc tabs: detailed AI documents per file/folder -----------------------\n\nfunction renderDocStrip() {\n const strip = state.docs.tabsEl;\n if (!strip) return;\n strip.innerHTML = '';\n\n const mk = (key, label, closable) => {\n const b = document.createElement('button');\n b.className = 'doc-tab' + (state.docs.active === key ? ' is-active' : '');\n const entry = state.docs.tabs.get(key);\n b.innerHTML = `<span>${escapeHtml(label)}</span>${entry?.status === 'writing' ? '<span class=\"doc-tab-spin\">…</span>' : ''}`;\n b.addEventListener('click', () => {\n state.docs.active = key;\n renderDocStrip();\n showActiveDoc();\n });\n if (closable) {\n const x = document.createElement('span');\n x.className = 'doc-tab-x';\n x.textContent = '×';\n x.title = 'Close this tab';\n x.addEventListener('click', (event) => {\n event.stopPropagation();\n closeDocTab(key);\n });\n b.appendChild(x);\n }\n return b;\n };\n\n strip.appendChild(mk('overview', 'Overview', false));\n for (const [key, entry] of state.docs.tabs) {\n strip.appendChild(mk(key, entry.title, true));\n }\n}\n\nfunction openDocTab(kind, path) {\n const key = kind + ':' + path;\n if (!state.docs.tabs.has(key)) {\n const title = (path ? path.split('/').pop() : '(root)') + (kind === 'folder' ? '/' : '');\n state.docs.tabs.set(key, { key, kind, path, title, status: 'idle', text: '', error: '' });\n }\n state.docs.active = key;\n renderDocStrip();\n showActiveDoc();\n const entry = state.docs.tabs.get(key);\n if (entry.status === 'idle') generateDocTab(entry);\n}\n\nfunction closeDocTab(key) {\n state.docs.tabs.delete(key);\n if (state.docs.active === key) state.docs.active = 'overview';\n renderDocStrip();\n showActiveDoc();\n}\n\nfunction showActiveDoc() {\n const wrap = state.docs.wrapEl;\n if (!wrap) return;\n if (state.docs.active === 'overview') {\n wrap.replaceChildren(state.docs.pageEl);\n return;\n }\n const entry = state.docs.tabs.get(state.docs.active);\n if (entry) wrap.replaceChildren(buildPaneEl(entry));\n}\n\nfunction buildPaneEl(entry) {\n const pane = document.createElement('div');\n pane.className = 'doc-page doc-detail';\n\n const chips = [];\n if (entry.kind === 'file') {\n const f = scanIndex(state.scan).fileAt(entry.path);\n const fin = state.facts.fanIn[entry.path] || 0;\n const fout = state.facts.fanOut[entry.path] || 0;\n chips.push(`<b>${fin}</b> dependents`, `<b>${fout}</b> imports`);\n if (f) chips.push(`<b>${f.functions.length}</b> functions`, `<b>${(f.size / 1024).toFixed(1)}</b> kb`);\n } else {\n const node = findNode(state.treeData, entry.path);\n if (node) chips.push(`<b>${node.files.length}</b> files`, `<b>${node.dirs.size}</b> subfolders`);\n }\n\n pane.innerHTML = `\n <h1 class=\"doc-title\">${escapeHtml(entry.title)}</h1>\n <p class=\"doc-sub\">${escapeHtml(entry.path || '(repo root)')}</p>\n <p class=\"doc-sub doc-detail-meta\">${chips.join(' · ')}</p>\n <div class=\"doc-detail-actions\">\n ${entry.kind === 'file' ? '<button class=\"linklike\" data-doc-dd>Open the diagram deep-dive →</button>' : ''}\n <button class=\"linklike\" data-doc-regen>Regenerate</button>\n </div>\n <div class=\"doc-detail-body\"></div>\n `;\n\n const body = pane.querySelector('.doc-detail-body');\n if (entry.status === 'error') {\n body.innerHTML = `<p style=\"color:var(--warn)\">${escapeHtml(entry.error)} — hit Regenerate to try again.</p>`;\n } else if (entry.status === 'idle' || (entry.status === 'writing' && !entry.text)) {\n // The static write-up is the floor: something true is on screen before the\n // model answers, and stays there if it never does.\n const fallback = entry.kind === 'file'\n ? staticDoc(entry.path)\n : folderStaticDoc(entry.path, state.scan, state.facts, findNode(state.treeData, entry.path)?.dirs.size || 0);\n body.innerHTML = `<p>${escapeHtml(fallback)}</p>`\n + '<p class=\"doc-readme-none\">Gathering facts and writing<span class=\"caret\"></span></p>';\n } else {\n body.innerHTML = mdRender(entry.text) + (entry.status === 'writing' ? '<span class=\"caret\"></span>' : '');\n }\n\n pane.addEventListener('click', (event) => {\n if (eventElement(event)?.closest<HTMLElement>('[data-doc-dd]')) hooks.onOpenFile(entry.path);\n if (eventElement(event)?.closest<HTMLElement>('[data-doc-regen]')) {\n entry.status = 'idle';\n entry.text = '';\n generateDocTab(entry);\n showActiveDoc();\n }\n });\n return pane;\n}\n\nlet docRefreshTimer = null;\nfunction scheduleDocPaneRefresh(entry) {\n if (state.docs.active !== entry.key || docRefreshTimer) return;\n docRefreshTimer = setTimeout(() => {\n docRefreshTimer = null;\n if (state.docs.active === entry.key) showActiveDoc();\n }, 160);\n}\n\nasync function generateDocTab(entry) {\n if (!llm.isConfigured()) {\n entry.status = 'error';\n entry.error = 'No endpoint configured — open the API key drawer, top right.';\n showActiveDoc();\n renderDocStrip();\n hooks.onOpenSettings();\n return;\n }\n const settings = llm.getSettings();\n entry.status = 'writing';\n entry.text = '';\n entry.error = '';\n renderDocStrip();\n try {\n let messages;\n if (entry.kind === 'file') {\n const ctx = await gatherFileContext(entry.path);\n messages = llm.fileDocMessages({ repoName: state.scan.name, overview: hooks.repoOverview(), file: ctx });\n } else {\n const node = findNode(state.treeData, entry.path);\n messages = llm.folderDocDetailedMessages({\n repoName: state.scan.name,\n folder: entry.path,\n subfolders: node ? [...node.dirs.keys()].map((n) => n + '/') : [],\n files: (node?.files || []).slice(0, 18).map(fileRow),\n });\n }\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: 1800 })) {\n entry.text += delta;\n scheduleDocPaneRefresh(entry);\n }\n entry.status = 'done';\n } catch (err) {\n entry.status = 'error';\n entry.error = err.message;\n }\n renderDocStrip();\n if (state.docs.active === entry.key) showActiveDoc();\n}\n\n// ---- the folder-by-folder pass --------------------------------------------\n\n// Which folders get an AI brief, and with what file facts. Top-level folders\n// by size, capped — one call briefs a folder and everything directly in it.\nfunction docTargets() {\n const root = state.treeData;\n const targets = [];\n if (root.files.length) {\n targets.push({\n path: '',\n label: '(repo root)',\n subfolders: [...root.dirs.keys()].map((n) => n + '/'),\n files: root.files.slice(0, 18).map(fileRow),\n });\n }\n const topDirs = [...root.dirs.values()]\n .map((node) => ({ node, count: countFiles(node) }))\n .sort((a, b) => b.count - a.count)\n .slice(0, 8);\n for (const { node } of topDirs) {\n targets.push({\n path: node.path,\n label: node.path + '/',\n subfolders: [...node.dirs.keys()].map((n) => n + '/'),\n files: node.files.slice(0, 18).map(fileRow),\n });\n }\n return targets;\n}\n\nasync function writeDocsWithAI() {\n if (state.docs.writing) return;\n if (!llm.isConfigured()) {\n hooks.onOpenSettings();\n hooks.onToast('Add an endpoint and model first.');\n return;\n }\n const settings = llm.getSettings();\n const page = state.docs.pageEl;\n const zone = page?.querySelector('#docGenZone');\n const btn = page?.querySelector<HTMLButtonElement>('#docGenBtn');\n const note = page?.querySelector('#docAiNote');\n const overviewEl = page?.querySelector('#docOverview');\n if (!zone) return;\n\n state.docs.writing = true;\n if (btn) {\n btn.disabled = true;\n btn.textContent = 'writing…';\n }\n zone.querySelectorAll('.doc-generated').forEach((el) => el.remove()); // regenerate = fresh page\n const empty = zone.querySelector<HTMLElement>('.doc-gen-empty');\n if (empty) empty.hidden = true;\n\n try {\n // 1. The repo-level overview, streamed in place.\n if (note) note.textContent = 'Writing the overview…';\n const readmeText = host.querySelector('#docReadme')?.innerText?.slice(0, 1500) || '';\n let out = '';\n if (overviewEl) overviewEl.innerHTML = '<span class=\"caret\"></span>';\n const overviewMsgs = llm.repoDocMessages({\n repoName: state.scan.name,\n overview: hooks.repoOverview(),\n readmeExcerpt: readmeText,\n entries: state.facts.entries,\n hubs: state.facts.hubs,\n });\n for await (const delta of streamExplain({ ...settings, messages: overviewMsgs, maxTokens: 900 })) {\n out += delta;\n if (overviewEl) overviewEl.textContent = out;\n }\n\n // 2. Folder by folder: each section appears with static sentences first,\n // then the AI's documentation overwrites it as the answer lands.\n const targets = docTargets();\n let done = 0;\n for (const t of targets) {\n done++;\n if (note) note.textContent = `Writing documentation… ${done} of ${targets.length} — ${t.label}`;\n\n const node = findNode(state.treeData, t.path);\n const section = document.createElement('section');\n section.className = 'doc-folder doc-generated';\n section.innerHTML = `\n <h3 class=\"doc-folder-h\"><button data-doc-open=\"folder:${escapeHtml(t.path)}\">${escapeHtml(t.label)}</button></h3>\n <p class=\"doc-folder-brief\"><span class=\"caret\"></span></p>\n ${t.files.map((f) => `\n <div class=\"doc-entry${f.parsed ? '' : ' is-unparsed'}\">\n <div class=\"doc-entry-head\">\n ${f.parsed ? `<button class=\"doc-entry-name\" data-doc-open=\"file:${escapeHtml(f.path)}\">${escapeHtml(f.name)}</button>` : `<span class=\"doc-entry-name\">${escapeHtml(f.name)}</span>`}\n <span class=\"doc-entry-facts\">${escapeHtml(factsLine(f.path))}</span>\n </div>\n <p class=\"doc-entry-text\" data-doc-file=\"${escapeHtml(f.path)}\">${escapeHtml(staticDoc(f.path))}</p>\n </div>`).join('')}\n `;\n zone.appendChild(section);\n section.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n\n let text = '';\n const msgs = llm.folderDocMessages({\n repoName: state.scan.name,\n folder: t.path,\n subfolders: t.subfolders,\n files: t.files,\n });\n for await (const delta of streamExplain({ ...settings, messages: msgs, maxTokens: 1600 })) {\n text += delta;\n }\n const parsed = parseFolderDoc(text);\n const folderP = section.querySelector('.doc-folder-brief');\n if (folderP) {\n folderP.textContent = parsed.folderBrief\n || folderStaticDoc(t.path, state.scan, state.facts, node?.dirs.size || 0);\n }\n for (const [name, brief] of parsed.files) {\n const row = t.files.find((f) => f.name === name);\n if (!row) continue;\n const el = section.querySelector(`[data-doc-file=\"${CSS.escape(row.path)}\"]`);\n if (el) el.textContent = brief;\n }\n }\n if (note) note.textContent = `Written by ${settings.model} from the real import graph. Press “Regenerate documentation” for a fresh take.`;\n if (btn) btn.textContent = 'Regenerate documentation';\n } catch (err) {\n if (note) note.textContent = 'AI writing stopped: ' + err.message;\n hooks.onToast(err.message);\n } finally {\n state.docs.writing = false;\n if (btn) {\n btn.disabled = false;\n if (btn.textContent === 'writing…') btn.textContent = 'Generate documentation';\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/** Element types for the app shell and view templates. */
|
|
2
|
+
export interface AppElements {
|
|
3
|
+
reviewView: HTMLElement;
|
|
4
|
+
cancelScanBtn: HTMLButtonElement;
|
|
5
|
+
scanProgress: HTMLProgressElement;
|
|
6
|
+
inspTitle: HTMLElement;
|
|
7
|
+
'aboutRemote': HTMLElement;
|
|
8
|
+
'aboutView': HTMLElement;
|
|
9
|
+
'aiDrawBtn': HTMLButtonElement;
|
|
10
|
+
'aiExplainBtn': HTMLButtonElement;
|
|
11
|
+
'analysisView': HTMLElement;
|
|
12
|
+
'askBtn': HTMLButtonElement;
|
|
13
|
+
'askInput': HTMLInputElement;
|
|
14
|
+
'blameGutter': HTMLElement;
|
|
15
|
+
'blastDesc': HTMLElement;
|
|
16
|
+
'blastMetric': HTMLElement;
|
|
17
|
+
'blastRadiusBox': HTMLElement;
|
|
18
|
+
'brandNote': HTMLElement;
|
|
19
|
+
'canvas': HTMLElement;
|
|
20
|
+
'canvasContent': HTMLElement;
|
|
21
|
+
'canvasEmpty': HTMLElement;
|
|
22
|
+
'codeAlt': HTMLElement;
|
|
23
|
+
'codeHead': HTMLElement;
|
|
24
|
+
'codeLinks': HTMLElement;
|
|
25
|
+
'codeMonaco': HTMLElement;
|
|
26
|
+
'codeTabContainer': HTMLElement;
|
|
27
|
+
'codeView': HTMLElement;
|
|
28
|
+
'copyMermaidBtn': HTMLButtonElement;
|
|
29
|
+
'creditsBar': HTMLElement;
|
|
30
|
+
'creditsBarRemove': HTMLButtonElement;
|
|
31
|
+
'creditsHide': HTMLButtonElement;
|
|
32
|
+
'creditsRemove': HTMLButtonElement;
|
|
33
|
+
'creditsShow': HTMLButtonElement;
|
|
34
|
+
'crumbs': HTMLElement;
|
|
35
|
+
'demoBtn': HTMLButtonElement;
|
|
36
|
+
'depthSelect': HTMLSelectElement;
|
|
37
|
+
'diffBaseSelect': HTMLSelectElement;
|
|
38
|
+
'diffFilesList': HTMLElement;
|
|
39
|
+
'diffHeadSelect': HTMLSelectElement;
|
|
40
|
+
'diffModeSplit': HTMLButtonElement;
|
|
41
|
+
'diffModeUnified': HTMLButtonElement;
|
|
42
|
+
'diffRunBtn': HTMLButtonElement;
|
|
43
|
+
'diffSummaryChip': HTMLElement;
|
|
44
|
+
'diffView': HTMLElement;
|
|
45
|
+
'diffViewerMain': HTMLElement;
|
|
46
|
+
'doc-top': HTMLElement;
|
|
47
|
+
'docAiNote': HTMLElement;
|
|
48
|
+
'docAskInput': HTMLInputElement;
|
|
49
|
+
'docGenBtn': HTMLButtonElement;
|
|
50
|
+
'docGenZone': HTMLElement;
|
|
51
|
+
'docOverview': HTMLElement;
|
|
52
|
+
'docReadme': HTMLElement;
|
|
53
|
+
'docToc': HTMLElement;
|
|
54
|
+
'docView': HTMLElement;
|
|
55
|
+
'drawerClose': HTMLButtonElement;
|
|
56
|
+
'drawerScrim': HTMLElement;
|
|
57
|
+
'explorer': HTMLElement;
|
|
58
|
+
'fileSidebar': HTMLElement;
|
|
59
|
+
'fileTree': HTMLElement;
|
|
60
|
+
'fitBtn': HTMLButtonElement;
|
|
61
|
+
'footCredit': HTMLElement;
|
|
62
|
+
'gitForm': HTMLFormElement;
|
|
63
|
+
'gitInput': HTMLInputElement;
|
|
64
|
+
'graphCanvas': HTMLCanvasElement;
|
|
65
|
+
'graphControls': HTMLElement;
|
|
66
|
+
'graphFit': HTMLButtonElement;
|
|
67
|
+
'graphReset': HTMLButtonElement;
|
|
68
|
+
'graphSearchInput': HTMLInputElement;
|
|
69
|
+
'graphTooltip': HTMLElement;
|
|
70
|
+
'graphView': HTMLElement;
|
|
71
|
+
'graphZoomIn': HTMLButtonElement;
|
|
72
|
+
'graphZoomOut': HTMLButtonElement;
|
|
73
|
+
'heatmapCanvas': HTMLCanvasElement;
|
|
74
|
+
'heatmapTooltip': HTMLElement;
|
|
75
|
+
'heatmapView': HTMLElement;
|
|
76
|
+
'insightsView': HTMLElement;
|
|
77
|
+
'inspBack': HTMLButtonElement;
|
|
78
|
+
'inspExplain': HTMLElement;
|
|
79
|
+
'inspLists': HTMLElement;
|
|
80
|
+
'inspPath': HTMLElement;
|
|
81
|
+
'inspRole': HTMLElement;
|
|
82
|
+
'inspSecurityTools': HTMLElement;
|
|
83
|
+
'inspStats': HTMLElement;
|
|
84
|
+
'inspector': HTMLElement;
|
|
85
|
+
'inspectorBody': HTMLElement;
|
|
86
|
+
'inspectorEmpty': HTMLElement;
|
|
87
|
+
'landing': HTMLElement;
|
|
88
|
+
'landingAbout': HTMLElement;
|
|
89
|
+
'landingError': HTMLElement;
|
|
90
|
+
'landingFoot': HTMLElement;
|
|
91
|
+
'landingStatus': HTMLElement;
|
|
92
|
+
'mcpBtn': HTMLButtonElement;
|
|
93
|
+
'mcpBtnLabel': HTMLElement;
|
|
94
|
+
'mcpClose': HTMLButtonElement;
|
|
95
|
+
'mcpCommandInput': HTMLInputElement;
|
|
96
|
+
'mcpConfig': HTMLElement;
|
|
97
|
+
'mcpConfigBlock': HTMLElement;
|
|
98
|
+
'mcpCopy': HTMLButtonElement;
|
|
99
|
+
'mcpDot': HTMLElement;
|
|
100
|
+
'mcpDrawer': HTMLElement;
|
|
101
|
+
'mcpPanelDot': HTMLElement;
|
|
102
|
+
'mcpPanelState': HTMLElement;
|
|
103
|
+
'mcpScrim': HTMLElement;
|
|
104
|
+
'mcpStart': HTMLButtonElement;
|
|
105
|
+
'mcpStateRow': HTMLElement;
|
|
106
|
+
'mcpStatus': HTMLElement;
|
|
107
|
+
'mcpStop': HTMLButtonElement;
|
|
108
|
+
'mcpTabJson': HTMLButtonElement;
|
|
109
|
+
'mcpTabToml': HTMLButtonElement;
|
|
110
|
+
'mcpToolsHint': HTMLElement;
|
|
111
|
+
'mmToggleBtn': HTMLButtonElement;
|
|
112
|
+
'mobileDetailsBtn': HTMLButtonElement;
|
|
113
|
+
'mobileDetailsClose': HTMLButtonElement;
|
|
114
|
+
'mobileFilesBtn': HTMLButtonElement;
|
|
115
|
+
'mobileFilesClose': HTMLButtonElement;
|
|
116
|
+
'mobilePanelScrim': HTMLButtonElement;
|
|
117
|
+
'modeSwitch': HTMLElement;
|
|
118
|
+
'newRepoBtn': HTMLButtonElement;
|
|
119
|
+
'nodeFilter': HTMLInputElement;
|
|
120
|
+
'pathForm': HTMLFormElement;
|
|
121
|
+
'pathInput': HTMLInputElement;
|
|
122
|
+
'pickBtn': HTMLButtonElement;
|
|
123
|
+
'pickCard': HTMLElement;
|
|
124
|
+
'repoChip': HTMLElement;
|
|
125
|
+
'saveSettings': HTMLButtonElement;
|
|
126
|
+
'sbomSearchInput': HTMLInputElement;
|
|
127
|
+
'sbomTable': HTMLElement;
|
|
128
|
+
'sbomTableBody': HTMLElement;
|
|
129
|
+
'sbomView': HTMLElement;
|
|
130
|
+
'searchOverlay': HTMLElement;
|
|
131
|
+
'searchResultList': HTMLElement;
|
|
132
|
+
'searchTriggerBtn': HTMLButtonElement;
|
|
133
|
+
'serverBtn': HTMLButtonElement;
|
|
134
|
+
'serverClose': HTMLButtonElement;
|
|
135
|
+
'serverDrawer': HTMLElement;
|
|
136
|
+
'serverModeNote': HTMLElement;
|
|
137
|
+
'serverScrim': HTMLElement;
|
|
138
|
+
'setApiKey': HTMLInputElement;
|
|
139
|
+
'setBaseUrl': HTMLInputElement;
|
|
140
|
+
'setModel': HTMLInputElement;
|
|
141
|
+
'settingsBtn': HTMLButtonElement;
|
|
142
|
+
'settingsDrawer': HTMLElement;
|
|
143
|
+
'settingsStatus': HTMLElement;
|
|
144
|
+
'srvAutoOpen': HTMLInputElement;
|
|
145
|
+
'srvConfigPath': HTMLElement;
|
|
146
|
+
'srvCopyKey': HTMLButtonElement;
|
|
147
|
+
'srvDomain': HTMLInputElement;
|
|
148
|
+
'srvDomainField': HTMLElement;
|
|
149
|
+
'srvEmail': HTMLInputElement;
|
|
150
|
+
'srvFreshKey': HTMLInputElement;
|
|
151
|
+
'srvFreshKeyRow': HTMLElement;
|
|
152
|
+
'srvHost': HTMLInputElement;
|
|
153
|
+
'srvHttps': HTMLInputElement;
|
|
154
|
+
'srvHttpsField': HTMLElement;
|
|
155
|
+
'srvHttpsStatus': HTMLElement;
|
|
156
|
+
'srvKeyHint': HTMLElement;
|
|
157
|
+
'srvKeyMasked': HTMLInputElement;
|
|
158
|
+
'srvKeySection': HTMLElement;
|
|
159
|
+
'srvLogout': HTMLButtonElement;
|
|
160
|
+
'srvMode': HTMLSelectElement;
|
|
161
|
+
'srvName': HTMLInputElement;
|
|
162
|
+
'srvPort': HTMLInputElement;
|
|
163
|
+
'srvRotate': HTMLButtonElement;
|
|
164
|
+
'srvSave': HTMLButtonElement;
|
|
165
|
+
'srvStatus': HTMLElement;
|
|
166
|
+
'srvTunnelCloudflare': HTMLInputElement;
|
|
167
|
+
'srvTunnelCloudflareStatus': HTMLElement;
|
|
168
|
+
'srvTunnelTailscale': HTMLInputElement;
|
|
169
|
+
'srvTunnelTailscaleStatus': HTMLElement;
|
|
170
|
+
'stackZone': HTMLElement;
|
|
171
|
+
'stageFilters': HTMLElement;
|
|
172
|
+
'stageFoot': HTMLElement;
|
|
173
|
+
'svgBtn': HTMLButtonElement;
|
|
174
|
+
'testSettings': HTMLButtonElement;
|
|
175
|
+
'testsToggle': HTMLButtonElement;
|
|
176
|
+
'themeBtn': HTMLButtonElement;
|
|
177
|
+
'toast': HTMLElement;
|
|
178
|
+
'tourCount': HTMLElement;
|
|
179
|
+
'tourExit': HTMLButtonElement;
|
|
180
|
+
'tourNext': HTMLButtonElement;
|
|
181
|
+
'tourPrev': HTMLButtonElement;
|
|
182
|
+
'tourTitle': HTMLElement;
|
|
183
|
+
'tourbar': HTMLElement;
|
|
184
|
+
'treeFilter': HTMLInputElement;
|
|
185
|
+
'viewTabs': HTMLElement;
|
|
186
|
+
'workflowsView': HTMLElement;
|
|
187
|
+
}
|
|
188
|
+
/** Delegated events may originate from a non-element node. */
|
|
189
|
+
export declare function eventElement(event: Event): HTMLElement | null;
|
package/public/js/dom.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.js","sourceRoot":"","sources":["../../src/public/js/dom.ts"],"names":[],"mappings":"AA4LA,8DAA8D;AAC9D,MAAM,UAAU,YAAY,CAAC,KAAY;IACvC,OAAO,KAAK,CAAC,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACnE,CAAC","sourcesContent":["/** Element types for the app shell and view templates. */\nexport interface AppElements {\n reviewView: HTMLElement;\n cancelScanBtn: HTMLButtonElement;\n scanProgress: HTMLProgressElement;\n inspTitle: HTMLElement;\n 'aboutRemote': HTMLElement;\n 'aboutView': HTMLElement;\n 'aiDrawBtn': HTMLButtonElement;\n 'aiExplainBtn': HTMLButtonElement;\n 'analysisView': HTMLElement;\n 'askBtn': HTMLButtonElement;\n 'askInput': HTMLInputElement;\n 'blameGutter': HTMLElement;\n 'blastDesc': HTMLElement;\n 'blastMetric': HTMLElement;\n 'blastRadiusBox': HTMLElement;\n 'brandNote': HTMLElement;\n 'canvas': HTMLElement;\n 'canvasContent': HTMLElement;\n 'canvasEmpty': HTMLElement;\n 'codeAlt': HTMLElement;\n 'codeHead': HTMLElement;\n 'codeLinks': HTMLElement;\n 'codeMonaco': HTMLElement;\n 'codeTabContainer': HTMLElement;\n 'codeView': HTMLElement;\n 'copyMermaidBtn': HTMLButtonElement;\n 'creditsBar': HTMLElement;\n 'creditsBarRemove': HTMLButtonElement;\n 'creditsHide': HTMLButtonElement;\n 'creditsRemove': HTMLButtonElement;\n 'creditsShow': HTMLButtonElement;\n 'crumbs': HTMLElement;\n 'demoBtn': HTMLButtonElement;\n 'depthSelect': HTMLSelectElement;\n 'diffBaseSelect': HTMLSelectElement;\n 'diffFilesList': HTMLElement;\n 'diffHeadSelect': HTMLSelectElement;\n 'diffModeSplit': HTMLButtonElement;\n 'diffModeUnified': HTMLButtonElement;\n 'diffRunBtn': HTMLButtonElement;\n 'diffSummaryChip': HTMLElement;\n 'diffView': HTMLElement;\n 'diffViewerMain': HTMLElement;\n 'doc-top': HTMLElement;\n 'docAiNote': HTMLElement;\n 'docAskInput': HTMLInputElement;\n 'docGenBtn': HTMLButtonElement;\n 'docGenZone': HTMLElement;\n 'docOverview': HTMLElement;\n 'docReadme': HTMLElement;\n 'docToc': HTMLElement;\n 'docView': HTMLElement;\n 'drawerClose': HTMLButtonElement;\n 'drawerScrim': HTMLElement;\n 'explorer': HTMLElement;\n 'fileSidebar': HTMLElement;\n 'fileTree': HTMLElement;\n 'fitBtn': HTMLButtonElement;\n 'footCredit': HTMLElement;\n 'gitForm': HTMLFormElement;\n 'gitInput': HTMLInputElement;\n 'graphCanvas': HTMLCanvasElement;\n 'graphControls': HTMLElement;\n 'graphFit': HTMLButtonElement;\n 'graphReset': HTMLButtonElement;\n 'graphSearchInput': HTMLInputElement;\n 'graphTooltip': HTMLElement;\n 'graphView': HTMLElement;\n 'graphZoomIn': HTMLButtonElement;\n 'graphZoomOut': HTMLButtonElement;\n 'heatmapCanvas': HTMLCanvasElement;\n 'heatmapTooltip': HTMLElement;\n 'heatmapView': HTMLElement;\n 'insightsView': HTMLElement;\n 'inspBack': HTMLButtonElement;\n 'inspExplain': HTMLElement;\n 'inspLists': HTMLElement;\n 'inspPath': HTMLElement;\n 'inspRole': HTMLElement;\n 'inspSecurityTools': HTMLElement;\n 'inspStats': HTMLElement;\n 'inspector': HTMLElement;\n 'inspectorBody': HTMLElement;\n 'inspectorEmpty': HTMLElement;\n 'landing': HTMLElement;\n 'landingAbout': HTMLElement;\n 'landingError': HTMLElement;\n 'landingFoot': HTMLElement;\n 'landingStatus': HTMLElement;\n 'mcpBtn': HTMLButtonElement;\n 'mcpBtnLabel': HTMLElement;\n 'mcpClose': HTMLButtonElement;\n 'mcpCommandInput': HTMLInputElement;\n 'mcpConfig': HTMLElement;\n 'mcpConfigBlock': HTMLElement;\n 'mcpCopy': HTMLButtonElement;\n 'mcpDot': HTMLElement;\n 'mcpDrawer': HTMLElement;\n 'mcpPanelDot': HTMLElement;\n 'mcpPanelState': HTMLElement;\n 'mcpScrim': HTMLElement;\n 'mcpStart': HTMLButtonElement;\n 'mcpStateRow': HTMLElement;\n 'mcpStatus': HTMLElement;\n 'mcpStop': HTMLButtonElement;\n 'mcpTabJson': HTMLButtonElement;\n 'mcpTabToml': HTMLButtonElement;\n 'mcpToolsHint': HTMLElement;\n 'mmToggleBtn': HTMLButtonElement;\n 'mobileDetailsBtn': HTMLButtonElement;\n 'mobileDetailsClose': HTMLButtonElement;\n 'mobileFilesBtn': HTMLButtonElement;\n 'mobileFilesClose': HTMLButtonElement;\n 'mobilePanelScrim': HTMLButtonElement;\n 'modeSwitch': HTMLElement;\n 'newRepoBtn': HTMLButtonElement;\n 'nodeFilter': HTMLInputElement;\n 'pathForm': HTMLFormElement;\n 'pathInput': HTMLInputElement;\n 'pickBtn': HTMLButtonElement;\n 'pickCard': HTMLElement;\n 'repoChip': HTMLElement;\n 'saveSettings': HTMLButtonElement;\n 'sbomSearchInput': HTMLInputElement;\n 'sbomTable': HTMLElement;\n 'sbomTableBody': HTMLElement;\n 'sbomView': HTMLElement;\n 'searchOverlay': HTMLElement;\n 'searchResultList': HTMLElement;\n 'searchTriggerBtn': HTMLButtonElement;\n 'serverBtn': HTMLButtonElement;\n 'serverClose': HTMLButtonElement;\n 'serverDrawer': HTMLElement;\n 'serverModeNote': HTMLElement;\n 'serverScrim': HTMLElement;\n 'setApiKey': HTMLInputElement;\n 'setBaseUrl': HTMLInputElement;\n 'setModel': HTMLInputElement;\n 'settingsBtn': HTMLButtonElement;\n 'settingsDrawer': HTMLElement;\n 'settingsStatus': HTMLElement;\n 'srvAutoOpen': HTMLInputElement;\n 'srvConfigPath': HTMLElement;\n 'srvCopyKey': HTMLButtonElement;\n 'srvDomain': HTMLInputElement;\n 'srvDomainField': HTMLElement;\n 'srvEmail': HTMLInputElement;\n 'srvFreshKey': HTMLInputElement;\n 'srvFreshKeyRow': HTMLElement;\n 'srvHost': HTMLInputElement;\n 'srvHttps': HTMLInputElement;\n 'srvHttpsField': HTMLElement;\n 'srvHttpsStatus': HTMLElement;\n 'srvKeyHint': HTMLElement;\n 'srvKeyMasked': HTMLInputElement;\n 'srvKeySection': HTMLElement;\n 'srvLogout': HTMLButtonElement;\n 'srvMode': HTMLSelectElement;\n 'srvName': HTMLInputElement;\n 'srvPort': HTMLInputElement;\n 'srvRotate': HTMLButtonElement;\n 'srvSave': HTMLButtonElement;\n 'srvStatus': HTMLElement;\n 'srvTunnelCloudflare': HTMLInputElement;\n 'srvTunnelCloudflareStatus': HTMLElement;\n 'srvTunnelTailscale': HTMLInputElement;\n 'srvTunnelTailscaleStatus': HTMLElement;\n 'stackZone': HTMLElement;\n 'stageFilters': HTMLElement;\n 'stageFoot': HTMLElement;\n 'svgBtn': HTMLButtonElement;\n 'testSettings': HTMLButtonElement;\n 'testsToggle': HTMLButtonElement;\n 'themeBtn': HTMLButtonElement;\n 'toast': HTMLElement;\n 'tourCount': HTMLElement;\n 'tourExit': HTMLButtonElement;\n 'tourNext': HTMLButtonElement;\n 'tourPrev': HTMLButtonElement;\n 'tourTitle': HTMLElement;\n 'tourbar': HTMLElement;\n 'treeFilter': HTMLInputElement;\n 'viewTabs': HTMLElement;\n 'workflowsView': HTMLElement;\n}\n\n/** Delegated events may originate from a non-element node. */\nexport function eventElement(event: Event): HTMLElement | null {\n return event.target instanceof HTMLElement ? event.target : null;\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BrowserDirectoryHandle } from '../browser.js';
|
|
2
|
+
import type { FileSource } from '../../shared/contracts.js';
|
|
3
|
+
export declare function canPickFolder(): boolean;
|
|
4
|
+
export declare function pickDirectory(): Promise<BrowserDirectoryHandle>;
|
|
5
|
+
export declare function browserFileSource(rootHandle: BrowserDirectoryHandle): FileSource;
|
|
@@ -1,47 +1,39 @@
|
|
|
1
|
-
//
|
|
2
|
-
// alive after the scan so the AI-explain feature can re-read individual
|
|
3
|
-
// files on demand. Chromium only — the caller feature-detects first.
|
|
4
|
-
|
|
1
|
+
// Browser folder handles stay in this tab and can be reused to preview source.
|
|
5
2
|
export function canPickFolder() {
|
|
6
|
-
|
|
3
|
+
return typeof window.showDirectoryPicker === 'function';
|
|
7
4
|
}
|
|
8
|
-
|
|
9
5
|
export async function pickDirectory() {
|
|
10
|
-
|
|
6
|
+
if (!window.showDirectoryPicker)
|
|
7
|
+
throw new Error('This browser cannot pick folders.');
|
|
8
|
+
return window.showDirectoryPicker({ mode: 'read' });
|
|
11
9
|
}
|
|
12
|
-
|
|
13
10
|
export function browserFileSource(rootHandle) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (file.size > 400 * 1024) throw new Error('File too large to read');
|
|
42
|
-
return file.text();
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
return source;
|
|
11
|
+
const handles = new Map([['', rootHandle]]);
|
|
12
|
+
return {
|
|
13
|
+
kind: 'browser',
|
|
14
|
+
root: rootHandle.name,
|
|
15
|
+
name: rootHandle.name,
|
|
16
|
+
async list(directory) {
|
|
17
|
+
const handle = handles.get(directory);
|
|
18
|
+
if (!handle || handle.kind !== 'directory')
|
|
19
|
+
throw new Error('No directory handle for ' + directory);
|
|
20
|
+
const entries = [];
|
|
21
|
+
for await (const [name, child] of handle.entries()) {
|
|
22
|
+
const path = directory ? directory + '/' + name : name;
|
|
23
|
+
handles.set(path, child);
|
|
24
|
+
entries.push({ name, path, type: child.kind === 'directory' ? 'dir' : 'file' });
|
|
25
|
+
}
|
|
26
|
+
return entries;
|
|
27
|
+
},
|
|
28
|
+
async read(path) {
|
|
29
|
+
const handle = handles.get(path);
|
|
30
|
+
if (!handle || handle.kind !== 'file')
|
|
31
|
+
throw new Error('No file handle for ' + path);
|
|
32
|
+
const file = await handle.getFile();
|
|
33
|
+
if (file.size > 10 * 1024 * 1024)
|
|
34
|
+
throw new Error('File too large to read');
|
|
35
|
+
return file.text();
|
|
36
|
+
},
|
|
37
|
+
};
|
|
47
38
|
}
|
|
39
|
+
//# sourceMappingURL=fileSourceBrowser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileSourceBrowser.js","sourceRoot":"","sources":["../../src/public/js/fileSourceBrowser.ts"],"names":[],"mappings":"AAGA,+EAA+E;AAC/E,MAAM,UAAU,aAAa;IAC3B,OAAO,OAAO,MAAM,CAAC,mBAAmB,KAAK,UAAU,CAAC;AAC1D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,IAAI,CAAC,MAAM,CAAC,mBAAmB;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACtF,OAAO,MAAM,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,UAAkC;IAClE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAqD,CAAC,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IAChG,OAAO;QACL,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,IAAI,EAAE,UAAU,CAAC,IAAI;QAErB,KAAK,CAAC,IAAI,CAAC,SAAiB;YAC1B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAAC;YACpG,MAAM,OAAO,GAAgB,EAAE,CAAC;YAChC,IAAI,KAAK,EAAE,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnD,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;gBACvD,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YAClF,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,IAAY;YACrB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM;gBAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,IAAI,CAAC,CAAC;YACrF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5E,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;QACrB,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import type { BrowserDirectoryHandle, BrowserFileHandle } from '../browser.js';\nimport type { FileSource, FileEntry } from '../../shared/contracts.js';\n\n// Browser folder handles stay in this tab and can be reused to preview source.\nexport function canPickFolder(): boolean {\n return typeof window.showDirectoryPicker === 'function';\n}\n\nexport async function pickDirectory(): Promise<BrowserDirectoryHandle> {\n if (!window.showDirectoryPicker) throw new Error('This browser cannot pick folders.');\n return window.showDirectoryPicker({ mode: 'read' });\n}\n\nexport function browserFileSource(rootHandle: BrowserDirectoryHandle): FileSource {\n const handles = new Map<string, BrowserDirectoryHandle | BrowserFileHandle>([['', rootHandle]]);\n return {\n kind: 'browser',\n root: rootHandle.name,\n name: rootHandle.name,\n\n async list(directory: string): Promise<FileEntry[]> {\n const handle = handles.get(directory);\n if (!handle || handle.kind !== 'directory') throw new Error('No directory handle for ' + directory);\n const entries: FileEntry[] = [];\n for await (const [name, child] of handle.entries()) {\n const path = directory ? directory + '/' + name : name;\n handles.set(path, child);\n entries.push({ name, path, type: child.kind === 'directory' ? 'dir' : 'file' });\n }\n return entries;\n },\n\n async read(path: string): Promise<string> {\n const handle = handles.get(path);\n if (!handle || handle.kind !== 'file') throw new Error('No file handle for ' + path);\n const file = await handle.getFile();\n if (file.size > 10 * 1024 * 1024) throw new Error('File too large to read');\n return file.text();\n },\n };\n}\n"]}
|
package/public/js/flameGraph.js
CHANGED
|
@@ -1,75 +1,65 @@
|
|
|
1
1
|
export function initFlameGraph(canvas, options) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
render();
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function getRiskColor(risk) {
|
|
17
|
-
if (risk <= 33) return 'rgb(76, 175, 80)';
|
|
18
|
-
if (risk <= 66) return 'rgb(255, 193, 7)';
|
|
19
|
-
return 'rgb(244, 67, 54)';
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
let rects = [];
|
|
23
|
-
let rootPath = null;
|
|
24
|
-
let breadcrumb = [];
|
|
25
|
-
|
|
26
|
-
function update() {
|
|
27
|
-
render();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
function render() {
|
|
31
|
-
ctx.clearRect(0, 0, width, height);
|
|
32
|
-
if (!layers || layers.length === 0) return;
|
|
33
|
-
|
|
34
|
-
rects = [];
|
|
35
|
-
const layerH = 30;
|
|
36
|
-
const pad = 2;
|
|
37
|
-
|
|
38
|
-
// A real flame graph needs hierarchical data. If layers is just a list of arrays,
|
|
39
|
-
// we'll lay them out horizontally per layer for now.
|
|
40
|
-
|
|
41
|
-
let y = height - layerH;
|
|
42
|
-
|
|
43
|
-
for (let i = layers.length - 1; i >= 0; i--) {
|
|
44
|
-
const layer = layers[i];
|
|
45
|
-
let x = 0;
|
|
46
|
-
let totalWeight = layer.length; // simplified
|
|
47
|
-
|
|
48
|
-
for (const item of layer) {
|
|
49
|
-
const w = (1 / totalWeight) * width;
|
|
50
|
-
const risk = 0; // Find risk from facts if available
|
|
51
|
-
|
|
52
|
-
ctx.fillStyle = getRiskColor(risk);
|
|
53
|
-
ctx.fillRect(x + pad, y + pad, w - pad*2, layerH - pad*2);
|
|
54
|
-
|
|
55
|
-
ctx.fillStyle = '#fff';
|
|
56
|
-
ctx.font = '10px sans-serif';
|
|
57
|
-
const txt = String(item).split('/').pop();
|
|
58
|
-
if (w > 20) ctx.fillText(txt, x + pad + 2, y + 18);
|
|
59
|
-
|
|
60
|
-
rects.push({ x, y, w, h: layerH, path: item });
|
|
61
|
-
x += w;
|
|
62
|
-
}
|
|
63
|
-
y -= layerH;
|
|
2
|
+
const { layers = [], files = [], facts = {} } = options || {};
|
|
3
|
+
const ctx = canvas.getContext('2d');
|
|
4
|
+
let width = canvas.width;
|
|
5
|
+
let height = canvas.height;
|
|
6
|
+
function resize() {
|
|
7
|
+
const rect = canvas.parentElement.getBoundingClientRect();
|
|
8
|
+
canvas.width = rect.width;
|
|
9
|
+
canvas.height = rect.height;
|
|
10
|
+
width = canvas.width;
|
|
11
|
+
height = canvas.height;
|
|
12
|
+
render();
|
|
64
13
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
14
|
+
function getRiskColor(risk) {
|
|
15
|
+
if (risk <= 33)
|
|
16
|
+
return 'rgb(76, 175, 80)';
|
|
17
|
+
if (risk <= 66)
|
|
18
|
+
return 'rgb(255, 193, 7)';
|
|
19
|
+
return 'rgb(244, 67, 54)';
|
|
20
|
+
}
|
|
21
|
+
let rects = [];
|
|
22
|
+
let rootPath = null;
|
|
23
|
+
let breadcrumb = [];
|
|
24
|
+
function update() {
|
|
25
|
+
render();
|
|
26
|
+
}
|
|
27
|
+
function render() {
|
|
28
|
+
ctx.clearRect(0, 0, width, height);
|
|
29
|
+
if (!layers || layers.length === 0)
|
|
30
|
+
return;
|
|
31
|
+
rects = [];
|
|
32
|
+
const layerH = 30;
|
|
33
|
+
const pad = 2;
|
|
34
|
+
// A real flame graph needs hierarchical data. If layers is just a list of arrays,
|
|
35
|
+
// we'll lay them out horizontally per layer for now.
|
|
36
|
+
let y = height - layerH;
|
|
37
|
+
for (let i = layers.length - 1; i >= 0; i--) {
|
|
38
|
+
const layer = layers[i];
|
|
39
|
+
let x = 0;
|
|
40
|
+
let totalWeight = layer.length; // simplified
|
|
41
|
+
for (const item of layer) {
|
|
42
|
+
const w = (1 / totalWeight) * width;
|
|
43
|
+
const risk = 0; // Find risk from facts if available
|
|
44
|
+
ctx.fillStyle = getRiskColor(risk);
|
|
45
|
+
ctx.fillRect(x + pad, y + pad, w - pad * 2, layerH - pad * 2);
|
|
46
|
+
ctx.fillStyle = '#fff';
|
|
47
|
+
ctx.font = '10px sans-serif';
|
|
48
|
+
const txt = String(item).split('/').pop();
|
|
49
|
+
if (w > 20)
|
|
50
|
+
ctx.fillText(txt, x + pad + 2, y + 18);
|
|
51
|
+
rects.push({ x, y, w, h: layerH, path: item });
|
|
52
|
+
x += w;
|
|
53
|
+
}
|
|
54
|
+
y -= layerH;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
window.addEventListener('resize', resize);
|
|
58
|
+
resize();
|
|
59
|
+
return {
|
|
60
|
+
update,
|
|
61
|
+
resize,
|
|
62
|
+
destroy: () => window.removeEventListener('resize', resize)
|
|
63
|
+
};
|
|
75
64
|
}
|
|
65
|
+
//# sourceMappingURL=flameGraph.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flameGraph.js","sourceRoot":"","sources":["../../src/public/js/flameGraph.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAC,MAAM,EAAE,OAAO;IAC5C,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,IAAI,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAE3B,SAAS,MAAM;QACb,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;QAC1D,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC1B,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC5B,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACrB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QACvB,MAAM,EAAE,CAAC;IACX,CAAC;IAED,SAAS,YAAY,CAAC,IAAI;QACxB,IAAI,IAAI,IAAI,EAAE;YAAE,OAAO,kBAAkB,CAAC;QAC1C,IAAI,IAAI,IAAI,EAAE;YAAE,OAAO,kBAAkB,CAAC;QAC1C,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,UAAU,GAAG,EAAE,CAAC;IAEpB,SAAS,MAAM;QACb,MAAM,EAAE,CAAC;IACX,CAAC;IAED,SAAS,MAAM;QACb,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE3C,KAAK,GAAG,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,GAAG,GAAG,CAAC,CAAC;QAEd,kFAAkF;QAClF,qDAAqD;QAErD,IAAI,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;QAExB,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,CAAC;YACV,IAAI,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,aAAa;YAE7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,GAAG,KAAK,CAAC;gBACpC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,oCAAoC;gBAEpD,GAAG,CAAC,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;gBACnC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,GAAC,CAAC,EAAE,MAAM,GAAG,GAAG,GAAC,CAAC,CAAC,CAAC;gBAE1D,GAAG,CAAC,SAAS,GAAG,MAAM,CAAC;gBACvB,GAAG,CAAC,IAAI,GAAG,iBAAiB,CAAC;gBAC7B,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBAC1C,IAAI,CAAC,GAAG,EAAE;oBAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;gBAEnD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/C,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;YACD,CAAC,IAAI,MAAM,CAAC;QACd,CAAC;IACH,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,EAAE,CAAC;IAET,OAAO;QACL,MAAM;QACN,MAAM;QACN,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC;KAC5D,CAAC;AACJ,CAAC","sourcesContent":["export function initFlameGraph(canvas, options) {\n const { layers = [], files = [], facts = {} } = options || {};\n const ctx = canvas.getContext('2d');\n let width = canvas.width;\n let height = canvas.height;\n \n function resize() {\n const rect = canvas.parentElement.getBoundingClientRect();\n canvas.width = rect.width;\n canvas.height = rect.height;\n width = canvas.width;\n height = canvas.height;\n render();\n }\n\n function getRiskColor(risk) {\n if (risk <= 33) return 'rgb(76, 175, 80)';\n if (risk <= 66) return 'rgb(255, 193, 7)';\n return 'rgb(244, 67, 54)';\n }\n\n let rects = [];\n let rootPath = null;\n let breadcrumb = [];\n\n function update() {\n render();\n }\n\n function render() {\n ctx.clearRect(0, 0, width, height);\n if (!layers || layers.length === 0) return;\n\n rects = [];\n const layerH = 30;\n const pad = 2;\n\n // A real flame graph needs hierarchical data. If layers is just a list of arrays,\n // we'll lay them out horizontally per layer for now.\n \n let y = height - layerH;\n \n for (let i = layers.length - 1; i >= 0; i--) {\n const layer = layers[i];\n let x = 0;\n let totalWeight = layer.length; // simplified\n \n for (const item of layer) {\n const w = (1 / totalWeight) * width;\n const risk = 0; // Find risk from facts if available\n \n ctx.fillStyle = getRiskColor(risk);\n ctx.fillRect(x + pad, y + pad, w - pad*2, layerH - pad*2);\n \n ctx.fillStyle = '#fff';\n ctx.font = '10px sans-serif';\n const txt = String(item).split('/').pop();\n if (w > 20) ctx.fillText(txt, x + pad + 2, y + 18);\n \n rects.push({ x, y, w, h: layerH, path: item });\n x += w;\n }\n y -= layerH;\n }\n }\n\n window.addEventListener('resize', resize);\n resize();\n\n return {\n update,\n resize,\n destroy: () => window.removeEventListener('resize', resize)\n };\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function initForceGraph(canvas: any, options?: any): {
|
|
2
|
+
update: (newNodes: any, newEdges: any, newComms: any) => void;
|
|
3
|
+
resize: () => void;
|
|
4
|
+
setActive: (value: boolean) => void;
|
|
5
|
+
fit: () => void;
|
|
6
|
+
reset: () => void;
|
|
7
|
+
search: (q: any) => void;
|
|
8
|
+
highlight: (path: any) => void;
|
|
9
|
+
destroy: () => void;
|
|
10
|
+
};
|