{ "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#@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#@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#@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#@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#@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#@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#@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#@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#@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#@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#@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#@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#@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#@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#@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): Flow[]", "params": [ { "name": "functions", "typeRef": "Func[]", "optional": false }, { "name": "edges", "typeRef": "Edge[]", "optional": false }, { "name": "options", "typeRef": "Partial", "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, limit): Set", "params": [ { "name": "startId", "typeRef": "string", "optional": false }, { "name": "adjacency", "typeRef": "Map", "optional": false }, { "name": "limit", "optional": true, "defaultValue": "2000" } ], "returnType": "Set", "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", "params": [], "returnType": "Promise", "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", "params": [ { "name": "nodes", "typeRef": "LayoutNodeInput[]", "optional": false }, { "name": "edges", "typeRef": "LayoutEdgeInput[]", "optional": false }, { "name": "options", "typeRef": "LayoutOptions", "optional": true, "defaultValue": "{}" } ], "returnType": "Map", "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", "params": [], "returnType": "Promise", "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", "params": [], "returnType": "Set", "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", "params": [], "returnType": "Promise", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0", "kind": "function", "name": "", "qualifiedName": "", "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#@0=>func:src/cli.ts#main@40", "kind": "call", "sourceId": "func:src/cli.ts#@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#@0=>func:src/overview-cli.ts#main@9", "kind": "call", "sourceId": "func:src/overview-cli.ts#@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#@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180", "kind": "call", "sourceId": "func:web/src/main.tsx#@0", "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180", "provenance": "resolved" }, { "id": "edge:call:func:web/vite.config.ts#@0=>func:web/vite.config.ts#sourceServer@11", "kind": "call", "sourceId": "func:web/vite.config.ts#@0", "targetId": "func:web/vite.config.ts#sourceServer@11", "provenance": "resolved" } ], "flows": [ { "id": "flow:call:func:web/src/main.tsx#@0", "name": " (web/src/main.tsx)", "flowType": "call", "provenance": "manual", "entryNodeId": "func:web/src/main.tsx#@0", "steps": [ { "id": "step:flow:call:func:web/src/main.tsx#@0:func:web/src/main.tsx#@0", "order": 0, "nodeId": "func:web/src/main.tsx#@0", "title": "", "nextStepIds": [ "step:flow:call:func:web/src/main.tsx#@0:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@180" ] }, { "id": "step:flow:call:func:web/src/main.tsx#@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#@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#@0", "name": " (src/cli.ts)", "flowType": "call", "provenance": "manual", "entryNodeId": "func:src/cli.ts#@0", "steps": [ { "id": "step:flow:call:func:src/cli.ts#@0:func:src/cli.ts#@0", "order": 0, "nodeId": "func:src/cli.ts#@0", "title": "", "nextStepIds": [ "step:flow:call:func:src/cli.ts#@0:func:src/cli.ts#main@40" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/cli.ts#parseArgs@13", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#analyzeProject@32" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@0:func:src/scanner.ts#collectSourceFiles@24", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#registerFile@223", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#analyzeRelations@487", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#ensureModule@83", "step:flow:call:func:src/cli.ts#@0:func:src/flows.ts#generateCallFlows@16", "step:flow:call:func:src/cli.ts#@0:func:src/scanner.ts#toPosix@19", "step:flow:call:func:src/cli.ts#@0:func:src/externals.ts#deriveExternalSystems@4" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/scanner.ts#walk@27" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/analyzer.ts#relOf@64", "step:flow:call:func:src/cli.ts#@0:func:src/scanner.ts#languageOf@52", "step:flow:call:func:src/cli.ts#@0:func:src/scanner.ts#toPosix@19", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#ensureModule@83" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/analyzer.ts#relOf@64", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#walk@492" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@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#@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#@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#@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#@0:func:src/scanner.ts#toPosix@19" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@0:func:src/analyzer.ts#resolveInternalImport@548", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#addEdge@433", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#getModuleFunc@462", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#resolveCallTargetFuncId@440", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#detectDb@358", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#addInteraction@419", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#detectApiOut@382", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#detectApiIn@400" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/scanner.ts#toPosix@19" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@0:func:src/scanner.ts#languageOf@52" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@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#@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#@0:func:src/analyzer.ts#extractPathArg@333", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#extractMethodFromOptions@341", "step:flow:call:func:src/cli.ts#@0:func:src/analyzer.ts#hostOf@352" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@0:func:src/analyzer.ts#extractPathArg@333" ] }, { "id": "step:flow:call:func:src/cli.ts#@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#@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#@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#@0=>func:src/cli.ts#main@40" ], "summary": "CLI 主流程:解析参数、运行分析、写出报告" }, { "id": "flow:call:func:src/overview-cli.ts#@0", "name": " (src/overview-cli.ts)", "flowType": "call", "provenance": "manual", "entryNodeId": "func:src/overview-cli.ts#@0", "steps": [ { "id": "step:flow:call:func:src/overview-cli.ts#@0:func:src/overview-cli.ts#@0", "order": 0, "nodeId": "func:src/overview-cli.ts#@0", "title": "", "nextStepIds": [ "step:flow:call:func:src/overview-cli.ts#@0:func:src/overview-cli.ts#main@9" ] }, { "id": "step:flow:call:func:src/overview-cli.ts#@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#@0:func:src/overview.ts#deriveOverview@109", "step:flow:call:func:src/overview-cli.ts#@0:func:src/overview-cli.ts#flag@16" ] }, { "id": "step:flow:call:func:src/overview-cli.ts#@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#@0:func:src/overview.ts#apiInOf@79", "step:flow:call:func:src/overview-cli.ts#@0:func:src/overview.ts#analyzeEntry@140", "step:flow:call:func:src/overview-cli.ts#@0:func:src/overview.ts#groupKeyFromPath@83" ] }, { "id": "step:flow:call:func:src/overview-cli.ts#@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#@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#@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#@0:func:src/overview.ts#reachableFuncs@92" ] }, { "id": "step:flow:call:func:src/overview-cli.ts#@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#@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#@0=>func:src/overview-cli.ts#main@9" ], "summary": "概览 CLI 主流程:读取报告并打印项目地图" }, { "id": "flow:call:func:web/vite.config.ts#@0", "name": " (web/vite.config.ts)", "flowType": "call", "provenance": "manual", "entryNodeId": "func:web/vite.config.ts#@0", "steps": [ { "id": "step:flow:call:func:web/vite.config.ts#@0:func:web/vite.config.ts#@0", "order": 0, "nodeId": "func:web/vite.config.ts#@0", "title": "", "nextStepIds": [ "step:flow:call:func:web/vite.config.ts#@0:func:web/vite.config.ts#sourceServer@11" ] }, { "id": "step:flow:call:func:web/vite.config.ts#@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#@0=>func:web/vite.config.ts#sourceServer@11" ], "summary": "Vite 配置与源码服务中间件初始化" } ], "externalSystems": [] }