codebase-onboarder 0.6.0 → 1.0.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 +284 -53
- package/bin/build-if-source.js +23 -0
- package/bin/onboarder.js +0 -0
- package/cli/agent/command.d.ts +71 -0
- package/cli/agent/command.js +177 -0
- package/cli/agent/command.js.map +1 -0
- package/cli/agent/config.d.ts +31 -0
- package/cli/agent/config.js +98 -0
- package/cli/agent/config.js.map +1 -0
- package/cli/agent/contracts.d.ts +77 -0
- package/cli/agent/contracts.js +2 -0
- package/cli/agent/contracts.js.map +1 -0
- package/cli/agent/files.d.ts +19 -0
- package/cli/agent/files.js +109 -0
- package/cli/agent/files.js.map +1 -0
- package/cli/agent/gitSource.d.ts +18 -0
- package/cli/agent/gitSource.js +69 -0
- package/cli/agent/gitSource.js.map +1 -0
- package/cli/agent/github.d.ts +21 -0
- package/cli/agent/github.js +94 -0
- package/cli/agent/github.js.map +1 -0
- package/cli/agent/mcp.d.ts +15 -0
- package/cli/agent/mcp.js +78 -0
- package/cli/agent/mcp.js.map +1 -0
- package/cli/agent/process.d.ts +18 -0
- package/cli/agent/process.js +118 -0
- package/cli/agent/process.js.map +1 -0
- package/cli/agent/protocol.d.ts +3 -0
- package/cli/agent/protocol.js +26 -0
- package/cli/agent/protocol.js.map +1 -0
- package/cli/agent/runner.d.ts +34 -0
- package/cli/agent/runner.js +152 -0
- package/cli/agent/runner.js.map +1 -0
- package/cli/agent/stdio.d.ts +1 -0
- package/cli/agent/stdio.js +62 -0
- package/cli/agent/stdio.js.map +1 -0
- package/cli/agent/tools.d.ts +7 -0
- package/cli/agent/tools.js +201 -0
- package/cli/agent/tools.js.map +1 -0
- package/cli/chat/app.d.ts +16 -0
- package/cli/chat/app.js +345 -0
- package/cli/chat/app.js.map +1 -0
- package/cli/chat/commands.d.ts +11 -0
- package/cli/chat/commands.js +120 -0
- package/cli/chat/commands.js.map +1 -0
- package/cli/chat/composer.d.ts +75 -0
- package/cli/chat/composer.js +467 -0
- package/cli/chat/composer.js.map +1 -0
- package/cli/chat/controller.d.ts +60 -0
- package/cli/chat/controller.js +393 -0
- package/cli/chat/controller.js.map +1 -0
- package/cli/chat/logo.d.ts +3 -0
- package/cli/chat/logo.js +14 -0
- package/cli/chat/logo.js.map +1 -0
- package/cli/chat/models.d.ts +18 -0
- package/cli/chat/models.js +88 -0
- package/cli/chat/models.js.map +1 -0
- package/cli/chat/profile.d.ts +5 -0
- package/cli/chat/profile.js +98 -0
- package/cli/chat/profile.js.map +1 -0
- package/cli/chat/render.d.ts +40 -0
- package/cli/chat/render.js +259 -0
- package/cli/chat/render.js.map +1 -0
- package/cli/chat/screen.d.ts +26 -0
- package/cli/chat/screen.js +117 -0
- package/cli/chat/screen.js.map +1 -0
- package/cli/chat/source.d.ts +29 -0
- package/cli/chat/source.js +116 -0
- package/cli/chat/source.js.map +1 -0
- package/cli/chat/store.d.ts +43 -0
- package/cli/chat/store.js +94 -0
- package/cli/chat/store.js.map +1 -0
- package/cli/chat/text.d.ts +4 -0
- package/cli/chat/text.js +27 -0
- package/cli/chat/text.js.map +1 -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 +2 -0
- package/cli/explorer/app.js +404 -314
- 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 +373 -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 +251 -164
- 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/docs/HERMES_RESEARCH.md +51 -0
- package/package.json +16 -4
- package/public/app.d.ts +1 -0
- package/public/app.js +1133 -1011
- package/public/app.js.map +1 -0
- package/public/assets/onboarder-mark.svg +11 -0
- package/public/browser.d.ts +71 -0
- package/public/browser.js +2 -0
- package/public/browser.js.map +1 -0
- package/public/index.html +54 -20
- 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 +4 -0
- package/public/js/aiDraft.js +166 -125
- 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 +29 -0
- package/public/js/api.js +198 -166
- 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 +9 -0
- package/public/js/diagramPane.js +138 -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 +197 -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 +115 -0
- package/public/js/llm.js +246 -278
- 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 +29 -28
- 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 +188 -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/hermesChat.d.ts +13 -0
- package/server/hermesChat.js +145 -0
- package/server/hermesChat.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 +6 -0
- package/server/http.js +27 -34
- 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 +167 -180
- 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 +195 -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 +50 -46
- 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
package/public/js/aiDraft.js
CHANGED
|
@@ -8,156 +8,197 @@
|
|
|
8
8
|
// Three states for one button: draw, drawn (flip back to static), and drawing.
|
|
9
9
|
// Nothing here is required for the app to work; with no endpoint configured the
|
|
10
10
|
// button opens the settings drawer and says so.
|
|
11
|
-
|
|
12
|
-
import { extractAIDiagram, matchNodeText } from '/shared/diagram/aiMermaid.js';
|
|
11
|
+
import { extractAIDiagram, matchNodeText } from '../../shared/diagram/aiMermaid.js';
|
|
13
12
|
import { streamExplain } from './api.js';
|
|
14
13
|
import { state, aiViewKey } from './state.js';
|
|
15
14
|
import { gatherFileContext } from './repoFiles.js';
|
|
16
|
-
import {
|
|
17
|
-
diagramTarget, externalsFor, overviewFacts, layersFacts, servicesFacts,
|
|
18
|
-
fileFacts, tourStopFacts, folderFacts,
|
|
19
|
-
} from '/shared/diagram/aiFacts.js';
|
|
15
|
+
import { diagramTarget, externalsFor, overviewFacts, layersFacts, servicesFacts, fileFacts, tourStopFacts, folderFacts, } from '../../shared/diagram/aiFacts.js';
|
|
20
16
|
import * as llm from './llm.js';
|
|
21
|
-
|
|
22
17
|
const MAX_TOKENS = 4000;
|
|
23
|
-
const PROGRESS_MS =
|
|
24
|
-
|
|
18
|
+
const PROGRESS_MS = 1000;
|
|
25
19
|
let btn = null;
|
|
26
20
|
let statusEl = null;
|
|
27
21
|
let nodeHost = null;
|
|
22
|
+
let pending = null;
|
|
28
23
|
let hooks = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
onRender: (..._args) => { },
|
|
25
|
+
onValidate: async (_source) => { },
|
|
26
|
+
onOpenFile: (..._args) => { },
|
|
27
|
+
onOpenSettings: (..._args) => { },
|
|
28
|
+
onToast: (..._args) => { },
|
|
33
29
|
};
|
|
34
|
-
|
|
35
30
|
export function initAiDraft(options) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
31
|
+
btn = options.host;
|
|
32
|
+
statusEl = options.statusEl;
|
|
33
|
+
nodeHost = options.nodeHost;
|
|
34
|
+
hooks = { ...hooks, ...options };
|
|
35
|
+
btn.addEventListener('click', () => {
|
|
36
|
+
if (pending) {
|
|
37
|
+
stopAiDraft();
|
|
38
|
+
updateAiBtn();
|
|
39
|
+
hooks.onToast('Sketch cancelled.');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const key = aiViewKey();
|
|
43
|
+
if (state.aiActiveKey === key) {
|
|
44
|
+
state.aiActiveKey = null; // back to static
|
|
45
|
+
updateAiBtn(key);
|
|
46
|
+
hooks.onRender();
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (state.aiDiagrams[key]) {
|
|
50
|
+
state.aiActiveKey = key; // cached draft, instant
|
|
51
|
+
updateAiBtn(key);
|
|
52
|
+
hooks.onRender();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
return drawWithAI(key);
|
|
56
|
+
});
|
|
55
57
|
}
|
|
56
|
-
|
|
57
58
|
// Which of the three things the button currently offers. Called on every canvas
|
|
58
59
|
// render, because the answer depends on the view.
|
|
59
60
|
export function updateAiBtn(key = aiViewKey()) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
61
|
+
if (pending && (pending.scan !== state.scan || pending.key !== key))
|
|
62
|
+
stopAiDraft();
|
|
63
|
+
btn.hidden = state.view === 'docs' || state.view === 'about'
|
|
64
|
+
|| (state.view === 'atlas' && !state.atlasOpen);
|
|
65
|
+
if (pending) {
|
|
66
|
+
btn.textContent = 'Cancel sketch';
|
|
67
|
+
btn.title = 'Stop generating this sketch';
|
|
68
|
+
btn.setAttribute('aria-busy', 'true');
|
|
69
|
+
}
|
|
70
|
+
else if (state.aiActiveKey === key) {
|
|
71
|
+
btn.textContent = 'Static';
|
|
72
|
+
btn.title = 'Back to the static diagram';
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
btn.textContent = state.aiDiagrams[key] ? 'AI sketch ✓' : 'AI sketch';
|
|
76
|
+
btn.title = 'Ask the AI to draw this view';
|
|
77
|
+
}
|
|
78
|
+
if (!pending)
|
|
79
|
+
btn.removeAttribute('aria-busy');
|
|
80
|
+
}
|
|
81
|
+
export function stopAiDraft() {
|
|
82
|
+
pending?.controller.abort();
|
|
83
|
+
pending = null;
|
|
84
|
+
if (statusEl)
|
|
85
|
+
statusEl.hidden = true;
|
|
86
|
+
statusEl?.removeAttribute('aria-busy');
|
|
69
87
|
}
|
|
70
|
-
|
|
71
88
|
// AI nodes carry no stable ids — clicks are matched by label text instead.
|
|
72
89
|
export function wireAIClicks() {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
90
|
+
for (const g of nodeHost.querySelectorAll('g.node')) {
|
|
91
|
+
const path = matchNodeText(g.textContent, state.scan.files);
|
|
92
|
+
if (!path)
|
|
93
|
+
continue;
|
|
94
|
+
g.style.cursor = 'pointer';
|
|
95
|
+
g.addEventListener('click', (event) => {
|
|
96
|
+
event.stopPropagation();
|
|
97
|
+
hooks.onOpenFile(path);
|
|
98
|
+
});
|
|
99
|
+
}
|
|
82
100
|
}
|
|
83
|
-
|
|
84
101
|
async function drawWithAI(key) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
90
|
-
const settings = llm.getSettings();
|
|
91
|
-
btn.disabled = true;
|
|
92
|
-
btn.textContent = 'drawing…';
|
|
93
|
-
statusEl.hidden = false;
|
|
94
|
-
|
|
95
|
-
// Live progress: elapsed time plus how much the model has written so far. A
|
|
96
|
-
// reasoning model can be quiet for half a minute, and a canvas that says
|
|
97
|
-
// nothing is indistinguishable from one that has hung.
|
|
98
|
-
const startedAt = Date.now();
|
|
99
|
-
let received = 0;
|
|
100
|
-
const tick = () => {
|
|
101
|
-
const secs = Math.round((Date.now() - startedAt) / 1000);
|
|
102
|
-
const kb = received >= 1000 ? (received / 1000).toFixed(1) + 'k' : String(received);
|
|
103
|
-
statusEl.textContent = `The AI is sketching this view… ${kb} chars · ${secs}s`;
|
|
104
|
-
};
|
|
105
|
-
tick();
|
|
106
|
-
const progressTimer = setInterval(tick, PROGRESS_MS);
|
|
107
|
-
|
|
108
|
-
try {
|
|
109
|
-
const { kind, facts } = await factsForView();
|
|
110
|
-
const messages = llm.diagramMessages({ repoName: state.scan.name, kind, facts });
|
|
111
|
-
let text = '';
|
|
112
|
-
// Big budget, and no visible thinking where the dialect allows it:
|
|
113
|
-
// reasoning models otherwise spend the whole allowance before a single
|
|
114
|
-
// diagram line appears. Azure rejects that parameter outright.
|
|
115
|
-
const providerOptions = llm.isAzureHost(settings.baseUrl) ? {} : { reasoning: { exclude: true } };
|
|
116
|
-
for await (const delta of streamExplain({ ...settings, messages, maxTokens: MAX_TOKENS, providerOptions })) {
|
|
117
|
-
text += delta;
|
|
118
|
-
received += delta.length;
|
|
102
|
+
if (!llm.isConfigured()) {
|
|
103
|
+
hooks.onOpenSettings();
|
|
104
|
+
hooks.onToast('Choose Hermes or an endpoint in AI connection first.');
|
|
105
|
+
return;
|
|
119
106
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
state.
|
|
124
|
-
statusEl.hidden = true;
|
|
125
|
-
hooks.onRender();
|
|
126
|
-
} catch (err) {
|
|
127
|
-
statusEl.hidden = true;
|
|
128
|
-
hooks.onToast(err.message);
|
|
129
|
-
} finally {
|
|
130
|
-
clearInterval(progressTimer);
|
|
131
|
-
btn.disabled = false;
|
|
107
|
+
if (!state.scan)
|
|
108
|
+
return;
|
|
109
|
+
const settings = llm.getSettings();
|
|
110
|
+
const job = pending = { key, scan: state.scan, controller: new AbortController() };
|
|
132
111
|
updateAiBtn(key);
|
|
133
|
-
|
|
112
|
+
statusEl.hidden = false;
|
|
113
|
+
statusEl.setAttribute('aria-busy', 'true');
|
|
114
|
+
// Live progress: elapsed time plus how much the model has written so far. A
|
|
115
|
+
// reasoning model can be quiet for half a minute, and a canvas that says
|
|
116
|
+
// nothing is indistinguishable from one that has hung.
|
|
117
|
+
const startedAt = Date.now();
|
|
118
|
+
let received = 0;
|
|
119
|
+
const tick = () => {
|
|
120
|
+
if (pending !== job)
|
|
121
|
+
return;
|
|
122
|
+
const secs = Math.round((Date.now() - startedAt) / 1000);
|
|
123
|
+
const kb = received >= 1000 ? (received / 1000).toFixed(1) + 'k' : String(received);
|
|
124
|
+
statusEl.textContent = `${settings.connection === 'hermes' ? 'Hermes' : 'The AI'} is sketching this view… ${kb} chars · ${secs}s`;
|
|
125
|
+
};
|
|
126
|
+
tick();
|
|
127
|
+
const progressTimer = setInterval(tick, PROGRESS_MS);
|
|
128
|
+
try {
|
|
129
|
+
const { kind, facts } = await factsForView();
|
|
130
|
+
job.controller.signal.throwIfAborted();
|
|
131
|
+
const messages = llm.diagramMessages({ repoName: job.scan.name, kind, facts });
|
|
132
|
+
let text = '';
|
|
133
|
+
// Big budget, and no visible thinking where the dialect allows it:
|
|
134
|
+
// reasoning models otherwise spend the whole allowance before a single
|
|
135
|
+
// diagram line appears. Azure rejects that parameter outright.
|
|
136
|
+
const providerOptions = llm.isAzureHost(settings.baseUrl) ? {} : { reasoning: { exclude: true } };
|
|
137
|
+
for await (const delta of streamExplain({ ...settings, messages, maxTokens: MAX_TOKENS, providerOptions, purpose: 'diagram', signal: job.controller.signal })) {
|
|
138
|
+
text += delta;
|
|
139
|
+
received += delta.length;
|
|
140
|
+
if (text.length > 120000)
|
|
141
|
+
throw new Error('The sketch was too large. Try a smaller folder or file.');
|
|
142
|
+
}
|
|
143
|
+
job.controller.signal.throwIfAborted();
|
|
144
|
+
const parsed = extractAIDiagram(text);
|
|
145
|
+
if (!parsed)
|
|
146
|
+
throw new Error('The model answered without a diagram. Try again.');
|
|
147
|
+
try {
|
|
148
|
+
await hooks.onValidate(parsed.body);
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
throw new Error('The AI returned a diagram that could not be drawn. Try again.');
|
|
152
|
+
}
|
|
153
|
+
job.controller.signal.throwIfAborted();
|
|
154
|
+
if (pending !== job || state.scan !== job.scan || aiViewKey() !== key)
|
|
155
|
+
return;
|
|
156
|
+
state.aiDiagrams[key] = { body: parsed.body, caption: parsed.caption };
|
|
157
|
+
state.aiActiveKey = key;
|
|
158
|
+
statusEl.hidden = true;
|
|
159
|
+
await hooks.onRender();
|
|
160
|
+
}
|
|
161
|
+
catch (err) {
|
|
162
|
+
if (pending === job && !job.controller.signal.aborted) {
|
|
163
|
+
statusEl.hidden = true;
|
|
164
|
+
hooks.onToast(err.message);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
clearInterval(progressTimer);
|
|
169
|
+
if (pending === job) {
|
|
170
|
+
pending = null;
|
|
171
|
+
statusEl.removeAttribute('aria-busy');
|
|
172
|
+
updateAiBtn();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
134
175
|
}
|
|
135
|
-
|
|
136
176
|
// Picks the sheet for the current view and fetches the source the file-shaped
|
|
137
177
|
// ones need. The choosing is pure and tested in aiFacts.js; this is the read.
|
|
138
178
|
async function factsForView() {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
179
|
+
const { scan, facts, manifest, patterns } = state;
|
|
180
|
+
const target = diagramTarget(state);
|
|
181
|
+
switch (target.view) {
|
|
182
|
+
case 'map': return overviewFacts(scan, facts);
|
|
183
|
+
case 'patterns': return layersFacts(facts, patterns);
|
|
184
|
+
case 'services': return servicesFacts(scan, manifest);
|
|
185
|
+
case 'tour': {
|
|
186
|
+
const stop = state.tour.stops[state.tour.idx];
|
|
187
|
+
if (!stop)
|
|
188
|
+
return tourStopFacts({ stop: null });
|
|
189
|
+
return tourStopFacts({
|
|
190
|
+
ctx: await gatherFileContext(target.path),
|
|
191
|
+
externals: externalsFor(scan, target.path),
|
|
192
|
+
stop,
|
|
193
|
+
index: state.tour.idx,
|
|
194
|
+
total: state.tour.stops.length,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
case 'file': return fileFacts({
|
|
198
|
+
ctx: await gatherFileContext(target.path),
|
|
199
|
+
externals: externalsFor(scan, target.path),
|
|
200
|
+
});
|
|
201
|
+
default: return folderFacts(scan, facts, target.path);
|
|
156
202
|
}
|
|
157
|
-
case 'file': return fileFacts({
|
|
158
|
-
ctx: await gatherFileContext(target.path),
|
|
159
|
-
externals: externalsFor(scan, target.path),
|
|
160
|
-
});
|
|
161
|
-
default: return folderFacts(scan, facts, target.path);
|
|
162
|
-
}
|
|
163
203
|
}
|
|
204
|
+
//# sourceMappingURL=aiDraft.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aiDraft.js","sourceRoot":"","sources":["../../src/public/js/aiDraft.ts"],"names":[],"mappings":"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","sourcesContent":["// The \"AI draft\" button: ask a model to redraw whatever the canvas is showing.\n//\n// Every view has a static diagram built from the import graph, and that is what\n// loads. This is the optional second opinion — the model gets a fact sheet (see\n// aiFacts.js) and answers with Mermaid, which is cached per view so flipping\n// between the two is instant afterwards.\n//\n// Three states for one button: draw, drawn (flip back to static), and drawing.\n// Nothing here is required for the app to work; with no endpoint configured the\n// button opens the settings drawer and says so.\n\nimport { extractAIDiagram, matchNodeText } from '../../shared/diagram/aiMermaid.js';\nimport { streamExplain } from './api.js';\nimport { state, aiViewKey } from './state.js';\nimport { gatherFileContext } from './repoFiles.js';\nimport {\n diagramTarget, externalsFor, overviewFacts, layersFacts, servicesFacts,\n fileFacts, tourStopFacts, folderFacts,\n} from '../../shared/diagram/aiFacts.js';\nimport * as llm from './llm.js';\n\nconst MAX_TOKENS = 4000;\nconst PROGRESS_MS = 1000;\n\nlet btn = null;\nlet statusEl = null;\nlet nodeHost = null;\nlet pending: { key: string; scan: typeof state.scan; controller: AbortController } | null = null;\nlet hooks = {\n onRender: (..._args: unknown[]) => {},\n onValidate: async (_source: string) => {},\n onOpenFile: (..._args: unknown[]) => {},\n onOpenSettings: (..._args: unknown[]) => {},\n onToast: (..._args: unknown[]) => {},\n};\n\nexport function initAiDraft(options) {\n btn = options.host;\n statusEl = options.statusEl;\n nodeHost = options.nodeHost;\n hooks = { ...hooks, ...options };\n\n btn.addEventListener('click', () => {\n if (pending) { stopAiDraft(); updateAiBtn(); hooks.onToast('Sketch cancelled.'); return; }\n const key = aiViewKey();\n if (state.aiActiveKey === key) {\n state.aiActiveKey = null; // back to static\n updateAiBtn(key);\n hooks.onRender();\n return;\n }\n if (state.aiDiagrams[key]) {\n state.aiActiveKey = key; // cached draft, instant\n updateAiBtn(key);\n hooks.onRender();\n return;\n }\n return drawWithAI(key);\n });\n}\n\n// Which of the three things the button currently offers. Called on every canvas\n// render, because the answer depends on the view.\nexport function updateAiBtn(key = aiViewKey()) {\n if (pending && (pending.scan !== state.scan || pending.key !== key)) stopAiDraft();\n btn.hidden = state.view === 'docs' || state.view === 'about'\n || (state.view === 'atlas' && !state.atlasOpen);\n if (pending) {\n btn.textContent = 'Cancel sketch';\n btn.title = 'Stop generating this sketch';\n btn.setAttribute('aria-busy', 'true');\n } else if (state.aiActiveKey === key) {\n btn.textContent = 'Static';\n btn.title = 'Back to the static diagram';\n } else {\n btn.textContent = state.aiDiagrams[key] ? 'AI sketch ✓' : 'AI sketch';\n btn.title = 'Ask the AI to draw this view';\n }\n if (!pending) btn.removeAttribute('aria-busy');\n}\n\nexport function stopAiDraft() {\n pending?.controller.abort();\n pending = null;\n if (statusEl) statusEl.hidden = true;\n statusEl?.removeAttribute('aria-busy');\n}\n\n// AI nodes carry no stable ids — clicks are matched by label text instead.\nexport function wireAIClicks() {\n for (const g of nodeHost.querySelectorAll('g.node')) {\n const path = matchNodeText(g.textContent, state.scan.files);\n if (!path) continue;\n g.style.cursor = 'pointer';\n g.addEventListener('click', (event) => {\n event.stopPropagation();\n hooks.onOpenFile(path);\n });\n }\n}\n\nasync function drawWithAI(key) {\n if (!llm.isConfigured()) {\n hooks.onOpenSettings();\n hooks.onToast('Choose Hermes or an endpoint in AI connection first.');\n return;\n }\n if (!state.scan) return;\n const settings = llm.getSettings();\n const job = pending = { key, scan: state.scan, controller: new AbortController() };\n updateAiBtn(key);\n statusEl.hidden = false;\n statusEl.setAttribute('aria-busy', 'true');\n\n // Live progress: elapsed time plus how much the model has written so far. A\n // reasoning model can be quiet for half a minute, and a canvas that says\n // nothing is indistinguishable from one that has hung.\n const startedAt = Date.now();\n let received = 0;\n const tick = () => {\n if (pending !== job) return;\n const secs = Math.round((Date.now() - startedAt) / 1000);\n const kb = received >= 1000 ? (received / 1000).toFixed(1) + 'k' : String(received);\n statusEl.textContent = `${settings.connection === 'hermes' ? 'Hermes' : 'The AI'} is sketching this view… ${kb} chars · ${secs}s`;\n };\n tick();\n const progressTimer = setInterval(tick, PROGRESS_MS);\n\n try {\n const { kind, facts } = await factsForView();\n job.controller.signal.throwIfAborted();\n const messages = llm.diagramMessages({ repoName: job.scan.name, kind, facts });\n let text = '';\n // Big budget, and no visible thinking where the dialect allows it:\n // reasoning models otherwise spend the whole allowance before a single\n // diagram line appears. Azure rejects that parameter outright.\n const providerOptions = llm.isAzureHost(settings.baseUrl) ? {} : { reasoning: { exclude: true } };\n for await (const delta of streamExplain({ ...settings, messages, maxTokens: MAX_TOKENS, providerOptions, purpose: 'diagram', signal: job.controller.signal })) {\n text += delta;\n received += delta.length;\n if (text.length > 120000) throw new Error('The sketch was too large. Try a smaller folder or file.');\n }\n job.controller.signal.throwIfAborted();\n const parsed = extractAIDiagram(text);\n if (!parsed) throw new Error('The model answered without a diagram. Try again.');\n try { await hooks.onValidate(parsed.body); }\n catch { throw new Error('The AI returned a diagram that could not be drawn. Try again.'); }\n job.controller.signal.throwIfAborted();\n if (pending !== job || state.scan !== job.scan || aiViewKey() !== key) return;\n state.aiDiagrams[key] = { body: parsed.body, caption: parsed.caption };\n state.aiActiveKey = key;\n statusEl.hidden = true;\n await hooks.onRender();\n } catch (err) {\n if (pending === job && !job.controller.signal.aborted) {\n statusEl.hidden = true;\n hooks.onToast(err.message);\n }\n } finally {\n clearInterval(progressTimer);\n if (pending === job) { pending = null; statusEl.removeAttribute('aria-busy'); updateAiBtn(); }\n }\n}\n\n// Picks the sheet for the current view and fetches the source the file-shaped\n// ones need. The choosing is pure and tested in aiFacts.js; this is the read.\nasync function factsForView() {\n const { scan, facts, manifest, patterns } = state;\n const target = diagramTarget(state);\n\n switch (target.view) {\n case 'map': return overviewFacts(scan, facts);\n case 'patterns': return layersFacts(facts, patterns);\n case 'services': return servicesFacts(scan, manifest);\n case 'tour': {\n const stop = state.tour.stops[state.tour.idx];\n if (!stop) return tourStopFacts({ stop: null });\n return tourStopFacts({\n ctx: await gatherFileContext(target.path),\n externals: externalsFor(scan, target.path),\n stop,\n index: state.tour.idx,\n total: state.tour.stops.length,\n });\n }\n case 'file': return fileFacts({\n ctx: await gatherFileContext(target.path),\n externals: externalsFor(scan, target.path),\n });\n default: return folderFacts(scan, facts, target.path);\n }\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function subscribeAnalysis(listener: any): () => boolean;
|
|
2
|
+
export declare function ensureToolsStatus(force?: boolean): Promise<any>;
|
|
3
|
+
export declare function runDeepAnalysis(options?: Record<string, any>): Promise<any>;
|
|
4
|
+
export declare function installEngine(id: any): Promise<any>;
|
|
5
|
+
export declare function runOutcomeMessage(report: any): string;
|
|
6
|
+
export declare function initAnalysisPanel(options: any): void;
|
|
7
|
+
export declare function renderAnalysisPanel(): void;
|