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
package/public/js/aiDraft.js
CHANGED
|
@@ -8,156 +8,148 @@
|
|
|
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
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
18
|
const PROGRESS_MS = 250;
|
|
24
|
-
|
|
25
19
|
let btn = null;
|
|
26
20
|
let statusEl = null;
|
|
27
21
|
let nodeHost = null;
|
|
28
22
|
let hooks = {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
23
|
+
onRender: (..._args) => { },
|
|
24
|
+
onOpenFile: (..._args) => { },
|
|
25
|
+
onOpenSettings: (..._args) => { },
|
|
26
|
+
onToast: (..._args) => { },
|
|
33
27
|
};
|
|
34
|
-
|
|
35
28
|
export function initAiDraft(options) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
});
|
|
29
|
+
btn = options.host;
|
|
30
|
+
statusEl = options.statusEl;
|
|
31
|
+
nodeHost = options.nodeHost;
|
|
32
|
+
hooks = { ...hooks, ...options };
|
|
33
|
+
btn.addEventListener('click', () => {
|
|
34
|
+
const key = aiViewKey();
|
|
35
|
+
if (state.aiActiveKey === key) {
|
|
36
|
+
state.aiActiveKey = null; // back to static
|
|
37
|
+
hooks.onRender();
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (state.aiDiagrams[key]) {
|
|
41
|
+
state.aiActiveKey = key; // cached draft, instant
|
|
42
|
+
hooks.onRender();
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
drawWithAI(key);
|
|
46
|
+
});
|
|
55
47
|
}
|
|
56
|
-
|
|
57
48
|
// Which of the three things the button currently offers. Called on every canvas
|
|
58
49
|
// render, because the answer depends on the view.
|
|
59
50
|
export function updateAiBtn(key = aiViewKey()) {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
51
|
+
btn.hidden = state.view === 'docs' || state.view === 'about'
|
|
52
|
+
|| (state.view === 'atlas' && !state.atlasOpen);
|
|
53
|
+
if (state.aiActiveKey === key) {
|
|
54
|
+
btn.textContent = 'Static';
|
|
55
|
+
btn.title = 'Back to the static diagram';
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
btn.textContent = state.aiDiagrams[key] ? 'AI draft ✓' : 'AI draft';
|
|
59
|
+
btn.title = 'Ask the AI to draw this view';
|
|
60
|
+
}
|
|
69
61
|
}
|
|
70
|
-
|
|
71
62
|
// AI nodes carry no stable ids — clicks are matched by label text instead.
|
|
72
63
|
export function wireAIClicks() {
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
64
|
+
for (const g of nodeHost.querySelectorAll('g.node')) {
|
|
65
|
+
const path = matchNodeText(g.textContent, state.scan.files);
|
|
66
|
+
if (!path)
|
|
67
|
+
continue;
|
|
68
|
+
g.style.cursor = 'pointer';
|
|
69
|
+
g.addEventListener('click', (event) => {
|
|
70
|
+
event.stopPropagation();
|
|
71
|
+
hooks.onOpenFile(path);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
82
74
|
}
|
|
83
|
-
|
|
84
75
|
async function drawWithAI(key) {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
76
|
+
if (!llm.isConfigured()) {
|
|
77
|
+
hooks.onOpenSettings();
|
|
78
|
+
hooks.onToast('Add an endpoint and model first.');
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const settings = llm.getSettings();
|
|
82
|
+
btn.disabled = true;
|
|
83
|
+
btn.textContent = 'drawing…';
|
|
84
|
+
statusEl.hidden = false;
|
|
85
|
+
// Live progress: elapsed time plus how much the model has written so far. A
|
|
86
|
+
// reasoning model can be quiet for half a minute, and a canvas that says
|
|
87
|
+
// nothing is indistinguishable from one that has hung.
|
|
88
|
+
const startedAt = Date.now();
|
|
89
|
+
let received = 0;
|
|
90
|
+
const tick = () => {
|
|
91
|
+
const secs = Math.round((Date.now() - startedAt) / 1000);
|
|
92
|
+
const kb = received >= 1000 ? (received / 1000).toFixed(1) + 'k' : String(received);
|
|
93
|
+
statusEl.textContent = `The AI is sketching this view… ${kb} chars · ${secs}s`;
|
|
94
|
+
};
|
|
95
|
+
tick();
|
|
96
|
+
const progressTimer = setInterval(tick, PROGRESS_MS);
|
|
97
|
+
try {
|
|
98
|
+
const { kind, facts } = await factsForView();
|
|
99
|
+
const messages = llm.diagramMessages({ repoName: state.scan.name, kind, facts });
|
|
100
|
+
let text = '';
|
|
101
|
+
// Big budget, and no visible thinking where the dialect allows it:
|
|
102
|
+
// reasoning models otherwise spend the whole allowance before a single
|
|
103
|
+
// diagram line appears. Azure rejects that parameter outright.
|
|
104
|
+
const providerOptions = llm.isAzureHost(settings.baseUrl) ? {} : { reasoning: { exclude: true } };
|
|
105
|
+
for await (const delta of streamExplain({ ...settings, messages, maxTokens: MAX_TOKENS, providerOptions })) {
|
|
106
|
+
text += delta;
|
|
107
|
+
received += delta.length;
|
|
108
|
+
}
|
|
109
|
+
const parsed = extractAIDiagram(text);
|
|
110
|
+
if (!parsed)
|
|
111
|
+
throw new Error('The model answered without a diagram. Try again.');
|
|
112
|
+
state.aiDiagrams[key] = { body: parsed.body, caption: parsed.caption };
|
|
113
|
+
state.aiActiveKey = key;
|
|
114
|
+
statusEl.hidden = true;
|
|
115
|
+
hooks.onRender();
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
statusEl.hidden = true;
|
|
119
|
+
hooks.onToast(err.message);
|
|
120
|
+
}
|
|
121
|
+
finally {
|
|
122
|
+
clearInterval(progressTimer);
|
|
123
|
+
btn.disabled = false;
|
|
124
|
+
updateAiBtn(key);
|
|
119
125
|
}
|
|
120
|
-
const parsed = extractAIDiagram(text);
|
|
121
|
-
if (!parsed) throw new Error('The model answered without a diagram. Try again.');
|
|
122
|
-
state.aiDiagrams[key] = { body: parsed.body, caption: parsed.caption };
|
|
123
|
-
state.aiActiveKey = key;
|
|
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;
|
|
132
|
-
updateAiBtn(key);
|
|
133
|
-
}
|
|
134
126
|
}
|
|
135
|
-
|
|
136
127
|
// Picks the sheet for the current view and fetches the source the file-shaped
|
|
137
128
|
// ones need. The choosing is pure and tested in aiFacts.js; this is the read.
|
|
138
129
|
async function factsForView() {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
130
|
+
const { scan, facts, manifest, patterns } = state;
|
|
131
|
+
const target = diagramTarget(state);
|
|
132
|
+
switch (target.view) {
|
|
133
|
+
case 'map': return overviewFacts(scan, facts);
|
|
134
|
+
case 'patterns': return layersFacts(facts, patterns);
|
|
135
|
+
case 'services': return servicesFacts(scan, manifest);
|
|
136
|
+
case 'tour': {
|
|
137
|
+
const stop = state.tour.stops[state.tour.idx];
|
|
138
|
+
if (!stop)
|
|
139
|
+
return tourStopFacts({ stop: null });
|
|
140
|
+
return tourStopFacts({
|
|
141
|
+
ctx: await gatherFileContext(target.path),
|
|
142
|
+
externals: externalsFor(scan, target.path),
|
|
143
|
+
stop,
|
|
144
|
+
index: state.tour.idx,
|
|
145
|
+
total: state.tour.stops.length,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
case 'file': return fileFacts({
|
|
149
|
+
ctx: await gatherFileContext(target.path),
|
|
150
|
+
externals: externalsFor(scan, target.path),
|
|
151
|
+
});
|
|
152
|
+
default: return folderFacts(scan, facts, target.path);
|
|
156
153
|
}
|
|
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
154
|
}
|
|
155
|
+
//# 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 = 250;\n\nlet btn = null;\nlet statusEl = null;\nlet nodeHost = null;\nlet hooks = {\n onRender: (..._args: unknown[]) => {},\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 const key = aiViewKey();\n if (state.aiActiveKey === key) {\n state.aiActiveKey = null; // back to static\n hooks.onRender();\n return;\n }\n if (state.aiDiagrams[key]) {\n state.aiActiveKey = key; // cached draft, instant\n hooks.onRender();\n return;\n }\n 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 btn.hidden = state.view === 'docs' || state.view === 'about'\n || (state.view === 'atlas' && !state.atlasOpen);\n 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 draft ✓' : 'AI draft';\n btn.title = 'Ask the AI to draw this view';\n }\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('Add an endpoint and model first.');\n return;\n }\n const settings = llm.getSettings();\n btn.disabled = true;\n btn.textContent = 'drawing…';\n statusEl.hidden = false;\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 const secs = Math.round((Date.now() - startedAt) / 1000);\n const kb = received >= 1000 ? (received / 1000).toFixed(1) + 'k' : String(received);\n statusEl.textContent = `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 const messages = llm.diagramMessages({ repoName: state.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 })) {\n text += delta;\n received += delta.length;\n }\n const parsed = extractAIDiagram(text);\n if (!parsed) throw new Error('The model answered without a diagram. Try again.');\n state.aiDiagrams[key] = { body: parsed.body, caption: parsed.caption };\n state.aiActiveKey = key;\n statusEl.hidden = true;\n hooks.onRender();\n } catch (err) {\n statusEl.hidden = true;\n hooks.onToast(err.message);\n } finally {\n clearInterval(progressTimer);\n btn.disabled = false;\n updateAiBtn(key);\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;
|