Files
朱葛 35958b408c 新增源码绑定、代码面板、流程分组可视化与分组模式切换
- Web: 点击节点在底部代码面板展示源码(语法高亮、可折叠)
- Web: 画布按目录/文件聚类为背景框,头部新增分组模式切换(目录/文件/无)
- Web: 流程横幅、流程/分组列表与节点详情展示 summary
- CLI: 新增 overview 推导与运行器
- scripts: 手动标注 self-report summary

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-22 18:22:45 +08:00

6499 lines
230 KiB
JSON

{
"schemaVersion": "0.1.0",
"project": {
"name": "code-visualize",
"root": "E:/code-visualize",
"languages": [
"javascript",
"tsx",
"typescript"
],
"generatedAt": "2026-07-22T09:34:53.239Z",
"generator": "code-visualize-cli@0.1.0"
},
"stats": {
"fileCount": 28,
"containerCount": 2,
"functionCount": 119,
"edgeCount": 135,
"loc": 3018
},
"modules": [
{
"id": "module:scripts",
"kind": "module",
"name": "scripts",
"provenance": "ast",
"path": "scripts",
"childModuleIds": [],
"fileIds": [
"file:scripts/annotate-self-report.mjs"
],
"parentId": "module:."
},
{
"id": "module:.",
"kind": "module",
"name": "code-visualize",
"provenance": "ast",
"path": ".",
"childModuleIds": [
"module:scripts",
"module:src",
"module:web"
],
"fileIds": []
},
{
"id": "module:src",
"kind": "module",
"name": "src",
"provenance": "ast",
"path": "src",
"childModuleIds": [],
"fileIds": [
"file:src/scanner.ts",
"file:src/types.ts",
"file:src/externals.ts",
"file:src/flows.ts",
"file:src/analyzer.ts",
"file:src/cli.ts",
"file:src/overview.ts",
"file:src/overview-cli.ts"
],
"parentId": "module:."
},
{
"id": "module:web/src/model",
"kind": "module",
"name": "model",
"provenance": "ast",
"path": "web/src/model",
"childModuleIds": [],
"fileIds": [
"file:web/src/model/report.ts",
"file:web/src/model/reportRepository.ts",
"file:web/src/model/graphModel.ts"
],
"parentId": "module:web/src"
},
{
"id": "module:web/src",
"kind": "module",
"name": "src",
"provenance": "ast",
"path": "web/src",
"childModuleIds": [
"module:web/src/model",
"module:web/src/services",
"module:web/src/viewmodel",
"module:web/src/view"
],
"fileIds": [
"file:web/src/main.tsx"
],
"parentId": "module:web"
},
{
"id": "module:web",
"kind": "module",
"name": "web",
"provenance": "ast",
"path": "web",
"childModuleIds": [
"module:web/src"
],
"fileIds": [
"file:web/vite.config.ts"
],
"parentId": "module:."
},
{
"id": "module:web/src/services",
"kind": "module",
"name": "services",
"provenance": "ast",
"path": "web/src/services",
"childModuleIds": [],
"fileIds": [
"file:web/src/services/dagreLayout.ts",
"file:web/src/services/sourceService.ts",
"file:web/src/services/languageMap.ts"
],
"parentId": "module:web/src"
},
{
"id": "module:web/src/viewmodel",
"kind": "module",
"name": "viewmodel",
"provenance": "ast",
"path": "web/src/viewmodel",
"childModuleIds": [],
"fileIds": [
"file:web/src/viewmodel/GraphViewModel.ts"
],
"parentId": "module:web/src"
},
{
"id": "module:web/src/view",
"kind": "module",
"name": "view",
"provenance": "ast",
"path": "web/src/view",
"childModuleIds": [
"module:web/src/view/components"
],
"fileIds": [
"file:web/src/view/vmContext.ts",
"file:web/src/view/App.tsx"
],
"parentId": "module:web/src"
},
{
"id": "module:web/src/view/components",
"kind": "module",
"name": "components",
"provenance": "ast",
"path": "web/src/view/components",
"childModuleIds": [],
"fileIds": [
"file:web/src/view/components/FlowNode.tsx",
"file:web/src/view/components/FlowGraph.tsx",
"file:web/src/view/components/FlowList.tsx",
"file:web/src/view/components/GroupList.tsx",
"file:web/src/view/components/NodeDetailPanel.tsx",
"file:web/src/view/components/SearchBar.tsx",
"file:web/src/view/components/CodePanel.tsx",
"file:web/src/view/components/FlowBanner.tsx"
],
"parentId": "module:web/src/view"
}
],
"files": [
{
"id": "file:scripts/annotate-self-report.mjs",
"kind": "file",
"name": "annotate-self-report.mjs",
"location": {
"file": "scripts/annotate-self-report.mjs",
"startLine": 1,
"endLine": 119
},
"language": "javascript",
"provenance": "ast",
"moduleId": "module:scripts",
"path": "scripts/annotate-self-report.mjs",
"loc": 119,
"containerIds": [],
"functionIds": [
"func:scripts/annotate-self-report.mjs#<module>@0"
]
},
{
"id": "file:src/scanner.ts",
"kind": "file",
"name": "scanner.ts",
"location": {
"file": "src/scanner.ts",
"startLine": 1,
"endLine": 69
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/scanner.ts",
"loc": 69,
"containerIds": [],
"functionIds": [
"func:src/scanner.ts#toPosix@19",
"func:src/scanner.ts#collectSourceFiles@24",
"func:src/scanner.ts#walk@27",
"func:src/scanner.ts#languageOf@52"
],
"summary": "递归扫描项目目录,按扩展名收集源文件并识别语言"
},
{
"id": "file:src/types.ts",
"kind": "file",
"name": "types.ts",
"location": {
"file": "src/types.ts",
"startLine": 1,
"endLine": 205
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/types.ts",
"loc": 205,
"containerIds": [],
"functionIds": [],
"summary": "标准化代码报告的核心类型定义(Schema 真相源)"
},
{
"id": "file:src/externals.ts",
"kind": "file",
"name": "externals.ts",
"location": {
"file": "src/externals.ts",
"startLine": 1,
"endLine": 61
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/externals.ts",
"loc": 61,
"containerIds": [],
"functionIds": [
"func:src/externals.ts#deriveExternalSystems@4"
],
"summary": "聚合函数交互,派生外部系统(数据库 / 服务)清单"
},
{
"id": "file:src/flows.ts",
"kind": "file",
"name": "flows.ts",
"location": {
"file": "src/flows.ts",
"startLine": 1,
"endLine": 103
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/flows.ts",
"loc": 103,
"containerIds": [],
"functionIds": [
"func:src/flows.ts#generateCallFlows@16",
"func:src/flows.ts#stepIdOf@70",
"func:src/flows.ts#map() 回调@72@72"
],
"summary": "从入口点遍历调用图,自动生成调用链流程"
},
{
"id": "file:src/analyzer.ts",
"kind": "file",
"name": "analyzer.ts",
"location": {
"file": "src/analyzer.ts",
"startLine": 1,
"endLine": 610
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/analyzer.ts",
"loc": 610,
"containerIds": [],
"functionIds": [
"func:src/analyzer.ts#analyzeProject@32",
"func:src/analyzer.ts#relOf@64",
"func:src/analyzer.ts#inProject@65",
"func:src/analyzer.ts#locOf@70",
"func:src/analyzer.ts#ensureModule@83",
"func:src/analyzer.ts#getParams@108",
"func:src/analyzer.ts#buildSignature@117",
"func:src/analyzer.ts#registerFunc@122",
"func:src/analyzer.ts#isFnInit@169",
"func:src/analyzer.ts#containsCall@173",
"func:src/analyzer.ts#scan@175",
"func:src/analyzer.ts#routeNameFromCall@188",
"func:src/analyzer.ts#inlineName@202",
"func:src/analyzer.ts#registerFile@223",
"func:src/analyzer.ts#visit@245",
"func:src/analyzer.ts#extractPathArg@333",
"func:src/analyzer.ts#extractMethodFromOptions@341",
"func:src/analyzer.ts#hostOf@352",
"func:src/analyzer.ts#detectDb@358",
"func:src/analyzer.ts#detectApiOut@382",
"func:src/analyzer.ts#detectApiIn@400",
"func:src/analyzer.ts#addInteraction@419",
"func:src/analyzer.ts#addEdge@433",
"func:src/analyzer.ts#resolveCallTargetFuncId@440",
"func:src/analyzer.ts#getModuleFunc@462",
"func:src/analyzer.ts#analyzeRelations@487",
"func:src/analyzer.ts#walk@492",
"func:src/analyzer.ts#resolveInternalImport@548"
],
"summary": "基于 TS 编译器 API 的解析核心:构建函数层级与调用边"
},
{
"id": "file:src/cli.ts",
"kind": "file",
"name": "cli.ts",
"location": {
"file": "src/cli.ts",
"startLine": 1,
"endLine": 71
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/cli.ts",
"loc": 71,
"containerIds": [],
"functionIds": [
"func:src/cli.ts#parseArgs@13",
"func:src/cli.ts#main@40",
"func:src/cli.ts#<module>@0"
],
"summary": "命令行入口:解析参数、运行分析、写出报告 JSON"
},
{
"id": "file:src/overview.ts",
"kind": "file",
"name": "overview.ts",
"location": {
"file": "src/overview.ts",
"startLine": 1,
"endLine": 262
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/overview.ts",
"loc": 262,
"containerIds": [],
"functionIds": [
"func:src/overview.ts#apiInOf@79",
"func:src/overview.ts#groupKeyFromPath@83",
"func:src/overview.ts#reachableFuncs@92",
"func:src/overview.ts#deriveOverview@109",
"func:src/overview.ts#analyzeEntry@140",
"func:src/overview.ts#map() 回调@219@219",
"func:src/overview.ts#map() 回调@229@229"
],
"summary": "从报告推导「概览」确定层数据(接口 / 入口 / 外部系统 / 热点)"
},
{
"id": "file:src/overview-cli.ts",
"kind": "file",
"name": "overview-cli.ts",
"location": {
"file": "src/overview-cli.ts",
"startLine": 1,
"endLine": 87
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:src",
"path": "src/overview-cli.ts",
"loc": 87,
"containerIds": [],
"functionIds": [
"func:src/overview-cli.ts#main@9",
"func:src/overview-cli.ts#flag@16",
"func:src/overview-cli.ts#<module>@0"
],
"summary": "概览推导的命令行运行器,打印可读的项目地图"
},
{
"id": "file:web/src/model/report.ts",
"kind": "file",
"name": "report.ts",
"location": {
"file": "web/src/model/report.ts",
"startLine": 1,
"endLine": 194
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/model",
"path": "web/src/model/report.ts",
"loc": 194,
"containerIds": [],
"functionIds": [],
"summary": "前端侧报告类型定义(与 CLI Schema 对齐)"
},
{
"id": "file:web/src/model/reportRepository.ts",
"kind": "file",
"name": "reportRepository.ts",
"location": {
"file": "web/src/model/reportRepository.ts",
"startLine": 1,
"endLine": 27
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/model",
"path": "web/src/model/reportRepository.ts",
"loc": 27,
"containerIds": [
"container:web/src/model/reportRepository.ts#HttpReportRepository@16"
],
"functionIds": [],
"summary": "报告数据源抽象,HTTP 加载报告 JSON"
},
{
"id": "file:web/src/model/graphModel.ts",
"kind": "file",
"name": "graphModel.ts",
"location": {
"file": "web/src/model/graphModel.ts",
"startLine": 1,
"endLine": 67
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/model",
"path": "web/src/model/graphModel.ts",
"loc": 67,
"containerIds": [],
"functionIds": [
"func:web/src/model/graphModel.ts#baseName@19",
"func:web/src/model/graphModel.ts#qualifierOf@24",
"func:web/src/model/graphModel.ts#flowToGraph@43",
"func:web/src/model/graphModel.ts#map() 回调@44@44"
],
"summary": "将 Flow 转换为与渲染无关的「中性图」结构"
},
{
"id": "file:web/src/services/dagreLayout.ts",
"kind": "file",
"name": "dagreLayout.ts",
"location": {
"file": "web/src/services/dagreLayout.ts",
"startLine": 1,
"endLine": 63
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/services",
"path": "web/src/services/dagreLayout.ts",
"loc": 63,
"containerIds": [],
"functionIds": [
"func:web/src/services/dagreLayout.ts#computeLayout@31"
],
"summary": "用 Dagre 计算图的自动布局坐标"
},
{
"id": "file:web/src/services/sourceService.ts",
"kind": "file",
"name": "sourceService.ts",
"location": {
"file": "web/src/services/sourceService.ts",
"startLine": 1,
"endLine": 33
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/services",
"path": "web/src/services/sourceService.ts",
"loc": 33,
"containerIds": [],
"functionIds": [
"func:web/src/services/sourceService.ts#fetchSource@19"
],
"summary": "源码绑定:向开发服务器请求真实源码片段"
},
{
"id": "file:web/src/viewmodel/GraphViewModel.ts",
"kind": "file",
"name": "GraphViewModel.ts",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 1,
"endLine": 381
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/viewmodel",
"path": "web/src/viewmodel/GraphViewModel.ts",
"loc": 381,
"containerIds": [
"container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52"
],
"functionIds": [
"func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79",
"func:web/src/viewmodel/GraphViewModel.ts#runInAction() 回调@203@203",
"func:web/src/viewmodel/GraphViewModel.ts#map() 回调@240@240",
"func:web/src/viewmodel/GraphViewModel.ts#runInAction() 回调@368@368"
],
"summary": "图视图 ViewModel:编排加载 / 选择 / 布局 / 搜索 / 源码"
},
{
"id": "file:web/src/view/vmContext.ts",
"kind": "file",
"name": "vmContext.ts",
"location": {
"file": "web/src/view/vmContext.ts",
"startLine": 1,
"endLine": 11
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/view",
"path": "web/src/view/vmContext.ts",
"loc": 11,
"containerIds": [],
"functionIds": [
"func:web/src/view/vmContext.ts#useGraphVM@6",
"func:web/src/view/vmContext.ts#<module>@0"
],
"summary": "提供 GraphViewModel 的 React Context"
},
{
"id": "file:web/src/view/components/FlowNode.tsx",
"kind": "file",
"name": "FlowNode.tsx",
"location": {
"file": "web/src/view/components/FlowNode.tsx",
"startLine": 1,
"endLine": 67
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/FlowNode.tsx",
"loc": 67,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"func:web/src/view/components/FlowNode.tsx#<module>@0"
],
"summary": "自定义流程图节点:显示函数名 / 归属 / 交互徽标"
},
{
"id": "file:web/src/view/components/FlowGraph.tsx",
"kind": "file",
"name": "FlowGraph.tsx",
"location": {
"file": "web/src/view/components/FlowGraph.tsx",
"startLine": 1,
"endLine": 71
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/FlowGraph.tsx",
"loc": 71,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16",
"func:web/src/view/components/FlowGraph.tsx#<module>@0"
],
"summary": "React Flow 画布容器,渲染当前流程图"
},
{
"id": "file:web/src/view/components/FlowList.tsx",
"kind": "file",
"name": "FlowList.tsx",
"location": {
"file": "web/src/view/components/FlowList.tsx",
"startLine": 1,
"endLine": 39
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/FlowList.tsx",
"loc": 39,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"func:web/src/view/components/FlowList.tsx#<module>@0"
],
"summary": "左侧流程列表面板"
},
{
"id": "file:web/src/view/components/GroupList.tsx",
"kind": "file",
"name": "GroupList.tsx",
"location": {
"file": "web/src/view/components/GroupList.tsx",
"startLine": 1,
"endLine": 37
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/GroupList.tsx",
"loc": 37,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"func:web/src/view/components/GroupList.tsx#<module>@0"
],
"summary": "最左侧分组列表:按类 / 文件过滤流程"
},
{
"id": "file:web/src/view/components/NodeDetailPanel.tsx",
"kind": "file",
"name": "NodeDetailPanel.tsx",
"location": {
"file": "web/src/view/components/NodeDetailPanel.tsx",
"startLine": 1,
"endLine": 99
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/NodeDetailPanel.tsx",
"loc": 99,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"func:web/src/view/components/NodeDetailPanel.tsx#<module>@0"
],
"summary": "右侧节点详情:位置 / 归属 / 交互 / 所在流程"
},
{
"id": "file:web/src/view/components/SearchBar.tsx",
"kind": "file",
"name": "SearchBar.tsx",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 1,
"endLine": 60
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/SearchBar.tsx",
"loc": 60,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"func:web/src/view/components/SearchBar.tsx#activate@12",
"func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"func:web/src/view/components/SearchBar.tsx#<module>@0"
],
"summary": "顶部搜索栏,检索流程与函数"
},
{
"id": "file:web/src/services/languageMap.ts",
"kind": "file",
"name": "languageMap.ts",
"location": {
"file": "web/src/services/languageMap.ts",
"startLine": 1,
"endLine": 49
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web/src/services",
"path": "web/src/services/languageMap.ts",
"loc": 49,
"containerIds": [],
"functionIds": [
"func:web/src/services/languageMap.ts#languageOf@42"
],
"summary": "文件扩展名到语法高亮语言的映射"
},
{
"id": "file:web/src/view/components/CodePanel.tsx",
"kind": "file",
"name": "CodePanel.tsx",
"location": {
"file": "web/src/view/components/CodePanel.tsx",
"startLine": 1,
"endLine": 67
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/CodePanel.tsx",
"loc": 67,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7",
"func:web/src/view/components/CodePanel.tsx#<module>@0"
],
"summary": "底部源码面板:语法高亮显示选中函数实现"
},
{
"id": "file:web/src/view/components/FlowBanner.tsx",
"kind": "file",
"name": "FlowBanner.tsx",
"location": {
"file": "web/src/view/components/FlowBanner.tsx",
"startLine": 1,
"endLine": 17
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view/components",
"path": "web/src/view/components/FlowBanner.tsx",
"loc": 17,
"containerIds": [],
"functionIds": [
"func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4",
"func:web/src/view/components/FlowBanner.tsx#<module>@0"
],
"summary": "画布顶部横幅:显示当前流程名与说明"
},
{
"id": "file:web/src/view/App.tsx",
"kind": "file",
"name": "App.tsx",
"location": {
"file": "web/src/view/App.tsx",
"startLine": 1,
"endLine": 61
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src/view",
"path": "web/src/view/App.tsx",
"loc": 61,
"containerIds": [],
"functionIds": [
"func:web/src/view/App.tsx#observer() 回调@11@11",
"func:web/src/view/App.tsx#<module>@0"
],
"summary": "应用主组件:编排头部与各面板布局"
},
{
"id": "file:web/src/main.tsx",
"kind": "file",
"name": "main.tsx",
"location": {
"file": "web/src/main.tsx",
"startLine": 1,
"endLine": 27
},
"language": "tsx",
"provenance": "ast",
"moduleId": "module:web/src",
"path": "web/src/main.tsx",
"loc": 27,
"containerIds": [],
"functionIds": [
"func:web/src/main.tsx#<module>@0"
],
"summary": "前端入口:构建数据源与 ViewModel 并挂载 App"
},
{
"id": "file:web/vite.config.ts",
"kind": "file",
"name": "vite.config.ts",
"location": {
"file": "web/vite.config.ts",
"startLine": 1,
"endLine": 61
},
"language": "typescript",
"provenance": "ast",
"moduleId": "module:web",
"path": "web/vite.config.ts",
"loc": 61,
"containerIds": [],
"functionIds": [
"func:web/vite.config.ts#sourceServer@11",
"func:web/vite.config.ts#use() 回调@15@15",
"func:web/vite.config.ts#<module>@0"
],
"summary": "Vite 配置 + 开发期源码服务中间件"
}
],
"containers": [
{
"id": "container:web/src/model/reportRepository.ts#HttpReportRepository@16",
"kind": "container",
"name": "HttpReportRepository",
"qualifiedName": "HttpReportRepository",
"location": {
"file": "web/src/model/reportRepository.ts",
"startLine": 16,
"endLine": 26,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/reportRepository.ts",
"moduleId": "module:web/src/model",
"functionIds": [
"func:web/src/model/reportRepository.ts#HttpReportRepository.constructor@17",
"func:web/src/model/reportRepository.ts#HttpReportRepository.load@19"
],
"fieldIds": [],
"summary": "通过 HTTP 从 URL 加载报告 JSON 的仓库实现"
},
{
"id": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"kind": "container",
"name": "GraphViewModel",
"qualifiedName": "GraphViewModel",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 52,
"endLine": 380,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"moduleId": "module:web/src/viewmodel",
"functionIds": [
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.constructor@69",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.sources@85",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentSource@89",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.toggleCodePanel@104",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedGroup@153",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@171",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flows@214",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentFlow@219",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFunc@248",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flowsForSelectedFunc@256",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcIdsInFlows@279",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchResults@294",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@334",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@340",
"func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loadSelectedFuncCode@346"
],
"fieldIds": [
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loading@53",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.error@54",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.report@55",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedSourceId@57",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedGroupId@58",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFlowId@59",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedNodeId@60",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchQuery@61",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.codeState@62",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.codePanelCollapsed@63",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcById@65",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.containerById@66",
"field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.fileById@67"
],
"summary": "图视图 ViewModel:持有全部可观察状态与命令"
}
],
"functions": [
{
"id": "func:src/scanner.ts#toPosix@19",
"kind": "function",
"name": "toPosix",
"qualifiedName": "toPosix",
"location": {
"file": "src/scanner.ts",
"startLine": 19,
"endLine": 21,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/scanner.ts",
"moduleId": "module:src",
"signature": "toPosix(p: string): string",
"params": [
{
"name": "p",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 3
},
{
"id": "func:src/scanner.ts#collectSourceFiles@24",
"kind": "function",
"name": "collectSourceFiles",
"qualifiedName": "collectSourceFiles",
"location": {
"file": "src/scanner.ts",
"startLine": 24,
"endLine": 50,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/scanner.ts",
"moduleId": "module:src",
"signature": "collectSourceFiles(root: string): string[]",
"params": [
{
"name": "root",
"typeRef": "string",
"optional": false
}
],
"returnType": "string[]",
"loc": 27
},
{
"id": "func:src/scanner.ts#walk@27",
"kind": "function",
"name": "walk",
"qualifiedName": "walk",
"location": {
"file": "src/scanner.ts",
"startLine": 27,
"endLine": 46,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/scanner.ts",
"moduleId": "module:src",
"signature": "walk(dir: string): void",
"params": [
{
"name": "dir",
"typeRef": "string",
"optional": false
}
],
"returnType": "void",
"loc": 20
},
{
"id": "func:src/scanner.ts#languageOf@52",
"kind": "function",
"name": "languageOf",
"qualifiedName": "languageOf",
"location": {
"file": "src/scanner.ts",
"startLine": 52,
"endLine": 68,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/scanner.ts",
"moduleId": "module:src",
"signature": "languageOf(file: string): string",
"params": [
{
"name": "file",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 17
},
{
"id": "func:src/externals.ts#deriveExternalSystems@4",
"kind": "function",
"name": "deriveExternalSystems",
"qualifiedName": "deriveExternalSystems",
"location": {
"file": "src/externals.ts",
"startLine": 4,
"endLine": 60,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/externals.ts",
"moduleId": "module:src",
"signature": "deriveExternalSystems(functions: Func[]): ExternalSystem[]",
"params": [
{
"name": "functions",
"typeRef": "Func[]",
"optional": false
}
],
"returnType": "ExternalSystem[]",
"loc": 57
},
{
"id": "func:src/flows.ts#generateCallFlows@16",
"kind": "function",
"name": "generateCallFlows",
"qualifiedName": "generateCallFlows",
"location": {
"file": "src/flows.ts",
"startLine": 16,
"endLine": 102,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/flows.ts",
"moduleId": "module:src",
"signature": "generateCallFlows(functions: Func[], edges: Edge[], options: Partial<FlowOptions>): Flow[]",
"params": [
{
"name": "functions",
"typeRef": "Func[]",
"optional": false
},
{
"name": "edges",
"typeRef": "Edge[]",
"optional": false
},
{
"name": "options",
"typeRef": "Partial<FlowOptions>",
"optional": true
}
],
"returnType": "Flow[]",
"loc": 87
},
{
"id": "func:src/flows.ts#stepIdOf@70",
"kind": "function",
"name": "stepIdOf",
"qualifiedName": "stepIdOf",
"location": {
"file": "src/flows.ts",
"startLine": 70,
"endLine": 70,
"startCol": 11,
"endCol": 70
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/flows.ts",
"moduleId": "module:src",
"signature": "stepIdOf(fid: string): string",
"params": [
{
"name": "fid",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 1
},
{
"id": "func:src/flows.ts#map() 回调@72@72",
"kind": "function",
"name": "map() 回调@72",
"qualifiedName": "map() 回调@72",
"location": {
"file": "src/flows.ts",
"startLine": 72,
"endLine": 81,
"startCol": 44,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/flows.ts",
"moduleId": "module:src",
"signature": "map() 回调@72(fid, i)",
"params": [
{
"name": "fid",
"optional": false
},
{
"name": "i",
"optional": false
}
],
"loc": 10
},
{
"id": "func:src/analyzer.ts#analyzeProject@32",
"kind": "function",
"name": "analyzeProject",
"qualifiedName": "analyzeProject",
"location": {
"file": "src/analyzer.ts",
"startLine": 32,
"endLine": 609,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "analyzeProject(root: string): Report",
"params": [
{
"name": "root",
"typeRef": "string",
"optional": false
}
],
"returnType": "Report",
"loc": 578
},
{
"id": "func:src/analyzer.ts#relOf@64",
"kind": "function",
"name": "relOf",
"qualifiedName": "relOf",
"location": {
"file": "src/analyzer.ts",
"startLine": 64,
"endLine": 64,
"startCol": 9,
"endCol": 106
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "relOf(sf: ts.SourceFile): string",
"params": [
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "string",
"loc": 1
},
{
"id": "func:src/analyzer.ts#inProject@65",
"kind": "function",
"name": "inProject",
"qualifiedName": "inProject",
"location": {
"file": "src/analyzer.ts",
"startLine": 65,
"endLine": 68,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "inProject(sf: ts.SourceFile): boolean",
"params": [
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "boolean",
"loc": 4
},
{
"id": "func:src/analyzer.ts#locOf@70",
"kind": "function",
"name": "locOf",
"qualifiedName": "locOf",
"location": {
"file": "src/analyzer.ts",
"startLine": 70,
"endLine": 80,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "locOf(node: ts.Node, sf: ts.SourceFile): SourceLocation",
"params": [
{
"name": "node",
"typeRef": "ts.Node",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "SourceLocation",
"loc": 11
},
{
"id": "func:src/analyzer.ts#ensureModule@83",
"kind": "function",
"name": "ensureModule",
"qualifiedName": "ensureModule",
"location": {
"file": "src/analyzer.ts",
"startLine": 83,
"endLine": 105,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "ensureModule(dir: string): Module",
"params": [
{
"name": "dir",
"typeRef": "string",
"optional": false
}
],
"returnType": "Module",
"loc": 23
},
{
"id": "func:src/analyzer.ts#getParams@108",
"kind": "function",
"name": "getParams",
"qualifiedName": "getParams",
"location": {
"file": "src/analyzer.ts",
"startLine": 108,
"endLine": 115,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "getParams(fn: ts.SignatureDeclarationBase, sf: ts.SourceFile): Param[]",
"params": [
{
"name": "fn",
"typeRef": "ts.SignatureDeclarationBase",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "Param[]",
"loc": 8
},
{
"id": "func:src/analyzer.ts#buildSignature@117",
"kind": "function",
"name": "buildSignature",
"qualifiedName": "buildSignature",
"location": {
"file": "src/analyzer.ts",
"startLine": 117,
"endLine": 120,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "buildSignature(name: string, params: Param[], ret: string): string",
"params": [
{
"name": "name",
"typeRef": "string",
"optional": false
},
{
"name": "params",
"typeRef": "Param[]",
"optional": false
},
{
"name": "ret",
"typeRef": "string",
"optional": true
}
],
"returnType": "string",
"loc": 4
},
{
"id": "func:src/analyzer.ts#registerFunc@122",
"kind": "function",
"name": "registerFunc",
"qualifiedName": "registerFunc",
"location": {
"file": "src/analyzer.ts",
"startLine": 122,
"endLine": 167,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "registerFunc(declNode: ts.Node, fnNode: ts.SignatureDeclarationBase & ts.Node, name: string, sf: ts.SourceFile, rel: string, fileEntity: CodeFile, ownerId: string, qualifiedPrefix: string): Func",
"params": [
{
"name": "declNode",
"typeRef": "ts.Node",
"optional": false
},
{
"name": "fnNode",
"typeRef": "ts.SignatureDeclarationBase & ts.Node",
"optional": false
},
{
"name": "name",
"typeRef": "string",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
},
{
"name": "rel",
"typeRef": "string",
"optional": false
},
{
"name": "fileEntity",
"typeRef": "CodeFile",
"optional": false
},
{
"name": "ownerId",
"typeRef": "string",
"optional": true
},
{
"name": "qualifiedPrefix",
"typeRef": "string",
"optional": true
}
],
"returnType": "Func",
"loc": 46
},
{
"id": "func:src/analyzer.ts#isFnInit@169",
"kind": "function",
"name": "isFnInit",
"qualifiedName": "isFnInit",
"location": {
"file": "src/analyzer.ts",
"startLine": 169,
"endLine": 170,
"startCol": 9,
"endCol": 74
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "isFnInit(node: ts.Node): node is ts.ArrowFunction | ts.FunctionExpression",
"params": [
{
"name": "node",
"typeRef": "ts.Node",
"optional": true
}
],
"returnType": "node is ts.ArrowFunction | ts.FunctionExpression",
"loc": 2
},
{
"id": "func:src/analyzer.ts#containsCall@173",
"kind": "function",
"name": "containsCall",
"qualifiedName": "containsCall",
"location": {
"file": "src/analyzer.ts",
"startLine": 173,
"endLine": 185,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "containsCall(n: ts.Node): boolean",
"params": [
{
"name": "n",
"typeRef": "ts.Node",
"optional": false
}
],
"returnType": "boolean",
"loc": 13
},
{
"id": "func:src/analyzer.ts#scan@175",
"kind": "function",
"name": "scan",
"qualifiedName": "scan",
"location": {
"file": "src/analyzer.ts",
"startLine": 175,
"endLine": 182,
"startCol": 11,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "scan(x: ts.Node): void",
"params": [
{
"name": "x",
"typeRef": "ts.Node",
"optional": false
}
],
"returnType": "void",
"loc": 8
},
{
"id": "func:src/analyzer.ts#routeNameFromCall@188",
"kind": "function",
"name": "routeNameFromCall",
"qualifiedName": "routeNameFromCall",
"location": {
"file": "src/analyzer.ts",
"startLine": 188,
"endLine": 199,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "routeNameFromCall(call: ts.CallExpression, sf: ts.SourceFile): string | undefined",
"params": [
{
"name": "call",
"typeRef": "ts.CallExpression",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 12
},
{
"id": "func:src/analyzer.ts#inlineName@202",
"kind": "function",
"name": "inlineName",
"qualifiedName": "inlineName",
"location": {
"file": "src/analyzer.ts",
"startLine": 202,
"endLine": 220,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "inlineName(fn: ts.ArrowFunction | ts.FunctionExpression, sf: ts.SourceFile): string",
"params": [
{
"name": "fn",
"typeRef": "ts.ArrowFunction | ts.FunctionExpression",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "string",
"loc": 19
},
{
"id": "func:src/analyzer.ts#registerFile@223",
"kind": "function",
"name": "registerFile",
"qualifiedName": "registerFile",
"location": {
"file": "src/analyzer.ts",
"startLine": 223,
"endLine": 330,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "registerFile(sf: ts.SourceFile): void",
"params": [
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "void",
"loc": 108
},
{
"id": "func:src/analyzer.ts#visit@245",
"kind": "function",
"name": "visit",
"qualifiedName": "visit",
"location": {
"file": "src/analyzer.ts",
"startLine": 245,
"endLine": 327,
"startCol": 11,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "visit(node: ts.Node): void",
"params": [
{
"name": "node",
"typeRef": "ts.Node",
"optional": false
}
],
"returnType": "void",
"loc": 83
},
{
"id": "func:src/analyzer.ts#extractPathArg@333",
"kind": "function",
"name": "extractPathArg",
"qualifiedName": "extractPathArg",
"location": {
"file": "src/analyzer.ts",
"startLine": 333,
"endLine": 339,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "extractPathArg(node: ts.Expression | undefined, sf: ts.SourceFile): string | undefined",
"params": [
{
"name": "node",
"typeRef": "ts.Expression | undefined",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 7
},
{
"id": "func:src/analyzer.ts#extractMethodFromOptions@341",
"kind": "function",
"name": "extractMethodFromOptions",
"qualifiedName": "extractMethodFromOptions",
"location": {
"file": "src/analyzer.ts",
"startLine": 341,
"endLine": 350,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "extractMethodFromOptions(arg: ts.Expression | undefined, sf: ts.SourceFile): string | undefined",
"params": [
{
"name": "arg",
"typeRef": "ts.Expression | undefined",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 10
},
{
"id": "func:src/analyzer.ts#hostOf@352",
"kind": "function",
"name": "hostOf",
"qualifiedName": "hostOf",
"location": {
"file": "src/analyzer.ts",
"startLine": 352,
"endLine": 356,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "hostOf(url: string): string | undefined",
"params": [
{
"name": "url",
"typeRef": "string",
"optional": true
}
],
"returnType": "string | undefined",
"loc": 5
},
{
"id": "func:src/analyzer.ts#detectDb@358",
"kind": "function",
"name": "detectDb",
"qualifiedName": "detectDb",
"location": {
"file": "src/analyzer.ts",
"startLine": 358,
"endLine": 380,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "detectDb(call: ts.CallExpression, sf: ts.SourceFile): DbInteraction | undefined",
"params": [
{
"name": "call",
"typeRef": "ts.CallExpression",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "DbInteraction | undefined",
"loc": 23
},
{
"id": "func:src/analyzer.ts#detectApiOut@382",
"kind": "function",
"name": "detectApiOut",
"qualifiedName": "detectApiOut",
"location": {
"file": "src/analyzer.ts",
"startLine": 382,
"endLine": 398,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "detectApiOut(call: ts.CallExpression, sf: ts.SourceFile): ApiInteraction | undefined",
"params": [
{
"name": "call",
"typeRef": "ts.CallExpression",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "ApiInteraction | undefined",
"loc": 17
},
{
"id": "func:src/analyzer.ts#detectApiIn@400",
"kind": "function",
"name": "detectApiIn",
"qualifiedName": "detectApiIn",
"location": {
"file": "src/analyzer.ts",
"startLine": 400,
"endLine": 417,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "detectApiIn(call: ts.CallExpression, sf: ts.SourceFile): { interaction: ApiInteraction; handler?: ts.Node } | undefined",
"params": [
{
"name": "call",
"typeRef": "ts.CallExpression",
"optional": false
},
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "{ interaction: ApiInteraction; handler?: ts.Node } | undefined",
"loc": 18
},
{
"id": "func:src/analyzer.ts#addInteraction@419",
"kind": "function",
"name": "addInteraction",
"qualifiedName": "addInteraction",
"location": {
"file": "src/analyzer.ts",
"startLine": 419,
"endLine": 430,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "addInteraction(fnId: string, ix: Interaction): void",
"params": [
{
"name": "fnId",
"typeRef": "string",
"optional": false
},
{
"name": "ix",
"typeRef": "Interaction",
"optional": false
}
],
"returnType": "void",
"loc": 12
},
{
"id": "func:src/analyzer.ts#addEdge@433",
"kind": "function",
"name": "addEdge",
"qualifiedName": "addEdge",
"location": {
"file": "src/analyzer.ts",
"startLine": 433,
"endLine": 438,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "addEdge(kind: Edge[\"kind\"], sourceId: string, targetId: string, provenance: Edge[\"provenance\"]): void",
"params": [
{
"name": "kind",
"typeRef": "Edge[\"kind\"]",
"optional": false
},
{
"name": "sourceId",
"typeRef": "string",
"optional": false
},
{
"name": "targetId",
"typeRef": "string",
"optional": false
},
{
"name": "provenance",
"typeRef": "Edge[\"provenance\"]",
"optional": false
}
],
"returnType": "void",
"loc": 6
},
{
"id": "func:src/analyzer.ts#resolveCallTargetFuncId@440",
"kind": "function",
"name": "resolveCallTargetFuncId",
"qualifiedName": "resolveCallTargetFuncId",
"location": {
"file": "src/analyzer.ts",
"startLine": 440,
"endLine": 459,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "resolveCallTargetFuncId(call: ts.CallExpression): string | undefined",
"params": [
{
"name": "call",
"typeRef": "ts.CallExpression",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 20
},
{
"id": "func:src/analyzer.ts#getModuleFunc@462",
"kind": "function",
"name": "getModuleFunc",
"qualifiedName": "getModuleFunc",
"location": {
"file": "src/analyzer.ts",
"startLine": 462,
"endLine": 485,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "getModuleFunc(sf: ts.SourceFile, rel: string, fileEntity: CodeFile): string",
"params": [
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
},
{
"name": "rel",
"typeRef": "string",
"optional": false
},
{
"name": "fileEntity",
"typeRef": "CodeFile",
"optional": false
}
],
"returnType": "string",
"loc": 24
},
{
"id": "func:src/analyzer.ts#analyzeRelations@487",
"kind": "function",
"name": "analyzeRelations",
"qualifiedName": "analyzeRelations",
"location": {
"file": "src/analyzer.ts",
"startLine": 487,
"endLine": 546,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "analyzeRelations(sf: ts.SourceFile): void",
"params": [
{
"name": "sf",
"typeRef": "ts.SourceFile",
"optional": false
}
],
"returnType": "void",
"loc": 60
},
{
"id": "func:src/analyzer.ts#walk@492",
"kind": "function",
"name": "walk",
"qualifiedName": "walk",
"location": {
"file": "src/analyzer.ts",
"startLine": 492,
"endLine": 543,
"startCol": 11,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "walk(node: ts.Node, currentFuncId: string | undefined): void",
"params": [
{
"name": "node",
"typeRef": "ts.Node",
"optional": false
},
{
"name": "currentFuncId",
"typeRef": "string | undefined",
"optional": false
}
],
"returnType": "void",
"loc": 52
},
{
"id": "func:src/analyzer.ts#resolveInternalImport@548",
"kind": "function",
"name": "resolveInternalImport",
"qualifiedName": "resolveInternalImport",
"location": {
"file": "src/analyzer.ts",
"startLine": 548,
"endLine": 569,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/analyzer.ts",
"moduleId": "module:src",
"signature": "resolveInternalImport(fromRel: string, spec: string): string | undefined",
"params": [
{
"name": "fromRel",
"typeRef": "string",
"optional": false
},
{
"name": "spec",
"typeRef": "string",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 22
},
{
"id": "func:src/cli.ts#parseArgs@13",
"kind": "function",
"name": "parseArgs",
"qualifiedName": "parseArgs",
"location": {
"file": "src/cli.ts",
"startLine": 13,
"endLine": 23,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/cli.ts",
"moduleId": "module:src",
"signature": "parseArgs(argv: string[]): CliArgs",
"params": [
{
"name": "argv",
"typeRef": "string[]",
"optional": false
}
],
"returnType": "CliArgs",
"loc": 11
},
{
"id": "func:src/cli.ts#main@40",
"kind": "function",
"name": "main",
"qualifiedName": "main",
"location": {
"file": "src/cli.ts",
"startLine": 40,
"endLine": 68,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/cli.ts",
"moduleId": "module:src",
"signature": "main(): void",
"params": [],
"returnType": "void",
"loc": 29
},
{
"id": "func:src/overview.ts#apiInOf@79",
"kind": "function",
"name": "apiInOf",
"qualifiedName": "apiInOf",
"location": {
"file": "src/overview.ts",
"startLine": 79,
"endLine": 81,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/overview.ts",
"moduleId": "module:src",
"signature": "apiInOf(fn: Func): Interaction | undefined",
"params": [
{
"name": "fn",
"typeRef": "Func",
"optional": false
}
],
"returnType": "Interaction | undefined",
"loc": 3
},
{
"id": "func:src/overview.ts#groupKeyFromPath@83",
"kind": "function",
"name": "groupKeyFromPath",
"qualifiedName": "groupKeyFromPath",
"location": {
"file": "src/overview.ts",
"startLine": 83,
"endLine": 89,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/overview.ts",
"moduleId": "module:src",
"signature": "groupKeyFromPath(path: string): string",
"params": [
{
"name": "path",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 7
},
{
"id": "func:src/overview.ts#reachableFuncs@92",
"kind": "function",
"name": "reachableFuncs",
"qualifiedName": "reachableFuncs",
"location": {
"file": "src/overview.ts",
"startLine": 92,
"endLine": 105,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/overview.ts",
"moduleId": "module:src",
"signature": "reachableFuncs(startId: string, adjacency: Map<string, string[]>, limit): Set<string>",
"params": [
{
"name": "startId",
"typeRef": "string",
"optional": false
},
{
"name": "adjacency",
"typeRef": "Map<string, string[]>",
"optional": false
},
{
"name": "limit",
"optional": true,
"defaultValue": "2000"
}
],
"returnType": "Set<string>",
"loc": 14
},
{
"id": "func:src/overview.ts#deriveOverview@109",
"kind": "function",
"name": "deriveOverview",
"qualifiedName": "deriveOverview",
"location": {
"file": "src/overview.ts",
"startLine": 109,
"endLine": 261,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/overview.ts",
"moduleId": "module:src",
"signature": "deriveOverview(report: Report): Overview",
"params": [
{
"name": "report",
"typeRef": "Report",
"optional": false
}
],
"returnType": "Overview",
"loc": 153
},
{
"id": "func:src/overview.ts#analyzeEntry@140",
"kind": "function",
"name": "analyzeEntry",
"qualifiedName": "analyzeEntry",
"location": {
"file": "src/overview.ts",
"startLine": 140,
"endLine": 155,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/overview.ts",
"moduleId": "module:src",
"signature": "analyzeEntry(fn: Func)",
"params": [
{
"name": "fn",
"typeRef": "Func",
"optional": false
}
],
"loc": 16
},
{
"id": "func:src/overview.ts#map() 回调@219@219",
"kind": "function",
"name": "map() 回调@219",
"qualifiedName": "map() 回调@219",
"location": {
"file": "src/overview.ts",
"startLine": 219,
"endLine": 222,
"startCol": 10,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/overview.ts",
"moduleId": "module:src",
"signature": "map() 回调@219([funcId, count])",
"params": [
{
"name": "[funcId, count]",
"optional": false
}
],
"loc": 4
},
{
"id": "func:src/overview.ts#map() 回调@229@229",
"kind": "function",
"name": "map() 回调@229",
"qualifiedName": "map() 回调@229",
"location": {
"file": "src/overview.ts",
"startLine": 229,
"endLine": 239,
"startCol": 10,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/overview.ts",
"moduleId": "module:src",
"signature": "map() 回调@229(fl)",
"params": [
{
"name": "fl",
"optional": false
}
],
"loc": 11
},
{
"id": "func:src/overview-cli.ts#main@9",
"kind": "function",
"name": "main",
"qualifiedName": "main",
"location": {
"file": "src/overview-cli.ts",
"startLine": 9,
"endLine": 84,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/overview-cli.ts",
"moduleId": "module:src",
"signature": "main()",
"params": [],
"loc": 76
},
{
"id": "func:src/overview-cli.ts#flag@16",
"kind": "function",
"name": "flag",
"qualifiedName": "flag",
"location": {
"file": "src/overview-cli.ts",
"startLine": 16,
"endLine": 21,
"startCol": 9,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/overview-cli.ts",
"moduleId": "module:src",
"signature": "flag(db: boolean, svc: boolean)",
"params": [
{
"name": "db",
"typeRef": "boolean",
"optional": false
},
{
"name": "svc",
"typeRef": "boolean",
"optional": false
}
],
"loc": 6
},
{
"id": "func:web/src/model/reportRepository.ts#HttpReportRepository.constructor@17",
"kind": "function",
"name": "constructor",
"qualifiedName": "HttpReportRepository.constructor",
"location": {
"file": "web/src/model/reportRepository.ts",
"startLine": 17,
"endLine": 17,
"startCol": 3,
"endCol": 47
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/reportRepository.ts",
"ownerId": "container:web/src/model/reportRepository.ts#HttpReportRepository@16",
"moduleId": "module:web/src/model",
"signature": "constructor(url: string)",
"params": [
{
"name": "url",
"typeRef": "string",
"optional": false
}
],
"loc": 1
},
{
"id": "func:web/src/model/reportRepository.ts#HttpReportRepository.load@19",
"kind": "function",
"name": "load",
"qualifiedName": "HttpReportRepository.load",
"location": {
"file": "web/src/model/reportRepository.ts",
"startLine": 19,
"endLine": 25,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/reportRepository.ts",
"ownerId": "container:web/src/model/reportRepository.ts#HttpReportRepository@16",
"moduleId": "module:web/src/model",
"signature": "load(): Promise<Report>",
"params": [],
"returnType": "Promise<Report>",
"loc": 7,
"interactions": [
{
"id": "ix:func:web/src/model/reportRepository.ts#HttpReportRepository.load@19:api:out:GET:",
"kind": "api",
"direction": "out",
"provenance": "resolved",
"protocol": "http",
"method": "GET"
}
]
},
{
"id": "func:web/src/model/graphModel.ts#baseName@19",
"kind": "function",
"name": "baseName",
"qualifiedName": "baseName",
"location": {
"file": "web/src/model/graphModel.ts",
"startLine": 19,
"endLine": 22,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/graphModel.ts",
"moduleId": "module:web/src/model",
"signature": "baseName(path: string): string",
"params": [
{
"name": "path",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 4
},
{
"id": "func:web/src/model/graphModel.ts#qualifierOf@24",
"kind": "function",
"name": "qualifierOf",
"qualifiedName": "qualifierOf",
"location": {
"file": "web/src/model/graphModel.ts",
"startLine": 24,
"endLine": 29,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/graphModel.ts",
"moduleId": "module:web/src/model",
"signature": "qualifierOf(fn: Func | undefined, ctx: GraphContext): string | undefined",
"params": [
{
"name": "fn",
"typeRef": "Func | undefined",
"optional": false
},
{
"name": "ctx",
"typeRef": "GraphContext",
"optional": false
}
],
"returnType": "string | undefined",
"loc": 6
},
{
"id": "func:web/src/model/graphModel.ts#flowToGraph@43",
"kind": "function",
"name": "flowToGraph",
"qualifiedName": "flowToGraph",
"location": {
"file": "web/src/model/graphModel.ts",
"startLine": 43,
"endLine": 66,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/graphModel.ts",
"moduleId": "module:web/src/model",
"signature": "flowToGraph(flow: Flow, ctx: GraphContext): GraphData",
"params": [
{
"name": "flow",
"typeRef": "Flow",
"optional": false
},
{
"name": "ctx",
"typeRef": "GraphContext",
"optional": false
}
],
"returnType": "GraphData",
"loc": 24
},
{
"id": "func:web/src/model/graphModel.ts#map() 回调@44@44",
"kind": "function",
"name": "map() 回调@44",
"qualifiedName": "map() 回调@44",
"location": {
"file": "web/src/model/graphModel.ts",
"startLine": 44,
"endLine": 54,
"startCol": 45,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/model/graphModel.ts",
"moduleId": "module:web/src/model",
"signature": "map() 回调@44(step)",
"params": [
{
"name": "step",
"optional": false
}
],
"loc": 11
},
{
"id": "func:web/src/services/dagreLayout.ts#computeLayout@31",
"kind": "function",
"name": "computeLayout",
"qualifiedName": "computeLayout",
"location": {
"file": "web/src/services/dagreLayout.ts",
"startLine": 31,
"endLine": 62,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/services/dagreLayout.ts",
"moduleId": "module:web/src/services",
"signature": "computeLayout(nodes: LayoutNodeInput[], edges: LayoutEdgeInput[], options: LayoutOptions): Map<string, Position>",
"params": [
{
"name": "nodes",
"typeRef": "LayoutNodeInput[]",
"optional": false
},
{
"name": "edges",
"typeRef": "LayoutEdgeInput[]",
"optional": false
},
{
"name": "options",
"typeRef": "LayoutOptions",
"optional": true,
"defaultValue": "{}"
}
],
"returnType": "Map<string, Position>",
"loc": 32
},
{
"id": "func:web/src/services/sourceService.ts#fetchSource@19",
"kind": "function",
"name": "fetchSource",
"qualifiedName": "fetchSource",
"location": {
"file": "web/src/services/sourceService.ts",
"startLine": 19,
"endLine": 32,
"startCol": 14,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/services/sourceService.ts",
"moduleId": "module:web/src/services",
"signature": "fetchSource(root, file, startLine, endLine)",
"params": [
{
"name": "root",
"optional": false
},
{
"name": "file",
"optional": false
},
{
"name": "startLine",
"optional": false
},
{
"name": "endLine",
"optional": false
}
],
"loc": 14,
"interactions": [
{
"id": "ix:func:web/src/services/sourceService.ts#fetchSource@19:api:out:GET:`/__source?${params.toString()}`",
"kind": "api",
"direction": "out",
"provenance": "resolved",
"protocol": "http",
"method": "GET",
"path": "`/__source?${params.toString()}`"
}
]
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"kind": "function",
"name": "baseName",
"qualifiedName": "baseName",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 43,
"endLine": 46,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"moduleId": "module:web/src/viewmodel",
"signature": "baseName(path: string): string",
"params": [
{
"name": "path",
"typeRef": "string",
"optional": false
}
],
"returnType": "string",
"loc": 4
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.constructor@69",
"kind": "function",
"name": "constructor",
"qualifiedName": "GraphViewModel.constructor",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 69,
"endLine": 83,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "constructor(sourceList: ReportSource[], makeRepository: (url: string) => ReportRepository, loadSource: LoadSource)",
"params": [
{
"name": "sourceList",
"typeRef": "ReportSource[]",
"optional": false
},
{
"name": "makeRepository",
"typeRef": "(url: string) => ReportRepository",
"optional": false
},
{
"name": "loadSource",
"typeRef": "LoadSource",
"optional": false
}
],
"loc": 15
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.sources@85",
"kind": "function",
"name": "sources",
"qualifiedName": "GraphViewModel.sources",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 85,
"endLine": 87,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "sources(): ReportSource[]",
"params": [],
"returnType": "ReportSource[]",
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentSource@89",
"kind": "function",
"name": "currentSource",
"qualifiedName": "GraphViewModel.currentSource",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 89,
"endLine": 91,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "currentSource(): ReportSource | null",
"params": [],
"returnType": "ReportSource | null",
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93",
"kind": "function",
"name": "selectReport",
"qualifiedName": "GraphViewModel.selectReport",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 93,
"endLine": 102,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "selectReport(sourceId: string): void",
"params": [
{
"name": "sourceId",
"typeRef": "string",
"optional": false
}
],
"returnType": "void",
"loc": 10
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.toggleCodePanel@104",
"kind": "function",
"name": "toggleCodePanel",
"qualifiedName": "GraphViewModel.toggleCodePanel",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 104,
"endLine": 106,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "toggleCodePanel(): void",
"params": [],
"returnType": "void",
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"kind": "function",
"name": "groupOfFlow",
"qualifiedName": "GraphViewModel.groupOfFlow",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 109,
"endLine": 132,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "groupOfFlow(flow: Flow): FlowGroup",
"params": [
{
"name": "flow",
"typeRef": "Flow",
"optional": false
}
],
"returnType": "FlowGroup",
"loc": 24
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135",
"kind": "function",
"name": "groups",
"qualifiedName": "GraphViewModel.groups",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 135,
"endLine": 144,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "groups(): FlowGroup[]",
"params": [],
"returnType": "FlowGroup[]",
"loc": 10
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147",
"kind": "function",
"name": "visibleFlows",
"qualifiedName": "GraphViewModel.visibleFlows",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 147,
"endLine": 150,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "visibleFlows(): Flow[]",
"params": [],
"returnType": "Flow[]",
"loc": 4
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedGroup@153",
"kind": "function",
"name": "selectedGroup",
"qualifiedName": "GraphViewModel.selectedGroup",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 153,
"endLine": 156,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "selectedGroup(): FlowGroup | null",
"params": [],
"returnType": "FlowGroup | null",
"loc": 4
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159",
"kind": "function",
"name": "selectedFuncOwner",
"qualifiedName": "GraphViewModel.selectedFuncOwner",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 159,
"endLine": 169,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "selectedFuncOwner(): { name: string; kind: \"class\" | \"file\"; summary?: string } | null",
"params": [],
"returnType": "{ name: string; kind: \"class\" | \"file\"; summary?: string } | null",
"loc": 11
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@171",
"kind": "function",
"name": "selectGroup",
"qualifiedName": "GraphViewModel.selectGroup",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 171,
"endLine": 178,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "selectGroup(groupId: string | null): void",
"params": [
{
"name": "groupId",
"typeRef": "string | null",
"optional": false
}
],
"returnType": "void",
"loc": 8
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"kind": "function",
"name": "load",
"qualifiedName": "GraphViewModel.load",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 180,
"endLine": 211,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "load(): Promise<void>",
"params": [],
"returnType": "Promise<void>",
"loc": 32
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flows@214",
"kind": "function",
"name": "flows",
"qualifiedName": "GraphViewModel.flows",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 214,
"endLine": 217,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "flows(): Flow[]",
"params": [],
"returnType": "Flow[]",
"loc": 4
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentFlow@219",
"kind": "function",
"name": "currentFlow",
"qualifiedName": "GraphViewModel.currentFlow",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 219,
"endLine": 222,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "currentFlow(): Flow | null",
"params": [],
"returnType": "Flow | null",
"loc": 4
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225",
"kind": "function",
"name": "positionedGraph",
"qualifiedName": "GraphViewModel.positionedGraph",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 225,
"endLine": 246,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "positionedGraph(): PositionedGraph",
"params": [],
"returnType": "PositionedGraph",
"loc": 22
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFunc@248",
"kind": "function",
"name": "selectedFunc",
"qualifiedName": "GraphViewModel.selectedFunc",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 248,
"endLine": 253,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "selectedFunc(): Func | null",
"params": [],
"returnType": "Func | null",
"loc": 6
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flowsForSelectedFunc@256",
"kind": "function",
"name": "flowsForSelectedFunc",
"qualifiedName": "GraphViewModel.flowsForSelectedFunc",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 256,
"endLine": 262,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "flowsForSelectedFunc(): Flow[]",
"params": [],
"returnType": "Flow[]",
"loc": 7
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"kind": "function",
"name": "openFlowForFunc",
"qualifiedName": "GraphViewModel.openFlowForFunc",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 265,
"endLine": 271,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "openFlowForFunc(flowId: string, funcId: string): void",
"params": [
{
"name": "flowId",
"typeRef": "string",
"optional": false
},
{
"name": "funcId",
"typeRef": "string",
"optional": false
}
],
"returnType": "void",
"loc": 7
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275",
"kind": "function",
"name": "setSearchQuery",
"qualifiedName": "GraphViewModel.setSearchQuery",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 275,
"endLine": 277,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "setSearchQuery(q: string): void",
"params": [
{
"name": "q",
"typeRef": "string",
"optional": false
}
],
"returnType": "void",
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcIdsInFlows@279",
"kind": "function",
"name": "funcIdsInFlows",
"qualifiedName": "GraphViewModel.funcIdsInFlows",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 279,
"endLine": 285,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "funcIdsInFlows(): Set<string>",
"params": [],
"returnType": "Set<string>",
"loc": 7
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"kind": "function",
"name": "biggestFlowForFunc",
"qualifiedName": "GraphViewModel.biggestFlowForFunc",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 287,
"endLine": 292,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "biggestFlowForFunc(funcId: string): Flow | null",
"params": [
{
"name": "funcId",
"typeRef": "string",
"optional": false
}
],
"returnType": "Flow | null",
"loc": 6
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchResults@294",
"kind": "function",
"name": "searchResults",
"qualifiedName": "GraphViewModel.searchResults",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 294,
"endLine": 320,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "searchResults(): SearchResult[]",
"params": [],
"returnType": "SearchResult[]",
"loc": 27
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"kind": "function",
"name": "activateSearchResult",
"qualifiedName": "GraphViewModel.activateSearchResult",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 322,
"endLine": 332,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "activateSearchResult(result: SearchResult): void",
"params": [
{
"name": "result",
"typeRef": "SearchResult",
"optional": false
}
],
"returnType": "void",
"loc": 11
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@334",
"kind": "function",
"name": "selectFlow",
"qualifiedName": "GraphViewModel.selectFlow",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 334,
"endLine": 338,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "selectFlow(flowId: string): void",
"params": [
{
"name": "flowId",
"typeRef": "string",
"optional": false
}
],
"returnType": "void",
"loc": 5
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@340",
"kind": "function",
"name": "selectNode",
"qualifiedName": "GraphViewModel.selectNode",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 340,
"endLine": 342,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "selectNode(nodeId: string | null): void",
"params": [
{
"name": "nodeId",
"typeRef": "string | null",
"optional": false
}
],
"returnType": "void",
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loadSelectedFuncCode@346",
"kind": "function",
"name": "loadSelectedFuncCode",
"qualifiedName": "GraphViewModel.loadSelectedFuncCode",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 346,
"endLine": 379,
"startCol": 3,
"endCol": 4
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"moduleId": "module:web/src/viewmodel",
"signature": "loadSelectedFuncCode(): Promise<void>",
"params": [],
"returnType": "Promise<void>",
"loc": 34
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79",
"kind": "function",
"name": "reaction() 回调@79",
"qualifiedName": "reaction() 回调@79",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 79,
"endLine": 81,
"startCol": 7,
"endCol": 8
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"moduleId": "module:web/src/viewmodel",
"signature": "reaction() 回调@79()",
"params": [],
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#runInAction() 回调@203@203",
"kind": "function",
"name": "runInAction() 回调@203",
"qualifiedName": "runInAction() 回调@203",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 203,
"endLine": 205,
"startCol": 19,
"endCol": 8
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"moduleId": "module:web/src/viewmodel",
"signature": "runInAction() 回调@203()",
"params": [],
"loc": 3
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#map() 回调@240@240",
"kind": "function",
"name": "map() 回调@240",
"qualifiedName": "map() 回调@240",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 240,
"endLine": 243,
"startCol": 53,
"endCol": 6
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"moduleId": "module:web/src/viewmodel",
"signature": "map() 回调@240(n)",
"params": [
{
"name": "n",
"optional": false
}
],
"loc": 4
},
{
"id": "func:web/src/viewmodel/GraphViewModel.ts#runInAction() 回调@368@368",
"kind": "function",
"name": "runInAction() 回调@368",
"qualifiedName": "runInAction() 回调@368",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 368,
"endLine": 377,
"startCol": 19,
"endCol": 8
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/viewmodel/GraphViewModel.ts",
"moduleId": "module:web/src/viewmodel",
"signature": "runInAction() 回调@368()",
"params": [],
"loc": 10
},
{
"id": "func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "function",
"name": "useGraphVM",
"qualifiedName": "useGraphVM",
"location": {
"file": "web/src/view/vmContext.ts",
"startLine": 6,
"endLine": 10,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/view/vmContext.ts",
"moduleId": "module:web/src/view",
"signature": "useGraphVM(): GraphViewModel",
"params": [],
"returnType": "GraphViewModel",
"loc": 5
},
{
"id": "func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"kind": "function",
"name": "interactionBadges",
"qualifiedName": "interactionBadges",
"location": {
"file": "web/src/view/components/FlowNode.tsx",
"startLine": 12,
"endLine": 38,
"startCol": 1,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowNode.tsx",
"moduleId": "module:web/src/view/components",
"signature": "interactionBadges(interactions: Interaction[]): { key: string; text: string; cls: string }[]",
"params": [
{
"name": "interactions",
"typeRef": "Interaction[]",
"optional": true
}
],
"returnType": "{ key: string; text: string; cls: string }[]",
"loc": 27
},
{
"id": "func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"kind": "function",
"name": "memo() 回调@40",
"qualifiedName": "memo() 回调@40",
"location": {
"file": "web/src/view/components/FlowNode.tsx",
"startLine": 40,
"endLine": 66,
"startCol": 30,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowNode.tsx",
"moduleId": "module:web/src/view/components",
"signature": "memo() 回调@40({ data, selected }: NodeProps & { data: FlowNodeData })",
"params": [
{
"name": "{ data, selected }",
"typeRef": "NodeProps & { data: FlowNodeData }",
"optional": false
}
],
"loc": 27
},
{
"id": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16",
"kind": "function",
"name": "observer() 回调@16",
"qualifiedName": "observer() 回调@16",
"location": {
"file": "web/src/view/components/FlowGraph.tsx",
"startLine": 16,
"endLine": 70,
"startCol": 35,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowGraph.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@16()",
"params": [],
"loc": 55
},
{
"id": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"kind": "function",
"name": "observer() 回调@4",
"qualifiedName": "observer() 回调@4",
"location": {
"file": "web/src/view/components/FlowList.tsx",
"startLine": 4,
"endLine": 38,
"startCol": 34,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowList.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@4()",
"params": [],
"loc": 35
},
{
"id": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"kind": "function",
"name": "observer() 回调@4",
"qualifiedName": "observer() 回调@4",
"location": {
"file": "web/src/view/components/GroupList.tsx",
"startLine": 4,
"endLine": 36,
"startCol": 35,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/GroupList.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@4()",
"params": [],
"loc": 33
},
{
"id": "func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"kind": "function",
"name": "describeInteraction",
"qualifiedName": "describeInteraction",
"location": {
"file": "web/src/view/components/NodeDetailPanel.tsx",
"startLine": 5,
"endLine": 11,
"startCol": 1,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/NodeDetailPanel.tsx",
"moduleId": "module:web/src/view/components",
"signature": "describeInteraction(ix: Interaction): string",
"params": [
{
"name": "ix",
"typeRef": "Interaction",
"optional": false
}
],
"returnType": "string",
"loc": 7
},
{
"id": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"kind": "function",
"name": "observer() 回调@13",
"qualifiedName": "observer() 回调@13",
"location": {
"file": "web/src/view/components/NodeDetailPanel.tsx",
"startLine": 13,
"endLine": 98,
"startCol": 41,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/NodeDetailPanel.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@13()",
"params": [],
"loc": 86
},
{
"id": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"kind": "function",
"name": "observer() 回调@6",
"qualifiedName": "observer() 回调@6",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 6,
"endLine": 59,
"startCol": 35,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/SearchBar.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@6()",
"params": [],
"loc": 54
},
{
"id": "func:web/src/view/components/SearchBar.tsx#activate@12",
"kind": "function",
"name": "activate",
"qualifiedName": "activate",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 12,
"endLine": 15,
"startCol": 9,
"endCol": 4
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/SearchBar.tsx",
"moduleId": "module:web/src/view/components",
"signature": "activate(r: SearchResult): void",
"params": [
{
"name": "r",
"typeRef": "SearchResult",
"optional": false
}
],
"returnType": "void",
"loc": 4
},
{
"id": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"kind": "function",
"name": "匿名函数@26",
"qualifiedName": "匿名函数@26",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 26,
"endLine": 29,
"startCol": 20,
"endCol": 10
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/SearchBar.tsx",
"moduleId": "module:web/src/view/components",
"signature": "匿名函数@26(e)",
"params": [
{
"name": "e",
"optional": false
}
],
"loc": 4
},
{
"id": "func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"kind": "function",
"name": "匿名函数@41",
"qualifiedName": "匿名函数@41",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 41,
"endLine": 44,
"startCol": 30,
"endCol": 18
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/SearchBar.tsx",
"moduleId": "module:web/src/view/components",
"signature": "匿名函数@41(e)",
"params": [
{
"name": "e",
"optional": false
}
],
"loc": 4
},
{
"id": "func:web/src/services/languageMap.ts#languageOf@42",
"kind": "function",
"name": "languageOf",
"qualifiedName": "languageOf",
"location": {
"file": "web/src/services/languageMap.ts",
"startLine": 42,
"endLine": 48,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/services/languageMap.ts",
"moduleId": "module:web/src/services",
"signature": "languageOf(file: string | undefined): string",
"params": [
{
"name": "file",
"typeRef": "string | undefined",
"optional": false
}
],
"returnType": "string",
"loc": 7
},
{
"id": "func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7",
"kind": "function",
"name": "observer() 回调@7",
"qualifiedName": "observer() 回调@7",
"location": {
"file": "web/src/view/components/CodePanel.tsx",
"startLine": 7,
"endLine": 66,
"startCol": 35,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/CodePanel.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@7()",
"params": [],
"loc": 60
},
{
"id": "func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4",
"kind": "function",
"name": "observer() 回调@4",
"qualifiedName": "observer() 回调@4",
"location": {
"file": "web/src/view/components/FlowBanner.tsx",
"startLine": 4,
"endLine": 16,
"startCol": 36,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowBanner.tsx",
"moduleId": "module:web/src/view/components",
"signature": "observer() 回调@4()",
"params": [],
"loc": 13
},
{
"id": "func:web/src/view/App.tsx#observer() 回调@11@11",
"kind": "function",
"name": "observer() 回调@11",
"qualifiedName": "observer() 回调@11",
"location": {
"file": "web/src/view/App.tsx",
"startLine": 11,
"endLine": 60,
"startCol": 29,
"endCol": 2
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/App.tsx",
"moduleId": "module:web/src/view",
"signature": "observer() 回调@11()",
"params": [],
"loc": 50
},
{
"id": "func:web/vite.config.ts#sourceServer@11",
"kind": "function",
"name": "sourceServer",
"qualifiedName": "sourceServer",
"location": {
"file": "web/vite.config.ts",
"startLine": 11,
"endLine": 52,
"startCol": 1,
"endCol": 2
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/vite.config.ts",
"moduleId": "module:web",
"signature": "sourceServer(): Plugin",
"params": [],
"returnType": "Plugin",
"loc": 42
},
{
"id": "func:web/vite.config.ts#use() 回调@15@15",
"kind": "function",
"name": "use() 回调@15",
"qualifiedName": "use() 回调@15",
"location": {
"file": "web/vite.config.ts",
"startLine": 15,
"endLine": 49,
"startCol": 43,
"endCol": 8
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/vite.config.ts",
"moduleId": "module:web",
"signature": "use() 回调@15(req, res)",
"params": [
{
"name": "req",
"optional": false
},
{
"name": "res",
"optional": false
}
],
"loc": 35
},
{
"id": "func:scripts/annotate-self-report.mjs#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "scripts/annotate-self-report.mjs",
"startLine": 1,
"endLine": 119
},
"language": "javascript",
"provenance": "ast",
"fileId": "file:scripts/annotate-self-report.mjs",
"moduleId": "module:scripts",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:src/cli.ts#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "src/cli.ts",
"startLine": 1,
"endLine": 71
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/cli.ts",
"moduleId": "module:src",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:src/overview-cli.ts#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "src/overview-cli.ts",
"startLine": 1,
"endLine": 87
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:src/overview-cli.ts",
"moduleId": "module:src",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/vmContext.ts#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/vmContext.ts",
"startLine": 1,
"endLine": 11
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/src/view/vmContext.ts",
"moduleId": "module:web/src/view",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/FlowNode.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/FlowNode.tsx",
"startLine": 1,
"endLine": 67
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowNode.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/FlowGraph.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/FlowGraph.tsx",
"startLine": 1,
"endLine": 71
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowGraph.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/FlowList.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/FlowList.tsx",
"startLine": 1,
"endLine": 39
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowList.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/GroupList.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/GroupList.tsx",
"startLine": 1,
"endLine": 37
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/GroupList.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/NodeDetailPanel.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/NodeDetailPanel.tsx",
"startLine": 1,
"endLine": 99
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/NodeDetailPanel.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/SearchBar.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/SearchBar.tsx",
"startLine": 1,
"endLine": 60
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/SearchBar.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/CodePanel.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/CodePanel.tsx",
"startLine": 1,
"endLine": 67
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/CodePanel.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/components/FlowBanner.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/components/FlowBanner.tsx",
"startLine": 1,
"endLine": 17
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/components/FlowBanner.tsx",
"moduleId": "module:web/src/view/components",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/view/App.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/view/App.tsx",
"startLine": 1,
"endLine": 61
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/view/App.tsx",
"moduleId": "module:web/src/view",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/src/main.tsx#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/src/main.tsx",
"startLine": 1,
"endLine": 27
},
"language": "tsx",
"provenance": "ast",
"fileId": "file:web/src/main.tsx",
"moduleId": "module:web/src",
"params": [],
"isEntry": true,
"summary": "模块顶层代码(副作用/初始化)"
},
{
"id": "func:web/vite.config.ts#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"location": {
"file": "web/vite.config.ts",
"startLine": 1,
"endLine": 61
},
"language": "typescript",
"provenance": "ast",
"fileId": "file:web/vite.config.ts",
"moduleId": "module:web",
"params": [],
"summary": "模块顶层代码(副作用/初始化)"
}
],
"fields": [
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loading@53",
"kind": "field",
"name": "loading",
"qualifiedName": "GraphViewModel.loading",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 53,
"endLine": 53,
"startCol": 3,
"endCol": 19
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.error@54",
"kind": "field",
"name": "error",
"qualifiedName": "GraphViewModel.error",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 54,
"endLine": 54,
"startCol": 3,
"endCol": 31
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"typeRef": "string | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.report@55",
"kind": "field",
"name": "report",
"qualifiedName": "GraphViewModel.report",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 55,
"endLine": 55,
"startCol": 3,
"endCol": 32
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"typeRef": "Report | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedSourceId@57",
"kind": "field",
"name": "selectedSourceId",
"qualifiedName": "GraphViewModel.selectedSourceId",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 57,
"endLine": 57,
"startCol": 3,
"endCol": 42
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"typeRef": "string | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedGroupId@58",
"kind": "field",
"name": "selectedGroupId",
"qualifiedName": "GraphViewModel.selectedGroupId",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 58,
"endLine": 58,
"startCol": 3,
"endCol": 41
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"typeRef": "string | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFlowId@59",
"kind": "field",
"name": "selectedFlowId",
"qualifiedName": "GraphViewModel.selectedFlowId",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 59,
"endLine": 59,
"startCol": 3,
"endCol": 40
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"typeRef": "string | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedNodeId@60",
"kind": "field",
"name": "selectedNodeId",
"qualifiedName": "GraphViewModel.selectedNodeId",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 60,
"endLine": 60,
"startCol": 3,
"endCol": 40
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"typeRef": "string | null"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchQuery@61",
"kind": "field",
"name": "searchQuery",
"qualifiedName": "GraphViewModel.searchQuery",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 61,
"endLine": 61,
"startCol": 3,
"endCol": 20
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.codeState@62",
"kind": "field",
"name": "codeState",
"qualifiedName": "GraphViewModel.codeState",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 62,
"endLine": 62,
"startCol": 3,
"endCol": 87
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52",
"typeRef": "CodeState"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.codePanelCollapsed@63",
"kind": "field",
"name": "codePanelCollapsed",
"qualifiedName": "GraphViewModel.codePanelCollapsed",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 63,
"endLine": 63,
"startCol": 3,
"endCol": 30
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcById@65",
"kind": "field",
"name": "funcById",
"qualifiedName": "GraphViewModel.funcById",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 65,
"endLine": 65,
"startCol": 3,
"endCol": 46
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.containerById@66",
"kind": "field",
"name": "containerById",
"qualifiedName": "GraphViewModel.containerById",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 66,
"endLine": 66,
"startCol": 3,
"endCol": 56
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52"
},
{
"id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.fileById@67",
"kind": "field",
"name": "fileById",
"qualifiedName": "GraphViewModel.fileById",
"location": {
"file": "web/src/viewmodel/GraphViewModel.ts",
"startLine": 67,
"endLine": 67,
"startCol": 3,
"endCol": 50
},
"language": "typescript",
"provenance": "ast",
"ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@52"
}
],
"edges": [
{
"id": "edge:call:func:src/scanner.ts#collectSourceFiles@24=>func:src/scanner.ts#walk@27",
"kind": "call",
"sourceId": "func:src/scanner.ts#collectSourceFiles@24",
"targetId": "func:src/scanner.ts#walk@27",
"provenance": "resolved"
},
{
"id": "edge:import:file:src/externals.ts=>file:src/types.ts",
"kind": "import",
"sourceId": "file:src/externals.ts",
"targetId": "file:src/types.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:src/flows.ts=>file:src/types.ts",
"kind": "import",
"sourceId": "file:src/flows.ts",
"targetId": "file:src/types.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:src/flows.ts#map() 回调@72@72=>func:src/flows.ts#stepIdOf@70",
"kind": "call",
"sourceId": "func:src/flows.ts#map() 回调@72@72",
"targetId": "func:src/flows.ts#stepIdOf@70",
"provenance": "resolved"
},
{
"id": "edge:import:file:src/analyzer.ts=>file:src/scanner.ts",
"kind": "import",
"sourceId": "file:src/analyzer.ts",
"targetId": "file:src/scanner.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:src/analyzer.ts=>file:src/types.ts",
"kind": "import",
"sourceId": "file:src/analyzer.ts",
"targetId": "file:src/types.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:src/analyzer.ts=>file:src/externals.ts",
"kind": "import",
"sourceId": "file:src/analyzer.ts",
"targetId": "file:src/externals.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:src/analyzer.ts=>file:src/flows.ts",
"kind": "import",
"sourceId": "file:src/analyzer.ts",
"targetId": "file:src/flows.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/scanner.ts#collectSourceFiles@24",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/scanner.ts#collectSourceFiles@24",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#relOf@64=>func:src/scanner.ts#toPosix@19",
"kind": "call",
"sourceId": "func:src/analyzer.ts#relOf@64",
"targetId": "func:src/scanner.ts#toPosix@19",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#inProject@65=>func:src/analyzer.ts#relOf@64",
"kind": "call",
"sourceId": "func:src/analyzer.ts#inProject@65",
"targetId": "func:src/analyzer.ts#relOf@64",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#locOf@70=>func:src/analyzer.ts#relOf@64",
"kind": "call",
"sourceId": "func:src/analyzer.ts#locOf@70",
"targetId": "func:src/analyzer.ts#relOf@64",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#locOf@70",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFunc@122",
"targetId": "func:src/analyzer.ts#locOf@70",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#getParams@108",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFunc@122",
"targetId": "func:src/analyzer.ts#getParams@108",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/scanner.ts#languageOf@52",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFunc@122",
"targetId": "func:src/scanner.ts#languageOf@52",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#buildSignature@117",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFunc@122",
"targetId": "func:src/analyzer.ts#buildSignature@117",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#routeNameFromCall@188=>func:src/analyzer.ts#extractPathArg@333",
"kind": "call",
"sourceId": "func:src/analyzer.ts#routeNameFromCall@188",
"targetId": "func:src/analyzer.ts#extractPathArg@333",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#inlineName@202=>func:src/analyzer.ts#locOf@70",
"kind": "call",
"sourceId": "func:src/analyzer.ts#inlineName@202",
"targetId": "func:src/analyzer.ts#locOf@70",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#inlineName@202=>func:src/analyzer.ts#routeNameFromCall@188",
"kind": "call",
"sourceId": "func:src/analyzer.ts#inlineName@202",
"targetId": "func:src/analyzer.ts#routeNameFromCall@188",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFile@223=>func:src/analyzer.ts#relOf@64",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFile@223",
"targetId": "func:src/analyzer.ts#relOf@64",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFile@223=>func:src/scanner.ts#languageOf@52",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFile@223",
"targetId": "func:src/scanner.ts#languageOf@52",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFile@223=>func:src/scanner.ts#toPosix@19",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFile@223",
"targetId": "func:src/scanner.ts#toPosix@19",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#registerFile@223=>func:src/analyzer.ts#ensureModule@83",
"kind": "call",
"sourceId": "func:src/analyzer.ts#registerFile@223",
"targetId": "func:src/analyzer.ts#ensureModule@83",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#locOf@70",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/analyzer.ts#locOf@70",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/scanner.ts#languageOf@52",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/scanner.ts#languageOf@52",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#registerFunc@122",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/analyzer.ts#registerFunc@122",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#isFnInit@169",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/analyzer.ts#isFnInit@169",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#containsCall@173",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/analyzer.ts#containsCall@173",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#inlineName@202",
"kind": "call",
"sourceId": "func:src/analyzer.ts#visit@245",
"targetId": "func:src/analyzer.ts#inlineName@202",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#extractPathArg@333",
"kind": "call",
"sourceId": "func:src/analyzer.ts#detectApiOut@382",
"targetId": "func:src/analyzer.ts#extractPathArg@333",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#extractMethodFromOptions@341",
"kind": "call",
"sourceId": "func:src/analyzer.ts#detectApiOut@382",
"targetId": "func:src/analyzer.ts#extractMethodFromOptions@341",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#hostOf@352",
"kind": "call",
"sourceId": "func:src/analyzer.ts#detectApiOut@382",
"targetId": "func:src/analyzer.ts#hostOf@352",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#detectApiIn@400=>func:src/analyzer.ts#extractPathArg@333",
"kind": "call",
"sourceId": "func:src/analyzer.ts#detectApiIn@400",
"targetId": "func:src/analyzer.ts#extractPathArg@333",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#getModuleFunc@462=>func:src/scanner.ts#languageOf@52",
"kind": "call",
"sourceId": "func:src/analyzer.ts#getModuleFunc@462",
"targetId": "func:src/scanner.ts#languageOf@52",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeRelations@487=>func:src/analyzer.ts#relOf@64",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeRelations@487",
"targetId": "func:src/analyzer.ts#relOf@64",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#resolveInternalImport@548",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#resolveInternalImport@548",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#addEdge@433",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#addEdge@433",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#getModuleFunc@462",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#getModuleFunc@462",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#resolveCallTargetFuncId@440",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#resolveCallTargetFuncId@440",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectDb@358",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#detectDb@358",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#addInteraction@419",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#addInteraction@419",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectApiOut@382",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#detectApiOut@382",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectApiIn@400",
"kind": "call",
"sourceId": "func:src/analyzer.ts#walk@492",
"targetId": "func:src/analyzer.ts#detectApiIn@400",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeRelations@487=>func:src/analyzer.ts#walk@492",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeRelations@487",
"targetId": "func:src/analyzer.ts#walk@492",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#resolveInternalImport@548=>func:src/scanner.ts#toPosix@19",
"kind": "call",
"sourceId": "func:src/analyzer.ts#resolveInternalImport@548",
"targetId": "func:src/scanner.ts#toPosix@19",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#registerFile@223",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/analyzer.ts#registerFile@223",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#analyzeRelations@487",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/analyzer.ts#analyzeRelations@487",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#ensureModule@83",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/analyzer.ts#ensureModule@83",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/flows.ts#generateCallFlows@16",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/flows.ts#generateCallFlows@16",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/scanner.ts#toPosix@19",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/scanner.ts#toPosix@19",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/externals.ts#deriveExternalSystems@4",
"kind": "call",
"sourceId": "func:src/analyzer.ts#analyzeProject@32",
"targetId": "func:src/externals.ts#deriveExternalSystems@4",
"provenance": "resolved"
},
{
"id": "edge:import:file:src/cli.ts=>file:src/analyzer.ts",
"kind": "import",
"sourceId": "file:src/cli.ts",
"targetId": "file:src/analyzer.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:src/cli.ts#main@40=>func:src/cli.ts#parseArgs@13",
"kind": "call",
"sourceId": "func:src/cli.ts#main@40",
"targetId": "func:src/cli.ts#parseArgs@13",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/cli.ts#main@40=>func:src/analyzer.ts#analyzeProject@32",
"kind": "call",
"sourceId": "func:src/cli.ts#main@40",
"targetId": "func:src/analyzer.ts#analyzeProject@32",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/cli.ts#<module>@0=>func:src/cli.ts#main@40",
"kind": "call",
"sourceId": "func:src/cli.ts#<module>@0",
"targetId": "func:src/cli.ts#main@40",
"provenance": "resolved"
},
{
"id": "edge:import:file:src/overview.ts=>file:src/types.ts",
"kind": "import",
"sourceId": "file:src/overview.ts",
"targetId": "file:src/types.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:src/overview.ts#analyzeEntry@140=>func:src/overview.ts#reachableFuncs@92",
"kind": "call",
"sourceId": "func:src/overview.ts#analyzeEntry@140",
"targetId": "func:src/overview.ts#reachableFuncs@92",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/overview.ts#deriveOverview@109=>func:src/overview.ts#apiInOf@79",
"kind": "call",
"sourceId": "func:src/overview.ts#deriveOverview@109",
"targetId": "func:src/overview.ts#apiInOf@79",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/overview.ts#deriveOverview@109=>func:src/overview.ts#analyzeEntry@140",
"kind": "call",
"sourceId": "func:src/overview.ts#deriveOverview@109",
"targetId": "func:src/overview.ts#analyzeEntry@140",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/overview.ts#deriveOverview@109=>func:src/overview.ts#groupKeyFromPath@83",
"kind": "call",
"sourceId": "func:src/overview.ts#deriveOverview@109",
"targetId": "func:src/overview.ts#groupKeyFromPath@83",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/overview.ts#map() 回调@229@229=>func:src/overview.ts#analyzeEntry@140",
"kind": "call",
"sourceId": "func:src/overview.ts#map() 回调@229@229",
"targetId": "func:src/overview.ts#analyzeEntry@140",
"provenance": "resolved"
},
{
"id": "edge:import:file:src/overview-cli.ts=>file:src/overview.ts",
"kind": "import",
"sourceId": "file:src/overview-cli.ts",
"targetId": "file:src/overview.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:src/overview-cli.ts=>file:src/types.ts",
"kind": "import",
"sourceId": "file:src/overview-cli.ts",
"targetId": "file:src/types.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:src/overview-cli.ts#main@9=>func:src/overview.ts#deriveOverview@109",
"kind": "call",
"sourceId": "func:src/overview-cli.ts#main@9",
"targetId": "func:src/overview.ts#deriveOverview@109",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/overview-cli.ts#main@9=>func:src/overview-cli.ts#flag@16",
"kind": "call",
"sourceId": "func:src/overview-cli.ts#main@9",
"targetId": "func:src/overview-cli.ts#flag@16",
"provenance": "resolved"
},
{
"id": "edge:call:func:src/overview-cli.ts#<module>@0=>func:src/overview-cli.ts#main@9",
"kind": "call",
"sourceId": "func:src/overview-cli.ts#<module>@0",
"targetId": "func:src/overview-cli.ts#main@9",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/model/reportRepository.ts=>file:web/src/model/report.ts",
"kind": "import",
"sourceId": "file:web/src/model/reportRepository.ts",
"targetId": "file:web/src/model/report.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/model/graphModel.ts=>file:web/src/model/report.ts",
"kind": "import",
"sourceId": "file:web/src/model/graphModel.ts",
"targetId": "file:web/src/model/report.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/model/graphModel.ts#qualifierOf@24=>func:web/src/model/graphModel.ts#baseName@19",
"kind": "call",
"sourceId": "func:web/src/model/graphModel.ts#qualifierOf@24",
"targetId": "func:web/src/model/graphModel.ts#baseName@19",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/model/graphModel.ts#map() 回调@44@44=>func:web/src/model/graphModel.ts#qualifierOf@24",
"kind": "call",
"sourceId": "func:web/src/model/graphModel.ts#map() 回调@44@44",
"targetId": "func:web/src/model/graphModel.ts#qualifierOf@24",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/viewmodel/GraphViewModel.ts=>file:web/src/model/report.ts",
"kind": "import",
"sourceId": "file:web/src/viewmodel/GraphViewModel.ts",
"targetId": "file:web/src/model/report.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/viewmodel/GraphViewModel.ts=>file:web/src/model/reportRepository.ts",
"kind": "import",
"sourceId": "file:web/src/viewmodel/GraphViewModel.ts",
"targetId": "file:web/src/model/reportRepository.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/viewmodel/GraphViewModel.ts=>file:web/src/model/graphModel.ts",
"kind": "import",
"sourceId": "file:web/src/viewmodel/GraphViewModel.ts",
"targetId": "file:web/src/model/graphModel.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/viewmodel/GraphViewModel.ts=>file:web/src/services/dagreLayout.ts",
"kind": "import",
"sourceId": "file:web/src/viewmodel/GraphViewModel.ts",
"targetId": "file:web/src/services/dagreLayout.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/viewmodel/GraphViewModel.ts=>file:web/src/services/sourceService.ts",
"kind": "import",
"sourceId": "file:web/src/viewmodel/GraphViewModel.ts",
"targetId": "file:web/src/services/sourceService.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loadSelectedFuncCode@346",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loadSelectedFuncCode@346",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109=>func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159=>func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225=>func:web/src/model/graphModel.ts#flowToGraph@43",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225",
"targetId": "func:web/src/model/graphModel.ts#flowToGraph@43",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225=>func:web/src/services/dagreLayout.ts#computeLayout@31",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225",
"targetId": "func:web/src/services/dagreLayout.ts#computeLayout@31",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"kind": "call",
"sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/vmContext.ts=>file:web/src/viewmodel/GraphViewModel.ts",
"kind": "import",
"sourceId": "file:web/src/view/vmContext.ts",
"targetId": "file:web/src/viewmodel/GraphViewModel.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/components/FlowNode.tsx=>file:web/src/model/report.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/FlowNode.tsx",
"targetId": "file:web/src/model/report.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40=>func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"targetId": "func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/FlowGraph.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/FlowGraph.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/components/FlowGraph.tsx=>file:web/src/view/components/FlowNode.tsx",
"kind": "import",
"sourceId": "file:web/src/view/components/FlowGraph.tsx",
"targetId": "file:web/src/view/components/FlowNode.tsx",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@340",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@340",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/FlowList.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/FlowList.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@334",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@334",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/GroupList.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/GroupList.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@171",
"kind": "call",
"sourceId": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@171",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/NodeDetailPanel.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/NodeDetailPanel.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/components/NodeDetailPanel.tsx=>file:web/src/model/report.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/NodeDetailPanel.tsx",
"targetId": "file:web/src/model/report.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"kind": "call",
"sourceId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"targetId": "func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"kind": "call",
"sourceId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/SearchBar.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/SearchBar.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/components/SearchBar.tsx=>file:web/src/viewmodel/GraphViewModel.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/SearchBar.tsx",
"targetId": "file:web/src/viewmodel/GraphViewModel.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#activate@12=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#activate@12",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26=>func:web/src/view/components/SearchBar.tsx#activate@12",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"targetId": "func:web/src/view/components/SearchBar.tsx#activate@12",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41=>func:web/src/view/components/SearchBar.tsx#activate@12",
"kind": "call",
"sourceId": "func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"targetId": "func:web/src/view/components/SearchBar.tsx#activate@12",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/CodePanel.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/CodePanel.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/components/CodePanel.tsx=>file:web/src/services/languageMap.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/CodePanel.tsx",
"targetId": "file:web/src/services/languageMap.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7=>func:web/src/services/languageMap.ts#languageOf@42",
"kind": "call",
"sourceId": "func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7",
"targetId": "func:web/src/services/languageMap.ts#languageOf@42",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.toggleCodePanel@104",
"kind": "call",
"sourceId": "func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.toggleCodePanel@104",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/components/FlowBanner.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/components/FlowBanner.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/FlowGraph.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/FlowGraph.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/FlowList.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/FlowList.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/GroupList.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/GroupList.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/NodeDetailPanel.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/NodeDetailPanel.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/SearchBar.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/SearchBar.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/CodePanel.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/CodePanel.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/view/App.tsx=>file:web/src/view/components/FlowBanner.tsx",
"kind": "import",
"sourceId": "file:web/src/view/App.tsx",
"targetId": "file:web/src/view/components/FlowBanner.tsx",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/view/App.tsx#observer() 回调@11@11=>func:web/src/view/vmContext.ts#useGraphVM@6",
"kind": "call",
"sourceId": "func:web/src/view/App.tsx#observer() 回调@11@11",
"targetId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/src/view/App.tsx#observer() 回调@11@11=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93",
"kind": "call",
"sourceId": "func:web/src/view/App.tsx#observer() 回调@11@11",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93",
"provenance": "resolved"
},
{
"id": "edge:import:file:web/src/main.tsx=>file:web/src/view/App.tsx",
"kind": "import",
"sourceId": "file:web/src/main.tsx",
"targetId": "file:web/src/view/App.tsx",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/main.tsx=>file:web/src/view/vmContext.ts",
"kind": "import",
"sourceId": "file:web/src/main.tsx",
"targetId": "file:web/src/view/vmContext.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/main.tsx=>file:web/src/viewmodel/GraphViewModel.ts",
"kind": "import",
"sourceId": "file:web/src/main.tsx",
"targetId": "file:web/src/viewmodel/GraphViewModel.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/main.tsx=>file:web/src/model/reportRepository.ts",
"kind": "import",
"sourceId": "file:web/src/main.tsx",
"targetId": "file:web/src/model/reportRepository.ts",
"provenance": "ast"
},
{
"id": "edge:import:file:web/src/main.tsx=>file:web/src/services/sourceService.ts",
"kind": "import",
"sourceId": "file:web/src/main.tsx",
"targetId": "file:web/src/services/sourceService.ts",
"provenance": "ast"
},
{
"id": "edge:call:func:web/src/main.tsx#<module>@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"kind": "call",
"sourceId": "func:web/src/main.tsx#<module>@0",
"targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"provenance": "resolved"
},
{
"id": "edge:call:func:web/vite.config.ts#<module>@0=>func:web/vite.config.ts#sourceServer@11",
"kind": "call",
"sourceId": "func:web/vite.config.ts#<module>@0",
"targetId": "func:web/vite.config.ts#sourceServer@11",
"provenance": "resolved"
}
],
"flows": [
{
"id": "flow:call:func:web/src/main.tsx#<module>@0",
"name": "<module> (web/src/main.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/main.tsx#<module>@0",
"steps": [
{
"id": "step:flow:call:func:web/src/main.tsx#<module>@0:func:web/src/main.tsx#<module>@0",
"order": 0,
"nodeId": "func:web/src/main.tsx#<module>@0",
"title": "<module>",
"nextStepIds": [
"step:flow:call:func:web/src/main.tsx#<module>@0:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180"
]
},
{
"id": "step:flow:call:func:web/src/main.tsx#<module>@0:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"order": 1,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"title": "GraphViewModel.load",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/main.tsx#<module>@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180"
],
"summary": "前端启动:构建报告数据源与 ViewModel,挂载 React 应用"
},
{
"id": "flow:call:func:src/analyzer.ts#visit@245",
"name": "visit (src/analyzer.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:src/analyzer.ts#visit@245",
"steps": [
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#visit@245",
"order": 0,
"nodeId": "func:src/analyzer.ts#visit@245",
"title": "visit",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#locOf@70",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/scanner.ts#languageOf@52",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#registerFunc@122",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#isFnInit@169",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#containsCall@173",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#inlineName@202"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#locOf@70",
"order": 1,
"nodeId": "func:src/analyzer.ts#locOf@70",
"title": "locOf",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#relOf@64"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/scanner.ts#languageOf@52",
"order": 2,
"nodeId": "func:src/scanner.ts#languageOf@52",
"title": "languageOf",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#registerFunc@122",
"order": 3,
"nodeId": "func:src/analyzer.ts#registerFunc@122",
"title": "registerFunc",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#locOf@70",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#getParams@108",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/scanner.ts#languageOf@52",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#buildSignature@117"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#isFnInit@169",
"order": 4,
"nodeId": "func:src/analyzer.ts#isFnInit@169",
"title": "isFnInit",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#containsCall@173",
"order": 5,
"nodeId": "func:src/analyzer.ts#containsCall@173",
"title": "containsCall",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#inlineName@202",
"order": 6,
"nodeId": "func:src/analyzer.ts#inlineName@202",
"title": "inlineName",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#locOf@70",
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#routeNameFromCall@188"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#relOf@64",
"order": 7,
"nodeId": "func:src/analyzer.ts#relOf@64",
"title": "relOf",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/scanner.ts#toPosix@19"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#getParams@108",
"order": 8,
"nodeId": "func:src/analyzer.ts#getParams@108",
"title": "getParams",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#buildSignature@117",
"order": 9,
"nodeId": "func:src/analyzer.ts#buildSignature@117",
"title": "buildSignature",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#routeNameFromCall@188",
"order": 10,
"nodeId": "func:src/analyzer.ts#routeNameFromCall@188",
"title": "routeNameFromCall",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#extractPathArg@333"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/scanner.ts#toPosix@19",
"order": 11,
"nodeId": "func:src/scanner.ts#toPosix@19",
"title": "toPosix",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/analyzer.ts#visit@245:func:src/analyzer.ts#extractPathArg@333",
"order": 12,
"nodeId": "func:src/analyzer.ts#extractPathArg@333",
"title": "extractPathArg",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:src/analyzer.ts#relOf@64=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#locOf@70=>func:src/analyzer.ts#relOf@64",
"edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#locOf@70",
"edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#getParams@108",
"edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/scanner.ts#languageOf@52",
"edge:call:func:src/analyzer.ts#registerFunc@122=>func:src/analyzer.ts#buildSignature@117",
"edge:call:func:src/analyzer.ts#routeNameFromCall@188=>func:src/analyzer.ts#extractPathArg@333",
"edge:call:func:src/analyzer.ts#inlineName@202=>func:src/analyzer.ts#locOf@70",
"edge:call:func:src/analyzer.ts#inlineName@202=>func:src/analyzer.ts#routeNameFromCall@188",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#locOf@70",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/scanner.ts#languageOf@52",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#registerFunc@122",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#isFnInit@169",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#containsCall@173",
"edge:call:func:src/analyzer.ts#visit@245=>func:src/analyzer.ts#inlineName@202"
],
"summary": "AST 遍历核心:递归访问语法树,登记函数 / 容器并建立调用边"
},
{
"id": "flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"name": "observer() 回调@13 (web/src/view/components/NodeDetailPanel.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"order": 0,
"nodeId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13",
"title": "observer() 回调@13",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265"
]
},
{
"id": "step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"order": 2,
"nodeId": "func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"title": "describeInteraction",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"order": 3,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"title": "GraphViewModel.openFlowForFunc",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/view/components/NodeDetailPanel.tsx#describeInteraction@5",
"edge:call:func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265"
],
"summary": "渲染右侧节点详情:位置、归属、交互、所在流程"
},
{
"id": "flow:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7",
"name": "observer() 回调@7 (web/src/view/components/CodePanel.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7",
"order": 0,
"nodeId": "func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7",
"title": "observer() 回调@7",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7:func:web/src/services/languageMap.ts#languageOf@42",
"step:flow:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.toggleCodePanel@104"
]
},
{
"id": "step:flow:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7:func:web/src/services/languageMap.ts#languageOf@42",
"order": 2,
"nodeId": "func:web/src/services/languageMap.ts#languageOf@42",
"title": "languageOf",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.toggleCodePanel@104",
"order": 3,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.toggleCodePanel@104",
"title": "GraphViewModel.toggleCodePanel",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7=>func:web/src/services/languageMap.ts#languageOf@42",
"edge:call:func:web/src/view/components/CodePanel.tsx#observer() 回调@7@7=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.toggleCodePanel@104"
],
"summary": "渲染底部源码面板:随选中节点显示语法高亮源码"
},
{
"id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225",
"name": "GraphViewModel.positionedGraph (web/src/viewmodel/GraphViewModel.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225",
"steps": [
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225",
"order": 0,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225",
"title": "GraphViewModel.positionedGraph",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225:func:web/src/model/graphModel.ts#flowToGraph@43",
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225:func:web/src/services/dagreLayout.ts#computeLayout@31"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225:func:web/src/model/graphModel.ts#flowToGraph@43",
"order": 1,
"nodeId": "func:web/src/model/graphModel.ts#flowToGraph@43",
"title": "flowToGraph",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225:func:web/src/services/dagreLayout.ts#computeLayout@31",
"order": 2,
"nodeId": "func:web/src/services/dagreLayout.ts#computeLayout@31",
"title": "computeLayout",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225=>func:web/src/model/graphModel.ts#flowToGraph@43",
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@225=>func:web/src/services/dagreLayout.ts#computeLayout@31"
],
"summary": "计算当前流程的带坐标中性图(含 Dagre 自动布局)"
},
{
"id": "flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16",
"name": "observer() 回调@16 (web/src/view/components/FlowGraph.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16",
"order": 0,
"nodeId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16",
"title": "observer() 回调@16",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@340"
]
},
{
"id": "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@340",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@340",
"title": "GraphViewModel.selectNode",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@16@16=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@340"
],
"summary": "把中性图适配为 React Flow 节点 / 边并渲染画布"
},
{
"id": "flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"name": "observer() 回调@4 (web/src/view/components/FlowList.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"order": 0,
"nodeId": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4",
"title": "observer() 回调@4",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@334"
]
},
{
"id": "step:flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@334",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@334",
"title": "GraphViewModel.selectFlow",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/FlowList.tsx#observer() 回调@4@4=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@334"
],
"summary": "渲染流程列表并处理流程选择"
},
{
"id": "flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"name": "observer() 回调@4 (web/src/view/components/GroupList.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"order": 0,
"nodeId": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4",
"title": "observer() 回调@4",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@171"
]
},
{
"id": "step:flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@171",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@171",
"title": "GraphViewModel.selectGroup",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/GroupList.tsx#observer() 回调@4@4=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@171"
],
"summary": "渲染分组列表,按类 / 文件过滤流程"
},
{
"id": "flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"name": "observer() 回调@6 (web/src/view/components/SearchBar.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"order": 0,
"nodeId": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6",
"title": "observer() 回调@6",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275",
"title": "GraphViewModel.setSearchQuery",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275"
],
"summary": "渲染搜索框与结果下拉"
},
{
"id": "flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"name": "匿名函数@26 (web/src/view/components/SearchBar.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"order": 0,
"nodeId": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26",
"title": "匿名函数@26",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/view/components/SearchBar.tsx#activate@12",
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/view/components/SearchBar.tsx#activate@12",
"order": 1,
"nodeId": "func:web/src/view/components/SearchBar.tsx#activate@12",
"title": "activate",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275",
"title": "GraphViewModel.setSearchQuery",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"order": 3,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"title": "GraphViewModel.activateSearchResult",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"order": 4,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"title": "GraphViewModel.biggestFlowForFunc",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"order": 5,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"title": "GraphViewModel.openFlowForFunc",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"edge:call:func:web/src/view/components/SearchBar.tsx#activate@12=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26=>func:web/src/view/components/SearchBar.tsx#activate@12",
"edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@275"
],
"summary": "搜索输入变更处理回调"
},
{
"id": "flow:call:func:web/src/view/App.tsx#observer() 回调@11@11",
"name": "observer() 回调@11 (web/src/view/App.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/App.tsx#observer() 回调@11@11",
"steps": [
{
"id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@11@11:func:web/src/view/App.tsx#observer() 回调@11@11",
"order": 0,
"nodeId": "func:web/src/view/App.tsx#observer() 回调@11@11",
"title": "observer() 回调@11",
"nextStepIds": [
"step:flow:call:func:web/src/view/App.tsx#observer() 回调@11@11:func:web/src/view/vmContext.ts#useGraphVM@6",
"step:flow:call:func:web/src/view/App.tsx#observer() 回调@11@11:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93"
]
},
{
"id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@11@11:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@11@11:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93",
"title": "GraphViewModel.selectReport",
"nextStepIds": [
"step:flow:call:func:web/src/view/App.tsx#observer() 回调@11@11:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180"
]
},
{
"id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@11@11:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"order": 3,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"title": "GraphViewModel.load",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180",
"edge:call:func:web/src/view/App.tsx#observer() 回调@11@11=>func:web/src/view/vmContext.ts#useGraphVM@6",
"edge:call:func:web/src/view/App.tsx#observer() 回调@11@11=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@93"
],
"summary": "渲染应用骨架:头部、搜索、各面板布局"
},
{
"id": "flow:call:func:src/flows.ts#map() 回调@72@72",
"name": "map() 回调@72 (src/flows.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:src/flows.ts#map() 回调@72@72",
"steps": [
{
"id": "step:flow:call:func:src/flows.ts#map() 回调@72@72:func:src/flows.ts#map() 回调@72@72",
"order": 0,
"nodeId": "func:src/flows.ts#map() 回调@72@72",
"title": "map() 回调@72",
"nextStepIds": [
"step:flow:call:func:src/flows.ts#map() 回调@72@72:func:src/flows.ts#stepIdOf@70"
]
},
{
"id": "step:flow:call:func:src/flows.ts#map() 回调@72@72:func:src/flows.ts#stepIdOf@70",
"order": 1,
"nodeId": "func:src/flows.ts#stepIdOf@70",
"title": "stepIdOf",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:src/flows.ts#map() 回调@72@72=>func:src/flows.ts#stepIdOf@70"
],
"summary": "生成流程步骤时的映射回调"
},
{
"id": "flow:call:func:src/analyzer.ts#inProject@65",
"name": "inProject (src/analyzer.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:src/analyzer.ts#inProject@65",
"steps": [
{
"id": "step:flow:call:func:src/analyzer.ts#inProject@65:func:src/analyzer.ts#inProject@65",
"order": 0,
"nodeId": "func:src/analyzer.ts#inProject@65",
"title": "inProject",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#inProject@65:func:src/analyzer.ts#relOf@64"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#inProject@65:func:src/analyzer.ts#relOf@64",
"order": 1,
"nodeId": "func:src/analyzer.ts#relOf@64",
"title": "relOf",
"nextStepIds": [
"step:flow:call:func:src/analyzer.ts#inProject@65:func:src/scanner.ts#toPosix@19"
]
},
{
"id": "step:flow:call:func:src/analyzer.ts#inProject@65:func:src/scanner.ts#toPosix@19",
"order": 2,
"nodeId": "func:src/scanner.ts#toPosix@19",
"title": "toPosix",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:src/analyzer.ts#relOf@64=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#inProject@65=>func:src/analyzer.ts#relOf@64"
],
"summary": "判断文件是否属于目标项目,过滤外部依赖"
},
{
"id": "flow:call:func:src/overview.ts#map() 回调@229@229",
"name": "map() 回调@229 (src/overview.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:src/overview.ts#map() 回调@229@229",
"steps": [
{
"id": "step:flow:call:func:src/overview.ts#map() 回调@229@229:func:src/overview.ts#map() 回调@229@229",
"order": 0,
"nodeId": "func:src/overview.ts#map() 回调@229@229",
"title": "map() 回调@229",
"nextStepIds": [
"step:flow:call:func:src/overview.ts#map() 回调@229@229:func:src/overview.ts#analyzeEntry@140"
]
},
{
"id": "step:flow:call:func:src/overview.ts#map() 回调@229@229:func:src/overview.ts#analyzeEntry@140",
"order": 1,
"nodeId": "func:src/overview.ts#analyzeEntry@140",
"title": "analyzeEntry",
"nextStepIds": [
"step:flow:call:func:src/overview.ts#map() 回调@229@229:func:src/overview.ts#reachableFuncs@92"
]
},
{
"id": "step:flow:call:func:src/overview.ts#map() 回调@229@229:func:src/overview.ts#reachableFuncs@92",
"order": 2,
"nodeId": "func:src/overview.ts#reachableFuncs@92",
"title": "reachableFuncs",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:src/overview.ts#analyzeEntry@140=>func:src/overview.ts#reachableFuncs@92",
"edge:call:func:src/overview.ts#map() 回调@229@229=>func:src/overview.ts#analyzeEntry@140"
],
"summary": "概览推导中的流程映射回调"
},
{
"id": "flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44",
"name": "map() 回调@44 (web/src/model/graphModel.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/model/graphModel.ts#map() 回调@44@44",
"steps": [
{
"id": "step:flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44:func:web/src/model/graphModel.ts#map() 回调@44@44",
"order": 0,
"nodeId": "func:web/src/model/graphModel.ts#map() 回调@44@44",
"title": "map() 回调@44",
"nextStepIds": [
"step:flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44:func:web/src/model/graphModel.ts#qualifierOf@24"
]
},
{
"id": "step:flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44:func:web/src/model/graphModel.ts#qualifierOf@24",
"order": 1,
"nodeId": "func:web/src/model/graphModel.ts#qualifierOf@24",
"title": "qualifierOf",
"nextStepIds": [
"step:flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44:func:web/src/model/graphModel.ts#baseName@19"
]
},
{
"id": "step:flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44:func:web/src/model/graphModel.ts#baseName@19",
"order": 2,
"nodeId": "func:web/src/model/graphModel.ts#baseName@19",
"title": "baseName",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/model/graphModel.ts#qualifierOf@24=>func:web/src/model/graphModel.ts#baseName@19",
"edge:call:func:web/src/model/graphModel.ts#map() 回调@44@44=>func:web/src/model/graphModel.ts#qualifierOf@24"
],
"summary": "将流程步骤映射为图节点"
},
{
"id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135",
"name": "GraphViewModel.groups (web/src/viewmodel/GraphViewModel.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135",
"steps": [
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135",
"order": 0,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135",
"title": "GraphViewModel.groups",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"order": 1,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"title": "GraphViewModel.groupOfFlow",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135:func:web/src/viewmodel/GraphViewModel.ts#baseName@43"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135:func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"title": "baseName",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109=>func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@135=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109"
],
"summary": "派生分组列表的计算属性"
},
{
"id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147",
"name": "GraphViewModel.visibleFlows (web/src/viewmodel/GraphViewModel.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147",
"steps": [
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147",
"order": 0,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147",
"title": "GraphViewModel.visibleFlows",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"order": 1,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109",
"title": "GraphViewModel.groupOfFlow",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147:func:web/src/viewmodel/GraphViewModel.ts#baseName@43"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147:func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"title": "baseName",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109=>func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@147=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@109"
],
"summary": "按当前分组过滤后的流程列表"
},
{
"id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159",
"name": "GraphViewModel.selectedFuncOwner (web/src/viewmodel/GraphViewModel.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159",
"steps": [
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159",
"order": 0,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159",
"title": "GraphViewModel.selectedFuncOwner",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159:func:web/src/viewmodel/GraphViewModel.ts#baseName@43"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159:func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"order": 1,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@43",
"title": "baseName",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFuncOwner@159=>func:web/src/viewmodel/GraphViewModel.ts#baseName@43"
],
"summary": "计算选中函数的归属(类 / 文件)及其说明"
},
{
"id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79",
"name": "reaction() 回调@79 (web/src/viewmodel/GraphViewModel.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79",
"steps": [
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79:func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79",
"order": 0,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79",
"title": "reaction() 回调@79",
"nextStepIds": [
"step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loadSelectedFuncCode@346"
]
},
{
"id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loadSelectedFuncCode@346",
"order": 1,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loadSelectedFuncCode@346",
"title": "GraphViewModel.loadSelectedFuncCode",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#reaction() 回调@79@79=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loadSelectedFuncCode@346"
],
"summary": "监听选中节点变化,自动拉取对应源码"
},
{
"id": "flow:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"name": "memo() 回调@40 (web/src/view/components/FlowNode.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"order": 0,
"nodeId": "func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40",
"title": "memo() 回调@40",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40:func:web/src/view/components/FlowNode.tsx#interactionBadges@12"
]
},
{
"id": "step:flow:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40:func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"order": 1,
"nodeId": "func:web/src/view/components/FlowNode.tsx#interactionBadges@12",
"title": "interactionBadges",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/FlowNode.tsx#memo() 回调@40@40=>func:web/src/view/components/FlowNode.tsx#interactionBadges@12"
],
"summary": "自定义节点渲染(memo 回调)"
},
{
"id": "flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"name": "匿名函数@41 (web/src/view/components/SearchBar.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"order": 0,
"nodeId": "func:web/src/view/components/SearchBar.tsx#匿名函数@41@41",
"title": "匿名函数@41",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/view/components/SearchBar.tsx#activate@12"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/view/components/SearchBar.tsx#activate@12",
"order": 1,
"nodeId": "func:web/src/view/components/SearchBar.tsx#activate@12",
"title": "activate",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"order": 2,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"title": "GraphViewModel.activateSearchResult",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265"
]
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"order": 3,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"title": "GraphViewModel.biggestFlowForFunc",
"nextStepIds": []
},
{
"id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"order": 4,
"nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"title": "GraphViewModel.openFlowForFunc",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@287",
"edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@265",
"edge:call:func:web/src/view/components/SearchBar.tsx#activate@12=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@322",
"edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41=>func:web/src/view/components/SearchBar.tsx#activate@12"
],
"summary": "搜索结果项点击处理"
},
{
"id": "flow:call:func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4",
"name": "observer() 回调@4 (web/src/view/components/FlowBanner.tsx)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4",
"steps": [
{
"id": "step:flow:call:func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4:func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4",
"order": 0,
"nodeId": "func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4",
"title": "observer() 回调@4",
"nextStepIds": [
"step:flow:call:func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4:func:web/src/view/vmContext.ts#useGraphVM@6"
]
},
{
"id": "step:flow:call:func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4:func:web/src/view/vmContext.ts#useGraphVM@6",
"order": 1,
"nodeId": "func:web/src/view/vmContext.ts#useGraphVM@6",
"title": "useGraphVM",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/src/view/components/FlowBanner.tsx#observer() 回调@4@4=>func:web/src/view/vmContext.ts#useGraphVM@6"
],
"summary": "渲染当前流程横幅:流程名与一句话说明"
},
{
"id": "flow:call:func:src/cli.ts#<module>@0",
"name": "<module> (src/cli.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:src/cli.ts#<module>@0",
"steps": [
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/cli.ts#<module>@0",
"order": 0,
"nodeId": "func:src/cli.ts#<module>@0",
"title": "<module>",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/cli.ts#main@40"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/cli.ts#main@40",
"order": 1,
"nodeId": "func:src/cli.ts#main@40",
"title": "main",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/cli.ts#parseArgs@13",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#analyzeProject@32"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/cli.ts#parseArgs@13",
"order": 2,
"nodeId": "func:src/cli.ts#parseArgs@13",
"title": "parseArgs",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#analyzeProject@32",
"order": 3,
"nodeId": "func:src/analyzer.ts#analyzeProject@32",
"title": "analyzeProject",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#collectSourceFiles@24",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#registerFile@223",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#analyzeRelations@487",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#ensureModule@83",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/flows.ts#generateCallFlows@16",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#toPosix@19",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/externals.ts#deriveExternalSystems@4"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#collectSourceFiles@24",
"order": 4,
"nodeId": "func:src/scanner.ts#collectSourceFiles@24",
"title": "collectSourceFiles",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#walk@27"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#registerFile@223",
"order": 5,
"nodeId": "func:src/analyzer.ts#registerFile@223",
"title": "registerFile",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#relOf@64",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#languageOf@52",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#toPosix@19",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#ensureModule@83"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#analyzeRelations@487",
"order": 6,
"nodeId": "func:src/analyzer.ts#analyzeRelations@487",
"title": "analyzeRelations",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#relOf@64",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#walk@492"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#ensureModule@83",
"order": 7,
"nodeId": "func:src/analyzer.ts#ensureModule@83",
"title": "ensureModule",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/flows.ts#generateCallFlows@16",
"order": 8,
"nodeId": "func:src/flows.ts#generateCallFlows@16",
"title": "generateCallFlows",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#toPosix@19",
"order": 9,
"nodeId": "func:src/scanner.ts#toPosix@19",
"title": "toPosix",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/externals.ts#deriveExternalSystems@4",
"order": 10,
"nodeId": "func:src/externals.ts#deriveExternalSystems@4",
"title": "deriveExternalSystems",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#walk@27",
"order": 11,
"nodeId": "func:src/scanner.ts#walk@27",
"title": "walk",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#relOf@64",
"order": 12,
"nodeId": "func:src/analyzer.ts#relOf@64",
"title": "relOf",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#toPosix@19"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#languageOf@52",
"order": 13,
"nodeId": "func:src/scanner.ts#languageOf@52",
"title": "languageOf",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#walk@492",
"order": 14,
"nodeId": "func:src/analyzer.ts#walk@492",
"title": "walk",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#resolveInternalImport@548",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#addEdge@433",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#getModuleFunc@462",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#resolveCallTargetFuncId@440",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectDb@358",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#addInteraction@419",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectApiOut@382",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectApiIn@400"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#resolveInternalImport@548",
"order": 15,
"nodeId": "func:src/analyzer.ts#resolveInternalImport@548",
"title": "resolveInternalImport",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#toPosix@19"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#addEdge@433",
"order": 16,
"nodeId": "func:src/analyzer.ts#addEdge@433",
"title": "addEdge",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#getModuleFunc@462",
"order": 17,
"nodeId": "func:src/analyzer.ts#getModuleFunc@462",
"title": "getModuleFunc",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/scanner.ts#languageOf@52"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#resolveCallTargetFuncId@440",
"order": 18,
"nodeId": "func:src/analyzer.ts#resolveCallTargetFuncId@440",
"title": "resolveCallTargetFuncId",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectDb@358",
"order": 19,
"nodeId": "func:src/analyzer.ts#detectDb@358",
"title": "detectDb",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#addInteraction@419",
"order": 20,
"nodeId": "func:src/analyzer.ts#addInteraction@419",
"title": "addInteraction",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectApiOut@382",
"order": 21,
"nodeId": "func:src/analyzer.ts#detectApiOut@382",
"title": "detectApiOut",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#extractPathArg@333",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#extractMethodFromOptions@341",
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#hostOf@352"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#detectApiIn@400",
"order": 22,
"nodeId": "func:src/analyzer.ts#detectApiIn@400",
"title": "detectApiIn",
"nextStepIds": [
"step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#extractPathArg@333"
]
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#extractPathArg@333",
"order": 23,
"nodeId": "func:src/analyzer.ts#extractPathArg@333",
"title": "extractPathArg",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#extractMethodFromOptions@341",
"order": 24,
"nodeId": "func:src/analyzer.ts#extractMethodFromOptions@341",
"title": "extractMethodFromOptions",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/cli.ts#<module>@0:func:src/analyzer.ts#hostOf@352",
"order": 25,
"nodeId": "func:src/analyzer.ts#hostOf@352",
"title": "hostOf",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:src/scanner.ts#collectSourceFiles@24=>func:src/scanner.ts#walk@27",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/scanner.ts#collectSourceFiles@24",
"edge:call:func:src/analyzer.ts#relOf@64=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#registerFile@223=>func:src/analyzer.ts#relOf@64",
"edge:call:func:src/analyzer.ts#registerFile@223=>func:src/scanner.ts#languageOf@52",
"edge:call:func:src/analyzer.ts#registerFile@223=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#registerFile@223=>func:src/analyzer.ts#ensureModule@83",
"edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#extractPathArg@333",
"edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#extractMethodFromOptions@341",
"edge:call:func:src/analyzer.ts#detectApiOut@382=>func:src/analyzer.ts#hostOf@352",
"edge:call:func:src/analyzer.ts#detectApiIn@400=>func:src/analyzer.ts#extractPathArg@333",
"edge:call:func:src/analyzer.ts#getModuleFunc@462=>func:src/scanner.ts#languageOf@52",
"edge:call:func:src/analyzer.ts#analyzeRelations@487=>func:src/analyzer.ts#relOf@64",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#resolveInternalImport@548",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#addEdge@433",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#getModuleFunc@462",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#resolveCallTargetFuncId@440",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectDb@358",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#addInteraction@419",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectApiOut@382",
"edge:call:func:src/analyzer.ts#walk@492=>func:src/analyzer.ts#detectApiIn@400",
"edge:call:func:src/analyzer.ts#analyzeRelations@487=>func:src/analyzer.ts#walk@492",
"edge:call:func:src/analyzer.ts#resolveInternalImport@548=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#registerFile@223",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#analyzeRelations@487",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/analyzer.ts#ensureModule@83",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/flows.ts#generateCallFlows@16",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/scanner.ts#toPosix@19",
"edge:call:func:src/analyzer.ts#analyzeProject@32=>func:src/externals.ts#deriveExternalSystems@4",
"edge:call:func:src/cli.ts#main@40=>func:src/cli.ts#parseArgs@13",
"edge:call:func:src/cli.ts#main@40=>func:src/analyzer.ts#analyzeProject@32",
"edge:call:func:src/cli.ts#<module>@0=>func:src/cli.ts#main@40"
],
"summary": "CLI 主流程:解析参数、运行分析、写出报告"
},
{
"id": "flow:call:func:src/overview-cli.ts#<module>@0",
"name": "<module> (src/overview-cli.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:src/overview-cli.ts#<module>@0",
"steps": [
{
"id": "step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview-cli.ts#<module>@0",
"order": 0,
"nodeId": "func:src/overview-cli.ts#<module>@0",
"title": "<module>",
"nextStepIds": [
"step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview-cli.ts#main@9"
]
},
{
"id": "step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview-cli.ts#main@9",
"order": 1,
"nodeId": "func:src/overview-cli.ts#main@9",
"title": "main",
"nextStepIds": [
"step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview.ts#deriveOverview@109",
"step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview-cli.ts#flag@16"
]
},
{
"id": "step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview.ts#deriveOverview@109",
"order": 2,
"nodeId": "func:src/overview.ts#deriveOverview@109",
"title": "deriveOverview",
"nextStepIds": [
"step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview.ts#apiInOf@79",
"step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview.ts#analyzeEntry@140",
"step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview.ts#groupKeyFromPath@83"
]
},
{
"id": "step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview-cli.ts#flag@16",
"order": 3,
"nodeId": "func:src/overview-cli.ts#flag@16",
"title": "flag",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview.ts#apiInOf@79",
"order": 4,
"nodeId": "func:src/overview.ts#apiInOf@79",
"title": "apiInOf",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview.ts#analyzeEntry@140",
"order": 5,
"nodeId": "func:src/overview.ts#analyzeEntry@140",
"title": "analyzeEntry",
"nextStepIds": [
"step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview.ts#reachableFuncs@92"
]
},
{
"id": "step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview.ts#groupKeyFromPath@83",
"order": 6,
"nodeId": "func:src/overview.ts#groupKeyFromPath@83",
"title": "groupKeyFromPath",
"nextStepIds": []
},
{
"id": "step:flow:call:func:src/overview-cli.ts#<module>@0:func:src/overview.ts#reachableFuncs@92",
"order": 7,
"nodeId": "func:src/overview.ts#reachableFuncs@92",
"title": "reachableFuncs",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:src/overview.ts#analyzeEntry@140=>func:src/overview.ts#reachableFuncs@92",
"edge:call:func:src/overview.ts#deriveOverview@109=>func:src/overview.ts#apiInOf@79",
"edge:call:func:src/overview.ts#deriveOverview@109=>func:src/overview.ts#analyzeEntry@140",
"edge:call:func:src/overview.ts#deriveOverview@109=>func:src/overview.ts#groupKeyFromPath@83",
"edge:call:func:src/overview-cli.ts#main@9=>func:src/overview.ts#deriveOverview@109",
"edge:call:func:src/overview-cli.ts#main@9=>func:src/overview-cli.ts#flag@16",
"edge:call:func:src/overview-cli.ts#<module>@0=>func:src/overview-cli.ts#main@9"
],
"summary": "概览 CLI 主流程:读取报告并打印项目地图"
},
{
"id": "flow:call:func:web/vite.config.ts#<module>@0",
"name": "<module> (web/vite.config.ts)",
"flowType": "call",
"provenance": "manual",
"entryNodeId": "func:web/vite.config.ts#<module>@0",
"steps": [
{
"id": "step:flow:call:func:web/vite.config.ts#<module>@0:func:web/vite.config.ts#<module>@0",
"order": 0,
"nodeId": "func:web/vite.config.ts#<module>@0",
"title": "<module>",
"nextStepIds": [
"step:flow:call:func:web/vite.config.ts#<module>@0:func:web/vite.config.ts#sourceServer@11"
]
},
{
"id": "step:flow:call:func:web/vite.config.ts#<module>@0:func:web/vite.config.ts#sourceServer@11",
"order": 1,
"nodeId": "func:web/vite.config.ts#sourceServer@11",
"title": "sourceServer",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:web/vite.config.ts#<module>@0=>func:web/vite.config.ts#sourceServer@11"
],
"summary": "Vite 配置与源码服务中间件初始化"
}
],
"externalSystems": []
}