From cb23f814c7c4735901e7aa5762bf51b66c718c17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E8=91=9B?= Date: Wed, 22 Jul 2026 15:19:31 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E6=8F=90=E4=BA=A4=EF=BC=9A?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E5=8F=AF=E8=A7=86=E5=8C=96=E5=88=86=E6=9E=90?= =?UTF-8?q?=E5=B7=A5=E5=85=B7=EF=BC=88CLI=20=E5=88=86=E6=9E=90=E5=99=A8=20?= =?UTF-8?q?+=20Web=20=E5=8F=AF=E8=A7=86=E5=8C=96=20+=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E6=96=87=E6=A1=A3=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- .gitignore | 22 + docs/设计文档.md | 336 + package-lock.json | 570 + package.json | 20 + sample-report.json | 28907 ++++++++++++++++++ self-report.json | 5190 ++++ src/analyzer.ts | 609 + src/cli.ts | 70 + src/externals.ts | 60 + src/flows.ts | 102 + src/scanner.ts | 68 + src/types.ts | 204 + tsconfig.json | 14 + web/index.html | 12 + web/package-lock.json | 2119 ++ web/package.json | 26 + web/public/report.json | 28907 ++++++++++++++++++ web/public/self-report.json | 5190 ++++ web/src/main.tsx | 25 + web/src/model/graphModel.ts | 66 + web/src/model/report.ts | 193 + web/src/model/reportRepository.ts | 26 + web/src/services/dagreLayout.ts | 62 + web/src/styles.css | 547 + web/src/view/App.tsx | 54 + web/src/view/components/FlowGraph.tsx | 72 + web/src/view/components/FlowList.tsx | 25 + web/src/view/components/FlowNode.tsx | 66 + web/src/view/components/GroupList.tsx | 36 + web/src/view/components/NodeDetailPanel.tsx | 85 + web/src/view/components/SearchBar.tsx | 59 + web/src/view/vmContext.ts | 10 + web/src/viewmodel/GraphViewModel.ts | 289 + web/tsconfig.json | 20 + web/vite.config.ts | 10 + 35 files changed, 74071 insertions(+) create mode 100644 .gitignore create mode 100644 docs/设计文档.md create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 sample-report.json create mode 100644 self-report.json create mode 100644 src/analyzer.ts create mode 100644 src/cli.ts create mode 100644 src/externals.ts create mode 100644 src/flows.ts create mode 100644 src/scanner.ts create mode 100644 src/types.ts create mode 100644 tsconfig.json create mode 100644 web/index.html create mode 100644 web/package-lock.json create mode 100644 web/package.json create mode 100644 web/public/report.json create mode 100644 web/public/self-report.json create mode 100644 web/src/main.tsx create mode 100644 web/src/model/graphModel.ts create mode 100644 web/src/model/report.ts create mode 100644 web/src/model/reportRepository.ts create mode 100644 web/src/services/dagreLayout.ts create mode 100644 web/src/styles.css create mode 100644 web/src/view/App.tsx create mode 100644 web/src/view/components/FlowGraph.tsx create mode 100644 web/src/view/components/FlowList.tsx create mode 100644 web/src/view/components/FlowNode.tsx create mode 100644 web/src/view/components/GroupList.tsx create mode 100644 web/src/view/components/NodeDetailPanel.tsx create mode 100644 web/src/view/components/SearchBar.tsx create mode 100644 web/src/view/vmContext.ts create mode 100644 web/src/viewmodel/GraphViewModel.ts create mode 100644 web/tsconfig.json create mode 100644 web/vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..48f2948 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# Dependencies +node_modules/ + +# Build output +dist/ +build/ +*.tsbuildinfo + +# Logs +*.log +npm-debug.log* + +# Editor / OS +.vscode/ +.idea/ +.DS_Store +Thumbs.db + +# Env +.env +.env.local +.env.*.local diff --git a/docs/设计文档.md b/docs/设计文档.md new file mode 100644 index 0000000..4ee4991 --- /dev/null +++ b/docs/设计文档.md @@ -0,0 +1,336 @@ +# 代码分析可视化工具 · 设计文档 + +> 面向 AI 生成的「大锅饭」代码,帮助开发者快速掌握有哪些模块、模块间关系如何,颗粒度到函数级;聚焦宏观流程打通,不做具体实现的 bug 排查。以流程图为核心展示,抽象出一套标准化报告数据结构,任何项目按此结构产出报告均可在工具内展示。 + +--- + +## 一、产品概述 +- 1.1 背景与问题(AI 大锅饭代码难以掌握全貌) +- 1.2 目标用户与典型使用场景 +- 1.3 核心价值主张 +- 1.4 范围与非目标(只讲宏观模块与流程,不做 bug 检测 / 代码质量评审) +- 1.5 术语表 + +## 二、核心设计理念 +- 2.1 以流程图为核心的展示范式 +- 2.2 模块 → 函数 两级颗粒度 +- 2.3 报告即数据(标准化数据结构驱动展示) +- 2.4 项目无关性(跨语言 / 跨框架 / 跨规模) + +## 三、标准化代码报告数据结构(核心 Schema) + +### 3.0 设计原则 + +- **聚焦原汁原味的逻辑**:核心是函数以及函数之间的调用关系,不纠结语言特性。 +- **不区分语言细节**:class / struct / interface 统一抽象成「容器 Container」,只负责持有函数与字段;不处理继承、可见性、抽象等语法概念。 +- **扁平存储 + ID 引用**:所有实体平铺存放,用 `id` 互相引用(如容器用 `functionIds` 持有函数,函数用 `ownerId` 回指容器),便于图渲染、跨模块跳转与下钻。 +- **统一边模型**:调用、导入、引用、触发、数据流等所有关系归一为一种 `Edge`,作为关系的唯一真相源;函数上不再冗余存调用列表。 +- **来源可追溯**:每个实体/边带 `provenance`,区分「AST 确定的结构」与「AI 推断的解读」(尤其业务流程)。 + +### 3.1 基础通用类型 + +```ts +type Id = string; + +// 实体/边的来源:ast=语法确定, resolved=引用解析, ai=模型推断, manual=人工 +type Provenance = "ast" | "resolved" | "ai" | "manual"; + +interface SourceLocation { + file: string; // 相对仓库根的路径 + startLine: number; + endLine: number; + startCol?: number; + endCol?: number; +} + +// 所有实体的公共字段 +interface BaseEntity { + id: Id; + name: string; + qualifiedName?: string; // 完全限定名,如 server/TaskRepo.create + location?: SourceLocation; + language?: string; + provenance: Provenance; + confidence?: number; // 0~1,启发式解析时使用 + summary?: string; // 一句话职责(可由 AI 生成) + tags?: string[]; + extra?: Record; // 场景/语言专属扩展位 +} +``` + +### 3.2 模块 Module + +模块 = 目录 / 包 / 逻辑分组,可嵌套成树,是宏观视图的分层单位。 + +```ts +interface Module extends BaseEntity { + kind: "module"; + parentId?: Id; + childModuleIds: Id[]; + fileIds: Id[]; + path?: string; +} +``` + +### 3.3 文件 File + +```ts +interface CodeFile extends BaseEntity { + kind: "file"; + moduleId: Id; + path: string; + loc?: number; // 行数 + containerIds: Id[]; // 本文件定义的容器(类/结构等) + functionIds: Id[]; // 本文件的顶层函数 +} +``` + +### 3.4 容器 Container(类 / 结构 等的统一抽象) + +不区分 class / struct / interface,只作为函数与字段的持有者。 + +```ts +interface Container extends BaseEntity { + kind: "container"; + fileId: Id; + moduleId?: Id; + functionIds: Id[]; // ← 持有的函数(方法) + fieldIds: Id[]; // ← 持有的字段/属性 +} +``` + +### 3.5 函数 Function(核心) + +顶层函数与容器方法统一用一个结构;是否为方法由 `ownerId` 区分。函数之间的调用关系不存在这里,而是统一走 `Edge`。 + +```ts +interface Func extends BaseEntity { + kind: "function"; + fileId: Id; + ownerId?: Id; // 若为方法,指向所属容器;顶层函数留空 + moduleId?: Id; + signature?: string; // 原始签名文本 + params: Param[]; + returnType?: string; + isEntry?: boolean; // 是否入口点(main / 路由处理器 / 事件回调) + interactions?: Interaction[]; // ← 该函数的跨边界交互(前后端协议 / 数据库) + loc?: number; +} + +interface Param { + name: string; + typeRef?: string; // 声明类型(文本即可,不强求解析) + optional?: boolean; + defaultValue?: string; +} +``` + +#### 跨边界交互 Interaction + +理解宏观逻辑的关键,往往不在于「函数调了谁」,而在于它**越过了哪条系统边界**:前端发往后端的一次请求、后端打到数据库的一次读写。这类信息直接作为函数的属性挂在函数上,而非独立节点。外部系统清单(用到哪些数据库 / 外部服务)可由全部函数的 `interactions` 聚合派生,无需单独维护。 + +```ts +type InteractionKind = "api" | "db"; // 可扩展:mq / cache / rpc ... + +// in = 对外暴露 / 被外部调用(如接口处理器) +// out = 本函数主动发起(如发请求 / 查库) +type InteractionDirection = "in" | "out"; + +interface InteractionBase { + id: Id; + direction: InteractionDirection; + provenance: Provenance; + confidence?: number; + summary?: string; +} + +// 前后端协议交互 +interface ApiInteraction extends InteractionBase { + kind: "api"; + protocol: "http" | "ws" | "rpc" | "graphql"; + method?: string; // GET / POST / ...(http) + path?: string; // 如 /api/tasks/:id + peer?: string; // 对端:前端页面 / 外部服务名(若可知) +} + +// 数据库交互 +interface DbInteraction extends InteractionBase { + kind: "db"; + operation: "read" | "create" | "update" | "delete" | "other"; + target?: string; // 表 / 模型 / 集合名 + engine?: string; // postgres / mysql / mongo ...(可选) +} + +type Interaction = ApiInteraction | DbInteraction; +``` + +### 3.6 字段 Field + +```ts +interface Field extends BaseEntity { + kind: "field"; + ownerId: Id; // 所属容器 + typeRef?: string; +} +``` + +### 3.7 关系 Edge(统一边模型,关系的唯一真相源) + +```ts +type EdgeKind = + | "call" // 函数调用(Call-Flow 的原子) + | "import" // 文件/模块导入 + | "reference" // 一般引用/使用 + | "dataflow" // 数据流(可选,后期) + | "trigger"; // 触发:路由→处理器、事件→回调 + +interface Edge { + id: Id; + kind: EdgeKind; + sourceId: Id; // 起点实体 id + targetId: Id; // 终点实体 id(未解析时指向占位节点) + provenance: Provenance; + confidence?: number; + label?: string; + extra?: Record; +} +``` + +### 3.8 流程 Flow(Call-Flow 与 Business-Flow 同结构) + +```ts +interface Flow { + id: Id; + name: string; + flowType: "call" | "business"; // 调用链 / 业务流程 + summary?: string; + provenance: Provenance; // call 多为 resolved,business 多为 ai/manual + entryNodeId?: Id; + steps: FlowStep[]; + edgeIds?: Id[]; // 关联到结构层的底层调用边,支持回溯 +} + +interface FlowStep { + id: Id; + order: number; + nodeId?: Id; // 指向某函数/容器/模块 + title: string; + description?: string; + branchLabel?: string; // 分支条件文字 + nextStepIds: Id[]; // 支持分支/汇合 +} +``` + +### 3.9 外部系统 ExternalSystem(由交互派生) + +外部系统不再作为原始录入节点,而是由聚合全部函数的 `interactions` **派生**得到,作为报告里的物化视图供展示消费: + +- `db` 交互的 `engine` / `target` 去重 → 数据库系统及其数据表清单; +- `out` 方向的 `api` 交互的 `peer` / `path` 去重 → 依赖的外部服务清单。 + +每个外部系统都回指与之交互的函数,保证可回溯。 + +```ts +type ExternalSystemKind = "database" | "service"; + +interface ExternalSystemBase { + id: Id; + kind: ExternalSystemKind; + name: string; // 数据库/引擎名 或 外部服务名 + functionIds: Id[]; // 与之交互的函数(回溯来源) + interactionCount: number; // 交互次数 + provenance: Provenance; // 派生结果,通常为 resolved +} + +// 数据库系统 +interface DatabaseSystem extends ExternalSystemBase { + kind: "database"; + engine?: string; // postgres / mysql / mongo ... + tables: string[]; // 去重后的表 / 模型清单 +} + +// 外部服务 +interface ServiceSystem extends ExternalSystemBase { + kind: "service"; + protocol?: string; // http / ws / rpc / graphql + endpoints: string[]; // 去重后的 path / peer 清单 +} + +type ExternalSystem = DatabaseSystem | ServiceSystem; +``` + +### 3.10 顶层报告 Report + +```ts +interface Report { + schemaVersion: string; + project: { + name: string; + root: string; + languages: string[]; + generatedAt: string; + generator?: string; // 生成工具 / 版本 + }; + stats: { + fileCount: number; + containerCount: number; + functionCount: number; + edgeCount: number; + loc?: number; + }; + modules: Module[]; + files: CodeFile[]; + containers: Container[]; + functions: Func[]; + fields: Field[]; + edges: Edge[]; + flows: Flow[]; + externalSystems?: ExternalSystem[]; // 由 interactions 派生的物化视图(可选缓存) +} +``` + +### 3.11 持有关系总览 + +```mermaid +flowchart TD + Report --> Module + Module --> CodeFile + CodeFile --> Container + CodeFile --> Func + Container -->|functionIds| Func + Container -->|fieldIds| Field + Func -->|interactions| Interaction + Report -->|"call/import/..."| Edge + Report --> Flow + Flow -->|steps.nodeId| Func + Edge -->|source/target| Func +``` + +## 四、可视化展示设计 +- 4.1 整体架构图(分层视图) +- 4.2 模块关系图(依赖 / 引用) +- 4.3 流程图 · 核心视图(Call-Flow / Business-Flow 同画布切换) +- 4.4 函数级调用图(下钻视图) +- 4.5 源码目录结构树 +- 4.6 数据模型 ER 图 +- 4.7 交互能力(缩放 / 下钻 / 搜索 / 高亮 / 跳转 / 联动) +- 4.8 多视图切换与状态同步 + +## 五、报告生成与接入方式 +- 5.1 手工编辑 +- 5.2 AI 辅助分析生成 +- 5.3 静态解析工具导入 +- 5.4 报告导入 / 导出格式 + +## 六、软件架构与技术选型 +- 6.1 整体架构 +- 6.2 前端渲染方案(图形库选型) +- 6.3 数据加载与存储 +- 6.4 部署形态 + +## 七、界面与页面结构 +- 7.1 报告列表 / 项目切换 +- 7.2 主画布与侧边面板 +- 7.3 详情抽屉与检索 + +## 八、里程碑与迭代计划 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..cc31e97 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,570 @@ +{ + "name": "code-visualize-cli", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "code-visualize-cli", + "version": "0.1.0", + "dependencies": { + "typescript": "^5.6.3" + }, + "bin": { + "codeviz": "src/cli.ts" + }, + "devDependencies": { + "@types/node": "^22.7.5", + "tsx": "^4.19.1" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@types/node": { + "version": "22.20.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.20.1.tgz", + "integrity": "sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/tsx": { + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.1.tgz", + "integrity": "sha512-GQHnkIfxyx1wYCOS/wonik5MVRZU9hi1TEZmzGZSCJB1y9YgoZ8H6itNE/u4suE+yLmOzuE4E5S4TZ/ZX2wcWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.28.0" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..980c0ef --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "code-visualize-cli", + "version": "0.1.0", + "private": true, + "type": "module", + "description": "分析目标代码库,产出符合标准 Schema 的代码报告 JSON", + "bin": { + "codeviz": "src/cli.ts" + }, + "scripts": { + "analyze": "tsx src/cli.ts" + }, + "dependencies": { + "typescript": "^5.6.3" + }, + "devDependencies": { + "@types/node": "^22.7.5", + "tsx": "^4.19.1" + } +} diff --git a/sample-report.json b/sample-report.json new file mode 100644 index 0000000..d40da87 --- /dev/null +++ b/sample-report.json @@ -0,0 +1,28907 @@ +{ + "schemaVersion": "0.1.0", + "project": { + "name": "task-flow-manager", + "root": "E:/task-flow-manager", + "languages": [ + "tsx", + "typescript" + ], + "generatedAt": "2026-07-22T03:03:35.924Z", + "generator": "code-visualize-cli@0.1.0" + }, + "stats": { + "fileCount": 36, + "containerCount": 0, + "functionCount": 570, + "edgeCount": 682, + "loc": 12750 + }, + "modules": [ + { + "id": "module:.", + "kind": "module", + "name": "task-flow-manager", + "provenance": "ast", + "path": ".", + "childModuleIds": [ + "module:src", + "module:prisma" + ], + "fileIds": [ + "file:prisma.config.ts", + "file:server.ts", + "file:vite.config.ts" + ] + }, + { + "id": "module:src", + "kind": "module", + "name": "src", + "provenance": "ast", + "path": "src", + "childModuleIds": [ + "module:src/server", + "module:src/utils", + "module:src/components" + ], + "fileIds": [ + "file:src/types.ts", + "file:src/App.tsx", + "file:src/main.tsx" + ], + "parentId": "module:." + }, + { + "id": "module:src/server", + "kind": "module", + "name": "server", + "provenance": "ast", + "path": "src/server", + "childModuleIds": [], + "fileIds": [ + "file:src/server/defaultData.ts", + "file:src/server/db.ts", + "file:src/server/weeklyPlanRepository.ts", + "file:src/server/taskRepository.ts", + "file:src/server/notificationRepository.ts", + "file:src/server/projectTemplateRepository.ts", + "file:src/server/tagRepository.ts", + "file:src/server/personRepository.ts", + "file:src/server/botQueryTools.ts", + "file:src/server/aiChatService.ts" + ], + "parentId": "module:src" + }, + { + "id": "module:prisma", + "kind": "module", + "name": "prisma", + "provenance": "ast", + "path": "prisma", + "childModuleIds": [], + "fileIds": [ + "file:prisma/seed.ts" + ], + "parentId": "module:." + }, + { + "id": "module:src/utils", + "kind": "module", + "name": "utils", + "provenance": "ast", + "path": "src/utils", + "childModuleIds": [], + "fileIds": [ + "file:src/utils/date.ts", + "file:src/utils/nodeTimeRanges.ts", + "file:src/utils/taskStatus.ts", + "file:src/utils/taskPriority.ts", + "file:src/utils/api.ts" + ], + "parentId": "module:src" + }, + { + "id": "module:src/components", + "kind": "module", + "name": "components", + "provenance": "ast", + "path": "src/components", + "childModuleIds": [], + "fileIds": [ + "file:src/components/TaskList.tsx", + "file:src/components/WeeklyPlanList.tsx", + "file:src/components/WorkflowCanvas.tsx", + "file:src/components/ProjectCreateModal.tsx", + "file:src/components/TaskOverview.tsx", + "file:src/components/GanttChart.tsx", + "file:src/components/PersonGanttChart.tsx", + "file:src/components/PeopleManager.tsx", + "file:src/components/LoginPage.tsx", + "file:src/components/TagManager.tsx", + "file:src/components/ProjectTemplateManager.tsx", + "file:src/components/NodeEditorDrawer.tsx", + "file:src/components/WeeklyOverview.tsx", + "file:src/components/DingTalkLogs.tsx" + ], + "parentId": "module:src" + } + ], + "files": [ + { + "id": "file:prisma.config.ts", + "kind": "file", + "name": "prisma.config.ts", + "location": { + "file": "prisma.config.ts", + "startLine": 1, + "endLine": 14 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:.", + "path": "prisma.config.ts", + "loc": 14, + "containerIds": [], + "functionIds": [ + "func:prisma.config.ts#@0" + ] + }, + { + "id": "file:src/types.ts", + "kind": "file", + "name": "types.ts", + "location": { + "file": "src/types.ts", + "startLine": 1, + "endLine": 105 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src", + "path": "src/types.ts", + "loc": 105, + "containerIds": [], + "functionIds": [ + "func:src/types.ts#isPublicPoolPlan@68" + ] + }, + { + "id": "file:src/server/defaultData.ts", + "kind": "file", + "name": "defaultData.ts", + "location": { + "file": "src/server/defaultData.ts", + "startLine": 1, + "endLine": 127 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/defaultData.ts", + "loc": 127, + "containerIds": [], + "functionIds": [] + }, + { + "id": "file:prisma/seed.ts", + "kind": "file", + "name": "seed.ts", + "location": { + "file": "prisma/seed.ts", + "startLine": 1, + "endLine": 110 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:prisma", + "path": "prisma/seed.ts", + "loc": 110, + "containerIds": [], + "functionIds": [ + "func:prisma/seed.ts#dateFromInput@9", + "func:prisma/seed.ts#seed@13", + "func:prisma/seed.ts#then() 回调@102@102", + "func:prisma/seed.ts#catch() 回调@105@105", + "func:prisma/seed.ts#@0" + ] + }, + { + "id": "file:src/server/db.ts", + "kind": "file", + "name": "db.ts", + "location": { + "file": "src/server/db.ts", + "startLine": 1, + "endLine": 21 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/db.ts", + "loc": 21, + "containerIds": [], + "functionIds": [] + }, + { + "id": "file:src/server/weeklyPlanRepository.ts", + "kind": "file", + "name": "weeklyPlanRepository.ts", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 1, + "endLine": 164 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/weeklyPlanRepository.ts", + "loc": 164, + "containerIds": [], + "functionIds": [ + "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "func:src/server/weeklyPlanRepository.ts#addDays@13", + "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "func:src/server/weeklyPlanRepository.ts#$transaction() 回调@128@128" + ] + }, + { + "id": "file:src/server/taskRepository.ts", + "kind": "file", + "name": "taskRepository.ts", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 1, + "endLine": 670 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/taskRepository.ts", + "loc": 670, + "containerIds": [], + "functionIds": [ + "func:src/server/taskRepository.ts#dateFromInput@31", + "func:src/server/taskRepository.ts#dateToInput@36", + "func:src/server/taskRepository.ts#uniqueValues@40", + "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "func:src/server/taskRepository.ts#existingTagNames@96", + "func:src/server/taskRepository.ts#findTaskRecord@111", + "func:src/server/taskRepository.ts#toWorkflowNode@118", + "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "func:src/server/taskRepository.ts#toTask@163", + "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "func:src/server/taskRepository.ts#getTask@190", + "func:src/server/taskRepository.ts#listTasks@194", + "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "func:src/server/taskRepository.ts#createTask@227", + "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "func:src/server/taskRepository.ts#updateTask@302", + "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "func:src/server/taskRepository.ts#updateTaskListState@353", + "func:src/server/taskRepository.ts#deleteTask@383", + "func:src/server/taskRepository.ts#createWorkflowNode@389", + "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "func:src/server/taskRepository.ts#$transaction() 回调@480@480", + "func:src/server/taskRepository.ts#createNodeDependency@494", + "func:src/server/taskRepository.ts#$transaction() 回调@510@510", + "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "func:src/server/taskRepository.ts#$transaction() 回调@542@542", + "func:src/server/taskRepository.ts#ensureTaskExists@560", + "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "func:src/server/taskRepository.ts#hasDependencyPath@577", + "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "func:src/server/taskRepository.ts#map() 回调@618@618" + ] + }, + { + "id": "file:src/server/notificationRepository.ts", + "kind": "file", + "name": "notificationRepository.ts", + "location": { + "file": "src/server/notificationRepository.ts", + "startLine": 1, + "endLine": 59 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/notificationRepository.ts", + "loc": 59, + "containerIds": [], + "functionIds": [ + "func:src/server/notificationRepository.ts#toNotificationLog@17", + "func:src/server/notificationRepository.ts#createNotificationLog@37", + "func:src/server/notificationRepository.ts#listNotificationLogs@47", + "func:src/server/notificationRepository.ts#clearNotificationLogs@56" + ] + }, + { + "id": "file:src/server/projectTemplateRepository.ts", + "kind": "file", + "name": "projectTemplateRepository.ts", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 1, + "endLine": 163 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/projectTemplateRepository.ts", + "loc": 163, + "containerIds": [], + "functionIds": [ + "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158" + ] + }, + { + "id": "file:src/server/tagRepository.ts", + "kind": "file", + "name": "tagRepository.ts", + "location": { + "file": "src/server/tagRepository.ts", + "startLine": 1, + "endLine": 49 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/tagRepository.ts", + "loc": 49, + "containerIds": [], + "functionIds": [ + "func:src/server/tagRepository.ts#toTagDefinition@4", + "func:src/server/tagRepository.ts#listTagDefinitions@11", + "func:src/server/tagRepository.ts#createTagDefinition@19", + "func:src/server/tagRepository.ts#deleteTagDefinition@34" + ] + }, + { + "id": "file:src/server/personRepository.ts", + "kind": "file", + "name": "personRepository.ts", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 1, + "endLine": 182 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/personRepository.ts", + "loc": 182, + "containerIds": [], + "functionIds": [ + "func:src/server/personRepository.ts#toPerson@4", + "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "func:src/server/personRepository.ts#listPeople@53", + "func:src/server/personRepository.ts#getPersonOrThrow@64", + "func:src/server/personRepository.ts#createPerson@73", + "func:src/server/personRepository.ts#ensurePeople@118", + "func:src/server/personRepository.ts#updatePerson@142", + "func:src/server/personRepository.ts#deletePerson@177" + ] + }, + { + "id": "file:src/server/botQueryTools.ts", + "kind": "file", + "name": "botQueryTools.ts", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 1, + "endLine": 586 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/botQueryTools.ts", + "loc": 586, + "containerIds": [], + "functionIds": [ + "func:src/server/botQueryTools.ts#getTodayStr@10", + "func:src/server/botQueryTools.ts#value@17", + "func:src/server/botQueryTools.ts#nodeRanges@21", + "func:src/server/botQueryTools.ts#nodeStartDate@28", + "func:src/server/botQueryTools.ts#nodeEndDate@34", + "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "func:src/server/botQueryTools.ts#taskDateSpan@51", + "func:src/server/botQueryTools.ts#overlapsRange@59", + "func:src/server/botQueryTools.ts#buildTaskLink@72", + "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "func:src/server/botQueryTools.ts#getTasks@124", + "func:src/server/botQueryTools.ts#getPeople@125", + "func:src/server/botQueryTools.ts#getWeeklyPlans@126", + "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "func:src/server/botQueryTools.ts#selfScope@149", + "func:src/server/botQueryTools.ts#summarizeTask@172", + "func:src/server/botQueryTools.ts#planNameById@198", + "func:src/server/botQueryTools.ts#resolveToolSchema@231", + "func:src/server/botQueryTools.ts#execute@253", + "func:src/server/botQueryTools.ts#execute@297", + "func:src/server/botQueryTools.ts#filter() 回调@310@310", + "func:src/server/botQueryTools.ts#execute@349", + "func:src/server/botQueryTools.ts#execute@430", + "func:src/server/botQueryTools.ts#addDays@440", + "func:src/server/botQueryTools.ts#execute@500", + "func:src/server/botQueryTools.ts#filter() 回调@516@516", + "func:src/server/botQueryTools.ts#execute@542", + "func:src/server/botQueryTools.ts#getBotToolByName@583" + ] + }, + { + "id": "file:src/server/aiChatService.ts", + "kind": "file", + "name": "aiChatService.ts", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 1, + "endLine": 261 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/aiChatService.ts", + "loc": 261, + "containerIds": [], + "functionIds": [ + "func:src/server/aiChatService.ts#isAiConfigured@30", + "func:src/server/aiChatService.ts#getMemoryTurns@62", + "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "func:src/server/aiChatService.ts#clearBotMemory@79", + "func:src/server/aiChatService.ts#setInterval() 回调@84@84", + "func:src/server/aiChatService.ts#buildToolSpecs@93", + "func:src/server/aiChatService.ts#map() 回调@94@94", + "func:src/server/aiChatService.ts#buildSystemPrompt@107", + "func:src/server/aiChatService.ts#callChatCompletion@124", + "func:src/server/aiChatService.ts#executeToolCall@156", + "func:src/server/aiChatService.ts#answerBotQuestion@185", + "func:src/server/aiChatService.ts#@0" + ] + }, + { + "id": "file:server.ts", + "kind": "file", + "name": "server.ts", + "location": { + "file": "server.ts", + "startLine": 1, + "endLine": 1261 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:.", + "path": "server.ts", + "loc": 1261, + "containerIds": [], + "functionIds": [ + "func:server.ts#ensureManualLoginPeople@84", + "func:server.ts#GET /api/health@90", + "func:server.ts#readRemoteError@98", + "func:server.ts#readRemoteJson@110", + "func:server.ts#ensureDingTalkRobotConfigured@122", + "func:server.ts#getDingTalkRobotAccessToken@128", + "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "func:server.ts#replyToDingTalkSession@204", + "func:server.ts#replyToDingTalkSessionMarkdown@222", + "func:server.ts#getTaskRelatedPersonNames@239", + "func:server.ts#getWorkflowLink@252", + "func:server.ts#getZonedDateParts@261", + "func:server.ts#value@271", + "func:server.ts#getPersonNamesForDueNodeReminder@280", + "func:server.ts#getDueTimeRanges@290", + "func:server.ts#sendDailyDueNodeReminder@298", + "func:server.ts#notifyTaskConfirmedCompleted@363", + "func:server.ts#ensureSsoConfigured@417", + "func:server.ts#getSsoRedirectUri@423", + "func:server.ts#getSsoAuthUrl@432", + "func:server.ts#getSsoUserAccessToken@444", + "func:server.ts#getSsoCurrentUser@471", + "func:server.ts#GET /api/auth/sso-config@498", + "func:server.ts#GET /api/auth/sso-login-url@508", + "func:server.ts#handleSsoCallback@520", + "func:server.ts#GET /api/auth/manual-users@559", + "func:server.ts#POST /api/auth/manual-login@563", + "func:server.ts#POST /api/auth/dev-login@575", + "func:server.ts#POST /api/auth/sso-login@605", + "func:server.ts#POST /api/auth/sso-join-person@642", + "func:server.ts#GET /api/people@669", + "func:server.ts#POST /api/people@678", + "func:server.ts#PUT /api/people/:id@687", + "func:server.ts#DELETE /api/people/:id@696", + "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "func:server.ts#GET /api/tags@737", + "func:server.ts#POST /api/tags@745", + "func:server.ts#DELETE /api/tags/:id@754", + "func:server.ts#GET /api/weekly-plans@764", + "func:server.ts#POST /api/weekly-plans@772", + "func:server.ts#DELETE /api/weekly-plans/:id@781", + "func:server.ts#GET /api/project-templates@791", + "func:server.ts#POST /api/project-templates@799", + "func:server.ts#PUT /api/project-templates/:id@808", + "func:server.ts#DELETE /api/project-templates/:id@817", + "func:server.ts#GET /api/tasks@826", + "func:server.ts#GET /api/tasks/:id@834", + "func:server.ts#POST /api/tasks@843", + "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "func:server.ts#PUT /api/tasks/:id@865", + "func:server.ts#catch() 回调@876@876", + "func:server.ts#DELETE /api/tasks/:id@886", + "func:server.ts#POST /api/tasks/:id/nodes@895", + "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "func:server.ts#POST /api/tasks/:id/dependencies@925", + "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "func:server.ts#POST /api/notify@944", + "func:server.ts#GET /api/logs@1041", + "func:server.ts#DELETE /api/logs@1049", + "func:server.ts#normalizeActionType@1058", + "func:server.ts#getNotificationState@1065", + "func:server.ts#startDailyDueNodeReminderScheduler@1089", + "func:server.ts#checkAndRun@1090", + "func:server.ts#catch() 回调@1098@1098", + "func:server.ts#handleDingTalkRobotMessage@1114", + "func:server.ts#replyText@1147", + "func:server.ts#startDingTalkRobotStream@1204", + "func:server.ts#registerCallbackListener() 回调@1215@1215", + "func:server.ts#catch() 回调@1218@1218", + "func:server.ts#then() 回调@1225@1225", + "func:server.ts#catch() 回调@1228@1228", + "func:server.ts#startServer@1235", + "func:server.ts#GET *@1245", + "func:server.ts#listen() 回调@1250@1250", + "func:server.ts#catch() 回调@1257@1257", + "func:server.ts#@0" + ] + }, + { + "id": "file:src/utils/date.ts", + "kind": "file", + "name": "date.ts", + "location": { + "file": "src/utils/date.ts", + "startLine": 1, + "endLine": 8 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/utils", + "path": "src/utils/date.ts", + "loc": 8, + "containerIds": [], + "functionIds": [ + "func:src/utils/date.ts#getLocalDateString@1" + ] + }, + { + "id": "file:src/utils/nodeTimeRanges.ts", + "kind": "file", + "name": "nodeTimeRanges.ts", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 1, + "endLine": 148 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/utils", + "path": "src/utils/nodeTimeRanges.ts", + "loc": 148, + "containerIds": [], + "functionIds": [ + "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "func:src/utils/nodeTimeRanges.ts#reduce() 回调@53@53", + "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107" + ] + }, + { + "id": "file:src/utils/taskStatus.ts", + "kind": "file", + "name": "taskStatus.ts", + "location": { + "file": "src/utils/taskStatus.ts", + "startLine": 1, + "endLine": 94 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/utils", + "path": "src/utils/taskStatus.ts", + "loc": 94, + "containerIds": [], + "functionIds": [ + "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "func:src/utils/taskStatus.ts#getTaskStatusMeta@50" + ] + }, + { + "id": "file:src/utils/taskPriority.ts", + "kind": "file", + "name": "taskPriority.ts", + "location": { + "file": "src/utils/taskPriority.ts", + "startLine": 1, + "endLine": 36 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/utils", + "path": "src/utils/taskPriority.ts", + "loc": 36, + "containerIds": [], + "functionIds": [ + "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" + ] + }, + { + "id": "file:src/components/TaskList.tsx", + "kind": "file", + "name": "TaskList.tsx", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 1, + "endLine": 514 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/TaskList.tsx", + "loc": 514, + "containerIds": [], + "functionIds": [ + "func:src/components/TaskList.tsx#TaskList@47", + "func:src/components/TaskList.tsx#reduce() 回调@77@77", + "func:src/components/TaskList.tsx#toggleSelectedTag@91", + "func:src/components/TaskList.tsx#toggleSelectedStatus@97", + "func:src/components/TaskList.tsx#toggleSelectedPriority@103", + "func:src/components/TaskList.tsx#filter() 回调@110@110", + "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "func:src/components/TaskList.tsx#find() 回调@139@139", + "func:src/components/TaskList.tsx#clearQueueDropState@147", + "func:src/components/TaskList.tsx#map() 回调@202@202", + "func:src/components/TaskList.tsx#map() 回调@265@265", + "func:src/components/TaskList.tsx#map() 回调@297@297", + "func:src/components/TaskList.tsx#匿名函数@353@353", + "func:src/components/TaskList.tsx#匿名函数@366@366", + "func:src/components/TaskList.tsx#匿名函数@371@371", + "func:src/components/TaskList.tsx#map() 回调@387@387", + "func:src/components/TaskList.tsx#匿名函数@400@400", + "func:src/components/TaskList.tsx#匿名函数@410@410", + "func:src/components/TaskList.tsx#匿名函数@442@442", + "func:src/components/TaskList.tsx#匿名函数@458@458" + ] + }, + { + "id": "file:src/components/WeeklyPlanList.tsx", + "kind": "file", + "name": "WeeklyPlanList.tsx", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 1, + "endLine": 370 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/WeeklyPlanList.tsx", + "loc": 370, + "containerIds": [], + "functionIds": [ + "func:src/components/WeeklyPlanList.tsx#addDays@20", + "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", + "func:src/components/WeeklyPlanList.tsx#useEffect() 回调@48@48", + "func:src/components/WeeklyPlanList.tsx#forEach() 回调@56@56", + "func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62", + "func:src/components/WeeklyPlanList.tsx#resetForm@70", + "func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76", + "func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", + "func:src/components/WeeklyPlanList.tsx#confirmDeletePlan@102", + "func:src/components/WeeklyPlanList.tsx#匿名函数@162@162", + "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", + "func:src/components/WeeklyPlanList.tsx#匿名函数@209@209", + "func:src/components/WeeklyPlanList.tsx#匿名函数@213@213", + "func:src/components/WeeklyPlanList.tsx#匿名函数@219@219" + ] + }, + { + "id": "file:src/components/WorkflowCanvas.tsx", + "kind": "file", + "name": "WorkflowCanvas.tsx", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 1, + "endLine": 1125 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/WorkflowCanvas.tsx", + "loc": 1125, + "containerIds": [], + "functionIds": [ + "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "func:src/components/WorkflowCanvas.tsx#handleCanvasMouseDown@159", + "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", + "func:src/components/WorkflowCanvas.tsx#map() 回调@212@212", + "func:src/components/WorkflowCanvas.tsx#handleCanvasWheel@238", + "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "func:src/components/WorkflowCanvas.tsx#isAncestor@265", + "func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", + "func:src/components/WorkflowCanvas.tsx#setTimeout() 回调@277@277", + "func:src/components/WorkflowCanvas.tsx#addConnection@282", + "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "func:src/components/WorkflowCanvas.tsx#find() 回调@317@317", + "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "func:src/components/WorkflowCanvas.tsx#handleCenterNodes@400", + "func:src/components/WorkflowCanvas.tsx#reduce() 回调@405@405", + "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", + "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507", + "func:src/components/WorkflowCanvas.tsx#handleToolbarClick@512", + "func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", + "func:src/components/WorkflowCanvas.tsx#map() 回调@533@533", + "func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", + "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@564@564", + "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", + "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@593@593", + "func:src/components/WorkflowCanvas.tsx#handleClickOutside@595", + "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "func:src/components/WorkflowCanvas.tsx#toMs@623", + "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", + "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "func:src/components/WorkflowCanvas.tsx#map() 回调@837@837", + "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", + "func:src/components/WorkflowCanvas.tsx#匿名函数@890@890", + "func:src/components/WorkflowCanvas.tsx#匿名函数@894@894", + "func:src/components/WorkflowCanvas.tsx#匿名函数@900@900", + "func:src/components/WorkflowCanvas.tsx#匿名函数@927@927", + "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "func:src/components/WorkflowCanvas.tsx#匿名函数@1073@1073" + ] + }, + { + "id": "file:src/components/ProjectCreateModal.tsx", + "kind": "file", + "name": "ProjectCreateModal.tsx", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 1, + "endLine": 318 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/ProjectCreateModal.tsx", + "loc": 318, + "containerIds": [], + "functionIds": [ + "func:src/components/ProjectCreateModal.tsx#toDateMs@23", + "func:src/components/ProjectCreateModal.tsx#addDays@27", + "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", + "func:src/components/ProjectCreateModal.tsx#TemplateDagPreview@64", + "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@68@68", + "func:src/components/ProjectCreateModal.tsx#ProjectCreateModal@123", + "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@137@137", + "func:src/components/ProjectCreateModal.tsx#toggleTag@146", + "func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", + "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", + "func:src/components/ProjectCreateModal.tsx#map() 回调@234@234", + "func:src/components/ProjectCreateModal.tsx#map() 回调@271@271" + ] + }, + { + "id": "file:src/components/TaskOverview.tsx", + "kind": "file", + "name": "TaskOverview.tsx", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 1, + "endLine": 464 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/TaskOverview.tsx", + "loc": 464, + "containerIds": [], + "functionIds": [ + "func:src/components/TaskOverview.tsx#TaskOverview@14", + "func:src/components/TaskOverview.tsx#useEffect() 回调@48@48", + "func:src/components/TaskOverview.tsx#useLayoutEffect() 回调@58@58", + "func:src/components/TaskOverview.tsx#handleSave@64", + "func:src/components/TaskOverview.tsx#handleSaveBlackboard@79", + "func:src/components/TaskOverview.tsx#toggleEditTag@89", + "func:src/components/TaskOverview.tsx#handleOpenBlackboard@95", + "func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", + "func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118", + "func:src/components/TaskOverview.tsx#map() 回调@240@240", + "func:src/components/TaskOverview.tsx#map() 回调@294@294" + ] + }, + { + "id": "file:src/components/GanttChart.tsx", + "kind": "file", + "name": "GanttChart.tsx", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 1, + "endLine": 428 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/GanttChart.tsx", + "loc": 428, + "containerIds": [], + "functionIds": [ + "func:src/components/GanttChart.tsx#GanttChart@14", + "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", + "func:src/components/GanttChart.tsx#from() 回调@29@29", + "func:src/components/GanttChart.tsx#forEach() 回调@40@40", + "func:src/components/GanttChart.tsx#forEach() 回调@41@41", + "func:src/components/GanttChart.tsx#formatDateString@76", + "func:src/components/GanttChart.tsx#getDayLabel@80", + "func:src/components/GanttChart.tsx#isWeekend@86", + "func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "func:src/components/GanttChart.tsx#handleTimelineMouseDown@131", + "func:src/components/GanttChart.tsx#handleTimelineMouseMove@144", + "func:src/components/GanttChart.tsx#stopTimelineDrag@155", + "func:src/components/GanttChart.tsx#handleTimelineClickCapture@160", + "func:src/components/GanttChart.tsx#useEffect() 回调@167@167", + "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "func:src/components/GanttChart.tsx#map() 回调@260@260", + "func:src/components/GanttChart.tsx#map() 回调@304@304", + "func:src/components/GanttChart.tsx#map() 回调@375@375", + "func:src/components/GanttChart.tsx#map() 回调@389@389", + "func:src/components/GanttChart.tsx#匿名函数@399@399" + ] + }, + { + "id": "file:src/components/PersonGanttChart.tsx", + "kind": "file", + "name": "PersonGanttChart.tsx", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 1, + "endLine": 425 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/PersonGanttChart.tsx", + "loc": 425, + "containerIds": [], + "functionIds": [ + "func:src/components/PersonGanttChart.tsx#PersonGanttChart@25", + "func:src/components/PersonGanttChart.tsx#useMemo() 回调@41@41", + "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64", + "func:src/components/PersonGanttChart.tsx#forEach() 回调@65@65", + "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "func:src/components/PersonGanttChart.tsx#handleTimelineMouseDown@115", + "func:src/components/PersonGanttChart.tsx#handleTimelineMouseMove@126", + "func:src/components/PersonGanttChart.tsx#stopTimelineDrag@135", + "func:src/components/PersonGanttChart.tsx#useEffect() 回调@140@140", + "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", + "func:src/components/PersonGanttChart.tsx#匿名函数@218@218", + "func:src/components/PersonGanttChart.tsx#map() 回调@235@235", + "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "func:src/components/PersonGanttChart.tsx#map() 回调@322@322", + "func:src/components/PersonGanttChart.tsx#map() 回调@337@337", + "func:src/components/PersonGanttChart.tsx#匿名函数@344@344", + "func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "func:src/components/PersonGanttChart.tsx#getDayLabel@393", + "func:src/components/PersonGanttChart.tsx#getStatusVisual@398" + ] + }, + { + "id": "file:src/components/PeopleManager.tsx", + "kind": "file", + "name": "PeopleManager.tsx", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 1, + "endLine": 329 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/PeopleManager.tsx", + "loc": 329, + "containerIds": [], + "functionIds": [ + "func:src/components/PeopleManager.tsx#getSearchTokens@29", + "func:src/components/PeopleManager.tsx#getPinyinSortKey@45", + "func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51", + "func:src/components/PeopleManager.tsx#PeopleManager@58", + "func:src/components/PeopleManager.tsx#useMemo() 回调@107@107", + "func:src/components/PeopleManager.tsx#useEffect() 回调@118@118", + "func:src/components/PeopleManager.tsx#useEffect() 回调@122@122", + "func:src/components/PeopleManager.tsx#handleSaveRole@127", + "func:src/components/PeopleManager.tsx#匿名函数@250@250", + "func:src/components/PeopleManager.tsx#匿名函数@280@280", + "func:src/components/PeopleManager.tsx#匿名函数@285@285" + ] + }, + { + "id": "file:src/utils/api.ts", + "kind": "file", + "name": "api.ts", + "location": { + "file": "src/utils/api.ts", + "startLine": 1, + "endLine": 18 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/utils", + "path": "src/utils/api.ts", + "loc": 18, + "containerIds": [], + "functionIds": [ + "func:src/utils/api.ts#appPath@7", + "func:src/utils/api.ts#apiPath@15" + ] + }, + { + "id": "file:src/components/LoginPage.tsx", + "kind": "file", + "name": "LoginPage.tsx", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 1, + "endLine": 188 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/LoginPage.tsx", + "loc": 188, + "containerIds": [], + "functionIds": [ + "func:src/components/LoginPage.tsx#readApiJson@21", + "func:src/components/LoginPage.tsx#createOAuthState@31", + "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "func:src/components/LoginPage.tsx#匿名函数@40@40", + "func:src/components/LoginPage.tsx#setTimeout() 回调@52@52", + "func:src/components/LoginPage.tsx#handleMessage@58", + "func:src/components/LoginPage.tsx#LoginPage@84", + "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "func:src/components/LoginPage.tsx#handleDevLogin@121" + ] + }, + { + "id": "file:src/components/TagManager.tsx", + "kind": "file", + "name": "TagManager.tsx", + "location": { + "file": "src/components/TagManager.tsx", + "startLine": 1, + "endLine": 158 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/TagManager.tsx", + "loc": 158, + "containerIds": [], + "functionIds": [ + "func:src/components/TagManager.tsx#TagManager@11", + "func:src/components/TagManager.tsx#useMemo() 回调@17@17", + "func:src/components/TagManager.tsx#handleSubmit@23", + "func:src/components/TagManager.tsx#匿名函数@136@136" + ] + }, + { + "id": "file:src/components/ProjectTemplateManager.tsx", + "kind": "file", + "name": "ProjectTemplateManager.tsx", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 1, + "endLine": 535 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/ProjectTemplateManager.tsx", + "loc": 535, + "containerIds": [], + "functionIds": [ + "func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", + "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", + "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", + "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", + "func:src/components/ProjectTemplateManager.tsx#useEffect() 回调@104@104", + "func:src/components/ProjectTemplateManager.tsx#toggleTag@111", + "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", + "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", + "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", + "func:src/components/ProjectTemplateManager.tsx#map() 回调@201@201", + "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", + "func:src/components/ProjectTemplateManager.tsx#handleUpdateNodes@247", + "func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", + "func:src/components/ProjectTemplateManager.tsx#deleteSelectedNode@260", + "func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308", + "func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393", + "func:src/components/ProjectTemplateManager.tsx#map() 回调@504@504" + ] + }, + { + "id": "file:src/components/NodeEditorDrawer.tsx", + "kind": "file", + "name": "NodeEditorDrawer.tsx", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 1, + "endLine": 756 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/NodeEditorDrawer.tsx", + "loc": 756, + "containerIds": [], + "functionIds": [ + "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "func:src/components/NodeEditorDrawer.tsx#getSearchTokens@107", + "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@151@151", + "func:src/components/NodeEditorDrawer.tsx#匿名函数@157@157", + "func:src/components/NodeEditorDrawer.tsx#setTimeout() 回调@164@164", + "func:src/components/NodeEditorDrawer.tsx#匿名函数@173@173", + "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", + "func:src/components/NodeEditorDrawer.tsx#filter() 回调@210@210", + "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", + "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "func:src/components/NodeEditorDrawer.tsx#completeNode@328", + "func:src/components/NodeEditorDrawer.tsx#reopenNode@332", + "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", + "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", + "func:src/components/NodeEditorDrawer.tsx#deleteNode@384", + "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "func:src/components/NodeEditorDrawer.tsx#map() 回调@466@466", + "func:src/components/NodeEditorDrawer.tsx#匿名函数@524@524", + "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", + "func:src/components/NodeEditorDrawer.tsx#@0" + ] + }, + { + "id": "file:src/components/WeeklyOverview.tsx", + "kind": "file", + "name": "WeeklyOverview.tsx", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 1, + "endLine": 880 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/WeeklyOverview.tsx", + "loc": 880, + "containerIds": [], + "functionIds": [ + "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "func:src/components/WeeklyOverview.tsx#find() 回调@37@37", + "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "func:src/components/WeeklyOverview.tsx#sortTasks@82", + "func:src/components/WeeklyOverview.tsx#sort() 回调@83@83", + "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", + "func:src/components/WeeklyOverview.tsx#handleBoardMouseDown@118", + "func:src/components/WeeklyOverview.tsx#handleBoardMouseMove@131", + "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "func:src/components/WeeklyOverview.tsx#handleBoardClickCapture@143", + "func:src/components/WeeklyOverview.tsx#handleDrawerMouseDown@156", + "func:src/components/WeeklyOverview.tsx#handleDrawerMouseMove@170", + "func:src/components/WeeklyOverview.tsx#stopDrawerDrag@196", + "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "func:src/components/WeeklyOverview.tsx#useMemo() 回调@261@261", + "func:src/components/WeeklyOverview.tsx#forEach() 回调@263@263", + "func:src/components/WeeklyOverview.tsx#sort() 回调@273@273", + "func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", + "func:src/components/WeeklyOverview.tsx#matchesFilters@290", + "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", + "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394", + "func:src/components/WeeklyOverview.tsx#匿名函数@494@494", + "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "func:src/components/WeeklyOverview.tsx#匿名函数@777@777", + "func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785", + "func:src/components/WeeklyOverview.tsx#map() 回调@840@840" + ] + }, + { + "id": "file:src/App.tsx", + "kind": "file", + "name": "App.tsx", + "location": { + "file": "src/App.tsx", + "startLine": 1, + "endLine": 1975 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src", + "path": "src/App.tsx", + "loc": 1975, + "containerIds": [], + "functionIds": [ + "func:src/App.tsx#readApiError@39", + "func:src/App.tsx#readApiJson@44", + "func:src/App.tsx#sortTasksForList@54", + "func:src/App.tsx#sort() 回调@55@55", + "func:src/App.tsx#readStoredAuthUser@62", + "func:src/App.tsx#App@84", + "func:src/App.tsx#useEffect() 回调@133@133", + "func:src/App.tsx#useEffect() 回调@147@147", + "func:src/App.tsx#useEffect() 回调@153@153", + "func:src/App.tsx#useEffect() 回调@159@159", + "func:src/App.tsx#useEffect() 回调@171@171", + "func:src/App.tsx#useEffect() 回调@178@178", + "func:src/App.tsx#useEffect() 回调@186@186", + "func:src/App.tsx#useEffect() 回调@213@213", + "func:src/App.tsx#匿名函数@214@214", + "func:src/App.tsx#fetchTasks@221", + "func:src/App.tsx#fetchPeople@241", + "func:src/App.tsx#fetchTags@256", + "func:src/App.tsx#handleCreateTag@271", + "func:src/App.tsx#setTags() 回调@281@281", + "func:src/App.tsx#handleDeleteTag@297", + "func:src/App.tsx#fetchProjectTemplates@323", + "func:src/App.tsx#fetchWeeklyPlans@338", + "func:src/App.tsx#handleCreateWeeklyPlan@353", + "func:src/App.tsx#handleDeleteWeeklyPlan@385", + "func:src/App.tsx#setWeeklyPlans() 回调@402@402", + "func:src/App.tsx#handleCreateProjectTemplate@427", + "func:src/App.tsx#handleUpdateProjectTemplate@450", + "func:src/App.tsx#handleDeleteProjectTemplate@478", + "func:src/App.tsx#handleCreatePerson@498", + "func:src/App.tsx#setPeople() 回调@508@508", + "func:src/App.tsx#handleJoinSsoPerson@521", + "func:src/App.tsx#setPeople() 回调@532@532", + "func:src/App.tsx#handleDeletePerson@548", + "func:src/App.tsx#handleUpdatePersonRole@565", + "func:src/App.tsx#handleTogglePersonAdmin@605", + "func:src/App.tsx#handleLogin@639", + "func:src/App.tsx#handleUnlockAdmin@650", + "func:src/App.tsx#handleCurrentUserClick@678", + "func:src/App.tsx#handleLogout@696", + "func:src/App.tsx#useMemo() 回调@720@720", + "func:src/App.tsx#useMemo() 回调@726@726", + "func:src/App.tsx#useMemo() 回调@730@730", + "func:src/App.tsx#useEffect() 回调@734@734", + "func:src/App.tsx#handleSelectWeeklyPlan@750", + "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", + "func:src/App.tsx#handleReorderTask@798", + "func:src/App.tsx#handleSelectTask@849", + "func:src/App.tsx#handleStartCreateProject@856", + "func:src/App.tsx#handleCancelCreateProject@865", + "func:src/App.tsx#handleSelectNode@870", + "func:src/App.tsx#handleOpenTaskFromOverview@877", + "func:src/App.tsx#handleOpenPlanFromOverview@888", + "func:src/App.tsx#handleSelectTaskNode@899", + "func:src/App.tsx#handleNavigateDrawerView@926", + "func:src/App.tsx#handleWorkspaceClick@957", + "func:src/App.tsx#computeCenteredViewport@981", + "func:src/App.tsx#focusNodeInCanvas@1016", + "func:src/App.tsx#animate@1042", + "func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", + "func:src/App.tsx#animate@1088", + "func:src/App.tsx#useEffect() 回调@1109@1109", + "func:src/App.tsx#useEffect() 回调@1121@1121", + "func:src/App.tsx#useLayoutEffect() 回调@1134@1134", + "func:src/App.tsx#applyCentered@1149", + "func:src/App.tsx#handleCreateTask@1165", + "func:src/App.tsx#handleQuickRequirement@1212", + "func:src/App.tsx#handleSubmitRequirement@1219", + "func:src/App.tsx#handleToggleTaskPinned@1278", + "func:src/App.tsx#handleDeleteTask@1299", + "func:src/App.tsx#handleUpdateTaskMetadata@1329", + "func:src/App.tsx#handleRefreshTask@1353", + "func:src/App.tsx#handleUpdateNodes@1371", + "func:src/App.tsx#edgeKey@1383", + "func:src/App.tsx#filter() 回调@1393@1393", + "func:src/App.tsx#requestTaskUpdate@1425", + "func:src/App.tsx#map() 回调@1526@1526", + "func:src/App.tsx#匿名函数@1533@1533", + "func:src/App.tsx#匿名函数@1557@1557", + "func:src/App.tsx#map() 回调@1700@1700" + ] + }, + { + "id": "file:src/components/DingTalkLogs.tsx", + "kind": "file", + "name": "DingTalkLogs.tsx", + "location": { + "file": "src/components/DingTalkLogs.tsx", + "startLine": 1, + "endLine": 159 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/DingTalkLogs.tsx", + "loc": 159, + "containerIds": [], + "functionIds": [ + "func:src/components/DingTalkLogs.tsx#DingTalkLogs@11", + "func:src/components/DingTalkLogs.tsx#copyToClipboard@14", + "func:src/components/DingTalkLogs.tsx#setTimeout() 回调@17@17", + "func:src/components/DingTalkLogs.tsx#map() 回调@76@76" + ] + }, + { + "id": "file:src/main.tsx", + "kind": "file", + "name": "main.tsx", + "location": { + "file": "src/main.tsx", + "startLine": 1, + "endLine": 11 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src", + "path": "src/main.tsx", + "loc": 11, + "containerIds": [], + "functionIds": [ + "func:src/main.tsx#@0" + ] + }, + { + "id": "file:vite.config.ts", + "kind": "file", + "name": "vite.config.ts", + "location": { + "file": "vite.config.ts", + "startLine": 1, + "endLine": 39 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:.", + "path": "vite.config.ts", + "loc": 39, + "containerIds": [], + "functionIds": [ + "func:vite.config.ts#normalizeBasePath@6", + "func:vite.config.ts#defineConfig() 回调@12@12", + "func:vite.config.ts#@0" + ] + } + ], + "containers": [], + "functions": [ + { + "id": "func:src/types.ts#isPublicPoolPlan@68", + "kind": "function", + "name": "isPublicPoolPlan", + "qualifiedName": "isPublicPoolPlan", + "location": { + "file": "src/types.ts", + "startLine": 68, + "endLine": 70, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/types.ts", + "moduleId": "module:src", + "signature": "isPublicPoolPlan(id: string | null | undefined): boolean", + "params": [ + { + "name": "id", + "typeRef": "string | null | undefined", + "optional": false + } + ], + "returnType": "boolean", + "loc": 3 + }, + { + "id": "func:prisma/seed.ts#dateFromInput@9", + "kind": "function", + "name": "dateFromInput", + "qualifiedName": "dateFromInput", + "location": { + "file": "prisma/seed.ts", + "startLine": 9, + "endLine": 11, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma/seed.ts", + "moduleId": "module:prisma", + "signature": "dateFromInput(value: string): Date", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Date", + "loc": 3 + }, + { + "id": "func:prisma/seed.ts#seed@13", + "kind": "function", + "name": "seed", + "qualifiedName": "seed", + "location": { + "file": "prisma/seed.ts", + "startLine": 13, + "endLine": 99, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma/seed.ts", + "moduleId": "module:prisma", + "signature": "seed()", + "params": [], + "loc": 87, + "interactions": [ + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:notificationLog", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "notificationLog", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "task", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "weeklyPlan", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "person", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "weeklyPlan", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "task", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:nodeDependency", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "nodeDependency", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:prisma/seed.ts#then() 回调@102@102", + "kind": "function", + "name": "then() 回调@102", + "qualifiedName": "then() 回调@102", + "location": { + "file": "prisma/seed.ts", + "startLine": 102, + "endLine": 104, + "startCol": 9, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma/seed.ts", + "moduleId": "module:prisma", + "signature": "then() 回调@102()", + "params": [], + "loc": 3 + }, + { + "id": "func:prisma/seed.ts#catch() 回调@105@105", + "kind": "function", + "name": "catch() 回调@105", + "qualifiedName": "catch() 回调@105", + "location": { + "file": "prisma/seed.ts", + "startLine": 105, + "endLine": 109, + "startCol": 10, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma/seed.ts", + "moduleId": "module:prisma", + "signature": "catch() 回调@105(error)", + "params": [ + { + "name": "error", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "kind": "function", + "name": "dateFromInput", + "qualifiedName": "dateFromInput", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 4, + "endLine": 7, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "dateFromInput(value: string): Date", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": true + } + ], + "returnType": "Date", + "loc": 4 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "kind": "function", + "name": "dateToInput", + "qualifiedName": "dateToInput", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 9, + "endLine": 11, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "dateToInput(value: Date): string", + "params": [ + { + "name": "value", + "typeRef": "Date", + "optional": false + } + ], + "returnType": "string", + "loc": 3 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "kind": "function", + "name": "addDays", + "qualifiedName": "addDays", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 13, + "endLine": 17, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "addDays(value: string, days: number)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + }, + { + "name": "days", + "typeRef": "number", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "kind": "function", + "name": "toWeeklyPlan", + "qualifiedName": "toWeeklyPlan", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 19, + "endLine": 31, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "toWeeklyPlan(plan: {\n id: string;\n name: string;\n startDate: Date;\n endDate: Date;\n}): WeeklyPlan", + "params": [ + { + "name": "plan", + "typeRef": "{\n id: string;\n name: string;\n startDate: Date;\n endDate: Date;\n}", + "optional": false + } + ], + "returnType": "WeeklyPlan", + "loc": 13 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "kind": "function", + "name": "ensurePublicPoolPlan", + "qualifiedName": "ensurePublicPoolPlan", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 34, + "endLine": 48, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "ensurePublicPoolPlan(): Promise", + "params": [], + "returnType": "Promise", + "loc": 15, + "interactions": [ + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34:db:out:create:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "weeklyPlan", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "kind": "function", + "name": "getDefaultWeeklyPlan", + "qualifiedName": "getDefaultWeeklyPlan", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 51, + "endLine": 53, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "getDefaultWeeklyPlan(): Promise", + "params": [], + "returnType": "Promise", + "loc": 3 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "kind": "function", + "name": "listWeeklyPlans", + "qualifiedName": "listWeeklyPlans", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 55, + "endLine": 67, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "listWeeklyPlans(): Promise", + "params": [], + "returnType": "Promise", + "loc": 13, + "interactions": [ + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55:db:out:read:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "weeklyPlan", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "kind": "function", + "name": "createWeeklyPlan", + "qualifiedName": "createWeeklyPlan", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 69, + "endLine": 91, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "createWeeklyPlan(input: Partial): Promise", + "params": [ + { + "name": "input", + "typeRef": "Partial", + "optional": false + } + ], + "returnType": "Promise", + "loc": 23, + "interactions": [ + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69:db:out:create:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "weeklyPlan", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "kind": "function", + "name": "getWeeklyPlanOrThrow", + "qualifiedName": "getWeeklyPlanOrThrow", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 93, + "endLine": 100, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "getWeeklyPlanOrThrow(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 8, + "interactions": [ + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93:db:out:read:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "weeklyPlan", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "kind": "function", + "name": "deleteWeeklyPlan", + "qualifiedName": "deleteWeeklyPlan", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 102, + "endLine": 163, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteWeeklyPlan(id: string): Promise<{\n deletedId: string;\n fallbackPlan: WeeklyPlan;\n deletedTaskCount: number;\n}>", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise<{\n deletedId: string;\n fallbackPlan: WeeklyPlan;\n deletedTaskCount: number;\n}>", + "loc": 62, + "interactions": [ + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102:db:out:read:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "weeklyPlan", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#$transaction() 回调@128@128", + "kind": "function", + "name": "$transaction() 回调@128", + "qualifiedName": "$transaction() 回调@128", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 128, + "endLine": 154, + "startCol": 54, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@128(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/server/taskRepository.ts#dateFromInput@31", + "kind": "function", + "name": "dateFromInput", + "qualifiedName": "dateFromInput", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 31, + "endLine": 34, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "dateFromInput(value: string): Date", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": true + } + ], + "returnType": "Date", + "loc": 4 + }, + { + "id": "func:src/server/taskRepository.ts#dateToInput@36", + "kind": "function", + "name": "dateToInput", + "qualifiedName": "dateToInput", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 36, + "endLine": 38, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "dateToInput(value: Date): string", + "params": [ + { + "name": "value", + "typeRef": "Date", + "optional": false + } + ], + "returnType": "string", + "loc": 3 + }, + { + "id": "func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "function", + "name": "uniqueValues", + "qualifiedName": "uniqueValues", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 40, + "endLine": 42, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "uniqueValues(values: string[]): string[]", + "params": [ + { + "name": "values", + "typeRef": "string[]", + "optional": true, + "defaultValue": "[]" + } + ], + "returnType": "string[]", + "loc": 3 + }, + { + "id": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "kind": "function", + "name": "normalizeNodeProgress", + "qualifiedName": "normalizeNodeProgress", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 44, + "endLine": 48, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeNodeProgress(value: unknown): number", + "params": [ + { + "name": "value", + "typeRef": "unknown", + "optional": false + } + ], + "returnType": "number", + "loc": 5 + }, + { + "id": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "kind": "function", + "name": "normalizeNodeTimeRanges", + "qualifiedName": "normalizeNodeTimeRanges", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 50, + "endLine": 79, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeNodeTimeRanges(ranges: unknown, fallbackStartDate: string, fallbackEndDate): NodeTimeRange[]", + "params": [ + { + "name": "ranges", + "typeRef": "unknown", + "optional": false + }, + { + "name": "fallbackStartDate", + "typeRef": "string", + "optional": false + }, + { + "name": "fallbackEndDate", + "optional": true, + "defaultValue": "fallbackStartDate" + } + ], + "returnType": "NodeTimeRange[]", + "loc": 30 + }, + { + "id": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "kind": "function", + "name": "getNodeTimeBounds", + "qualifiedName": "getNodeTimeBounds", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 81, + "endLine": 88, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "getNodeTimeBounds(node: Pick)", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "kind": "function", + "name": "nodeTimeRangesToJson", + "qualifiedName": "nodeTimeRangesToJson", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 90, + "endLine": 94, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "nodeTimeRangesToJson(node: Pick): Prisma.InputJsonValue", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "returnType": "Prisma.InputJsonValue", + "loc": 5 + }, + { + "id": "func:src/server/taskRepository.ts#existingTagNames@96", + "kind": "function", + "name": "existingTagNames", + "qualifiedName": "existingTagNames", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 96, + "endLine": 109, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "existingTagNames(values: string[]): Promise", + "params": [ + { + "name": "values", + "typeRef": "string[]", + "optional": true, + "defaultValue": "[]" + } + ], + "returnType": "Promise", + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#existingTagNames@96:db:out:read:tagDefinition", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "tagDefinition", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#findTaskRecord@111", + "kind": "function", + "name": "findTaskRecord", + "qualifiedName": "findTaskRecord", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 111, + "endLine": 116, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "findTaskRecord(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 6, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#findTaskRecord@111:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "kind": "function", + "name": "toWorkflowNode", + "qualifiedName": "toWorkflowNode", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 118, + "endLine": 140, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "toWorkflowNode(node: NonNullable[\"nodes\"][number]): WorkflowNode", + "params": [ + { + "name": "node", + "typeRef": "NonNullable[\"nodes\"][number]", + "optional": false + } + ], + "returnType": "WorkflowNode", + "loc": 23 + }, + { + "id": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "kind": "function", + "name": "normalizeTaskCompletionStatus", + "qualifiedName": "normalizeTaskCompletionStatus", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 142, + "endLine": 146, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeTaskCompletionStatus(value: string): \"incomplete\" | \"confirmed_completed\" | undefined", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": true + } + ], + "returnType": "\"incomplete\" | \"confirmed_completed\" | undefined", + "loc": 5 + }, + { + "id": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "kind": "function", + "name": "normalizeTaskPriority", + "qualifiedName": "normalizeTaskPriority", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 148, + "endLine": 151, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeTaskPriority(value: string): TaskPriority | undefined", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": true + } + ], + "returnType": "TaskPriority | undefined", + "loc": 4 + }, + { + "id": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "kind": "function", + "name": "resolveTaskCompletionStatus", + "qualifiedName": "resolveTaskCompletionStatus", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 153, + "endLine": 161, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "resolveTaskCompletionStatus(task: NonNullable): TaskCompletionStatus", + "params": [ + { + "name": "task", + "typeRef": "NonNullable", + "optional": false + } + ], + "returnType": "TaskCompletionStatus", + "loc": 9 + }, + { + "id": "func:src/server/taskRepository.ts#toTask@163", + "kind": "function", + "name": "toTask", + "qualifiedName": "toTask", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 163, + "endLine": 180, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "toTask(task: NonNullable): Task", + "params": [ + { + "name": "task", + "typeRef": "NonNullable", + "optional": false + } + ], + "returnType": "Task", + "loc": 18 + }, + { + "id": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "function", + "name": "getTaskOrThrow", + "qualifiedName": "getTaskOrThrow", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 182, + "endLine": 188, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "getTaskOrThrow(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 7 + }, + { + "id": "func:src/server/taskRepository.ts#getTask@190", + "kind": "function", + "name": "getTask", + "qualifiedName": "getTask", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 190, + "endLine": 192, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "getTask(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 3 + }, + { + "id": "func:src/server/taskRepository.ts#listTasks@194", + "kind": "function", + "name": "listTasks", + "qualifiedName": "listTasks", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 194, + "endLine": 205, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "listTasks(): Promise", + "params": [], + "returnType": "Promise", + "loc": 12, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#listTasks@194:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "kind": "function", + "name": "getNextTaskSortOrder", + "qualifiedName": "getNextTaskSortOrder", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 207, + "endLine": 215, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "getNextTaskSortOrder(isPinned)", + "params": [ + { + "name": "isPinned", + "optional": true, + "defaultValue": "false" + } + ], + "loc": 9, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#getNextTaskSortOrder@207:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "kind": "function", + "name": "getFirstTaskSortOrder", + "qualifiedName": "getFirstTaskSortOrder", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 217, + "endLine": 225, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "getFirstTaskSortOrder(isPinned)", + "params": [ + { + "name": "isPinned", + "optional": true, + "defaultValue": "false" + } + ], + "loc": 9, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#getFirstTaskSortOrder@217:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#createTask@227", + "kind": "function", + "name": "createTask", + "qualifiedName": "createTask", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 227, + "endLine": 300, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "createTask(input: {\n name?: string;\n weeklyPlanId?: string;\n description?: string;\n tags?: string[];\n priority?: TaskPriority;\n responsibles?: string[];\n dingtalkDocUrl?: string;\n projectBlackboard?: string;\n dingtalkWebhook?: string;\n completionStatus?: TaskCompletionStatus;\n nodes?: WorkflowNode[];\n}): Promise", + "params": [ + { + "name": "input", + "typeRef": "{\n name?: string;\n weeklyPlanId?: string;\n description?: string;\n tags?: string[];\n priority?: TaskPriority;\n responsibles?: string[];\n dingtalkDocUrl?: string;\n projectBlackboard?: string;\n dingtalkWebhook?: string;\n completionStatus?: TaskCompletionStatus;\n nodes?: WorkflowNode[];\n}", + "optional": false + } + ], + "returnType": "Promise", + "loc": 74, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#createTask@227:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "kind": "function", + "name": "$transaction() 回调@273", + "qualifiedName": "$transaction() 回调@273", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 273, + "endLine": 297, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@273(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 25 + }, + { + "id": "func:src/server/taskRepository.ts#updateTask@302", + "kind": "function", + "name": "updateTask", + "qualifiedName": "updateTask", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 302, + "endLine": 351, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "updateTask(id: string, input: Partial>): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "Partial>", + "optional": false + } + ], + "returnType": "Promise", + "loc": 50, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#updateTask@302:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/taskRepository.ts#updateTask@302:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "kind": "function", + "name": "$transaction() 回调@313", + "qualifiedName": "$transaction() 回调@313", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 313, + "endLine": 348, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@313(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 36 + }, + { + "id": "func:src/server/taskRepository.ts#updateTaskListState@353", + "kind": "function", + "name": "updateTaskListState", + "qualifiedName": "updateTaskListState", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 353, + "endLine": 381, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "updateTaskListState(id: string, input: { isPinned?: boolean; sortOrder?: number }): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "{ isPinned?: boolean; sortOrder?: number }", + "optional": false + } + ], + "returnType": "Promise", + "loc": 29, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#updateTaskListState@353:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/taskRepository.ts#updateTaskListState@353:db:out:update:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "update", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#deleteTask@383", + "kind": "function", + "name": "deleteTask", + "qualifiedName": "deleteTask", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 383, + "endLine": 387, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteTask(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 5, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#deleteTask@383:db:out:delete:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#createWorkflowNode@389", + "kind": "function", + "name": "createWorkflowNode", + "qualifiedName": "createWorkflowNode", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 389, + "endLine": 421, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "createWorkflowNode(taskId: string, input: WorkflowNode): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "Promise", + "loc": 33, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#createWorkflowNode@389:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "kind": "function", + "name": "$transaction() 回调@392", + "qualifiedName": "$transaction() 回调@392", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 392, + "endLine": 418, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@392(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "kind": "function", + "name": "updateWorkflowNode", + "qualifiedName": "updateWorkflowNode", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 423, + "endLine": 470, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "updateWorkflowNode(taskId: string, nodeId: string, input: Partial): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodeId", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "Partial", + "optional": false + } + ], + "returnType": "Promise", + "loc": 48, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#updateWorkflowNode@423:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "kind": "function", + "name": "$transaction() 回调@430", + "qualifiedName": "$transaction() 回调@430", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 430, + "endLine": 467, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@430(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 38 + }, + { + "id": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "kind": "function", + "name": "deleteWorkflowNode", + "qualifiedName": "deleteWorkflowNode", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 472, + "endLine": 492, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteWorkflowNode(taskId: string, nodeId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodeId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 21, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#deleteWorkflowNode@472:db:out:read:workflowNode", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "workflowNode", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/taskRepository.ts#deleteWorkflowNode@472:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@480@480", + "kind": "function", + "name": "$transaction() 回调@480", + "qualifiedName": "$transaction() 回调@480", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 480, + "endLine": 489, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@480(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/server/taskRepository.ts#createNodeDependency@494", + "kind": "function", + "name": "createNodeDependency", + "qualifiedName": "createNodeDependency", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 494, + "endLine": 533, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "createNodeDependency(taskId: string, parentNodeId: string, childNodeId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "parentNodeId", + "typeRef": "string", + "optional": false + }, + { + "name": "childNodeId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 40, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#createNodeDependency@494:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@510@510", + "kind": "function", + "name": "$transaction() 回调@510", + "qualifiedName": "$transaction() 回调@510", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 510, + "endLine": 530, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@510(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 21 + }, + { + "id": "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "kind": "function", + "name": "deleteNodeDependency", + "qualifiedName": "deleteNodeDependency", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 535, + "endLine": 558, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteNodeDependency(taskId: string, parentNodeId: string, childNodeId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "parentNodeId", + "typeRef": "string", + "optional": false + }, + { + "name": "childNodeId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 24, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#deleteNodeDependency@535:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@542@542", + "kind": "function", + "name": "$transaction() 回调@542", + "qualifiedName": "$transaction() 回调@542", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 542, + "endLine": 555, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@542(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 14 + }, + { + "id": "func:src/server/taskRepository.ts#ensureTaskExists@560", + "kind": "function", + "name": "ensureTaskExists", + "qualifiedName": "ensureTaskExists", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 560, + "endLine": 565, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "ensureTaskExists(taskId: string)", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + } + ], + "loc": 6, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#ensureTaskExists@560:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "kind": "function", + "name": "ensureWorkflowNodeExists", + "qualifiedName": "ensureWorkflowNodeExists", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 567, + "endLine": 575, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "ensureWorkflowNodeExists(taskId: string, nodeId: string)", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodeId", + "typeRef": "string", + "optional": false + } + ], + "loc": 9, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567:db:out:read:workflowNode", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "workflowNode", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#hasDependencyPath@577", + "kind": "function", + "name": "hasDependencyPath", + "qualifiedName": "hasDependencyPath", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 577, + "endLine": 603, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "hasDependencyPath(taskId: string, fromNodeId: string, toNodeId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "fromNodeId", + "typeRef": "string", + "optional": false + }, + { + "name": "toNodeId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 27, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#hasDependencyPath@577:db:out:read:nodeDependency", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "nodeDependency", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "kind": "function", + "name": "replaceTaskNodes", + "qualifiedName": "replaceTaskNodes", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 605, + "endLine": 669, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "replaceTaskNodes(tx: Parameters[0]>[0], taskId: string, nodes: WorkflowNode[])", + "params": [ + { + "name": "tx", + "typeRef": "Parameters[0]>[0]", + "optional": false + }, + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodes", + "typeRef": "WorkflowNode[]", + "optional": false + } + ], + "loc": 65 + }, + { + "id": "func:src/server/taskRepository.ts#map() 回调@618@618", + "kind": "function", + "name": "map() 回调@618", + "qualifiedName": "map() 回调@618", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 618, + "endLine": 634, + "startCol": 21, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "map() 回调@618(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/server/notificationRepository.ts#toNotificationLog@17", + "kind": "function", + "name": "toNotificationLog", + "qualifiedName": "toNotificationLog", + "location": { + "file": "src/server/notificationRepository.ts", + "startLine": 17, + "endLine": 35, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/notificationRepository.ts", + "moduleId": "module:src/server", + "signature": "toNotificationLog(log: Awaited>): NotificationLog", + "params": [ + { + "name": "log", + "typeRef": "Awaited>", + "optional": false + } + ], + "returnType": "NotificationLog", + "loc": 19 + }, + { + "id": "func:src/server/notificationRepository.ts#createNotificationLog@37", + "kind": "function", + "name": "createNotificationLog", + "qualifiedName": "createNotificationLog", + "location": { + "file": "src/server/notificationRepository.ts", + "startLine": 37, + "endLine": 45, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/notificationRepository.ts", + "moduleId": "module:src/server", + "signature": "createNotificationLog(input: CreateNotificationLogInput): Promise", + "params": [ + { + "name": "input", + "typeRef": "CreateNotificationLogInput", + "optional": false + } + ], + "returnType": "Promise", + "loc": 9, + "interactions": [ + { + "id": "ix:func:src/server/notificationRepository.ts#createNotificationLog@37:db:out:create:notificationLog", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "notificationLog", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/notificationRepository.ts#listNotificationLogs@47", + "kind": "function", + "name": "listNotificationLogs", + "qualifiedName": "listNotificationLogs", + "location": { + "file": "src/server/notificationRepository.ts", + "startLine": 47, + "endLine": 54, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/notificationRepository.ts", + "moduleId": "module:src/server", + "signature": "listNotificationLogs(limit): Promise", + "params": [ + { + "name": "limit", + "optional": true, + "defaultValue": "50" + } + ], + "returnType": "Promise", + "loc": 8, + "interactions": [ + { + "id": "ix:func:src/server/notificationRepository.ts#listNotificationLogs@47:db:out:read:notificationLog", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "notificationLog", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "kind": "function", + "name": "clearNotificationLogs", + "qualifiedName": "clearNotificationLogs", + "location": { + "file": "src/server/notificationRepository.ts", + "startLine": 56, + "endLine": 58, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/notificationRepository.ts", + "moduleId": "module:src/server", + "signature": "clearNotificationLogs(): Promise", + "params": [], + "returnType": "Promise", + "loc": 3, + "interactions": [ + { + "id": "ix:func:src/server/notificationRepository.ts#clearNotificationLogs@56:db:out:delete:notificationLog", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "notificationLog", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "kind": "function", + "name": "uniqueValues", + "qualifiedName": "uniqueValues", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 13, + "endLine": 15, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "uniqueValues(values: string[]): string[]", + "params": [ + { + "name": "values", + "typeRef": "string[]", + "optional": true, + "defaultValue": "[]" + } + ], + "returnType": "string[]", + "loc": 3 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "kind": "function", + "name": "normalizeNodeProgress", + "qualifiedName": "normalizeNodeProgress", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 17, + "endLine": 21, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeNodeProgress(value: unknown): number", + "params": [ + { + "name": "value", + "typeRef": "unknown", + "optional": false + } + ], + "returnType": "number", + "loc": 5 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "kind": "function", + "name": "normalizeNodeTimeRanges", + "qualifiedName": "normalizeNodeTimeRanges", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 23, + "endLine": 52, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeNodeTimeRanges(ranges: unknown, fallbackStartDate: string, fallbackEndDate): NodeTimeRange[]", + "params": [ + { + "name": "ranges", + "typeRef": "unknown", + "optional": false + }, + { + "name": "fallbackStartDate", + "typeRef": "string", + "optional": false + }, + { + "name": "fallbackEndDate", + "optional": true, + "defaultValue": "fallbackStartDate" + } + ], + "returnType": "NodeTimeRange[]", + "loc": 30 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "kind": "function", + "name": "normalizeTemplateNodes", + "qualifiedName": "normalizeTemplateNodes", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 54, + "endLine": 94, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeTemplateNodes(nodes: unknown): WorkflowNode[]", + "params": [ + { + "name": "nodes", + "typeRef": "unknown", + "optional": false + } + ], + "returnType": "WorkflowNode[]", + "loc": 41 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "kind": "function", + "name": "map() 回调@58", + "qualifiedName": "map() 回调@58", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 58, + "endLine": 86, + "startCol": 10, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "map() 回调@58(node, index)", + "params": [ + { + "name": "node", + "optional": false + }, + { + "name": "index", + "optional": false + } + ], + "loc": 29 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "kind": "function", + "name": "toProjectTemplate", + "qualifiedName": "toProjectTemplate", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 96, + "endLine": 104, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "toProjectTemplate(template: ProjectTemplateRecord): ProjectTemplate", + "params": [ + { + "name": "template", + "typeRef": "ProjectTemplateRecord", + "optional": false + } + ], + "returnType": "ProjectTemplate", + "loc": 9 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "kind": "function", + "name": "toTemplateNodesJson", + "qualifiedName": "toTemplateNodesJson", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 106, + "endLine": 108, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "toTemplateNodesJson(nodes: unknown): Prisma.InputJsonValue", + "params": [ + { + "name": "nodes", + "typeRef": "unknown", + "optional": false + } + ], + "returnType": "Prisma.InputJsonValue", + "loc": 3 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "kind": "function", + "name": "listProjectTemplates", + "qualifiedName": "listProjectTemplates", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 110, + "endLine": 116, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "listProjectTemplates(): Promise", + "params": [], + "returnType": "Promise", + "loc": 7, + "interactions": [ + { + "id": "ix:func:src/server/projectTemplateRepository.ts#listProjectTemplates@110:db:out:read:projectTemplate", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "projectTemplate", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "kind": "function", + "name": "createProjectTemplate", + "qualifiedName": "createProjectTemplate", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 118, + "endLine": 134, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "createProjectTemplate(input: Partial): Promise", + "params": [ + { + "name": "input", + "typeRef": "Partial", + "optional": false + } + ], + "returnType": "Promise", + "loc": 17, + "interactions": [ + { + "id": "ix:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118:db:out:create:projectTemplate", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "projectTemplate", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "kind": "function", + "name": "updateProjectTemplate", + "qualifiedName": "updateProjectTemplate", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 136, + "endLine": 156, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "updateProjectTemplate(id: string, input: Partial): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "Partial", + "optional": false + } + ], + "returnType": "Promise", + "loc": 21, + "interactions": [ + { + "id": "ix:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136:db:out:read:projectTemplate", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "projectTemplate", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136:db:out:update:projectTemplate", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "update", + "target": "projectTemplate", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "kind": "function", + "name": "deleteProjectTemplate", + "qualifiedName": "deleteProjectTemplate", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 158, + "endLine": 162, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteProjectTemplate(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 5, + "interactions": [ + { + "id": "ix:func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158:db:out:delete:projectTemplate", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "projectTemplate", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/tagRepository.ts#toTagDefinition@4", + "kind": "function", + "name": "toTagDefinition", + "qualifiedName": "toTagDefinition", + "location": { + "file": "src/server/tagRepository.ts", + "startLine": 4, + "endLine": 9, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/tagRepository.ts", + "moduleId": "module:src/server", + "signature": "toTagDefinition(tag: { id: string; name: string }): TagDefinition", + "params": [ + { + "name": "tag", + "typeRef": "{ id: string; name: string }", + "optional": false + } + ], + "returnType": "TagDefinition", + "loc": 6 + }, + { + "id": "func:src/server/tagRepository.ts#listTagDefinitions@11", + "kind": "function", + "name": "listTagDefinitions", + "qualifiedName": "listTagDefinitions", + "location": { + "file": "src/server/tagRepository.ts", + "startLine": 11, + "endLine": 17, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/tagRepository.ts", + "moduleId": "module:src/server", + "signature": "listTagDefinitions(): Promise", + "params": [], + "returnType": "Promise", + "loc": 7, + "interactions": [ + { + "id": "ix:func:src/server/tagRepository.ts#listTagDefinitions@11:db:out:read:tagDefinition", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "tagDefinition", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/tagRepository.ts#createTagDefinition@19", + "kind": "function", + "name": "createTagDefinition", + "qualifiedName": "createTagDefinition", + "location": { + "file": "src/server/tagRepository.ts", + "startLine": 19, + "endLine": 32, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/tagRepository.ts", + "moduleId": "module:src/server", + "signature": "createTagDefinition(input: { name?: string }): Promise", + "params": [ + { + "name": "input", + "typeRef": "{ name?: string }", + "optional": false + } + ], + "returnType": "Promise", + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/server/tagRepository.ts#createTagDefinition@19:db:out:create:tagDefinition", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "tagDefinition", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/tagRepository.ts#deleteTagDefinition@34", + "kind": "function", + "name": "deleteTagDefinition", + "qualifiedName": "deleteTagDefinition", + "location": { + "file": "src/server/tagRepository.ts", + "startLine": 34, + "endLine": 48, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/tagRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteTagDefinition(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 15, + "interactions": [ + { + "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:read:tagDefinition", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "tagDefinition", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:delete:taskTag", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "taskTag", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:delete:tagDefinition", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "tagDefinition", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#toPerson@4", + "kind": "function", + "name": "toPerson", + "qualifiedName": "toPerson", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 4, + "endLine": 26, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "toPerson(person: {\n id: string;\n name: string;\n department: string;\n role: string;\n ssoUserId: string;\n dingUserId: string;\n email: string;\n phone: string;\n isAdmin: boolean;\n}): Person", + "params": [ + { + "name": "person", + "typeRef": "{\n id: string;\n name: string;\n department: string;\n role: string;\n ssoUserId: string;\n dingUserId: string;\n email: string;\n phone: string;\n isAdmin: boolean;\n}", + "optional": false + } + ], + "returnType": "Person", + "loc": 23 + }, + { + "id": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "kind": "function", + "name": "ensurePeopleFromExistingResponsibles", + "qualifiedName": "ensurePeopleFromExistingResponsibles", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 28, + "endLine": 51, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "ensurePeopleFromExistingResponsibles()", + "params": [], + "loc": 24, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:read:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "person", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:read:taskResponsible", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "taskResponsible", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:read:nodeResponsible", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "nodeResponsible", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:create:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#listPeople@53", + "kind": "function", + "name": "listPeople", + "qualifiedName": "listPeople", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 53, + "endLine": 62, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "listPeople(): Promise", + "params": [], + "returnType": "Promise", + "loc": 10, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#listPeople@53:db:out:read:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#getPersonOrThrow@64", + "kind": "function", + "name": "getPersonOrThrow", + "qualifiedName": "getPersonOrThrow", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 64, + "endLine": 71, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "getPersonOrThrow(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 8, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#getPersonOrThrow@64:db:out:read:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#createPerson@73", + "kind": "function", + "name": "createPerson", + "qualifiedName": "createPerson", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 73, + "endLine": 116, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "createPerson(input: {\n name?: string;\n department?: string;\n role?: string;\n ssoUserId?: string;\n dingUserId?: string;\n email?: string;\n phone?: string;\n isAdmin?: boolean;\n}): Promise", + "params": [ + { + "name": "input", + "typeRef": "{\n name?: string;\n department?: string;\n role?: string;\n ssoUserId?: string;\n dingUserId?: string;\n email?: string;\n phone?: string;\n isAdmin?: boolean;\n}", + "optional": false + } + ], + "returnType": "Promise", + "loc": 44, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#createPerson@73:db:out:create:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#ensurePeople@118", + "kind": "function", + "name": "ensurePeople", + "qualifiedName": "ensurePeople", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 118, + "endLine": 140, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "ensurePeople(inputs: Array<{ name: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }>): Promise", + "params": [ + { + "name": "inputs", + "typeRef": "Array<{ name: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }>", + "optional": false + } + ], + "returnType": "Promise", + "loc": 23, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#ensurePeople@118:db:out:create:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#updatePerson@142", + "kind": "function", + "name": "updatePerson", + "qualifiedName": "updatePerson", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 142, + "endLine": 175, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "updatePerson(id: string, input: { name?: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "{ name?: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }", + "optional": false + } + ], + "returnType": "Promise", + "loc": 34, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#updatePerson@142:db:out:update:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "update", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#deletePerson@177", + "kind": "function", + "name": "deletePerson", + "qualifiedName": "deletePerson", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 177, + "endLine": 181, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "deletePerson(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 5, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#deletePerson@177:db:out:delete:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/botQueryTools.ts#getTodayStr@10", + "kind": "function", + "name": "getTodayStr", + "qualifiedName": "getTodayStr", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 10, + "endLine": 19, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getTodayStr(timeZone): string", + "params": [ + { + "name": "timeZone", + "optional": true, + "defaultValue": "DEFAULT_TIME_ZONE" + } + ], + "returnType": "string", + "loc": 10 + }, + { + "id": "func:src/server/botQueryTools.ts#value@17", + "kind": "function", + "name": "value", + "qualifiedName": "value", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 17, + "endLine": 17, + "startCol": 9, + "endCol": 88 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "value(type: string)", + "params": [ + { + "name": "type", + "typeRef": "string", + "optional": false + } + ], + "loc": 1 + }, + { + "id": "func:src/server/botQueryTools.ts#nodeRanges@21", + "kind": "function", + "name": "nodeRanges", + "qualifiedName": "nodeRanges", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 21, + "endLine": 26, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "nodeRanges(node: WorkflowNode): { startDate: string; endDate: string }[]", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "{ startDate: string; endDate: string }[]", + "loc": 6 + }, + { + "id": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "kind": "function", + "name": "nodeStartDate", + "qualifiedName": "nodeStartDate", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 28, + "endLine": 32, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "nodeStartDate(node: WorkflowNode): string", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "string", + "loc": 5 + }, + { + "id": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "kind": "function", + "name": "nodeEndDate", + "qualifiedName": "nodeEndDate", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 34, + "endLine": 39, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "nodeEndDate(node: WorkflowNode): string", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "string", + "loc": 6 + }, + { + "id": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 41, + "endLine": 48, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getEffectiveNodeStatus(node: WorkflowNode, today: string): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + }, + { + "name": "today", + "typeRef": "string", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 8 + }, + { + "id": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "kind": "function", + "name": "taskDateSpan", + "qualifiedName": "taskDateSpan", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 51, + "endLine": 56, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "taskDateSpan(task: Task): { start: string | null; end: string | null }", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "returnType": "{ start: string | null; end: string | null }", + "loc": 6 + }, + { + "id": "func:src/server/botQueryTools.ts#overlapsRange@59", + "kind": "function", + "name": "overlapsRange", + "qualifiedName": "overlapsRange", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 59, + "endLine": 69, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "overlapsRange(start: string | null, end: string | null, from: string, to: string): boolean", + "params": [ + { + "name": "start", + "typeRef": "string | null", + "optional": false + }, + { + "name": "end", + "typeRef": "string | null", + "optional": false + }, + { + "name": "from", + "typeRef": "string", + "optional": false + }, + { + "name": "to", + "typeRef": "string", + "optional": false + } + ], + "returnType": "boolean", + "loc": 11 + }, + { + "id": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "kind": "function", + "name": "buildTaskLink", + "qualifiedName": "buildTaskLink", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 72, + "endLine": 82, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "buildTaskLink(taskId: string, nodeId: string): string", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodeId", + "typeRef": "string", + "optional": true + } + ], + "returnType": "string", + "loc": 11 + }, + { + "id": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "kind": "function", + "name": "isTaskRelatedToPerson", + "qualifiedName": "isTaskRelatedToPerson", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 98, + "endLine": 101, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "isTaskRelatedToPerson(task: Task, personName: string): boolean", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + }, + { + "name": "personName", + "typeRef": "string", + "optional": false + } + ], + "returnType": "boolean", + "loc": 4 + }, + { + "id": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "kind": "function", + "name": "isNodeOwnedByPerson", + "qualifiedName": "isNodeOwnedByPerson", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 103, + "endLine": 105, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "isNodeOwnedByPerson(node: WorkflowNode, personName: string): boolean", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + }, + { + "name": "personName", + "typeRef": "string", + "optional": false + } + ], + "returnType": "boolean", + "loc": 3 + }, + { + "id": "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "kind": "function", + "name": "createBotQueryContext", + "qualifiedName": "createBotQueryContext", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 116, + "endLine": 128, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "createBotQueryContext(person: Person): BotQueryContext", + "params": [ + { + "name": "person", + "typeRef": "Person", + "optional": false + } + ], + "returnType": "BotQueryContext", + "loc": 13 + }, + { + "id": "func:src/server/botQueryTools.ts#getTasks@124", + "kind": "function", + "name": "getTasks", + "qualifiedName": "getTasks", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 124, + "endLine": 124, + "startCol": 5, + "endCol": 49 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getTasks()", + "params": [], + "loc": 1 + }, + { + "id": "func:src/server/botQueryTools.ts#getPeople@125", + "kind": "function", + "name": "getPeople", + "qualifiedName": "getPeople", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 125, + "endLine": 125, + "startCol": 5, + "endCol": 52 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getPeople()", + "params": [], + "loc": 1 + }, + { + "id": "func:src/server/botQueryTools.ts#getWeeklyPlans@126", + "kind": "function", + "name": "getWeeklyPlans", + "qualifiedName": "getWeeklyPlans", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 126, + "endLine": 126, + "startCol": 5, + "endCol": 61 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getWeeklyPlans()", + "params": [], + "loc": 1 + }, + { + "id": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "kind": "function", + "name": "resolveTaskScope", + "qualifiedName": "resolveTaskScope", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 141, + "endLine": 170, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "resolveTaskScope(ctx: BotQueryContext, personName: string, allMembers: boolean): Promise", + "params": [ + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + }, + { + "name": "personName", + "typeRef": "string", + "optional": true + }, + { + "name": "allMembers", + "typeRef": "boolean", + "optional": true + } + ], + "returnType": "Promise", + "loc": 30 + }, + { + "id": "func:src/server/botQueryTools.ts#selfScope@149", + "kind": "function", + "name": "selfScope", + "qualifiedName": "selfScope", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 149, + "endLine": 153, + "startCol": 9, + "endCol": 5 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "selfScope(): TaskScope", + "params": [], + "returnType": "TaskScope", + "loc": 5 + }, + { + "id": "func:src/server/botQueryTools.ts#summarizeTask@172", + "kind": "function", + "name": "summarizeTask", + "qualifiedName": "summarizeTask", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 172, + "endLine": 196, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "summarizeTask(task: Task, planName: string, today: string)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + }, + { + "name": "planName", + "typeRef": "string", + "optional": false + }, + { + "name": "today", + "typeRef": "string", + "optional": false + } + ], + "loc": 25 + }, + { + "id": "func:src/server/botQueryTools.ts#planNameById@198", + "kind": "function", + "name": "planNameById", + "qualifiedName": "planNameById", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 198, + "endLine": 201, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "planNameById(ctx: BotQueryContext): Promise>", + "params": [ + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + } + ], + "returnType": "Promise>", + "loc": 4 + }, + { + "id": "func:src/server/botQueryTools.ts#resolveToolSchema@231", + "kind": "function", + "name": "resolveToolSchema", + "qualifiedName": "resolveToolSchema", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 231, + "endLine": 245, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "resolveToolSchema(tool: BotTool, isAdmin: boolean): { description: string; parameters: Record }", + "params": [ + { + "name": "tool", + "typeRef": "BotTool", + "optional": false + }, + { + "name": "isAdmin", + "typeRef": "boolean", + "optional": false + } + ], + "returnType": "{ description: string; parameters: Record }", + "loc": 15 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@253", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 253, + "endLine": 261, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(_args, ctx)", + "params": [ + { + "name": "_args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 9 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@297", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 297, + "endLine": 336, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(args, ctx)", + "params": [ + { + "name": "args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 40 + }, + { + "id": "func:src/server/botQueryTools.ts#filter() 回调@310@310", + "kind": "function", + "name": "filter() 回调@310", + "qualifiedName": "filter() 回调@310", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 310, + "endLine": 327, + "startCol": 39, + "endCol": 8 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "filter() 回调@310(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@349", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 349, + "endLine": 405, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(args, ctx)", + "params": [ + { + "name": "args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 57 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@430", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 430, + "endLine": 485, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(args, ctx)", + "params": [ + { + "name": "args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 56 + }, + { + "id": "func:src/server/botQueryTools.ts#addDays@440", + "kind": "function", + "name": "addDays", + "qualifiedName": "addDays", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 440, + "endLine": 444, + "startCol": 13, + "endCol": 8 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "addDays(base: string, delta: number)", + "params": [ + { + "name": "base", + "typeRef": "string", + "optional": false + }, + { + "name": "delta", + "typeRef": "number", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@500", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 500, + "endLine": 529, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(args, ctx)", + "params": [ + { + "name": "args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 30 + }, + { + "id": "func:src/server/botQueryTools.ts#filter() 回调@516@516", + "kind": "function", + "name": "filter() 回调@516", + "qualifiedName": "filter() 回调@516", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 516, + "endLine": 519, + "startCol": 17, + "endCol": 10 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "filter() 回调@516(plan)", + "params": [ + { + "name": "plan", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@542", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 542, + "endLine": 579, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(args, ctx)", + "params": [ + { + "name": "args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 38 + }, + { + "id": "func:src/server/botQueryTools.ts#getBotToolByName@583", + "kind": "function", + "name": "getBotToolByName", + "qualifiedName": "getBotToolByName", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 583, + "endLine": 585, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getBotToolByName(name: string): BotTool | undefined", + "params": [ + { + "name": "name", + "typeRef": "string", + "optional": false + } + ], + "returnType": "BotTool | undefined", + "loc": 3 + }, + { + "id": "func:src/server/aiChatService.ts#isAiConfigured@30", + "kind": "function", + "name": "isAiConfigured", + "qualifiedName": "isAiConfigured", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 30, + "endLine": 32, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "isAiConfigured(): boolean", + "params": [], + "returnType": "boolean", + "loc": 3 + }, + { + "id": "func:src/server/aiChatService.ts#getMemoryTurns@62", + "kind": "function", + "name": "getMemoryTurns", + "qualifiedName": "getMemoryTurns", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 62, + "endLine": 70, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "getMemoryTurns(sessionKey: string): ConversationTurn[]", + "params": [ + { + "name": "sessionKey", + "typeRef": "string", + "optional": false + } + ], + "returnType": "ConversationTurn[]", + "loc": 9 + }, + { + "id": "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "kind": "function", + "name": "appendMemoryTurn", + "qualifiedName": "appendMemoryTurn", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 72, + "endLine": 76, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "appendMemoryTurn(sessionKey: string, turn: ConversationTurn)", + "params": [ + { + "name": "sessionKey", + "typeRef": "string", + "optional": false + }, + { + "name": "turn", + "typeRef": "ConversationTurn", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/server/aiChatService.ts#clearBotMemory@79", + "kind": "function", + "name": "clearBotMemory", + "qualifiedName": "clearBotMemory", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 79, + "endLine": 81, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "clearBotMemory(sessionKey: string): void", + "params": [ + { + "name": "sessionKey", + "typeRef": "string", + "optional": false + } + ], + "returnType": "void", + "loc": 3 + }, + { + "id": "func:src/server/aiChatService.ts#setInterval() 回调@84@84", + "kind": "function", + "name": "setInterval() 回调@84", + "qualifiedName": "setInterval() 回调@84", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 84, + "endLine": 89, + "startCol": 13, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "setInterval() 回调@84()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/server/aiChatService.ts#buildToolSpecs@93", + "kind": "function", + "name": "buildToolSpecs", + "qualifiedName": "buildToolSpecs", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 93, + "endLine": 105, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "buildToolSpecs(ctx: BotQueryContext)", + "params": [ + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + } + ], + "loc": 13 + }, + { + "id": "func:src/server/aiChatService.ts#map() 回调@94@94", + "kind": "function", + "name": "map() 回调@94", + "qualifiedName": "map() 回调@94", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 94, + "endLine": 104, + "startCol": 24, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "map() 回调@94(tool)", + "params": [ + { + "name": "tool", + "optional": false + } + ], + "loc": 11 + }, + { + "id": "func:src/server/aiChatService.ts#buildSystemPrompt@107", + "kind": "function", + "name": "buildSystemPrompt", + "qualifiedName": "buildSystemPrompt", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 107, + "endLine": 122, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "buildSystemPrompt(ctx: BotQueryContext): string", + "params": [ + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + } + ], + "returnType": "string", + "loc": 16 + }, + { + "id": "func:src/server/aiChatService.ts#callChatCompletion@124", + "kind": "function", + "name": "callChatCompletion", + "qualifiedName": "callChatCompletion", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 124, + "endLine": 154, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "callChatCompletion(messages: ChatMessage[], tools: ReturnType): Promise", + "params": [ + { + "name": "messages", + "typeRef": "ChatMessage[]", + "optional": false + }, + { + "name": "tools", + "typeRef": "ReturnType", + "optional": false + } + ], + "returnType": "Promise", + "loc": 31, + "interactions": [ + { + "id": "ix:func:src/server/aiChatService.ts#callChatCompletion@124:api:out:POST:`${OPENAI_BASE_URL}/chat/completions`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "`${OPENAI_BASE_URL}/chat/completions`" + } + ] + }, + { + "id": "func:src/server/aiChatService.ts#executeToolCall@156", + "kind": "function", + "name": "executeToolCall", + "qualifiedName": "executeToolCall", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 156, + "endLine": 180, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "executeToolCall(name: string, argsJson: string, ctx: BotQueryContext): Promise", + "params": [ + { + "name": "name", + "typeRef": "string", + "optional": false + }, + { + "name": "argsJson", + "typeRef": "string", + "optional": false + }, + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + } + ], + "returnType": "Promise", + "loc": 25 + }, + { + "id": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "kind": "function", + "name": "answerBotQuestion", + "qualifiedName": "answerBotQuestion", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 185, + "endLine": 260, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "answerBotQuestion(question: string, ctx: BotQueryContext, sessionKey: string): Promise", + "params": [ + { + "name": "question", + "typeRef": "string", + "optional": false + }, + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + }, + { + "name": "sessionKey", + "typeRef": "string", + "optional": true + } + ], + "returnType": "Promise", + "loc": 76 + }, + { + "id": "func:server.ts#ensureManualLoginPeople@84", + "kind": "function", + "name": "ensureManualLoginPeople", + "qualifiedName": "ensureManualLoginPeople", + "location": { + "file": "server.ts", + "startLine": 84, + "endLine": 86, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "ensureManualLoginPeople()", + "params": [], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#GET /api/health@90", + "kind": "function", + "name": "GET /api/health", + "qualifiedName": "GET /api/health", + "location": { + "file": "server.ts", + "startLine": 90, + "endLine": 96, + "startCol": 24, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/health(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/health@90:api:in:GET:/api/health", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/health" + } + ] + }, + { + "id": "func:server.ts#readRemoteError@98", + "kind": "function", + "name": "readRemoteError", + "qualifiedName": "readRemoteError", + "location": { + "file": "server.ts", + "startLine": 98, + "endLine": 108, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "readRemoteError(response: Response, fallback: string)", + "params": [ + { + "name": "response", + "typeRef": "Response", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 11 + }, + { + "id": "func:server.ts#readRemoteJson@110", + "kind": "function", + "name": "readRemoteJson", + "qualifiedName": "readRemoteJson", + "location": { + "file": "server.ts", + "startLine": 110, + "endLine": 118, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "readRemoteJson(response: Response, fallback: string)", + "params": [ + { + "name": "response", + "typeRef": "Response", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 9 + }, + { + "id": "func:server.ts#ensureDingTalkRobotConfigured@122", + "kind": "function", + "name": "ensureDingTalkRobotConfigured", + "qualifiedName": "ensureDingTalkRobotConfigured", + "location": { + "file": "server.ts", + "startLine": 122, + "endLine": 126, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "ensureDingTalkRobotConfigured()", + "params": [], + "isEntry": true, + "loc": 5 + }, + { + "id": "func:server.ts#getDingTalkRobotAccessToken@128", + "kind": "function", + "name": "getDingTalkRobotAccessToken", + "qualifiedName": "getDingTalkRobotAccessToken", + "location": { + "file": "server.ts", + "startLine": 128, + "endLine": 160, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getDingTalkRobotAccessToken()", + "params": [], + "isEntry": true, + "loc": 33, + "interactions": [ + { + "id": "ix:func:server.ts#getDingTalkRobotAccessToken@128:api:out:POST:https://api.dingtalk.com/v1.0/oauth2/accessToken", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "https://api.dingtalk.com/v1.0/oauth2/accessToken", + "peer": "api.dingtalk.com" + } + ] + }, + { + "id": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "kind": "function", + "name": "sendDingTalkRobotMarkdownMessage", + "qualifiedName": "sendDingTalkRobotMarkdownMessage", + "location": { + "file": "server.ts", + "startLine": 162, + "endLine": 201, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "sendDingTalkRobotMarkdownMessage(input: {\n userIds: string[];\n title: string;\n text: string;\n})", + "params": [ + { + "name": "input", + "typeRef": "{\n userIds: string[];\n title: string;\n text: string;\n}", + "optional": false + } + ], + "isEntry": true, + "loc": 40, + "interactions": [ + { + "id": "ix:func:server.ts#sendDingTalkRobotMarkdownMessage@162:api:out:POST:https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend", + "peer": "api.dingtalk.com" + } + ] + }, + { + "id": "func:server.ts#replyToDingTalkSession@204", + "kind": "function", + "name": "replyToDingTalkSession", + "qualifiedName": "replyToDingTalkSession", + "location": { + "file": "server.ts", + "startLine": 204, + "endLine": 219, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "replyToDingTalkSession(sessionWebhook: string, content: string)", + "params": [ + { + "name": "sessionWebhook", + "typeRef": "string", + "optional": false + }, + { + "name": "content", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 16, + "interactions": [ + { + "id": "ix:func:server.ts#replyToDingTalkSession@204:api:out:POST:", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST" + } + ] + }, + { + "id": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "kind": "function", + "name": "replyToDingTalkSessionMarkdown", + "qualifiedName": "replyToDingTalkSessionMarkdown", + "location": { + "file": "server.ts", + "startLine": 222, + "endLine": 237, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "replyToDingTalkSessionMarkdown(sessionWebhook: string, title: string, text: string)", + "params": [ + { + "name": "sessionWebhook", + "typeRef": "string", + "optional": false + }, + { + "name": "title", + "typeRef": "string", + "optional": false + }, + { + "name": "text", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 16, + "interactions": [ + { + "id": "ix:func:server.ts#replyToDingTalkSessionMarkdown@222:api:out:POST:", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST" + } + ] + }, + { + "id": "func:server.ts#getTaskRelatedPersonNames@239", + "kind": "function", + "name": "getTaskRelatedPersonNames", + "qualifiedName": "getTaskRelatedPersonNames", + "location": { + "file": "server.ts", + "startLine": 239, + "endLine": 250, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getTaskRelatedPersonNames(task: Task)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "isEntry": true, + "loc": 12 + }, + { + "id": "func:server.ts#getWorkflowLink@252", + "kind": "function", + "name": "getWorkflowLink", + "qualifiedName": "getWorkflowLink", + "location": { + "file": "server.ts", + "startLine": 252, + "endLine": 259, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getWorkflowLink(params: { weeklyPlanId?: string; taskId?: string; nodeId?: string })", + "params": [ + { + "name": "params", + "typeRef": "{ weeklyPlanId?: string; taskId?: string; nodeId?: string }", + "optional": true, + "defaultValue": "{}" + } + ], + "isEntry": true, + "loc": 8 + }, + { + "id": "func:server.ts#getZonedDateParts@261", + "kind": "function", + "name": "getZonedDateParts", + "qualifiedName": "getZonedDateParts", + "location": { + "file": "server.ts", + "startLine": 261, + "endLine": 278, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getZonedDateParts(date, timeZone)", + "params": [ + { + "name": "date", + "optional": true, + "defaultValue": "new Date()" + }, + { + "name": "timeZone", + "optional": true, + "defaultValue": "DUE_REMINDER_TIME_ZONE" + } + ], + "isEntry": true, + "loc": 18 + }, + { + "id": "func:server.ts#value@271", + "kind": "function", + "name": "value", + "qualifiedName": "value", + "location": { + "file": "server.ts", + "startLine": 271, + "endLine": 271, + "startCol": 9, + "endCol": 88 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "value(type: string)", + "params": [ + { + "name": "type", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 1 + }, + { + "id": "func:server.ts#getPersonNamesForDueNodeReminder@280", + "kind": "function", + "name": "getPersonNamesForDueNodeReminder", + "qualifiedName": "getPersonNamesForDueNodeReminder", + "location": { + "file": "server.ts", + "startLine": 280, + "endLine": 288, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getPersonNamesForDueNodeReminder(node: Task[\"nodes\"][number])", + "params": [ + { + "name": "node", + "typeRef": "Task[\"nodes\"][number]", + "optional": false + } + ], + "isEntry": true, + "loc": 9 + }, + { + "id": "func:server.ts#getDueTimeRanges@290", + "kind": "function", + "name": "getDueTimeRanges", + "qualifiedName": "getDueTimeRanges", + "location": { + "file": "server.ts", + "startLine": 290, + "endLine": 296, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getDueTimeRanges(node: Task[\"nodes\"][number], date: string)", + "params": [ + { + "name": "node", + "typeRef": "Task[\"nodes\"][number]", + "optional": false + }, + { + "name": "date", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 7 + }, + { + "id": "func:server.ts#sendDailyDueNodeReminder@298", + "kind": "function", + "name": "sendDailyDueNodeReminder", + "qualifiedName": "sendDailyDueNodeReminder", + "location": { + "file": "server.ts", + "startLine": 298, + "endLine": 361, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "sendDailyDueNodeReminder()", + "params": [], + "isEntry": true, + "loc": 64 + }, + { + "id": "func:server.ts#notifyTaskConfirmedCompleted@363", + "kind": "function", + "name": "notifyTaskConfirmedCompleted", + "qualifiedName": "notifyTaskConfirmedCompleted", + "location": { + "file": "server.ts", + "startLine": 363, + "endLine": 415, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "notifyTaskConfirmedCompleted(task: Task, operatorName: string)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + }, + { + "name": "operatorName", + "typeRef": "string", + "optional": true + } + ], + "isEntry": true, + "loc": 53 + }, + { + "id": "func:server.ts#ensureSsoConfigured@417", + "kind": "function", + "name": "ensureSsoConfigured", + "qualifiedName": "ensureSsoConfigured", + "location": { + "file": "server.ts", + "startLine": 417, + "endLine": 421, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "ensureSsoConfigured()", + "params": [], + "isEntry": true, + "loc": 5 + }, + { + "id": "func:server.ts#getSsoRedirectUri@423", + "kind": "function", + "name": "getSsoRedirectUri", + "qualifiedName": "getSsoRedirectUri", + "location": { + "file": "server.ts", + "startLine": 423, + "endLine": 430, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getSsoRedirectUri()", + "params": [], + "isEntry": true, + "loc": 8 + }, + { + "id": "func:server.ts#getSsoAuthUrl@432", + "kind": "function", + "name": "getSsoAuthUrl", + "qualifiedName": "getSsoAuthUrl", + "location": { + "file": "server.ts", + "startLine": 432, + "endLine": 442, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getSsoAuthUrl(state: string)", + "params": [ + { + "name": "state", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 11 + }, + { + "id": "func:server.ts#getSsoUserAccessToken@444", + "kind": "function", + "name": "getSsoUserAccessToken", + "qualifiedName": "getSsoUserAccessToken", + "location": { + "file": "server.ts", + "startLine": 444, + "endLine": 469, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getSsoUserAccessToken(authCode: string)", + "params": [ + { + "name": "authCode", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 26, + "interactions": [ + { + "id": "ix:func:server.ts#getSsoUserAccessToken@444:api:out:POST:`${OIDC_HOST}/oauth/token`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "`${OIDC_HOST}/oauth/token`" + } + ] + }, + { + "id": "func:server.ts#getSsoCurrentUser@471", + "kind": "function", + "name": "getSsoCurrentUser", + "qualifiedName": "getSsoCurrentUser", + "location": { + "file": "server.ts", + "startLine": 471, + "endLine": 496, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getSsoCurrentUser(accessToken: string)", + "params": [ + { + "name": "accessToken", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 26, + "interactions": [ + { + "id": "ix:func:server.ts#getSsoCurrentUser@471:api:out:GET:`${OIDC_HOST}/oauth/userinfo`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "`${OIDC_HOST}/oauth/userinfo`" + } + ] + }, + { + "id": "func:server.ts#GET /api/auth/sso-config@498", + "kind": "function", + "name": "GET /api/auth/sso-config", + "qualifiedName": "GET /api/auth/sso-config", + "location": { + "file": "server.ts", + "startLine": 498, + "endLine": 506, + "startCol": 33, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/auth/sso-config(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/auth/sso-config@498:api:in:GET:/api/auth/sso-config", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/auth/sso-config" + } + ] + }, + { + "id": "func:server.ts#GET /api/auth/sso-login-url@508", + "kind": "function", + "name": "GET /api/auth/sso-login-url", + "qualifiedName": "GET /api/auth/sso-login-url", + "location": { + "file": "server.ts", + "startLine": 508, + "endLine": 518, + "startCol": 36, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/auth/sso-login-url(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 11, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/auth/sso-login-url@508:api:in:GET:/api/auth/sso-login-url", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/auth/sso-login-url" + } + ] + }, + { + "id": "func:server.ts#handleSsoCallback@520", + "kind": "function", + "name": "handleSsoCallback", + "qualifiedName": "handleSsoCallback", + "location": { + "file": "server.ts", + "startLine": 520, + "endLine": 554, + "startCol": 7, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "handleSsoCallback(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 35, + "interactions": [ + { + "id": "ix:func:server.ts#handleSsoCallback@520:api:in:GET:/api/dingtalk/oauth-callback", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/dingtalk/oauth-callback" + }, + { + "id": "ix:func:server.ts#handleSsoCallback@520:api:in:GET:/api/auth/sso-callback", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/auth/sso-callback" + } + ] + }, + { + "id": "func:server.ts#GET /api/auth/manual-users@559", + "kind": "function", + "name": "GET /api/auth/manual-users", + "qualifiedName": "GET /api/auth/manual-users", + "location": { + "file": "server.ts", + "startLine": 559, + "endLine": 561, + "startCol": 35, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/auth/manual-users(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 3, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/auth/manual-users@559:api:in:GET:/api/auth/manual-users", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/auth/manual-users" + } + ] + }, + { + "id": "func:server.ts#POST /api/auth/manual-login@563", + "kind": "function", + "name": "POST /api/auth/manual-login", + "qualifiedName": "POST /api/auth/manual-login", + "location": { + "file": "server.ts", + "startLine": 563, + "endLine": 573, + "startCol": 36, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/auth/manual-login(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 11, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/auth/manual-login@563:api:in:POST:/api/auth/manual-login", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/manual-login" + } + ] + }, + { + "id": "func:server.ts#POST /api/auth/dev-login@575", + "kind": "function", + "name": "POST /api/auth/dev-login", + "qualifiedName": "POST /api/auth/dev-login", + "location": { + "file": "server.ts", + "startLine": 575, + "endLine": 603, + "startCol": 33, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/auth/dev-login(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 29, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/auth/dev-login@575:api:in:POST:/api/auth/dev-login", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/dev-login" + } + ] + }, + { + "id": "func:server.ts#POST /api/auth/sso-login@605", + "kind": "function", + "name": "POST /api/auth/sso-login", + "qualifiedName": "POST /api/auth/sso-login", + "location": { + "file": "server.ts", + "startLine": 605, + "endLine": 640, + "startCol": 33, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/auth/sso-login(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 36, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/auth/sso-login@605:api:in:POST:/api/auth/sso-login", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/sso-login" + } + ] + }, + { + "id": "func:server.ts#POST /api/auth/sso-join-person@642", + "kind": "function", + "name": "POST /api/auth/sso-join-person", + "qualifiedName": "POST /api/auth/sso-join-person", + "location": { + "file": "server.ts", + "startLine": 642, + "endLine": 667, + "startCol": 39, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/auth/sso-join-person(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 26, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/auth/sso-join-person@642:api:in:POST:/api/auth/sso-join-person", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/sso-join-person" + } + ] + }, + { + "id": "func:server.ts#GET /api/people@669", + "kind": "function", + "name": "GET /api/people", + "qualifiedName": "GET /api/people", + "location": { + "file": "server.ts", + "startLine": 669, + "endLine": 676, + "startCol": 24, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/people(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/people@669:api:in:GET:/api/people", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/people" + } + ] + }, + { + "id": "func:server.ts#POST /api/people@678", + "kind": "function", + "name": "POST /api/people", + "qualifiedName": "POST /api/people", + "location": { + "file": "server.ts", + "startLine": 678, + "endLine": 685, + "startCol": 25, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/people(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/people@678:api:in:POST:/api/people", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/people" + } + ] + }, + { + "id": "func:server.ts#PUT /api/people/:id@687", + "kind": "function", + "name": "PUT /api/people/:id", + "qualifiedName": "PUT /api/people/:id", + "location": { + "file": "server.ts", + "startLine": 687, + "endLine": 694, + "startCol": 28, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "PUT /api/people/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#PUT /api/people/:id@687:api:in:PUT:/api/people/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "/api/people/:id" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/people/:id@696", + "kind": "function", + "name": "DELETE /api/people/:id", + "qualifiedName": "DELETE /api/people/:id", + "location": { + "file": "server.ts", + "startLine": 696, + "endLine": 703, + "startCol": 31, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/people/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/people/:id@696:api:in:DELETE:/api/people/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/people/:id" + } + ] + }, + { + "id": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "kind": "function", + "name": "POST /api/dingtalk/robot/send-message", + "qualifiedName": "POST /api/dingtalk/robot/send-message", + "location": { + "file": "server.ts", + "startLine": 705, + "endLine": 735, + "startCol": 46, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/dingtalk/robot/send-message(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 31, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/dingtalk/robot/send-message@705:api:in:POST:/api/dingtalk/robot/send-message", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/dingtalk/robot/send-message" + } + ] + }, + { + "id": "func:server.ts#GET /api/tags@737", + "kind": "function", + "name": "GET /api/tags", + "qualifiedName": "GET /api/tags", + "location": { + "file": "server.ts", + "startLine": 737, + "endLine": 743, + "startCol": 22, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/tags(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/tags@737:api:in:GET:/api/tags", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/tags" + } + ] + }, + { + "id": "func:server.ts#POST /api/tags@745", + "kind": "function", + "name": "POST /api/tags", + "qualifiedName": "POST /api/tags", + "location": { + "file": "server.ts", + "startLine": 745, + "endLine": 752, + "startCol": 23, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/tags(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/tags@745:api:in:POST:/api/tags", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tags" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/tags/:id@754", + "kind": "function", + "name": "DELETE /api/tags/:id", + "qualifiedName": "DELETE /api/tags/:id", + "location": { + "file": "server.ts", + "startLine": 754, + "endLine": 762, + "startCol": 29, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/tags/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/tags/:id@754:api:in:DELETE:/api/tags/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/tags/:id" + } + ] + }, + { + "id": "func:server.ts#GET /api/weekly-plans@764", + "kind": "function", + "name": "GET /api/weekly-plans", + "qualifiedName": "GET /api/weekly-plans", + "location": { + "file": "server.ts", + "startLine": 764, + "endLine": 770, + "startCol": 30, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/weekly-plans(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/weekly-plans@764:api:in:GET:/api/weekly-plans", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/weekly-plans" + } + ] + }, + { + "id": "func:server.ts#POST /api/weekly-plans@772", + "kind": "function", + "name": "POST /api/weekly-plans", + "qualifiedName": "POST /api/weekly-plans", + "location": { + "file": "server.ts", + "startLine": 772, + "endLine": 779, + "startCol": 31, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/weekly-plans(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/weekly-plans@772:api:in:POST:/api/weekly-plans", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/weekly-plans" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/weekly-plans/:id@781", + "kind": "function", + "name": "DELETE /api/weekly-plans/:id", + "qualifiedName": "DELETE /api/weekly-plans/:id", + "location": { + "file": "server.ts", + "startLine": 781, + "endLine": 789, + "startCol": 37, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/weekly-plans/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/weekly-plans/:id@781:api:in:DELETE:/api/weekly-plans/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/weekly-plans/:id" + } + ] + }, + { + "id": "func:server.ts#GET /api/project-templates@791", + "kind": "function", + "name": "GET /api/project-templates", + "qualifiedName": "GET /api/project-templates", + "location": { + "file": "server.ts", + "startLine": 791, + "endLine": 797, + "startCol": 35, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/project-templates(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/project-templates@791:api:in:GET:/api/project-templates", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/project-templates" + } + ] + }, + { + "id": "func:server.ts#POST /api/project-templates@799", + "kind": "function", + "name": "POST /api/project-templates", + "qualifiedName": "POST /api/project-templates", + "location": { + "file": "server.ts", + "startLine": 799, + "endLine": 806, + "startCol": 36, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/project-templates(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/project-templates@799:api:in:POST:/api/project-templates", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/project-templates" + } + ] + }, + { + "id": "func:server.ts#PUT /api/project-templates/:id@808", + "kind": "function", + "name": "PUT /api/project-templates/:id", + "qualifiedName": "PUT /api/project-templates/:id", + "location": { + "file": "server.ts", + "startLine": 808, + "endLine": 815, + "startCol": 39, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "PUT /api/project-templates/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#PUT /api/project-templates/:id@808:api:in:PUT:/api/project-templates/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "/api/project-templates/:id" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/project-templates/:id@817", + "kind": "function", + "name": "DELETE /api/project-templates/:id", + "qualifiedName": "DELETE /api/project-templates/:id", + "location": { + "file": "server.ts", + "startLine": 817, + "endLine": 824, + "startCol": 42, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/project-templates/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/project-templates/:id@817:api:in:DELETE:/api/project-templates/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/project-templates/:id" + } + ] + }, + { + "id": "func:server.ts#GET /api/tasks@826", + "kind": "function", + "name": "GET /api/tasks", + "qualifiedName": "GET /api/tasks", + "location": { + "file": "server.ts", + "startLine": 826, + "endLine": 832, + "startCol": 23, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/tasks(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/tasks@826:api:in:GET:/api/tasks", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/tasks" + } + ] + }, + { + "id": "func:server.ts#GET /api/tasks/:id@834", + "kind": "function", + "name": "GET /api/tasks/:id", + "qualifiedName": "GET /api/tasks/:id", + "location": { + "file": "server.ts", + "startLine": 834, + "endLine": 841, + "startCol": 27, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/tasks/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/tasks/:id@834:api:in:GET:/api/tasks/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/tasks/:id" + } + ] + }, + { + "id": "func:server.ts#POST /api/tasks@843", + "kind": "function", + "name": "POST /api/tasks", + "qualifiedName": "POST /api/tasks", + "location": { + "file": "server.ts", + "startLine": 843, + "endLine": 850, + "startCol": 24, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/tasks(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/tasks@843:api:in:POST:/api/tasks", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tasks" + } + ] + }, + { + "id": "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "kind": "function", + "name": "PATCH /api/tasks/:id/list-state", + "qualifiedName": "PATCH /api/tasks/:id/list-state", + "location": { + "file": "server.ts", + "startLine": 852, + "endLine": 863, + "startCol": 40, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "PATCH /api/tasks/:id/list-state(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 12, + "interactions": [ + { + "id": "ix:func:server.ts#PATCH /api/tasks/:id/list-state@852:api:in:PATCH:/api/tasks/:id/list-state", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "PATCH", + "path": "/api/tasks/:id/list-state" + } + ] + }, + { + "id": "func:server.ts#PUT /api/tasks/:id@865", + "kind": "function", + "name": "PUT /api/tasks/:id", + "qualifiedName": "PUT /api/tasks/:id", + "location": { + "file": "server.ts", + "startLine": 865, + "endLine": 884, + "startCol": 27, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "PUT /api/tasks/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 20, + "interactions": [ + { + "id": "ix:func:server.ts#PUT /api/tasks/:id@865:api:in:PUT:/api/tasks/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "/api/tasks/:id" + } + ] + }, + { + "id": "func:server.ts#catch() 回调@876@876", + "kind": "function", + "name": "catch() 回调@876", + "qualifiedName": "catch() 回调@876", + "location": { + "file": "server.ts", + "startLine": 876, + "endLine": 878, + "startCol": 65, + "endCol": 8 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "catch() 回调@876(err)", + "params": [ + { + "name": "err", + "optional": false + } + ], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#DELETE /api/tasks/:id@886", + "kind": "function", + "name": "DELETE /api/tasks/:id", + "qualifiedName": "DELETE /api/tasks/:id", + "location": { + "file": "server.ts", + "startLine": 886, + "endLine": 893, + "startCol": 30, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/tasks/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/tasks/:id@886:api:in:DELETE:/api/tasks/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/tasks/:id" + } + ] + }, + { + "id": "func:server.ts#POST /api/tasks/:id/nodes@895", + "kind": "function", + "name": "POST /api/tasks/:id/nodes", + "qualifiedName": "POST /api/tasks/:id/nodes", + "location": { + "file": "server.ts", + "startLine": 895, + "endLine": 903, + "startCol": 34, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/tasks/:id/nodes(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/tasks/:id/nodes@895:api:in:POST:/api/tasks/:id/nodes", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tasks/:id/nodes" + } + ] + }, + { + "id": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "kind": "function", + "name": "PATCH /api/tasks/:id/nodes/:nodeId", + "qualifiedName": "PATCH /api/tasks/:id/nodes/:nodeId", + "location": { + "file": "server.ts", + "startLine": 905, + "endLine": 913, + "startCol": 43, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "PATCH /api/tasks/:id/nodes/:nodeId(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:api:in:PATCH:/api/tasks/:id/nodes/:nodeId", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "PATCH", + "path": "/api/tasks/:id/nodes/:nodeId" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "kind": "function", + "name": "DELETE /api/tasks/:id/nodes/:nodeId", + "qualifiedName": "DELETE /api/tasks/:id/nodes/:nodeId", + "location": { + "file": "server.ts", + "startLine": 915, + "endLine": 923, + "startCol": 44, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/tasks/:id/nodes/:nodeId(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:api:in:DELETE:/api/tasks/:id/nodes/:nodeId", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/tasks/:id/nodes/:nodeId" + } + ] + }, + { + "id": "func:server.ts#POST /api/tasks/:id/dependencies@925", + "kind": "function", + "name": "POST /api/tasks/:id/dependencies", + "qualifiedName": "POST /api/tasks/:id/dependencies", + "location": { + "file": "server.ts", + "startLine": 925, + "endLine": 932, + "startCol": 41, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/tasks/:id/dependencies(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/tasks/:id/dependencies@925:api:in:POST:/api/tasks/:id/dependencies", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tasks/:id/dependencies" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "kind": "function", + "name": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId", + "qualifiedName": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId", + "location": { + "file": "server.ts", + "startLine": 934, + "endLine": 942, + "startCol": 70, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:api:in:DELETE:/api/tasks/:id/dependencies/:parentNodeId/:childNodeId", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/tasks/:id/dependencies/:parentNodeId/:childNodeId" + } + ] + }, + { + "id": "func:server.ts#POST /api/notify@944", + "kind": "function", + "name": "POST /api/notify", + "qualifiedName": "POST /api/notify", + "location": { + "file": "server.ts", + "startLine": 944, + "endLine": 1039, + "startCol": 25, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/notify(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 96, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/notify@944:api:in:POST:/api/notify", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/notify" + }, + { + "id": "ix:func:server.ts#POST /api/notify@944:api:out:POST:", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST" + } + ] + }, + { + "id": "func:server.ts#GET /api/logs@1041", + "kind": "function", + "name": "GET /api/logs", + "qualifiedName": "GET /api/logs", + "location": { + "file": "server.ts", + "startLine": 1041, + "endLine": 1047, + "startCol": 22, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/logs(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/logs@1041:api:in:GET:/api/logs", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/logs" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/logs@1049", + "kind": "function", + "name": "DELETE /api/logs", + "qualifiedName": "DELETE /api/logs", + "location": { + "file": "server.ts", + "startLine": 1049, + "endLine": 1056, + "startCol": 25, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/logs(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/logs@1049:api:in:DELETE:/api/logs", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/logs" + } + ] + }, + { + "id": "func:server.ts#normalizeActionType@1058", + "kind": "function", + "name": "normalizeActionType", + "qualifiedName": "normalizeActionType", + "location": { + "file": "server.ts", + "startLine": 1058, + "endLine": 1063, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "normalizeActionType(actionType: string): \"completed\" | \"delayed\" | \"test\"", + "params": [ + { + "name": "actionType", + "typeRef": "string", + "optional": false + } + ], + "returnType": "\"completed\" | \"delayed\" | \"test\"", + "isEntry": true, + "loc": 6 + }, + { + "id": "func:server.ts#getNotificationState@1065", + "kind": "function", + "name": "getNotificationState", + "qualifiedName": "getNotificationState", + "location": { + "file": "server.ts", + "startLine": 1065, + "endLine": 1084, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getNotificationState(actionType: \"completed\" | \"delayed\" | \"test\")", + "params": [ + { + "name": "actionType", + "typeRef": "\"completed\" | \"delayed\" | \"test\"", + "optional": false + } + ], + "isEntry": true, + "loc": 20 + }, + { + "id": "func:server.ts#startDailyDueNodeReminderScheduler@1089", + "kind": "function", + "name": "startDailyDueNodeReminderScheduler", + "qualifiedName": "startDailyDueNodeReminderScheduler", + "location": { + "file": "server.ts", + "startLine": 1089, + "endLine": 1111, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "startDailyDueNodeReminderScheduler()", + "params": [], + "isEntry": true, + "loc": 23 + }, + { + "id": "func:server.ts#checkAndRun@1090", + "kind": "function", + "name": "checkAndRun", + "qualifiedName": "checkAndRun", + "location": { + "file": "server.ts", + "startLine": 1090, + "endLine": 1104, + "startCol": 9, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "checkAndRun()", + "params": [], + "isEntry": true, + "loc": 15 + }, + { + "id": "func:server.ts#catch() 回调@1098@1098", + "kind": "function", + "name": "catch() 回调@1098", + "qualifiedName": "catch() 回调@1098", + "location": { + "file": "server.ts", + "startLine": 1098, + "endLine": 1100, + "startCol": 14, + "endCol": 8 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "catch() 回调@1098(err)", + "params": [ + { + "name": "err", + "optional": false + } + ], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#handleDingTalkRobotMessage@1114", + "kind": "function", + "name": "handleDingTalkRobotMessage", + "qualifiedName": "handleDingTalkRobotMessage", + "location": { + "file": "server.ts", + "startLine": 1114, + "endLine": 1197, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "handleDingTalkRobotMessage(rawData: string)", + "params": [ + { + "name": "rawData", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 84 + }, + { + "id": "func:server.ts#replyText@1147", + "kind": "function", + "name": "replyText", + "qualifiedName": "replyText", + "location": { + "file": "server.ts", + "startLine": 1147, + "endLine": 1150, + "startCol": 9, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "replyText(text: string)", + "params": [ + { + "name": "text", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 4 + }, + { + "id": "func:server.ts#startDingTalkRobotStream@1204", + "kind": "function", + "name": "startDingTalkRobotStream", + "qualifiedName": "startDingTalkRobotStream", + "location": { + "file": "server.ts", + "startLine": 1204, + "endLine": 1233, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "startDingTalkRobotStream()", + "params": [], + "isEntry": true, + "loc": 30 + }, + { + "id": "func:server.ts#registerCallbackListener() 回调@1215@1215", + "kind": "function", + "name": "registerCallbackListener() 回调@1215", + "qualifiedName": "registerCallbackListener() 回调@1215", + "location": { + "file": "server.ts", + "startLine": 1215, + "endLine": 1221, + "startCol": 48, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "registerCallbackListener() 回调@1215(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "isEntry": true, + "loc": 7 + }, + { + "id": "func:server.ts#catch() 回调@1218@1218", + "kind": "function", + "name": "catch() 回调@1218", + "qualifiedName": "catch() 回调@1218", + "location": { + "file": "server.ts", + "startLine": 1218, + "endLine": 1220, + "startCol": 50, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "catch() 回调@1218(err)", + "params": [ + { + "name": "err", + "optional": false + } + ], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#then() 回调@1225@1225", + "kind": "function", + "name": "then() 回调@1225", + "qualifiedName": "then() 回调@1225", + "location": { + "file": "server.ts", + "startLine": 1225, + "endLine": 1227, + "startCol": 11, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "then() 回调@1225()", + "params": [], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#catch() 回调@1228@1228", + "kind": "function", + "name": "catch() 回调@1228", + "qualifiedName": "catch() 回调@1228", + "location": { + "file": "server.ts", + "startLine": 1228, + "endLine": 1230, + "startCol": 12, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "catch() 回调@1228(err)", + "params": [ + { + "name": "err", + "optional": false + } + ], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#startServer@1235", + "kind": "function", + "name": "startServer", + "qualifiedName": "startServer", + "location": { + "file": "server.ts", + "startLine": 1235, + "endLine": 1255, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "startServer()", + "params": [], + "isEntry": true, + "loc": 21 + }, + { + "id": "func:server.ts#GET *@1245", + "kind": "function", + "name": "GET *", + "qualifiedName": "GET *", + "location": { + "file": "server.ts", + "startLine": 1245, + "endLine": 1247, + "startCol": 18, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET *(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 3, + "interactions": [ + { + "id": "ix:func:server.ts#GET *@1245:api:in:GET:*", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "*" + } + ] + }, + { + "id": "func:server.ts#listen() 回调@1250@1250", + "kind": "function", + "name": "listen() 回调@1250", + "qualifiedName": "listen() 回调@1250", + "location": { + "file": "server.ts", + "startLine": 1250, + "endLine": 1254, + "startCol": 26, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "listen() 回调@1250()", + "params": [], + "isEntry": true, + "loc": 5 + }, + { + "id": "func:server.ts#catch() 回调@1257@1257", + "kind": "function", + "name": "catch() 回调@1257", + "qualifiedName": "catch() 回调@1257", + "location": { + "file": "server.ts", + "startLine": 1257, + "endLine": 1260, + "startCol": 21, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "catch() 回调@1257(err)", + "params": [ + { + "name": "err", + "optional": false + } + ], + "isEntry": true, + "loc": 4 + }, + { + "id": "func:src/utils/date.ts#getLocalDateString@1", + "kind": "function", + "name": "getLocalDateString", + "qualifiedName": "getLocalDateString", + "location": { + "file": "src/utils/date.ts", + "startLine": 1, + "endLine": 7, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/date.ts", + "moduleId": "module:src/utils", + "signature": "getLocalDateString(date)", + "params": [ + { + "name": "date", + "optional": true, + "defaultValue": "new Date()" + } + ], + "loc": 7 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "kind": "function", + "name": "createNodeTimeRange", + "qualifiedName": "createNodeTimeRange", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 3, + "endLine": 9, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "createNodeTimeRange(startDate: string, endDate): NodeTimeRange", + "params": [ + { + "name": "startDate", + "typeRef": "string", + "optional": false + }, + { + "name": "endDate", + "optional": true, + "defaultValue": "startDate" + } + ], + "returnType": "NodeTimeRange", + "loc": 7 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "kind": "function", + "name": "addDaysToDateString", + "qualifiedName": "addDaysToDateString", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 11, + "endLine": 15, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "addDaysToDateString(value: string, days: number)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + }, + { + "name": "days", + "typeRef": "number", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "kind": "function", + "name": "normalizeNodeTimeRanges", + "qualifiedName": "normalizeNodeTimeRanges", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 17, + "endLine": 44, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "normalizeNodeTimeRanges(ranges: Partial[] | undefined, fallbackStartDate: string, fallbackEndDate): NodeTimeRange[]", + "params": [ + { + "name": "ranges", + "typeRef": "Partial[] | undefined", + "optional": false + }, + { + "name": "fallbackStartDate", + "typeRef": "string", + "optional": false + }, + { + "name": "fallbackEndDate", + "optional": true, + "defaultValue": "fallbackStartDate" + } + ], + "returnType": "NodeTimeRange[]", + "loc": 28 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "kind": "function", + "name": "constrainNodeTimeRanges", + "qualifiedName": "constrainNodeTimeRanges", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 46, + "endLine": 73, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "constrainNodeTimeRanges(ranges: Partial[] | undefined, fallbackStartDate: string, fallbackEndDate, forcedFirstStartDate: string): NodeTimeRange[]", + "params": [ + { + "name": "ranges", + "typeRef": "Partial[] | undefined", + "optional": false + }, + { + "name": "fallbackStartDate", + "typeRef": "string", + "optional": false + }, + { + "name": "fallbackEndDate", + "optional": true, + "defaultValue": "fallbackStartDate" + }, + { + "name": "forcedFirstStartDate", + "typeRef": "string", + "optional": true + } + ], + "returnType": "NodeTimeRange[]", + "loc": 28 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#reduce() 回调@53@53", + "kind": "function", + "name": "reduce() 回调@53", + "qualifiedName": "reduce() 回调@53", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 53, + "endLine": 70, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "reduce() 回调@53(constrainedRanges, range, index)", + "params": [ + { + "name": "constrainedRanges", + "optional": false + }, + { + "name": "range", + "optional": false + }, + { + "name": "index", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "function", + "name": "getNodeTimeRanges", + "qualifiedName": "getNodeTimeRanges", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 75, + "endLine": 77, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "getNodeTimeRanges(node: Pick): NodeTimeRange[]", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "returnType": "NodeTimeRange[]", + "loc": 3 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "function", + "name": "getNodeStartDate", + "qualifiedName": "getNodeStartDate", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 79, + "endLine": 84, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "getNodeStartDate(node: Pick)", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "function", + "name": "getNodeEndDate", + "qualifiedName": "getNodeEndDate", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 86, + "endLine": 91, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "getNodeEndDate(node: Pick)", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "kind": "function", + "name": "formatNodeTimeRanges", + "qualifiedName": "formatNodeTimeRanges", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 93, + "endLine": 97, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "formatNodeTimeRanges(node: Pick)", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "kind": "function", + "name": "constrainWorkflowNodesTimeRanges", + "qualifiedName": "constrainWorkflowNodesTimeRanges", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 99, + "endLine": 147, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "constrainWorkflowNodesTimeRanges(nodes: WorkflowNode[])", + "params": [ + { + "name": "nodes", + "typeRef": "WorkflowNode[]", + "optional": false + } + ], + "loc": 49 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "kind": "function", + "name": "map() 回调@107", + "qualifiedName": "map() 回调@107", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 107, + "endLine": 141, + "startCol": 31, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "map() 回调@107(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 35 + }, + { + "id": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "function", + "name": "getTaskDisplayStatus", + "qualifiedName": "getTaskDisplayStatus", + "location": { + "file": "src/utils/taskStatus.ts", + "startLine": 7, + "endLine": 48, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/taskStatus.ts", + "moduleId": "module:src/utils", + "signature": "getTaskDisplayStatus(task: Pick): TaskDisplayStatus", + "params": [ + { + "name": "task", + "typeRef": "Pick", + "optional": false + } + ], + "returnType": "TaskDisplayStatus", + "loc": 42 + }, + { + "id": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "function", + "name": "getTaskStatusMeta", + "qualifiedName": "getTaskStatusMeta", + "location": { + "file": "src/utils/taskStatus.ts", + "startLine": 50, + "endLine": 93, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/taskStatus.ts", + "moduleId": "module:src/utils", + "signature": "getTaskStatusMeta(status: TaskDisplayStatus)", + "params": [ + { + "name": "status", + "typeRef": "TaskDisplayStatus", + "optional": false + } + ], + "loc": 44 + }, + { + "id": "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "kind": "function", + "name": "normalizeTaskPriority", + "qualifiedName": "normalizeTaskPriority", + "location": { + "file": "src/utils/taskPriority.ts", + "startLine": 7, + "endLine": 9, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/taskPriority.ts", + "moduleId": "module:src/utils", + "signature": "normalizeTaskPriority(value: unknown): TaskPriority", + "params": [ + { + "name": "value", + "typeRef": "unknown", + "optional": false + } + ], + "returnType": "TaskPriority", + "loc": 3 + }, + { + "id": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "function", + "name": "getTaskPriorityMeta", + "qualifiedName": "getTaskPriorityMeta", + "location": { + "file": "src/utils/taskPriority.ts", + "startLine": 11, + "endLine": 35, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/taskPriority.ts", + "moduleId": "module:src/utils", + "signature": "getTaskPriorityMeta(priority: TaskPriority)", + "params": [ + { + "name": "priority", + "typeRef": "TaskPriority", + "optional": false + } + ], + "loc": 25 + }, + { + "id": "func:src/components/TaskList.tsx#TaskList@47", + "kind": "function", + "name": "TaskList", + "qualifiedName": "TaskList", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 47, + "endLine": 513, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "TaskList({\n tasks,\n projectTemplates,\n selectedTaskId,\n isCreatingProject,\n selectedTemplateId,\n canManageTasks,\n canReorderTasks,\n onSelectTask,\n onQuickRequirement,\n onStartCreateTask,\n onCancelCreateTask,\n onSelectTemplate,\n onDeleteTask,\n onToggleTaskPinned,\n onReorderTask,\n}: TaskListProps)", + "params": [ + { + "name": "{\n tasks,\n projectTemplates,\n selectedTaskId,\n isCreatingProject,\n selectedTemplateId,\n canManageTasks,\n canReorderTasks,\n onSelectTask,\n onQuickRequirement,\n onStartCreateTask,\n onCancelCreateTask,\n onSelectTemplate,\n onDeleteTask,\n onToggleTaskPinned,\n onReorderTask,\n}", + "typeRef": "TaskListProps", + "optional": false + } + ], + "loc": 467 + }, + { + "id": "func:src/components/TaskList.tsx#reduce() 回调@77@77", + "kind": "function", + "name": "reduce() 回调@77", + "qualifiedName": "reduce() 回调@77", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 77, + "endLine": 81, + "startCol": 5, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "reduce() 回调@77(counts, task)", + "params": [ + { + "name": "counts", + "optional": false + }, + { + "name": "task", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskList.tsx#toggleSelectedTag@91", + "kind": "function", + "name": "toggleSelectedTag", + "qualifiedName": "toggleSelectedTag", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 91, + "endLine": 95, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "toggleSelectedTag(tag: string)", + "params": [ + { + "name": "tag", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskList.tsx#toggleSelectedStatus@97", + "kind": "function", + "name": "toggleSelectedStatus", + "qualifiedName": "toggleSelectedStatus", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 97, + "endLine": 101, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "toggleSelectedStatus(status: TaskDisplayStatus)", + "params": [ + { + "name": "status", + "typeRef": "TaskDisplayStatus", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskList.tsx#toggleSelectedPriority@103", + "kind": "function", + "name": "toggleSelectedPriority", + "qualifiedName": "toggleSelectedPriority", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 103, + "endLine": 107, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "toggleSelectedPriority(priority: TaskPriority)", + "params": [ + { + "name": "priority", + "typeRef": "TaskPriority", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskList.tsx#filter() 回调@110@110", + "kind": "function", + "name": "filter() 回调@110", + "qualifiedName": "filter() 回调@110", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 110, + "endLine": 127, + "startCol": 38, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "filter() 回调@110(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "kind": "function", + "name": "getDropBeforeTaskId", + "qualifiedName": "getDropBeforeTaskId", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 129, + "endLine": 145, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "getDropBeforeTaskId(event: React.DragEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.DragEvent", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/TaskList.tsx#find() 回调@139@139", + "kind": "function", + "name": "find() 回调@139", + "qualifiedName": "find() 回调@139", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 139, + "endLine": 142, + "startCol": 39, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "find() 回调@139(element)", + "params": [ + { + "name": "element", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/TaskList.tsx#clearQueueDropState@147", + "kind": "function", + "name": "clearQueueDropState", + "qualifiedName": "clearQueueDropState", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 147, + "endLine": 150, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "clearQueueDropState()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/TaskList.tsx#map() 回调@202@202", + "kind": "function", + "name": "map() 回调@202", + "qualifiedName": "map() 回调@202", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 202, + "endLine": 219, + "startCol": 34, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@202(template)", + "params": [ + { + "name": "template", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/TaskList.tsx#map() 回调@265@265", + "kind": "function", + "name": "map() 回调@265", + "qualifiedName": "map() 回调@265", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 265, + "endLine": 282, + "startCol": 36, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@265(status)", + "params": [ + { + "name": "status", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/TaskList.tsx#map() 回调@297@297", + "kind": "function", + "name": "map() 回调@297", + "qualifiedName": "map() 回调@297", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 297, + "endLine": 314, + "startCol": 32, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@297(priority)", + "params": [ + { + "name": "priority", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@353@353", + "kind": "function", + "name": "匿名函数@353", + "qualifiedName": "匿名函数@353", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 353, + "endLine": 365, + "startCol": 21, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@353(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 13 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@366@366", + "kind": "function", + "name": "匿名函数@366", + "qualifiedName": "匿名函数@366", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 366, + "endLine": 370, + "startCol": 22, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@366(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@371@371", + "kind": "function", + "name": "匿名函数@371", + "qualifiedName": "匿名函数@371", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 371, + "endLine": 380, + "startCol": 17, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@371(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/TaskList.tsx#map() 回调@387@387", + "kind": "function", + "name": "map() 回调@387", + "qualifiedName": "map() 回调@387", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 387, + "endLine": 503, + "startCol": 29, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@387(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 117 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@400@400", + "kind": "function", + "name": "匿名函数@400", + "qualifiedName": "匿名函数@400", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 400, + "endLine": 409, + "startCol": 32, + "endCol": 20 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@400(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@410@410", + "kind": "function", + "name": "匿名函数@410", + "qualifiedName": "匿名函数@410", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 410, + "endLine": 413, + "startCol": 30, + "endCol": 20 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@410()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@442@442", + "kind": "function", + "name": "匿名函数@442", + "qualifiedName": "匿名函数@442", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 442, + "endLine": 445, + "startCol": 34, + "endCol": 26 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@442(e)", + "params": [ + { + "name": "e", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@458@458", + "kind": "function", + "name": "匿名函数@458", + "qualifiedName": "匿名函数@458", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 458, + "endLine": 463, + "startCol": 36, + "endCol": 28 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@458(e)", + "params": [ + { + "name": "e", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#addDays@20", + "kind": "function", + "name": "addDays", + "qualifiedName": "addDays", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 20, + "endLine": 24, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "addDays(value: string, days: number)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + }, + { + "name": "days", + "typeRef": "number", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", + "kind": "function", + "name": "WeeklyPlanList", + "qualifiedName": "WeeklyPlanList", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 26, + "endLine": 369, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "WeeklyPlanList({\n plans,\n tasks,\n selectedPlanId,\n canCreatePlans,\n canDeletePlans,\n onSelectPlan,\n onCreatePlan,\n onDeletePlan,\n onMoveTaskToPlan,\n}: WeeklyPlanListProps)", + "params": [ + { + "name": "{\n plans,\n tasks,\n selectedPlanId,\n canCreatePlans,\n canDeletePlans,\n onSelectPlan,\n onCreatePlan,\n onDeletePlan,\n onMoveTaskToPlan,\n}", + "typeRef": "WeeklyPlanListProps", + "optional": false + } + ], + "loc": 344 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#useEffect() 回调@48@48", + "kind": "function", + "name": "useEffect() 回调@48", + "qualifiedName": "useEffect() 回调@48", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 48, + "endLine": 52, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@48()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#forEach() 回调@56@56", + "kind": "function", + "name": "forEach() 回调@56", + "qualifiedName": "forEach() 回调@56", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 56, + "endLine": 61, + "startCol": 17, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@56(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62", + "kind": "function", + "name": "sort() 回调@62", + "qualifiedName": "sort() 回调@62", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 62, + "endLine": 68, + "startCol": 39, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "sort() 回调@62(a, b)", + "params": [ + { + "name": "a", + "optional": false + }, + { + "name": "b", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#resetForm@70", + "kind": "function", + "name": "resetForm", + "qualifiedName": "resetForm", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 70, + "endLine": 74, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "resetForm()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76", + "kind": "function", + "name": "handleCreatePlan", + "qualifiedName": "handleCreatePlan", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 76, + "endLine": 92, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "handleCreatePlan(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", + "kind": "function", + "name": "handleDeletePlan", + "qualifiedName": "handleDeletePlan", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 94, + "endLine": 100, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "handleDeletePlan(event: React.MouseEvent, plan: WeeklyPlan)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "plan", + "typeRef": "WeeklyPlan", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#confirmDeletePlan@102", + "kind": "function", + "name": "confirmDeletePlan", + "qualifiedName": "confirmDeletePlan", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 102, + "endLine": 114, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "confirmDeletePlan()", + "params": [], + "loc": 13 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@162@162", + "kind": "function", + "name": "匿名函数@162", + "qualifiedName": "匿名函数@162", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 162, + "endLine": 167, + "startCol": 25, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@162(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", + "kind": "function", + "name": "map() 回调@197", + "qualifiedName": "map() 回调@197", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 197, + "endLine": 304, + "startCol": 27, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@197(plan)", + "params": [ + { + "name": "plan", + "optional": false + } + ], + "loc": 108 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@209@209", + "kind": "function", + "name": "匿名函数@209", + "qualifiedName": "匿名函数@209", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 209, + "endLine": 212, + "startCol": 30, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@209(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@213@213", + "kind": "function", + "name": "匿名函数@213", + "qualifiedName": "匿名函数@213", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 213, + "endLine": 217, + "startCol": 29, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@213(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@219@219", + "kind": "function", + "name": "匿名函数@219", + "qualifiedName": "匿名函数@219", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 219, + "endLine": 226, + "startCol": 25, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@219(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "kind": "function", + "name": "WorkflowCanvas", + "qualifiedName": "WorkflowCanvas", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 26, + "endLine": 1124, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "WorkflowCanvas({\n task,\n people,\n selectedNodeId,\n viewport,\n onViewportChange,\n onSelectNode,\n onFocusNode,\n onUpdateNodes,\n projectTemplates = [],\n readOnly = false\n}: WorkflowCanvasProps)", + "params": [ + { + "name": "{\n task,\n people,\n selectedNodeId,\n viewport,\n onViewportChange,\n onSelectNode,\n onFocusNode,\n onUpdateNodes,\n projectTemplates = [],\n readOnly = false\n}", + "typeRef": "WorkflowCanvasProps", + "optional": false + } + ], + "loc": 1099 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 74, + "endLine": 84, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getEffectiveNodeStatus(node: Pick): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 11 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "kind": "function", + "name": "getNodeProgressPercent", + "qualifiedName": "getNodeProgressPercent", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 86, + "endLine": 90, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getNodeProgressPercent(node: WorkflowNode): number", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "number", + "loc": 5 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "kind": "function", + "name": "getStatusMeta", + "qualifiedName": "getStatusMeta", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 92, + "endLine": 130, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getStatusMeta(status: EffectiveNodeStatus)", + "params": [ + { + "name": "status", + "typeRef": "EffectiveNodeStatus", + "optional": false + } + ], + "loc": 39 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "kind": "function", + "name": "handleNodeMouseDown", + "qualifiedName": "handleNodeMouseDown", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 133, + "endLine": 148, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleNodeMouseDown(e: React.MouseEvent, node: WorkflowNode)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 16 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "kind": "function", + "name": "handleNodeClick", + "qualifiedName": "handleNodeClick", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 150, + "endLine": 157, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleNodeClick(e: React.MouseEvent, node: WorkflowNode)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleCanvasMouseDown@159", + "kind": "function", + "name": "handleCanvasMouseDown", + "qualifiedName": "handleCanvasMouseDown", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 159, + "endLine": 173, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleCanvasMouseDown(e: React.MouseEvent)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", + "kind": "function", + "name": "handleContainerMouseMove", + "qualifiedName": "handleContainerMouseMove", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 175, + "endLine": 236, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleContainerMouseMove(e: React.MouseEvent)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 62 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@212@212", + "kind": "function", + "name": "map() 回调@212", + "qualifiedName": "map() 回调@212", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 212, + "endLine": 217, + "startCol": 44, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@212(n)", + "params": [ + { + "name": "n", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleCanvasWheel@238", + "kind": "function", + "name": "handleCanvasWheel", + "qualifiedName": "handleCanvasWheel", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 238, + "endLine": 254, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleCanvasWheel(e: React.WheelEvent)", + "params": [ + { + "name": "e", + "typeRef": "React.WheelEvent", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "kind": "function", + "name": "getLogicalPoint", + "qualifiedName": "getLogicalPoint", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 256, + "endLine": 263, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getLogicalPoint(clientX: number, clientY: number)", + "params": [ + { + "name": "clientX", + "typeRef": "number", + "optional": false + }, + { + "name": "clientY", + "typeRef": "number", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#isAncestor@265", + "kind": "function", + "name": "isAncestor", + "qualifiedName": "isAncestor", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 265, + "endLine": 273, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "isAncestor(ancestorId: string, descendantId: string, visited): boolean", + "params": [ + { + "name": "ancestorId", + "typeRef": "string", + "optional": false + }, + { + "name": "descendantId", + "typeRef": "string", + "optional": false + }, + { + "name": "visited", + "optional": true, + "defaultValue": "new Set()" + } + ], + "returnType": "boolean", + "loc": 9 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", + "kind": "function", + "name": "showConnectionToast", + "qualifiedName": "showConnectionToast", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 275, + "endLine": 280, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "showConnectionToast(message: string)", + "params": [ + { + "name": "message", + "typeRef": "string", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#setTimeout() 回调@277@277", + "kind": "function", + "name": "setTimeout() 回调@277", + "qualifiedName": "setTimeout() 回调@277", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 277, + "endLine": 279, + "startCol": 23, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "setTimeout() 回调@277()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#addConnection@282", + "kind": "function", + "name": "addConnection", + "qualifiedName": "addConnection", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 282, + "endLine": 302, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "addConnection(firstNodeId: string, secondNodeId: string)", + "params": [ + { + "name": "firstNodeId", + "typeRef": "string", + "optional": false + }, + { + "name": "secondNodeId", + "typeRef": "string", + "optional": false + } + ], + "loc": 21 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "kind": "function", + "name": "completeConnectionDrag", + "qualifiedName": "completeConnectionDrag", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 304, + "endLine": 314, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "completeConnectionDrag(logicalX: number, logicalY: number)", + "params": [ + { + "name": "logicalX", + "typeRef": "number", + "optional": false + }, + { + "name": "logicalY", + "typeRef": "number", + "optional": false + } + ], + "loc": 11 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "kind": "function", + "name": "getConnectionTarget", + "qualifiedName": "getConnectionTarget", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 316, + "endLine": 323, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getConnectionTarget(logicalX: number, logicalY: number, sourceId: string)", + "params": [ + { + "name": "logicalX", + "typeRef": "number", + "optional": false + }, + { + "name": "logicalY", + "typeRef": "number", + "optional": false + }, + { + "name": "sourceId", + "typeRef": "string", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#find() 回调@317@317", + "kind": "function", + "name": "find() 回调@317", + "qualifiedName": "find() 回调@317", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 317, + "endLine": 322, + "startCol": 29, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "find() 回调@317(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "kind": "function", + "name": "handleConnectionMouseDown", + "qualifiedName": "handleConnectionMouseDown", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 325, + "endLine": 341, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleConnectionMouseDown(e: React.MouseEvent, node: WorkflowNode)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "kind": "function", + "name": "handleConnectionHandleClick", + "qualifiedName": "handleConnectionHandleClick", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 343, + "endLine": 350, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleConnectionHandleClick(e: React.MouseEvent, node: WorkflowNode)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "kind": "function", + "name": "getOverlapArea", + "qualifiedName": "getOverlapArea", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 352, + "endLine": 359, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getOverlapArea(a: { x: number; y: number; width: number; height: number }, b: { x: number; y: number; width: number; height: number })", + "params": [ + { + "name": "a", + "typeRef": "{ x: number; y: number; width: number; height: number }", + "optional": false + }, + { + "name": "b", + "typeRef": "{ x: number; y: number; width: number; height: number }", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "kind": "function", + "name": "findPreviewNodePosition", + "qualifiedName": "findPreviewNodePosition", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 361, + "endLine": 398, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "findPreviewNodePosition(anchorNode: WorkflowNode)", + "params": [ + { + "name": "anchorNode", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 38 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleCenterNodes@400", + "kind": "function", + "name": "handleCenterNodes", + "qualifiedName": "handleCenterNodes", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 400, + "endLine": 429, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleCenterNodes()", + "params": [], + "loc": 30 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#reduce() 回调@405@405", + "kind": "function", + "name": "reduce() 回调@405", + "qualifiedName": "reduce() 回调@405", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 405, + "endLine": 412, + "startCol": 7, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "reduce() 回调@405(acc, node)", + "params": [ + { + "name": "acc", + "optional": false + }, + { + "name": "node", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", + "kind": "function", + "name": "handleContainerMouseUp", + "qualifiedName": "handleContainerMouseUp", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 431, + "endLine": 462, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleContainerMouseUp(e: React.MouseEvent)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 32 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "kind": "function", + "name": "createDraftNode", + "qualifiedName": "createDraftNode", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 465, + "endLine": 505, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "createDraftNode(mode: 'empty' | 'parent' | 'child', explicitAnchorNode: WorkflowNode)", + "params": [ + { + "name": "mode", + "typeRef": "'empty' | 'parent' | 'child'", + "optional": false + }, + { + "name": "explicitAnchorNode", + "typeRef": "WorkflowNode", + "optional": true + } + ], + "loc": 41 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507", + "kind": "function", + "name": "handleAddEmptyNode", + "qualifiedName": "handleAddEmptyNode", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 507, + "endLine": 510, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleAddEmptyNode()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleToolbarClick@512", + "kind": "function", + "name": "handleToolbarClick", + "qualifiedName": "handleToolbarClick", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 512, + "endLine": 518, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleToolbarClick(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", + "kind": "function", + "name": "handleDeleteNode", + "qualifiedName": "handleDeleteNode", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 521, + "endLine": 543, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleDeleteNode(nodeId: string)", + "params": [ + { + "name": "nodeId", + "typeRef": "string", + "optional": false + } + ], + "loc": 23 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@533@533", + "kind": "function", + "name": "map() 回调@533", + "qualifiedName": "map() 回调@533", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 533, + "endLine": 538, + "startCol": 46, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@533(n)", + "params": [ + { + "name": "n", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", + "kind": "function", + "name": "handleSelectConnection", + "qualifiedName": "handleSelectConnection", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 545, + "endLine": 550, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleSelectConnection(e: React.MouseEvent, parentId: string, childId: string)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "parentId", + "typeRef": "string", + "optional": false + }, + { + "name": "childId", + "typeRef": "string", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "kind": "function", + "name": "handleDeleteConnection", + "qualifiedName": "handleDeleteConnection", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 552, + "endLine": 562, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleDeleteConnection(parentId: string, childId: string)", + "params": [ + { + "name": "parentId", + "typeRef": "string", + "optional": false + }, + { + "name": "childId", + "typeRef": "string", + "optional": false + } + ], + "loc": 11 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@564@564", + "kind": "function", + "name": "useEffect() 回调@564", + "qualifiedName": "useEffect() 回调@564", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 564, + "endLine": 590, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@564()", + "params": [], + "loc": 27 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", + "kind": "function", + "name": "handleKeyDown", + "qualifiedName": "handleKeyDown", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 565, + "endLine": 586, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleKeyDown(event: KeyboardEvent)", + "params": [ + { + "name": "event", + "typeRef": "KeyboardEvent", + "optional": false + } + ], + "loc": 22 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@593@593", + "kind": "function", + "name": "useEffect() 回调@593", + "qualifiedName": "useEffect() 回调@593", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 593, + "endLine": 602, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@593()", + "params": [], + "loc": 10 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleClickOutside@595", + "kind": "function", + "name": "handleClickOutside", + "qualifiedName": "handleClickOutside", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 595, + "endLine": 599, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleClickOutside(event: MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "MouseEvent", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "kind": "function", + "name": "buildImportedTemplateNodes", + "qualifiedName": "buildImportedTemplateNodes", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 619, + "endLine": 665, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "buildImportedTemplateNodes(template: ProjectTemplate): WorkflowNode[]", + "params": [ + { + "name": "template", + "typeRef": "ProjectTemplate", + "optional": false + } + ], + "returnType": "WorkflowNode[]", + "loc": 47 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#toMs@623", + "kind": "function", + "name": "toMs", + "qualifiedName": "toMs", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 623, + "endLine": 623, + "startCol": 11, + "endCol": 81 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "toMs(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 1 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", + "kind": "function", + "name": "map() 回调@638", + "qualifiedName": "map() 回调@638", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 638, + "endLine": 664, + "startCol": 23, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@638(node, index)", + "params": [ + { + "name": "node", + "optional": false + }, + { + "name": "index", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "kind": "function", + "name": "handleImportTemplate", + "qualifiedName": "handleImportTemplate", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 667, + "endLine": 681, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleImportTemplate(templateId: string)", + "params": [ + { + "name": "templateId", + "typeRef": "string", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@837@837", + "kind": "function", + "name": "map() 回调@837", + "qualifiedName": "map() 回调@837", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 837, + "endLine": 926, + "startCol": 32, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@837(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 90 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", + "kind": "function", + "name": "map() 回调@838", + "qualifiedName": "map() 回调@838", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 838, + "endLine": 925, + "startCol": 41, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@838(parentID)", + "params": [ + { + "name": "parentID", + "optional": false + } + ], + "loc": 88 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@890@890", + "kind": "function", + "name": "匿名函数@890", + "qualifiedName": "匿名函数@890", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 890, + "endLine": 893, + "startCol": 40, + "endCol": 28 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@890(e)", + "params": [ + { + "name": "e", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@894@894", + "kind": "function", + "name": "匿名函数@894", + "qualifiedName": "匿名函数@894", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 894, + "endLine": 897, + "startCol": 38, + "endCol": 28 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@894(e)", + "params": [ + { + "name": "e", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@900@900", + "kind": "function", + "name": "匿名函数@900", + "qualifiedName": "匿名函数@900", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 900, + "endLine": 904, + "startCol": 36, + "endCol": 28 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@900(e)", + "params": [ + { + "name": "e", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@927@927", + "kind": "function", + "name": "匿名函数@927", + "qualifiedName": "匿名函数@927", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 927, + "endLine": 949, + "startCol": 43, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@927()", + "params": [], + "loc": 23 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "kind": "function", + "name": "map() 回调@997", + "qualifiedName": "map() 回调@997", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 997, + "endLine": 1117, + "startCol": 30, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@997(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 121 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@1073@1073", + "kind": "function", + "name": "匿名函数@1073", + "qualifiedName": "匿名函数@1073", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 1073, + "endLine": 1077, + "startCol": 34, + "endCol": 26 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@1073(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#toDateMs@23", + "kind": "function", + "name": "toDateMs", + "qualifiedName": "toDateMs", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 23, + "endLine": 25, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "toDateMs(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 3 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#addDays@27", + "kind": "function", + "name": "addDays", + "qualifiedName": "addDays", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 27, + "endLine": 31, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "addDays(value: string, days: number)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + }, + { + "name": "days", + "typeRef": "number", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "kind": "function", + "name": "shiftTemplateNodes", + "qualifiedName": "shiftTemplateNodes", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 33, + "endLine": 62, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "shiftTemplateNodes(nodes: WorkflowNode[])", + "params": [ + { + "name": "nodes", + "typeRef": "WorkflowNode[]", + "optional": false + } + ], + "loc": 30 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", + "kind": "function", + "name": "map() 回调@45", + "qualifiedName": "map() 回调@45", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 45, + "endLine": 61, + "startCol": 20, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@45(node, index)", + "params": [ + { + "name": "node", + "optional": false + }, + { + "name": "index", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#TemplateDagPreview@64", + "kind": "function", + "name": "TemplateDagPreview", + "qualifiedName": "TemplateDagPreview", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 64, + "endLine": 121, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "TemplateDagPreview({ template }: { template: ProjectTemplate | null })", + "params": [ + { + "name": "{ template }", + "typeRef": "{ template: ProjectTemplate | null }", + "optional": false + } + ], + "loc": 58 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@68@68", + "kind": "function", + "name": "useEffect() 回调@68", + "qualifiedName": "useEffect() 回调@68", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 68, + "endLine": 71, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@68()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#ProjectCreateModal@123", + "kind": "function", + "name": "ProjectCreateModal", + "qualifiedName": "ProjectCreateModal", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 123, + "endLine": 317, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "ProjectCreateModal({\n availableTags,\n template,\n onClose,\n onCreateTask,\n}: ProjectCreateModalProps)", + "params": [ + { + "name": "{\n availableTags,\n template,\n onClose,\n onCreateTask,\n}", + "typeRef": "ProjectCreateModalProps", + "optional": false + } + ], + "loc": 195 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@137@137", + "kind": "function", + "name": "useEffect() 回调@137", + "qualifiedName": "useEffect() 回调@137", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 137, + "endLine": 144, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@137()", + "params": [], + "loc": 8 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#toggleTag@146", + "kind": "function", + "name": "toggleTag", + "qualifiedName": "toggleTag", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 146, + "endLine": 150, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "toggleTag(tagName: string)", + "params": [ + { + "name": "tagName", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", + "kind": "function", + "name": "resetProjectForm", + "qualifiedName": "resetProjectForm", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 152, + "endLine": 158, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "resetProjectForm()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", + "kind": "function", + "name": "handleCreateProject", + "qualifiedName": "handleCreateProject", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 160, + "endLine": 183, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "handleCreateProject(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 24 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#map() 回调@234@234", + "kind": "function", + "name": "map() 回调@234", + "qualifiedName": "map() 回调@234", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 234, + "endLine": 251, + "startCol": 40, + "endCol": 20 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@234(priority)", + "params": [ + { + "name": "priority", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#map() 回调@271@271", + "kind": "function", + "name": "map() 回调@271", + "qualifiedName": "map() 回调@271", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 271, + "endLine": 285, + "startCol": 40, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@271(tagDefinition)", + "params": [ + { + "name": "tagDefinition", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "kind": "function", + "name": "TaskOverview", + "qualifiedName": "TaskOverview", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 14, + "endLine": 463, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "TaskOverview({\n task,\n availableTags,\n onUpdateTaskMetadata,\n onRefreshTask\n}: TaskOverviewProps)", + "params": [ + { + "name": "{\n task,\n availableTags,\n onUpdateTaskMetadata,\n onRefreshTask\n}", + "typeRef": "TaskOverviewProps", + "optional": false + } + ], + "loc": 450 + }, + { + "id": "func:src/components/TaskOverview.tsx#useEffect() 回调@48@48", + "kind": "function", + "name": "useEffect() 回调@48", + "qualifiedName": "useEffect() 回调@48", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 48, + "endLine": 56, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@48()", + "params": [], + "loc": 9 + }, + { + "id": "func:src/components/TaskOverview.tsx#useLayoutEffect() 回调@58@58", + "kind": "function", + "name": "useLayoutEffect() 回调@58", + "qualifiedName": "useLayoutEffect() 回调@58", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 58, + "endLine": 62, + "startCol": 19, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "useLayoutEffect() 回调@58()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/TaskOverview.tsx#handleSave@64", + "kind": "function", + "name": "handleSave", + "qualifiedName": "handleSave", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 64, + "endLine": 77, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleSave()", + "params": [], + "loc": 14 + }, + { + "id": "func:src/components/TaskOverview.tsx#handleSaveBlackboard@79", + "kind": "function", + "name": "handleSaveBlackboard", + "qualifiedName": "handleSaveBlackboard", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 79, + "endLine": 86, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleSaveBlackboard()", + "params": [], + "loc": 8 + }, + { + "id": "func:src/components/TaskOverview.tsx#toggleEditTag@89", + "kind": "function", + "name": "toggleEditTag", + "qualifiedName": "toggleEditTag", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 89, + "endLine": 93, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "toggleEditTag(tagName: string)", + "params": [ + { + "name": "tagName", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskOverview.tsx#handleOpenBlackboard@95", + "kind": "function", + "name": "handleOpenBlackboard", + "qualifiedName": "handleOpenBlackboard", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 95, + "endLine": 101, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleOpenBlackboard()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", + "kind": "function", + "name": "runTaskCompletionUpdate", + "qualifiedName": "runTaskCompletionUpdate", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 103, + "endLine": 116, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "runTaskCompletionUpdate()", + "params": [], + "loc": 14 + }, + { + "id": "func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118", + "kind": "function", + "name": "handleToggleTaskCompletion", + "qualifiedName": "handleToggleTaskCompletion", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 118, + "endLine": 132, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleToggleTaskCompletion(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/TaskOverview.tsx#map() 回调@240@240", + "kind": "function", + "name": "map() 回调@240", + "qualifiedName": "map() 回调@240", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 240, + "endLine": 257, + "startCol": 38, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@240(priority)", + "params": [ + { + "name": "priority", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/TaskOverview.tsx#map() 回调@294@294", + "kind": "function", + "name": "map() 回调@294", + "qualifiedName": "map() 回调@294", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 294, + "endLine": 311, + "startCol": 38, + "endCol": 20 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@294(tagDefinition)", + "params": [ + { + "name": "tagDefinition", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/GanttChart.tsx#GanttChart@14", + "kind": "function", + "name": "GanttChart", + "qualifiedName": "GanttChart", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 14, + "endLine": 427, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "GanttChart({ task, onSelectNode, selectedNodeId, centerNonce = 0 }: GanttChartProps)", + "params": [ + { + "name": "{ task, onSelectNode, selectedNodeId, centerNonce = 0 }", + "typeRef": "GanttChartProps", + "optional": false + } + ], + "loc": 414 + }, + { + "id": "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", + "kind": "function", + "name": "useMemo() 回调@23", + "qualifiedName": "useMemo() 回调@23", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 23, + "endLine": 73, + "startCol": 29, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@23()", + "params": [], + "loc": 51 + }, + { + "id": "func:src/components/GanttChart.tsx#from() 回调@29@29", + "kind": "function", + "name": "from() 回调@29", + "qualifiedName": "from() 回调@29", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 29, + "endLine": 33, + "startCol": 50, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "from() 回调@29(_, i)", + "params": [ + { + "name": "_", + "optional": false + }, + { + "name": "i", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/GanttChart.tsx#forEach() 回调@40@40", + "kind": "function", + "name": "forEach() 回调@40", + "qualifiedName": "forEach() 回调@40", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 40, + "endLine": 47, + "startCol": 19, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@40(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/GanttChart.tsx#forEach() 回调@41@41", + "kind": "function", + "name": "forEach() 回调@41", + "qualifiedName": "forEach() 回调@41", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 41, + "endLine": 46, + "startCol": 39, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@41(range)", + "params": [ + { + "name": "range", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/GanttChart.tsx#formatDateString@76", + "kind": "function", + "name": "formatDateString", + "qualifiedName": "formatDateString", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 76, + "endLine": 78, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "formatDateString(dt: Date)", + "params": [ + { + "name": "dt", + "typeRef": "Date", + "optional": false + } + ], + "loc": 3 + }, + { + "id": "func:src/components/GanttChart.tsx#getDayLabel@80", + "kind": "function", + "name": "getDayLabel", + "qualifiedName": "getDayLabel", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 80, + "endLine": 83, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getDayLabel(dt: Date)", + "params": [ + { + "name": "dt", + "typeRef": "Date", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/GanttChart.tsx#isWeekend@86", + "kind": "function", + "name": "isWeekend", + "qualifiedName": "isWeekend", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 86, + "endLine": 89, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "isWeekend(dt: Date)", + "params": [ + { + "name": "dt", + "typeRef": "Date", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "kind": "function", + "name": "getTimelinePercentage", + "qualifiedName": "getTimelinePercentage", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 92, + "endLine": 110, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getTimelinePercentage(startStr: string, endStr: string)", + "params": [ + { + "name": "startStr", + "typeRef": "string", + "optional": false + }, + { + "name": "endStr", + "typeRef": "string", + "optional": false + } + ], + "loc": 19 + }, + { + "id": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 115, + "endLine": 125, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getEffectiveNodeStatus(node: WorkflowNode): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 11 + }, + { + "id": "func:src/components/GanttChart.tsx#handleTimelineMouseDown@131", + "kind": "function", + "name": "handleTimelineMouseDown", + "qualifiedName": "handleTimelineMouseDown", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 131, + "endLine": 142, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "handleTimelineMouseDown(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 12 + }, + { + "id": "func:src/components/GanttChart.tsx#handleTimelineMouseMove@144", + "kind": "function", + "name": "handleTimelineMouseMove", + "qualifiedName": "handleTimelineMouseMove", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 144, + "endLine": 153, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "handleTimelineMouseMove(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/GanttChart.tsx#stopTimelineDrag@155", + "kind": "function", + "name": "stopTimelineDrag", + "qualifiedName": "stopTimelineDrag", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 155, + "endLine": 158, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "stopTimelineDrag()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/GanttChart.tsx#handleTimelineClickCapture@160", + "kind": "function", + "name": "handleTimelineClickCapture", + "qualifiedName": "handleTimelineClickCapture", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 160, + "endLine": 165, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "handleTimelineClickCapture(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/GanttChart.tsx#useEffect() 回调@167@167", + "kind": "function", + "name": "useEffect() 回调@167", + "qualifiedName": "useEffect() 回调@167", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 167, + "endLine": 192, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@167()", + "params": [], + "loc": 26 + }, + { + "id": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "kind": "function", + "name": "requestAnimationFrame() 回调@174", + "qualifiedName": "requestAnimationFrame() 回调@174", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 174, + "endLine": 189, + "startCol": 46, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "requestAnimationFrame() 回调@174()", + "params": [], + "loc": 16 + }, + { + "id": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "kind": "function", + "name": "map() 回调@260", + "qualifiedName": "map() 回调@260", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 260, + "endLine": 298, + "startCol": 45, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@260(day, idx)", + "params": [ + { + "name": "day", + "optional": false + }, + { + "name": "idx", + "optional": false + } + ], + "loc": 39 + }, + { + "id": "func:src/components/GanttChart.tsx#map() 回调@304@304", + "kind": "function", + "name": "map() 回调@304", + "qualifiedName": "map() 回调@304", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 304, + "endLine": 420, + "startCol": 26, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@304(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 117 + }, + { + "id": "func:src/components/GanttChart.tsx#map() 回调@375@375", + "kind": "function", + "name": "map() 回调@375", + "qualifiedName": "map() 回调@375", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 375, + "endLine": 386, + "startCol": 53, + "endCol": 26 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@375(day, idx)", + "params": [ + { + "name": "day", + "optional": false + }, + { + "name": "idx", + "optional": false + } + ], + "loc": 12 + }, + { + "id": "func:src/components/GanttChart.tsx#map() 回调@389@389", + "kind": "function", + "name": "map() 回调@389", + "qualifiedName": "map() 回调@389", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 389, + "endLine": 416, + "startCol": 43, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@389(range, rangeIndex)", + "params": [ + { + "name": "range", + "optional": false + }, + { + "name": "rangeIndex", + "optional": false + } + ], + "loc": 28 + }, + { + "id": "func:src/components/GanttChart.tsx#匿名函数@399@399", + "kind": "function", + "name": "匿名函数@399", + "qualifiedName": "匿名函数@399", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 399, + "endLine": 402, + "startCol": 38, + "endCol": 30 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@399(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#PersonGanttChart@25", + "kind": "function", + "name": "PersonGanttChart", + "qualifiedName": "PersonGanttChart", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 25, + "endLine": 377, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "PersonGanttChart({\r\n tasks,\r\n person,\r\n weeklyPlans = [],\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onSelectTaskNode,\r\n}: PersonGanttChartProps)", + "params": [ + { + "name": "{\r\n tasks,\r\n person,\r\n weeklyPlans = [],\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onSelectTaskNode,\r\n}", + "typeRef": "PersonGanttChartProps", + "optional": false + } + ], + "loc": 353 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@41@41", + "kind": "function", + "name": "useMemo() 回调@41", + "qualifiedName": "useMemo() 回调@41", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 41, + "endLine": 49, + "startCol": 44, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@41()", + "params": [], + "loc": 9 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "kind": "function", + "name": "useMemo() 回调@51", + "qualifiedName": "useMemo() 回调@51", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 51, + "endLine": 76, + "startCol": 29, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@51()", + "params": [], + "loc": 26 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64", + "kind": "function", + "name": "forEach() 回调@64", + "qualifiedName": "forEach() 回调@64", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 64, + "endLine": 71, + "startCol": 19, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@64({ node })", + "params": [ + { + "name": "{ node }", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#forEach() 回调@65@65", + "kind": "function", + "name": "forEach() 回调@65", + "qualifiedName": "forEach() 回调@65", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 65, + "endLine": 70, + "startCol": 39, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@65(range)", + "params": [ + { + "name": "range", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 87, + "endLine": 97, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getEffectiveNodeStatus(node: WorkflowNode): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 11 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "kind": "function", + "name": "getTimelinePercentage", + "qualifiedName": "getTimelinePercentage", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 99, + "endLine": 113, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getTimelinePercentage(startStr: string, endStr: string)", + "params": [ + { + "name": "startStr", + "typeRef": "string", + "optional": false + }, + { + "name": "endStr", + "typeRef": "string", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#handleTimelineMouseDown@115", + "kind": "function", + "name": "handleTimelineMouseDown", + "qualifiedName": "handleTimelineMouseDown", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 115, + "endLine": 124, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "handleTimelineMouseDown(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#handleTimelineMouseMove@126", + "kind": "function", + "name": "handleTimelineMouseMove", + "qualifiedName": "handleTimelineMouseMove", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 126, + "endLine": 133, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "handleTimelineMouseMove(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#stopTimelineDrag@135", + "kind": "function", + "name": "stopTimelineDrag", + "qualifiedName": "stopTimelineDrag", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 135, + "endLine": 138, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "stopTimelineDrag()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#useEffect() 回调@140@140", + "kind": "function", + "name": "useEffect() 回调@140", + "qualifiedName": "useEffect() 回调@140", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 140, + "endLine": 170, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@140()", + "params": [], + "loc": 31 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", + "kind": "function", + "name": "requestAnimationFrame() 回调@149", + "qualifiedName": "requestAnimationFrame() 回调@149", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 149, + "endLine": 167, + "startCol": 46, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "requestAnimationFrame() 回调@149()", + "params": [], + "loc": 19 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#匿名函数@218@218", + "kind": "function", + "name": "匿名函数@218", + "qualifiedName": "匿名函数@218", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 218, + "endLine": 222, + "startCol": 20, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@218(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#map() 回调@235@235", + "kind": "function", + "name": "map() 回调@235", + "qualifiedName": "map() 回调@235", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 235, + "endLine": 261, + "startCol": 45, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@235(day, idx)", + "params": [ + { + "name": "day", + "optional": false + }, + { + "name": "idx", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "kind": "function", + "name": "map() 回调@266", + "qualifiedName": "map() 回调@266", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 266, + "endLine": 370, + "startCol": 26, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@266({ task, node })", + "params": [ + { + "name": "{ task, node }", + "optional": false + } + ], + "loc": 105 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#map() 回调@322@322", + "kind": "function", + "name": "map() 回调@322", + "qualifiedName": "map() 回调@322", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 322, + "endLine": 335, + "startCol": 53, + "endCol": 26 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@322(day, idx)", + "params": [ + { + "name": "day", + "optional": false + }, + { + "name": "idx", + "optional": false + } + ], + "loc": 14 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#map() 回调@337@337", + "kind": "function", + "name": "map() 回调@337", + "qualifiedName": "map() 回调@337", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 337, + "endLine": 366, + "startCol": 43, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@337(range, rangeIndex)", + "params": [ + { + "name": "range", + "optional": false + }, + { + "name": "rangeIndex", + "optional": false + } + ], + "loc": 30 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#匿名函数@344@344", + "kind": "function", + "name": "匿名函数@344", + "qualifiedName": "匿名函数@344", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 344, + "endLine": 351, + "startCol": 38, + "endCol": 30 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@344(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "kind": "function", + "name": "buildDateRange", + "qualifiedName": "buildDateRange", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 379, + "endLine": 391, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "buildDateRange(minDate: Date, maxDate: Date)", + "params": [ + { + "name": "minDate", + "typeRef": "Date", + "optional": false + }, + { + "name": "maxDate", + "typeRef": "Date", + "optional": false + } + ], + "loc": 13 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#getDayLabel@393", + "kind": "function", + "name": "getDayLabel", + "qualifiedName": "getDayLabel", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 393, + "endLine": 396, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getDayLabel(dt: Date)", + "params": [ + { + "name": "dt", + "typeRef": "Date", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "kind": "function", + "name": "getStatusVisual", + "qualifiedName": "getStatusVisual", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 398, + "endLine": 424, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getStatusVisual(status: EffectiveNodeStatus)", + "params": [ + { + "name": "status", + "typeRef": "EffectiveNodeStatus", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/components/PeopleManager.tsx#getSearchTokens@29", + "kind": "function", + "name": "getSearchTokens", + "qualifiedName": "getSearchTokens", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 29, + "endLine": 43, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "getSearchTokens(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/PeopleManager.tsx#getPinyinSortKey@45", + "kind": "function", + "name": "getPinyinSortKey", + "qualifiedName": "getPinyinSortKey", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 45, + "endLine": 49, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "getPinyinSortKey(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51", + "kind": "function", + "name": "comparePeopleByPinyin", + "qualifiedName": "comparePeopleByPinyin", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 51, + "endLine": 56, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "comparePeopleByPinyin(a: Person, b: Person)", + "params": [ + { + "name": "a", + "typeRef": "Person", + "optional": false + }, + { + "name": "b", + "typeRef": "Person", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/PeopleManager.tsx#PeopleManager@58", + "kind": "function", + "name": "PeopleManager", + "qualifiedName": "PeopleManager", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 58, + "endLine": 328, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "PeopleManager({\r\n people,\r\n tasks,\r\n weeklyPlans = [],\r\n personalView = false,\r\n currentPersonName = '',\r\n currentPersonRole = '',\r\n currentPersonId = '',\r\n canEditAllPersonRoles = false,\r\n canManagePersonAdmins = false,\r\n focusPersonId = null,\r\n focusPersonNonce = 0,\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onDeletePerson,\r\n onUpdatePersonRole,\r\n onTogglePersonAdmin,\r\n onSelectTaskNode,\r\n onCloseDrawer,\r\n}: PeopleManagerProps)", + "params": [ + { + "name": "{\r\n people,\r\n tasks,\r\n weeklyPlans = [],\r\n personalView = false,\r\n currentPersonName = '',\r\n currentPersonRole = '',\r\n currentPersonId = '',\r\n canEditAllPersonRoles = false,\r\n canManagePersonAdmins = false,\r\n focusPersonId = null,\r\n focusPersonNonce = 0,\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onDeletePerson,\r\n onUpdatePersonRole,\r\n onTogglePersonAdmin,\r\n onSelectTaskNode,\r\n onCloseDrawer,\r\n}", + "typeRef": "PeopleManagerProps", + "optional": false + } + ], + "loc": 271 + }, + { + "id": "func:src/components/PeopleManager.tsx#useMemo() 回调@107@107", + "kind": "function", + "name": "useMemo() 回调@107", + "qualifiedName": "useMemo() 回调@107", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 107, + "endLine": 116, + "startCol": 34, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@107()", + "params": [], + "loc": 10 + }, + { + "id": "func:src/components/PeopleManager.tsx#useEffect() 回调@118@118", + "kind": "function", + "name": "useEffect() 回调@118", + "qualifiedName": "useEffect() 回调@118", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 118, + "endLine": 120, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@118()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/PeopleManager.tsx#useEffect() 回调@122@122", + "kind": "function", + "name": "useEffect() 回调@122", + "qualifiedName": "useEffect() 回调@122", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 122, + "endLine": 125, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@122()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/PeopleManager.tsx#handleSaveRole@127", + "kind": "function", + "name": "handleSaveRole", + "qualifiedName": "handleSaveRole", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 127, + "endLine": 136, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "handleSaveRole()", + "params": [], + "loc": 10 + }, + { + "id": "func:src/components/PeopleManager.tsx#匿名函数@250@250", + "kind": "function", + "name": "匿名函数@250", + "qualifiedName": "匿名函数@250", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 250, + "endLine": 253, + "startCol": 30, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@250()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/PeopleManager.tsx#匿名函数@280@280", + "kind": "function", + "name": "匿名函数@280", + "qualifiedName": "匿名函数@280", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 280, + "endLine": 284, + "startCol": 32, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@280(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/PeopleManager.tsx#匿名函数@285@285", + "kind": "function", + "name": "匿名函数@285", + "qualifiedName": "匿名函数@285", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 285, + "endLine": 290, + "startCol": 34, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@285(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/utils/api.ts#appPath@7", + "kind": "function", + "name": "appPath", + "qualifiedName": "appPath", + "location": { + "file": "src/utils/api.ts", + "startLine": 7, + "endLine": 13, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/api.ts", + "moduleId": "module:src/utils", + "signature": "appPath(path)", + "params": [ + { + "name": "path", + "optional": true, + "defaultValue": "''" + } + ], + "loc": 7 + }, + { + "id": "func:src/utils/api.ts#apiPath@15", + "kind": "function", + "name": "apiPath", + "qualifiedName": "apiPath", + "location": { + "file": "src/utils/api.ts", + "startLine": 15, + "endLine": 17, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/api.ts", + "moduleId": "module:src/utils", + "signature": "apiPath(path: string)", + "params": [ + { + "name": "path", + "typeRef": "string", + "optional": false + } + ], + "loc": 3 + }, + { + "id": "func:src/components/LoginPage.tsx#readApiJson@21", + "kind": "function", + "name": "readApiJson", + "qualifiedName": "readApiJson", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 21, + "endLine": 29, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "readApiJson(response: Response, fallback: string): Promise", + "params": [ + { + "name": "response", + "typeRef": "Response", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 9 + }, + { + "id": "func:src/components/LoginPage.tsx#createOAuthState@31", + "kind": "function", + "name": "createOAuthState", + "qualifiedName": "createOAuthState", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 31, + "endLine": 37, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "createOAuthState()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "kind": "function", + "name": "requestSsoOAuthCode", + "qualifiedName": "requestSsoOAuthCode", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 39, + "endLine": 82, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "requestSsoOAuthCode(authorizeUrl: string, state: string)", + "params": [ + { + "name": "authorizeUrl", + "typeRef": "string", + "optional": false + }, + { + "name": "state", + "typeRef": "string", + "optional": false + } + ], + "loc": 44 + }, + { + "id": "func:src/components/LoginPage.tsx#匿名函数@40@40", + "kind": "function", + "name": "匿名函数@40", + "qualifiedName": "匿名函数@40", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 40, + "endLine": 81, + "startCol": 30, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@40(resolve, reject)", + "params": [ + { + "name": "resolve", + "optional": false + }, + { + "name": "reject", + "optional": false + } + ], + "loc": 42 + }, + { + "id": "func:src/components/LoginPage.tsx#setTimeout() 回调@52@52", + "kind": "function", + "name": "setTimeout() 回调@52", + "qualifiedName": "setTimeout() 回调@52", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 52, + "endLine": 56, + "startCol": 41, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "setTimeout() 回调@52()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/LoginPage.tsx#handleMessage@58", + "kind": "function", + "name": "handleMessage", + "qualifiedName": "handleMessage", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 58, + "endLine": 78, + "startCol": 5, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "handleMessage(event: MessageEvent)", + "params": [ + { + "name": "event", + "typeRef": "MessageEvent", + "optional": false + } + ], + "loc": 21 + }, + { + "id": "func:src/components/LoginPage.tsx#LoginPage@84", + "kind": "function", + "name": "LoginPage", + "qualifiedName": "LoginPage", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 84, + "endLine": 187, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "LoginPage({ onLogin }: LoginPageProps)", + "params": [ + { + "name": "{ onLogin }", + "typeRef": "LoginPageProps", + "optional": false + } + ], + "loc": 104 + }, + { + "id": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "kind": "function", + "name": "handleSsoLogin", + "qualifiedName": "handleSsoLogin", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 90, + "endLine": 119, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "handleSsoLogin()", + "params": [], + "loc": 30, + "interactions": [ + { + "id": "ix:func:src/components/LoginPage.tsx#handleSsoLogin@90:api:out:GET:`/api/auth/sso-login-url?state=${encodeURIComponent(state)}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "`/api/auth/sso-login-url?state=${encodeURIComponent(state)}`" + }, + { + "id": "ix:func:src/components/LoginPage.tsx#handleSsoLogin@90:api:out:POST:/api/auth/sso-login", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/sso-login" + } + ] + }, + { + "id": "func:src/components/LoginPage.tsx#handleDevLogin@121", + "kind": "function", + "name": "handleDevLogin", + "qualifiedName": "handleDevLogin", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 121, + "endLine": 141, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "handleDevLogin()", + "params": [], + "loc": 21, + "interactions": [ + { + "id": "ix:func:src/components/LoginPage.tsx#handleDevLogin@121:api:out:POST:/api/auth/dev-login", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/dev-login" + } + ] + }, + { + "id": "func:src/components/TagManager.tsx#TagManager@11", + "kind": "function", + "name": "TagManager", + "qualifiedName": "TagManager", + "location": { + "file": "src/components/TagManager.tsx", + "startLine": 11, + "endLine": 157, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TagManager.tsx", + "moduleId": "module:src/components", + "signature": "TagManager({ tags, onCreateTag, onDeleteTag }: TagManagerProps)", + "params": [ + { + "name": "{ tags, onCreateTag, onDeleteTag }", + "typeRef": "TagManagerProps", + "optional": false + } + ], + "loc": 147 + }, + { + "id": "func:src/components/TagManager.tsx#useMemo() 回调@17@17", + "kind": "function", + "name": "useMemo() 回调@17", + "qualifiedName": "useMemo() 回调@17", + "location": { + "file": "src/components/TagManager.tsx", + "startLine": 17, + "endLine": 21, + "startCol": 32, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TagManager.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@17()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/TagManager.tsx#handleSubmit@23", + "kind": "function", + "name": "handleSubmit", + "qualifiedName": "handleSubmit", + "location": { + "file": "src/components/TagManager.tsx", + "startLine": 23, + "endLine": 39, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TagManager.tsx", + "moduleId": "module:src/components", + "signature": "handleSubmit(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/TagManager.tsx#匿名函数@136@136", + "kind": "function", + "name": "匿名函数@136", + "qualifiedName": "匿名函数@136", + "location": { + "file": "src/components/TagManager.tsx", + "startLine": 136, + "endLine": 140, + "startCol": 34, + "endCol": 26 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TagManager.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@136()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", + "kind": "function", + "name": "emptyTemplateDraft", + "qualifiedName": "emptyTemplateDraft", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 18, + "endLine": 25, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "emptyTemplateDraft(): TemplateDraft", + "params": [], + "returnType": "TemplateDraft", + "loc": 8 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", + "kind": "function", + "name": "createDefaultTemplateNode", + "qualifiedName": "createDefaultTemplateNode", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 27, + "endLine": 44, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "createDefaultTemplateNode(): WorkflowNode", + "params": [], + "returnType": "WorkflowNode", + "loc": 18 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "kind": "function", + "name": "getUniqueTemplateName", + "qualifiedName": "getUniqueTemplateName", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 46, + "endLine": 55, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "getUniqueTemplateName(baseName: string, templates: ProjectTemplate[])", + "params": [ + { + "name": "baseName", + "typeRef": "string", + "optional": false + }, + { + "name": "templates", + "typeRef": "ProjectTemplate[]", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "kind": "function", + "name": "normalizeDraft", + "qualifiedName": "normalizeDraft", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 57, + "endLine": 64, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "normalizeDraft(draft: TemplateDraft): Omit", + "params": [ + { + "name": "draft", + "typeRef": "TemplateDraft", + "optional": false + } + ], + "returnType": "Omit", + "loc": 8 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", + "kind": "function", + "name": "toCanvasTask", + "qualifiedName": "toCanvasTask", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 66, + "endLine": 83, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "toCanvasTask(draft: TemplateDraft): Task", + "params": [ + { + "name": "draft", + "typeRef": "TemplateDraft", + "optional": false + } + ], + "returnType": "Task", + "loc": 18 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", + "kind": "function", + "name": "ProjectTemplateManager", + "qualifiedName": "ProjectTemplateManager", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 85, + "endLine": 534, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "ProjectTemplateManager({\n availableTags,\n templates,\n onCreateTemplate,\n onUpdateTemplate,\n onDeleteTemplate,\n}: ProjectTemplateManagerProps)", + "params": [ + { + "name": "{\n availableTags,\n templates,\n onCreateTemplate,\n onUpdateTemplate,\n onDeleteTemplate,\n}", + "typeRef": "ProjectTemplateManagerProps", + "optional": false + } + ], + "loc": 450 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#useEffect() 回调@104@104", + "kind": "function", + "name": "useEffect() 回调@104", + "qualifiedName": "useEffect() 回调@104", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 104, + "endLine": 109, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@104()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#toggleTag@111", + "kind": "function", + "name": "toggleTag", + "qualifiedName": "toggleTag", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 111, + "endLine": 118, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "toggleTag(tagName: string)", + "params": [ + { + "name": "tagName", + "typeRef": "string", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "function", + "name": "loadTemplateIntoEditor", + "qualifiedName": "loadTemplateIntoEditor", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 120, + "endLine": 130, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "loadTemplateIntoEditor(template: ProjectTemplate)", + "params": [ + { + "name": "template", + "typeRef": "ProjectTemplate", + "optional": false + } + ], + "loc": 11 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", + "kind": "function", + "name": "handleNewTemplate", + "qualifiedName": "handleNewTemplate", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 132, + "endLine": 152, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "handleNewTemplate()", + "params": [], + "loc": 21 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", + "kind": "function", + "name": "handleSaveTemplate", + "qualifiedName": "handleSaveTemplate", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 154, + "endLine": 179, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "handleSaveTemplate(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 26 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", + "kind": "function", + "name": "handleCopyTemplate", + "qualifiedName": "handleCopyTemplate", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 181, + "endLine": 220, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "handleCopyTemplate()", + "params": [], + "loc": 40 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@201@201", + "kind": "function", + "name": "map() 回调@201", + "qualifiedName": "map() 回调@201", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 201, + "endLine": 210, + "startCol": 30, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@201(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", + "kind": "function", + "name": "handleDeleteTemplate", + "qualifiedName": "handleDeleteTemplate", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 222, + "endLine": 245, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "handleDeleteTemplate()", + "params": [], + "loc": 24 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#handleUpdateNodes@247", + "kind": "function", + "name": "handleUpdateNodes", + "qualifiedName": "handleUpdateNodes", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 247, + "endLine": 249, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "handleUpdateNodes(nodes: WorkflowNode[])", + "params": [ + { + "name": "nodes", + "typeRef": "WorkflowNode[]", + "optional": false + } + ], + "loc": 3 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", + "kind": "function", + "name": "updateSelectedNode", + "qualifiedName": "updateSelectedNode", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 251, + "endLine": 258, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "updateSelectedNode(patch: Partial)", + "params": [ + { + "name": "patch", + "typeRef": "Partial", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#deleteSelectedNode@260", + "kind": "function", + "name": "deleteSelectedNode", + "qualifiedName": "deleteSelectedNode", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 260, + "endLine": 273, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "deleteSelectedNode()", + "params": [], + "loc": 14 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308", + "kind": "function", + "name": "map() 回调@308", + "qualifiedName": "map() 回调@308", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 308, + "endLine": 336, + "startCol": 31, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@308(template)", + "params": [ + { + "name": "template", + "optional": false + } + ], + "loc": 29 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393", + "kind": "function", + "name": "map() 回调@393", + "qualifiedName": "map() 回调@393", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 393, + "endLine": 407, + "startCol": 40, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@393(tagDefinition)", + "params": [ + { + "name": "tagDefinition", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@504@504", + "kind": "function", + "name": "map() 回调@504", + "qualifiedName": "map() 回调@504", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 504, + "endLine": 511, + "startCol": 52, + "endCol": 28 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@504(parentId)", + "params": [ + { + "name": "parentId", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 49, + "endLine": 59, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getEffectiveNodeStatus(node: Pick): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 11 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "kind": "function", + "name": "getStatusMeta", + "qualifiedName": "getStatusMeta", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 61, + "endLine": 87, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getStatusMeta(status: EffectiveNodeStatus)", + "params": [ + { + "name": "status", + "typeRef": "EffectiveNodeStatus", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "kind": "function", + "name": "getLinkedNodeClassName", + "qualifiedName": "getLinkedNodeClassName", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 89, + "endLine": 105, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getLinkedNodeClassName(node: WorkflowNode)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getSearchTokens@107", + "kind": "function", + "name": "getSearchTokens", + "qualifiedName": "getSearchTokens", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 107, + "endLine": 121, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getSearchTokens(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "kind": "function", + "name": "NodeEditorDrawer", + "qualifiedName": "NodeEditorDrawer", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 123, + "endLine": 755, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "NodeEditorDrawer({\r\n task,\r\n people,\r\n selectedNodeId,\r\n isLocked,\r\n currentLocation,\r\n showPersonGantt,\r\n onLockedChange,\r\n onSelectNode,\r\n onFocusNode,\r\n onUpdateNodes,\r\n onNavigate,\r\n}: NodeEditorDrawerProps)", + "params": [ + { + "name": "{\r\n task,\r\n people,\r\n selectedNodeId,\r\n isLocked,\r\n currentLocation,\r\n showPersonGantt,\r\n onLockedChange,\r\n onSelectNode,\r\n onFocusNode,\r\n onUpdateNodes,\r\n onNavigate,\r\n}", + "typeRef": "NodeEditorDrawerProps", + "optional": false + } + ], + "loc": 633 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@151@151", + "kind": "function", + "name": "useEffect() 回调@151", + "qualifiedName": "useEffect() 回调@151", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 151, + "endLine": 176, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@151()", + "params": [], + "loc": 26 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#匿名函数@157@157", + "kind": "function", + "name": "匿名函数@157", + "qualifiedName": "匿名函数@157", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 157, + "endLine": 159, + "startCol": 14, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@157()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#setTimeout() 回调@164@164", + "kind": "function", + "name": "setTimeout() 回调@164", + "qualifiedName": "setTimeout() 回调@164", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 164, + "endLine": 167, + "startCol": 30, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "setTimeout() 回调@164()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#匿名函数@173@173", + "kind": "function", + "name": "匿名函数@173", + "qualifiedName": "匿名函数@173", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 173, + "endLine": 175, + "startCol": 12, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@173()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", + "kind": "function", + "name": "useEffect() 回调@178", + "qualifiedName": "useEffect() 回调@178", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 178, + "endLine": 196, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@178()", + "params": [], + "loc": 19 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#filter() 回调@210@210", + "kind": "function", + "name": "filter() 回调@210", + "qualifiedName": "filter() 回调@210", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 210, + "endLine": 218, + "startCol": 40, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "filter() 回调@210(person)", + "params": [ + { + "name": "person", + "optional": false + } + ], + "loc": 9 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "kind": "function", + "name": "getParentLatestEndDate", + "qualifiedName": "getParentLatestEndDate", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 220, + "endLine": 229, + "startCol": 3, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getParentLatestEndDate(node: WorkflowNode | null)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode | null", + "optional": true, + "defaultValue": "drawerNode" + } + ], + "loc": 10 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "kind": "function", + "name": "getMinimumFirstStartDate", + "qualifiedName": "getMinimumFirstStartDate", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 231, + "endLine": 237, + "startCol": 3, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getMinimumFirstStartDate(node: WorkflowNode | null, locked)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode | null", + "optional": true, + "defaultValue": "drawerNode" + }, + { + "name": "locked", + "optional": true, + "defaultValue": "editStartDateLocked" + } + ], + "loc": 7 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", + "kind": "function", + "name": "closeDrawer", + "qualifiedName": "closeDrawer", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 239, + "endLine": 242, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "closeDrawer()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "kind": "function", + "name": "getDraftKey", + "qualifiedName": "getDraftKey", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 244, + "endLine": 249, + "startCol": 3, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getDraftKey(draft: NodeEditDraft)", + "params": [ + { + "name": "draft", + "typeRef": "NodeEditDraft", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "function", + "name": "getCurrentDraft", + "qualifiedName": "getCurrentDraft", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 251, + "endLine": 259, + "startCol": 3, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getCurrentDraft(): NodeEditDraft", + "params": [], + "returnType": "NodeEditDraft", + "loc": 9 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "kind": "function", + "name": "normalizeProgress", + "qualifiedName": "normalizeProgress", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 261, + "endLine": 265, + "startCol": 3, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "normalizeProgress(value: unknown)", + "params": [ + { + "name": "value", + "typeRef": "unknown", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "kind": "function", + "name": "selectResponsible", + "qualifiedName": "selectResponsible", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 267, + "endLine": 273, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "selectResponsible(personName: string)", + "params": [ + { + "name": "personName", + "typeRef": "string", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "function", + "name": "updateSelectedNode", + "qualifiedName": "updateSelectedNode", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 275, + "endLine": 326, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "updateSelectedNode(action: 'auto' | 'complete' | 'reopen', draft, startDateLocked)", + "params": [ + { + "name": "action", + "typeRef": "'auto' | 'complete' | 'reopen'", + "optional": true, + "defaultValue": "'auto'" + }, + { + "name": "draft", + "optional": true, + "defaultValue": "getCurrentDraft()" + }, + { + "name": "startDateLocked", + "optional": true, + "defaultValue": "editStartDateLocked" + } + ], + "loc": 52 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#completeNode@328", + "kind": "function", + "name": "completeNode", + "qualifiedName": "completeNode", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 328, + "endLine": 330, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "completeNode()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#reopenNode@332", + "kind": "function", + "name": "reopenNode", + "qualifiedName": "reopenNode", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 332, + "endLine": 334, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "reopenNode()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "kind": "function", + "name": "changeEditName", + "qualifiedName": "changeEditName", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 336, + "endLine": 339, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "changeEditName(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "kind": "function", + "name": "changeEditDesc", + "qualifiedName": "changeEditDesc", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 341, + "endLine": 344, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "changeEditDesc(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "kind": "function", + "name": "updateTimeRanges", + "qualifiedName": "updateTimeRanges", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 346, + "endLine": 355, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "updateTimeRanges(nextRanges: NodeTimeRange[])", + "params": [ + { + "name": "nextRanges", + "typeRef": "NodeTimeRange[]", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "kind": "function", + "name": "changeTimeRange", + "qualifiedName": "changeTimeRange", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 357, + "endLine": 359, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "changeTimeRange(rangeId: string, patch: Partial)", + "params": [ + { + "name": "rangeId", + "typeRef": "string", + "optional": false + }, + { + "name": "patch", + "typeRef": "Partial", + "optional": false + } + ], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", + "kind": "function", + "name": "addTimeRange", + "qualifiedName": "addTimeRange", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 361, + "endLine": 365, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "addTimeRange()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "kind": "function", + "name": "removeTimeRange", + "qualifiedName": "removeTimeRange", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 367, + "endLine": 370, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "removeTimeRange(rangeId: string)", + "params": [ + { + "name": "rangeId", + "typeRef": "string", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "kind": "function", + "name": "changeProgress", + "qualifiedName": "changeProgress", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 372, + "endLine": 376, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "changeProgress(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", + "kind": "function", + "name": "toggleStartDateLock", + "qualifiedName": "toggleStartDateLock", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 378, + "endLine": 382, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "toggleStartDateLock()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#deleteNode@384", + "kind": "function", + "name": "deleteNode", + "qualifiedName": "deleteNode", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 384, + "endLine": 400, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "deleteNode()", + "params": [], + "loc": 17 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "kind": "function", + "name": "focusLinkedNode", + "qualifiedName": "focusLinkedNode", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 402, + "endLine": 405, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "focusLinkedNode(node: WorkflowNode)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#map() 回调@466@466", + "kind": "function", + "name": "map() 回调@466", + "qualifiedName": "map() 回调@466", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 466, + "endLine": 484, + "startCol": 15, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@466({ id, label, icon: Icon })", + "params": [ + { + "name": "{ id, label, icon: Icon }", + "optional": false + } + ], + "loc": 19 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#匿名函数@524@524", + "kind": "function", + "name": "匿名函数@524", + "qualifiedName": "匿名函数@524", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 524, + "endLine": 526, + "startCol": 31, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@524()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", + "kind": "function", + "name": "map() 回调@676", + "qualifiedName": "map() 回调@676", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 676, + "endLine": 693, + "startCol": 44, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@676(parentId)", + "params": [ + { + "name": "parentId", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "kind": "function", + "name": "getDropBeforeTaskId", + "qualifiedName": "getDropBeforeTaskId", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 33, + "endLine": 42, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "getDropBeforeTaskId(container: HTMLElement, clientY: number, draggingTaskId: string | null)", + "params": [ + { + "name": "container", + "typeRef": "HTMLElement", + "optional": false + }, + { + "name": "clientY", + "typeRef": "number", + "optional": false + }, + { + "name": "draggingTaskId", + "typeRef": "string | null", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#find() 回调@37@37", + "kind": "function", + "name": "find() 回调@37", + "qualifiedName": "find() 回调@37", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 37, + "endLine": 40, + "startCol": 29, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "find() 回调@37(element)", + "params": [ + { + "name": "element", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "kind": "function", + "name": "normalizeProgress", + "qualifiedName": "normalizeProgress", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 53, + "endLine": 57, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "normalizeProgress(value: unknown)", + "params": [ + { + "name": "value", + "typeRef": "unknown", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#sortTasks@82", + "kind": "function", + "name": "sortTasks", + "qualifiedName": "sortTasks", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 82, + "endLine": 88, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "sortTasks(tasks: Task[])", + "params": [ + { + "name": "tasks", + "typeRef": "Task[]", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#sort() 回调@83@83", + "kind": "function", + "name": "sort() 回调@83", + "qualifiedName": "sort() 回调@83", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 83, + "endLine": 87, + "startCol": 26, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "sort() 回调@83(a, b)", + "params": [ + { + "name": "a", + "optional": false + }, + { + "name": "b", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 90, + "endLine": 97, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "getEffectiveNodeStatus(node: WorkflowNode, today: string): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + }, + { + "name": "today", + "typeRef": "string", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 8 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", + "kind": "function", + "name": "WeeklyOverview", + "qualifiedName": "WeeklyOverview", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 99, + "endLine": 879, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "WeeklyOverview({\n plans,\n tasks,\n canManageTasks = false,\n onOpenTask,\n onOpenPlan,\n onReorderTask,\n onMoveTaskToPlan,\n}: WeeklyOverviewProps)", + "params": [ + { + "name": "{\n plans,\n tasks,\n canManageTasks = false,\n onOpenTask,\n onOpenPlan,\n onReorderTask,\n onMoveTaskToPlan,\n}", + "typeRef": "WeeklyOverviewProps", + "optional": false + } + ], + "loc": 781 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleBoardMouseDown@118", + "kind": "function", + "name": "handleBoardMouseDown", + "qualifiedName": "handleBoardMouseDown", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 118, + "endLine": 129, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleBoardMouseDown(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 12 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleBoardMouseMove@131", + "kind": "function", + "name": "handleBoardMouseMove", + "qualifiedName": "handleBoardMouseMove", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 131, + "endLine": 136, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleBoardMouseMove(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "kind": "function", + "name": "stopBoardDrag", + "qualifiedName": "stopBoardDrag", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 138, + "endLine": 141, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "stopBoardDrag()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleBoardClickCapture@143", + "kind": "function", + "name": "handleBoardClickCapture", + "qualifiedName": "handleBoardClickCapture", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 143, + "endLine": 148, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleBoardClickCapture(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleDrawerMouseDown@156", + "kind": "function", + "name": "handleDrawerMouseDown", + "qualifiedName": "handleDrawerMouseDown", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 156, + "endLine": 168, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleDrawerMouseDown(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 13 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleDrawerMouseMove@170", + "kind": "function", + "name": "handleDrawerMouseMove", + "qualifiedName": "handleDrawerMouseMove", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 170, + "endLine": 194, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleDrawerMouseMove(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 25 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#stopDrawerDrag@196", + "kind": "function", + "name": "stopDrawerDrag", + "qualifiedName": "stopDrawerDrag", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 196, + "endLine": 199, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "stopDrawerDrag()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "kind": "function", + "name": "clearTaskDragState", + "qualifiedName": "clearTaskDragState", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 207, + "endLine": 212, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "clearTaskDragState()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "kind": "function", + "name": "handleTaskDragStart", + "qualifiedName": "handleTaskDragStart", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 214, + "endLine": 225, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleTaskDragStart(event: React.DragEvent, task: Task)", + "params": [ + { + "name": "event", + "typeRef": "React.DragEvent", + "optional": false + }, + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "loc": 12 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "kind": "function", + "name": "handleColumnDragOver", + "qualifiedName": "handleColumnDragOver", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 227, + "endLine": 235, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleColumnDragOver(event: React.DragEvent, planId: string)", + "params": [ + { + "name": "event", + "typeRef": "React.DragEvent", + "optional": false + }, + { + "name": "planId", + "typeRef": "string", + "optional": false + } + ], + "loc": 9 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "kind": "function", + "name": "handleColumnDrop", + "qualifiedName": "handleColumnDrop", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 237, + "endLine": 254, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleColumnDrop(event: React.DragEvent, planId: string)", + "params": [ + { + "name": "event", + "typeRef": "React.DragEvent", + "optional": false + }, + { + "name": "planId", + "typeRef": "string", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#useMemo() 回调@261@261", + "kind": "function", + "name": "useMemo() 回调@261", + "qualifiedName": "useMemo() 回调@261", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 261, + "endLine": 269, + "startCol": 31, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@261()", + "params": [], + "loc": 9 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#forEach() 回调@263@263", + "kind": "function", + "name": "forEach() 回调@263", + "qualifiedName": "forEach() 回调@263", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 263, + "endLine": 267, + "startCol": 19, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@263(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#sort() 回调@273@273", + "kind": "function", + "name": "sort() 回调@273", + "qualifiedName": "sort() 回调@273", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 273, + "endLine": 279, + "startCol": 23, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "sort() 回调@273(a, b)", + "params": [ + { + "name": "a", + "optional": false + }, + { + "name": "b", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", + "kind": "function", + "name": "toggleSelectedPriority", + "qualifiedName": "toggleSelectedPriority", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 283, + "endLine": 287, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "toggleSelectedPriority(priority: TaskPriority)", + "params": [ + { + "name": "priority", + "typeRef": "TaskPriority", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#matchesFilters@290", + "kind": "function", + "name": "matchesFilters", + "qualifiedName": "matchesFilters", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 290, + "endLine": 300, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "matchesFilters(task: Task)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "loc": 11 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", + "kind": "function", + "name": "map() 回调@335", + "qualifiedName": "map() 回调@335", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 335, + "endLine": 350, + "startCol": 32, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@335(priority)", + "params": [ + { + "name": "priority", + "optional": false + } + ], + "loc": 16 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "kind": "function", + "name": "map() 回调@382", + "qualifiedName": "map() 回调@382", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 382, + "endLine": 620, + "startCol": 31, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@382(plan)", + "params": [ + { + "name": "plan", + "optional": false + } + ], + "loc": 239 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394", + "kind": "function", + "name": "reduce() 回调@394", + "qualifiedName": "reduce() 回调@394", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 394, + "endLine": 397, + "startCol": 17, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "reduce() 回调@394(counts, task)", + "params": [ + { + "name": "counts", + "optional": false + }, + { + "name": "task", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#匿名函数@494@494", + "kind": "function", + "name": "匿名函数@494", + "qualifiedName": "匿名函数@494", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 494, + "endLine": 499, + "startCol": 34, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@494(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "kind": "function", + "name": "map() 回调@513", + "qualifiedName": "map() 回调@513", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 513, + "endLine": 612, + "startCol": 41, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@513(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 100 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "kind": "function", + "name": "匿名函数@644", + "qualifiedName": "匿名函数@644", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 644, + "endLine": 775, + "startCol": 25, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@644()", + "params": [], + "loc": 132 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "kind": "function", + "name": "map() 回调@721", + "qualifiedName": "map() 回调@721", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 721, + "endLine": 757, + "startCol": 40, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@721(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 37 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#匿名函数@777@777", + "kind": "function", + "name": "匿名函数@777", + "qualifiedName": "匿名函数@777", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 777, + "endLine": 875, + "startCol": 25, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@777()", + "params": [], + "loc": 99 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785", + "kind": "function", + "name": "reduce() 回调@785", + "qualifiedName": "reduce() 回调@785", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 785, + "endLine": 788, + "startCol": 13, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "reduce() 回调@785(counts, task)", + "params": [ + { + "name": "counts", + "optional": false + }, + { + "name": "task", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#map() 回调@840@840", + "kind": "function", + "name": "map() 回调@840", + "qualifiedName": "map() 回调@840", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 840, + "endLine": 858, + "startCol": 39, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@840(status)", + "params": [ + { + "name": "status", + "optional": false + } + ], + "loc": 19 + }, + { + "id": "func:src/App.tsx#readApiError@39", + "kind": "function", + "name": "readApiError", + "qualifiedName": "readApiError", + "location": { + "file": "src/App.tsx", + "startLine": 39, + "endLine": 42, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "readApiError(res: Response, fallback: string)", + "params": [ + { + "name": "res", + "typeRef": "Response", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/App.tsx#readApiJson@44", + "kind": "function", + "name": "readApiJson", + "qualifiedName": "readApiJson", + "location": { + "file": "src/App.tsx", + "startLine": 44, + "endLine": 52, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "readApiJson(res: Response, fallback: string): Promise", + "params": [ + { + "name": "res", + "typeRef": "Response", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 9 + }, + { + "id": "func:src/App.tsx#sortTasksForList@54", + "kind": "function", + "name": "sortTasksForList", + "qualifiedName": "sortTasksForList", + "location": { + "file": "src/App.tsx", + "startLine": 54, + "endLine": 60, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "sortTasksForList(tasks: Task[])", + "params": [ + { + "name": "tasks", + "typeRef": "Task[]", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/App.tsx#sort() 回调@55@55", + "kind": "function", + "name": "sort() 回调@55", + "qualifiedName": "sort() 回调@55", + "location": { + "file": "src/App.tsx", + "startLine": 55, + "endLine": 59, + "startCol": 26, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "sort() 回调@55(a, b)", + "params": [ + { + "name": "a", + "optional": false + }, + { + "name": "b", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/App.tsx#readStoredAuthUser@62", + "kind": "function", + "name": "readStoredAuthUser", + "qualifiedName": "readStoredAuthUser", + "location": { + "file": "src/App.tsx", + "startLine": 62, + "endLine": 82, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "readStoredAuthUser(): AuthUser | null", + "params": [], + "returnType": "AuthUser | null", + "loc": 21 + }, + { + "id": "func:src/App.tsx#App@84", + "kind": "function", + "name": "App", + "qualifiedName": "App", + "location": { + "file": "src/App.tsx", + "startLine": 84, + "endLine": 1974, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "App()", + "params": [], + "loc": 1891 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@133@133", + "kind": "function", + "name": "useEffect() 回调@133", + "qualifiedName": "useEffect() 回调@133", + "location": { + "file": "src/App.tsx", + "startLine": 133, + "endLine": 145, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@133()", + "params": [], + "loc": 13 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@147@147", + "kind": "function", + "name": "useEffect() 回调@147", + "qualifiedName": "useEffect() 回调@147", + "location": { + "file": "src/App.tsx", + "startLine": 147, + "endLine": 151, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@147()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@153@153", + "kind": "function", + "name": "useEffect() 回调@153", + "qualifiedName": "useEffect() 回调@153", + "location": { + "file": "src/App.tsx", + "startLine": 153, + "endLine": 157, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@153()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@159@159", + "kind": "function", + "name": "useEffect() 回调@159", + "qualifiedName": "useEffect() 回调@159", + "location": { + "file": "src/App.tsx", + "startLine": 159, + "endLine": 164, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@159()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@171@171", + "kind": "function", + "name": "useEffect() 回调@171", + "qualifiedName": "useEffect() 回调@171", + "location": { + "file": "src/App.tsx", + "startLine": 171, + "endLine": 176, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@171()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@178@178", + "kind": "function", + "name": "useEffect() 回调@178", + "qualifiedName": "useEffect() 回调@178", + "location": { + "file": "src/App.tsx", + "startLine": 178, + "endLine": 184, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@178()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@186@186", + "kind": "function", + "name": "useEffect() 回调@186", + "qualifiedName": "useEffect() 回调@186", + "location": { + "file": "src/App.tsx", + "startLine": 186, + "endLine": 211, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@186()", + "params": [], + "loc": 26 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@213@213", + "kind": "function", + "name": "useEffect() 回调@213", + "qualifiedName": "useEffect() 回调@213", + "location": { + "file": "src/App.tsx", + "startLine": 213, + "endLine": 219, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@213()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/App.tsx#匿名函数@214@214", + "kind": "function", + "name": "匿名函数@214", + "qualifiedName": "匿名函数@214", + "location": { + "file": "src/App.tsx", + "startLine": 214, + "endLine": 218, + "startCol": 12, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "匿名函数@214()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/App.tsx#fetchTasks@221", + "kind": "function", + "name": "fetchTasks", + "qualifiedName": "fetchTasks", + "location": { + "file": "src/App.tsx", + "startLine": 221, + "endLine": 239, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "fetchTasks()", + "params": [], + "loc": 19, + "interactions": [ + { + "id": "ix:func:src/App.tsx#fetchTasks@221:api:out:GET:/api/tasks", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/tasks" + } + ] + }, + { + "id": "func:src/App.tsx#fetchPeople@241", + "kind": "function", + "name": "fetchPeople", + "qualifiedName": "fetchPeople", + "location": { + "file": "src/App.tsx", + "startLine": 241, + "endLine": 254, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "fetchPeople()", + "params": [], + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/App.tsx#fetchPeople@241:api:out:GET:/api/people", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/people" + } + ] + }, + { + "id": "func:src/App.tsx#fetchTags@256", + "kind": "function", + "name": "fetchTags", + "qualifiedName": "fetchTags", + "location": { + "file": "src/App.tsx", + "startLine": 256, + "endLine": 269, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "fetchTags()", + "params": [], + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/App.tsx#fetchTags@256:api:out:GET:/api/tags", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/tags" + } + ] + }, + { + "id": "func:src/App.tsx#handleCreateTag@271", + "kind": "function", + "name": "handleCreateTag", + "qualifiedName": "handleCreateTag", + "location": { + "file": "src/App.tsx", + "startLine": 271, + "endLine": 295, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCreateTag(name: string): Promise", + "params": [ + { + "name": "name", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 25, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleCreateTag@271:api:out:POST:/api/tags", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tags" + } + ] + }, + { + "id": "func:src/App.tsx#setTags() 回调@281@281", + "kind": "function", + "name": "setTags() 回调@281", + "qualifiedName": "setTags() 回调@281", + "location": { + "file": "src/App.tsx", + "startLine": 281, + "endLine": 284, + "startCol": 17, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "setTags() 回调@281(prev)", + "params": [ + { + "name": "prev", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/App.tsx#handleDeleteTag@297", + "kind": "function", + "name": "handleDeleteTag", + "qualifiedName": "handleDeleteTag", + "location": { + "file": "src/App.tsx", + "startLine": 297, + "endLine": 321, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleDeleteTag(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 25, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleDeleteTag@297:api:out:DELETE:`/api/tags/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "`/api/tags/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#fetchProjectTemplates@323", + "kind": "function", + "name": "fetchProjectTemplates", + "qualifiedName": "fetchProjectTemplates", + "location": { + "file": "src/App.tsx", + "startLine": 323, + "endLine": 336, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "fetchProjectTemplates()", + "params": [], + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/App.tsx#fetchProjectTemplates@323:api:out:GET:/api/project-templates", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/project-templates" + } + ] + }, + { + "id": "func:src/App.tsx#fetchWeeklyPlans@338", + "kind": "function", + "name": "fetchWeeklyPlans", + "qualifiedName": "fetchWeeklyPlans", + "location": { + "file": "src/App.tsx", + "startLine": 338, + "endLine": 351, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "fetchWeeklyPlans()", + "params": [], + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/App.tsx#fetchWeeklyPlans@338:api:out:GET:/api/weekly-plans", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/weekly-plans" + } + ] + }, + { + "id": "func:src/App.tsx#handleCreateWeeklyPlan@353", + "kind": "function", + "name": "handleCreateWeeklyPlan", + "qualifiedName": "handleCreateWeeklyPlan", + "location": { + "file": "src/App.tsx", + "startLine": 353, + "endLine": 383, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCreateWeeklyPlan(input: Omit): Promise", + "params": [ + { + "name": "input", + "typeRef": "Omit", + "optional": false + } + ], + "returnType": "Promise", + "loc": 31, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleCreateWeeklyPlan@353:api:out:POST:/api/weekly-plans", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/weekly-plans" + } + ] + }, + { + "id": "func:src/App.tsx#handleDeleteWeeklyPlan@385", + "kind": "function", + "name": "handleDeleteWeeklyPlan", + "qualifiedName": "handleDeleteWeeklyPlan", + "location": { + "file": "src/App.tsx", + "startLine": 385, + "endLine": 425, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleDeleteWeeklyPlan(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 41, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleDeleteWeeklyPlan@385:api:out:DELETE:`/api/weekly-plans/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "`/api/weekly-plans/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#setWeeklyPlans() 回调@402@402", + "kind": "function", + "name": "setWeeklyPlans() 回调@402", + "qualifiedName": "setWeeklyPlans() 回调@402", + "location": { + "file": "src/App.tsx", + "startLine": 402, + "endLine": 407, + "startCol": 22, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "setWeeklyPlans() 回调@402(prev)", + "params": [ + { + "name": "prev", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/App.tsx#handleCreateProjectTemplate@427", + "kind": "function", + "name": "handleCreateProjectTemplate", + "qualifiedName": "handleCreateProjectTemplate", + "location": { + "file": "src/App.tsx", + "startLine": 427, + "endLine": 448, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCreateProjectTemplate(input: Omit): Promise", + "params": [ + { + "name": "input", + "typeRef": "Omit", + "optional": false + } + ], + "returnType": "Promise", + "loc": 22, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleCreateProjectTemplate@427:api:out:POST:/api/project-templates", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/project-templates" + } + ] + }, + { + "id": "func:src/App.tsx#handleUpdateProjectTemplate@450", + "kind": "function", + "name": "handleUpdateProjectTemplate", + "qualifiedName": "handleUpdateProjectTemplate", + "location": { + "file": "src/App.tsx", + "startLine": 450, + "endLine": 476, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleUpdateProjectTemplate(id: string, input: Omit): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "Omit", + "optional": false + } + ], + "returnType": "Promise", + "loc": 27, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleUpdateProjectTemplate@450:api:out:PUT:`/api/project-templates/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "`/api/project-templates/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleDeleteProjectTemplate@478", + "kind": "function", + "name": "handleDeleteProjectTemplate", + "qualifiedName": "handleDeleteProjectTemplate", + "location": { + "file": "src/App.tsx", + "startLine": 478, + "endLine": 496, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleDeleteProjectTemplate(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 19, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleDeleteProjectTemplate@478:api:out:DELETE:`/api/project-templates/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "`/api/project-templates/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleCreatePerson@498", + "kind": "function", + "name": "handleCreatePerson", + "qualifiedName": "handleCreatePerson", + "location": { + "file": "src/App.tsx", + "startLine": 498, + "endLine": 519, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCreatePerson(input: { name: string; role: string })", + "params": [ + { + "name": "input", + "typeRef": "{ name: string; role: string }", + "optional": false + } + ], + "loc": 22, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleCreatePerson@498:api:out:POST:/api/people", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/people" + } + ] + }, + { + "id": "func:src/App.tsx#setPeople() 回调@508@508", + "kind": "function", + "name": "setPeople() 回调@508", + "qualifiedName": "setPeople() 回调@508", + "location": { + "file": "src/App.tsx", + "startLine": 508, + "endLine": 511, + "startCol": 19, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "setPeople() 回调@508(prev)", + "params": [ + { + "name": "prev", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/App.tsx#handleJoinSsoPerson@521", + "kind": "function", + "name": "handleJoinSsoPerson", + "qualifiedName": "handleJoinSsoPerson", + "location": { + "file": "src/App.tsx", + "startLine": 521, + "endLine": 546, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleJoinSsoPerson(authCode: string): Promise", + "params": [ + { + "name": "authCode", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 26, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleJoinSsoPerson@521:api:out:POST:/api/auth/sso-join-person", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/sso-join-person" + } + ] + }, + { + "id": "func:src/App.tsx#setPeople() 回调@532@532", + "kind": "function", + "name": "setPeople() 回调@532", + "qualifiedName": "setPeople() 回调@532", + "location": { + "file": "src/App.tsx", + "startLine": 532, + "endLine": 535, + "startCol": 19, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "setPeople() 回调@532(prev)", + "params": [ + { + "name": "prev", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/App.tsx#handleDeletePerson@548", + "kind": "function", + "name": "handleDeletePerson", + "qualifiedName": "handleDeletePerson", + "location": { + "file": "src/App.tsx", + "startLine": 548, + "endLine": 563, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleDeletePerson(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 16, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleDeletePerson@548:api:out:DELETE:`/api/people/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "`/api/people/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleUpdatePersonRole@565", + "kind": "function", + "name": "handleUpdatePersonRole", + "qualifiedName": "handleUpdatePersonRole", + "location": { + "file": "src/App.tsx", + "startLine": 565, + "endLine": 603, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleUpdatePersonRole(person: Person, role: string)", + "params": [ + { + "name": "person", + "typeRef": "Person", + "optional": false + }, + { + "name": "role", + "typeRef": "string", + "optional": false + } + ], + "loc": 39, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleUpdatePersonRole@565:api:out:PUT:`/api/people/${person.id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "`/api/people/${person.id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleTogglePersonAdmin@605", + "kind": "function", + "name": "handleTogglePersonAdmin", + "qualifiedName": "handleTogglePersonAdmin", + "location": { + "file": "src/App.tsx", + "startLine": 605, + "endLine": 637, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleTogglePersonAdmin(person: Person, isPersonAdmin: boolean)", + "params": [ + { + "name": "person", + "typeRef": "Person", + "optional": false + }, + { + "name": "isPersonAdmin", + "typeRef": "boolean", + "optional": false + } + ], + "loc": 33, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleTogglePersonAdmin@605:api:out:PUT:`/api/people/${person.id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "`/api/people/${person.id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleLogin@639", + "kind": "function", + "name": "handleLogin", + "qualifiedName": "handleLogin", + "location": { + "file": "src/App.tsx", + "startLine": 639, + "endLine": 648, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleLogin(user: AuthUser)", + "params": [ + { + "name": "user", + "typeRef": "AuthUser", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/App.tsx#handleUnlockAdmin@650", + "kind": "function", + "name": "handleUnlockAdmin", + "qualifiedName": "handleUnlockAdmin", + "location": { + "file": "src/App.tsx", + "startLine": 650, + "endLine": 676, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleUnlockAdmin(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 27, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleUnlockAdmin@650:api:out:POST:/api/auth/manual-login", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/manual-login" + } + ] + }, + { + "id": "func:src/App.tsx#handleCurrentUserClick@678", + "kind": "function", + "name": "handleCurrentUserClick", + "qualifiedName": "handleCurrentUserClick", + "location": { + "file": "src/App.tsx", + "startLine": 678, + "endLine": 694, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCurrentUserClick()", + "params": [], + "loc": 17 + }, + { + "id": "func:src/App.tsx#handleLogout@696", + "kind": "function", + "name": "handleLogout", + "qualifiedName": "handleLogout", + "location": { + "file": "src/App.tsx", + "startLine": 696, + "endLine": 717, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleLogout()", + "params": [], + "loc": 22 + }, + { + "id": "func:src/App.tsx#useMemo() 回调@720@720", + "kind": "function", + "name": "useMemo() 回调@720", + "qualifiedName": "useMemo() 回调@720", + "location": { + "file": "src/App.tsx", + "startLine": 720, + "endLine": 724, + "startCol": 32, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useMemo() 回调@720()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/App.tsx#useMemo() 回调@726@726", + "kind": "function", + "name": "useMemo() 回调@726", + "qualifiedName": "useMemo() 回调@726", + "location": { + "file": "src/App.tsx", + "startLine": 726, + "endLine": 728, + "startCol": 30, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useMemo() 回调@726()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/App.tsx#useMemo() 回调@730@730", + "kind": "function", + "name": "useMemo() 回调@730", + "qualifiedName": "useMemo() 回调@730", + "location": { + "file": "src/App.tsx", + "startLine": 730, + "endLine": 732, + "startCol": 43, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useMemo() 回调@730()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@734@734", + "kind": "function", + "name": "useEffect() 回调@734", + "qualifiedName": "useEffect() 回调@734", + "location": { + "file": "src/App.tsx", + "startLine": 734, + "endLine": 748, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@734()", + "params": [], + "loc": 15 + }, + { + "id": "func:src/App.tsx#handleSelectWeeklyPlan@750", + "kind": "function", + "name": "handleSelectWeeklyPlan", + "qualifiedName": "handleSelectWeeklyPlan", + "location": { + "file": "src/App.tsx", + "startLine": 750, + "endLine": 759, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleSelectWeeklyPlan(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", + "kind": "function", + "name": "handleMoveTaskToWeeklyPlan", + "qualifiedName": "handleMoveTaskToWeeklyPlan", + "location": { + "file": "src/App.tsx", + "startLine": 761, + "endLine": 796, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleMoveTaskToWeeklyPlan(taskId: string, weeklyPlanId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "weeklyPlanId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 36, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761:api:out:PUT:`/api/tasks/${taskId}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "`/api/tasks/${taskId}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleReorderTask@798", + "kind": "function", + "name": "handleReorderTask", + "qualifiedName": "handleReorderTask", + "location": { + "file": "src/App.tsx", + "startLine": 798, + "endLine": 847, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleReorderTask(taskId: string, beforeTaskId: string | null)", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "beforeTaskId", + "typeRef": "string | null", + "optional": false + } + ], + "loc": 50, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleReorderTask@798:api:out:PATCH:`/api/tasks/${task.id}/list-state`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PATCH", + "path": "`/api/tasks/${task.id}/list-state`" + } + ] + }, + { + "id": "func:src/App.tsx#handleSelectTask@849", + "kind": "function", + "name": "handleSelectTask", + "qualifiedName": "handleSelectTask", + "location": { + "file": "src/App.tsx", + "startLine": 849, + "endLine": 854, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleSelectTask(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/App.tsx#handleStartCreateProject@856", + "kind": "function", + "name": "handleStartCreateProject", + "qualifiedName": "handleStartCreateProject", + "location": { + "file": "src/App.tsx", + "startLine": 856, + "endLine": 863, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleStartCreateProject()", + "params": [], + "loc": 8 + }, + { + "id": "func:src/App.tsx#handleCancelCreateProject@865", + "kind": "function", + "name": "handleCancelCreateProject", + "qualifiedName": "handleCancelCreateProject", + "location": { + "file": "src/App.tsx", + "startLine": 865, + "endLine": 868, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCancelCreateProject()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/App.tsx#handleSelectNode@870", + "kind": "function", + "name": "handleSelectNode", + "qualifiedName": "handleSelectNode", + "location": { + "file": "src/App.tsx", + "startLine": 870, + "endLine": 875, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleSelectNode(nodeId: string | null)", + "params": [ + { + "name": "nodeId", + "typeRef": "string | null", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/App.tsx#handleOpenTaskFromOverview@877", + "kind": "function", + "name": "handleOpenTaskFromOverview", + "qualifiedName": "handleOpenTaskFromOverview", + "location": { + "file": "src/App.tsx", + "startLine": 877, + "endLine": 886, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleOpenTaskFromOverview(task: Task)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/App.tsx#handleOpenPlanFromOverview@888", + "kind": "function", + "name": "handleOpenPlanFromOverview", + "qualifiedName": "handleOpenPlanFromOverview", + "location": { + "file": "src/App.tsx", + "startLine": 888, + "endLine": 897, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleOpenPlanFromOverview(planId: string)", + "params": [ + { + "name": "planId", + "typeRef": "string", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/App.tsx#handleSelectTaskNode@899", + "kind": "function", + "name": "handleSelectTaskNode", + "qualifiedName": "handleSelectTaskNode", + "location": { + "file": "src/App.tsx", + "startLine": 899, + "endLine": 907, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleSelectTaskNode(taskId: string, nodeId: string)", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodeId", + "typeRef": "string", + "optional": false + } + ], + "loc": 9 + }, + { + "id": "func:src/App.tsx#handleNavigateDrawerView@926", + "kind": "function", + "name": "handleNavigateDrawerView", + "qualifiedName": "handleNavigateDrawerView", + "location": { + "file": "src/App.tsx", + "startLine": 926, + "endLine": 955, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleNavigateDrawerView(target: 'project-graph' | 'project-gantt' | 'person-gantt')", + "params": [ + { + "name": "target", + "typeRef": "'project-graph' | 'project-gantt' | 'person-gantt'", + "optional": false + } + ], + "loc": 30 + }, + { + "id": "func:src/App.tsx#handleWorkspaceClick@957", + "kind": "function", + "name": "handleWorkspaceClick", + "qualifiedName": "handleWorkspaceClick", + "location": { + "file": "src/App.tsx", + "startLine": 957, + "endLine": 978, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleWorkspaceClick(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 22 + }, + { + "id": "func:src/App.tsx#computeCenteredViewport@981", + "kind": "function", + "name": "computeCenteredViewport", + "qualifiedName": "computeCenteredViewport", + "location": { + "file": "src/App.tsx", + "startLine": 981, + "endLine": 1014, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "computeCenteredViewport(task: Task)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "loc": 34 + }, + { + "id": "func:src/App.tsx#focusNodeInCanvas@1016", + "kind": "function", + "name": "focusNodeInCanvas", + "qualifiedName": "focusNodeInCanvas", + "location": { + "file": "src/App.tsx", + "startLine": 1016, + "endLine": 1062, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "focusNodeInCanvas(node: WorkflowNode)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 47 + }, + { + "id": "func:src/App.tsx#animate@1042", + "kind": "function", + "name": "animate", + "qualifiedName": "animate", + "location": { + "file": "src/App.tsx", + "startLine": 1042, + "endLine": 1059, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "animate(now: number)", + "params": [ + { + "name": "now", + "typeRef": "number", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", + "kind": "function", + "name": "revealNodeIfCoveredByDrawer", + "qualifiedName": "revealNodeIfCoveredByDrawer", + "location": { + "file": "src/App.tsx", + "startLine": 1064, + "endLine": 1107, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "revealNodeIfCoveredByDrawer(node: WorkflowNode)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 44 + }, + { + "id": "func:src/App.tsx#animate@1088", + "kind": "function", + "name": "animate", + "qualifiedName": "animate", + "location": { + "file": "src/App.tsx", + "startLine": 1088, + "endLine": 1104, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "animate(now: number)", + "params": [ + { + "name": "now", + "typeRef": "number", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@1109@1109", + "kind": "function", + "name": "useEffect() 回调@1109", + "qualifiedName": "useEffect() 回调@1109", + "location": { + "file": "src/App.tsx", + "startLine": 1109, + "endLine": 1119, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@1109()", + "params": [], + "loc": 11 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@1121@1121", + "kind": "function", + "name": "useEffect() 回调@1121", + "qualifiedName": "useEffect() 回调@1121", + "location": { + "file": "src/App.tsx", + "startLine": 1121, + "endLine": 1130, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@1121()", + "params": [], + "loc": 10 + }, + { + "id": "func:src/App.tsx#useLayoutEffect() 回调@1134@1134", + "kind": "function", + "name": "useLayoutEffect() 回调@1134", + "qualifiedName": "useLayoutEffect() 回调@1134", + "location": { + "file": "src/App.tsx", + "startLine": 1134, + "endLine": 1162, + "startCol": 19, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useLayoutEffect() 回调@1134()", + "params": [], + "loc": 29 + }, + { + "id": "func:src/App.tsx#applyCentered@1149", + "kind": "function", + "name": "applyCentered", + "qualifiedName": "applyCentered", + "location": { + "file": "src/App.tsx", + "startLine": 1149, + "endLine": 1156, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "applyCentered()", + "params": [], + "loc": 8 + }, + { + "id": "func:src/App.tsx#handleCreateTask@1165", + "kind": "function", + "name": "handleCreateTask", + "qualifiedName": "handleCreateTask", + "location": { + "file": "src/App.tsx", + "startLine": 1165, + "endLine": 1209, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCreateTask(name: string, description: string, priority: TaskPriority, tags: string[], requirementDocUrl: string, nodes: WorkflowNode[]): Promise", + "params": [ + { + "name": "name", + "typeRef": "string", + "optional": false + }, + { + "name": "description", + "typeRef": "string", + "optional": false + }, + { + "name": "priority", + "typeRef": "TaskPriority", + "optional": false + }, + { + "name": "tags", + "typeRef": "string[]", + "optional": false + }, + { + "name": "requirementDocUrl", + "typeRef": "string", + "optional": false + }, + { + "name": "nodes", + "typeRef": "WorkflowNode[]", + "optional": true + } + ], + "returnType": "Promise", + "loc": 45, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleCreateTask@1165:api:out:POST:/api/tasks", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tasks" + } + ] + }, + { + "id": "func:src/App.tsx#handleQuickRequirement@1212", + "kind": "function", + "name": "handleQuickRequirement", + "qualifiedName": "handleQuickRequirement", + "location": { + "file": "src/App.tsx", + "startLine": 1212, + "endLine": 1217, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleQuickRequirement()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/App.tsx#handleSubmitRequirement@1219", + "kind": "function", + "name": "handleSubmitRequirement", + "qualifiedName": "handleSubmitRequirement", + "location": { + "file": "src/App.tsx", + "startLine": 1219, + "endLine": 1276, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleSubmitRequirement(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 58, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleSubmitRequirement@1219:api:out:POST:/api/tasks", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tasks" + } + ] + }, + { + "id": "func:src/App.tsx#handleToggleTaskPinned@1278", + "kind": "function", + "name": "handleToggleTaskPinned", + "qualifiedName": "handleToggleTaskPinned", + "location": { + "file": "src/App.tsx", + "startLine": 1278, + "endLine": 1296, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleToggleTaskPinned(taskId: string, isPinned: boolean)", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "isPinned", + "typeRef": "boolean", + "optional": false + } + ], + "loc": 19, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleToggleTaskPinned@1278:api:out:PATCH:`/api/tasks/${taskId}/list-state`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PATCH", + "path": "`/api/tasks/${taskId}/list-state`" + } + ] + }, + { + "id": "func:src/App.tsx#handleDeleteTask@1299", + "kind": "function", + "name": "handleDeleteTask", + "qualifiedName": "handleDeleteTask", + "location": { + "file": "src/App.tsx", + "startLine": 1299, + "endLine": 1326, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleDeleteTask(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 28, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleDeleteTask@1299:api:out:DELETE:`/api/tasks/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "`/api/tasks/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleUpdateTaskMetadata@1329", + "kind": "function", + "name": "handleUpdateTaskMetadata", + "qualifiedName": "handleUpdateTaskMetadata", + "location": { + "file": "src/App.tsx", + "startLine": 1329, + "endLine": 1351, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleUpdateTaskMetadata(updatedMetadata: Partial)", + "params": [ + { + "name": "updatedMetadata", + "typeRef": "Partial", + "optional": false + } + ], + "loc": 23, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleUpdateTaskMetadata@1329:api:out:PUT:`/api/tasks/${selectedTaskId}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "`/api/tasks/${selectedTaskId}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleRefreshTask@1353", + "kind": "function", + "name": "handleRefreshTask", + "qualifiedName": "handleRefreshTask", + "location": { + "file": "src/App.tsx", + "startLine": 1353, + "endLine": 1368, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleRefreshTask(taskId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 16, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleRefreshTask@1353:api:out:GET:`/api/tasks/${taskId}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "`/api/tasks/${taskId}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleUpdateNodes@1371", + "kind": "function", + "name": "handleUpdateNodes", + "qualifiedName": "handleUpdateNodes", + "location": { + "file": "src/App.tsx", + "startLine": 1371, + "endLine": 1490, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleUpdateNodes(updatedNodes: WorkflowNode[], options: { persist?: boolean; forceNodeIds?: string[] })", + "params": [ + { + "name": "updatedNodes", + "typeRef": "WorkflowNode[]", + "optional": false + }, + { + "name": "options", + "typeRef": "{ persist?: boolean; forceNodeIds?: string[] }", + "optional": true, + "defaultValue": "{}" + } + ], + "loc": 120 + }, + { + "id": "func:src/App.tsx#edgeKey@1383", + "kind": "function", + "name": "edgeKey", + "qualifiedName": "edgeKey", + "location": { + "file": "src/App.tsx", + "startLine": 1383, + "endLine": 1383, + "startCol": 11, + "endCol": 85 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "edgeKey(parentId: string, childId: string)", + "params": [ + { + "name": "parentId", + "typeRef": "string", + "optional": false + }, + { + "name": "childId", + "typeRef": "string", + "optional": false + } + ], + "loc": 1 + }, + { + "id": "func:src/App.tsx#filter() 回调@1393@1393", + "kind": "function", + "name": "filter() 回调@1393", + "qualifiedName": "filter() 回调@1393", + "location": { + "file": "src/App.tsx", + "startLine": 1393, + "endLine": 1410, + "startCol": 58, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "filter() 回调@1393(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/App.tsx#requestTaskUpdate@1425", + "kind": "function", + "name": "requestTaskUpdate", + "qualifiedName": "requestTaskUpdate", + "location": { + "file": "src/App.tsx", + "startLine": 1425, + "endLine": 1437, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "requestTaskUpdate(url: string, init: RequestInit, fallback: string)", + "params": [ + { + "name": "url", + "typeRef": "string", + "optional": false + }, + { + "name": "init", + "typeRef": "RequestInit", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "loc": 13, + "interactions": [ + { + "id": "ix:func:src/App.tsx#requestTaskUpdate@1425:api:out:GET:", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET" + } + ] + }, + { + "id": "func:src/App.tsx#map() 回调@1526@1526", + "kind": "function", + "name": "map() 回调@1526", + "qualifiedName": "map() 回调@1526", + "location": { + "file": "src/App.tsx", + "startLine": 1526, + "endLine": 1550, + "startCol": 19, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "map() 回调@1526(item)", + "params": [ + { + "name": "item", + "optional": false + } + ], + "loc": 25 + }, + { + "id": "func:src/App.tsx#匿名函数@1533@1533", + "kind": "function", + "name": "匿名函数@1533", + "qualifiedName": "匿名函数@1533", + "location": { + "file": "src/App.tsx", + "startLine": 1533, + "endLine": 1539, + "startCol": 28, + "endCol": 20 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "匿名函数@1533()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/App.tsx#匿名函数@1557@1557", + "kind": "function", + "name": "匿名函数@1557", + "qualifiedName": "匿名函数@1557", + "location": { + "file": "src/App.tsx", + "startLine": 1557, + "endLine": 1563, + "startCol": 22, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "匿名函数@1557()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/App.tsx#map() 回调@1700@1700", + "kind": "function", + "name": "map() 回调@1700", + "qualifiedName": "map() 回调@1700", + "location": { + "file": "src/App.tsx", + "startLine": 1700, + "endLine": 1717, + "startCol": 36, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "map() 回调@1700(priority)", + "params": [ + { + "name": "priority", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/DingTalkLogs.tsx#DingTalkLogs@11", + "kind": "function", + "name": "DingTalkLogs", + "qualifiedName": "DingTalkLogs", + "location": { + "file": "src/components/DingTalkLogs.tsx", + "startLine": 11, + "endLine": 158, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/DingTalkLogs.tsx", + "moduleId": "module:src/components", + "signature": "DingTalkLogs({ logs, onClearLogs, onRefreshLogs }: DingTalkLogsProps)", + "params": [ + { + "name": "{ logs, onClearLogs, onRefreshLogs }", + "typeRef": "DingTalkLogsProps", + "optional": false + } + ], + "loc": 148 + }, + { + "id": "func:src/components/DingTalkLogs.tsx#copyToClipboard@14", + "kind": "function", + "name": "copyToClipboard", + "qualifiedName": "copyToClipboard", + "location": { + "file": "src/components/DingTalkLogs.tsx", + "startLine": 14, + "endLine": 20, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/DingTalkLogs.tsx", + "moduleId": "module:src/components", + "signature": "copyToClipboard(text: string, logId: string)", + "params": [ + { + "name": "text", + "typeRef": "string", + "optional": false + }, + { + "name": "logId", + "typeRef": "string", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/DingTalkLogs.tsx#setTimeout() 回调@17@17", + "kind": "function", + "name": "setTimeout() 回调@17", + "qualifiedName": "setTimeout() 回调@17", + "location": { + "file": "src/components/DingTalkLogs.tsx", + "startLine": 17, + "endLine": 19, + "startCol": 16, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/DingTalkLogs.tsx", + "moduleId": "module:src/components", + "signature": "setTimeout() 回调@17()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/DingTalkLogs.tsx#map() 回调@76@76", + "kind": "function", + "name": "map() 回调@76", + "qualifiedName": "map() 回调@76", + "location": { + "file": "src/components/DingTalkLogs.tsx", + "startLine": 76, + "endLine": 153, + "startCol": 21, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/DingTalkLogs.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@76(log)", + "params": [ + { + "name": "log", + "optional": false + } + ], + "loc": 78 + }, + { + "id": "func:vite.config.ts#normalizeBasePath@6", + "kind": "function", + "name": "normalizeBasePath", + "qualifiedName": "normalizeBasePath", + "location": { + "file": "vite.config.ts", + "startLine": 6, + "endLine": 10, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:vite.config.ts", + "moduleId": "module:.", + "signature": "normalizeBasePath(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:vite.config.ts#defineConfig() 回调@12@12", + "kind": "function", + "name": "defineConfig() 回调@12", + "qualifiedName": "defineConfig() 回调@12", + "location": { + "file": "vite.config.ts", + "startLine": 12, + "endLine": 38, + "startCol": 29, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:vite.config.ts", + "moduleId": "module:.", + "signature": "defineConfig() 回调@12()", + "params": [], + "loc": 27 + }, + { + "id": "func:prisma.config.ts#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "prisma.config.ts", + "startLine": 1, + "endLine": 14 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma.config.ts", + "moduleId": "module:.", + "params": [], + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:prisma/seed.ts#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "prisma/seed.ts", + "startLine": 1, + "endLine": 110 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma/seed.ts", + "moduleId": "module:prisma", + "params": [], + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:src/server/aiChatService.ts#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 1, + "endLine": 261 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "params": [], + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:server.ts#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "server.ts", + "startLine": 1, + "endLine": 1261 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "params": [], + "isEntry": true, + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 1, + "endLine": 756 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "params": [], + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:src/main.tsx#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "src/main.tsx", + "startLine": 1, + "endLine": 11 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/main.tsx", + "moduleId": "module:src", + "params": [], + "isEntry": true, + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:vite.config.ts#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "vite.config.ts", + "startLine": 1, + "endLine": 39 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:vite.config.ts", + "moduleId": "module:.", + "params": [], + "summary": "模块顶层代码(副作用/初始化)" + } + ], + "fields": [], + "edges": [ + { + "id": "edge:import:file:src/server/defaultData.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/defaultData.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:prisma/seed.ts=>file:src/server/defaultData.ts", + "kind": "import", + "sourceId": "file:prisma/seed.ts", + "targetId": "file:src/server/defaultData.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:prisma/seed.ts#seed@13=>func:prisma/seed.ts#dateFromInput@9", + "kind": "call", + "sourceId": "func:prisma/seed.ts#seed@13", + "targetId": "func:prisma/seed.ts#dateFromInput@9", + "provenance": "resolved" + }, + { + "id": "edge:call:func:prisma/seed.ts#@0=>func:prisma/seed.ts#seed@13", + "kind": "call", + "sourceId": "func:prisma/seed.ts#@0", + "targetId": "func:prisma/seed.ts#seed@13", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/weeklyPlanRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/weeklyPlanRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/weeklyPlanRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/weeklyPlanRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "targetId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "targetId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "targetId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "targetId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "targetId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "targetId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "targetId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "targetId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "targetId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "targetId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/taskRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/taskRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/taskRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/taskRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/taskRepository.ts=>file:src/server/weeklyPlanRepository.ts", + "kind": "import", + "sourceId": "file:src/server/taskRepository.ts", + "targetId": "file:src/server/weeklyPlanRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#existingTagNames@96=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#existingTagNames@96", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#dateToInput@36", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "targetId": "func:src/server/taskRepository.ts#dateToInput@36", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#toTask@163", + "targetId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#toTask@163", + "targetId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "targetId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "targetId": "func:src/server/taskRepository.ts#toTask@163", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#getTask@190=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#getTask@190", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#existingTagNames@96", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/taskRepository.ts#existingTagNames@96", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "targetId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "targetId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#replaceTaskNodes@605", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "targetId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateTask@302", + "targetId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "targetId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "targetId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#existingTagNames@96", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "targetId": "func:src/server/taskRepository.ts#existingTagNames@96", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#replaceTaskNodes@605", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "targetId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateTask@302", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateTaskListState@353", + "targetId": "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateTaskListState@353", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#ensureTaskExists@560", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createWorkflowNode@389", + "targetId": "func:src/server/taskRepository.ts#ensureTaskExists@560", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#dateFromInput@31", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "targetId": "func:src/server/taskRepository.ts#dateFromInput@31", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "targetId": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createWorkflowNode@389", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "targetId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#dateFromInput@31", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "targetId": "func:src/server/taskRepository.ts#dateFromInput@31", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "targetId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createNodeDependency@494", + "targetId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#hasDependencyPath@577", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createNodeDependency@494", + "targetId": "func:src/server/taskRepository.ts#hasDependencyPath@577", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createNodeDependency@494", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#ensureTaskExists@560", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "targetId": "func:src/server/taskRepository.ts#ensureTaskExists@560", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#map() 回调@618@618", + "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#dateFromInput@31", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#map() 回调@618@618", + "targetId": "func:src/server/taskRepository.ts#dateFromInput@31", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#map() 回调@618@618", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#replaceTaskNodes@605=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/notificationRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/notificationRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/notificationRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/notificationRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/notificationRepository.ts#createNotificationLog@37=>func:src/server/notificationRepository.ts#toNotificationLog@17", + "kind": "call", + "sourceId": "func:src/server/notificationRepository.ts#createNotificationLog@37", + "targetId": "func:src/server/notificationRepository.ts#toNotificationLog@17", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/projectTemplateRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/projectTemplateRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/projectTemplateRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/projectTemplateRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "targetId": "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "targetId": "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "targetId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "targetId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "targetId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "targetId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "targetId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "targetId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/tagRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/tagRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/tagRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/tagRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/tagRepository.ts#createTagDefinition@19=>func:src/server/tagRepository.ts#toTagDefinition@4", + "kind": "call", + "sourceId": "func:src/server/tagRepository.ts#createTagDefinition@19", + "targetId": "func:src/server/tagRepository.ts#toTagDefinition@4", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/personRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/personRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/personRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/personRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "kind": "call", + "sourceId": "func:src/server/personRepository.ts#listPeople@53", + "targetId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/personRepository.ts#getPersonOrThrow@64=>func:src/server/personRepository.ts#toPerson@4", + "kind": "call", + "sourceId": "func:src/server/personRepository.ts#getPersonOrThrow@64", + "targetId": "func:src/server/personRepository.ts#toPerson@4", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", + "kind": "call", + "sourceId": "func:src/server/personRepository.ts#createPerson@73", + "targetId": "func:src/server/personRepository.ts#toPerson@4", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/personRepository.ts#updatePerson@142=>func:src/server/personRepository.ts#toPerson@4", + "kind": "call", + "sourceId": "func:src/server/personRepository.ts#updatePerson@142", + "targetId": "func:src/server/personRepository.ts#toPerson@4", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/botQueryTools.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/server/personRepository.ts", + "kind": "import", + "sourceId": "file:src/server/botQueryTools.ts", + "targetId": "file:src/server/personRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/server/taskRepository.ts", + "kind": "import", + "sourceId": "file:src/server/botQueryTools.ts", + "targetId": "file:src/server/taskRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/server/weeklyPlanRepository.ts", + "kind": "import", + "sourceId": "file:src/server/botQueryTools.ts", + "targetId": "file:src/server/weeklyPlanRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getTodayStr@10=>func:src/server/botQueryTools.ts#value@17", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getTodayStr@10", + "targetId": "func:src/server/botQueryTools.ts#value@17", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "targetId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "targetId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#createBotQueryContext@116=>func:src/server/botQueryTools.ts#getTodayStr@10", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "targetId": "func:src/server/botQueryTools.ts#getTodayStr@10", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getTasks@124=>func:src/server/taskRepository.ts#listTasks@194", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getTasks@124", + "targetId": "func:src/server/taskRepository.ts#listTasks@194", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getPeople@125=>func:src/server/personRepository.ts#listPeople@53", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getPeople@125", + "targetId": "func:src/server/personRepository.ts#listPeople@53", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getWeeklyPlans@126=>func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getWeeklyPlans@126", + "targetId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#selfScope@149", + "targetId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "targetId": "func:src/server/botQueryTools.ts#selfScope@149", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "targetId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#summarizeTask@172", + "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#taskDateSpan@51", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#summarizeTask@172", + "targetId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#buildTaskLink@72", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#summarizeTask@172", + "targetId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@297", + "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#planNameById@198", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@297", + "targetId": "func:src/server/botQueryTools.ts#planNameById@198", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#filter() 回调@310@310=>func:src/server/botQueryTools.ts#taskDateSpan@51", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#filter() 回调@310@310", + "targetId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#filter() 回调@310@310=>func:src/server/botQueryTools.ts#overlapsRange@59", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#filter() 回调@310@310", + "targetId": "func:src/server/botQueryTools.ts#overlapsRange@59", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#summarizeTask@172", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@297", + "targetId": "func:src/server/botQueryTools.ts#summarizeTask@172", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#planNameById@198", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#planNameById@198", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#taskDateSpan@51", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#buildTaskLink@72", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#planNameById@198", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#planNameById@198", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#addDays@440", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#addDays@440", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#overlapsRange@59", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#overlapsRange@59", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#buildTaskLink@72", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@500=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@500", + "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#filter() 回调@516@516=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#filter() 回调@516@516", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@500=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@500", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@542", + "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@542", + "targetId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@542", + "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/aiChatService.ts=>file:src/server/botQueryTools.ts", + "kind": "import", + "sourceId": "file:src/server/aiChatService.ts", + "targetId": "file:src/server/botQueryTools.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#appendMemoryTurn@72=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "targetId": "func:src/server/aiChatService.ts#getMemoryTurns@62", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#map() 回调@94@94=>func:src/server/botQueryTools.ts#resolveToolSchema@231", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#map() 回调@94@94", + "targetId": "func:src/server/botQueryTools.ts#resolveToolSchema@231", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#executeToolCall@156=>func:src/server/botQueryTools.ts#getBotToolByName@583", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#executeToolCall@156", + "targetId": "func:src/server/botQueryTools.ts#getBotToolByName@583", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#isAiConfigured@30", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#isAiConfigured@30", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#getMemoryTurns@62", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildSystemPrompt@107", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#buildSystemPrompt@107", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildToolSpecs@93", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#buildToolSpecs@93", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#callChatCompletion@124", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#callChatCompletion@124", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#executeToolCall@156", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#executeToolCall@156", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#appendMemoryTurn@72", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "provenance": "resolved" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/taskRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/taskRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/notificationRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/notificationRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/projectTemplateRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/projectTemplateRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/tagRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/tagRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/weeklyPlanRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/weeklyPlanRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/personRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/personRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/botQueryTools.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/botQueryTools.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/aiChatService.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/aiChatService.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:server.ts#ensureManualLoginPeople@84=>func:src/server/personRepository.ts#ensurePeople@118", + "kind": "call", + "sourceId": "func:server.ts#ensureManualLoginPeople@84", + "targetId": "func:src/server/personRepository.ts#ensurePeople@118", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/health@90", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/health@90", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "kind": "call", + "sourceId": "func:server.ts#getDingTalkRobotAccessToken@128", + "targetId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#getDingTalkRobotAccessToken@128", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#getDingTalkRobotAccessToken@128", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "kind": "call", + "sourceId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "targetId": "func:server.ts#getDingTalkRobotAccessToken@128", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#replyToDingTalkSession@204", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#replyToDingTalkSession@204", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271", + "kind": "call", + "sourceId": "func:server.ts#getZonedDateParts@261", + "targetId": "func:server.ts#value@271", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getZonedDateParts@261", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:server.ts#getZonedDateParts@261", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/taskRepository.ts#listTasks@194", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:src/server/taskRepository.ts#listTasks@194", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/personRepository.ts#listPeople@53", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:src/server/personRepository.ts#listPeople@53", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getDueTimeRanges@290", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:server.ts#getDueTimeRanges@290", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getPersonNamesForDueNodeReminder@280", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:server.ts#getPersonNamesForDueNodeReminder@280", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getWorkflowLink@252", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:server.ts#getWorkflowLink@252", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getTaskRelatedPersonNames@239", + "kind": "call", + "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "targetId": "func:server.ts#getTaskRelatedPersonNames@239", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:src/server/personRepository.ts#listPeople@53", + "kind": "call", + "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "targetId": "func:src/server/personRepository.ts#listPeople@53", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "kind": "call", + "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "targetId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getWorkflowLink@252", + "kind": "call", + "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "targetId": "func:server.ts#getWorkflowLink@252", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoAuthUrl@432=>func:server.ts#getSsoRedirectUri@423", + "kind": "call", + "sourceId": "func:server.ts#getSsoAuthUrl@432", + "targetId": "func:server.ts#getSsoRedirectUri@423", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", + "kind": "call", + "sourceId": "func:server.ts#getSsoUserAccessToken@444", + "targetId": "func:server.ts#getSsoRedirectUri@423", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#getSsoUserAccessToken@444", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#getSsoUserAccessToken@444", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#getSsoCurrentUser@471", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#getSsoCurrentUser@471", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/auth/sso-config@498", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/auth/sso-config@498", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/auth/sso-config@498=>func:server.ts#getSsoRedirectUri@423", + "kind": "call", + "sourceId": "func:server.ts#GET /api/auth/sso-config@498", + "targetId": "func:server.ts#getSsoRedirectUri@423", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/auth/sso-login-url@508", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/auth/sso-login-url@508", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#ensureSsoConfigured@417", + "kind": "call", + "sourceId": "func:server.ts#GET /api/auth/sso-login-url@508", + "targetId": "func:server.ts#ensureSsoConfigured@417", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#getSsoAuthUrl@432", + "kind": "call", + "sourceId": "func:server.ts#GET /api/auth/sso-login-url@508", + "targetId": "func:server.ts#getSsoAuthUrl@432", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#handleSsoCallback@520", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#handleSsoCallback@520", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/auth/manual-users@559", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/auth/manual-users@559", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/manual-login@563", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/auth/manual-login@563", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/dev-login@575", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/auth/dev-login@575", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/dev-login@575=>func:src/server/personRepository.ts#createPerson@73", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/dev-login@575", + "targetId": "func:src/server/personRepository.ts#createPerson@73", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/sso-login@605", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/auth/sso-login@605", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#ensureSsoConfigured@417", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-login@605", + "targetId": "func:server.ts#ensureSsoConfigured@417", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoUserAccessToken@444", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-login@605", + "targetId": "func:server.ts#getSsoUserAccessToken@444", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoCurrentUser@471", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-login@605", + "targetId": "func:server.ts#getSsoCurrentUser@471", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:src/server/personRepository.ts#createPerson@73", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-login@605", + "targetId": "func:src/server/personRepository.ts#createPerson@73", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/sso-join-person@642", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/auth/sso-join-person@642", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#ensureSsoConfigured@417", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", + "targetId": "func:server.ts#ensureSsoConfigured@417", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoUserAccessToken@444", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", + "targetId": "func:server.ts#getSsoUserAccessToken@444", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoCurrentUser@471", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", + "targetId": "func:server.ts#getSsoCurrentUser@471", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:src/server/personRepository.ts#createPerson@73", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", + "targetId": "func:src/server/personRepository.ts#createPerson@73", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/people@669", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/people@669", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/people@669=>func:server.ts#ensureManualLoginPeople@84", + "kind": "call", + "sourceId": "func:server.ts#GET /api/people@669", + "targetId": "func:server.ts#ensureManualLoginPeople@84", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/people@669=>func:src/server/personRepository.ts#listPeople@53", + "kind": "call", + "sourceId": "func:server.ts#GET /api/people@669", + "targetId": "func:src/server/personRepository.ts#listPeople@53", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/people@678", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/people@678", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/people@678=>func:src/server/personRepository.ts#createPerson@73", + "kind": "call", + "sourceId": "func:server.ts#POST /api/people@678", + "targetId": "func:src/server/personRepository.ts#createPerson@73", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PUT /api/people/:id@687", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#PUT /api/people/:id@687", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PUT /api/people/:id@687=>func:src/server/personRepository.ts#updatePerson@142", + "kind": "call", + "sourceId": "func:server.ts#PUT /api/people/:id@687", + "targetId": "func:src/server/personRepository.ts#updatePerson@142", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/people/:id@696", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/people/:id@696", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/people/:id@696=>func:src/server/personRepository.ts#deletePerson@177", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/people/:id@696", + "targetId": "func:src/server/personRepository.ts#deletePerson@177", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/dingtalk/robot/send-message@705", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:src/server/personRepository.ts#getPersonOrThrow@64", + "kind": "call", + "sourceId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "targetId": "func:src/server/personRepository.ts#getPersonOrThrow@64", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "kind": "call", + "sourceId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "targetId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/tags@737", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/tags@737", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/tags@737=>func:src/server/tagRepository.ts#listTagDefinitions@11", + "kind": "call", + "sourceId": "func:server.ts#GET /api/tags@737", + "targetId": "func:src/server/tagRepository.ts#listTagDefinitions@11", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tags@745", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/tags@745", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/tags@745=>func:src/server/tagRepository.ts#createTagDefinition@19", + "kind": "call", + "sourceId": "func:server.ts#POST /api/tags@745", + "targetId": "func:src/server/tagRepository.ts#createTagDefinition@19", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tags/:id@754", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/tags/:id@754", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/tags/:id@754=>func:src/server/tagRepository.ts#deleteTagDefinition@34", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/tags/:id@754", + "targetId": "func:src/server/tagRepository.ts#deleteTagDefinition@34", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/weekly-plans@764", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/weekly-plans@764", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/weekly-plans@764=>func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "kind": "call", + "sourceId": "func:server.ts#GET /api/weekly-plans@764", + "targetId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/weekly-plans@772", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/weekly-plans@772", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/weekly-plans@772=>func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "kind": "call", + "sourceId": "func:server.ts#POST /api/weekly-plans@772", + "targetId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/weekly-plans/:id@781", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/weekly-plans/:id@781", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/weekly-plans/:id@781=>func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/weekly-plans/:id@781", + "targetId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/project-templates@791", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/project-templates@791", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/project-templates@791=>func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "kind": "call", + "sourceId": "func:server.ts#GET /api/project-templates@791", + "targetId": "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/project-templates@799", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/project-templates@799", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/project-templates@799=>func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "kind": "call", + "sourceId": "func:server.ts#POST /api/project-templates@799", + "targetId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PUT /api/project-templates/:id@808", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#PUT /api/project-templates/:id@808", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PUT /api/project-templates/:id@808=>func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "kind": "call", + "sourceId": "func:server.ts#PUT /api/project-templates/:id@808", + "targetId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/project-templates/:id@817", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/project-templates/:id@817", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/project-templates/:id@817=>func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/project-templates/:id@817", + "targetId": "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/tasks@826", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/tasks@826", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/tasks@826=>func:src/server/taskRepository.ts#listTasks@194", + "kind": "call", + "sourceId": "func:server.ts#GET /api/tasks@826", + "targetId": "func:src/server/taskRepository.ts#listTasks@194", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/tasks/:id@834", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/tasks/:id@834", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/tasks/:id@834=>func:src/server/taskRepository.ts#getTask@190", + "kind": "call", + "sourceId": "func:server.ts#GET /api/tasks/:id@834", + "targetId": "func:src/server/taskRepository.ts#getTask@190", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tasks@843", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/tasks@843", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/tasks@843=>func:src/server/taskRepository.ts#createTask@227", + "kind": "call", + "sourceId": "func:server.ts#POST /api/tasks@843", + "targetId": "func:src/server/taskRepository.ts#createTask@227", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PATCH /api/tasks/:id/list-state@852", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PATCH /api/tasks/:id/list-state@852=>func:src/server/taskRepository.ts#updateTaskListState@353", + "kind": "call", + "sourceId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "targetId": "func:src/server/taskRepository.ts#updateTaskListState@353", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PUT /api/tasks/:id@865", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#PUT /api/tasks/:id@865", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#getTask@190", + "kind": "call", + "sourceId": "func:server.ts#PUT /api/tasks/:id@865", + "targetId": "func:src/server/taskRepository.ts#getTask@190", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#updateTask@302", + "kind": "call", + "sourceId": "func:server.ts#PUT /api/tasks/:id@865", + "targetId": "func:src/server/taskRepository.ts#updateTask@302", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:server.ts#notifyTaskConfirmedCompleted@363", + "kind": "call", + "sourceId": "func:server.ts#PUT /api/tasks/:id@865", + "targetId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tasks/:id@886", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/tasks/:id@886", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/tasks/:id@886=>func:src/server/taskRepository.ts#deleteTask@383", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/tasks/:id@886", + "targetId": "func:src/server/taskRepository.ts#deleteTask@383", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tasks/:id/nodes@895", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/tasks/:id/nodes@895", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/tasks/:id/nodes@895=>func:src/server/taskRepository.ts#createWorkflowNode@389", + "kind": "call", + "sourceId": "func:server.ts#POST /api/tasks/:id/nodes@895", + "targetId": "func:src/server/taskRepository.ts#createWorkflowNode@389", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905=>func:src/server/taskRepository.ts#updateWorkflowNode@423", + "kind": "call", + "sourceId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "targetId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915=>func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "targetId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tasks/:id/dependencies@925", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/tasks/:id/dependencies@925", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/tasks/:id/dependencies@925=>func:src/server/taskRepository.ts#createNodeDependency@494", + "kind": "call", + "sourceId": "func:server.ts#POST /api/tasks/:id/dependencies@925", + "targetId": "func:src/server/taskRepository.ts#createNodeDependency@494", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934=>func:src/server/taskRepository.ts#deleteNodeDependency@535", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "targetId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/notify@944", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/notify@944", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#normalizeActionType@1058", + "kind": "call", + "sourceId": "func:server.ts#POST /api/notify@944", + "targetId": "func:server.ts#normalizeActionType@1058", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getNotificationState@1065", + "kind": "call", + "sourceId": "func:server.ts#POST /api/notify@944", + "targetId": "func:server.ts#getNotificationState@1065", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getWorkflowLink@252", + "kind": "call", + "sourceId": "func:server.ts#POST /api/notify@944", + "targetId": "func:server.ts#getWorkflowLink@252", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/notify@944=>func:src/server/notificationRepository.ts#createNotificationLog@37", + "kind": "call", + "sourceId": "func:server.ts#POST /api/notify@944", + "targetId": "func:src/server/notificationRepository.ts#createNotificationLog@37", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/logs@1041", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/logs@1041", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/logs@1041=>func:src/server/notificationRepository.ts#listNotificationLogs@47", + "kind": "call", + "sourceId": "func:server.ts#GET /api/logs@1041", + "targetId": "func:src/server/notificationRepository.ts#listNotificationLogs@47", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/logs@1049", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/logs@1049", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/logs@1049=>func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/logs@1049", + "targetId": "func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#getZonedDateParts@261", + "kind": "call", + "sourceId": "func:server.ts#checkAndRun@1090", + "targetId": "func:server.ts#getZonedDateParts@261", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#sendDailyDueNodeReminder@298", + "kind": "call", + "sourceId": "func:server.ts#checkAndRun@1090", + "targetId": "func:server.ts#sendDailyDueNodeReminder@298", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204", + "kind": "call", + "sourceId": "func:server.ts#replyText@1147", + "targetId": "func:server.ts#replyToDingTalkSession@204", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyText@1147", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:server.ts#replyText@1147", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#isAiConfigured@30", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:src/server/aiChatService.ts#isAiConfigured@30", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#clearBotMemory@79", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:src/server/aiChatService.ts#clearBotMemory@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/personRepository.ts#listPeople@53", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:src/server/personRepository.ts#listPeople@53", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/botQueryTools.ts#createBotQueryContext@116", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#answerBotQuestion@185", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyToDingTalkSessionMarkdown@222", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#registerCallbackListener() 回调@1215@1215=>func:server.ts#handleDingTalkRobotMessage@1114", + "kind": "call", + "sourceId": "func:server.ts#registerCallbackListener() 回调@1215@1215", + "targetId": "func:server.ts#handleDingTalkRobotMessage@1114", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#startServer@1235=>func:server.ts#GET *@1245", + "kind": "trigger", + "sourceId": "func:server.ts#startServer@1235", + "targetId": "func:server.ts#GET *@1245", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDailyDueNodeReminderScheduler@1089", + "kind": "call", + "sourceId": "func:server.ts#listen() 回调@1250@1250", + "targetId": "func:server.ts#startDailyDueNodeReminderScheduler@1089", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDingTalkRobotStream@1204", + "kind": "call", + "sourceId": "func:server.ts#listen() 回调@1250@1250", + "targetId": "func:server.ts#startDingTalkRobotStream@1204", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#@0=>func:server.ts#startServer@1235", + "kind": "call", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#startServer@1235", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/utils/nodeTimeRanges.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/utils/nodeTimeRanges.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "targetId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "targetId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "targetId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/utils/taskStatus.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/utils/taskStatus.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/utils/taskStatus.ts=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/utils/taskStatus.ts", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/utils/taskStatus.ts=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/utils/taskStatus.ts", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/utils/taskPriority.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/utils/taskPriority.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/TaskList.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/TaskList.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/TaskList.tsx=>file:src/utils/taskStatus.ts", + "kind": "import", + "sourceId": "file:src/components/TaskList.tsx", + "targetId": "file:src/utils/taskStatus.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/TaskList.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/TaskList.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#reduce() 回调@77@77=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#reduce() 回调@77@77", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#filter() 回调@110@110=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#filter() 回调@110@110", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#filter() 回调@110@110=>func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#filter() 回调@110@110", + "targetId": "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@265@265=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@265@265", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@265@265=>func:src/components/TaskList.tsx#toggleSelectedStatus@97", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@265@265", + "targetId": "func:src/components/TaskList.tsx#toggleSelectedStatus@97", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@297@297=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@297@297", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@297@297=>func:src/components/TaskList.tsx#toggleSelectedPriority@103", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@297@297", + "targetId": "func:src/components/TaskList.tsx#toggleSelectedPriority@103", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#TaskList@47=>func:src/components/TaskList.tsx#toggleSelectedTag@91", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#TaskList@47", + "targetId": "func:src/components/TaskList.tsx#toggleSelectedTag@91", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@353@353=>func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@353@353", + "targetId": "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@353@353=>func:src/components/TaskList.tsx#clearQueueDropState@147", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@353@353", + "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@366@366=>func:src/components/TaskList.tsx#clearQueueDropState@147", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@366@366", + "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@371@371=>func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@371@371", + "targetId": "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@371@371=>func:src/components/TaskList.tsx#clearQueueDropState@147", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@371@371", + "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@387@387", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@387@387", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@387@387", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@410@410=>func:src/components/TaskList.tsx#clearQueueDropState@147", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@410@410", + "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/WeeklyPlanList.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyPlanList.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WeeklyPlanList.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyPlanList.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26=>func:src/components/WeeklyPlanList.tsx#addDays@20", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", + "targetId": "func:src/components/WeeklyPlanList.tsx#addDays@20", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#resetForm@70=>func:src/components/WeeklyPlanList.tsx#addDays@20", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#resetForm@70", + "targetId": "func:src/components/WeeklyPlanList.tsx#addDays@20", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76=>func:src/components/WeeklyPlanList.tsx#resetForm@70", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76", + "targetId": "func:src/components/WeeklyPlanList.tsx#resetForm@70", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#匿名函数@162@162=>func:src/components/WeeklyPlanList.tsx#addDays@20", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#匿名函数@162@162", + "targetId": "func:src/components/WeeklyPlanList.tsx#addDays@20", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#map() 回调@197@197=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#map() 回调@197@197=>func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", + "targetId": "func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/WorkflowCanvas.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/WorkflowCanvas.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WorkflowCanvas.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/WorkflowCanvas.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WorkflowCanvas.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/WorkflowCanvas.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175=>func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", + "targetId": "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175=>func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", + "targetId": "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#addConnection@282=>func:src/components/WorkflowCanvas.tsx#isAncestor@265", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#addConnection@282", + "targetId": "func:src/components/WorkflowCanvas.tsx#isAncestor@265", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#addConnection@282=>func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#addConnection@282", + "targetId": "func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304=>func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "targetId": "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304=>func:src/components/WorkflowCanvas.tsx#addConnection@282", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "targetId": "func:src/components/WorkflowCanvas.tsx#addConnection@282", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343=>func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "targetId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361=>func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "targetId": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431=>func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", + "targetId": "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431=>func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", + "targetId": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "targetId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "targetId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507=>func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507", + "targetId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleKeyDown@565=>func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleKeyDown@565=>func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "targetId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/components/WorkflowCanvas.tsx#toMs@623", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "targetId": "func:src/components/WorkflowCanvas.tsx#toMs@623", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@638@638=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@638@638=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", + "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667=>func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "targetId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@838@838=>func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@838@838=>func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", + "targetId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#匿名函数@900@900=>func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#匿名函数@900@900", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectCreateModal.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectCreateModal.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectCreateModal.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectCreateModal.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/components/WorkflowCanvas.tsx", + "kind": "import", + "sourceId": "file:src/components/ProjectCreateModal.tsx", + "targetId": "file:src/components/WorkflowCanvas.tsx", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33=>func:src/components/ProjectCreateModal.tsx#toDateMs@23", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "targetId": "func:src/components/ProjectCreateModal.tsx#toDateMs@23", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@45@45=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@45@45=>func:src/components/ProjectCreateModal.tsx#addDays@27", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", + "targetId": "func:src/components/ProjectCreateModal.tsx#addDays@27", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#handleCreateProject@160=>func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", + "targetId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#handleCreateProject@160=>func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", + "targetId": "func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@234@234=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@234@234", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@271@271=>func:src/components/ProjectCreateModal.tsx#toggleTag@146", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@271@271", + "targetId": "func:src/components/ProjectCreateModal.tsx#toggleTag@146", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/TaskOverview.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/TaskOverview.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/TaskOverview.tsx=>file:src/utils/taskStatus.ts", + "kind": "import", + "sourceId": "file:src/components/TaskOverview.tsx", + "targetId": "file:src/utils/taskStatus.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/TaskOverview.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/TaskOverview.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118=>func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118", + "targetId": "func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#map() 回调@240@240=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#map() 回调@240@240", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#map() 回调@294@294=>func:src/components/TaskOverview.tsx#toggleEditTag@89", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#map() 回调@294@294", + "targetId": "func:src/components/TaskOverview.tsx#toggleEditTag@89", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/GanttChart.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/GanttChart.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/GanttChart.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/GanttChart.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/GanttChart.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/GanttChart.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#useMemo() 回调@23@23=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#useMemo() 回调@23@23=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#forEach() 回调@40@40=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#forEach() 回调@40@40", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#GanttChart@14=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#GanttChart@14", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "targetId": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#isWeekend@86", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "targetId": "func:src/components/GanttChart.tsx#isWeekend@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#formatDateString@76", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "targetId": "func:src/components/GanttChart.tsx#formatDateString@76", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#getDayLabel@80", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "targetId": "func:src/components/GanttChart.tsx#getDayLabel@80", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@304@304=>func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@304@304", + "targetId": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@304@304=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@304@304", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@375@375=>func:src/components/GanttChart.tsx#isWeekend@86", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@375@375", + "targetId": "func:src/components/GanttChart.tsx#isWeekend@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@389@389=>func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@389@389", + "targetId": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/PersonGanttChart.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/PersonGanttChart.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/PersonGanttChart.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/PersonGanttChart.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#PersonGanttChart@25=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#PersonGanttChart@25", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "targetId": "func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149=>func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", + "targetId": "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@235@235=>func:src/components/PersonGanttChart.tsx#getDayLabel@393", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@235@235", + "targetId": "func:src/components/PersonGanttChart.tsx#getDayLabel@393", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "targetId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "targetId": "func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@337@337=>func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@337@337", + "targetId": "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/PeopleManager.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/PeopleManager.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/PeopleManager.tsx=>file:src/components/PersonGanttChart.tsx", + "kind": "import", + "sourceId": "file:src/components/PeopleManager.tsx", + "targetId": "file:src/components/PersonGanttChart.tsx", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51=>func:src/components/PeopleManager.tsx#getPinyinSortKey@45", + "kind": "call", + "sourceId": "func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51", + "targetId": "func:src/components/PeopleManager.tsx#getPinyinSortKey@45", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PeopleManager.tsx#useMemo() 回调@107@107=>func:src/components/PeopleManager.tsx#getSearchTokens@29", + "kind": "call", + "sourceId": "func:src/components/PeopleManager.tsx#useMemo() 回调@107@107", + "targetId": "func:src/components/PeopleManager.tsx#getSearchTokens@29", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", + "kind": "call", + "sourceId": "func:src/utils/api.ts#apiPath@15", + "targetId": "func:src/utils/api.ts#appPath@7", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/LoginPage.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/LoginPage.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/LoginPage.tsx=>file:src/utils/api.ts", + "kind": "import", + "sourceId": "file:src/components/LoginPage.tsx", + "targetId": "file:src/utils/api.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#createOAuthState@31", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "targetId": "func:src/components/LoginPage.tsx#createOAuthState@31", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#readApiJson@21", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "targetId": "func:src/components/LoginPage.tsx#readApiJson@21", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "targetId": "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleDevLogin@121=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleDevLogin@121", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleDevLogin@121=>func:src/components/LoginPage.tsx#readApiJson@21", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleDevLogin@121", + "targetId": "func:src/components/LoginPage.tsx#readApiJson@21", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/TagManager.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/TagManager.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectTemplateManager.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectTemplateManager.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectTemplateManager.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/components/WorkflowCanvas.tsx", + "kind": "import", + "sourceId": "file:src/components/ProjectTemplateManager.tsx", + "targetId": "file:src/components/WorkflowCanvas.tsx", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", + "targetId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85=>func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", + "targetId": "func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132=>func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", + "targetId": "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132=>func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", + "targetId": "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", + "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154=>func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", + "targetId": "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", + "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181=>func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", + "targetId": "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181=>func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", + "targetId": "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", + "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", + "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222=>func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", + "targetId": "func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308", + "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393=>func:src/components/ProjectTemplateManager.tsx#toggleTag@111", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393", + "targetId": "func:src/components/ProjectTemplateManager.tsx#toggleTag@111", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85=>func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", + "targetId": "func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/NodeEditorDrawer.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/NodeEditorDrawer.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/NodeEditorDrawer.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/NodeEditorDrawer.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/NodeEditorDrawer.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/NodeEditorDrawer.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#@0=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#@0", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", + "targetId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178=>func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#completeNode@328=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#completeNode@328", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#reopenNode@332=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#reopenNode@332", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "targetId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#addTimeRange@361=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#addTimeRange@361=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", + "targetId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "targetId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#deleteNode@384=>func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#deleteNode@384", + "targetId": "func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676=>func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", + "targetId": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676=>func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyOverview.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyOverview.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyOverview.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/taskStatus.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyOverview.tsx", + "targetId": "file:src/utils/taskStatus.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyOverview.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#WeeklyOverview@99=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214=>func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "targetId": "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "targetId": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "targetId": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "targetId": "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#sort() 回调@273@273=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#sort() 回调@273@273", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#matchesFilters@290=>func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#matchesFilters@290", + "targetId": "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#WeeklyOverview@99=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@335@335=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@335@335=>func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", + "targetId": "func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#sortTasks@82", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "targetId": "func:src/components/WeeklyOverview.tsx#sortTasks@82", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "targetId": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "targetId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "targetId": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "targetId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "targetId": "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@777@777=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@777@777", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@840@840=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@840@840", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/TaskList.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/TaskList.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/WeeklyPlanList.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/WeeklyPlanList.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/ProjectCreateModal.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/ProjectCreateModal.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/TaskOverview.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/TaskOverview.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/WorkflowCanvas.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/WorkflowCanvas.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/GanttChart.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/GanttChart.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/PeopleManager.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/PeopleManager.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/LoginPage.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/LoginPage.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/TagManager.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/TagManager.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/ProjectTemplateManager.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/ProjectTemplateManager.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/NodeEditorDrawer.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/NodeEditorDrawer.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/WeeklyOverview.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/WeeklyOverview.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/utils/api.ts", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/utils/api.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/App.tsx#App@84=>func:src/App.tsx#readStoredAuthUser@62", + "kind": "call", + "sourceId": "func:src/App.tsx#App@84", + "targetId": "func:src/App.tsx#readStoredAuthUser@62", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTasks@221", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", + "targetId": "func:src/App.tsx#fetchTasks@221", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchPeople@241", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", + "targetId": "func:src/App.tsx#fetchPeople@241", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTags@256", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", + "targetId": "func:src/App.tsx#fetchTags@256", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchProjectTemplates@323", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", + "targetId": "func:src/App.tsx#fetchProjectTemplates@323", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchWeeklyPlans@338", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", + "targetId": "func:src/App.tsx#fetchWeeklyPlans@338", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@147@147=>func:src/App.tsx#fetchTags@256", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@147@147", + "targetId": "func:src/App.tsx#fetchTags@256", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchTasks@221", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchTasks@221", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchPeople@241", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchPeople@241", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchTags@256=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchTags@256", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchTags@256=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchTags@256", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateTag@271=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateTag@271", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateTag@271=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateTag@271", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteTag@297=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteTag@297", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteTag@297=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteTag@297", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchProjectTemplates@323", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchProjectTemplates@323", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchWeeklyPlans@338", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchWeeklyPlans@338", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateWeeklyPlan@353=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateWeeklyPlan@353", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateWeeklyPlan@353=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateWeeklyPlan@353", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteWeeklyPlan@385=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteWeeklyPlan@385", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteWeeklyPlan@385=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteWeeklyPlan@385", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteWeeklyPlan@385=>func:src/App.tsx#readApiJson@44", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteWeeklyPlan@385", + "targetId": "func:src/App.tsx#readApiJson@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateProjectTemplate@427=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateProjectTemplate@427", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateProjectTemplate@427=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateProjectTemplate@427", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateProjectTemplate@450=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateProjectTemplate@450", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateProjectTemplate@450=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateProjectTemplate@450", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteProjectTemplate@478=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteProjectTemplate@478", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteProjectTemplate@478=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteProjectTemplate@478", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreatePerson@498=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreatePerson@498", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreatePerson@498=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreatePerson@498", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleJoinSsoPerson@521=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleJoinSsoPerson@521", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleJoinSsoPerson@521=>func:src/App.tsx#readApiJson@44", + "kind": "call", + "sourceId": "func:src/App.tsx#handleJoinSsoPerson@521", + "targetId": "func:src/App.tsx#readApiJson@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleJoinSsoPerson@521=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleJoinSsoPerson@521", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeletePerson@548=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeletePerson@548", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeletePerson@548=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeletePerson@548", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdatePersonRole@565=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdatePersonRole@565", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdatePersonRole@565=>func:src/App.tsx#readApiJson@44", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdatePersonRole@565", + "targetId": "func:src/App.tsx#readApiJson@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdatePersonRole@565=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdatePersonRole@565", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleTogglePersonAdmin@605=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleTogglePersonAdmin@605", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleTogglePersonAdmin@605=>func:src/App.tsx#readApiJson@44", + "kind": "call", + "sourceId": "func:src/App.tsx#handleTogglePersonAdmin@605", + "targetId": "func:src/App.tsx#readApiJson@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleTogglePersonAdmin@605=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleTogglePersonAdmin@605", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUnlockAdmin@650=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUnlockAdmin@650", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUnlockAdmin@650=>func:src/App.tsx#readApiJson@44", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUnlockAdmin@650", + "targetId": "func:src/App.tsx#readApiJson@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761=>func:src/App.tsx#sortTasksForList@54", + "kind": "call", + "sourceId": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", + "targetId": "func:src/App.tsx#sortTasksForList@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#sortTasksForList@54", + "kind": "call", + "sourceId": "func:src/App.tsx#handleReorderTask@798", + "targetId": "func:src/App.tsx#sortTasksForList@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleReorderTask@798", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleReorderTask@798", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#fetchTasks@221", + "kind": "call", + "sourceId": "func:src/App.tsx#handleReorderTask@798", + "targetId": "func:src/App.tsx#fetchTasks@221", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleWorkspaceClick@957=>func:src/App.tsx#handleSelectNode@870", + "kind": "call", + "sourceId": "func:src/App.tsx#handleWorkspaceClick@957", + "targetId": "func:src/App.tsx#handleSelectNode@870", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@1109@1109=>func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@1109@1109", + "targetId": "func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@1121@1121=>func:src/App.tsx#focusNodeInCanvas@1016", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@1121@1121", + "targetId": "func:src/App.tsx#focusNodeInCanvas@1016", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#applyCentered@1149=>func:src/App.tsx#computeCenteredViewport@981", + "kind": "call", + "sourceId": "func:src/App.tsx#applyCentered@1149", + "targetId": "func:src/App.tsx#computeCenteredViewport@981", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useLayoutEffect() 回调@1134@1134=>func:src/App.tsx#applyCentered@1149", + "kind": "call", + "sourceId": "func:src/App.tsx#useLayoutEffect() 回调@1134@1134", + "targetId": "func:src/App.tsx#applyCentered@1149", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateTask@1165=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateTask@1165", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateTask@1165=>func:src/App.tsx#sortTasksForList@54", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateTask@1165", + "targetId": "func:src/App.tsx#sortTasksForList@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateTask@1165=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateTask@1165", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleSubmitRequirement@1219=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleSubmitRequirement@1219", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleSubmitRequirement@1219=>func:src/App.tsx#sortTasksForList@54", + "kind": "call", + "sourceId": "func:src/App.tsx#handleSubmitRequirement@1219", + "targetId": "func:src/App.tsx#sortTasksForList@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleSubmitRequirement@1219=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleSubmitRequirement@1219", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleToggleTaskPinned@1278=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleToggleTaskPinned@1278", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleToggleTaskPinned@1278=>func:src/App.tsx#sortTasksForList@54", + "kind": "call", + "sourceId": "func:src/App.tsx#handleToggleTaskPinned@1278", + "targetId": "func:src/App.tsx#sortTasksForList@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleToggleTaskPinned@1278=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleToggleTaskPinned@1278", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteTask@1299=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteTask@1299", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteTask@1299=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteTask@1299", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateTaskMetadata@1329=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateTaskMetadata@1329", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateTaskMetadata@1329=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateTaskMetadata@1329", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleRefreshTask@1353", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleRefreshTask@1353", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", + "targetId": "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#edgeKey@1383", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", + "targetId": "func:src/App.tsx#edgeKey@1383", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#requestTaskUpdate@1425", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#requestTaskUpdate@1425", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#requestTaskUpdate@1425", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", + "targetId": "func:src/App.tsx#requestTaskUpdate@1425", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#handleRefreshTask@1353", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", + "targetId": "func:src/App.tsx#handleRefreshTask@1353", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#map() 回调@1700@1700=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/App.tsx#map() 回调@1700@1700", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#App@84=>func:src/App.tsx#handleSelectNode@870", + "kind": "call", + "sourceId": "func:src/App.tsx#App@84", + "targetId": "func:src/App.tsx#handleSelectNode@870", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/DingTalkLogs.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/DingTalkLogs.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/DingTalkLogs.tsx#map() 回调@76@76=>func:src/components/DingTalkLogs.tsx#copyToClipboard@14", + "kind": "call", + "sourceId": "func:src/components/DingTalkLogs.tsx#map() 回调@76@76", + "targetId": "func:src/components/DingTalkLogs.tsx#copyToClipboard@14", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/main.tsx=>file:src/App.tsx", + "kind": "import", + "sourceId": "file:src/main.tsx", + "targetId": "file:src/App.tsx", + "provenance": "ast" + }, + { + "id": "edge:call:func:vite.config.ts#defineConfig() 回调@12@12=>func:vite.config.ts#normalizeBasePath@6", + "kind": "call", + "sourceId": "func:vite.config.ts#defineConfig() 回调@12@12", + "targetId": "func:vite.config.ts#normalizeBasePath@6", + "provenance": "resolved" + } + ], + "flows": [ + { + "id": "flow:call:func:server.ts#sendDailyDueNodeReminder@298", + "name": "sendDailyDueNodeReminder (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#sendDailyDueNodeReminder@298", + "steps": [ + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#sendDailyDueNodeReminder@298", + "order": 0, + "nodeId": "func:server.ts#sendDailyDueNodeReminder@298", + "title": "sendDailyDueNodeReminder", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getZonedDateParts@261", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/taskRepository.ts#listTasks@194", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDueTimeRanges@290", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getPersonNamesForDueNodeReminder@280", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getWorkflowLink@252" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getZonedDateParts@261", + "order": 1, + "nodeId": "func:server.ts#getZonedDateParts@261", + "title": "getZonedDateParts", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#value@271" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/taskRepository.ts#listTasks@194", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#listTasks@194", + "title": "listTasks", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#listPeople@53", + "order": 3, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDueTimeRanges@290", + "order": 4, + "nodeId": "func:server.ts#getDueTimeRanges@290", + "title": "getDueTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getPersonNamesForDueNodeReminder@280", + "order": 5, + "nodeId": "func:server.ts#getPersonNamesForDueNodeReminder@280", + "title": "getPersonNamesForDueNodeReminder", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 6, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getWorkflowLink@252", + "order": 7, + "nodeId": "func:server.ts#getWorkflowLink@252", + "title": "getWorkflowLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#value@271", + "order": 8, + "nodeId": "func:server.ts#value@271", + "title": "value", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 9, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 10, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteError@98", + "order": 11, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteJson@110", + "order": 12, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 13, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getZonedDateParts@261", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/taskRepository.ts#listTasks@194", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getDueTimeRanges@290", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getPersonNamesForDueNodeReminder@280", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getWorkflowLink@252" + ], + "summary": "以 sendDailyDueNodeReminder 为入口的调用链,覆盖 14 个函数" + }, + { + "id": "flow:call:func:server.ts#handleDingTalkRobotMessage@1114", + "name": "handleDingTalkRobotMessage (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#handleDingTalkRobotMessage@1114", + "steps": [ + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#handleDingTalkRobotMessage@1114", + "order": 0, + "nodeId": "func:server.ts#handleDingTalkRobotMessage@1114", + "title": "handleDingTalkRobotMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyText@1147", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#isAiConfigured@30", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#clearBotMemory@79", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#createBotQueryContext@116", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#answerBotQuestion@185", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSessionMarkdown@222" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyText@1147", + "order": 1, + "nodeId": "func:server.ts#replyText@1147", + "title": "replyText", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSession@204" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#isAiConfigured@30", + "order": 2, + "nodeId": "func:src/server/aiChatService.ts#isAiConfigured@30", + "title": "isAiConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#clearBotMemory@79", + "order": 3, + "nodeId": "func:src/server/aiChatService.ts#clearBotMemory@79", + "title": "clearBotMemory", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#listPeople@53", + "order": 4, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#createBotQueryContext@116", + "order": 5, + "nodeId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "title": "createBotQueryContext", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getTodayStr@10" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#answerBotQuestion@185", + "order": 6, + "nodeId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "title": "answerBotQuestion", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#isAiConfigured@30", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#getMemoryTurns@62", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildSystemPrompt@107", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildToolSpecs@93", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#callChatCompletion@124", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#executeToolCall@156", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#appendMemoryTurn@72" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSessionMarkdown@222", + "order": 7, + "nodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "title": "replyToDingTalkSessionMarkdown", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSession@204", + "order": 8, + "nodeId": "func:server.ts#replyToDingTalkSession@204", + "title": "replyToDingTalkSession", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 9, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getTodayStr@10", + "order": 10, + "nodeId": "func:src/server/botQueryTools.ts#getTodayStr@10", + "title": "getTodayStr", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#value@17" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#getMemoryTurns@62", + "order": 11, + "nodeId": "func:src/server/aiChatService.ts#getMemoryTurns@62", + "title": "getMemoryTurns", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildSystemPrompt@107", + "order": 12, + "nodeId": "func:src/server/aiChatService.ts#buildSystemPrompt@107", + "title": "buildSystemPrompt", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildToolSpecs@93", + "order": 13, + "nodeId": "func:src/server/aiChatService.ts#buildToolSpecs@93", + "title": "buildToolSpecs", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#callChatCompletion@124", + "order": 14, + "nodeId": "func:src/server/aiChatService.ts#callChatCompletion@124", + "title": "callChatCompletion", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#executeToolCall@156", + "order": 15, + "nodeId": "func:src/server/aiChatService.ts#executeToolCall@156", + "title": "executeToolCall", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getBotToolByName@583" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#appendMemoryTurn@72", + "order": 16, + "nodeId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "title": "appendMemoryTurn", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#getMemoryTurns@62" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteError@98", + "order": 17, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteJson@110", + "order": 18, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#value@17", + "order": 19, + "nodeId": "func:src/server/botQueryTools.ts#value@17", + "title": "value", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getBotToolByName@583", + "order": 20, + "nodeId": "func:src/server/botQueryTools.ts#getBotToolByName@583", + "title": "getBotToolByName", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:src/server/botQueryTools.ts#getTodayStr@10=>func:src/server/botQueryTools.ts#value@17", + "edge:call:func:src/server/botQueryTools.ts#createBotQueryContext@116=>func:src/server/botQueryTools.ts#getTodayStr@10", + "edge:call:func:src/server/aiChatService.ts#appendMemoryTurn@72=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "edge:call:func:src/server/aiChatService.ts#executeToolCall@156=>func:src/server/botQueryTools.ts#getBotToolByName@583", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#isAiConfigured@30", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildSystemPrompt@107", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildToolSpecs@93", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#callChatCompletion@124", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#executeToolCall@156", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#appendMemoryTurn@72", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyText@1147", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#isAiConfigured@30", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#clearBotMemory@79", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/botQueryTools.ts#createBotQueryContext@116", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#answerBotQuestion@185", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyToDingTalkSessionMarkdown@222" + ], + "summary": "以 handleDingTalkRobotMessage 为入口的调用链,覆盖 21 个函数" + }, + { + "id": "flow:call:func:server.ts#notifyTaskConfirmedCompleted@363", + "name": "notifyTaskConfirmedCompleted (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "steps": [ + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#notifyTaskConfirmedCompleted@363", + "order": 0, + "nodeId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "title": "notifyTaskConfirmedCompleted", + "nextStepIds": [ + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getTaskRelatedPersonNames@239", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getWorkflowLink@252" + ] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getTaskRelatedPersonNames@239", + "order": 1, + "nodeId": "func:server.ts#getTaskRelatedPersonNames@239", + "title": "getTaskRelatedPersonNames", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#listPeople@53", + "order": 2, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 3, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getWorkflowLink@252", + "order": 4, + "nodeId": "func:server.ts#getWorkflowLink@252", + "title": "getWorkflowLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 5, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 6, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteError@98", + "order": 7, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteJson@110", + "order": 8, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 9, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getTaskRelatedPersonNames@239", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getWorkflowLink@252" + ], + "summary": "以 notifyTaskConfirmedCompleted 为入口的调用链,覆盖 10 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/auth/sso-login@605", + "name": "POST /api/auth/sso-login (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/auth/sso-login@605", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#POST /api/auth/sso-login@605", + "order": 0, + "nodeId": "func:server.ts#POST /api/auth/sso-login@605", + "title": "POST /api/auth/sso-login", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#ensureSsoConfigured@417", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoUserAccessToken@444", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoCurrentUser@471", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#createPerson@73" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#ensureSsoConfigured@417", + "order": 1, + "nodeId": "func:server.ts#ensureSsoConfigured@417", + "title": "ensureSsoConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoUserAccessToken@444", + "order": 2, + "nodeId": "func:server.ts#getSsoUserAccessToken@444", + "title": "getSsoUserAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoRedirectUri@423", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoCurrentUser@471", + "order": 3, + "nodeId": "func:server.ts#getSsoCurrentUser@471", + "title": "getSsoCurrentUser", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#createPerson@73", + "order": 4, + "nodeId": "func:src/server/personRepository.ts#createPerson@73", + "title": "createPerson", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoRedirectUri@423", + "order": 5, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteError@98", + "order": 6, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteJson@110", + "order": 7, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#toPerson@4", + "order": 8, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#ensureSsoConfigured@417", + "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoUserAccessToken@444", + "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoCurrentUser@471", + "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:src/server/personRepository.ts#createPerson@73" + ], + "summary": "以 POST /api/auth/sso-login 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/auth/sso-join-person@642", + "name": "POST /api/auth/sso-join-person (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/auth/sso-join-person@642", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#POST /api/auth/sso-join-person@642", + "order": 0, + "nodeId": "func:server.ts#POST /api/auth/sso-join-person@642", + "title": "POST /api/auth/sso-join-person", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#ensureSsoConfigured@417", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoUserAccessToken@444", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoCurrentUser@471", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#createPerson@73" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#ensureSsoConfigured@417", + "order": 1, + "nodeId": "func:server.ts#ensureSsoConfigured@417", + "title": "ensureSsoConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoUserAccessToken@444", + "order": 2, + "nodeId": "func:server.ts#getSsoUserAccessToken@444", + "title": "getSsoUserAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoRedirectUri@423", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoCurrentUser@471", + "order": 3, + "nodeId": "func:server.ts#getSsoCurrentUser@471", + "title": "getSsoCurrentUser", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#createPerson@73", + "order": 4, + "nodeId": "func:src/server/personRepository.ts#createPerson@73", + "title": "createPerson", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoRedirectUri@423", + "order": 5, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteError@98", + "order": 6, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteJson@110", + "order": 7, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#toPerson@4", + "order": 8, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#ensureSsoConfigured@417", + "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoUserAccessToken@444", + "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoCurrentUser@471", + "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:src/server/personRepository.ts#createPerson@73" + ], + "summary": "以 POST /api/auth/sso-join-person 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/notify@944", + "name": "POST /api/notify (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/notify@944", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#POST /api/notify@944", + "order": 0, + "nodeId": "func:server.ts#POST /api/notify@944", + "title": "POST /api/notify", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#normalizeActionType@1058", + "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getNotificationState@1065", + "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getWorkflowLink@252", + "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#createNotificationLog@37" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#normalizeActionType@1058", + "order": 1, + "nodeId": "func:server.ts#normalizeActionType@1058", + "title": "normalizeActionType", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getNotificationState@1065", + "order": 2, + "nodeId": "func:server.ts#getNotificationState@1065", + "title": "getNotificationState", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getWorkflowLink@252", + "order": 3, + "nodeId": "func:server.ts#getWorkflowLink@252", + "title": "getWorkflowLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#createNotificationLog@37", + "order": 4, + "nodeId": "func:src/server/notificationRepository.ts#createNotificationLog@37", + "title": "createNotificationLog", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#toNotificationLog@17" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#toNotificationLog@17", + "order": 5, + "nodeId": "func:src/server/notificationRepository.ts#toNotificationLog@17", + "title": "toNotificationLog", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/notificationRepository.ts#createNotificationLog@37=>func:src/server/notificationRepository.ts#toNotificationLog@17", + "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#normalizeActionType@1058", + "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getNotificationState@1065", + "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getWorkflowLink@252", + "edge:call:func:server.ts#POST /api/notify@944=>func:src/server/notificationRepository.ts#createNotificationLog@37" + ], + "summary": "以 POST /api/notify 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:server.ts#getDingTalkRobotAccessToken@128", + "name": "getDingTalkRobotAccessToken (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "steps": [ + { + "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 0, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 1, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteError@98", + "order": 2, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteJson@110", + "order": 3, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 getDingTalkRobotAccessToken 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "name": "sendDingTalkRobotMarkdownMessage (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "steps": [ + { + "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 0, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 1, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteError@98", + "order": 2, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteJson@110", + "order": 3, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 4, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 sendDingTalkRobotMarkdownMessage 为入口的调用链,覆盖 5 个函数" + }, + { + "id": "flow:call:func:server.ts#getSsoUserAccessToken@444", + "name": "getSsoUserAccessToken (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#getSsoUserAccessToken@444", + "steps": [ + { + "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#getSsoUserAccessToken@444", + "order": 0, + "nodeId": "func:server.ts#getSsoUserAccessToken@444", + "title": "getSsoUserAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#getSsoRedirectUri@423", + "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#getSsoRedirectUri@423", + "order": 1, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteError@98", + "order": 2, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteJson@110", + "order": 3, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 getSsoUserAccessToken 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:server.ts#PUT /api/tasks/:id@865", + "name": "PUT /api/tasks/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#PUT /api/tasks/:id@865", + "steps": [ + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#PUT /api/tasks/:id@865", + "order": 0, + "nodeId": "func:server.ts#PUT /api/tasks/:id@865", + "title": "PUT /api/tasks/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTask@190", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#updateTask@302", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#notifyTaskConfirmedCompleted@363" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTask@190", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#getTask@190", + "title": "getTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#updateTask@302", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#updateTask@302", + "title": "updateTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#notifyTaskConfirmedCompleted@363", + "order": 3, + "nodeId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "title": "notifyTaskConfirmedCompleted", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getTaskRelatedPersonNames@239", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getWorkflowLink@252" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "order": 5, + "nodeId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "title": "getWeeklyPlanOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getTaskRelatedPersonNames@239", + "order": 6, + "nodeId": "func:server.ts#getTaskRelatedPersonNames@239", + "title": "getTaskRelatedPersonNames", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#listPeople@53", + "order": 7, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 8, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getWorkflowLink@252", + "order": 9, + "nodeId": "func:server.ts#getWorkflowLink@252", + "title": "getWorkflowLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 10, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#toTask@163", + "order": 11, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "order": 12, + "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "title": "toWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 13, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 14, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteError@98", + "order": 15, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteJson@110", + "order": 16, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 17, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 18, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "order": 19, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "title": "dateToInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 20, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#getTask@190=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getTaskRelatedPersonNames@239", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getWorkflowLink@252", + "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#getTask@190", + "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#updateTask@302", + "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:server.ts#notifyTaskConfirmedCompleted@363" + ], + "summary": "以 PUT /api/tasks/:id 为入口的调用链,覆盖 21 个函数" + }, + { + "id": "flow:call:func:server.ts#replyToDingTalkSession@204", + "name": "replyToDingTalkSession (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#replyToDingTalkSession@204", + "steps": [ + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#replyToDingTalkSession@204", + "order": 0, + "nodeId": "func:server.ts#replyToDingTalkSession@204", + "title": "replyToDingTalkSession", + "nextStepIds": [ + "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteError@98", + "order": 1, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteJson@110", + "order": 2, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 replyToDingTalkSession 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222", + "name": "replyToDingTalkSessionMarkdown (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "steps": [ + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#replyToDingTalkSessionMarkdown@222", + "order": 0, + "nodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "title": "replyToDingTalkSessionMarkdown", + "nextStepIds": [ + "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteError@98", + "order": 1, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteJson@110", + "order": 2, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 replyToDingTalkSessionMarkdown 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#getSsoCurrentUser@471", + "name": "getSsoCurrentUser (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#getSsoCurrentUser@471", + "steps": [ + { + "id": "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#getSsoCurrentUser@471", + "order": 0, + "nodeId": "func:server.ts#getSsoCurrentUser@471", + "title": "getSsoCurrentUser", + "nextStepIds": [ + "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteError@98", + "order": 1, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteJson@110", + "order": 2, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 getSsoCurrentUser 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/auth/sso-login-url@508", + "name": "GET /api/auth/sso-login-url (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/auth/sso-login-url@508", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#GET /api/auth/sso-login-url@508", + "order": 0, + "nodeId": "func:server.ts#GET /api/auth/sso-login-url@508", + "title": "GET /api/auth/sso-login-url", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#ensureSsoConfigured@417", + "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoAuthUrl@432" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#ensureSsoConfigured@417", + "order": 1, + "nodeId": "func:server.ts#ensureSsoConfigured@417", + "title": "ensureSsoConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoAuthUrl@432", + "order": 2, + "nodeId": "func:server.ts#getSsoAuthUrl@432", + "title": "getSsoAuthUrl", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoRedirectUri@423" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoRedirectUri@423", + "order": 3, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getSsoAuthUrl@432=>func:server.ts#getSsoRedirectUri@423", + "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#ensureSsoConfigured@417", + "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#getSsoAuthUrl@432" + ], + "summary": "以 GET /api/auth/sso-login-url 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/people@669", + "name": "GET /api/people (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/people@669", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/people@669:func:server.ts#GET /api/people@669", + "order": 0, + "nodeId": "func:server.ts#GET /api/people@669", + "title": "GET /api/people", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/people@669:func:server.ts#ensureManualLoginPeople@84", + "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#listPeople@53" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/people@669:func:server.ts#ensureManualLoginPeople@84", + "order": 1, + "nodeId": "func:server.ts#ensureManualLoginPeople@84", + "title": "ensureManualLoginPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeople@118" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#listPeople@53", + "order": 2, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeople@118", + "order": 3, + "nodeId": "func:src/server/personRepository.ts#ensurePeople@118", + "title": "ensurePeople", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 4, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:server.ts#ensureManualLoginPeople@84=>func:src/server/personRepository.ts#ensurePeople@118", + "edge:call:func:server.ts#GET /api/people@669=>func:server.ts#ensureManualLoginPeople@84", + "edge:call:func:server.ts#GET /api/people@669=>func:src/server/personRepository.ts#listPeople@53" + ], + "summary": "以 GET /api/people 为入口的调用链,覆盖 5 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705", + "name": "POST /api/dingtalk/robot/send-message (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#POST /api/dingtalk/robot/send-message@705", + "order": 0, + "nodeId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "title": "POST /api/dingtalk/robot/send-message", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#getPersonOrThrow@64", + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#sendDingTalkRobotMarkdownMessage@162" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#getPersonOrThrow@64", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#getPersonOrThrow@64", + "title": "getPersonOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 2, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#toPerson@4", + "order": 3, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 4, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteError@98", + "order": 5, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteJson@110", + "order": 6, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 7, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#getPersonOrThrow@64=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:src/server/personRepository.ts#getPersonOrThrow@64", + "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:server.ts#sendDingTalkRobotMarkdownMessage@162" + ], + "summary": "以 POST /api/dingtalk/robot/send-message 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#checkAndRun@1090", + "name": "checkAndRun (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#checkAndRun@1090", + "steps": [ + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#checkAndRun@1090", + "order": 0, + "nodeId": "func:server.ts#checkAndRun@1090", + "title": "checkAndRun", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getZonedDateParts@261", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDailyDueNodeReminder@298" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getZonedDateParts@261", + "order": 1, + "nodeId": "func:server.ts#getZonedDateParts@261", + "title": "getZonedDateParts", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#value@271" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDailyDueNodeReminder@298", + "order": 2, + "nodeId": "func:server.ts#sendDailyDueNodeReminder@298", + "title": "sendDailyDueNodeReminder", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getZonedDateParts@261", + "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/taskRepository.ts#listTasks@194", + "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDueTimeRanges@290", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getPersonNamesForDueNodeReminder@280", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getWorkflowLink@252" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#value@271", + "order": 3, + "nodeId": "func:server.ts#value@271", + "title": "value", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/taskRepository.ts#listTasks@194", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#listTasks@194", + "title": "listTasks", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#listPeople@53", + "order": 5, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDueTimeRanges@290", + "order": 6, + "nodeId": "func:server.ts#getDueTimeRanges@290", + "title": "getDueTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getPersonNamesForDueNodeReminder@280", + "order": 7, + "nodeId": "func:server.ts#getPersonNamesForDueNodeReminder@280", + "title": "getPersonNamesForDueNodeReminder", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 8, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getWorkflowLink@252", + "order": 9, + "nodeId": "func:server.ts#getWorkflowLink@252", + "title": "getWorkflowLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 10, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 11, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteError@98", + "order": 12, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteJson@110", + "order": 13, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 14, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getZonedDateParts@261", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/taskRepository.ts#listTasks@194", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getDueTimeRanges@290", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getPersonNamesForDueNodeReminder@280", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getWorkflowLink@252", + "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#getZonedDateParts@261", + "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#sendDailyDueNodeReminder@298" + ], + "summary": "以 checkAndRun 为入口的调用链,覆盖 15 个函数" + }, + { + "id": "flow:call:func:server.ts#listen() 回调@1250@1250", + "name": "listen() 回调@1250 (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#listen() 回调@1250@1250", + "steps": [ + { + "id": "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#listen() 回调@1250@1250", + "order": 0, + "nodeId": "func:server.ts#listen() 回调@1250@1250", + "title": "listen() 回调@1250", + "nextStepIds": [ + "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDailyDueNodeReminderScheduler@1089", + "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDingTalkRobotStream@1204" + ] + }, + { + "id": "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDailyDueNodeReminderScheduler@1089", + "order": 1, + "nodeId": "func:server.ts#startDailyDueNodeReminderScheduler@1089", + "title": "startDailyDueNodeReminderScheduler", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDingTalkRobotStream@1204", + "order": 2, + "nodeId": "func:server.ts#startDingTalkRobotStream@1204", + "title": "startDingTalkRobotStream", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDailyDueNodeReminderScheduler@1089", + "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDingTalkRobotStream@1204" + ], + "summary": "以 listen() 回调@1250 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#ensureManualLoginPeople@84", + "name": "ensureManualLoginPeople (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#ensureManualLoginPeople@84", + "steps": [ + { + "id": "step:flow:call:func:server.ts#ensureManualLoginPeople@84:func:server.ts#ensureManualLoginPeople@84", + "order": 0, + "nodeId": "func:server.ts#ensureManualLoginPeople@84", + "title": "ensureManualLoginPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#ensureManualLoginPeople@84:func:src/server/personRepository.ts#ensurePeople@118" + ] + }, + { + "id": "step:flow:call:func:server.ts#ensureManualLoginPeople@84:func:src/server/personRepository.ts#ensurePeople@118", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#ensurePeople@118", + "title": "ensurePeople", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#ensureManualLoginPeople@84=>func:src/server/personRepository.ts#ensurePeople@118" + ], + "summary": "以 ensureManualLoginPeople 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#getZonedDateParts@261", + "name": "getZonedDateParts (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#getZonedDateParts@261", + "steps": [ + { + "id": "step:flow:call:func:server.ts#getZonedDateParts@261:func:server.ts#getZonedDateParts@261", + "order": 0, + "nodeId": "func:server.ts#getZonedDateParts@261", + "title": "getZonedDateParts", + "nextStepIds": [ + "step:flow:call:func:server.ts#getZonedDateParts@261:func:server.ts#value@271" + ] + }, + { + "id": "step:flow:call:func:server.ts#getZonedDateParts@261:func:server.ts#value@271", + "order": 1, + "nodeId": "func:server.ts#value@271", + "title": "value", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271" + ], + "summary": "以 getZonedDateParts 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#getSsoAuthUrl@432", + "name": "getSsoAuthUrl (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#getSsoAuthUrl@432", + "steps": [ + { + "id": "step:flow:call:func:server.ts#getSsoAuthUrl@432:func:server.ts#getSsoAuthUrl@432", + "order": 0, + "nodeId": "func:server.ts#getSsoAuthUrl@432", + "title": "getSsoAuthUrl", + "nextStepIds": [ + "step:flow:call:func:server.ts#getSsoAuthUrl@432:func:server.ts#getSsoRedirectUri@423" + ] + }, + { + "id": "step:flow:call:func:server.ts#getSsoAuthUrl@432:func:server.ts#getSsoRedirectUri@423", + "order": 1, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getSsoAuthUrl@432=>func:server.ts#getSsoRedirectUri@423" + ], + "summary": "以 getSsoAuthUrl 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/auth/sso-config@498", + "name": "GET /api/auth/sso-config (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/auth/sso-config@498", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-config@498:func:server.ts#GET /api/auth/sso-config@498", + "order": 0, + "nodeId": "func:server.ts#GET /api/auth/sso-config@498", + "title": "GET /api/auth/sso-config", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/auth/sso-config@498:func:server.ts#getSsoRedirectUri@423" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-config@498:func:server.ts#getSsoRedirectUri@423", + "order": 1, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#GET /api/auth/sso-config@498=>func:server.ts#getSsoRedirectUri@423" + ], + "summary": "以 GET /api/auth/sso-config 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/auth/dev-login@575", + "name": "POST /api/auth/dev-login (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/auth/dev-login@575", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:server.ts#POST /api/auth/dev-login@575", + "order": 0, + "nodeId": "func:server.ts#POST /api/auth/dev-login@575", + "title": "POST /api/auth/dev-login", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#createPerson@73" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#createPerson@73", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#createPerson@73", + "title": "createPerson", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#toPerson@4", + "order": 2, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#POST /api/auth/dev-login@575=>func:src/server/personRepository.ts#createPerson@73" + ], + "summary": "以 POST /api/auth/dev-login 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/people@678", + "name": "POST /api/people (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/people@678", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/people@678:func:server.ts#POST /api/people@678", + "order": 0, + "nodeId": "func:server.ts#POST /api/people@678", + "title": "POST /api/people", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#createPerson@73" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#createPerson@73", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#createPerson@73", + "title": "createPerson", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#toPerson@4", + "order": 2, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#POST /api/people@678=>func:src/server/personRepository.ts#createPerson@73" + ], + "summary": "以 POST /api/people 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#PUT /api/people/:id@687", + "name": "PUT /api/people/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#PUT /api/people/:id@687", + "steps": [ + { + "id": "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:server.ts#PUT /api/people/:id@687", + "order": 0, + "nodeId": "func:server.ts#PUT /api/people/:id@687", + "title": "PUT /api/people/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#updatePerson@142" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#updatePerson@142", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#updatePerson@142", + "title": "updatePerson", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#toPerson@4", + "order": 2, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#updatePerson@142=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#PUT /api/people/:id@687=>func:src/server/personRepository.ts#updatePerson@142" + ], + "summary": "以 PUT /api/people/:id 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/people/:id@696", + "name": "DELETE /api/people/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/people/:id@696", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/people/:id@696:func:server.ts#DELETE /api/people/:id@696", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/people/:id@696", + "title": "DELETE /api/people/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/people/:id@696:func:src/server/personRepository.ts#deletePerson@177" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/people/:id@696:func:src/server/personRepository.ts#deletePerson@177", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#deletePerson@177", + "title": "deletePerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#DELETE /api/people/:id@696=>func:src/server/personRepository.ts#deletePerson@177" + ], + "summary": "以 DELETE /api/people/:id 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/tags@737", + "name": "GET /api/tags (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/tags@737", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/tags@737:func:server.ts#GET /api/tags@737", + "order": 0, + "nodeId": "func:server.ts#GET /api/tags@737", + "title": "GET /api/tags", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tags@737:func:src/server/tagRepository.ts#listTagDefinitions@11" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tags@737:func:src/server/tagRepository.ts#listTagDefinitions@11", + "order": 1, + "nodeId": "func:src/server/tagRepository.ts#listTagDefinitions@11", + "title": "listTagDefinitions", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#GET /api/tags@737=>func:src/server/tagRepository.ts#listTagDefinitions@11" + ], + "summary": "以 GET /api/tags 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/tags@745", + "name": "POST /api/tags (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/tags@745", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/tags@745:func:server.ts#POST /api/tags@745", + "order": 0, + "nodeId": "func:server.ts#POST /api/tags@745", + "title": "POST /api/tags", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#createTagDefinition@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#createTagDefinition@19", + "order": 1, + "nodeId": "func:src/server/tagRepository.ts#createTagDefinition@19", + "title": "createTagDefinition", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#toTagDefinition@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#toTagDefinition@4", + "order": 2, + "nodeId": "func:src/server/tagRepository.ts#toTagDefinition@4", + "title": "toTagDefinition", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/tagRepository.ts#createTagDefinition@19=>func:src/server/tagRepository.ts#toTagDefinition@4", + "edge:call:func:server.ts#POST /api/tags@745=>func:src/server/tagRepository.ts#createTagDefinition@19" + ], + "summary": "以 POST /api/tags 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/tags/:id@754", + "name": "DELETE /api/tags/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/tags/:id@754", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/tags/:id@754:func:server.ts#DELETE /api/tags/:id@754", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/tags/:id@754", + "title": "DELETE /api/tags/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tags/:id@754:func:src/server/tagRepository.ts#deleteTagDefinition@34" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tags/:id@754:func:src/server/tagRepository.ts#deleteTagDefinition@34", + "order": 1, + "nodeId": "func:src/server/tagRepository.ts#deleteTagDefinition@34", + "title": "deleteTagDefinition", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#DELETE /api/tags/:id@754=>func:src/server/tagRepository.ts#deleteTagDefinition@34" + ], + "summary": "以 DELETE /api/tags/:id 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/weekly-plans@764", + "name": "GET /api/weekly-plans (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/weekly-plans@764", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:server.ts#GET /api/weekly-plans@764", + "order": 0, + "nodeId": "func:server.ts#GET /api/weekly-plans@764", + "title": "GET /api/weekly-plans", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "order": 1, + "nodeId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "title": "listWeeklyPlans", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "order": 2, + "nodeId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "title": "ensurePublicPoolPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#addDays@13", + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "order": 3, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#addDays@13", + "order": 4, + "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "title": "addDays", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "order": 5, + "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "title": "toWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "order": 6, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "title": "dateToInput", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "edge:call:func:server.ts#GET /api/weekly-plans@764=>func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55" + ], + "summary": "以 GET /api/weekly-plans 为入口的调用链,覆盖 7 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/weekly-plans@772", + "name": "POST /api/weekly-plans (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/weekly-plans@772", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:server.ts#POST /api/weekly-plans@772", + "order": 0, + "nodeId": "func:server.ts#POST /api/weekly-plans@772", + "title": "POST /api/weekly-plans", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "order": 1, + "nodeId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "title": "createWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#addDays@13", + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#addDays@13", + "order": 2, + "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "title": "addDays", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "order": 3, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "order": 4, + "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "title": "toWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "order": 5, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "title": "dateToInput", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:server.ts#POST /api/weekly-plans@772=>func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69" + ], + "summary": "以 POST /api/weekly-plans 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781", + "name": "DELETE /api/weekly-plans/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/weekly-plans/:id@781", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:server.ts#DELETE /api/weekly-plans/:id@781", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/weekly-plans/:id@781", + "title": "DELETE /api/weekly-plans/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "order": 1, + "nodeId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "title": "deleteWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "order": 2, + "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "title": "toWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "order": 3, + "nodeId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "title": "getDefaultWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "order": 4, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "title": "dateToInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "order": 5, + "nodeId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "title": "ensurePublicPoolPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#addDays@13", + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "order": 6, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#addDays@13", + "order": 7, + "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "title": "addDays", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + } + ], + "edgeIds": [ + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "edge:call:func:server.ts#DELETE /api/weekly-plans/:id@781=>func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102" + ], + "summary": "以 DELETE /api/weekly-plans/:id 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/project-templates@791", + "name": "GET /api/project-templates (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/project-templates@791", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/project-templates@791:func:server.ts#GET /api/project-templates@791", + "order": 0, + "nodeId": "func:server.ts#GET /api/project-templates@791", + "title": "GET /api/project-templates", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/project-templates@791:func:src/server/projectTemplateRepository.ts#listProjectTemplates@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/project-templates@791:func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "order": 1, + "nodeId": "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "title": "listProjectTemplates", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#GET /api/project-templates@791=>func:src/server/projectTemplateRepository.ts#listProjectTemplates@110" + ], + "summary": "以 GET /api/project-templates 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/project-templates@799", + "name": "POST /api/project-templates (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/project-templates@799", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:server.ts#POST /api/project-templates@799", + "order": 0, + "nodeId": "func:server.ts#POST /api/project-templates@799", + "title": "POST /api/project-templates", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "order": 1, + "nodeId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "title": "createProjectTemplate", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "order": 2, + "nodeId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "order": 3, + "nodeId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "title": "toTemplateNodesJson", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "order": 4, + "nodeId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "title": "toProjectTemplate", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "order": 5, + "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "title": "normalizeTemplateNodes", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "edge:call:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "edge:call:func:server.ts#POST /api/project-templates@799=>func:src/server/projectTemplateRepository.ts#createProjectTemplate@118" + ], + "summary": "以 POST /api/project-templates 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:server.ts#PUT /api/project-templates/:id@808", + "name": "PUT /api/project-templates/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#PUT /api/project-templates/:id@808", + "steps": [ + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:server.ts#PUT /api/project-templates/:id@808", + "order": 0, + "nodeId": "func:server.ts#PUT /api/project-templates/:id@808", + "title": "PUT /api/project-templates/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "order": 1, + "nodeId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "title": "updateProjectTemplate", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "order": 2, + "nodeId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "order": 3, + "nodeId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "title": "toTemplateNodesJson", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "order": 4, + "nodeId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "title": "toProjectTemplate", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "order": 5, + "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "title": "normalizeTemplateNodes", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "edge:call:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "edge:call:func:server.ts#PUT /api/project-templates/:id@808=>func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136" + ], + "summary": "以 PUT /api/project-templates/:id 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/project-templates/:id@817", + "name": "DELETE /api/project-templates/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/project-templates/:id@817", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/project-templates/:id@817:func:server.ts#DELETE /api/project-templates/:id@817", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/project-templates/:id@817", + "title": "DELETE /api/project-templates/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/project-templates/:id@817:func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/project-templates/:id@817:func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "order": 1, + "nodeId": "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "title": "deleteProjectTemplate", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#DELETE /api/project-templates/:id@817=>func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158" + ], + "summary": "以 DELETE /api/project-templates/:id 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/tasks@826", + "name": "GET /api/tasks (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/tasks@826", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/tasks@826:func:server.ts#GET /api/tasks@826", + "order": 0, + "nodeId": "func:server.ts#GET /api/tasks@826", + "title": "GET /api/tasks", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tasks@826:func:src/server/taskRepository.ts#listTasks@194" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks@826:func:src/server/taskRepository.ts#listTasks@194", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#listTasks@194", + "title": "listTasks", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#GET /api/tasks@826=>func:src/server/taskRepository.ts#listTasks@194" + ], + "summary": "以 GET /api/tasks 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/tasks/:id@834", + "name": "GET /api/tasks/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/tasks/:id@834", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:server.ts#GET /api/tasks/:id@834", + "order": 0, + "nodeId": "func:server.ts#GET /api/tasks/:id@834", + "title": "GET /api/tasks/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTask@190" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTask@190", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#getTask@190", + "title": "getTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#toTask@163", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#getTask@190=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#GET /api/tasks/:id@834=>func:src/server/taskRepository.ts#getTask@190" + ], + "summary": "以 GET /api/tasks/:id 为入口的调用链,覆盖 7 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/tasks@843", + "name": "POST /api/tasks (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/tasks@843", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:server.ts#POST /api/tasks@843", + "order": 0, + "nodeId": "func:server.ts#POST /api/tasks@843", + "title": "POST /api/tasks", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#createTask@227" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#createTask@227", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#createTask@227", + "title": "createTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#uniqueValues@40", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#existingTagNames@96", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#uniqueValues@40", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "order": 3, + "nodeId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "title": "getWeeklyPlanOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "order": 4, + "nodeId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "title": "getDefaultWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "title": "getNextTaskSortOrder", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#existingTagNames@96", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#existingTagNames@96", + "title": "existingTagNames", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#uniqueValues@40" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "order": 8, + "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "title": "toWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "order": 9, + "nodeId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "title": "ensurePublicPoolPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#addDays@13", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 10, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#toTask@163", + "order": 11, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "order": 12, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "title": "dateToInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "order": 13, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#addDays@13", + "order": 14, + "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "title": "addDays", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 15, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 16, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "edge:call:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/taskRepository.ts#existingTagNames@96=>func:src/server/taskRepository.ts#uniqueValues@40", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#uniqueValues@40", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#existingTagNames@96", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#POST /api/tasks@843=>func:src/server/taskRepository.ts#createTask@227" + ], + "summary": "以 POST /api/tasks 为入口的调用链,覆盖 17 个函数" + }, + { + "id": "flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852", + "name": "PATCH /api/tasks/:id/list-state (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "steps": [ + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:server.ts#PATCH /api/tasks/:id/list-state@852", + "order": 0, + "nodeId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "title": "PATCH /api/tasks/:id/list-state", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#updateTaskListState@353" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#updateTaskListState@353", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#updateTaskListState@353", + "title": "updateTaskListState", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "title": "getFirstTaskSortOrder", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#toTask@163", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#PATCH /api/tasks/:id/list-state@852=>func:src/server/taskRepository.ts#updateTaskListState@353" + ], + "summary": "以 PATCH /api/tasks/:id/list-state 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/tasks/:id@886", + "name": "DELETE /api/tasks/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/tasks/:id@886", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id@886:func:server.ts#DELETE /api/tasks/:id@886", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/tasks/:id@886", + "title": "DELETE /api/tasks/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id@886:func:src/server/taskRepository.ts#deleteTask@383" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id@886:func:src/server/taskRepository.ts#deleteTask@383", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#deleteTask@383", + "title": "deleteTask", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#DELETE /api/tasks/:id@886=>func:src/server/taskRepository.ts#deleteTask@383" + ], + "summary": "以 DELETE /api/tasks/:id 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/tasks/:id/nodes@895", + "name": "POST /api/tasks/:id/nodes (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/tasks/:id/nodes@895", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:server.ts#POST /api/tasks/:id/nodes@895", + "order": 0, + "nodeId": "func:server.ts#POST /api/tasks/:id/nodes@895", + "title": "POST /api/tasks/:id/nodes", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#createWorkflowNode@389" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#createWorkflowNode@389", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#createWorkflowNode@389", + "title": "createWorkflowNode", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#ensureTaskExists@560", + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#ensureTaskExists@560", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#ensureTaskExists@560", + "title": "ensureTaskExists", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#toTask@163", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#ensureTaskExists@560", + "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#POST /api/tasks/:id/nodes@895=>func:src/server/taskRepository.ts#createWorkflowNode@389" + ], + "summary": "以 POST /api/tasks/:id/nodes 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "name": "PATCH /api/tasks/:id/nodes/:nodeId (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "steps": [ + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "order": 0, + "nodeId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "title": "PATCH /api/tasks/:id/nodes/:nodeId", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#updateWorkflowNode@423" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#updateWorkflowNode@423", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "title": "updateWorkflowNode", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "title": "ensureWorkflowNodeExists", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#toTask@163", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905=>func:src/server/taskRepository.ts#updateWorkflowNode@423" + ], + "summary": "以 PATCH /api/tasks/:id/nodes/:nodeId 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "name": "DELETE /api/tasks/:id/nodes/:nodeId (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "title": "DELETE /api/tasks/:id/nodes/:nodeId", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#deleteWorkflowNode@472" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "title": "deleteWorkflowNode", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "title": "ensureWorkflowNodeExists", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#toTask@163", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915=>func:src/server/taskRepository.ts#deleteWorkflowNode@472" + ], + "summary": "以 DELETE /api/tasks/:id/nodes/:nodeId 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925", + "name": "POST /api/tasks/:id/dependencies (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/tasks/:id/dependencies@925", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:server.ts#POST /api/tasks/:id/dependencies@925", + "order": 0, + "nodeId": "func:server.ts#POST /api/tasks/:id/dependencies@925", + "title": "POST /api/tasks/:id/dependencies", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#createNodeDependency@494" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#createNodeDependency@494", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#createNodeDependency@494", + "title": "createNodeDependency", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#hasDependencyPath@577", + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "title": "ensureWorkflowNodeExists", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#hasDependencyPath@577", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#hasDependencyPath@577", + "title": "hasDependencyPath", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#toTask@163", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 8, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#hasDependencyPath@577", + "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#POST /api/tasks/:id/dependencies@925=>func:src/server/taskRepository.ts#createNodeDependency@494" + ], + "summary": "以 POST /api/tasks/:id/dependencies 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "name": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "title": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#deleteNodeDependency@535" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#deleteNodeDependency@535", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "title": "deleteNodeDependency", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#ensureTaskExists@560", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#ensureTaskExists@560", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#ensureTaskExists@560", + "title": "ensureTaskExists", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#toTask@163", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#ensureTaskExists@560", + "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934=>func:src/server/taskRepository.ts#deleteNodeDependency@535" + ], + "summary": "以 DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/logs@1041", + "name": "GET /api/logs (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/logs@1041", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/logs@1041:func:server.ts#GET /api/logs@1041", + "order": 0, + "nodeId": "func:server.ts#GET /api/logs@1041", + "title": "GET /api/logs", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/logs@1041:func:src/server/notificationRepository.ts#listNotificationLogs@47" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/logs@1041:func:src/server/notificationRepository.ts#listNotificationLogs@47", + "order": 1, + "nodeId": "func:src/server/notificationRepository.ts#listNotificationLogs@47", + "title": "listNotificationLogs", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#GET /api/logs@1041=>func:src/server/notificationRepository.ts#listNotificationLogs@47" + ], + "summary": "以 GET /api/logs 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/logs@1049", + "name": "DELETE /api/logs (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/logs@1049", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/logs@1049:func:server.ts#DELETE /api/logs@1049", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/logs@1049", + "title": "DELETE /api/logs", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/logs@1049:func:src/server/notificationRepository.ts#clearNotificationLogs@56" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/logs@1049:func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "order": 1, + "nodeId": "func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "title": "clearNotificationLogs", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#DELETE /api/logs@1049=>func:src/server/notificationRepository.ts#clearNotificationLogs@56" + ], + "summary": "以 DELETE /api/logs 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#replyText@1147", + "name": "replyText (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#replyText@1147", + "steps": [ + { + "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#replyText@1147", + "order": 0, + "nodeId": "func:server.ts#replyText@1147", + "title": "replyText", + "nextStepIds": [ + "step:flow:call:func:server.ts#replyText@1147:func:server.ts#replyToDingTalkSession@204" + ] + }, + { + "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#replyToDingTalkSession@204", + "order": 1, + "nodeId": "func:server.ts#replyToDingTalkSession@204", + "title": "replyToDingTalkSession", + "nextStepIds": [ + "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteError@98", + "order": 2, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteJson@110", + "order": 3, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204" + ], + "summary": "以 replyText 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215", + "name": "registerCallbackListener() 回调@1215 (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#registerCallbackListener() 回调@1215@1215", + "steps": [ + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#registerCallbackListener() 回调@1215@1215", + "order": 0, + "nodeId": "func:server.ts#registerCallbackListener() 回调@1215@1215", + "title": "registerCallbackListener() 回调@1215", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#handleDingTalkRobotMessage@1114" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#handleDingTalkRobotMessage@1114", + "order": 1, + "nodeId": "func:server.ts#handleDingTalkRobotMessage@1114", + "title": "handleDingTalkRobotMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyText@1147", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#isAiConfigured@30", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#clearBotMemory@79", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#createBotQueryContext@116", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#answerBotQuestion@185", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSessionMarkdown@222" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyText@1147", + "order": 2, + "nodeId": "func:server.ts#replyText@1147", + "title": "replyText", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSession@204" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#isAiConfigured@30", + "order": 3, + "nodeId": "func:src/server/aiChatService.ts#isAiConfigured@30", + "title": "isAiConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#clearBotMemory@79", + "order": 4, + "nodeId": "func:src/server/aiChatService.ts#clearBotMemory@79", + "title": "clearBotMemory", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#listPeople@53", + "order": 5, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#createBotQueryContext@116", + "order": 6, + "nodeId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "title": "createBotQueryContext", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getTodayStr@10" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#answerBotQuestion@185", + "order": 7, + "nodeId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "title": "answerBotQuestion", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#isAiConfigured@30", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#getMemoryTurns@62", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildSystemPrompt@107", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildToolSpecs@93", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#callChatCompletion@124", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#executeToolCall@156", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#appendMemoryTurn@72" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSessionMarkdown@222", + "order": 8, + "nodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "title": "replyToDingTalkSessionMarkdown", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSession@204", + "order": 9, + "nodeId": "func:server.ts#replyToDingTalkSession@204", + "title": "replyToDingTalkSession", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 10, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getTodayStr@10", + "order": 11, + "nodeId": "func:src/server/botQueryTools.ts#getTodayStr@10", + "title": "getTodayStr", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#value@17" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#getMemoryTurns@62", + "order": 12, + "nodeId": "func:src/server/aiChatService.ts#getMemoryTurns@62", + "title": "getMemoryTurns", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildSystemPrompt@107", + "order": 13, + "nodeId": "func:src/server/aiChatService.ts#buildSystemPrompt@107", + "title": "buildSystemPrompt", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildToolSpecs@93", + "order": 14, + "nodeId": "func:src/server/aiChatService.ts#buildToolSpecs@93", + "title": "buildToolSpecs", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#callChatCompletion@124", + "order": 15, + "nodeId": "func:src/server/aiChatService.ts#callChatCompletion@124", + "title": "callChatCompletion", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#executeToolCall@156", + "order": 16, + "nodeId": "func:src/server/aiChatService.ts#executeToolCall@156", + "title": "executeToolCall", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getBotToolByName@583" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#appendMemoryTurn@72", + "order": 17, + "nodeId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "title": "appendMemoryTurn", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#getMemoryTurns@62" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteError@98", + "order": 18, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteJson@110", + "order": 19, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#value@17", + "order": 20, + "nodeId": "func:src/server/botQueryTools.ts#value@17", + "title": "value", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getBotToolByName@583", + "order": 21, + "nodeId": "func:src/server/botQueryTools.ts#getBotToolByName@583", + "title": "getBotToolByName", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:src/server/botQueryTools.ts#getTodayStr@10=>func:src/server/botQueryTools.ts#value@17", + "edge:call:func:src/server/botQueryTools.ts#createBotQueryContext@116=>func:src/server/botQueryTools.ts#getTodayStr@10", + "edge:call:func:src/server/aiChatService.ts#appendMemoryTurn@72=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "edge:call:func:src/server/aiChatService.ts#executeToolCall@156=>func:src/server/botQueryTools.ts#getBotToolByName@583", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#isAiConfigured@30", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildSystemPrompt@107", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildToolSpecs@93", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#callChatCompletion@124", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#executeToolCall@156", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#appendMemoryTurn@72", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyText@1147", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#isAiConfigured@30", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#clearBotMemory@79", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/botQueryTools.ts#createBotQueryContext@116", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#answerBotQuestion@185", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyToDingTalkSessionMarkdown@222", + "edge:call:func:server.ts#registerCallbackListener() 回调@1215@1215=>func:server.ts#handleDingTalkRobotMessage@1114" + ], + "summary": "以 registerCallbackListener() 回调@1215 为入口的调用链,覆盖 22 个函数" + }, + { + "id": "flow:call:func:server.ts#@0", + "name": " (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#@0", + "steps": [ + { + "id": "step:flow:call:func:server.ts#@0:func:server.ts#@0", + "order": 0, + "nodeId": "func:server.ts#@0", + "title": "", + "nextStepIds": [ + "step:flow:call:func:server.ts#@0:func:server.ts#startServer@1235" + ] + }, + { + "id": "step:flow:call:func:server.ts#@0:func:server.ts#startServer@1235", + "order": 1, + "nodeId": "func:server.ts#startServer@1235", + "title": "startServer", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#@0=>func:server.ts#startServer@1235" + ], + "summary": "以 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "name": "NodeEditorDrawer (src/components/NodeEditorDrawer.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "steps": [ + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "order": 0, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "title": "NodeEditorDrawer", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "order": 1, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 2, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 3, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "order": 4, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "title": "getStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "order": 5, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "title": "changeEditName", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "order": 6, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "title": "changeEditDesc", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "order": 7, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "title": "selectResponsible", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "order": 8, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "title": "removeTimeRange", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "order": 9, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "title": "changeTimeRange", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "order": 10, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "title": "getMinimumFirstStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "order": 11, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "title": "getParentLatestEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "order": 12, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "title": "changeProgress", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "order": 13, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "title": "focusLinkedNode", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "order": 14, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "title": "getLinkedNodeClassName", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 15, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "order": 16, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "title": "updateSelectedNode", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getDraftKey@244" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "order": 17, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "title": "getCurrentDraft", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "order": 18, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "title": "updateTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "order": 19, + "nodeId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "title": "addDaysToDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "order": 20, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "title": "normalizeProgress", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 21, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "order": 22, + "nodeId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "title": "constrainNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "order": 23, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "title": "getDraftKey", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "edge:call:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89" + ], + "summary": "以 NodeEditorDrawer 为入口的调用链,覆盖 24 个函数" + }, + { + "id": "flow:call:func:src/server/botQueryTools.ts#execute@430", + "name": "execute (src/server/botQueryTools.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/botQueryTools.ts#execute@430", + "steps": [ + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#execute@430", + "order": 0, + "nodeId": "func:src/server/botQueryTools.ts#execute@430", + "title": "execute", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#planNameById@198", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#addDays@440", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeEndDate@34", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#overlapsRange@59", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#buildTaskLink@72" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "order": 1, + "nodeId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "title": "resolveTaskScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#selfScope@149", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#planNameById@198", + "order": 2, + "nodeId": "func:src/server/botQueryTools.ts#planNameById@198", + "title": "planNameById", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#addDays@440", + "order": 3, + "nodeId": "func:src/server/botQueryTools.ts#addDays@440", + "title": "addDays", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "order": 4, + "nodeId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "title": "isNodeOwnedByPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "order": 5, + "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeStartDate@28", + "order": 6, + "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "title": "nodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeEndDate@34", + "order": 7, + "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "title": "nodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#overlapsRange@59", + "order": 8, + "nodeId": "func:src/server/botQueryTools.ts#overlapsRange@59", + "title": "overlapsRange", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#buildTaskLink@72", + "order": 9, + "nodeId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "title": "buildTaskLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#selfScope@149", + "order": 10, + "nodeId": "func:src/server/botQueryTools.ts#selfScope@149", + "title": "selfScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "order": 11, + "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "title": "isTaskRelatedToPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeRanges@21", + "order": 12, + "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "title": "nodeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#planNameById@198", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#addDays@440", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#overlapsRange@59", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#buildTaskLink@72" + ], + "summary": "以 execute 为入口的调用链,覆盖 13 个函数" + }, + { + "id": "flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "name": "map() 回调@997 (src/components/WorkflowCanvas.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "steps": [ + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "order": 0, + "nodeId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "title": "map() 回调@997", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "order": 1, + "nodeId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "order": 2, + "nodeId": "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "title": "getStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "order": 3, + "nodeId": "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "title": "getNodeProgressPercent", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "order": 5, + "nodeId": "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "title": "handleNodeMouseDown", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "order": 6, + "nodeId": "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "title": "handleNodeClick", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "order": 7, + "nodeId": "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "title": "handleConnectionMouseDown", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "order": 8, + "nodeId": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "title": "handleConnectionHandleClick", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#createDraftNode@465" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "order": 9, + "nodeId": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "title": "formatNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 10, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 11, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 12, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "order": 13, + "nodeId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "title": "createDraftNode", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "order": 14, + "nodeId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "title": "findPreviewNodePosition", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "order": 15, + "nodeId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "title": "addDaysToDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "order": 16, + "nodeId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "title": "createNodeTimeRange", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "order": 17, + "nodeId": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "title": "getOverlapArea", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343=>func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "edge:call:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361=>func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93" + ], + "summary": "以 map() 回调@997 为入口的调用链,覆盖 18 个函数" + }, + { + "id": "flow:call:func:src/server/botQueryTools.ts#execute@349", + "name": "execute (src/server/botQueryTools.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/botQueryTools.ts#execute@349", + "steps": [ + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#execute@349", + "order": 0, + "nodeId": "func:src/server/botQueryTools.ts#execute@349", + "title": "execute", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#planNameById@198", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#taskDateSpan@51", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#buildTaskLink@72", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "order": 1, + "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "title": "isTaskRelatedToPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#planNameById@198", + "order": 2, + "nodeId": "func:src/server/botQueryTools.ts#planNameById@198", + "title": "planNameById", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#taskDateSpan@51", + "order": 3, + "nodeId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "title": "taskDateSpan", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#buildTaskLink@72", + "order": 4, + "nodeId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "title": "buildTaskLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "order": 5, + "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", + "order": 6, + "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "title": "nodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34", + "order": 7, + "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "title": "nodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "order": 8, + "nodeId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "title": "isNodeOwnedByPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeRanges@21", + "order": 9, + "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "title": "nodeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#planNameById@198", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#taskDateSpan@51", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#buildTaskLink@72", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103" + ], + "summary": "以 execute 为入口的调用链,覆盖 10 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "name": "$transaction() 回调@313 (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "title": "$transaction() 回调@313", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#existingTagNames@96", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#replaceTaskNodes@605" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "title": "normalizeTaskCompletionStatus", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#existingTagNames@96", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#existingTagNames@96", + "title": "existingTagNames", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#replaceTaskNodes@605", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "title": "replaceTaskNodes", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40" + ] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#existingTagNames@96=>func:src/server/taskRepository.ts#uniqueValues@40", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#existingTagNames@96", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#uniqueValues@40", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#replaceTaskNodes@605", + "edge:call:func:src/server/taskRepository.ts#replaceTaskNodes@605=>func:src/server/taskRepository.ts#uniqueValues@40" + ], + "summary": "以 $transaction() 回调@313 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "name": "$transaction() 回调@392 (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "title": "$transaction() 回调@392", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#dateFromInput@31", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#uniqueValues@40" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "title": "getNodeTimeBounds", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#dateFromInput@31", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#dateFromInput@31", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "title": "nodeTimeRangesToJson", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#getNodeTimeBounds@81" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "title": "normalizeNodeProgress", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#uniqueValues@40", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "edge:call:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#dateFromInput@31", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#uniqueValues@40" + ], + "summary": "以 $transaction() 回调@392 为入口的调用链,覆盖 7 个函数" + }, + { + "id": "flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "name": "map() 回调@382 (src/components/WeeklyOverview.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "steps": [ + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "order": 0, + "nodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "title": "map() 回调@382", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#sortTasks@82", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/types.ts#isPublicPoolPlan@68", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#sortTasks@82", + "order": 1, + "nodeId": "func:src/components/WeeklyOverview.tsx#sortTasks@82", + "title": "sortTasks", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/types.ts#isPublicPoolPlan@68", + "order": 2, + "nodeId": "func:src/types.ts#isPublicPoolPlan@68", + "title": "isPublicPoolPlan", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "order": 3, + "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "title": "getTaskStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "order": 4, + "nodeId": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "title": "handleColumnDragOver", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "order": 5, + "nodeId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "title": "handleColumnDrop", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#clearTaskDragState@207" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "order": 6, + "nodeId": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "title": "getDropBeforeTaskId", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "order": 7, + "nodeId": "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "title": "clearTaskDragState", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#sortTasks@82", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/types.ts#isPublicPoolPlan@68", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDrop@237" + ], + "summary": "以 map() 回调@382 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:src/App.tsx#useEffect() 回调@133@133", + "name": "useEffect() 回调@133 (src/App.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/App.tsx#useEffect() 回调@133@133", + "steps": [ + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#useEffect() 回调@133@133", + "order": 0, + "nodeId": "func:src/App.tsx#useEffect() 回调@133@133", + "title": "useEffect() 回调@133", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTasks@221", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchPeople@241", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTags@256", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchProjectTemplates@323", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchWeeklyPlans@338" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTasks@221", + "order": 1, + "nodeId": "func:src/App.tsx#fetchTasks@221", + "title": "fetchTasks", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchPeople@241", + "order": 2, + "nodeId": "func:src/App.tsx#fetchPeople@241", + "title": "fetchPeople", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTags@256", + "order": 3, + "nodeId": "func:src/App.tsx#fetchTags@256", + "title": "fetchTags", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchProjectTemplates@323", + "order": 4, + "nodeId": "func:src/App.tsx#fetchProjectTemplates@323", + "title": "fetchProjectTemplates", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchWeeklyPlans@338", + "order": 5, + "nodeId": "func:src/App.tsx#fetchWeeklyPlans@338", + "title": "fetchWeeklyPlans", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "order": 6, + "nodeId": "func:src/utils/api.ts#apiPath@15", + "title": "apiPath", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#appPath@7" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39", + "order": 7, + "nodeId": "func:src/App.tsx#readApiError@39", + "title": "readApiError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#appPath@7", + "order": 8, + "nodeId": "func:src/utils/api.ts#appPath@7", + "title": "appPath", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", + "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTasks@221", + "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchPeople@241", + "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTags@256", + "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchProjectTemplates@323", + "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchWeeklyPlans@338", + "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#fetchTags@256=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchTags@256=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/App.tsx#readApiError@39" + ], + "summary": "以 useEffect() 回调@133 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "name": "$transaction() 回调@430 (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "title": "$transaction() 回调@430", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#dateFromInput@31", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#uniqueValues@40" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "title": "getNodeTimeBounds", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#dateFromInput@31", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#dateFromInput@31", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "title": "normalizeNodeProgress", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#uniqueValues@40", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#dateFromInput@31", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#uniqueValues@40" + ], + "summary": "以 $transaction() 回调@430 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "name": "map() 回调@107 (src/utils/nodeTimeRanges.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "steps": [ + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "order": 0, + "nodeId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "title": "map() 回调@107", + "nextStepIds": [ + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 1, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "order": 2, + "nodeId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "title": "addDaysToDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "order": 3, + "nodeId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "title": "constrainNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ], + "summary": "以 map() 回调@107 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "name": "map() 回调@266 (src/components/PersonGanttChart.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "steps": [ + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "order": 0, + "nodeId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "title": "map() 回调@266", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "order": 1, + "nodeId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "order": 2, + "nodeId": "func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "title": "getStatusVisual", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "order": 3, + "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "title": "getTaskPriorityMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 7, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ], + "summary": "以 map() 回调@266 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90", + "name": "handleSsoLogin (src/components/LoginPage.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "steps": [ + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#handleSsoLogin@90", + "order": 0, + "nodeId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "title": "handleSsoLogin", + "nextStepIds": [ + "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#createOAuthState@31", + "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#readApiJson@21", + "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#requestSsoOAuthCode@39" + ] + }, + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#createOAuthState@31", + "order": 1, + "nodeId": "func:src/components/LoginPage.tsx#createOAuthState@31", + "title": "createOAuthState", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#apiPath@15", + "order": 2, + "nodeId": "func:src/utils/api.ts#apiPath@15", + "title": "apiPath", + "nextStepIds": [ + "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#appPath@7" + ] + }, + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#readApiJson@21", + "order": 3, + "nodeId": "func:src/components/LoginPage.tsx#readApiJson@21", + "title": "readApiJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "order": 4, + "nodeId": "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "title": "requestSsoOAuthCode", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#appPath@7", + "order": 5, + "nodeId": "func:src/utils/api.ts#appPath@7", + "title": "appPath", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", + "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#createOAuthState@31", + "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#readApiJson@21", + "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#requestSsoOAuthCode@39" + ], + "summary": "以 handleSsoLogin 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "name": "map() 回调@513 (src/components/WeeklyOverview.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "steps": [ + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "order": 0, + "nodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "title": "map() 回调@513", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "order": 1, + "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "title": "getTaskDisplayStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/date.ts#getLocalDateString@1", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "order": 2, + "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "title": "getTaskStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "order": 3, + "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "title": "getTaskPriorityMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "order": 4, + "nodeId": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "title": "handleTaskDragStart", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#stopBoardDrag@138" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/date.ts#getLocalDateString@1", + "order": 5, + "nodeId": "func:src/utils/date.ts#getLocalDateString@1", + "title": "getLocalDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 7, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "order": 8, + "nodeId": "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "title": "stopBoardDrag", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 9, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 10, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214=>func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214" + ], + "summary": "以 map() 回调@513 为入口的调用链,覆盖 11 个函数" + }, + { + "id": "flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "name": "匿名函数@644 (src/components/WeeklyOverview.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "steps": [ + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "order": 0, + "nodeId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "title": "匿名函数@644", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "order": 1, + "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "title": "getTaskDisplayStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/date.ts#getLocalDateString@1", + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "order": 2, + "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "title": "getTaskStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "order": 3, + "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "title": "getTaskPriorityMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/date.ts#getLocalDateString@1", + "order": 5, + "nodeId": "func:src/utils/date.ts#getLocalDateString@1", + "title": "getLocalDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 7, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 8, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79" + ], + "summary": "以 匿名函数@644 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "name": "map() 回调@721 (src/components/WeeklyOverview.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "steps": [ + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "order": 0, + "nodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "title": "map() 回调@721", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "order": 1, + "nodeId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "order": 2, + "nodeId": "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "title": "normalizeProgress", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 3, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ], + "summary": "以 map() 回调@721 为入口的调用链,覆盖 7 个函数" + }, + { + "id": "flow:call:func:src/App.tsx#handleReorderTask@798", + "name": "handleReorderTask (src/App.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/App.tsx#handleReorderTask@798", + "steps": [ + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#handleReorderTask@798", + "order": 0, + "nodeId": "func:src/App.tsx#handleReorderTask@798", + "title": "handleReorderTask", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#sortTasksForList@54", + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#readApiError@39", + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#fetchTasks@221" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#sortTasksForList@54", + "order": 1, + "nodeId": "func:src/App.tsx#sortTasksForList@54", + "title": "sortTasksForList", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#apiPath@15", + "order": 2, + "nodeId": "func:src/utils/api.ts#apiPath@15", + "title": "apiPath", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#appPath@7" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#readApiError@39", + "order": 3, + "nodeId": "func:src/App.tsx#readApiError@39", + "title": "readApiError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#fetchTasks@221", + "order": 4, + "nodeId": "func:src/App.tsx#fetchTasks@221", + "title": "fetchTasks", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#appPath@7", + "order": 5, + "nodeId": "func:src/utils/api.ts#appPath@7", + "title": "appPath", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", + "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#sortTasksForList@54", + "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#fetchTasks@221" + ], + "summary": "以 handleReorderTask 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/App.tsx#handleUpdateNodes@1371", + "name": "handleUpdateNodes (src/App.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/App.tsx#handleUpdateNodes@1371", + "steps": [ + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#handleUpdateNodes@1371", + "order": 0, + "nodeId": "func:src/App.tsx#handleUpdateNodes@1371", + "title": "handleUpdateNodes", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#edgeKey@1383", + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#requestTaskUpdate@1425", + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#handleRefreshTask@1353" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "order": 1, + "nodeId": "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "title": "constrainWorkflowNodesTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#edgeKey@1383", + "order": 2, + "nodeId": "func:src/App.tsx#edgeKey@1383", + "title": "edgeKey", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#requestTaskUpdate@1425", + "order": 3, + "nodeId": "func:src/App.tsx#requestTaskUpdate@1425", + "title": "requestTaskUpdate", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#handleRefreshTask@1353", + "order": 4, + "nodeId": "func:src/App.tsx#handleRefreshTask@1353", + "title": "handleRefreshTask", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#apiPath@15", + "order": 5, + "nodeId": "func:src/utils/api.ts#apiPath@15", + "title": "apiPath", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#appPath@7" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#readApiError@39", + "order": 6, + "nodeId": "func:src/App.tsx#readApiError@39", + "title": "readApiError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#appPath@7", + "order": 7, + "nodeId": "func:src/utils/api.ts#appPath@7", + "title": "appPath", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", + "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#edgeKey@1383", + "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#requestTaskUpdate@1425", + "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#handleRefreshTask@1353" + ], + "summary": "以 handleUpdateNodes 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118", + "name": "toWorkflowNode (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#toWorkflowNode@118", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "title": "toWorkflowNode", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#dateToInput@36", + "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeProgress@44" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#dateToInput@36", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#dateToInput@36", + "title": "dateToInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "title": "normalizeNodeProgress", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#dateToInput@36", + "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeProgress@44" + ], + "summary": "以 toWorkflowNode 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "name": "$transaction() 回调@273 (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "title": "$transaction() 回调@273", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#replaceTaskNodes@605" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "title": "normalizeTaskCompletionStatus", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#replaceTaskNodes@605", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "title": "replaceTaskNodes", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#uniqueValues@40" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#uniqueValues@40", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", + "title": "uniqueValues", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#replaceTaskNodes@605", + "edge:call:func:src/server/taskRepository.ts#replaceTaskNodes@605=>func:src/server/taskRepository.ts#uniqueValues@40" + ], + "summary": "以 $transaction() 回调@273 为入口的调用链,覆盖 5 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#map() 回调@618@618", + "name": "map() 回调@618 (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#map() 回调@618@618", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#map() 回调@618@618", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#map() 回调@618@618", + "title": "map() 回调@618", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#dateFromInput@31", + "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeProgress@44" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "title": "getNodeTimeBounds", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#dateFromInput@31", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#dateFromInput@31", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "title": "normalizeNodeProgress", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#dateFromInput@31", + "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#normalizeNodeProgress@44" + ], + "summary": "以 map() 回调@618 为入口的调用链,覆盖 5 个函数" + }, + { + "id": "flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "name": "map() 回调@58 (src/server/projectTemplateRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "steps": [ + { + "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "order": 0, + "nodeId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "title": "map() 回调@58", + "nextStepIds": [ + "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17" + ] + }, + { + "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "order": 1, + "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "order": 2, + "nodeId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "order": 3, + "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "title": "normalizeNodeProgress", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17" + ], + "summary": "以 map() 回调@58 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:src/server/botQueryTools.ts#execute@297", + "name": "execute (src/server/botQueryTools.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/botQueryTools.ts#execute@297", + "steps": [ + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#execute@297", + "order": 0, + "nodeId": "func:src/server/botQueryTools.ts#execute@297", + "title": "execute", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#planNameById@198", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#summarizeTask@172" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "order": 1, + "nodeId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "title": "resolveTaskScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#selfScope@149", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#planNameById@198", + "order": 2, + "nodeId": "func:src/server/botQueryTools.ts#planNameById@198", + "title": "planNameById", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#summarizeTask@172", + "order": 3, + "nodeId": "func:src/server/botQueryTools.ts#summarizeTask@172", + "title": "summarizeTask", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#taskDateSpan@51", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#buildTaskLink@72" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#selfScope@149", + "order": 4, + "nodeId": "func:src/server/botQueryTools.ts#selfScope@149", + "title": "selfScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "order": 5, + "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "title": "isTaskRelatedToPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "order": 6, + "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#taskDateSpan@51", + "order": 7, + "nodeId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "title": "taskDateSpan", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#buildTaskLink@72", + "order": 8, + "nodeId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "title": "buildTaskLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeStartDate@28", + "order": 9, + "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "title": "nodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeEndDate@34", + "order": 10, + "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "title": "nodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeRanges@21", + "order": 11, + "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "title": "nodeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#taskDateSpan@51", + "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#buildTaskLink@72", + "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#planNameById@198", + "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#summarizeTask@172" + ], + "summary": "以 execute 为入口的调用链,覆盖 12 个函数" + }, + { + "id": "flow:call:func:src/server/botQueryTools.ts#execute@542", + "name": "execute (src/server/botQueryTools.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/botQueryTools.ts#execute@542", + "steps": [ + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#execute@542", + "order": 0, + "nodeId": "func:src/server/botQueryTools.ts#execute@542", + "title": "execute", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "order": 1, + "nodeId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "title": "resolveTaskScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#selfScope@149", + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "order": 2, + "nodeId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "title": "isNodeOwnedByPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "order": 3, + "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#selfScope@149", + "order": 4, + "nodeId": "func:src/server/botQueryTools.ts#selfScope@149", + "title": "selfScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "order": 5, + "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "title": "isTaskRelatedToPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeStartDate@28", + "order": 6, + "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "title": "nodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeEndDate@34", + "order": 7, + "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "title": "nodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeRanges@21", + "order": 8, + "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "title": "nodeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41" + ], + "summary": "以 execute 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:src/components/TaskList.tsx#map() 回调@387@387", + "name": "map() 回调@387 (src/components/TaskList.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/TaskList.tsx#map() 回调@387@387", + "steps": [ + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/components/TaskList.tsx#map() 回调@387@387", + "order": 0, + "nodeId": "func:src/components/TaskList.tsx#map() 回调@387@387", + "title": "map() 回调@387", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "order": 1, + "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "title": "getTaskDisplayStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/date.ts#getLocalDateString@1", + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "order": 2, + "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "title": "getTaskStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "order": 3, + "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "title": "getTaskPriorityMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/date.ts#getLocalDateString@1", + "order": 4, + "nodeId": "func:src/utils/date.ts#getLocalDateString@1", + "title": "getLocalDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 7, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 8, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" + ], + "summary": "以 map() 回调@387 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "name": "WorkflowCanvas (src/components/WorkflowCanvas.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "steps": [ + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "order": 0, + "nodeId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "title": "WorkflowCanvas", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/date.ts#getLocalDateString@1", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/date.ts#getLocalDateString@1", + "order": 1, + "nodeId": "func:src/utils/date.ts#getLocalDateString@1", + "title": "getLocalDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "order": 2, + "nodeId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "title": "findPreviewNodePosition", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "order": 3, + "nodeId": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "title": "handleImportTemplate", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "order": 4, + "nodeId": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "title": "getOverlapArea", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "order": 5, + "nodeId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "title": "buildImportedTemplateNodes", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#toMs@623" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#toMs@623", + "order": 7, + "nodeId": "func:src/components/WorkflowCanvas.tsx#toMs@623", + "title": "toMs", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 8, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 9, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/utils/date.ts#getLocalDateString@1", + "edge:call:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361=>func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/components/WorkflowCanvas.tsx#toMs@623", + "edge:call:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667=>func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667" + ], + "summary": "以 WorkflowCanvas 为入口的调用链,覆盖 10 个函数" + }, + { + "id": "flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14", + "name": "TaskOverview (src/components/TaskOverview.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "steps": [ + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/components/TaskOverview.tsx#TaskOverview@14", + "order": 0, + "nodeId": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "title": "TaskOverview", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "order": 1, + "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "title": "getTaskDisplayStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/date.ts#getLocalDateString@1", + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "order": 2, + "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "title": "getTaskStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "order": 3, + "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "title": "getTaskPriorityMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/date.ts#getLocalDateString@1", + "order": 4, + "nodeId": "func:src/utils/date.ts#getLocalDateString@1", + "title": "getLocalDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 7, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 8, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" + ], + "summary": "以 TaskOverview 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "name": "requestAnimationFrame() 回调@174 (src/components/GanttChart.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "steps": [ + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "order": 0, + "nodeId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "title": "requestAnimationFrame() 回调@174", + "nextStepIds": [ + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "order": 1, + "nodeId": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "title": "getTimelinePercentage", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 2, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 3, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ], + "summary": "以 requestAnimationFrame() 回调@174 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260", + "name": "map() 回调@260 (src/components/GanttChart.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "steps": [ + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#map() 回调@260@260", + "order": 0, + "nodeId": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "title": "map() 回调@260", + "nextStepIds": [ + "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#isWeekend@86", + "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#formatDateString@76", + "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#getDayLabel@80" + ] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#isWeekend@86", + "order": 1, + "nodeId": "func:src/components/GanttChart.tsx#isWeekend@86", + "title": "isWeekend", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#formatDateString@76", + "order": 2, + "nodeId": "func:src/components/GanttChart.tsx#formatDateString@76", + "title": "formatDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#getDayLabel@80", + "order": 3, + "nodeId": "func:src/components/GanttChart.tsx#getDayLabel@80", + "title": "getDayLabel", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#isWeekend@86", + "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#formatDateString@76", + "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#getDayLabel@80" + ], + "summary": "以 map() 回调@260 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "name": "useMemo() 回调@51 (src/components/PersonGanttChart.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "steps": [ + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "order": 0, + "nodeId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "title": "useMemo() 回调@51", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "order": 1, + "nodeId": "func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "title": "buildDateRange", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 2, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 3, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ], + "summary": "以 useMemo() 回调@51 为入口的调用链,覆盖 6 个函数" + } + ], + "externalSystems": [ + { + "id": "ext:db:prisma", + "kind": "database", + "name": "prisma", + "engine": "prisma", + "tables": [ + "nodeDependency", + "nodeResponsible", + "notificationLog", + "person", + "projectTemplate", + "tagDefinition", + "task", + "taskResponsible", + "taskTag", + "weeklyPlan", + "workflowNode" + ], + "functionIds": [ + "func:prisma/seed.ts#seed@13", + "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "func:src/server/taskRepository.ts#existingTagNames@96", + "func:src/server/taskRepository.ts#findTaskRecord@111", + "func:src/server/taskRepository.ts#listTasks@194", + "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "func:src/server/taskRepository.ts#createTask@227", + "func:src/server/taskRepository.ts#updateTask@302", + "func:src/server/taskRepository.ts#updateTaskListState@353", + "func:src/server/taskRepository.ts#deleteTask@383", + "func:src/server/taskRepository.ts#createWorkflowNode@389", + "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "func:src/server/taskRepository.ts#createNodeDependency@494", + "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "func:src/server/taskRepository.ts#ensureTaskExists@560", + "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "func:src/server/taskRepository.ts#hasDependencyPath@577", + "func:src/server/notificationRepository.ts#createNotificationLog@37", + "func:src/server/notificationRepository.ts#listNotificationLogs@47", + "func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "func:src/server/tagRepository.ts#listTagDefinitions@11", + "func:src/server/tagRepository.ts#createTagDefinition@19", + "func:src/server/tagRepository.ts#deleteTagDefinition@34", + "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "func:src/server/personRepository.ts#listPeople@53", + "func:src/server/personRepository.ts#getPersonOrThrow@64", + "func:src/server/personRepository.ts#createPerson@73", + "func:src/server/personRepository.ts#ensurePeople@118", + "func:src/server/personRepository.ts#updatePerson@142", + "func:src/server/personRepository.ts#deletePerson@177" + ], + "interactionCount": 58, + "provenance": "resolved" + }, + { + "id": "ext:service:api.dingtalk.com", + "kind": "service", + "name": "api.dingtalk.com", + "protocol": "http", + "endpoints": [ + "https://api.dingtalk.com/v1.0/oauth2/accessToken", + "https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend" + ], + "functionIds": [ + "func:server.ts#getDingTalkRobotAccessToken@128", + "func:server.ts#sendDingTalkRobotMarkdownMessage@162" + ], + "interactionCount": 2, + "provenance": "resolved" + } + ] +} \ No newline at end of file diff --git a/self-report.json b/self-report.json new file mode 100644 index 0000000..c66a8bb --- /dev/null +++ b/self-report.json @@ -0,0 +1,5190 @@ +{ + "schemaVersion": "0.1.0", + "project": { + "name": "code-visualize", + "root": "E:/code-visualize", + "languages": [ + "tsx", + "typescript" + ], + "generatedAt": "2026-07-22T03:03:33.188Z", + "generator": "code-visualize-cli@0.1.0" + }, + "stats": { + "fileCount": 21, + "containerCount": 2, + "functionCount": 94, + "edgeCount": 110, + "loc": 2212 + }, + "modules": [ + { + "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" + ], + "parentId": "module:." + }, + { + "id": "module:.", + "kind": "module", + "name": "code-visualize", + "provenance": "ast", + "path": ".", + "childModuleIds": [ + "module:src", + "module:web" + ], + "fileIds": [] + }, + { + "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" + ], + "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" + ], + "parentId": "module:web/src/view" + } + ], + "files": [ + { + "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" + ] + }, + { + "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": [] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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": [] + }, + { + "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": [] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "id": "file:web/src/viewmodel/GraphViewModel.ts", + "kind": "file", + "name": "GraphViewModel.ts", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 1, + "endLine": 290 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:web/src/viewmodel", + "path": "web/src/viewmodel/GraphViewModel.ts", + "loc": 290, + "containerIds": [ + "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + ], + "functionIds": [ + "func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "func:web/src/viewmodel/GraphViewModel.ts#runInAction() 回调@149@149", + "func:web/src/viewmodel/GraphViewModel.ts#map() 回调@186@186" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "id": "file:web/src/view/components/FlowGraph.tsx", + "kind": "file", + "name": "FlowGraph.tsx", + "location": { + "file": "web/src/view/components/FlowGraph.tsx", + "startLine": 1, + "endLine": 73 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:web/src/view/components", + "path": "web/src/view/components/FlowGraph.tsx", + "loc": 73, + "containerIds": [], + "functionIds": [ + "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "func:web/src/view/components/FlowGraph.tsx#@0" + ] + }, + { + "id": "file:web/src/view/components/FlowList.tsx", + "kind": "file", + "name": "FlowList.tsx", + "location": { + "file": "web/src/view/components/FlowList.tsx", + "startLine": 1, + "endLine": 26 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:web/src/view/components", + "path": "web/src/view/components/FlowList.tsx", + "loc": 26, + "containerIds": [], + "functionIds": [ + "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4", + "func:web/src/view/components/FlowList.tsx#@0" + ] + }, + { + "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" + ] + }, + { + "id": "file:web/src/view/components/NodeDetailPanel.tsx", + "kind": "file", + "name": "NodeDetailPanel.tsx", + "location": { + "file": "web/src/view/components/NodeDetailPanel.tsx", + "startLine": 1, + "endLine": 86 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:web/src/view/components", + "path": "web/src/view/components/NodeDetailPanel.tsx", + "loc": 86, + "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" + ] + }, + { + "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" + ] + }, + { + "id": "file:web/src/view/App.tsx", + "kind": "file", + "name": "App.tsx", + "location": { + "file": "web/src/view/App.tsx", + "startLine": 1, + "endLine": 55 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:web/src/view", + "path": "web/src/view/App.tsx", + "loc": 55, + "containerIds": [], + "functionIds": [ + "func:web/src/view/App.tsx#observer() 回调@9@9", + "func:web/src/view/App.tsx#@0" + ] + }, + { + "id": "file:web/src/main.tsx", + "kind": "file", + "name": "main.tsx", + "location": { + "file": "web/src/main.tsx", + "startLine": 1, + "endLine": 26 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:web/src", + "path": "web/src/main.tsx", + "loc": 26, + "containerIds": [], + "functionIds": [ + "func:web/src/main.tsx#@0" + ] + }, + { + "id": "file:web/vite.config.ts", + "kind": "file", + "name": "vite.config.ts", + "location": { + "file": "web/vite.config.ts", + "startLine": 1, + "endLine": 11 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:web", + "path": "web/vite.config.ts", + "loc": 11, + "containerIds": [], + "functionIds": [ + "func:web/vite.config.ts#@0" + ] + } + ], + "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": [] + }, + { + "id": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "kind": "container", + "name": "GraphViewModel", + "qualifiedName": "GraphViewModel", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 43, + "endLine": 289, + "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@58", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.sources@66", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentSource@70", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flows@160", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentFlow@165", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFunc@194", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flowsForSelectedFunc@202", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcIdsInFlows@225", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchResults@240", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286" + ], + "fieldIds": [ + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loading@44", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.error@45", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.report@46", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedSourceId@48", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedGroupId@49", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFlowId@50", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedNodeId@51", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchQuery@52", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcById@54", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.containerById@55", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.fileById@56" + ] + } + ], + "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: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/viewmodel/GraphViewModel.ts#baseName@34", + "kind": "function", + "name": "baseName", + "qualifiedName": "baseName", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 34, + "endLine": 37, + "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@58", + "kind": "function", + "name": "constructor", + "qualifiedName": "GraphViewModel.constructor", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 58, + "endLine": 64, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "constructor(sourceList: ReportSource[], makeRepository: (url: string) => ReportRepository)", + "params": [ + { + "name": "sourceList", + "typeRef": "ReportSource[]", + "optional": false + }, + { + "name": "makeRepository", + "typeRef": "(url: string) => ReportRepository", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.sources@66", + "kind": "function", + "name": "sources", + "qualifiedName": "GraphViewModel.sources", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 66, + "endLine": 68, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "sources(): ReportSource[]", + "params": [], + "returnType": "ReportSource[]", + "loc": 3 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentSource@70", + "kind": "function", + "name": "currentSource", + "qualifiedName": "GraphViewModel.currentSource", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 70, + "endLine": 72, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "currentSource(): ReportSource | null", + "params": [], + "returnType": "ReportSource | null", + "loc": 3 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "kind": "function", + "name": "selectReport", + "qualifiedName": "GraphViewModel.selectReport", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 74, + "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@43", + "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.groupOfFlow@86", + "kind": "function", + "name": "groupOfFlow", + "qualifiedName": "GraphViewModel.groupOfFlow", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 86, + "endLine": 97, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "groupOfFlow(flow: Flow): FlowGroup", + "params": [ + { + "name": "flow", + "typeRef": "Flow", + "optional": false + } + ], + "returnType": "FlowGroup", + "loc": 12 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "kind": "function", + "name": "groups", + "qualifiedName": "GraphViewModel.groups", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 100, + "endLine": 109, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "groups(): FlowGroup[]", + "params": [], + "returnType": "FlowGroup[]", + "loc": 10 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "kind": "function", + "name": "visibleFlows", + "qualifiedName": "GraphViewModel.visibleFlows", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 112, + "endLine": 115, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "visibleFlows(): Flow[]", + "params": [], + "returnType": "Flow[]", + "loc": 4 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117", + "kind": "function", + "name": "selectGroup", + "qualifiedName": "GraphViewModel.selectGroup", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 117, + "endLine": 124, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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@126", + "kind": "function", + "name": "load", + "qualifiedName": "GraphViewModel.load", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 126, + "endLine": 157, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "load(): Promise", + "params": [], + "returnType": "Promise", + "loc": 32 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flows@160", + "kind": "function", + "name": "flows", + "qualifiedName": "GraphViewModel.flows", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 160, + "endLine": 163, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "flows(): Flow[]", + "params": [], + "returnType": "Flow[]", + "loc": 4 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentFlow@165", + "kind": "function", + "name": "currentFlow", + "qualifiedName": "GraphViewModel.currentFlow", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 165, + "endLine": 168, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "currentFlow(): Flow | null", + "params": [], + "returnType": "Flow | null", + "loc": 4 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "kind": "function", + "name": "positionedGraph", + "qualifiedName": "GraphViewModel.positionedGraph", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 171, + "endLine": 192, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "positionedGraph(): PositionedGraph", + "params": [], + "returnType": "PositionedGraph", + "loc": 22 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFunc@194", + "kind": "function", + "name": "selectedFunc", + "qualifiedName": "GraphViewModel.selectedFunc", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 194, + "endLine": 199, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "selectedFunc(): Func | null", + "params": [], + "returnType": "Func | null", + "loc": 6 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flowsForSelectedFunc@202", + "kind": "function", + "name": "flowsForSelectedFunc", + "qualifiedName": "GraphViewModel.flowsForSelectedFunc", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 202, + "endLine": 208, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "flowsForSelectedFunc(): Flow[]", + "params": [], + "returnType": "Flow[]", + "loc": 7 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "kind": "function", + "name": "openFlowForFunc", + "qualifiedName": "GraphViewModel.openFlowForFunc", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 211, + "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@43", + "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@221", + "kind": "function", + "name": "setSearchQuery", + "qualifiedName": "GraphViewModel.setSearchQuery", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 221, + "endLine": 223, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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@225", + "kind": "function", + "name": "funcIdsInFlows", + "qualifiedName": "GraphViewModel.funcIdsInFlows", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 225, + "endLine": 231, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "funcIdsInFlows(): Set", + "params": [], + "returnType": "Set", + "loc": 7 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "kind": "function", + "name": "biggestFlowForFunc", + "qualifiedName": "GraphViewModel.biggestFlowForFunc", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 233, + "endLine": 238, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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@240", + "kind": "function", + "name": "searchResults", + "qualifiedName": "GraphViewModel.searchResults", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 240, + "endLine": 266, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "searchResults(): SearchResult[]", + "params": [], + "returnType": "SearchResult[]", + "loc": 27 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "kind": "function", + "name": "activateSearchResult", + "qualifiedName": "GraphViewModel.activateSearchResult", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 268, + "endLine": 278, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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@280", + "kind": "function", + "name": "selectFlow", + "qualifiedName": "GraphViewModel.selectFlow", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 280, + "endLine": 284, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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@286", + "kind": "function", + "name": "selectNode", + "qualifiedName": "GraphViewModel.selectNode", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 286, + "endLine": 288, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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#runInAction() 回调@149@149", + "kind": "function", + "name": "runInAction() 回调@149", + "qualifiedName": "runInAction() 回调@149", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 149, + "endLine": 151, + "startCol": 19, + "endCol": 8 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "moduleId": "module:web/src/viewmodel", + "signature": "runInAction() 回调@149()", + "params": [], + "loc": 3 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#map() 回调@186@186", + "kind": "function", + "name": "map() 回调@186", + "qualifiedName": "map() 回调@186", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 186, + "endLine": 189, + "startCol": 53, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "moduleId": "module:web/src/viewmodel", + "signature": "map() 回调@186(n)", + "params": [ + { + "name": "n", + "optional": false + } + ], + "loc": 4 + }, + { + "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() 回调@17@17", + "kind": "function", + "name": "observer() 回调@17", + "qualifiedName": "observer() 回调@17", + "location": { + "file": "web/src/view/components/FlowGraph.tsx", + "startLine": 17, + "endLine": 72, + "startCol": 35, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:web/src/view/components/FlowGraph.tsx", + "moduleId": "module:web/src/view/components", + "signature": "observer() 回调@17()", + "params": [], + "loc": 56 + }, + { + "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": 25, + "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": 22 + }, + { + "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": 85, + "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": 73 + }, + { + "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/view/App.tsx#observer() 回调@9@9", + "kind": "function", + "name": "observer() 回调@9", + "qualifiedName": "observer() 回调@9", + "location": { + "file": "web/src/view/App.tsx", + "startLine": 9, + "endLine": 54, + "startCol": 29, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:web/src/view/App.tsx", + "moduleId": "module:web/src/view", + "signature": "observer() 回调@9()", + "params": [], + "loc": 46 + }, + { + "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: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": 73 + }, + "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": 26 + }, + "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": 86 + }, + "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/App.tsx#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "web/src/view/App.tsx", + "startLine": 1, + "endLine": 55 + }, + "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": 26 + }, + "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": 11 + }, + "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@44", + "kind": "field", + "name": "loading", + "qualifiedName": "GraphViewModel.loading", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 44, + "endLine": 44, + "startCol": 3, + "endCol": 19 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.error@45", + "kind": "field", + "name": "error", + "qualifiedName": "GraphViewModel.error", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 45, + "endLine": 45, + "startCol": 3, + "endCol": 31 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "string | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.report@46", + "kind": "field", + "name": "report", + "qualifiedName": "GraphViewModel.report", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 46, + "endLine": 46, + "startCol": 3, + "endCol": 32 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "Report | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedSourceId@48", + "kind": "field", + "name": "selectedSourceId", + "qualifiedName": "GraphViewModel.selectedSourceId", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 48, + "endLine": 48, + "startCol": 3, + "endCol": 42 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "string | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedGroupId@49", + "kind": "field", + "name": "selectedGroupId", + "qualifiedName": "GraphViewModel.selectedGroupId", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 49, + "endLine": 49, + "startCol": 3, + "endCol": 41 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "string | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFlowId@50", + "kind": "field", + "name": "selectedFlowId", + "qualifiedName": "GraphViewModel.selectedFlowId", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 50, + "endLine": 50, + "startCol": 3, + "endCol": 40 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "string | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedNodeId@51", + "kind": "field", + "name": "selectedNodeId", + "qualifiedName": "GraphViewModel.selectedNodeId", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 51, + "endLine": 51, + "startCol": 3, + "endCol": 40 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "string | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchQuery@52", + "kind": "field", + "name": "searchQuery", + "qualifiedName": "GraphViewModel.searchQuery", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 52, + "endLine": 52, + "startCol": 3, + "endCol": 20 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcById@54", + "kind": "field", + "name": "funcById", + "qualifiedName": "GraphViewModel.funcById", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 54, + "endLine": 54, + "startCol": 3, + "endCol": 46 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.containerById@55", + "kind": "field", + "name": "containerById", + "qualifiedName": "GraphViewModel.containerById", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 55, + "endLine": 55, + "startCol": 3, + "endCol": 56 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.fileById@56", + "kind": "field", + "name": "fileById", + "qualifiedName": "GraphViewModel.fileById", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 56, + "endLine": 56, + "startCol": 3, + "endCol": 50 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + } + ], + "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: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:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86=>func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171=>func:web/src/model/graphModel.ts#flowToGraph@43", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "targetId": "func:web/src/model/graphModel.ts#flowToGraph@43", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171=>func:web/src/services/dagreLayout.ts#computeLayout@31", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "targetId": "func:web/src/services/dagreLayout.ts#computeLayout@31", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "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() 回调@17@17=>func:web/src/view/vmContext.ts#useGraphVM@6", + "kind": "call", + "sourceId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "targetId": "func:web/src/view/vmContext.ts#useGraphVM@6", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286", + "kind": "call", + "sourceId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286", + "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@280", + "kind": "call", + "sourceId": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280", + "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@117", + "kind": "call", + "sourceId": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117", + "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@211", + "kind": "call", + "sourceId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "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@268", + "kind": "call", + "sourceId": "func:web/src/view/components/SearchBar.tsx#activate@12", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "kind": "call", + "sourceId": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "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@221", + "kind": "call", + "sourceId": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "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/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:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/view/vmContext.ts#useGraphVM@6", + "kind": "call", + "sourceId": "func:web/src/view/App.tsx#observer() 回调@9@9", + "targetId": "func:web/src/view/vmContext.ts#useGraphVM@6", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "kind": "call", + "sourceId": "func:web/src/view/App.tsx#observer() 回调@9@9", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "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:call:func:web/src/main.tsx#@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "kind": "call", + "sourceId": "func:web/src/main.tsx#@0", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "provenance": "resolved" + } + ], + "flows": [ + { + "id": "flow:call:func:web/src/main.tsx#@0", + "name": " (web/src/main.tsx)", + "flowType": "call", + "provenance": "resolved", + "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@126" + ] + }, + { + "id": "step:flow:call:func:web/src/main.tsx#@0:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "order": 1, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "title": "GraphViewModel.load", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/main.tsx#@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126" + ], + "summary": "以 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:src/analyzer.ts#visit@245", + "name": "visit (src/analyzer.ts)", + "flowType": "call", + "provenance": "resolved", + "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": "以 visit 为入口的调用链,覆盖 13 个函数" + }, + { + "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": "resolved", + "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@211" + ] + }, + { + "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@211", + "order": 3, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "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@211" + ], + "summary": "以 observer() 回调@13 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "name": "GraphViewModel.positionedGraph (web/src/viewmodel/GraphViewModel.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "steps": [ + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "order": 0, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "title": "GraphViewModel.positionedGraph", + "nextStepIds": [ + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/model/graphModel.ts#flowToGraph@43", + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/services/dagreLayout.ts#computeLayout@31" + ] + }, + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171: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@171: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@171=>func:web/src/model/graphModel.ts#flowToGraph@43", + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171=>func:web/src/services/dagreLayout.ts#computeLayout@31" + ], + "summary": "以 GraphViewModel.positionedGraph 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "name": "observer() 回调@17 (web/src/view/components/FlowGraph.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "steps": [ + { + "id": "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "order": 0, + "nodeId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "title": "observer() 回调@17", + "nextStepIds": [ + "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/view/vmContext.ts#useGraphVM@6", + "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286" + ] + }, + { + "id": "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17: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() 回调@17@17:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286", + "title": "GraphViewModel.selectNode", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17=>func:web/src/view/vmContext.ts#useGraphVM@6", + "edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286" + ], + "summary": "以 observer() 回调@17 为入口的调用链,覆盖 3 个函数" + }, + { + "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": "resolved", + "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@280" + ] + }, + { + "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@280", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280", + "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@280" + ], + "summary": "以 observer() 回调@4 为入口的调用链,覆盖 3 个函数" + }, + { + "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": "resolved", + "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@117" + ] + }, + { + "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@117", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117", + "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@117" + ], + "summary": "以 observer() 回调@4 为入口的调用链,覆盖 3 个函数" + }, + { + "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": "resolved", + "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@221" + ] + }, + { + "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@221", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "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@221" + ], + "summary": "以 observer() 回调@6 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26", + "name": "匿名函数@26 (web/src/view/components/SearchBar.tsx)", + "flowType": "call", + "provenance": "resolved", + "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@221" + ] + }, + { + "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@268" + ] + }, + { + "id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "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@268", + "order": 3, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "title": "GraphViewModel.activateSearchResult", + "nextStepIds": [ + "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211" + ] + }, + { + "id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "order": 4, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "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@211", + "order": 5, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "title": "GraphViewModel.openFlowForFunc", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "edge:call:func:web/src/view/components/SearchBar.tsx#activate@12=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "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@221" + ], + "summary": "以 匿名函数@26 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:web/src/view/App.tsx#observer() 回调@9@9", + "name": "observer() 回调@9 (web/src/view/App.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:web/src/view/App.tsx#observer() 回调@9@9", + "steps": [ + { + "id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/view/App.tsx#observer() 回调@9@9", + "order": 0, + "nodeId": "func:web/src/view/App.tsx#observer() 回调@9@9", + "title": "observer() 回调@9", + "nextStepIds": [ + "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/view/vmContext.ts#useGraphVM@6", + "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74" + ] + }, + { + "id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9: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() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "title": "GraphViewModel.selectReport", + "nextStepIds": [ + "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126" + ] + }, + { + "id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "order": 3, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "title": "GraphViewModel.load", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "edge:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/view/vmContext.ts#useGraphVM@6", + "edge:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74" + ], + "summary": "以 observer() 回调@9 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:src/flows.ts#map() 回调@72@72", + "name": "map() 回调@72 (src/flows.ts)", + "flowType": "call", + "provenance": "resolved", + "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": "以 map() 回调@72 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:src/analyzer.ts#inProject@65", + "name": "inProject (src/analyzer.ts)", + "flowType": "call", + "provenance": "resolved", + "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": "以 inProject 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44", + "name": "map() 回调@44 (web/src/model/graphModel.ts)", + "flowType": "call", + "provenance": "resolved", + "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": "以 map() 回调@44 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "name": "GraphViewModel.groups (web/src/viewmodel/GraphViewModel.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "steps": [ + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "order": 0, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "title": "GraphViewModel.groups", + "nextStepIds": [ + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86" + ] + }, + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "order": 1, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "title": "GraphViewModel.groupOfFlow", + "nextStepIds": [ + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#baseName@34" + ] + }, + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "title": "baseName", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86=>func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86" + ], + "summary": "以 GraphViewModel.groups 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "name": "GraphViewModel.visibleFlows (web/src/viewmodel/GraphViewModel.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "steps": [ + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "order": 0, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "title": "GraphViewModel.visibleFlows", + "nextStepIds": [ + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86" + ] + }, + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "order": 1, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "title": "GraphViewModel.groupOfFlow", + "nextStepIds": [ + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#baseName@34" + ] + }, + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "title": "baseName", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86=>func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86" + ], + "summary": "以 GraphViewModel.visibleFlows 为入口的调用链,覆盖 3 个函数" + }, + { + "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": "resolved", + "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() 回调@40 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41", + "name": "匿名函数@41 (web/src/view/components/SearchBar.tsx)", + "flowType": "call", + "provenance": "resolved", + "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@268" + ] + }, + { + "id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "title": "GraphViewModel.activateSearchResult", + "nextStepIds": [ + "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211" + ] + }, + { + "id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "order": 3, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "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@211", + "order": 4, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "title": "GraphViewModel.openFlowForFunc", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "edge:call:func:web/src/view/components/SearchBar.tsx#activate@12=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41=>func:web/src/view/components/SearchBar.tsx#activate@12" + ], + "summary": "以 匿名函数@41 为入口的调用链,覆盖 5 个函数" + }, + { + "id": "flow:call:func:src/cli.ts#@0", + "name": " (src/cli.ts)", + "flowType": "call", + "provenance": "resolved", + "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": "以 为入口的调用链,覆盖 26 个函数" + } + ], + "externalSystems": [] +} \ No newline at end of file diff --git a/src/analyzer.ts b/src/analyzer.ts new file mode 100644 index 0000000..4b39063 --- /dev/null +++ b/src/analyzer.ts @@ -0,0 +1,609 @@ +import ts from "typescript"; +import path from "node:path"; +import { toPosix, collectSourceFiles, languageOf } from "./scanner"; +import type { + Report, + Module, + CodeFile, + Container, + Func, + Field, + Edge, + Interaction, + DbInteraction, + ApiInteraction, + Param, + SourceLocation, +} from "./types"; +import { deriveExternalSystems } from "./externals"; +import { generateCallFlows } from "./flows"; + +const SCHEMA_VERSION = "0.1.0"; + +const ORM_READ = new Set(["findMany", "findFirst", "findUnique", "findUniqueOrThrow", "findFirstOrThrow", "count", "aggregate", "groupBy"]); +const ORM_CREATE = new Set(["create", "createMany", "upsert", "createManyAndReturn"]); +const ORM_UPDATE = new Set(["update", "updateMany"]); +const ORM_DELETE = new Set(["delete", "deleteMany"]); +const ORM_RAW = new Set(["$queryRaw", "$executeRaw", "$queryRawUnsafe", "$executeRawUnsafe", "$transaction"]); +const ORM_ALL = new Set([...ORM_READ, ...ORM_CREATE, ...ORM_UPDATE, ...ORM_DELETE]); + +const HTTP_VERBS = new Set(["get", "post", "put", "delete", "patch", "options", "head", "all"]); + +export function analyzeProject(root: string): Report { + const absRoot = path.resolve(root); + const projectName = path.basename(absRoot); + const files = collectSourceFiles(absRoot); + + const program = ts.createProgram(files, { + allowJs: true, + checkJs: false, + jsx: ts.JsxEmit.Preserve, + target: ts.ScriptTarget.ESNext, + module: ts.ModuleKind.ESNext, + moduleResolution: ts.ModuleResolutionKind.Bundler, + noEmit: true, + skipLibCheck: true, + allowImportingTsExtensions: true, + esModuleInterop: true, + }); + const checker = program.getTypeChecker(); + + // ---------- 收集容器 ---------- + const modules = new Map(); + const fileEntities = new Map(); // key: rel path + const containers: Container[] = []; + const functions: Func[] = []; + const fields: Field[] = []; + const edges = new Map(); + + const funcIdByNode = new Map(); + const funcById = new Map(); + const registered = new Set(); + const languages = new Set(); + + const relOf = (sf: ts.SourceFile): string => toPosix(path.relative(absRoot, path.resolve(sf.fileName))); + const inProject = (sf: ts.SourceFile): boolean => { + const rel = relOf(sf); + return !rel.startsWith("..") && !rel.includes("node_modules") && !sf.isDeclarationFile; + }; + + const locOf = (node: ts.Node, sf: ts.SourceFile): SourceLocation => { + const start = sf.getLineAndCharacterOfPosition(node.getStart(sf)); + const end = sf.getLineAndCharacterOfPosition(node.getEnd()); + return { + file: relOf(sf), + startLine: start.line + 1, + endLine: end.line + 1, + startCol: start.character + 1, + endCol: end.character + 1, + }; + }; + + // ---------- 模块树 ---------- + const ensureModule = (dir: string): Module => { + const key = dir === "." ? "" : dir; + const existing = modules.get(key); + if (existing) return existing; + const name = key === "" ? projectName : key.split("/").pop()!; + const mod: Module = { + id: `module:${key || "."}`, + kind: "module", + name, + provenance: "ast", + path: key || ".", + childModuleIds: [], + fileIds: [], + }; + modules.set(key, mod); + if (key !== "") { + const parentDir = key.includes("/") ? key.slice(0, key.lastIndexOf("/")) : ""; + const parent = ensureModule(parentDir); + mod.parentId = parent.id; + if (!parent.childModuleIds.includes(mod.id)) parent.childModuleIds.push(mod.id); + } + return mod; + }; + + // ---------- 参数/签名 ---------- + const getParams = (fn: ts.SignatureDeclarationBase, sf: ts.SourceFile): Param[] => { + return fn.parameters.map((p) => ({ + name: p.name.getText(sf), + typeRef: p.type?.getText(sf), + optional: !!p.questionToken || !!p.initializer, + defaultValue: p.initializer?.getText(sf), + })); + }; + + const buildSignature = (name: string, params: Param[], ret?: string): string => { + const ps = params.map((p) => (p.typeRef ? `${p.name}: ${p.typeRef}` : p.name)).join(", "); + return `${name}(${ps})${ret ? `: ${ret}` : ""}`; + }; + + const registerFunc = ( + declNode: ts.Node, + fnNode: ts.SignatureDeclarationBase & ts.Node, + name: string, + sf: ts.SourceFile, + rel: string, + fileEntity: CodeFile, + ownerId?: string, + qualifiedPrefix?: string + ): Func => { + if (registered.has(declNode)) return funcById.get(funcIdByNode.get(declNode)!)!; + registered.add(declNode); + const loc = locOf(declNode, sf); + const params = getParams(fnNode, sf); + const returnType = (fnNode as ts.FunctionLikeDeclaration).type?.getText(sf); + const qualified = qualifiedPrefix ? `${qualifiedPrefix}.${name}` : name; + const id = `func:${rel}#${qualified}@${loc.startLine}`; + const isEntry = /(^|\/)(server|main|index|app)\.[jt]sx?$/.test(rel) && !ownerId; + const fn: Func = { + id, + kind: "function", + name, + qualifiedName: qualified, + location: loc, + language: languageOf(rel), + provenance: "ast", + fileId: fileEntity.id, + ownerId, + moduleId: fileEntity.moduleId, + signature: buildSignature(name, params, returnType), + params, + returnType, + isEntry: isEntry || undefined, + loc: loc.endLine - loc.startLine + 1, + }; + functions.push(fn); + funcById.set(id, fn); + funcIdByNode.set(declNode, id); + if (ownerId) { + const c = containers.find((x) => x.id === ownerId); + c?.functionIds.push(id); + } else { + fileEntity.functionIds.push(id); + } + return fn; + }; + + const isFnInit = (node?: ts.Node): node is ts.ArrowFunction | ts.FunctionExpression => + !!node && (ts.isArrowFunction(node) || ts.isFunctionExpression(node)); + + // 判断函数体内是否存在调用(用于筛选「有意义的」内联回调,跳过琐碎箭头) + const containsCall = (n: ts.Node): boolean => { + let found = false; + const scan = (x: ts.Node): void => { + if (found) return; + if (ts.isCallExpression(x) || ts.isNewExpression(x)) { + found = true; + return; + } + ts.forEachChild(x, scan); + }; + ts.forEachChild(n, scan); + return found; + }; + + // 若某个调用是路由注册(app/router.verb('/path', ...)),返回形如 "GET /path" 的名字 + const routeNameFromCall = (call: ts.CallExpression, sf: ts.SourceFile): string | undefined => { + const e = call.expression; + if ( + ts.isPropertyAccessExpression(e) && + HTTP_VERBS.has(e.name.text) && + /app|router|server|route/i.test(e.expression.getText(sf)) + ) { + const p = extractPathArg(call.arguments[0], sf); + if (p !== undefined) return `${e.name.text.toUpperCase()} ${p}`; + } + return undefined; + }; + + // 为内联匿名函数按上下文取名:路由 handler > 回调所属调用 > JSX 属性 > 匿名 + const inlineName = (fn: ts.ArrowFunction | ts.FunctionExpression, sf: ts.SourceFile): string => { + const line = locOf(fn, sf).startLine; + const parent = fn.parent; + if (parent && ts.isCallExpression(parent)) { + const routeName = routeNameFromCall(parent, sf); + if (routeName) return routeName; + const callee = parent.expression; + const cn = ts.isPropertyAccessExpression(callee) + ? callee.name.text + : ts.isIdentifier(callee) + ? callee.text + : "fn"; + return `${cn}() 回调@${line}`; + } + if (parent && ts.isJsxAttribute(parent)) { + return `${parent.name.getText(sf)} 处理@${line}`; + } + return `匿名函数@${line}`; + }; + + // ---------- 注册 pass ---------- + const registerFile = (sf: ts.SourceFile): void => { + const rel = relOf(sf); + languages.add(languageOf(rel)); + const dir = toPosix(path.dirname(rel)); + const mod = ensureModule(dir === "." ? "" : dir); + const lineCount = sf.getLineAndCharacterOfPosition(sf.getEnd()).line + 1; + const fileEntity: CodeFile = { + id: `file:${rel}`, + kind: "file", + name: toPosix(path.basename(rel)), + location: { file: rel, startLine: 1, endLine: lineCount }, + language: languageOf(rel), + provenance: "ast", + moduleId: mod.id, + path: rel, + loc: lineCount, + containerIds: [], + functionIds: [], + }; + fileEntities.set(rel, fileEntity); + if (!mod.fileIds.includes(fileEntity.id)) mod.fileIds.push(fileEntity.id); + + const visit = (node: ts.Node): void => { + // 类 / 类似容器 + if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) { + const cname = node.name?.text ?? ""; + const loc = locOf(node, sf); + const container: Container = { + id: `container:${rel}#${cname}@${loc.startLine}`, + kind: "container", + name: cname, + qualifiedName: cname, + location: loc, + language: languageOf(rel), + provenance: "ast", + fileId: fileEntity.id, + moduleId: mod.id, + functionIds: [], + fieldIds: [], + }; + containers.push(container); + fileEntity.containerIds.push(container.id); + for (const member of node.members) { + if ( + ts.isMethodDeclaration(member) || + ts.isConstructorDeclaration(member) || + ts.isGetAccessor(member) || + ts.isSetAccessor(member) + ) { + const mname = ts.isConstructorDeclaration(member) ? "constructor" : member.name?.getText(sf) ?? ""; + registerFunc(member, member, mname, sf, rel, fileEntity, container.id, cname); + } else if (ts.isPropertyDeclaration(member)) { + registered.add(member); + if (isFnInit(member.initializer)) { + registered.add(member.initializer); + const mname = member.name.getText(sf); + registerFunc(member, member.initializer, mname, sf, rel, fileEntity, container.id, cname); + } else { + const loc2 = locOf(member, sf); + const fname = member.name.getText(sf); + const field: Field = { + id: `field:${rel}#${cname}.${fname}@${loc2.startLine}`, + kind: "field", + name: fname, + qualifiedName: `${cname}.${fname}`, + location: loc2, + language: languageOf(rel), + provenance: "ast", + ownerId: container.id, + typeRef: member.type?.getText(sf), + }; + fields.push(field); + container.fieldIds.push(field.id); + } + } + } + ts.forEachChild(node, visit); + return; + } + + if (ts.isFunctionDeclaration(node) && node.name && !registered.has(node)) { + registerFunc(node, node, node.name.text, sf, rel, fileEntity); + } else if (ts.isVariableDeclaration(node) && isFnInit(node.initializer) && ts.isIdentifier(node.name)) { + registered.add(node.initializer); + registerFunc(node, node.initializer, node.name.text, sf, rel, fileEntity); + } else if ( + ts.isPropertyAssignment(node) && + isFnInit(node.initializer) && + (ts.isIdentifier(node.name) || ts.isStringLiteral(node.name)) && + !registered.has(node) + ) { + registered.add(node.initializer); + registerFunc(node, node.initializer, node.name.getText(sf), sf, rel, fileEntity); + } else if ( + (ts.isArrowFunction(node) || ts.isFunctionExpression(node)) && + !registered.has(node) && + ts.isBlock(node.body) && + containsCall(node.body) + ) { + // 有意义的内联匿名回调(含调用的块体):登记为节点,避免调用被拍平到 + registerFunc(node, node, inlineName(node, sf), sf, rel, fileEntity); + } + + ts.forEachChild(node, visit); + }; + + ts.forEachChild(sf, visit); + }; + + // ---------- 交互识别 ---------- + const extractPathArg = (node: ts.Expression | undefined, sf: ts.SourceFile): string | undefined => { + if (!node) return undefined; + if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) return node.text; + if (ts.isTemplateExpression(node)) return node.getText(sf); + if (ts.isCallExpression(node)) return extractPathArg(node.arguments[0], sf); // apiPath('/x') + return undefined; + }; + + const extractMethodFromOptions = (arg: ts.Expression | undefined, sf: ts.SourceFile): string | undefined => { + if (!arg || !ts.isObjectLiteralExpression(arg)) return undefined; + for (const p of arg.properties) { + if (ts.isPropertyAssignment(p) && p.name.getText(sf) === "method") { + const v = p.initializer; + if (ts.isStringLiteral(v) || ts.isNoSubstitutionTemplateLiteral(v)) return v.text.toUpperCase(); + } + } + return undefined; + }; + + const hostOf = (url?: string): string | undefined => { + if (!url) return undefined; + const m = /^https?:\/\/([^/]+)/i.exec(url); + return m ? m[1] : undefined; + }; + + const detectDb = (call: ts.CallExpression, sf: ts.SourceFile): DbInteraction | undefined => { + const expr = call.expression; + if (!ts.isPropertyAccessExpression(expr)) return undefined; + const method = expr.name.text; + if (ORM_RAW.has(method)) { + const baseText = expr.expression.getText(sf); + if (!/prisma|db|client/i.test(baseText)) return undefined; + return { id: "", kind: "db", direction: "out", provenance: "resolved", operation: "other", engine: "prisma" }; + } + if (!ORM_ALL.has(method)) return undefined; + // 形如 prisma..() + const modelAccess = expr.expression; + if (!ts.isPropertyAccessExpression(modelAccess)) return undefined; + const baseText = modelAccess.expression.getText(sf); + if (!/prisma|db|client|repository|repo/i.test(baseText)) return undefined; + const target = modelAccess.name.text; + let operation: DbInteraction["operation"] = "other"; + if (ORM_READ.has(method)) operation = "read"; + else if (ORM_CREATE.has(method)) operation = "create"; + else if (ORM_UPDATE.has(method)) operation = "update"; + else if (ORM_DELETE.has(method)) operation = "delete"; + return { id: "", kind: "db", direction: "out", provenance: "resolved", operation, target, engine: "prisma" }; + }; + + const detectApiOut = (call: ts.CallExpression, sf: ts.SourceFile): ApiInteraction | undefined => { + const expr = call.expression; + // fetch(url, opts) + if (ts.isIdentifier(expr) && expr.text === "fetch") { + const url = extractPathArg(call.arguments[0], sf); + const method = extractMethodFromOptions(call.arguments[1], sf) ?? "GET"; + return { id: "", kind: "api", direction: "out", provenance: "resolved", protocol: "http", method, path: url, peer: hostOf(url) }; + } + // axios.get(url) / http.post(url) + if (ts.isPropertyAccessExpression(expr) && HTTP_VERBS.has(expr.name.text)) { + const baseText = expr.expression.getText(sf); + if (!/axios|http|client|request|api/i.test(baseText)) return undefined; + const url = extractPathArg(call.arguments[0], sf); + return { id: "", kind: "api", direction: "out", provenance: "resolved", protocol: "http", method: expr.name.text.toUpperCase(), path: url, peer: hostOf(url) }; + } + return undefined; + }; + + const detectApiIn = ( + call: ts.CallExpression, + sf: ts.SourceFile + ): { interaction: ApiInteraction; handler?: ts.Node } | undefined => { + const expr = call.expression; + if (!ts.isPropertyAccessExpression(expr)) return undefined; + const verb = expr.name.text; + if (!HTTP_VERBS.has(verb)) return undefined; + const baseText = expr.expression.getText(sf); + if (!/app|router|server|route/i.test(baseText)) return undefined; + const p = extractPathArg(call.arguments[0], sf); + if (p === undefined) return undefined; + const handler = call.arguments[call.arguments.length - 1]; + return { + interaction: { id: "", kind: "api", direction: "in", provenance: "resolved", protocol: "http", method: verb.toUpperCase(), path: p }, + handler, + }; + }; + + const addInteraction = (fnId: string, ix: Interaction): void => { + const fn = funcById.get(fnId); + if (!fn) return; + if (!fn.interactions) fn.interactions = []; + const key = + ix.kind === "db" + ? `db:${ix.direction}:${(ix as DbInteraction).operation}:${(ix as DbInteraction).target ?? ""}` + : `api:${ix.direction}:${(ix as ApiInteraction).method ?? ""}:${(ix as ApiInteraction).path ?? ""}`; + ix.id = `ix:${fnId}:${key}`; + if (fn.interactions.some((x) => x.id === ix.id)) return; + fn.interactions.push(ix); + }; + + // ---------- 关系 pass ---------- + const addEdge = (kind: Edge["kind"], sourceId: string, targetId: string, provenance: Edge["provenance"]): void => { + if (!sourceId || !targetId || sourceId === targetId) return; + const id = `edge:${kind}:${sourceId}=>${targetId}`; + if (edges.has(id)) return; + edges.set(id, { id, kind, sourceId, targetId, provenance }); + }; + + const resolveCallTargetFuncId = (call: ts.CallExpression): string | undefined => { + const expr = call.expression; + let sym = checker.getSymbolAtLocation(expr); + if (!sym && ts.isPropertyAccessExpression(expr)) sym = checker.getSymbolAtLocation(expr.name); + if (!sym) return undefined; + if (sym.flags & ts.SymbolFlags.Alias) { + try { + sym = checker.getAliasedSymbol(sym); + } catch { + /* ignore */ + } + } + const decls = sym.getDeclarations(); + if (!decls) return undefined; + for (const d of decls) { + const found = funcIdByNode.get(d); + if (found) return found; + } + return undefined; + }; + + const moduleFuncCache = new Map(); + const getModuleFunc = (sf: ts.SourceFile, rel: string, fileEntity: CodeFile): string => { + const cached = moduleFuncCache.get(rel); + if (cached) return cached; + const id = `func:${rel}#@0`; + const fn: Func = { + id, + kind: "function", + name: "", + qualifiedName: "", + location: { file: rel, startLine: 1, endLine: fileEntity.loc ?? 1 }, + language: languageOf(rel), + provenance: "ast", + fileId: fileEntity.id, + moduleId: fileEntity.moduleId, + params: [], + isEntry: /(^|\/)(server|main|index|app)\.[jt]sx?$/.test(rel) || undefined, + summary: "模块顶层代码(副作用/初始化)", + }; + functions.push(fn); + funcById.set(id, fn); + fileEntity.functionIds.push(id); + moduleFuncCache.set(rel, id); + return id; + }; + + const analyzeRelations = (sf: ts.SourceFile): void => { + const rel = relOf(sf); + const fileEntity = fileEntities.get(rel); + if (!fileEntity) return; + + const walk = (node: ts.Node, currentFuncId: string | undefined): void => { + let cur = currentFuncId; + const mapped = funcIdByNode.get(node); + if (mapped) cur = mapped; + + // import 边(内部文件间) + if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) { + const targetRel = resolveInternalImport(rel, node.moduleSpecifier.text); + if (targetRel && fileEntities.has(targetRel)) { + addEdge("import", fileEntity.id, `file:${targetRel}`, "ast"); + } + } + + if (ts.isCallExpression(node)) { + const owner = cur ?? getModuleFunc(sf, rel, fileEntity); + + // 调用边 + const targetFn = resolveCallTargetFuncId(node); + if (targetFn) addEdge("call", owner, targetFn, "resolved"); + + // 交互 + const db = detectDb(node, sf); + if (db) addInteraction(owner, db); + const apiOut = detectApiOut(node, sf); + if (apiOut) addInteraction(owner, apiOut); + const apiIn = detectApiIn(node, sf); + if (apiIn) { + let handlerFn: string | undefined; + const h = apiIn.handler; + if (h) { + if (funcIdByNode.has(h)) { + handlerFn = funcIdByNode.get(h); // 内联 handler 已在 pass1 登记 + } else if (ts.isIdentifier(h)) { + const sym = checker.getSymbolAtLocation(h); + for (const d of sym?.getDeclarations() ?? []) { + const f = funcIdByNode.get(d); + if (f) { + handlerFn = f; + break; + } + } + } + } + const target = handlerFn ?? owner; + addInteraction(target, apiIn.interaction); + // 注册作用域 → handler 的触发边,保持连通性 + if (handlerFn && handlerFn !== owner) addEdge("trigger", owner, handlerFn, "resolved"); + } + } + + ts.forEachChild(node, (c) => walk(c, cur)); + }; + + ts.forEachChild(sf, (n) => walk(n, undefined)); + }; + + const resolveInternalImport = (fromRel: string, spec: string): string | undefined => { + if (!spec.startsWith(".")) return undefined; + const fromDir = toPosix(path.dirname(fromRel)); + const joined = toPosix(path.normalize(path.join(fromDir, spec))); + const candidates = [ + joined, + `${joined}.ts`, + `${joined}.tsx`, + `${joined}.js`, + `${joined}.jsx`, + `${joined}/index.ts`, + `${joined}/index.tsx`, + `${joined}/index.js`, + ]; + // 处理带扩展名的显式导入(如 ./db.js -> ./db.ts) + const stripped = joined.replace(/\.(js|jsx|ts|tsx)$/, ""); + candidates.push(`${stripped}.ts`, `${stripped}.tsx`, `${stripped}.js`, `${stripped}.jsx`); + for (const c of candidates) { + if (fileEntities.has(c)) return c; + } + return undefined; + }; + + // ---------- 执行 ---------- + const projectSourceFiles = program.getSourceFiles().filter(inProject); + for (const sf of projectSourceFiles) registerFile(sf); + for (const sf of projectSourceFiles) analyzeRelations(sf); + + ensureModule(""); // 保证根模块存在 + + const totalLoc = [...fileEntities.values()].reduce((s, f) => s + (f.loc ?? 0), 0); + const edgeList = [...edges.values()]; + const flows = generateCallFlows(functions, edgeList); + + const report: Report = { + schemaVersion: SCHEMA_VERSION, + project: { + name: projectName, + root: toPosix(absRoot), + languages: [...languages].sort(), + generatedAt: new Date().toISOString(), + generator: "code-visualize-cli@" + SCHEMA_VERSION, + }, + stats: { + fileCount: fileEntities.size, + containerCount: containers.length, + functionCount: functions.length, + edgeCount: edgeList.length, + loc: totalLoc, + }, + modules: [...modules.values()], + files: [...fileEntities.values()], + containers, + functions, + fields, + edges: edgeList, + flows, + externalSystems: deriveExternalSystems(functions), + }; + + return report; +} diff --git a/src/cli.ts b/src/cli.ts new file mode 100644 index 0000000..ee8f49e --- /dev/null +++ b/src/cli.ts @@ -0,0 +1,70 @@ +#!/usr/bin/env node +import fs from "node:fs"; +import path from "node:path"; +import { analyzeProject } from "./analyzer"; + +interface CliArgs { + projectDir?: string; + output?: string; + pretty: boolean; + help: boolean; +} + +function parseArgs(argv: string[]): CliArgs { + const args: CliArgs = { pretty: true, help: false }; + for (let i = 0; i < argv.length; i++) { + const a = argv[i]; + if (a === "-h" || a === "--help") args.help = true; + else if (a === "-o" || a === "--output") args.output = argv[++i]; + else if (a === "--minify") args.pretty = false; + else if (!a.startsWith("-") && !args.projectDir) args.projectDir = a; + } + return args; +} + +const HELP = `代码分析 CLI — 产出标准化代码报告 JSON + +用法: + codeviz <项目目录> [选项] + +选项: + -o, --output <文件> 输出 JSON 路径(默认 <项目目录>/code-report.json) + --minify 输出压缩 JSON(默认美化) + -h, --help 显示帮助 + +示例: + npm run analyze -- E:/task-flow-manager + npm run analyze -- E:/task-flow-manager -o report.json +`; + +function main(): void { + const args = parseArgs(process.argv.slice(2)); + + if (args.help || !args.projectDir) { + console.log(HELP); + process.exit(args.help ? 0 : 1); + } + + const projectDir = path.resolve(args.projectDir!); + if (!fs.existsSync(projectDir) || !fs.statSync(projectDir).isDirectory()) { + console.error(`错误: 目录不存在或不是文件夹 -> ${projectDir}`); + process.exit(1); + } + + const outPath = path.resolve(args.output ?? path.join(projectDir, "code-report.json")); + + console.error(`正在分析: ${projectDir}`); + const started = Date.now(); + const report = analyzeProject(projectDir); + const json = JSON.stringify(report, null, args.pretty ? 2 : 0); + fs.writeFileSync(outPath, json, "utf8"); + const ms = Date.now() - started; + + console.error( + `完成 (${ms}ms): 文件 ${report.stats.fileCount} · 容器 ${report.stats.containerCount} · 函数 ${report.stats.functionCount} · 边 ${report.stats.edgeCount} · 流程 ${report.flows.length}` + ); + console.error(`外部系统: ${(report.externalSystems ?? []).map((e) => e.name).join(", ") || "无"}`); + console.error(`报告已写入: ${outPath}`); +} + +main(); diff --git a/src/externals.ts b/src/externals.ts new file mode 100644 index 0000000..449fca1 --- /dev/null +++ b/src/externals.ts @@ -0,0 +1,60 @@ +import type { Func, ExternalSystem, DatabaseSystem, ServiceSystem, ApiInteraction, DbInteraction } from "./types"; + +/** 由所有函数的 interactions 聚合派生出外部系统清单 */ +export function deriveExternalSystems(functions: Func[]): ExternalSystem[] { + const databases = new Map(); + const services = new Map(); + + for (const fn of functions) { + for (const ix of fn.interactions ?? []) { + if (ix.kind === "db") { + const db = ix as DbInteraction; + const engine = db.engine ?? "database"; + const key = engine; + let sys = databases.get(key); + if (!sys) { + sys = { + id: `ext:db:${engine}`, + kind: "database", + name: engine, + engine, + tables: [], + functionIds: [], + interactionCount: 0, + provenance: "resolved", + }; + databases.set(key, sys); + } + sys.interactionCount += 1; + if (!sys.functionIds.includes(fn.id)) sys.functionIds.push(fn.id); + if (db.target && !sys.tables.includes(db.target)) sys.tables.push(db.target); + } else if (ix.kind === "api" && ix.direction === "out") { + const api = ix as ApiInteraction; + // 仅绝对 URL(有 peer 主机)算外部服务;相对路径是前后端内部协议 + if (!api.peer) continue; + let sys = services.get(api.peer); + if (!sys) { + sys = { + id: `ext:service:${api.peer}`, + kind: "service", + name: api.peer, + protocol: api.protocol, + endpoints: [], + functionIds: [], + interactionCount: 0, + provenance: "resolved", + }; + services.set(api.peer, sys); + } + sys.interactionCount += 1; + if (!sys.functionIds.includes(fn.id)) sys.functionIds.push(fn.id); + if (api.path && !sys.endpoints.includes(api.path)) sys.endpoints.push(api.path); + } + } + } + + for (const s of databases.values()) s.tables.sort(); + for (const s of services.values()) s.endpoints.sort(); + + return [...databases.values(), ...services.values()]; +} diff --git a/src/flows.ts b/src/flows.ts new file mode 100644 index 0000000..9104a2b --- /dev/null +++ b/src/flows.ts @@ -0,0 +1,102 @@ +import type { Func, Edge, Flow, FlowStep } from "./types"; + +export interface FlowOptions { + maxNodes: number; // 单条流程最多包含的函数数 + maxDepth: number; // 调用链最大深度 + maxFlows: number; // 最多生成的流程数 +} + +const DEFAULTS: FlowOptions = { maxNodes: 60, maxDepth: 12, maxFlows: 80 }; + +/** + * 从调用边自动生成 Call-Flow: + * 以「入口函数」为根,沿调用边做有界 BFS,得到一条以函数为步骤的调用链流程。 + * 入口 = isEntry 标记,或调用入度为 0 且有出边的函数(天然的顶层起点)。 + */ +export function generateCallFlows(functions: Func[], edges: Edge[], options?: Partial): Flow[] { + const opts = { ...DEFAULTS, ...options }; + const callEdges = edges.filter((e) => e.kind === "call"); + + const funcById = new Map(functions.map((f) => [f.id, f] as const)); + const outAdj = new Map(); + const inDeg = new Map(); + for (const f of functions) { + outAdj.set(f.id, []); + inDeg.set(f.id, 0); + } + for (const e of callEdges) { + if (!outAdj.has(e.sourceId)) outAdj.set(e.sourceId, []); + outAdj.get(e.sourceId)!.push(e.targetId); + inDeg.set(e.targetId, (inDeg.get(e.targetId) ?? 0) + 1); + } + + const roots = functions.filter( + (f) => (f.isEntry || (inDeg.get(f.id) ?? 0) === 0) && (outAdj.get(f.id)?.length ?? 0) > 0 + ); + // 入口优先、出边多者优先,保证先生成信息量大的主流程 + roots.sort( + (a, b) => + (b.isEntry ? 1 : 0) - (a.isEntry ? 1 : 0) || + (outAdj.get(b.id)?.length ?? 0) - (outAdj.get(a.id)?.length ?? 0) + ); + + const flows: Flow[] = []; + for (const root of roots) { + if (flows.length >= opts.maxFlows) break; + + const included: string[] = []; + const seen = new Set([root.id]); + const depth = new Map([[root.id, 0]]); + const queue: string[] = [root.id]; + + while (queue.length > 0 && included.length < opts.maxNodes) { + const id = queue.shift()!; + included.push(id); + const d = depth.get(id)!; + if (d >= opts.maxDepth) continue; + for (const t of outAdj.get(id) ?? []) { + if (!seen.has(t)) { + seen.add(t); + depth.set(t, d + 1); + queue.push(t); + } + } + } + + if (included.length < 2) continue; // 只有孤立入口,不成流程 + + const includedSet = new Set(included); + const flowId = `flow:call:${root.id}`; + const stepIdOf = (fid: string): string => `step:${flowId}:${fid}`; + + const steps: FlowStep[] = included.map((fid, i) => { + const fn = funcById.get(fid); + return { + id: stepIdOf(fid), + order: i, + nodeId: fid, + title: fn?.qualifiedName ?? fn?.name ?? fid, + nextStepIds: (outAdj.get(fid) ?? []).filter((t) => includedSet.has(t)).map(stepIdOf), + }; + }); + + const edgeIds = callEdges + .filter((e) => includedSet.has(e.sourceId) && includedSet.has(e.targetId)) + .map((e) => e.id); + + const rootName = root.qualifiedName ?? root.name; + const where = root.location?.file ?? ""; + flows.push({ + id: flowId, + name: where ? `${rootName} (${where})` : rootName, + flowType: "call", + provenance: "resolved", + entryNodeId: root.id, + steps, + edgeIds, + summary: `以 ${rootName} 为入口的调用链,覆盖 ${included.length} 个函数`, + }); + } + + return flows; +} diff --git a/src/scanner.ts b/src/scanner.ts new file mode 100644 index 0000000..d73a263 --- /dev/null +++ b/src/scanner.ts @@ -0,0 +1,68 @@ +import fs from "node:fs"; +import path from "node:path"; + +export const SOURCE_EXTENSIONS = [".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs"]; + +const IGNORED_DIRS = new Set([ + "node_modules", + ".git", + "dist", + "build", + "out", + ".next", + ".turbo", + "coverage", + ".cache", + "vendor", +]); + +export function toPosix(p: string): string { + return p.split(path.sep).join("/"); +} + +/** 递归收集目标目录下的源码文件(绝对路径) */ +export function collectSourceFiles(root: string): string[] { + const result: string[] = []; + + const walk = (dir: string): void => { + let entries: fs.Dirent[]; + try { + entries = fs.readdirSync(dir, { withFileTypes: true }); + } catch { + return; + } + for (const entry of entries) { + const full = path.join(dir, entry.name); + if (entry.isDirectory()) { + if (IGNORED_DIRS.has(entry.name) || entry.name.startsWith(".")) continue; + walk(full); + } else if (entry.isFile()) { + const ext = path.extname(entry.name); + if (!SOURCE_EXTENSIONS.includes(ext)) continue; + if (entry.name.endsWith(".d.ts")) continue; + result.push(full); + } + } + }; + + walk(root); + return result.sort(); +} + +export function languageOf(file: string): string { + const ext = path.extname(file); + switch (ext) { + case ".ts": + return "typescript"; + case ".tsx": + return "tsx"; + case ".js": + case ".mjs": + case ".cjs": + return "javascript"; + case ".jsx": + return "jsx"; + default: + return "unknown"; + } +} diff --git a/src/types.ts b/src/types.ts new file mode 100644 index 0000000..8f73951 --- /dev/null +++ b/src/types.ts @@ -0,0 +1,204 @@ +// 标准化代码报告数据结构(对齐 docs/设计文档.md 第三章) + +export type Id = string; + +export type Provenance = "ast" | "resolved" | "ai" | "manual"; + +export interface SourceLocation { + file: string; + startLine: number; + endLine: number; + startCol?: number; + endCol?: number; +} + +export interface BaseEntity { + id: Id; + name: string; + qualifiedName?: string; + location?: SourceLocation; + language?: string; + provenance: Provenance; + confidence?: number; + summary?: string; + tags?: string[]; + extra?: Record; +} + +export interface Module extends BaseEntity { + kind: "module"; + parentId?: Id; + childModuleIds: Id[]; + fileIds: Id[]; + path?: string; +} + +export interface CodeFile extends BaseEntity { + kind: "file"; + moduleId: Id; + path: string; + loc?: number; + containerIds: Id[]; + functionIds: Id[]; +} + +export interface Container extends BaseEntity { + kind: "container"; + fileId: Id; + moduleId?: Id; + functionIds: Id[]; + fieldIds: Id[]; +} + +export interface Param { + name: string; + typeRef?: string; + optional?: boolean; + defaultValue?: string; +} + +export interface Func extends BaseEntity { + kind: "function"; + fileId: Id; + ownerId?: Id; + moduleId?: Id; + signature?: string; + params: Param[]; + returnType?: string; + isEntry?: boolean; + interactions?: Interaction[]; + loc?: number; +} + +export interface Field extends BaseEntity { + kind: "field"; + ownerId: Id; + typeRef?: string; +} + +// ---------- 跨边界交互 ---------- + +export type InteractionKind = "api" | "db"; +export type InteractionDirection = "in" | "out"; + +export interface InteractionBase { + id: Id; + direction: InteractionDirection; + provenance: Provenance; + confidence?: number; + summary?: string; +} + +export interface ApiInteraction extends InteractionBase { + kind: "api"; + protocol: "http" | "ws" | "rpc" | "graphql"; + method?: string; + path?: string; + peer?: string; +} + +export interface DbInteraction extends InteractionBase { + kind: "db"; + operation: "read" | "create" | "update" | "delete" | "other"; + target?: string; + engine?: string; +} + +export type Interaction = ApiInteraction | DbInteraction; + +// ---------- 关系边 ---------- + +export type EdgeKind = "call" | "import" | "reference" | "dataflow" | "trigger"; + +export interface Edge { + id: Id; + kind: EdgeKind; + sourceId: Id; + targetId: Id; + provenance: Provenance; + confidence?: number; + label?: string; + extra?: Record; +} + +// ---------- 流程 ---------- + +export interface FlowStep { + id: Id; + order: number; + nodeId?: Id; + title: string; + description?: string; + branchLabel?: string; + nextStepIds: Id[]; +} + +export interface Flow { + id: Id; + name: string; + flowType: "call" | "business"; + summary?: string; + provenance: Provenance; + entryNodeId?: Id; + steps: FlowStep[]; + edgeIds?: Id[]; +} + +// ---------- 外部系统(派生) ---------- + +export type ExternalSystemKind = "database" | "service"; + +export interface ExternalSystemBase { + id: Id; + kind: ExternalSystemKind; + name: string; + functionIds: Id[]; + interactionCount: number; + provenance: Provenance; +} + +export interface DatabaseSystem extends ExternalSystemBase { + kind: "database"; + engine?: string; + tables: string[]; +} + +export interface ServiceSystem extends ExternalSystemBase { + kind: "service"; + protocol?: string; + endpoints: string[]; +} + +export type ExternalSystem = DatabaseSystem | ServiceSystem; + +// ---------- 顶层报告 ---------- + +export interface ProjectMeta { + name: string; + root: string; + languages: string[]; + generatedAt: string; + generator?: string; +} + +export interface ReportStats { + fileCount: number; + containerCount: number; + functionCount: number; + edgeCount: number; + loc?: number; +} + +export interface Report { + schemaVersion: string; + project: ProjectMeta; + stats: ReportStats; + modules: Module[]; + files: CodeFile[]; + containers: Container[]; + functions: Func[]; + fields: Field[]; + edges: Edge[]; + flows: Flow[]; + externalSystems?: ExternalSystem[]; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..ad2e06e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "Bundler", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "types": ["node"], + "noEmit": true + }, + "include": ["src"] +} diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..b1c46fc --- /dev/null +++ b/web/index.html @@ -0,0 +1,12 @@ + + + + + + 代码分析可视化 + + +
+ + + diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..dc357e7 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,2119 @@ +{ + "name": "code-visualize-web", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "code-visualize-web", + "version": "0.1.0", + "dependencies": { + "@dagrejs/dagre": "^1.1.4", + "@xyflow/react": "^12.3.5", + "mobx": "^6.13.5", + "mobx-react-lite": "^4.0.7", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.6.3", + "vite": "^6.0.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.29.7.tgz", + "integrity": "sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.29.7.tgz", + "integrity": "sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@dagrejs/dagre": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@dagrejs/dagre/-/dagre-1.1.8.tgz", + "integrity": "sha512-5SEDlndt4W/LaVzPYJW+bSmSEZc9EzTf8rJ20WCKvjS5EAZAN0b+x0Yww7VMT4R3Wootkg+X9bUfUxazYw6Blw==", + "license": "MIT", + "dependencies": { + "@dagrejs/graphlib": "2.2.4" + } + }, + "node_modules/@dagrejs/graphlib": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@dagrejs/graphlib/-/graphlib-2.2.4.tgz", + "integrity": "sha512-mepCf/e9+SKYy1d02/UkvSy6+6MoyXhVxP8lLDfA7BPE1X1d4dR0sZznmbM8/XVJ1GPM+Svnx7Xj6ZweByWUkw==", + "license": "MIT", + "engines": { + "node": ">17.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-drag": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@types/d3-drag/-/d3-drag-3.0.7.tgz", + "integrity": "sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-selection": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@types/d3-selection/-/d3-selection-3.0.11.tgz", + "integrity": "sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==", + "license": "MIT" + }, + "node_modules/@types/d3-transition": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-transition/-/d3-transition-3.0.9.tgz", + "integrity": "sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==", + "license": "MIT", + "dependencies": { + "@types/d3-selection": "*" + } + }, + "node_modules/@types/d3-zoom": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz", + "integrity": "sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==", + "license": "MIT", + "dependencies": { + "@types/d3-interpolate": "*", + "@types/d3-selection": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.17", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", + "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@xyflow/react": { + "version": "12.11.2", + "resolved": "https://registry.npmjs.org/@xyflow/react/-/react-12.11.2.tgz", + "integrity": "sha512-eLAlDWJfWnQEhJwGMjlWdAXO9eYllKpliUmPQlAmOLxz6mExXuzMVDUKLMquixgkrtmMFFtug3jGKmYYld12cA==", + "license": "MIT", + "dependencies": { + "@xyflow/system": "0.0.79", + "classcat": "^5.0.3", + "zustand": "^4.4.0" + }, + "peerDependencies": { + "@types/react": ">=17", + "@types/react-dom": ">=17", + "react": ">=17", + "react-dom": ">=17" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@xyflow/system": { + "version": "0.0.79", + "resolved": "https://registry.npmjs.org/@xyflow/system/-/system-0.0.79.tgz", + "integrity": "sha512-czLyOh91NF0hIzbNzwi8I6GlqG23BHh2435OddfI6uiaLH3xdrdygO93gqgH1Bv9mhy8XPFQJOBn1FTq4LvEWA==", + "license": "MIT", + "dependencies": { + "@types/d3-drag": "^3.0.7", + "@types/d3-interpolate": "^3.0.4", + "@types/d3-selection": "^3.0.10", + "@types/d3-transition": "^3.0.8", + "@types/d3-zoom": "^3.0.8", + "d3-drag": "^3.0.0", + "d3-interpolate": "^3.0.1", + "d3-selection": "^3.0.0", + "d3-zoom": "^3.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.0.tgz", + "integrity": "sha512-oCu2wfipvX3AePSgmOuKkIywOu+8n9psz7hXYmk56ghpu3+7KzNIBopaOs4c9BrtdnTtW30unG9GTfHo7EwERQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.7.tgz", + "integrity": "sha512-JxV13hNrFxqjOc8alRbq9dK1MM79NEXYpma2B2J4wAtpWS5zIEIKqWPGCl7N4o7Uc7B7itylh7SuDujATRyyTw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.44", + "caniuse-lite": "^1.0.30001806", + "electron-to-chromium": "^1.5.393", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/classcat": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "devOptional": true, + "license": "MIT" + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-drag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", + "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-selection": "3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-selection": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", + "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-transition": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", + "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-dispatch": "1 - 3", + "d3-ease": "1 - 3", + "d3-interpolate": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "d3-selection": "2 - 3" + } + }, + "node_modules/d3-zoom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", + "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-drag": "2 - 3", + "d3-interpolate": "1 - 3", + "d3-selection": "2 - 3", + "d3-transition": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.395", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.395.tgz", + "integrity": "sha512-7zt9Aw+SrmxLWLN0zhaTWZQiCdryLVrYTq5R7iZakLvi2UQPYMMsROYV/2qVCzMeCiSXHwKOU+sZ4zOVVlrtKA==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/mobx": { + "version": "6.16.1", + "resolved": "https://registry.npmjs.org/mobx/-/mobx-6.16.1.tgz", + "integrity": "sha512-syNcDdX3KT+Jq3je6eGjBhuc24Z68td2VG0zNFqRswaE433D9SNH5VRy/xrGbJsUixfppLLccXhAW9JSf6n+SQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + } + }, + "node_modules/mobx-react-lite": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-4.1.1.tgz", + "integrity": "sha512-iUxiMpsvNraCKXU+yPotsOncNNmyeS2B5DKL+TL6Tar/xm+wwNJAubJmtRSeAoYawdZqwv8Z/+5nPRHeQxTiXg==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.4.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mobx" + }, + "peerDependencies": { + "mobx": "^6.9.0", + "react": "^16.8.0 || ^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.21", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.21.tgz", + "integrity": "sha512-v4sDNP3fdNiWMfabO7OwOQdOX8TiQSztKyT1Wj0w+j7LDallJThJRBBBmzVGyYj0crMh7jlV4zepPkiNu9UwDQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.16", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/react": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.8.tgz", + "integrity": "sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.8", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.8.tgz", + "integrity": "sha512-rVprimfGBG3DR+Tq0IQG2DT5PxKth1WIGDmj5yPmlzr4YBe7uyE+Du4oVqTDXZSHGGGXRtTJEGSSePyQCMBglQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.8" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/vite": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.3.tgz", + "integrity": "sha512-NTKlcQjlAK7MlQoyb6LgaqHc8sso/pVyUJYWMws3jg21uTJw/LddqIFPcPqP6PzpgbIcZyKI85sFE4HBrQDA8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/zustand": { + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", + "integrity": "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==", + "license": "MIT", + "dependencies": { + "use-sync-external-store": "^1.2.2" + }, + "engines": { + "node": ">=12.7.0" + }, + "peerDependencies": { + "@types/react": ">=16.8", + "immer": ">=9.0.6", + "react": ">=16.8" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + } + } + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..ffb2480 --- /dev/null +++ b/web/package.json @@ -0,0 +1,26 @@ +{ + "name": "code-visualize-web", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@dagrejs/dagre": "^1.1.4", + "@xyflow/react": "^12.3.5", + "mobx": "^6.13.5", + "mobx-react-lite": "^4.0.7", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.6.3", + "vite": "^6.0.5" + } +} diff --git a/web/public/report.json b/web/public/report.json new file mode 100644 index 0000000..d40da87 --- /dev/null +++ b/web/public/report.json @@ -0,0 +1,28907 @@ +{ + "schemaVersion": "0.1.0", + "project": { + "name": "task-flow-manager", + "root": "E:/task-flow-manager", + "languages": [ + "tsx", + "typescript" + ], + "generatedAt": "2026-07-22T03:03:35.924Z", + "generator": "code-visualize-cli@0.1.0" + }, + "stats": { + "fileCount": 36, + "containerCount": 0, + "functionCount": 570, + "edgeCount": 682, + "loc": 12750 + }, + "modules": [ + { + "id": "module:.", + "kind": "module", + "name": "task-flow-manager", + "provenance": "ast", + "path": ".", + "childModuleIds": [ + "module:src", + "module:prisma" + ], + "fileIds": [ + "file:prisma.config.ts", + "file:server.ts", + "file:vite.config.ts" + ] + }, + { + "id": "module:src", + "kind": "module", + "name": "src", + "provenance": "ast", + "path": "src", + "childModuleIds": [ + "module:src/server", + "module:src/utils", + "module:src/components" + ], + "fileIds": [ + "file:src/types.ts", + "file:src/App.tsx", + "file:src/main.tsx" + ], + "parentId": "module:." + }, + { + "id": "module:src/server", + "kind": "module", + "name": "server", + "provenance": "ast", + "path": "src/server", + "childModuleIds": [], + "fileIds": [ + "file:src/server/defaultData.ts", + "file:src/server/db.ts", + "file:src/server/weeklyPlanRepository.ts", + "file:src/server/taskRepository.ts", + "file:src/server/notificationRepository.ts", + "file:src/server/projectTemplateRepository.ts", + "file:src/server/tagRepository.ts", + "file:src/server/personRepository.ts", + "file:src/server/botQueryTools.ts", + "file:src/server/aiChatService.ts" + ], + "parentId": "module:src" + }, + { + "id": "module:prisma", + "kind": "module", + "name": "prisma", + "provenance": "ast", + "path": "prisma", + "childModuleIds": [], + "fileIds": [ + "file:prisma/seed.ts" + ], + "parentId": "module:." + }, + { + "id": "module:src/utils", + "kind": "module", + "name": "utils", + "provenance": "ast", + "path": "src/utils", + "childModuleIds": [], + "fileIds": [ + "file:src/utils/date.ts", + "file:src/utils/nodeTimeRanges.ts", + "file:src/utils/taskStatus.ts", + "file:src/utils/taskPriority.ts", + "file:src/utils/api.ts" + ], + "parentId": "module:src" + }, + { + "id": "module:src/components", + "kind": "module", + "name": "components", + "provenance": "ast", + "path": "src/components", + "childModuleIds": [], + "fileIds": [ + "file:src/components/TaskList.tsx", + "file:src/components/WeeklyPlanList.tsx", + "file:src/components/WorkflowCanvas.tsx", + "file:src/components/ProjectCreateModal.tsx", + "file:src/components/TaskOverview.tsx", + "file:src/components/GanttChart.tsx", + "file:src/components/PersonGanttChart.tsx", + "file:src/components/PeopleManager.tsx", + "file:src/components/LoginPage.tsx", + "file:src/components/TagManager.tsx", + "file:src/components/ProjectTemplateManager.tsx", + "file:src/components/NodeEditorDrawer.tsx", + "file:src/components/WeeklyOverview.tsx", + "file:src/components/DingTalkLogs.tsx" + ], + "parentId": "module:src" + } + ], + "files": [ + { + "id": "file:prisma.config.ts", + "kind": "file", + "name": "prisma.config.ts", + "location": { + "file": "prisma.config.ts", + "startLine": 1, + "endLine": 14 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:.", + "path": "prisma.config.ts", + "loc": 14, + "containerIds": [], + "functionIds": [ + "func:prisma.config.ts#@0" + ] + }, + { + "id": "file:src/types.ts", + "kind": "file", + "name": "types.ts", + "location": { + "file": "src/types.ts", + "startLine": 1, + "endLine": 105 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src", + "path": "src/types.ts", + "loc": 105, + "containerIds": [], + "functionIds": [ + "func:src/types.ts#isPublicPoolPlan@68" + ] + }, + { + "id": "file:src/server/defaultData.ts", + "kind": "file", + "name": "defaultData.ts", + "location": { + "file": "src/server/defaultData.ts", + "startLine": 1, + "endLine": 127 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/defaultData.ts", + "loc": 127, + "containerIds": [], + "functionIds": [] + }, + { + "id": "file:prisma/seed.ts", + "kind": "file", + "name": "seed.ts", + "location": { + "file": "prisma/seed.ts", + "startLine": 1, + "endLine": 110 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:prisma", + "path": "prisma/seed.ts", + "loc": 110, + "containerIds": [], + "functionIds": [ + "func:prisma/seed.ts#dateFromInput@9", + "func:prisma/seed.ts#seed@13", + "func:prisma/seed.ts#then() 回调@102@102", + "func:prisma/seed.ts#catch() 回调@105@105", + "func:prisma/seed.ts#@0" + ] + }, + { + "id": "file:src/server/db.ts", + "kind": "file", + "name": "db.ts", + "location": { + "file": "src/server/db.ts", + "startLine": 1, + "endLine": 21 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/db.ts", + "loc": 21, + "containerIds": [], + "functionIds": [] + }, + { + "id": "file:src/server/weeklyPlanRepository.ts", + "kind": "file", + "name": "weeklyPlanRepository.ts", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 1, + "endLine": 164 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/weeklyPlanRepository.ts", + "loc": 164, + "containerIds": [], + "functionIds": [ + "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "func:src/server/weeklyPlanRepository.ts#addDays@13", + "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "func:src/server/weeklyPlanRepository.ts#$transaction() 回调@128@128" + ] + }, + { + "id": "file:src/server/taskRepository.ts", + "kind": "file", + "name": "taskRepository.ts", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 1, + "endLine": 670 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/taskRepository.ts", + "loc": 670, + "containerIds": [], + "functionIds": [ + "func:src/server/taskRepository.ts#dateFromInput@31", + "func:src/server/taskRepository.ts#dateToInput@36", + "func:src/server/taskRepository.ts#uniqueValues@40", + "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "func:src/server/taskRepository.ts#existingTagNames@96", + "func:src/server/taskRepository.ts#findTaskRecord@111", + "func:src/server/taskRepository.ts#toWorkflowNode@118", + "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "func:src/server/taskRepository.ts#toTask@163", + "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "func:src/server/taskRepository.ts#getTask@190", + "func:src/server/taskRepository.ts#listTasks@194", + "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "func:src/server/taskRepository.ts#createTask@227", + "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "func:src/server/taskRepository.ts#updateTask@302", + "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "func:src/server/taskRepository.ts#updateTaskListState@353", + "func:src/server/taskRepository.ts#deleteTask@383", + "func:src/server/taskRepository.ts#createWorkflowNode@389", + "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "func:src/server/taskRepository.ts#$transaction() 回调@480@480", + "func:src/server/taskRepository.ts#createNodeDependency@494", + "func:src/server/taskRepository.ts#$transaction() 回调@510@510", + "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "func:src/server/taskRepository.ts#$transaction() 回调@542@542", + "func:src/server/taskRepository.ts#ensureTaskExists@560", + "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "func:src/server/taskRepository.ts#hasDependencyPath@577", + "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "func:src/server/taskRepository.ts#map() 回调@618@618" + ] + }, + { + "id": "file:src/server/notificationRepository.ts", + "kind": "file", + "name": "notificationRepository.ts", + "location": { + "file": "src/server/notificationRepository.ts", + "startLine": 1, + "endLine": 59 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/notificationRepository.ts", + "loc": 59, + "containerIds": [], + "functionIds": [ + "func:src/server/notificationRepository.ts#toNotificationLog@17", + "func:src/server/notificationRepository.ts#createNotificationLog@37", + "func:src/server/notificationRepository.ts#listNotificationLogs@47", + "func:src/server/notificationRepository.ts#clearNotificationLogs@56" + ] + }, + { + "id": "file:src/server/projectTemplateRepository.ts", + "kind": "file", + "name": "projectTemplateRepository.ts", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 1, + "endLine": 163 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/projectTemplateRepository.ts", + "loc": 163, + "containerIds": [], + "functionIds": [ + "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158" + ] + }, + { + "id": "file:src/server/tagRepository.ts", + "kind": "file", + "name": "tagRepository.ts", + "location": { + "file": "src/server/tagRepository.ts", + "startLine": 1, + "endLine": 49 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/tagRepository.ts", + "loc": 49, + "containerIds": [], + "functionIds": [ + "func:src/server/tagRepository.ts#toTagDefinition@4", + "func:src/server/tagRepository.ts#listTagDefinitions@11", + "func:src/server/tagRepository.ts#createTagDefinition@19", + "func:src/server/tagRepository.ts#deleteTagDefinition@34" + ] + }, + { + "id": "file:src/server/personRepository.ts", + "kind": "file", + "name": "personRepository.ts", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 1, + "endLine": 182 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/personRepository.ts", + "loc": 182, + "containerIds": [], + "functionIds": [ + "func:src/server/personRepository.ts#toPerson@4", + "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "func:src/server/personRepository.ts#listPeople@53", + "func:src/server/personRepository.ts#getPersonOrThrow@64", + "func:src/server/personRepository.ts#createPerson@73", + "func:src/server/personRepository.ts#ensurePeople@118", + "func:src/server/personRepository.ts#updatePerson@142", + "func:src/server/personRepository.ts#deletePerson@177" + ] + }, + { + "id": "file:src/server/botQueryTools.ts", + "kind": "file", + "name": "botQueryTools.ts", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 1, + "endLine": 586 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/botQueryTools.ts", + "loc": 586, + "containerIds": [], + "functionIds": [ + "func:src/server/botQueryTools.ts#getTodayStr@10", + "func:src/server/botQueryTools.ts#value@17", + "func:src/server/botQueryTools.ts#nodeRanges@21", + "func:src/server/botQueryTools.ts#nodeStartDate@28", + "func:src/server/botQueryTools.ts#nodeEndDate@34", + "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "func:src/server/botQueryTools.ts#taskDateSpan@51", + "func:src/server/botQueryTools.ts#overlapsRange@59", + "func:src/server/botQueryTools.ts#buildTaskLink@72", + "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "func:src/server/botQueryTools.ts#getTasks@124", + "func:src/server/botQueryTools.ts#getPeople@125", + "func:src/server/botQueryTools.ts#getWeeklyPlans@126", + "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "func:src/server/botQueryTools.ts#selfScope@149", + "func:src/server/botQueryTools.ts#summarizeTask@172", + "func:src/server/botQueryTools.ts#planNameById@198", + "func:src/server/botQueryTools.ts#resolveToolSchema@231", + "func:src/server/botQueryTools.ts#execute@253", + "func:src/server/botQueryTools.ts#execute@297", + "func:src/server/botQueryTools.ts#filter() 回调@310@310", + "func:src/server/botQueryTools.ts#execute@349", + "func:src/server/botQueryTools.ts#execute@430", + "func:src/server/botQueryTools.ts#addDays@440", + "func:src/server/botQueryTools.ts#execute@500", + "func:src/server/botQueryTools.ts#filter() 回调@516@516", + "func:src/server/botQueryTools.ts#execute@542", + "func:src/server/botQueryTools.ts#getBotToolByName@583" + ] + }, + { + "id": "file:src/server/aiChatService.ts", + "kind": "file", + "name": "aiChatService.ts", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 1, + "endLine": 261 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/server", + "path": "src/server/aiChatService.ts", + "loc": 261, + "containerIds": [], + "functionIds": [ + "func:src/server/aiChatService.ts#isAiConfigured@30", + "func:src/server/aiChatService.ts#getMemoryTurns@62", + "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "func:src/server/aiChatService.ts#clearBotMemory@79", + "func:src/server/aiChatService.ts#setInterval() 回调@84@84", + "func:src/server/aiChatService.ts#buildToolSpecs@93", + "func:src/server/aiChatService.ts#map() 回调@94@94", + "func:src/server/aiChatService.ts#buildSystemPrompt@107", + "func:src/server/aiChatService.ts#callChatCompletion@124", + "func:src/server/aiChatService.ts#executeToolCall@156", + "func:src/server/aiChatService.ts#answerBotQuestion@185", + "func:src/server/aiChatService.ts#@0" + ] + }, + { + "id": "file:server.ts", + "kind": "file", + "name": "server.ts", + "location": { + "file": "server.ts", + "startLine": 1, + "endLine": 1261 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:.", + "path": "server.ts", + "loc": 1261, + "containerIds": [], + "functionIds": [ + "func:server.ts#ensureManualLoginPeople@84", + "func:server.ts#GET /api/health@90", + "func:server.ts#readRemoteError@98", + "func:server.ts#readRemoteJson@110", + "func:server.ts#ensureDingTalkRobotConfigured@122", + "func:server.ts#getDingTalkRobotAccessToken@128", + "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "func:server.ts#replyToDingTalkSession@204", + "func:server.ts#replyToDingTalkSessionMarkdown@222", + "func:server.ts#getTaskRelatedPersonNames@239", + "func:server.ts#getWorkflowLink@252", + "func:server.ts#getZonedDateParts@261", + "func:server.ts#value@271", + "func:server.ts#getPersonNamesForDueNodeReminder@280", + "func:server.ts#getDueTimeRanges@290", + "func:server.ts#sendDailyDueNodeReminder@298", + "func:server.ts#notifyTaskConfirmedCompleted@363", + "func:server.ts#ensureSsoConfigured@417", + "func:server.ts#getSsoRedirectUri@423", + "func:server.ts#getSsoAuthUrl@432", + "func:server.ts#getSsoUserAccessToken@444", + "func:server.ts#getSsoCurrentUser@471", + "func:server.ts#GET /api/auth/sso-config@498", + "func:server.ts#GET /api/auth/sso-login-url@508", + "func:server.ts#handleSsoCallback@520", + "func:server.ts#GET /api/auth/manual-users@559", + "func:server.ts#POST /api/auth/manual-login@563", + "func:server.ts#POST /api/auth/dev-login@575", + "func:server.ts#POST /api/auth/sso-login@605", + "func:server.ts#POST /api/auth/sso-join-person@642", + "func:server.ts#GET /api/people@669", + "func:server.ts#POST /api/people@678", + "func:server.ts#PUT /api/people/:id@687", + "func:server.ts#DELETE /api/people/:id@696", + "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "func:server.ts#GET /api/tags@737", + "func:server.ts#POST /api/tags@745", + "func:server.ts#DELETE /api/tags/:id@754", + "func:server.ts#GET /api/weekly-plans@764", + "func:server.ts#POST /api/weekly-plans@772", + "func:server.ts#DELETE /api/weekly-plans/:id@781", + "func:server.ts#GET /api/project-templates@791", + "func:server.ts#POST /api/project-templates@799", + "func:server.ts#PUT /api/project-templates/:id@808", + "func:server.ts#DELETE /api/project-templates/:id@817", + "func:server.ts#GET /api/tasks@826", + "func:server.ts#GET /api/tasks/:id@834", + "func:server.ts#POST /api/tasks@843", + "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "func:server.ts#PUT /api/tasks/:id@865", + "func:server.ts#catch() 回调@876@876", + "func:server.ts#DELETE /api/tasks/:id@886", + "func:server.ts#POST /api/tasks/:id/nodes@895", + "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "func:server.ts#POST /api/tasks/:id/dependencies@925", + "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "func:server.ts#POST /api/notify@944", + "func:server.ts#GET /api/logs@1041", + "func:server.ts#DELETE /api/logs@1049", + "func:server.ts#normalizeActionType@1058", + "func:server.ts#getNotificationState@1065", + "func:server.ts#startDailyDueNodeReminderScheduler@1089", + "func:server.ts#checkAndRun@1090", + "func:server.ts#catch() 回调@1098@1098", + "func:server.ts#handleDingTalkRobotMessage@1114", + "func:server.ts#replyText@1147", + "func:server.ts#startDingTalkRobotStream@1204", + "func:server.ts#registerCallbackListener() 回调@1215@1215", + "func:server.ts#catch() 回调@1218@1218", + "func:server.ts#then() 回调@1225@1225", + "func:server.ts#catch() 回调@1228@1228", + "func:server.ts#startServer@1235", + "func:server.ts#GET *@1245", + "func:server.ts#listen() 回调@1250@1250", + "func:server.ts#catch() 回调@1257@1257", + "func:server.ts#@0" + ] + }, + { + "id": "file:src/utils/date.ts", + "kind": "file", + "name": "date.ts", + "location": { + "file": "src/utils/date.ts", + "startLine": 1, + "endLine": 8 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/utils", + "path": "src/utils/date.ts", + "loc": 8, + "containerIds": [], + "functionIds": [ + "func:src/utils/date.ts#getLocalDateString@1" + ] + }, + { + "id": "file:src/utils/nodeTimeRanges.ts", + "kind": "file", + "name": "nodeTimeRanges.ts", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 1, + "endLine": 148 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/utils", + "path": "src/utils/nodeTimeRanges.ts", + "loc": 148, + "containerIds": [], + "functionIds": [ + "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "func:src/utils/nodeTimeRanges.ts#reduce() 回调@53@53", + "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107" + ] + }, + { + "id": "file:src/utils/taskStatus.ts", + "kind": "file", + "name": "taskStatus.ts", + "location": { + "file": "src/utils/taskStatus.ts", + "startLine": 1, + "endLine": 94 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/utils", + "path": "src/utils/taskStatus.ts", + "loc": 94, + "containerIds": [], + "functionIds": [ + "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "func:src/utils/taskStatus.ts#getTaskStatusMeta@50" + ] + }, + { + "id": "file:src/utils/taskPriority.ts", + "kind": "file", + "name": "taskPriority.ts", + "location": { + "file": "src/utils/taskPriority.ts", + "startLine": 1, + "endLine": 36 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/utils", + "path": "src/utils/taskPriority.ts", + "loc": 36, + "containerIds": [], + "functionIds": [ + "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" + ] + }, + { + "id": "file:src/components/TaskList.tsx", + "kind": "file", + "name": "TaskList.tsx", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 1, + "endLine": 514 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/TaskList.tsx", + "loc": 514, + "containerIds": [], + "functionIds": [ + "func:src/components/TaskList.tsx#TaskList@47", + "func:src/components/TaskList.tsx#reduce() 回调@77@77", + "func:src/components/TaskList.tsx#toggleSelectedTag@91", + "func:src/components/TaskList.tsx#toggleSelectedStatus@97", + "func:src/components/TaskList.tsx#toggleSelectedPriority@103", + "func:src/components/TaskList.tsx#filter() 回调@110@110", + "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "func:src/components/TaskList.tsx#find() 回调@139@139", + "func:src/components/TaskList.tsx#clearQueueDropState@147", + "func:src/components/TaskList.tsx#map() 回调@202@202", + "func:src/components/TaskList.tsx#map() 回调@265@265", + "func:src/components/TaskList.tsx#map() 回调@297@297", + "func:src/components/TaskList.tsx#匿名函数@353@353", + "func:src/components/TaskList.tsx#匿名函数@366@366", + "func:src/components/TaskList.tsx#匿名函数@371@371", + "func:src/components/TaskList.tsx#map() 回调@387@387", + "func:src/components/TaskList.tsx#匿名函数@400@400", + "func:src/components/TaskList.tsx#匿名函数@410@410", + "func:src/components/TaskList.tsx#匿名函数@442@442", + "func:src/components/TaskList.tsx#匿名函数@458@458" + ] + }, + { + "id": "file:src/components/WeeklyPlanList.tsx", + "kind": "file", + "name": "WeeklyPlanList.tsx", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 1, + "endLine": 370 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/WeeklyPlanList.tsx", + "loc": 370, + "containerIds": [], + "functionIds": [ + "func:src/components/WeeklyPlanList.tsx#addDays@20", + "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", + "func:src/components/WeeklyPlanList.tsx#useEffect() 回调@48@48", + "func:src/components/WeeklyPlanList.tsx#forEach() 回调@56@56", + "func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62", + "func:src/components/WeeklyPlanList.tsx#resetForm@70", + "func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76", + "func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", + "func:src/components/WeeklyPlanList.tsx#confirmDeletePlan@102", + "func:src/components/WeeklyPlanList.tsx#匿名函数@162@162", + "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", + "func:src/components/WeeklyPlanList.tsx#匿名函数@209@209", + "func:src/components/WeeklyPlanList.tsx#匿名函数@213@213", + "func:src/components/WeeklyPlanList.tsx#匿名函数@219@219" + ] + }, + { + "id": "file:src/components/WorkflowCanvas.tsx", + "kind": "file", + "name": "WorkflowCanvas.tsx", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 1, + "endLine": 1125 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/WorkflowCanvas.tsx", + "loc": 1125, + "containerIds": [], + "functionIds": [ + "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "func:src/components/WorkflowCanvas.tsx#handleCanvasMouseDown@159", + "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", + "func:src/components/WorkflowCanvas.tsx#map() 回调@212@212", + "func:src/components/WorkflowCanvas.tsx#handleCanvasWheel@238", + "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "func:src/components/WorkflowCanvas.tsx#isAncestor@265", + "func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", + "func:src/components/WorkflowCanvas.tsx#setTimeout() 回调@277@277", + "func:src/components/WorkflowCanvas.tsx#addConnection@282", + "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "func:src/components/WorkflowCanvas.tsx#find() 回调@317@317", + "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "func:src/components/WorkflowCanvas.tsx#handleCenterNodes@400", + "func:src/components/WorkflowCanvas.tsx#reduce() 回调@405@405", + "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", + "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507", + "func:src/components/WorkflowCanvas.tsx#handleToolbarClick@512", + "func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", + "func:src/components/WorkflowCanvas.tsx#map() 回调@533@533", + "func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", + "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@564@564", + "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", + "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@593@593", + "func:src/components/WorkflowCanvas.tsx#handleClickOutside@595", + "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "func:src/components/WorkflowCanvas.tsx#toMs@623", + "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", + "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "func:src/components/WorkflowCanvas.tsx#map() 回调@837@837", + "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", + "func:src/components/WorkflowCanvas.tsx#匿名函数@890@890", + "func:src/components/WorkflowCanvas.tsx#匿名函数@894@894", + "func:src/components/WorkflowCanvas.tsx#匿名函数@900@900", + "func:src/components/WorkflowCanvas.tsx#匿名函数@927@927", + "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "func:src/components/WorkflowCanvas.tsx#匿名函数@1073@1073" + ] + }, + { + "id": "file:src/components/ProjectCreateModal.tsx", + "kind": "file", + "name": "ProjectCreateModal.tsx", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 1, + "endLine": 318 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/ProjectCreateModal.tsx", + "loc": 318, + "containerIds": [], + "functionIds": [ + "func:src/components/ProjectCreateModal.tsx#toDateMs@23", + "func:src/components/ProjectCreateModal.tsx#addDays@27", + "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", + "func:src/components/ProjectCreateModal.tsx#TemplateDagPreview@64", + "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@68@68", + "func:src/components/ProjectCreateModal.tsx#ProjectCreateModal@123", + "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@137@137", + "func:src/components/ProjectCreateModal.tsx#toggleTag@146", + "func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", + "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", + "func:src/components/ProjectCreateModal.tsx#map() 回调@234@234", + "func:src/components/ProjectCreateModal.tsx#map() 回调@271@271" + ] + }, + { + "id": "file:src/components/TaskOverview.tsx", + "kind": "file", + "name": "TaskOverview.tsx", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 1, + "endLine": 464 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/TaskOverview.tsx", + "loc": 464, + "containerIds": [], + "functionIds": [ + "func:src/components/TaskOverview.tsx#TaskOverview@14", + "func:src/components/TaskOverview.tsx#useEffect() 回调@48@48", + "func:src/components/TaskOverview.tsx#useLayoutEffect() 回调@58@58", + "func:src/components/TaskOverview.tsx#handleSave@64", + "func:src/components/TaskOverview.tsx#handleSaveBlackboard@79", + "func:src/components/TaskOverview.tsx#toggleEditTag@89", + "func:src/components/TaskOverview.tsx#handleOpenBlackboard@95", + "func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", + "func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118", + "func:src/components/TaskOverview.tsx#map() 回调@240@240", + "func:src/components/TaskOverview.tsx#map() 回调@294@294" + ] + }, + { + "id": "file:src/components/GanttChart.tsx", + "kind": "file", + "name": "GanttChart.tsx", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 1, + "endLine": 428 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/GanttChart.tsx", + "loc": 428, + "containerIds": [], + "functionIds": [ + "func:src/components/GanttChart.tsx#GanttChart@14", + "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", + "func:src/components/GanttChart.tsx#from() 回调@29@29", + "func:src/components/GanttChart.tsx#forEach() 回调@40@40", + "func:src/components/GanttChart.tsx#forEach() 回调@41@41", + "func:src/components/GanttChart.tsx#formatDateString@76", + "func:src/components/GanttChart.tsx#getDayLabel@80", + "func:src/components/GanttChart.tsx#isWeekend@86", + "func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "func:src/components/GanttChart.tsx#handleTimelineMouseDown@131", + "func:src/components/GanttChart.tsx#handleTimelineMouseMove@144", + "func:src/components/GanttChart.tsx#stopTimelineDrag@155", + "func:src/components/GanttChart.tsx#handleTimelineClickCapture@160", + "func:src/components/GanttChart.tsx#useEffect() 回调@167@167", + "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "func:src/components/GanttChart.tsx#map() 回调@260@260", + "func:src/components/GanttChart.tsx#map() 回调@304@304", + "func:src/components/GanttChart.tsx#map() 回调@375@375", + "func:src/components/GanttChart.tsx#map() 回调@389@389", + "func:src/components/GanttChart.tsx#匿名函数@399@399" + ] + }, + { + "id": "file:src/components/PersonGanttChart.tsx", + "kind": "file", + "name": "PersonGanttChart.tsx", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 1, + "endLine": 425 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/PersonGanttChart.tsx", + "loc": 425, + "containerIds": [], + "functionIds": [ + "func:src/components/PersonGanttChart.tsx#PersonGanttChart@25", + "func:src/components/PersonGanttChart.tsx#useMemo() 回调@41@41", + "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64", + "func:src/components/PersonGanttChart.tsx#forEach() 回调@65@65", + "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "func:src/components/PersonGanttChart.tsx#handleTimelineMouseDown@115", + "func:src/components/PersonGanttChart.tsx#handleTimelineMouseMove@126", + "func:src/components/PersonGanttChart.tsx#stopTimelineDrag@135", + "func:src/components/PersonGanttChart.tsx#useEffect() 回调@140@140", + "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", + "func:src/components/PersonGanttChart.tsx#匿名函数@218@218", + "func:src/components/PersonGanttChart.tsx#map() 回调@235@235", + "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "func:src/components/PersonGanttChart.tsx#map() 回调@322@322", + "func:src/components/PersonGanttChart.tsx#map() 回调@337@337", + "func:src/components/PersonGanttChart.tsx#匿名函数@344@344", + "func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "func:src/components/PersonGanttChart.tsx#getDayLabel@393", + "func:src/components/PersonGanttChart.tsx#getStatusVisual@398" + ] + }, + { + "id": "file:src/components/PeopleManager.tsx", + "kind": "file", + "name": "PeopleManager.tsx", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 1, + "endLine": 329 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/PeopleManager.tsx", + "loc": 329, + "containerIds": [], + "functionIds": [ + "func:src/components/PeopleManager.tsx#getSearchTokens@29", + "func:src/components/PeopleManager.tsx#getPinyinSortKey@45", + "func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51", + "func:src/components/PeopleManager.tsx#PeopleManager@58", + "func:src/components/PeopleManager.tsx#useMemo() 回调@107@107", + "func:src/components/PeopleManager.tsx#useEffect() 回调@118@118", + "func:src/components/PeopleManager.tsx#useEffect() 回调@122@122", + "func:src/components/PeopleManager.tsx#handleSaveRole@127", + "func:src/components/PeopleManager.tsx#匿名函数@250@250", + "func:src/components/PeopleManager.tsx#匿名函数@280@280", + "func:src/components/PeopleManager.tsx#匿名函数@285@285" + ] + }, + { + "id": "file:src/utils/api.ts", + "kind": "file", + "name": "api.ts", + "location": { + "file": "src/utils/api.ts", + "startLine": 1, + "endLine": 18 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:src/utils", + "path": "src/utils/api.ts", + "loc": 18, + "containerIds": [], + "functionIds": [ + "func:src/utils/api.ts#appPath@7", + "func:src/utils/api.ts#apiPath@15" + ] + }, + { + "id": "file:src/components/LoginPage.tsx", + "kind": "file", + "name": "LoginPage.tsx", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 1, + "endLine": 188 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/LoginPage.tsx", + "loc": 188, + "containerIds": [], + "functionIds": [ + "func:src/components/LoginPage.tsx#readApiJson@21", + "func:src/components/LoginPage.tsx#createOAuthState@31", + "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "func:src/components/LoginPage.tsx#匿名函数@40@40", + "func:src/components/LoginPage.tsx#setTimeout() 回调@52@52", + "func:src/components/LoginPage.tsx#handleMessage@58", + "func:src/components/LoginPage.tsx#LoginPage@84", + "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "func:src/components/LoginPage.tsx#handleDevLogin@121" + ] + }, + { + "id": "file:src/components/TagManager.tsx", + "kind": "file", + "name": "TagManager.tsx", + "location": { + "file": "src/components/TagManager.tsx", + "startLine": 1, + "endLine": 158 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/TagManager.tsx", + "loc": 158, + "containerIds": [], + "functionIds": [ + "func:src/components/TagManager.tsx#TagManager@11", + "func:src/components/TagManager.tsx#useMemo() 回调@17@17", + "func:src/components/TagManager.tsx#handleSubmit@23", + "func:src/components/TagManager.tsx#匿名函数@136@136" + ] + }, + { + "id": "file:src/components/ProjectTemplateManager.tsx", + "kind": "file", + "name": "ProjectTemplateManager.tsx", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 1, + "endLine": 535 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/ProjectTemplateManager.tsx", + "loc": 535, + "containerIds": [], + "functionIds": [ + "func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", + "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", + "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", + "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", + "func:src/components/ProjectTemplateManager.tsx#useEffect() 回调@104@104", + "func:src/components/ProjectTemplateManager.tsx#toggleTag@111", + "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", + "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", + "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", + "func:src/components/ProjectTemplateManager.tsx#map() 回调@201@201", + "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", + "func:src/components/ProjectTemplateManager.tsx#handleUpdateNodes@247", + "func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", + "func:src/components/ProjectTemplateManager.tsx#deleteSelectedNode@260", + "func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308", + "func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393", + "func:src/components/ProjectTemplateManager.tsx#map() 回调@504@504" + ] + }, + { + "id": "file:src/components/NodeEditorDrawer.tsx", + "kind": "file", + "name": "NodeEditorDrawer.tsx", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 1, + "endLine": 756 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/NodeEditorDrawer.tsx", + "loc": 756, + "containerIds": [], + "functionIds": [ + "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "func:src/components/NodeEditorDrawer.tsx#getSearchTokens@107", + "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@151@151", + "func:src/components/NodeEditorDrawer.tsx#匿名函数@157@157", + "func:src/components/NodeEditorDrawer.tsx#setTimeout() 回调@164@164", + "func:src/components/NodeEditorDrawer.tsx#匿名函数@173@173", + "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", + "func:src/components/NodeEditorDrawer.tsx#filter() 回调@210@210", + "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", + "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "func:src/components/NodeEditorDrawer.tsx#completeNode@328", + "func:src/components/NodeEditorDrawer.tsx#reopenNode@332", + "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", + "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", + "func:src/components/NodeEditorDrawer.tsx#deleteNode@384", + "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "func:src/components/NodeEditorDrawer.tsx#map() 回调@466@466", + "func:src/components/NodeEditorDrawer.tsx#匿名函数@524@524", + "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", + "func:src/components/NodeEditorDrawer.tsx#@0" + ] + }, + { + "id": "file:src/components/WeeklyOverview.tsx", + "kind": "file", + "name": "WeeklyOverview.tsx", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 1, + "endLine": 880 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/WeeklyOverview.tsx", + "loc": 880, + "containerIds": [], + "functionIds": [ + "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "func:src/components/WeeklyOverview.tsx#find() 回调@37@37", + "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "func:src/components/WeeklyOverview.tsx#sortTasks@82", + "func:src/components/WeeklyOverview.tsx#sort() 回调@83@83", + "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", + "func:src/components/WeeklyOverview.tsx#handleBoardMouseDown@118", + "func:src/components/WeeklyOverview.tsx#handleBoardMouseMove@131", + "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "func:src/components/WeeklyOverview.tsx#handleBoardClickCapture@143", + "func:src/components/WeeklyOverview.tsx#handleDrawerMouseDown@156", + "func:src/components/WeeklyOverview.tsx#handleDrawerMouseMove@170", + "func:src/components/WeeklyOverview.tsx#stopDrawerDrag@196", + "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "func:src/components/WeeklyOverview.tsx#useMemo() 回调@261@261", + "func:src/components/WeeklyOverview.tsx#forEach() 回调@263@263", + "func:src/components/WeeklyOverview.tsx#sort() 回调@273@273", + "func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", + "func:src/components/WeeklyOverview.tsx#matchesFilters@290", + "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", + "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394", + "func:src/components/WeeklyOverview.tsx#匿名函数@494@494", + "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "func:src/components/WeeklyOverview.tsx#匿名函数@777@777", + "func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785", + "func:src/components/WeeklyOverview.tsx#map() 回调@840@840" + ] + }, + { + "id": "file:src/App.tsx", + "kind": "file", + "name": "App.tsx", + "location": { + "file": "src/App.tsx", + "startLine": 1, + "endLine": 1975 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src", + "path": "src/App.tsx", + "loc": 1975, + "containerIds": [], + "functionIds": [ + "func:src/App.tsx#readApiError@39", + "func:src/App.tsx#readApiJson@44", + "func:src/App.tsx#sortTasksForList@54", + "func:src/App.tsx#sort() 回调@55@55", + "func:src/App.tsx#readStoredAuthUser@62", + "func:src/App.tsx#App@84", + "func:src/App.tsx#useEffect() 回调@133@133", + "func:src/App.tsx#useEffect() 回调@147@147", + "func:src/App.tsx#useEffect() 回调@153@153", + "func:src/App.tsx#useEffect() 回调@159@159", + "func:src/App.tsx#useEffect() 回调@171@171", + "func:src/App.tsx#useEffect() 回调@178@178", + "func:src/App.tsx#useEffect() 回调@186@186", + "func:src/App.tsx#useEffect() 回调@213@213", + "func:src/App.tsx#匿名函数@214@214", + "func:src/App.tsx#fetchTasks@221", + "func:src/App.tsx#fetchPeople@241", + "func:src/App.tsx#fetchTags@256", + "func:src/App.tsx#handleCreateTag@271", + "func:src/App.tsx#setTags() 回调@281@281", + "func:src/App.tsx#handleDeleteTag@297", + "func:src/App.tsx#fetchProjectTemplates@323", + "func:src/App.tsx#fetchWeeklyPlans@338", + "func:src/App.tsx#handleCreateWeeklyPlan@353", + "func:src/App.tsx#handleDeleteWeeklyPlan@385", + "func:src/App.tsx#setWeeklyPlans() 回调@402@402", + "func:src/App.tsx#handleCreateProjectTemplate@427", + "func:src/App.tsx#handleUpdateProjectTemplate@450", + "func:src/App.tsx#handleDeleteProjectTemplate@478", + "func:src/App.tsx#handleCreatePerson@498", + "func:src/App.tsx#setPeople() 回调@508@508", + "func:src/App.tsx#handleJoinSsoPerson@521", + "func:src/App.tsx#setPeople() 回调@532@532", + "func:src/App.tsx#handleDeletePerson@548", + "func:src/App.tsx#handleUpdatePersonRole@565", + "func:src/App.tsx#handleTogglePersonAdmin@605", + "func:src/App.tsx#handleLogin@639", + "func:src/App.tsx#handleUnlockAdmin@650", + "func:src/App.tsx#handleCurrentUserClick@678", + "func:src/App.tsx#handleLogout@696", + "func:src/App.tsx#useMemo() 回调@720@720", + "func:src/App.tsx#useMemo() 回调@726@726", + "func:src/App.tsx#useMemo() 回调@730@730", + "func:src/App.tsx#useEffect() 回调@734@734", + "func:src/App.tsx#handleSelectWeeklyPlan@750", + "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", + "func:src/App.tsx#handleReorderTask@798", + "func:src/App.tsx#handleSelectTask@849", + "func:src/App.tsx#handleStartCreateProject@856", + "func:src/App.tsx#handleCancelCreateProject@865", + "func:src/App.tsx#handleSelectNode@870", + "func:src/App.tsx#handleOpenTaskFromOverview@877", + "func:src/App.tsx#handleOpenPlanFromOverview@888", + "func:src/App.tsx#handleSelectTaskNode@899", + "func:src/App.tsx#handleNavigateDrawerView@926", + "func:src/App.tsx#handleWorkspaceClick@957", + "func:src/App.tsx#computeCenteredViewport@981", + "func:src/App.tsx#focusNodeInCanvas@1016", + "func:src/App.tsx#animate@1042", + "func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", + "func:src/App.tsx#animate@1088", + "func:src/App.tsx#useEffect() 回调@1109@1109", + "func:src/App.tsx#useEffect() 回调@1121@1121", + "func:src/App.tsx#useLayoutEffect() 回调@1134@1134", + "func:src/App.tsx#applyCentered@1149", + "func:src/App.tsx#handleCreateTask@1165", + "func:src/App.tsx#handleQuickRequirement@1212", + "func:src/App.tsx#handleSubmitRequirement@1219", + "func:src/App.tsx#handleToggleTaskPinned@1278", + "func:src/App.tsx#handleDeleteTask@1299", + "func:src/App.tsx#handleUpdateTaskMetadata@1329", + "func:src/App.tsx#handleRefreshTask@1353", + "func:src/App.tsx#handleUpdateNodes@1371", + "func:src/App.tsx#edgeKey@1383", + "func:src/App.tsx#filter() 回调@1393@1393", + "func:src/App.tsx#requestTaskUpdate@1425", + "func:src/App.tsx#map() 回调@1526@1526", + "func:src/App.tsx#匿名函数@1533@1533", + "func:src/App.tsx#匿名函数@1557@1557", + "func:src/App.tsx#map() 回调@1700@1700" + ] + }, + { + "id": "file:src/components/DingTalkLogs.tsx", + "kind": "file", + "name": "DingTalkLogs.tsx", + "location": { + "file": "src/components/DingTalkLogs.tsx", + "startLine": 1, + "endLine": 159 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src/components", + "path": "src/components/DingTalkLogs.tsx", + "loc": 159, + "containerIds": [], + "functionIds": [ + "func:src/components/DingTalkLogs.tsx#DingTalkLogs@11", + "func:src/components/DingTalkLogs.tsx#copyToClipboard@14", + "func:src/components/DingTalkLogs.tsx#setTimeout() 回调@17@17", + "func:src/components/DingTalkLogs.tsx#map() 回调@76@76" + ] + }, + { + "id": "file:src/main.tsx", + "kind": "file", + "name": "main.tsx", + "location": { + "file": "src/main.tsx", + "startLine": 1, + "endLine": 11 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:src", + "path": "src/main.tsx", + "loc": 11, + "containerIds": [], + "functionIds": [ + "func:src/main.tsx#@0" + ] + }, + { + "id": "file:vite.config.ts", + "kind": "file", + "name": "vite.config.ts", + "location": { + "file": "vite.config.ts", + "startLine": 1, + "endLine": 39 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:.", + "path": "vite.config.ts", + "loc": 39, + "containerIds": [], + "functionIds": [ + "func:vite.config.ts#normalizeBasePath@6", + "func:vite.config.ts#defineConfig() 回调@12@12", + "func:vite.config.ts#@0" + ] + } + ], + "containers": [], + "functions": [ + { + "id": "func:src/types.ts#isPublicPoolPlan@68", + "kind": "function", + "name": "isPublicPoolPlan", + "qualifiedName": "isPublicPoolPlan", + "location": { + "file": "src/types.ts", + "startLine": 68, + "endLine": 70, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/types.ts", + "moduleId": "module:src", + "signature": "isPublicPoolPlan(id: string | null | undefined): boolean", + "params": [ + { + "name": "id", + "typeRef": "string | null | undefined", + "optional": false + } + ], + "returnType": "boolean", + "loc": 3 + }, + { + "id": "func:prisma/seed.ts#dateFromInput@9", + "kind": "function", + "name": "dateFromInput", + "qualifiedName": "dateFromInput", + "location": { + "file": "prisma/seed.ts", + "startLine": 9, + "endLine": 11, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma/seed.ts", + "moduleId": "module:prisma", + "signature": "dateFromInput(value: string): Date", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Date", + "loc": 3 + }, + { + "id": "func:prisma/seed.ts#seed@13", + "kind": "function", + "name": "seed", + "qualifiedName": "seed", + "location": { + "file": "prisma/seed.ts", + "startLine": 13, + "endLine": 99, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma/seed.ts", + "moduleId": "module:prisma", + "signature": "seed()", + "params": [], + "loc": 87, + "interactions": [ + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:notificationLog", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "notificationLog", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "task", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "weeklyPlan", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:delete:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "person", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "weeklyPlan", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "task", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:nodeDependency", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "nodeDependency", + "engine": "prisma" + }, + { + "id": "ix:func:prisma/seed.ts#seed@13:db:out:create:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:prisma/seed.ts#then() 回调@102@102", + "kind": "function", + "name": "then() 回调@102", + "qualifiedName": "then() 回调@102", + "location": { + "file": "prisma/seed.ts", + "startLine": 102, + "endLine": 104, + "startCol": 9, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma/seed.ts", + "moduleId": "module:prisma", + "signature": "then() 回调@102()", + "params": [], + "loc": 3 + }, + { + "id": "func:prisma/seed.ts#catch() 回调@105@105", + "kind": "function", + "name": "catch() 回调@105", + "qualifiedName": "catch() 回调@105", + "location": { + "file": "prisma/seed.ts", + "startLine": 105, + "endLine": 109, + "startCol": 10, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma/seed.ts", + "moduleId": "module:prisma", + "signature": "catch() 回调@105(error)", + "params": [ + { + "name": "error", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "kind": "function", + "name": "dateFromInput", + "qualifiedName": "dateFromInput", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 4, + "endLine": 7, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "dateFromInput(value: string): Date", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": true + } + ], + "returnType": "Date", + "loc": 4 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "kind": "function", + "name": "dateToInput", + "qualifiedName": "dateToInput", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 9, + "endLine": 11, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "dateToInput(value: Date): string", + "params": [ + { + "name": "value", + "typeRef": "Date", + "optional": false + } + ], + "returnType": "string", + "loc": 3 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "kind": "function", + "name": "addDays", + "qualifiedName": "addDays", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 13, + "endLine": 17, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "addDays(value: string, days: number)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + }, + { + "name": "days", + "typeRef": "number", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "kind": "function", + "name": "toWeeklyPlan", + "qualifiedName": "toWeeklyPlan", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 19, + "endLine": 31, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "toWeeklyPlan(plan: {\n id: string;\n name: string;\n startDate: Date;\n endDate: Date;\n}): WeeklyPlan", + "params": [ + { + "name": "plan", + "typeRef": "{\n id: string;\n name: string;\n startDate: Date;\n endDate: Date;\n}", + "optional": false + } + ], + "returnType": "WeeklyPlan", + "loc": 13 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "kind": "function", + "name": "ensurePublicPoolPlan", + "qualifiedName": "ensurePublicPoolPlan", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 34, + "endLine": 48, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "ensurePublicPoolPlan(): Promise", + "params": [], + "returnType": "Promise", + "loc": 15, + "interactions": [ + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34:db:out:create:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "weeklyPlan", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "kind": "function", + "name": "getDefaultWeeklyPlan", + "qualifiedName": "getDefaultWeeklyPlan", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 51, + "endLine": 53, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "getDefaultWeeklyPlan(): Promise", + "params": [], + "returnType": "Promise", + "loc": 3 + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "kind": "function", + "name": "listWeeklyPlans", + "qualifiedName": "listWeeklyPlans", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 55, + "endLine": 67, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "listWeeklyPlans(): Promise", + "params": [], + "returnType": "Promise", + "loc": 13, + "interactions": [ + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55:db:out:read:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "weeklyPlan", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "kind": "function", + "name": "createWeeklyPlan", + "qualifiedName": "createWeeklyPlan", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 69, + "endLine": 91, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "createWeeklyPlan(input: Partial): Promise", + "params": [ + { + "name": "input", + "typeRef": "Partial", + "optional": false + } + ], + "returnType": "Promise", + "loc": 23, + "interactions": [ + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69:db:out:create:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "weeklyPlan", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "kind": "function", + "name": "getWeeklyPlanOrThrow", + "qualifiedName": "getWeeklyPlanOrThrow", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 93, + "endLine": 100, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "getWeeklyPlanOrThrow(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 8, + "interactions": [ + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93:db:out:read:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "weeklyPlan", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "kind": "function", + "name": "deleteWeeklyPlan", + "qualifiedName": "deleteWeeklyPlan", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 102, + "endLine": 163, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteWeeklyPlan(id: string): Promise<{\n deletedId: string;\n fallbackPlan: WeeklyPlan;\n deletedTaskCount: number;\n}>", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise<{\n deletedId: string;\n fallbackPlan: WeeklyPlan;\n deletedTaskCount: number;\n}>", + "loc": 62, + "interactions": [ + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102:db:out:read:weeklyPlan", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "weeklyPlan", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/weeklyPlanRepository.ts#$transaction() 回调@128@128", + "kind": "function", + "name": "$transaction() 回调@128", + "qualifiedName": "$transaction() 回调@128", + "location": { + "file": "src/server/weeklyPlanRepository.ts", + "startLine": 128, + "endLine": 154, + "startCol": 54, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/weeklyPlanRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@128(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/server/taskRepository.ts#dateFromInput@31", + "kind": "function", + "name": "dateFromInput", + "qualifiedName": "dateFromInput", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 31, + "endLine": 34, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "dateFromInput(value: string): Date", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": true + } + ], + "returnType": "Date", + "loc": 4 + }, + { + "id": "func:src/server/taskRepository.ts#dateToInput@36", + "kind": "function", + "name": "dateToInput", + "qualifiedName": "dateToInput", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 36, + "endLine": 38, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "dateToInput(value: Date): string", + "params": [ + { + "name": "value", + "typeRef": "Date", + "optional": false + } + ], + "returnType": "string", + "loc": 3 + }, + { + "id": "func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "function", + "name": "uniqueValues", + "qualifiedName": "uniqueValues", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 40, + "endLine": 42, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "uniqueValues(values: string[]): string[]", + "params": [ + { + "name": "values", + "typeRef": "string[]", + "optional": true, + "defaultValue": "[]" + } + ], + "returnType": "string[]", + "loc": 3 + }, + { + "id": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "kind": "function", + "name": "normalizeNodeProgress", + "qualifiedName": "normalizeNodeProgress", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 44, + "endLine": 48, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeNodeProgress(value: unknown): number", + "params": [ + { + "name": "value", + "typeRef": "unknown", + "optional": false + } + ], + "returnType": "number", + "loc": 5 + }, + { + "id": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "kind": "function", + "name": "normalizeNodeTimeRanges", + "qualifiedName": "normalizeNodeTimeRanges", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 50, + "endLine": 79, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeNodeTimeRanges(ranges: unknown, fallbackStartDate: string, fallbackEndDate): NodeTimeRange[]", + "params": [ + { + "name": "ranges", + "typeRef": "unknown", + "optional": false + }, + { + "name": "fallbackStartDate", + "typeRef": "string", + "optional": false + }, + { + "name": "fallbackEndDate", + "optional": true, + "defaultValue": "fallbackStartDate" + } + ], + "returnType": "NodeTimeRange[]", + "loc": 30 + }, + { + "id": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "kind": "function", + "name": "getNodeTimeBounds", + "qualifiedName": "getNodeTimeBounds", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 81, + "endLine": 88, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "getNodeTimeBounds(node: Pick)", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "kind": "function", + "name": "nodeTimeRangesToJson", + "qualifiedName": "nodeTimeRangesToJson", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 90, + "endLine": 94, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "nodeTimeRangesToJson(node: Pick): Prisma.InputJsonValue", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "returnType": "Prisma.InputJsonValue", + "loc": 5 + }, + { + "id": "func:src/server/taskRepository.ts#existingTagNames@96", + "kind": "function", + "name": "existingTagNames", + "qualifiedName": "existingTagNames", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 96, + "endLine": 109, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "existingTagNames(values: string[]): Promise", + "params": [ + { + "name": "values", + "typeRef": "string[]", + "optional": true, + "defaultValue": "[]" + } + ], + "returnType": "Promise", + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#existingTagNames@96:db:out:read:tagDefinition", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "tagDefinition", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#findTaskRecord@111", + "kind": "function", + "name": "findTaskRecord", + "qualifiedName": "findTaskRecord", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 111, + "endLine": 116, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "findTaskRecord(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 6, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#findTaskRecord@111:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "kind": "function", + "name": "toWorkflowNode", + "qualifiedName": "toWorkflowNode", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 118, + "endLine": 140, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "toWorkflowNode(node: NonNullable[\"nodes\"][number]): WorkflowNode", + "params": [ + { + "name": "node", + "typeRef": "NonNullable[\"nodes\"][number]", + "optional": false + } + ], + "returnType": "WorkflowNode", + "loc": 23 + }, + { + "id": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "kind": "function", + "name": "normalizeTaskCompletionStatus", + "qualifiedName": "normalizeTaskCompletionStatus", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 142, + "endLine": 146, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeTaskCompletionStatus(value: string): \"incomplete\" | \"confirmed_completed\" | undefined", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": true + } + ], + "returnType": "\"incomplete\" | \"confirmed_completed\" | undefined", + "loc": 5 + }, + { + "id": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "kind": "function", + "name": "normalizeTaskPriority", + "qualifiedName": "normalizeTaskPriority", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 148, + "endLine": 151, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeTaskPriority(value: string): TaskPriority | undefined", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": true + } + ], + "returnType": "TaskPriority | undefined", + "loc": 4 + }, + { + "id": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "kind": "function", + "name": "resolveTaskCompletionStatus", + "qualifiedName": "resolveTaskCompletionStatus", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 153, + "endLine": 161, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "resolveTaskCompletionStatus(task: NonNullable): TaskCompletionStatus", + "params": [ + { + "name": "task", + "typeRef": "NonNullable", + "optional": false + } + ], + "returnType": "TaskCompletionStatus", + "loc": 9 + }, + { + "id": "func:src/server/taskRepository.ts#toTask@163", + "kind": "function", + "name": "toTask", + "qualifiedName": "toTask", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 163, + "endLine": 180, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "toTask(task: NonNullable): Task", + "params": [ + { + "name": "task", + "typeRef": "NonNullable", + "optional": false + } + ], + "returnType": "Task", + "loc": 18 + }, + { + "id": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "function", + "name": "getTaskOrThrow", + "qualifiedName": "getTaskOrThrow", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 182, + "endLine": 188, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "getTaskOrThrow(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 7 + }, + { + "id": "func:src/server/taskRepository.ts#getTask@190", + "kind": "function", + "name": "getTask", + "qualifiedName": "getTask", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 190, + "endLine": 192, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "getTask(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 3 + }, + { + "id": "func:src/server/taskRepository.ts#listTasks@194", + "kind": "function", + "name": "listTasks", + "qualifiedName": "listTasks", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 194, + "endLine": 205, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "listTasks(): Promise", + "params": [], + "returnType": "Promise", + "loc": 12, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#listTasks@194:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "kind": "function", + "name": "getNextTaskSortOrder", + "qualifiedName": "getNextTaskSortOrder", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 207, + "endLine": 215, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "getNextTaskSortOrder(isPinned)", + "params": [ + { + "name": "isPinned", + "optional": true, + "defaultValue": "false" + } + ], + "loc": 9, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#getNextTaskSortOrder@207:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "kind": "function", + "name": "getFirstTaskSortOrder", + "qualifiedName": "getFirstTaskSortOrder", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 217, + "endLine": 225, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "getFirstTaskSortOrder(isPinned)", + "params": [ + { + "name": "isPinned", + "optional": true, + "defaultValue": "false" + } + ], + "loc": 9, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#getFirstTaskSortOrder@217:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#createTask@227", + "kind": "function", + "name": "createTask", + "qualifiedName": "createTask", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 227, + "endLine": 300, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "createTask(input: {\n name?: string;\n weeklyPlanId?: string;\n description?: string;\n tags?: string[];\n priority?: TaskPriority;\n responsibles?: string[];\n dingtalkDocUrl?: string;\n projectBlackboard?: string;\n dingtalkWebhook?: string;\n completionStatus?: TaskCompletionStatus;\n nodes?: WorkflowNode[];\n}): Promise", + "params": [ + { + "name": "input", + "typeRef": "{\n name?: string;\n weeklyPlanId?: string;\n description?: string;\n tags?: string[];\n priority?: TaskPriority;\n responsibles?: string[];\n dingtalkDocUrl?: string;\n projectBlackboard?: string;\n dingtalkWebhook?: string;\n completionStatus?: TaskCompletionStatus;\n nodes?: WorkflowNode[];\n}", + "optional": false + } + ], + "returnType": "Promise", + "loc": 74, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#createTask@227:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "kind": "function", + "name": "$transaction() 回调@273", + "qualifiedName": "$transaction() 回调@273", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 273, + "endLine": 297, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@273(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 25 + }, + { + "id": "func:src/server/taskRepository.ts#updateTask@302", + "kind": "function", + "name": "updateTask", + "qualifiedName": "updateTask", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 302, + "endLine": 351, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "updateTask(id: string, input: Partial>): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "Partial>", + "optional": false + } + ], + "returnType": "Promise", + "loc": 50, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#updateTask@302:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/taskRepository.ts#updateTask@302:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "kind": "function", + "name": "$transaction() 回调@313", + "qualifiedName": "$transaction() 回调@313", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 313, + "endLine": 348, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@313(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 36 + }, + { + "id": "func:src/server/taskRepository.ts#updateTaskListState@353", + "kind": "function", + "name": "updateTaskListState", + "qualifiedName": "updateTaskListState", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 353, + "endLine": 381, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "updateTaskListState(id: string, input: { isPinned?: boolean; sortOrder?: number }): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "{ isPinned?: boolean; sortOrder?: number }", + "optional": false + } + ], + "returnType": "Promise", + "loc": 29, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#updateTaskListState@353:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/taskRepository.ts#updateTaskListState@353:db:out:update:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "update", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#deleteTask@383", + "kind": "function", + "name": "deleteTask", + "qualifiedName": "deleteTask", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 383, + "endLine": 387, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteTask(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 5, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#deleteTask@383:db:out:delete:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#createWorkflowNode@389", + "kind": "function", + "name": "createWorkflowNode", + "qualifiedName": "createWorkflowNode", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 389, + "endLine": 421, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "createWorkflowNode(taskId: string, input: WorkflowNode): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "Promise", + "loc": 33, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#createWorkflowNode@389:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "kind": "function", + "name": "$transaction() 回调@392", + "qualifiedName": "$transaction() 回调@392", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 392, + "endLine": 418, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@392(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "kind": "function", + "name": "updateWorkflowNode", + "qualifiedName": "updateWorkflowNode", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 423, + "endLine": 470, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "updateWorkflowNode(taskId: string, nodeId: string, input: Partial): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodeId", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "Partial", + "optional": false + } + ], + "returnType": "Promise", + "loc": 48, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#updateWorkflowNode@423:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "kind": "function", + "name": "$transaction() 回调@430", + "qualifiedName": "$transaction() 回调@430", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 430, + "endLine": 467, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@430(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 38 + }, + { + "id": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "kind": "function", + "name": "deleteWorkflowNode", + "qualifiedName": "deleteWorkflowNode", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 472, + "endLine": 492, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteWorkflowNode(taskId: string, nodeId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodeId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 21, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#deleteWorkflowNode@472:db:out:read:workflowNode", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "workflowNode", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/taskRepository.ts#deleteWorkflowNode@472:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@480@480", + "kind": "function", + "name": "$transaction() 回调@480", + "qualifiedName": "$transaction() 回调@480", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 480, + "endLine": 489, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@480(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/server/taskRepository.ts#createNodeDependency@494", + "kind": "function", + "name": "createNodeDependency", + "qualifiedName": "createNodeDependency", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 494, + "endLine": 533, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "createNodeDependency(taskId: string, parentNodeId: string, childNodeId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "parentNodeId", + "typeRef": "string", + "optional": false + }, + { + "name": "childNodeId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 40, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#createNodeDependency@494:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@510@510", + "kind": "function", + "name": "$transaction() 回调@510", + "qualifiedName": "$transaction() 回调@510", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 510, + "endLine": 530, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@510(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 21 + }, + { + "id": "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "kind": "function", + "name": "deleteNodeDependency", + "qualifiedName": "deleteNodeDependency", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 535, + "endLine": 558, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteNodeDependency(taskId: string, parentNodeId: string, childNodeId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "parentNodeId", + "typeRef": "string", + "optional": false + }, + { + "name": "childNodeId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 24, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#deleteNodeDependency@535:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#$transaction() 回调@542@542", + "kind": "function", + "name": "$transaction() 回调@542", + "qualifiedName": "$transaction() 回调@542", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 542, + "endLine": 555, + "startCol": 29, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "$transaction() 回调@542(tx)", + "params": [ + { + "name": "tx", + "optional": false + } + ], + "loc": 14 + }, + { + "id": "func:src/server/taskRepository.ts#ensureTaskExists@560", + "kind": "function", + "name": "ensureTaskExists", + "qualifiedName": "ensureTaskExists", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 560, + "endLine": 565, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "ensureTaskExists(taskId: string)", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + } + ], + "loc": 6, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#ensureTaskExists@560:db:out:read:task", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "task", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "kind": "function", + "name": "ensureWorkflowNodeExists", + "qualifiedName": "ensureWorkflowNodeExists", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 567, + "endLine": 575, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "ensureWorkflowNodeExists(taskId: string, nodeId: string)", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodeId", + "typeRef": "string", + "optional": false + } + ], + "loc": 9, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567:db:out:read:workflowNode", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "workflowNode", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#hasDependencyPath@577", + "kind": "function", + "name": "hasDependencyPath", + "qualifiedName": "hasDependencyPath", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 577, + "endLine": 603, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "hasDependencyPath(taskId: string, fromNodeId: string, toNodeId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "fromNodeId", + "typeRef": "string", + "optional": false + }, + { + "name": "toNodeId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 27, + "interactions": [ + { + "id": "ix:func:src/server/taskRepository.ts#hasDependencyPath@577:db:out:read:nodeDependency", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "nodeDependency", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "kind": "function", + "name": "replaceTaskNodes", + "qualifiedName": "replaceTaskNodes", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 605, + "endLine": 669, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "replaceTaskNodes(tx: Parameters[0]>[0], taskId: string, nodes: WorkflowNode[])", + "params": [ + { + "name": "tx", + "typeRef": "Parameters[0]>[0]", + "optional": false + }, + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodes", + "typeRef": "WorkflowNode[]", + "optional": false + } + ], + "loc": 65 + }, + { + "id": "func:src/server/taskRepository.ts#map() 回调@618@618", + "kind": "function", + "name": "map() 回调@618", + "qualifiedName": "map() 回调@618", + "location": { + "file": "src/server/taskRepository.ts", + "startLine": 618, + "endLine": 634, + "startCol": 21, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/taskRepository.ts", + "moduleId": "module:src/server", + "signature": "map() 回调@618(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/server/notificationRepository.ts#toNotificationLog@17", + "kind": "function", + "name": "toNotificationLog", + "qualifiedName": "toNotificationLog", + "location": { + "file": "src/server/notificationRepository.ts", + "startLine": 17, + "endLine": 35, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/notificationRepository.ts", + "moduleId": "module:src/server", + "signature": "toNotificationLog(log: Awaited>): NotificationLog", + "params": [ + { + "name": "log", + "typeRef": "Awaited>", + "optional": false + } + ], + "returnType": "NotificationLog", + "loc": 19 + }, + { + "id": "func:src/server/notificationRepository.ts#createNotificationLog@37", + "kind": "function", + "name": "createNotificationLog", + "qualifiedName": "createNotificationLog", + "location": { + "file": "src/server/notificationRepository.ts", + "startLine": 37, + "endLine": 45, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/notificationRepository.ts", + "moduleId": "module:src/server", + "signature": "createNotificationLog(input: CreateNotificationLogInput): Promise", + "params": [ + { + "name": "input", + "typeRef": "CreateNotificationLogInput", + "optional": false + } + ], + "returnType": "Promise", + "loc": 9, + "interactions": [ + { + "id": "ix:func:src/server/notificationRepository.ts#createNotificationLog@37:db:out:create:notificationLog", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "notificationLog", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/notificationRepository.ts#listNotificationLogs@47", + "kind": "function", + "name": "listNotificationLogs", + "qualifiedName": "listNotificationLogs", + "location": { + "file": "src/server/notificationRepository.ts", + "startLine": 47, + "endLine": 54, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/notificationRepository.ts", + "moduleId": "module:src/server", + "signature": "listNotificationLogs(limit): Promise", + "params": [ + { + "name": "limit", + "optional": true, + "defaultValue": "50" + } + ], + "returnType": "Promise", + "loc": 8, + "interactions": [ + { + "id": "ix:func:src/server/notificationRepository.ts#listNotificationLogs@47:db:out:read:notificationLog", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "notificationLog", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "kind": "function", + "name": "clearNotificationLogs", + "qualifiedName": "clearNotificationLogs", + "location": { + "file": "src/server/notificationRepository.ts", + "startLine": 56, + "endLine": 58, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/notificationRepository.ts", + "moduleId": "module:src/server", + "signature": "clearNotificationLogs(): Promise", + "params": [], + "returnType": "Promise", + "loc": 3, + "interactions": [ + { + "id": "ix:func:src/server/notificationRepository.ts#clearNotificationLogs@56:db:out:delete:notificationLog", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "notificationLog", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "kind": "function", + "name": "uniqueValues", + "qualifiedName": "uniqueValues", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 13, + "endLine": 15, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "uniqueValues(values: string[]): string[]", + "params": [ + { + "name": "values", + "typeRef": "string[]", + "optional": true, + "defaultValue": "[]" + } + ], + "returnType": "string[]", + "loc": 3 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "kind": "function", + "name": "normalizeNodeProgress", + "qualifiedName": "normalizeNodeProgress", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 17, + "endLine": 21, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeNodeProgress(value: unknown): number", + "params": [ + { + "name": "value", + "typeRef": "unknown", + "optional": false + } + ], + "returnType": "number", + "loc": 5 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "kind": "function", + "name": "normalizeNodeTimeRanges", + "qualifiedName": "normalizeNodeTimeRanges", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 23, + "endLine": 52, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeNodeTimeRanges(ranges: unknown, fallbackStartDate: string, fallbackEndDate): NodeTimeRange[]", + "params": [ + { + "name": "ranges", + "typeRef": "unknown", + "optional": false + }, + { + "name": "fallbackStartDate", + "typeRef": "string", + "optional": false + }, + { + "name": "fallbackEndDate", + "optional": true, + "defaultValue": "fallbackStartDate" + } + ], + "returnType": "NodeTimeRange[]", + "loc": 30 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "kind": "function", + "name": "normalizeTemplateNodes", + "qualifiedName": "normalizeTemplateNodes", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 54, + "endLine": 94, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "normalizeTemplateNodes(nodes: unknown): WorkflowNode[]", + "params": [ + { + "name": "nodes", + "typeRef": "unknown", + "optional": false + } + ], + "returnType": "WorkflowNode[]", + "loc": 41 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "kind": "function", + "name": "map() 回调@58", + "qualifiedName": "map() 回调@58", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 58, + "endLine": 86, + "startCol": 10, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "map() 回调@58(node, index)", + "params": [ + { + "name": "node", + "optional": false + }, + { + "name": "index", + "optional": false + } + ], + "loc": 29 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "kind": "function", + "name": "toProjectTemplate", + "qualifiedName": "toProjectTemplate", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 96, + "endLine": 104, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "toProjectTemplate(template: ProjectTemplateRecord): ProjectTemplate", + "params": [ + { + "name": "template", + "typeRef": "ProjectTemplateRecord", + "optional": false + } + ], + "returnType": "ProjectTemplate", + "loc": 9 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "kind": "function", + "name": "toTemplateNodesJson", + "qualifiedName": "toTemplateNodesJson", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 106, + "endLine": 108, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "toTemplateNodesJson(nodes: unknown): Prisma.InputJsonValue", + "params": [ + { + "name": "nodes", + "typeRef": "unknown", + "optional": false + } + ], + "returnType": "Prisma.InputJsonValue", + "loc": 3 + }, + { + "id": "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "kind": "function", + "name": "listProjectTemplates", + "qualifiedName": "listProjectTemplates", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 110, + "endLine": 116, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "listProjectTemplates(): Promise", + "params": [], + "returnType": "Promise", + "loc": 7, + "interactions": [ + { + "id": "ix:func:src/server/projectTemplateRepository.ts#listProjectTemplates@110:db:out:read:projectTemplate", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "projectTemplate", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "kind": "function", + "name": "createProjectTemplate", + "qualifiedName": "createProjectTemplate", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 118, + "endLine": 134, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "createProjectTemplate(input: Partial): Promise", + "params": [ + { + "name": "input", + "typeRef": "Partial", + "optional": false + } + ], + "returnType": "Promise", + "loc": 17, + "interactions": [ + { + "id": "ix:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118:db:out:create:projectTemplate", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "projectTemplate", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "kind": "function", + "name": "updateProjectTemplate", + "qualifiedName": "updateProjectTemplate", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 136, + "endLine": 156, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "updateProjectTemplate(id: string, input: Partial): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "Partial", + "optional": false + } + ], + "returnType": "Promise", + "loc": 21, + "interactions": [ + { + "id": "ix:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136:db:out:read:projectTemplate", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "projectTemplate", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136:db:out:update:projectTemplate", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "update", + "target": "projectTemplate", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "kind": "function", + "name": "deleteProjectTemplate", + "qualifiedName": "deleteProjectTemplate", + "location": { + "file": "src/server/projectTemplateRepository.ts", + "startLine": 158, + "endLine": 162, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/projectTemplateRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteProjectTemplate(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 5, + "interactions": [ + { + "id": "ix:func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158:db:out:delete:projectTemplate", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "projectTemplate", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/tagRepository.ts#toTagDefinition@4", + "kind": "function", + "name": "toTagDefinition", + "qualifiedName": "toTagDefinition", + "location": { + "file": "src/server/tagRepository.ts", + "startLine": 4, + "endLine": 9, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/tagRepository.ts", + "moduleId": "module:src/server", + "signature": "toTagDefinition(tag: { id: string; name: string }): TagDefinition", + "params": [ + { + "name": "tag", + "typeRef": "{ id: string; name: string }", + "optional": false + } + ], + "returnType": "TagDefinition", + "loc": 6 + }, + { + "id": "func:src/server/tagRepository.ts#listTagDefinitions@11", + "kind": "function", + "name": "listTagDefinitions", + "qualifiedName": "listTagDefinitions", + "location": { + "file": "src/server/tagRepository.ts", + "startLine": 11, + "endLine": 17, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/tagRepository.ts", + "moduleId": "module:src/server", + "signature": "listTagDefinitions(): Promise", + "params": [], + "returnType": "Promise", + "loc": 7, + "interactions": [ + { + "id": "ix:func:src/server/tagRepository.ts#listTagDefinitions@11:db:out:read:tagDefinition", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "tagDefinition", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/tagRepository.ts#createTagDefinition@19", + "kind": "function", + "name": "createTagDefinition", + "qualifiedName": "createTagDefinition", + "location": { + "file": "src/server/tagRepository.ts", + "startLine": 19, + "endLine": 32, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/tagRepository.ts", + "moduleId": "module:src/server", + "signature": "createTagDefinition(input: { name?: string }): Promise", + "params": [ + { + "name": "input", + "typeRef": "{ name?: string }", + "optional": false + } + ], + "returnType": "Promise", + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/server/tagRepository.ts#createTagDefinition@19:db:out:create:tagDefinition", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "tagDefinition", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/tagRepository.ts#deleteTagDefinition@34", + "kind": "function", + "name": "deleteTagDefinition", + "qualifiedName": "deleteTagDefinition", + "location": { + "file": "src/server/tagRepository.ts", + "startLine": 34, + "endLine": 48, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/tagRepository.ts", + "moduleId": "module:src/server", + "signature": "deleteTagDefinition(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 15, + "interactions": [ + { + "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:read:tagDefinition", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "tagDefinition", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:other:", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "other", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:delete:taskTag", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "taskTag", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/tagRepository.ts#deleteTagDefinition@34:db:out:delete:tagDefinition", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "tagDefinition", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#toPerson@4", + "kind": "function", + "name": "toPerson", + "qualifiedName": "toPerson", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 4, + "endLine": 26, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "toPerson(person: {\n id: string;\n name: string;\n department: string;\n role: string;\n ssoUserId: string;\n dingUserId: string;\n email: string;\n phone: string;\n isAdmin: boolean;\n}): Person", + "params": [ + { + "name": "person", + "typeRef": "{\n id: string;\n name: string;\n department: string;\n role: string;\n ssoUserId: string;\n dingUserId: string;\n email: string;\n phone: string;\n isAdmin: boolean;\n}", + "optional": false + } + ], + "returnType": "Person", + "loc": 23 + }, + { + "id": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "kind": "function", + "name": "ensurePeopleFromExistingResponsibles", + "qualifiedName": "ensurePeopleFromExistingResponsibles", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 28, + "endLine": 51, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "ensurePeopleFromExistingResponsibles()", + "params": [], + "loc": 24, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:read:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "person", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:read:taskResponsible", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "taskResponsible", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:read:nodeResponsible", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "nodeResponsible", + "engine": "prisma" + }, + { + "id": "ix:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28:db:out:create:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#listPeople@53", + "kind": "function", + "name": "listPeople", + "qualifiedName": "listPeople", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 53, + "endLine": 62, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "listPeople(): Promise", + "params": [], + "returnType": "Promise", + "loc": 10, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#listPeople@53:db:out:read:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#getPersonOrThrow@64", + "kind": "function", + "name": "getPersonOrThrow", + "qualifiedName": "getPersonOrThrow", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 64, + "endLine": 71, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "getPersonOrThrow(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 8, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#getPersonOrThrow@64:db:out:read:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "read", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#createPerson@73", + "kind": "function", + "name": "createPerson", + "qualifiedName": "createPerson", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 73, + "endLine": 116, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "createPerson(input: {\n name?: string;\n department?: string;\n role?: string;\n ssoUserId?: string;\n dingUserId?: string;\n email?: string;\n phone?: string;\n isAdmin?: boolean;\n}): Promise", + "params": [ + { + "name": "input", + "typeRef": "{\n name?: string;\n department?: string;\n role?: string;\n ssoUserId?: string;\n dingUserId?: string;\n email?: string;\n phone?: string;\n isAdmin?: boolean;\n}", + "optional": false + } + ], + "returnType": "Promise", + "loc": 44, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#createPerson@73:db:out:create:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#ensurePeople@118", + "kind": "function", + "name": "ensurePeople", + "qualifiedName": "ensurePeople", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 118, + "endLine": 140, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "ensurePeople(inputs: Array<{ name: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }>): Promise", + "params": [ + { + "name": "inputs", + "typeRef": "Array<{ name: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }>", + "optional": false + } + ], + "returnType": "Promise", + "loc": 23, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#ensurePeople@118:db:out:create:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "create", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#updatePerson@142", + "kind": "function", + "name": "updatePerson", + "qualifiedName": "updatePerson", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 142, + "endLine": 175, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "updatePerson(id: string, input: { name?: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "{ name?: string; department?: string; role?: string; ssoUserId?: string; dingUserId?: string; email?: string; phone?: string; isAdmin?: boolean }", + "optional": false + } + ], + "returnType": "Promise", + "loc": 34, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#updatePerson@142:db:out:update:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "update", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/personRepository.ts#deletePerson@177", + "kind": "function", + "name": "deletePerson", + "qualifiedName": "deletePerson", + "location": { + "file": "src/server/personRepository.ts", + "startLine": 177, + "endLine": 181, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/personRepository.ts", + "moduleId": "module:src/server", + "signature": "deletePerson(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 5, + "interactions": [ + { + "id": "ix:func:src/server/personRepository.ts#deletePerson@177:db:out:delete:person", + "kind": "db", + "direction": "out", + "provenance": "resolved", + "operation": "delete", + "target": "person", + "engine": "prisma" + } + ] + }, + { + "id": "func:src/server/botQueryTools.ts#getTodayStr@10", + "kind": "function", + "name": "getTodayStr", + "qualifiedName": "getTodayStr", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 10, + "endLine": 19, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getTodayStr(timeZone): string", + "params": [ + { + "name": "timeZone", + "optional": true, + "defaultValue": "DEFAULT_TIME_ZONE" + } + ], + "returnType": "string", + "loc": 10 + }, + { + "id": "func:src/server/botQueryTools.ts#value@17", + "kind": "function", + "name": "value", + "qualifiedName": "value", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 17, + "endLine": 17, + "startCol": 9, + "endCol": 88 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "value(type: string)", + "params": [ + { + "name": "type", + "typeRef": "string", + "optional": false + } + ], + "loc": 1 + }, + { + "id": "func:src/server/botQueryTools.ts#nodeRanges@21", + "kind": "function", + "name": "nodeRanges", + "qualifiedName": "nodeRanges", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 21, + "endLine": 26, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "nodeRanges(node: WorkflowNode): { startDate: string; endDate: string }[]", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "{ startDate: string; endDate: string }[]", + "loc": 6 + }, + { + "id": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "kind": "function", + "name": "nodeStartDate", + "qualifiedName": "nodeStartDate", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 28, + "endLine": 32, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "nodeStartDate(node: WorkflowNode): string", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "string", + "loc": 5 + }, + { + "id": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "kind": "function", + "name": "nodeEndDate", + "qualifiedName": "nodeEndDate", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 34, + "endLine": 39, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "nodeEndDate(node: WorkflowNode): string", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "string", + "loc": 6 + }, + { + "id": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 41, + "endLine": 48, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getEffectiveNodeStatus(node: WorkflowNode, today: string): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + }, + { + "name": "today", + "typeRef": "string", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 8 + }, + { + "id": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "kind": "function", + "name": "taskDateSpan", + "qualifiedName": "taskDateSpan", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 51, + "endLine": 56, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "taskDateSpan(task: Task): { start: string | null; end: string | null }", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "returnType": "{ start: string | null; end: string | null }", + "loc": 6 + }, + { + "id": "func:src/server/botQueryTools.ts#overlapsRange@59", + "kind": "function", + "name": "overlapsRange", + "qualifiedName": "overlapsRange", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 59, + "endLine": 69, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "overlapsRange(start: string | null, end: string | null, from: string, to: string): boolean", + "params": [ + { + "name": "start", + "typeRef": "string | null", + "optional": false + }, + { + "name": "end", + "typeRef": "string | null", + "optional": false + }, + { + "name": "from", + "typeRef": "string", + "optional": false + }, + { + "name": "to", + "typeRef": "string", + "optional": false + } + ], + "returnType": "boolean", + "loc": 11 + }, + { + "id": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "kind": "function", + "name": "buildTaskLink", + "qualifiedName": "buildTaskLink", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 72, + "endLine": 82, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "buildTaskLink(taskId: string, nodeId: string): string", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodeId", + "typeRef": "string", + "optional": true + } + ], + "returnType": "string", + "loc": 11 + }, + { + "id": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "kind": "function", + "name": "isTaskRelatedToPerson", + "qualifiedName": "isTaskRelatedToPerson", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 98, + "endLine": 101, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "isTaskRelatedToPerson(task: Task, personName: string): boolean", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + }, + { + "name": "personName", + "typeRef": "string", + "optional": false + } + ], + "returnType": "boolean", + "loc": 4 + }, + { + "id": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "kind": "function", + "name": "isNodeOwnedByPerson", + "qualifiedName": "isNodeOwnedByPerson", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 103, + "endLine": 105, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "isNodeOwnedByPerson(node: WorkflowNode, personName: string): boolean", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + }, + { + "name": "personName", + "typeRef": "string", + "optional": false + } + ], + "returnType": "boolean", + "loc": 3 + }, + { + "id": "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "kind": "function", + "name": "createBotQueryContext", + "qualifiedName": "createBotQueryContext", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 116, + "endLine": 128, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "createBotQueryContext(person: Person): BotQueryContext", + "params": [ + { + "name": "person", + "typeRef": "Person", + "optional": false + } + ], + "returnType": "BotQueryContext", + "loc": 13 + }, + { + "id": "func:src/server/botQueryTools.ts#getTasks@124", + "kind": "function", + "name": "getTasks", + "qualifiedName": "getTasks", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 124, + "endLine": 124, + "startCol": 5, + "endCol": 49 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getTasks()", + "params": [], + "loc": 1 + }, + { + "id": "func:src/server/botQueryTools.ts#getPeople@125", + "kind": "function", + "name": "getPeople", + "qualifiedName": "getPeople", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 125, + "endLine": 125, + "startCol": 5, + "endCol": 52 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getPeople()", + "params": [], + "loc": 1 + }, + { + "id": "func:src/server/botQueryTools.ts#getWeeklyPlans@126", + "kind": "function", + "name": "getWeeklyPlans", + "qualifiedName": "getWeeklyPlans", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 126, + "endLine": 126, + "startCol": 5, + "endCol": 61 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getWeeklyPlans()", + "params": [], + "loc": 1 + }, + { + "id": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "kind": "function", + "name": "resolveTaskScope", + "qualifiedName": "resolveTaskScope", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 141, + "endLine": 170, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "resolveTaskScope(ctx: BotQueryContext, personName: string, allMembers: boolean): Promise", + "params": [ + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + }, + { + "name": "personName", + "typeRef": "string", + "optional": true + }, + { + "name": "allMembers", + "typeRef": "boolean", + "optional": true + } + ], + "returnType": "Promise", + "loc": 30 + }, + { + "id": "func:src/server/botQueryTools.ts#selfScope@149", + "kind": "function", + "name": "selfScope", + "qualifiedName": "selfScope", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 149, + "endLine": 153, + "startCol": 9, + "endCol": 5 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "selfScope(): TaskScope", + "params": [], + "returnType": "TaskScope", + "loc": 5 + }, + { + "id": "func:src/server/botQueryTools.ts#summarizeTask@172", + "kind": "function", + "name": "summarizeTask", + "qualifiedName": "summarizeTask", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 172, + "endLine": 196, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "summarizeTask(task: Task, planName: string, today: string)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + }, + { + "name": "planName", + "typeRef": "string", + "optional": false + }, + { + "name": "today", + "typeRef": "string", + "optional": false + } + ], + "loc": 25 + }, + { + "id": "func:src/server/botQueryTools.ts#planNameById@198", + "kind": "function", + "name": "planNameById", + "qualifiedName": "planNameById", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 198, + "endLine": 201, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "planNameById(ctx: BotQueryContext): Promise>", + "params": [ + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + } + ], + "returnType": "Promise>", + "loc": 4 + }, + { + "id": "func:src/server/botQueryTools.ts#resolveToolSchema@231", + "kind": "function", + "name": "resolveToolSchema", + "qualifiedName": "resolveToolSchema", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 231, + "endLine": 245, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "resolveToolSchema(tool: BotTool, isAdmin: boolean): { description: string; parameters: Record }", + "params": [ + { + "name": "tool", + "typeRef": "BotTool", + "optional": false + }, + { + "name": "isAdmin", + "typeRef": "boolean", + "optional": false + } + ], + "returnType": "{ description: string; parameters: Record }", + "loc": 15 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@253", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 253, + "endLine": 261, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(_args, ctx)", + "params": [ + { + "name": "_args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 9 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@297", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 297, + "endLine": 336, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(args, ctx)", + "params": [ + { + "name": "args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 40 + }, + { + "id": "func:src/server/botQueryTools.ts#filter() 回调@310@310", + "kind": "function", + "name": "filter() 回调@310", + "qualifiedName": "filter() 回调@310", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 310, + "endLine": 327, + "startCol": 39, + "endCol": 8 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "filter() 回调@310(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@349", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 349, + "endLine": 405, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(args, ctx)", + "params": [ + { + "name": "args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 57 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@430", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 430, + "endLine": 485, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(args, ctx)", + "params": [ + { + "name": "args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 56 + }, + { + "id": "func:src/server/botQueryTools.ts#addDays@440", + "kind": "function", + "name": "addDays", + "qualifiedName": "addDays", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 440, + "endLine": 444, + "startCol": 13, + "endCol": 8 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "addDays(base: string, delta: number)", + "params": [ + { + "name": "base", + "typeRef": "string", + "optional": false + }, + { + "name": "delta", + "typeRef": "number", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@500", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 500, + "endLine": 529, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(args, ctx)", + "params": [ + { + "name": "args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 30 + }, + { + "id": "func:src/server/botQueryTools.ts#filter() 回调@516@516", + "kind": "function", + "name": "filter() 回调@516", + "qualifiedName": "filter() 回调@516", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 516, + "endLine": 519, + "startCol": 17, + "endCol": 10 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "filter() 回调@516(plan)", + "params": [ + { + "name": "plan", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/server/botQueryTools.ts#execute@542", + "kind": "function", + "name": "execute", + "qualifiedName": "execute", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 542, + "endLine": 579, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "execute(args, ctx)", + "params": [ + { + "name": "args", + "optional": false + }, + { + "name": "ctx", + "optional": false + } + ], + "loc": 38 + }, + { + "id": "func:src/server/botQueryTools.ts#getBotToolByName@583", + "kind": "function", + "name": "getBotToolByName", + "qualifiedName": "getBotToolByName", + "location": { + "file": "src/server/botQueryTools.ts", + "startLine": 583, + "endLine": 585, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/botQueryTools.ts", + "moduleId": "module:src/server", + "signature": "getBotToolByName(name: string): BotTool | undefined", + "params": [ + { + "name": "name", + "typeRef": "string", + "optional": false + } + ], + "returnType": "BotTool | undefined", + "loc": 3 + }, + { + "id": "func:src/server/aiChatService.ts#isAiConfigured@30", + "kind": "function", + "name": "isAiConfigured", + "qualifiedName": "isAiConfigured", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 30, + "endLine": 32, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "isAiConfigured(): boolean", + "params": [], + "returnType": "boolean", + "loc": 3 + }, + { + "id": "func:src/server/aiChatService.ts#getMemoryTurns@62", + "kind": "function", + "name": "getMemoryTurns", + "qualifiedName": "getMemoryTurns", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 62, + "endLine": 70, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "getMemoryTurns(sessionKey: string): ConversationTurn[]", + "params": [ + { + "name": "sessionKey", + "typeRef": "string", + "optional": false + } + ], + "returnType": "ConversationTurn[]", + "loc": 9 + }, + { + "id": "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "kind": "function", + "name": "appendMemoryTurn", + "qualifiedName": "appendMemoryTurn", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 72, + "endLine": 76, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "appendMemoryTurn(sessionKey: string, turn: ConversationTurn)", + "params": [ + { + "name": "sessionKey", + "typeRef": "string", + "optional": false + }, + { + "name": "turn", + "typeRef": "ConversationTurn", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/server/aiChatService.ts#clearBotMemory@79", + "kind": "function", + "name": "clearBotMemory", + "qualifiedName": "clearBotMemory", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 79, + "endLine": 81, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "clearBotMemory(sessionKey: string): void", + "params": [ + { + "name": "sessionKey", + "typeRef": "string", + "optional": false + } + ], + "returnType": "void", + "loc": 3 + }, + { + "id": "func:src/server/aiChatService.ts#setInterval() 回调@84@84", + "kind": "function", + "name": "setInterval() 回调@84", + "qualifiedName": "setInterval() 回调@84", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 84, + "endLine": 89, + "startCol": 13, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "setInterval() 回调@84()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/server/aiChatService.ts#buildToolSpecs@93", + "kind": "function", + "name": "buildToolSpecs", + "qualifiedName": "buildToolSpecs", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 93, + "endLine": 105, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "buildToolSpecs(ctx: BotQueryContext)", + "params": [ + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + } + ], + "loc": 13 + }, + { + "id": "func:src/server/aiChatService.ts#map() 回调@94@94", + "kind": "function", + "name": "map() 回调@94", + "qualifiedName": "map() 回调@94", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 94, + "endLine": 104, + "startCol": 24, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "map() 回调@94(tool)", + "params": [ + { + "name": "tool", + "optional": false + } + ], + "loc": 11 + }, + { + "id": "func:src/server/aiChatService.ts#buildSystemPrompt@107", + "kind": "function", + "name": "buildSystemPrompt", + "qualifiedName": "buildSystemPrompt", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 107, + "endLine": 122, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "buildSystemPrompt(ctx: BotQueryContext): string", + "params": [ + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + } + ], + "returnType": "string", + "loc": 16 + }, + { + "id": "func:src/server/aiChatService.ts#callChatCompletion@124", + "kind": "function", + "name": "callChatCompletion", + "qualifiedName": "callChatCompletion", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 124, + "endLine": 154, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "callChatCompletion(messages: ChatMessage[], tools: ReturnType): Promise", + "params": [ + { + "name": "messages", + "typeRef": "ChatMessage[]", + "optional": false + }, + { + "name": "tools", + "typeRef": "ReturnType", + "optional": false + } + ], + "returnType": "Promise", + "loc": 31, + "interactions": [ + { + "id": "ix:func:src/server/aiChatService.ts#callChatCompletion@124:api:out:POST:`${OPENAI_BASE_URL}/chat/completions`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "`${OPENAI_BASE_URL}/chat/completions`" + } + ] + }, + { + "id": "func:src/server/aiChatService.ts#executeToolCall@156", + "kind": "function", + "name": "executeToolCall", + "qualifiedName": "executeToolCall", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 156, + "endLine": 180, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "executeToolCall(name: string, argsJson: string, ctx: BotQueryContext): Promise", + "params": [ + { + "name": "name", + "typeRef": "string", + "optional": false + }, + { + "name": "argsJson", + "typeRef": "string", + "optional": false + }, + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + } + ], + "returnType": "Promise", + "loc": 25 + }, + { + "id": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "kind": "function", + "name": "answerBotQuestion", + "qualifiedName": "answerBotQuestion", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 185, + "endLine": 260, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "signature": "answerBotQuestion(question: string, ctx: BotQueryContext, sessionKey: string): Promise", + "params": [ + { + "name": "question", + "typeRef": "string", + "optional": false + }, + { + "name": "ctx", + "typeRef": "BotQueryContext", + "optional": false + }, + { + "name": "sessionKey", + "typeRef": "string", + "optional": true + } + ], + "returnType": "Promise", + "loc": 76 + }, + { + "id": "func:server.ts#ensureManualLoginPeople@84", + "kind": "function", + "name": "ensureManualLoginPeople", + "qualifiedName": "ensureManualLoginPeople", + "location": { + "file": "server.ts", + "startLine": 84, + "endLine": 86, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "ensureManualLoginPeople()", + "params": [], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#GET /api/health@90", + "kind": "function", + "name": "GET /api/health", + "qualifiedName": "GET /api/health", + "location": { + "file": "server.ts", + "startLine": 90, + "endLine": 96, + "startCol": 24, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/health(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/health@90:api:in:GET:/api/health", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/health" + } + ] + }, + { + "id": "func:server.ts#readRemoteError@98", + "kind": "function", + "name": "readRemoteError", + "qualifiedName": "readRemoteError", + "location": { + "file": "server.ts", + "startLine": 98, + "endLine": 108, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "readRemoteError(response: Response, fallback: string)", + "params": [ + { + "name": "response", + "typeRef": "Response", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 11 + }, + { + "id": "func:server.ts#readRemoteJson@110", + "kind": "function", + "name": "readRemoteJson", + "qualifiedName": "readRemoteJson", + "location": { + "file": "server.ts", + "startLine": 110, + "endLine": 118, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "readRemoteJson(response: Response, fallback: string)", + "params": [ + { + "name": "response", + "typeRef": "Response", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 9 + }, + { + "id": "func:server.ts#ensureDingTalkRobotConfigured@122", + "kind": "function", + "name": "ensureDingTalkRobotConfigured", + "qualifiedName": "ensureDingTalkRobotConfigured", + "location": { + "file": "server.ts", + "startLine": 122, + "endLine": 126, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "ensureDingTalkRobotConfigured()", + "params": [], + "isEntry": true, + "loc": 5 + }, + { + "id": "func:server.ts#getDingTalkRobotAccessToken@128", + "kind": "function", + "name": "getDingTalkRobotAccessToken", + "qualifiedName": "getDingTalkRobotAccessToken", + "location": { + "file": "server.ts", + "startLine": 128, + "endLine": 160, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getDingTalkRobotAccessToken()", + "params": [], + "isEntry": true, + "loc": 33, + "interactions": [ + { + "id": "ix:func:server.ts#getDingTalkRobotAccessToken@128:api:out:POST:https://api.dingtalk.com/v1.0/oauth2/accessToken", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "https://api.dingtalk.com/v1.0/oauth2/accessToken", + "peer": "api.dingtalk.com" + } + ] + }, + { + "id": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "kind": "function", + "name": "sendDingTalkRobotMarkdownMessage", + "qualifiedName": "sendDingTalkRobotMarkdownMessage", + "location": { + "file": "server.ts", + "startLine": 162, + "endLine": 201, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "sendDingTalkRobotMarkdownMessage(input: {\n userIds: string[];\n title: string;\n text: string;\n})", + "params": [ + { + "name": "input", + "typeRef": "{\n userIds: string[];\n title: string;\n text: string;\n}", + "optional": false + } + ], + "isEntry": true, + "loc": 40, + "interactions": [ + { + "id": "ix:func:server.ts#sendDingTalkRobotMarkdownMessage@162:api:out:POST:https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend", + "peer": "api.dingtalk.com" + } + ] + }, + { + "id": "func:server.ts#replyToDingTalkSession@204", + "kind": "function", + "name": "replyToDingTalkSession", + "qualifiedName": "replyToDingTalkSession", + "location": { + "file": "server.ts", + "startLine": 204, + "endLine": 219, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "replyToDingTalkSession(sessionWebhook: string, content: string)", + "params": [ + { + "name": "sessionWebhook", + "typeRef": "string", + "optional": false + }, + { + "name": "content", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 16, + "interactions": [ + { + "id": "ix:func:server.ts#replyToDingTalkSession@204:api:out:POST:", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST" + } + ] + }, + { + "id": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "kind": "function", + "name": "replyToDingTalkSessionMarkdown", + "qualifiedName": "replyToDingTalkSessionMarkdown", + "location": { + "file": "server.ts", + "startLine": 222, + "endLine": 237, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "replyToDingTalkSessionMarkdown(sessionWebhook: string, title: string, text: string)", + "params": [ + { + "name": "sessionWebhook", + "typeRef": "string", + "optional": false + }, + { + "name": "title", + "typeRef": "string", + "optional": false + }, + { + "name": "text", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 16, + "interactions": [ + { + "id": "ix:func:server.ts#replyToDingTalkSessionMarkdown@222:api:out:POST:", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST" + } + ] + }, + { + "id": "func:server.ts#getTaskRelatedPersonNames@239", + "kind": "function", + "name": "getTaskRelatedPersonNames", + "qualifiedName": "getTaskRelatedPersonNames", + "location": { + "file": "server.ts", + "startLine": 239, + "endLine": 250, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getTaskRelatedPersonNames(task: Task)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "isEntry": true, + "loc": 12 + }, + { + "id": "func:server.ts#getWorkflowLink@252", + "kind": "function", + "name": "getWorkflowLink", + "qualifiedName": "getWorkflowLink", + "location": { + "file": "server.ts", + "startLine": 252, + "endLine": 259, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getWorkflowLink(params: { weeklyPlanId?: string; taskId?: string; nodeId?: string })", + "params": [ + { + "name": "params", + "typeRef": "{ weeklyPlanId?: string; taskId?: string; nodeId?: string }", + "optional": true, + "defaultValue": "{}" + } + ], + "isEntry": true, + "loc": 8 + }, + { + "id": "func:server.ts#getZonedDateParts@261", + "kind": "function", + "name": "getZonedDateParts", + "qualifiedName": "getZonedDateParts", + "location": { + "file": "server.ts", + "startLine": 261, + "endLine": 278, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getZonedDateParts(date, timeZone)", + "params": [ + { + "name": "date", + "optional": true, + "defaultValue": "new Date()" + }, + { + "name": "timeZone", + "optional": true, + "defaultValue": "DUE_REMINDER_TIME_ZONE" + } + ], + "isEntry": true, + "loc": 18 + }, + { + "id": "func:server.ts#value@271", + "kind": "function", + "name": "value", + "qualifiedName": "value", + "location": { + "file": "server.ts", + "startLine": 271, + "endLine": 271, + "startCol": 9, + "endCol": 88 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "value(type: string)", + "params": [ + { + "name": "type", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 1 + }, + { + "id": "func:server.ts#getPersonNamesForDueNodeReminder@280", + "kind": "function", + "name": "getPersonNamesForDueNodeReminder", + "qualifiedName": "getPersonNamesForDueNodeReminder", + "location": { + "file": "server.ts", + "startLine": 280, + "endLine": 288, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getPersonNamesForDueNodeReminder(node: Task[\"nodes\"][number])", + "params": [ + { + "name": "node", + "typeRef": "Task[\"nodes\"][number]", + "optional": false + } + ], + "isEntry": true, + "loc": 9 + }, + { + "id": "func:server.ts#getDueTimeRanges@290", + "kind": "function", + "name": "getDueTimeRanges", + "qualifiedName": "getDueTimeRanges", + "location": { + "file": "server.ts", + "startLine": 290, + "endLine": 296, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getDueTimeRanges(node: Task[\"nodes\"][number], date: string)", + "params": [ + { + "name": "node", + "typeRef": "Task[\"nodes\"][number]", + "optional": false + }, + { + "name": "date", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 7 + }, + { + "id": "func:server.ts#sendDailyDueNodeReminder@298", + "kind": "function", + "name": "sendDailyDueNodeReminder", + "qualifiedName": "sendDailyDueNodeReminder", + "location": { + "file": "server.ts", + "startLine": 298, + "endLine": 361, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "sendDailyDueNodeReminder()", + "params": [], + "isEntry": true, + "loc": 64 + }, + { + "id": "func:server.ts#notifyTaskConfirmedCompleted@363", + "kind": "function", + "name": "notifyTaskConfirmedCompleted", + "qualifiedName": "notifyTaskConfirmedCompleted", + "location": { + "file": "server.ts", + "startLine": 363, + "endLine": 415, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "notifyTaskConfirmedCompleted(task: Task, operatorName: string)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + }, + { + "name": "operatorName", + "typeRef": "string", + "optional": true + } + ], + "isEntry": true, + "loc": 53 + }, + { + "id": "func:server.ts#ensureSsoConfigured@417", + "kind": "function", + "name": "ensureSsoConfigured", + "qualifiedName": "ensureSsoConfigured", + "location": { + "file": "server.ts", + "startLine": 417, + "endLine": 421, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "ensureSsoConfigured()", + "params": [], + "isEntry": true, + "loc": 5 + }, + { + "id": "func:server.ts#getSsoRedirectUri@423", + "kind": "function", + "name": "getSsoRedirectUri", + "qualifiedName": "getSsoRedirectUri", + "location": { + "file": "server.ts", + "startLine": 423, + "endLine": 430, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getSsoRedirectUri()", + "params": [], + "isEntry": true, + "loc": 8 + }, + { + "id": "func:server.ts#getSsoAuthUrl@432", + "kind": "function", + "name": "getSsoAuthUrl", + "qualifiedName": "getSsoAuthUrl", + "location": { + "file": "server.ts", + "startLine": 432, + "endLine": 442, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getSsoAuthUrl(state: string)", + "params": [ + { + "name": "state", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 11 + }, + { + "id": "func:server.ts#getSsoUserAccessToken@444", + "kind": "function", + "name": "getSsoUserAccessToken", + "qualifiedName": "getSsoUserAccessToken", + "location": { + "file": "server.ts", + "startLine": 444, + "endLine": 469, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getSsoUserAccessToken(authCode: string)", + "params": [ + { + "name": "authCode", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 26, + "interactions": [ + { + "id": "ix:func:server.ts#getSsoUserAccessToken@444:api:out:POST:`${OIDC_HOST}/oauth/token`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "`${OIDC_HOST}/oauth/token`" + } + ] + }, + { + "id": "func:server.ts#getSsoCurrentUser@471", + "kind": "function", + "name": "getSsoCurrentUser", + "qualifiedName": "getSsoCurrentUser", + "location": { + "file": "server.ts", + "startLine": 471, + "endLine": 496, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getSsoCurrentUser(accessToken: string)", + "params": [ + { + "name": "accessToken", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 26, + "interactions": [ + { + "id": "ix:func:server.ts#getSsoCurrentUser@471:api:out:GET:`${OIDC_HOST}/oauth/userinfo`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "`${OIDC_HOST}/oauth/userinfo`" + } + ] + }, + { + "id": "func:server.ts#GET /api/auth/sso-config@498", + "kind": "function", + "name": "GET /api/auth/sso-config", + "qualifiedName": "GET /api/auth/sso-config", + "location": { + "file": "server.ts", + "startLine": 498, + "endLine": 506, + "startCol": 33, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/auth/sso-config(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/auth/sso-config@498:api:in:GET:/api/auth/sso-config", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/auth/sso-config" + } + ] + }, + { + "id": "func:server.ts#GET /api/auth/sso-login-url@508", + "kind": "function", + "name": "GET /api/auth/sso-login-url", + "qualifiedName": "GET /api/auth/sso-login-url", + "location": { + "file": "server.ts", + "startLine": 508, + "endLine": 518, + "startCol": 36, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/auth/sso-login-url(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 11, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/auth/sso-login-url@508:api:in:GET:/api/auth/sso-login-url", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/auth/sso-login-url" + } + ] + }, + { + "id": "func:server.ts#handleSsoCallback@520", + "kind": "function", + "name": "handleSsoCallback", + "qualifiedName": "handleSsoCallback", + "location": { + "file": "server.ts", + "startLine": 520, + "endLine": 554, + "startCol": 7, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "handleSsoCallback(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 35, + "interactions": [ + { + "id": "ix:func:server.ts#handleSsoCallback@520:api:in:GET:/api/dingtalk/oauth-callback", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/dingtalk/oauth-callback" + }, + { + "id": "ix:func:server.ts#handleSsoCallback@520:api:in:GET:/api/auth/sso-callback", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/auth/sso-callback" + } + ] + }, + { + "id": "func:server.ts#GET /api/auth/manual-users@559", + "kind": "function", + "name": "GET /api/auth/manual-users", + "qualifiedName": "GET /api/auth/manual-users", + "location": { + "file": "server.ts", + "startLine": 559, + "endLine": 561, + "startCol": 35, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/auth/manual-users(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 3, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/auth/manual-users@559:api:in:GET:/api/auth/manual-users", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/auth/manual-users" + } + ] + }, + { + "id": "func:server.ts#POST /api/auth/manual-login@563", + "kind": "function", + "name": "POST /api/auth/manual-login", + "qualifiedName": "POST /api/auth/manual-login", + "location": { + "file": "server.ts", + "startLine": 563, + "endLine": 573, + "startCol": 36, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/auth/manual-login(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 11, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/auth/manual-login@563:api:in:POST:/api/auth/manual-login", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/manual-login" + } + ] + }, + { + "id": "func:server.ts#POST /api/auth/dev-login@575", + "kind": "function", + "name": "POST /api/auth/dev-login", + "qualifiedName": "POST /api/auth/dev-login", + "location": { + "file": "server.ts", + "startLine": 575, + "endLine": 603, + "startCol": 33, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/auth/dev-login(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 29, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/auth/dev-login@575:api:in:POST:/api/auth/dev-login", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/dev-login" + } + ] + }, + { + "id": "func:server.ts#POST /api/auth/sso-login@605", + "kind": "function", + "name": "POST /api/auth/sso-login", + "qualifiedName": "POST /api/auth/sso-login", + "location": { + "file": "server.ts", + "startLine": 605, + "endLine": 640, + "startCol": 33, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/auth/sso-login(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 36, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/auth/sso-login@605:api:in:POST:/api/auth/sso-login", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/sso-login" + } + ] + }, + { + "id": "func:server.ts#POST /api/auth/sso-join-person@642", + "kind": "function", + "name": "POST /api/auth/sso-join-person", + "qualifiedName": "POST /api/auth/sso-join-person", + "location": { + "file": "server.ts", + "startLine": 642, + "endLine": 667, + "startCol": 39, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/auth/sso-join-person(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 26, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/auth/sso-join-person@642:api:in:POST:/api/auth/sso-join-person", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/sso-join-person" + } + ] + }, + { + "id": "func:server.ts#GET /api/people@669", + "kind": "function", + "name": "GET /api/people", + "qualifiedName": "GET /api/people", + "location": { + "file": "server.ts", + "startLine": 669, + "endLine": 676, + "startCol": 24, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/people(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/people@669:api:in:GET:/api/people", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/people" + } + ] + }, + { + "id": "func:server.ts#POST /api/people@678", + "kind": "function", + "name": "POST /api/people", + "qualifiedName": "POST /api/people", + "location": { + "file": "server.ts", + "startLine": 678, + "endLine": 685, + "startCol": 25, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/people(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/people@678:api:in:POST:/api/people", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/people" + } + ] + }, + { + "id": "func:server.ts#PUT /api/people/:id@687", + "kind": "function", + "name": "PUT /api/people/:id", + "qualifiedName": "PUT /api/people/:id", + "location": { + "file": "server.ts", + "startLine": 687, + "endLine": 694, + "startCol": 28, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "PUT /api/people/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#PUT /api/people/:id@687:api:in:PUT:/api/people/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "/api/people/:id" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/people/:id@696", + "kind": "function", + "name": "DELETE /api/people/:id", + "qualifiedName": "DELETE /api/people/:id", + "location": { + "file": "server.ts", + "startLine": 696, + "endLine": 703, + "startCol": 31, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/people/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/people/:id@696:api:in:DELETE:/api/people/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/people/:id" + } + ] + }, + { + "id": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "kind": "function", + "name": "POST /api/dingtalk/robot/send-message", + "qualifiedName": "POST /api/dingtalk/robot/send-message", + "location": { + "file": "server.ts", + "startLine": 705, + "endLine": 735, + "startCol": 46, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/dingtalk/robot/send-message(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 31, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/dingtalk/robot/send-message@705:api:in:POST:/api/dingtalk/robot/send-message", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/dingtalk/robot/send-message" + } + ] + }, + { + "id": "func:server.ts#GET /api/tags@737", + "kind": "function", + "name": "GET /api/tags", + "qualifiedName": "GET /api/tags", + "location": { + "file": "server.ts", + "startLine": 737, + "endLine": 743, + "startCol": 22, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/tags(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/tags@737:api:in:GET:/api/tags", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/tags" + } + ] + }, + { + "id": "func:server.ts#POST /api/tags@745", + "kind": "function", + "name": "POST /api/tags", + "qualifiedName": "POST /api/tags", + "location": { + "file": "server.ts", + "startLine": 745, + "endLine": 752, + "startCol": 23, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/tags(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/tags@745:api:in:POST:/api/tags", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tags" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/tags/:id@754", + "kind": "function", + "name": "DELETE /api/tags/:id", + "qualifiedName": "DELETE /api/tags/:id", + "location": { + "file": "server.ts", + "startLine": 754, + "endLine": 762, + "startCol": 29, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/tags/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/tags/:id@754:api:in:DELETE:/api/tags/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/tags/:id" + } + ] + }, + { + "id": "func:server.ts#GET /api/weekly-plans@764", + "kind": "function", + "name": "GET /api/weekly-plans", + "qualifiedName": "GET /api/weekly-plans", + "location": { + "file": "server.ts", + "startLine": 764, + "endLine": 770, + "startCol": 30, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/weekly-plans(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/weekly-plans@764:api:in:GET:/api/weekly-plans", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/weekly-plans" + } + ] + }, + { + "id": "func:server.ts#POST /api/weekly-plans@772", + "kind": "function", + "name": "POST /api/weekly-plans", + "qualifiedName": "POST /api/weekly-plans", + "location": { + "file": "server.ts", + "startLine": 772, + "endLine": 779, + "startCol": 31, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/weekly-plans(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/weekly-plans@772:api:in:POST:/api/weekly-plans", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/weekly-plans" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/weekly-plans/:id@781", + "kind": "function", + "name": "DELETE /api/weekly-plans/:id", + "qualifiedName": "DELETE /api/weekly-plans/:id", + "location": { + "file": "server.ts", + "startLine": 781, + "endLine": 789, + "startCol": 37, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/weekly-plans/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/weekly-plans/:id@781:api:in:DELETE:/api/weekly-plans/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/weekly-plans/:id" + } + ] + }, + { + "id": "func:server.ts#GET /api/project-templates@791", + "kind": "function", + "name": "GET /api/project-templates", + "qualifiedName": "GET /api/project-templates", + "location": { + "file": "server.ts", + "startLine": 791, + "endLine": 797, + "startCol": 35, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/project-templates(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/project-templates@791:api:in:GET:/api/project-templates", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/project-templates" + } + ] + }, + { + "id": "func:server.ts#POST /api/project-templates@799", + "kind": "function", + "name": "POST /api/project-templates", + "qualifiedName": "POST /api/project-templates", + "location": { + "file": "server.ts", + "startLine": 799, + "endLine": 806, + "startCol": 36, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/project-templates(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/project-templates@799:api:in:POST:/api/project-templates", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/project-templates" + } + ] + }, + { + "id": "func:server.ts#PUT /api/project-templates/:id@808", + "kind": "function", + "name": "PUT /api/project-templates/:id", + "qualifiedName": "PUT /api/project-templates/:id", + "location": { + "file": "server.ts", + "startLine": 808, + "endLine": 815, + "startCol": 39, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "PUT /api/project-templates/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#PUT /api/project-templates/:id@808:api:in:PUT:/api/project-templates/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "/api/project-templates/:id" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/project-templates/:id@817", + "kind": "function", + "name": "DELETE /api/project-templates/:id", + "qualifiedName": "DELETE /api/project-templates/:id", + "location": { + "file": "server.ts", + "startLine": 817, + "endLine": 824, + "startCol": 42, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/project-templates/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/project-templates/:id@817:api:in:DELETE:/api/project-templates/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/project-templates/:id" + } + ] + }, + { + "id": "func:server.ts#GET /api/tasks@826", + "kind": "function", + "name": "GET /api/tasks", + "qualifiedName": "GET /api/tasks", + "location": { + "file": "server.ts", + "startLine": 826, + "endLine": 832, + "startCol": 23, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/tasks(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/tasks@826:api:in:GET:/api/tasks", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/tasks" + } + ] + }, + { + "id": "func:server.ts#GET /api/tasks/:id@834", + "kind": "function", + "name": "GET /api/tasks/:id", + "qualifiedName": "GET /api/tasks/:id", + "location": { + "file": "server.ts", + "startLine": 834, + "endLine": 841, + "startCol": 27, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/tasks/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/tasks/:id@834:api:in:GET:/api/tasks/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/tasks/:id" + } + ] + }, + { + "id": "func:server.ts#POST /api/tasks@843", + "kind": "function", + "name": "POST /api/tasks", + "qualifiedName": "POST /api/tasks", + "location": { + "file": "server.ts", + "startLine": 843, + "endLine": 850, + "startCol": 24, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/tasks(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/tasks@843:api:in:POST:/api/tasks", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tasks" + } + ] + }, + { + "id": "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "kind": "function", + "name": "PATCH /api/tasks/:id/list-state", + "qualifiedName": "PATCH /api/tasks/:id/list-state", + "location": { + "file": "server.ts", + "startLine": 852, + "endLine": 863, + "startCol": 40, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "PATCH /api/tasks/:id/list-state(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 12, + "interactions": [ + { + "id": "ix:func:server.ts#PATCH /api/tasks/:id/list-state@852:api:in:PATCH:/api/tasks/:id/list-state", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "PATCH", + "path": "/api/tasks/:id/list-state" + } + ] + }, + { + "id": "func:server.ts#PUT /api/tasks/:id@865", + "kind": "function", + "name": "PUT /api/tasks/:id", + "qualifiedName": "PUT /api/tasks/:id", + "location": { + "file": "server.ts", + "startLine": 865, + "endLine": 884, + "startCol": 27, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "PUT /api/tasks/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 20, + "interactions": [ + { + "id": "ix:func:server.ts#PUT /api/tasks/:id@865:api:in:PUT:/api/tasks/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "/api/tasks/:id" + } + ] + }, + { + "id": "func:server.ts#catch() 回调@876@876", + "kind": "function", + "name": "catch() 回调@876", + "qualifiedName": "catch() 回调@876", + "location": { + "file": "server.ts", + "startLine": 876, + "endLine": 878, + "startCol": 65, + "endCol": 8 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "catch() 回调@876(err)", + "params": [ + { + "name": "err", + "optional": false + } + ], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#DELETE /api/tasks/:id@886", + "kind": "function", + "name": "DELETE /api/tasks/:id", + "qualifiedName": "DELETE /api/tasks/:id", + "location": { + "file": "server.ts", + "startLine": 886, + "endLine": 893, + "startCol": 30, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/tasks/:id(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/tasks/:id@886:api:in:DELETE:/api/tasks/:id", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/tasks/:id" + } + ] + }, + { + "id": "func:server.ts#POST /api/tasks/:id/nodes@895", + "kind": "function", + "name": "POST /api/tasks/:id/nodes", + "qualifiedName": "POST /api/tasks/:id/nodes", + "location": { + "file": "server.ts", + "startLine": 895, + "endLine": 903, + "startCol": 34, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/tasks/:id/nodes(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/tasks/:id/nodes@895:api:in:POST:/api/tasks/:id/nodes", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tasks/:id/nodes" + } + ] + }, + { + "id": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "kind": "function", + "name": "PATCH /api/tasks/:id/nodes/:nodeId", + "qualifiedName": "PATCH /api/tasks/:id/nodes/:nodeId", + "location": { + "file": "server.ts", + "startLine": 905, + "endLine": 913, + "startCol": 43, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "PATCH /api/tasks/:id/nodes/:nodeId(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:api:in:PATCH:/api/tasks/:id/nodes/:nodeId", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "PATCH", + "path": "/api/tasks/:id/nodes/:nodeId" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "kind": "function", + "name": "DELETE /api/tasks/:id/nodes/:nodeId", + "qualifiedName": "DELETE /api/tasks/:id/nodes/:nodeId", + "location": { + "file": "server.ts", + "startLine": 915, + "endLine": 923, + "startCol": 44, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/tasks/:id/nodes/:nodeId(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:api:in:DELETE:/api/tasks/:id/nodes/:nodeId", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/tasks/:id/nodes/:nodeId" + } + ] + }, + { + "id": "func:server.ts#POST /api/tasks/:id/dependencies@925", + "kind": "function", + "name": "POST /api/tasks/:id/dependencies", + "qualifiedName": "POST /api/tasks/:id/dependencies", + "location": { + "file": "server.ts", + "startLine": 925, + "endLine": 932, + "startCol": 41, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/tasks/:id/dependencies(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/tasks/:id/dependencies@925:api:in:POST:/api/tasks/:id/dependencies", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tasks/:id/dependencies" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "kind": "function", + "name": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId", + "qualifiedName": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId", + "location": { + "file": "server.ts", + "startLine": 934, + "endLine": 942, + "startCol": 70, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 9, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:api:in:DELETE:/api/tasks/:id/dependencies/:parentNodeId/:childNodeId", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/tasks/:id/dependencies/:parentNodeId/:childNodeId" + } + ] + }, + { + "id": "func:server.ts#POST /api/notify@944", + "kind": "function", + "name": "POST /api/notify", + "qualifiedName": "POST /api/notify", + "location": { + "file": "server.ts", + "startLine": 944, + "endLine": 1039, + "startCol": 25, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "POST /api/notify(req, res)", + "params": [ + { + "name": "req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 96, + "interactions": [ + { + "id": "ix:func:server.ts#POST /api/notify@944:api:in:POST:/api/notify", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/notify" + }, + { + "id": "ix:func:server.ts#POST /api/notify@944:api:out:POST:", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST" + } + ] + }, + { + "id": "func:server.ts#GET /api/logs@1041", + "kind": "function", + "name": "GET /api/logs", + "qualifiedName": "GET /api/logs", + "location": { + "file": "server.ts", + "startLine": 1041, + "endLine": 1047, + "startCol": 22, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET /api/logs(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 7, + "interactions": [ + { + "id": "ix:func:server.ts#GET /api/logs@1041:api:in:GET:/api/logs", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/logs" + } + ] + }, + { + "id": "func:server.ts#DELETE /api/logs@1049", + "kind": "function", + "name": "DELETE /api/logs", + "qualifiedName": "DELETE /api/logs", + "location": { + "file": "server.ts", + "startLine": 1049, + "endLine": 1056, + "startCol": 25, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "DELETE /api/logs(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 8, + "interactions": [ + { + "id": "ix:func:server.ts#DELETE /api/logs@1049:api:in:DELETE:/api/logs", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "/api/logs" + } + ] + }, + { + "id": "func:server.ts#normalizeActionType@1058", + "kind": "function", + "name": "normalizeActionType", + "qualifiedName": "normalizeActionType", + "location": { + "file": "server.ts", + "startLine": 1058, + "endLine": 1063, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "normalizeActionType(actionType: string): \"completed\" | \"delayed\" | \"test\"", + "params": [ + { + "name": "actionType", + "typeRef": "string", + "optional": false + } + ], + "returnType": "\"completed\" | \"delayed\" | \"test\"", + "isEntry": true, + "loc": 6 + }, + { + "id": "func:server.ts#getNotificationState@1065", + "kind": "function", + "name": "getNotificationState", + "qualifiedName": "getNotificationState", + "location": { + "file": "server.ts", + "startLine": 1065, + "endLine": 1084, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "getNotificationState(actionType: \"completed\" | \"delayed\" | \"test\")", + "params": [ + { + "name": "actionType", + "typeRef": "\"completed\" | \"delayed\" | \"test\"", + "optional": false + } + ], + "isEntry": true, + "loc": 20 + }, + { + "id": "func:server.ts#startDailyDueNodeReminderScheduler@1089", + "kind": "function", + "name": "startDailyDueNodeReminderScheduler", + "qualifiedName": "startDailyDueNodeReminderScheduler", + "location": { + "file": "server.ts", + "startLine": 1089, + "endLine": 1111, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "startDailyDueNodeReminderScheduler()", + "params": [], + "isEntry": true, + "loc": 23 + }, + { + "id": "func:server.ts#checkAndRun@1090", + "kind": "function", + "name": "checkAndRun", + "qualifiedName": "checkAndRun", + "location": { + "file": "server.ts", + "startLine": 1090, + "endLine": 1104, + "startCol": 9, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "checkAndRun()", + "params": [], + "isEntry": true, + "loc": 15 + }, + { + "id": "func:server.ts#catch() 回调@1098@1098", + "kind": "function", + "name": "catch() 回调@1098", + "qualifiedName": "catch() 回调@1098", + "location": { + "file": "server.ts", + "startLine": 1098, + "endLine": 1100, + "startCol": 14, + "endCol": 8 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "catch() 回调@1098(err)", + "params": [ + { + "name": "err", + "optional": false + } + ], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#handleDingTalkRobotMessage@1114", + "kind": "function", + "name": "handleDingTalkRobotMessage", + "qualifiedName": "handleDingTalkRobotMessage", + "location": { + "file": "server.ts", + "startLine": 1114, + "endLine": 1197, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "handleDingTalkRobotMessage(rawData: string)", + "params": [ + { + "name": "rawData", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 84 + }, + { + "id": "func:server.ts#replyText@1147", + "kind": "function", + "name": "replyText", + "qualifiedName": "replyText", + "location": { + "file": "server.ts", + "startLine": 1147, + "endLine": 1150, + "startCol": 9, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "replyText(text: string)", + "params": [ + { + "name": "text", + "typeRef": "string", + "optional": false + } + ], + "isEntry": true, + "loc": 4 + }, + { + "id": "func:server.ts#startDingTalkRobotStream@1204", + "kind": "function", + "name": "startDingTalkRobotStream", + "qualifiedName": "startDingTalkRobotStream", + "location": { + "file": "server.ts", + "startLine": 1204, + "endLine": 1233, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "startDingTalkRobotStream()", + "params": [], + "isEntry": true, + "loc": 30 + }, + { + "id": "func:server.ts#registerCallbackListener() 回调@1215@1215", + "kind": "function", + "name": "registerCallbackListener() 回调@1215", + "qualifiedName": "registerCallbackListener() 回调@1215", + "location": { + "file": "server.ts", + "startLine": 1215, + "endLine": 1221, + "startCol": 48, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "registerCallbackListener() 回调@1215(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "isEntry": true, + "loc": 7 + }, + { + "id": "func:server.ts#catch() 回调@1218@1218", + "kind": "function", + "name": "catch() 回调@1218", + "qualifiedName": "catch() 回调@1218", + "location": { + "file": "server.ts", + "startLine": 1218, + "endLine": 1220, + "startCol": 50, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "catch() 回调@1218(err)", + "params": [ + { + "name": "err", + "optional": false + } + ], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#then() 回调@1225@1225", + "kind": "function", + "name": "then() 回调@1225", + "qualifiedName": "then() 回调@1225", + "location": { + "file": "server.ts", + "startLine": 1225, + "endLine": 1227, + "startCol": 11, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "then() 回调@1225()", + "params": [], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#catch() 回调@1228@1228", + "kind": "function", + "name": "catch() 回调@1228", + "qualifiedName": "catch() 回调@1228", + "location": { + "file": "server.ts", + "startLine": 1228, + "endLine": 1230, + "startCol": 12, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "catch() 回调@1228(err)", + "params": [ + { + "name": "err", + "optional": false + } + ], + "isEntry": true, + "loc": 3 + }, + { + "id": "func:server.ts#startServer@1235", + "kind": "function", + "name": "startServer", + "qualifiedName": "startServer", + "location": { + "file": "server.ts", + "startLine": 1235, + "endLine": 1255, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "startServer()", + "params": [], + "isEntry": true, + "loc": 21 + }, + { + "id": "func:server.ts#GET *@1245", + "kind": "function", + "name": "GET *", + "qualifiedName": "GET *", + "location": { + "file": "server.ts", + "startLine": 1245, + "endLine": 1247, + "startCol": 18, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "GET *(_req, res)", + "params": [ + { + "name": "_req", + "optional": false + }, + { + "name": "res", + "optional": false + } + ], + "isEntry": true, + "loc": 3, + "interactions": [ + { + "id": "ix:func:server.ts#GET *@1245:api:in:GET:*", + "kind": "api", + "direction": "in", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "*" + } + ] + }, + { + "id": "func:server.ts#listen() 回调@1250@1250", + "kind": "function", + "name": "listen() 回调@1250", + "qualifiedName": "listen() 回调@1250", + "location": { + "file": "server.ts", + "startLine": 1250, + "endLine": 1254, + "startCol": 26, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "listen() 回调@1250()", + "params": [], + "isEntry": true, + "loc": 5 + }, + { + "id": "func:server.ts#catch() 回调@1257@1257", + "kind": "function", + "name": "catch() 回调@1257", + "qualifiedName": "catch() 回调@1257", + "location": { + "file": "server.ts", + "startLine": 1257, + "endLine": 1260, + "startCol": 21, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "signature": "catch() 回调@1257(err)", + "params": [ + { + "name": "err", + "optional": false + } + ], + "isEntry": true, + "loc": 4 + }, + { + "id": "func:src/utils/date.ts#getLocalDateString@1", + "kind": "function", + "name": "getLocalDateString", + "qualifiedName": "getLocalDateString", + "location": { + "file": "src/utils/date.ts", + "startLine": 1, + "endLine": 7, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/date.ts", + "moduleId": "module:src/utils", + "signature": "getLocalDateString(date)", + "params": [ + { + "name": "date", + "optional": true, + "defaultValue": "new Date()" + } + ], + "loc": 7 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "kind": "function", + "name": "createNodeTimeRange", + "qualifiedName": "createNodeTimeRange", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 3, + "endLine": 9, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "createNodeTimeRange(startDate: string, endDate): NodeTimeRange", + "params": [ + { + "name": "startDate", + "typeRef": "string", + "optional": false + }, + { + "name": "endDate", + "optional": true, + "defaultValue": "startDate" + } + ], + "returnType": "NodeTimeRange", + "loc": 7 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "kind": "function", + "name": "addDaysToDateString", + "qualifiedName": "addDaysToDateString", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 11, + "endLine": 15, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "addDaysToDateString(value: string, days: number)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + }, + { + "name": "days", + "typeRef": "number", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "kind": "function", + "name": "normalizeNodeTimeRanges", + "qualifiedName": "normalizeNodeTimeRanges", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 17, + "endLine": 44, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "normalizeNodeTimeRanges(ranges: Partial[] | undefined, fallbackStartDate: string, fallbackEndDate): NodeTimeRange[]", + "params": [ + { + "name": "ranges", + "typeRef": "Partial[] | undefined", + "optional": false + }, + { + "name": "fallbackStartDate", + "typeRef": "string", + "optional": false + }, + { + "name": "fallbackEndDate", + "optional": true, + "defaultValue": "fallbackStartDate" + } + ], + "returnType": "NodeTimeRange[]", + "loc": 28 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "kind": "function", + "name": "constrainNodeTimeRanges", + "qualifiedName": "constrainNodeTimeRanges", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 46, + "endLine": 73, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "constrainNodeTimeRanges(ranges: Partial[] | undefined, fallbackStartDate: string, fallbackEndDate, forcedFirstStartDate: string): NodeTimeRange[]", + "params": [ + { + "name": "ranges", + "typeRef": "Partial[] | undefined", + "optional": false + }, + { + "name": "fallbackStartDate", + "typeRef": "string", + "optional": false + }, + { + "name": "fallbackEndDate", + "optional": true, + "defaultValue": "fallbackStartDate" + }, + { + "name": "forcedFirstStartDate", + "typeRef": "string", + "optional": true + } + ], + "returnType": "NodeTimeRange[]", + "loc": 28 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#reduce() 回调@53@53", + "kind": "function", + "name": "reduce() 回调@53", + "qualifiedName": "reduce() 回调@53", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 53, + "endLine": 70, + "startCol": 5, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "reduce() 回调@53(constrainedRanges, range, index)", + "params": [ + { + "name": "constrainedRanges", + "optional": false + }, + { + "name": "range", + "optional": false + }, + { + "name": "index", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "function", + "name": "getNodeTimeRanges", + "qualifiedName": "getNodeTimeRanges", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 75, + "endLine": 77, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "getNodeTimeRanges(node: Pick): NodeTimeRange[]", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "returnType": "NodeTimeRange[]", + "loc": 3 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "function", + "name": "getNodeStartDate", + "qualifiedName": "getNodeStartDate", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 79, + "endLine": 84, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "getNodeStartDate(node: Pick)", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "function", + "name": "getNodeEndDate", + "qualifiedName": "getNodeEndDate", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 86, + "endLine": 91, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "getNodeEndDate(node: Pick)", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "kind": "function", + "name": "formatNodeTimeRanges", + "qualifiedName": "formatNodeTimeRanges", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 93, + "endLine": 97, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "formatNodeTimeRanges(node: Pick)", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "kind": "function", + "name": "constrainWorkflowNodesTimeRanges", + "qualifiedName": "constrainWorkflowNodesTimeRanges", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 99, + "endLine": 147, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "constrainWorkflowNodesTimeRanges(nodes: WorkflowNode[])", + "params": [ + { + "name": "nodes", + "typeRef": "WorkflowNode[]", + "optional": false + } + ], + "loc": 49 + }, + { + "id": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "kind": "function", + "name": "map() 回调@107", + "qualifiedName": "map() 回调@107", + "location": { + "file": "src/utils/nodeTimeRanges.ts", + "startLine": 107, + "endLine": 141, + "startCol": 31, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/nodeTimeRanges.ts", + "moduleId": "module:src/utils", + "signature": "map() 回调@107(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 35 + }, + { + "id": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "function", + "name": "getTaskDisplayStatus", + "qualifiedName": "getTaskDisplayStatus", + "location": { + "file": "src/utils/taskStatus.ts", + "startLine": 7, + "endLine": 48, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/taskStatus.ts", + "moduleId": "module:src/utils", + "signature": "getTaskDisplayStatus(task: Pick): TaskDisplayStatus", + "params": [ + { + "name": "task", + "typeRef": "Pick", + "optional": false + } + ], + "returnType": "TaskDisplayStatus", + "loc": 42 + }, + { + "id": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "function", + "name": "getTaskStatusMeta", + "qualifiedName": "getTaskStatusMeta", + "location": { + "file": "src/utils/taskStatus.ts", + "startLine": 50, + "endLine": 93, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/taskStatus.ts", + "moduleId": "module:src/utils", + "signature": "getTaskStatusMeta(status: TaskDisplayStatus)", + "params": [ + { + "name": "status", + "typeRef": "TaskDisplayStatus", + "optional": false + } + ], + "loc": 44 + }, + { + "id": "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "kind": "function", + "name": "normalizeTaskPriority", + "qualifiedName": "normalizeTaskPriority", + "location": { + "file": "src/utils/taskPriority.ts", + "startLine": 7, + "endLine": 9, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/taskPriority.ts", + "moduleId": "module:src/utils", + "signature": "normalizeTaskPriority(value: unknown): TaskPriority", + "params": [ + { + "name": "value", + "typeRef": "unknown", + "optional": false + } + ], + "returnType": "TaskPriority", + "loc": 3 + }, + { + "id": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "function", + "name": "getTaskPriorityMeta", + "qualifiedName": "getTaskPriorityMeta", + "location": { + "file": "src/utils/taskPriority.ts", + "startLine": 11, + "endLine": 35, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/taskPriority.ts", + "moduleId": "module:src/utils", + "signature": "getTaskPriorityMeta(priority: TaskPriority)", + "params": [ + { + "name": "priority", + "typeRef": "TaskPriority", + "optional": false + } + ], + "loc": 25 + }, + { + "id": "func:src/components/TaskList.tsx#TaskList@47", + "kind": "function", + "name": "TaskList", + "qualifiedName": "TaskList", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 47, + "endLine": 513, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "TaskList({\n tasks,\n projectTemplates,\n selectedTaskId,\n isCreatingProject,\n selectedTemplateId,\n canManageTasks,\n canReorderTasks,\n onSelectTask,\n onQuickRequirement,\n onStartCreateTask,\n onCancelCreateTask,\n onSelectTemplate,\n onDeleteTask,\n onToggleTaskPinned,\n onReorderTask,\n}: TaskListProps)", + "params": [ + { + "name": "{\n tasks,\n projectTemplates,\n selectedTaskId,\n isCreatingProject,\n selectedTemplateId,\n canManageTasks,\n canReorderTasks,\n onSelectTask,\n onQuickRequirement,\n onStartCreateTask,\n onCancelCreateTask,\n onSelectTemplate,\n onDeleteTask,\n onToggleTaskPinned,\n onReorderTask,\n}", + "typeRef": "TaskListProps", + "optional": false + } + ], + "loc": 467 + }, + { + "id": "func:src/components/TaskList.tsx#reduce() 回调@77@77", + "kind": "function", + "name": "reduce() 回调@77", + "qualifiedName": "reduce() 回调@77", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 77, + "endLine": 81, + "startCol": 5, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "reduce() 回调@77(counts, task)", + "params": [ + { + "name": "counts", + "optional": false + }, + { + "name": "task", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskList.tsx#toggleSelectedTag@91", + "kind": "function", + "name": "toggleSelectedTag", + "qualifiedName": "toggleSelectedTag", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 91, + "endLine": 95, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "toggleSelectedTag(tag: string)", + "params": [ + { + "name": "tag", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskList.tsx#toggleSelectedStatus@97", + "kind": "function", + "name": "toggleSelectedStatus", + "qualifiedName": "toggleSelectedStatus", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 97, + "endLine": 101, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "toggleSelectedStatus(status: TaskDisplayStatus)", + "params": [ + { + "name": "status", + "typeRef": "TaskDisplayStatus", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskList.tsx#toggleSelectedPriority@103", + "kind": "function", + "name": "toggleSelectedPriority", + "qualifiedName": "toggleSelectedPriority", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 103, + "endLine": 107, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "toggleSelectedPriority(priority: TaskPriority)", + "params": [ + { + "name": "priority", + "typeRef": "TaskPriority", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskList.tsx#filter() 回调@110@110", + "kind": "function", + "name": "filter() 回调@110", + "qualifiedName": "filter() 回调@110", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 110, + "endLine": 127, + "startCol": 38, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "filter() 回调@110(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "kind": "function", + "name": "getDropBeforeTaskId", + "qualifiedName": "getDropBeforeTaskId", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 129, + "endLine": 145, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "getDropBeforeTaskId(event: React.DragEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.DragEvent", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/TaskList.tsx#find() 回调@139@139", + "kind": "function", + "name": "find() 回调@139", + "qualifiedName": "find() 回调@139", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 139, + "endLine": 142, + "startCol": 39, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "find() 回调@139(element)", + "params": [ + { + "name": "element", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/TaskList.tsx#clearQueueDropState@147", + "kind": "function", + "name": "clearQueueDropState", + "qualifiedName": "clearQueueDropState", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 147, + "endLine": 150, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "clearQueueDropState()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/TaskList.tsx#map() 回调@202@202", + "kind": "function", + "name": "map() 回调@202", + "qualifiedName": "map() 回调@202", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 202, + "endLine": 219, + "startCol": 34, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@202(template)", + "params": [ + { + "name": "template", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/TaskList.tsx#map() 回调@265@265", + "kind": "function", + "name": "map() 回调@265", + "qualifiedName": "map() 回调@265", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 265, + "endLine": 282, + "startCol": 36, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@265(status)", + "params": [ + { + "name": "status", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/TaskList.tsx#map() 回调@297@297", + "kind": "function", + "name": "map() 回调@297", + "qualifiedName": "map() 回调@297", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 297, + "endLine": 314, + "startCol": 32, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@297(priority)", + "params": [ + { + "name": "priority", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@353@353", + "kind": "function", + "name": "匿名函数@353", + "qualifiedName": "匿名函数@353", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 353, + "endLine": 365, + "startCol": 21, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@353(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 13 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@366@366", + "kind": "function", + "name": "匿名函数@366", + "qualifiedName": "匿名函数@366", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 366, + "endLine": 370, + "startCol": 22, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@366(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@371@371", + "kind": "function", + "name": "匿名函数@371", + "qualifiedName": "匿名函数@371", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 371, + "endLine": 380, + "startCol": 17, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@371(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/TaskList.tsx#map() 回调@387@387", + "kind": "function", + "name": "map() 回调@387", + "qualifiedName": "map() 回调@387", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 387, + "endLine": 503, + "startCol": 29, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@387(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 117 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@400@400", + "kind": "function", + "name": "匿名函数@400", + "qualifiedName": "匿名函数@400", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 400, + "endLine": 409, + "startCol": 32, + "endCol": 20 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@400(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@410@410", + "kind": "function", + "name": "匿名函数@410", + "qualifiedName": "匿名函数@410", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 410, + "endLine": 413, + "startCol": 30, + "endCol": 20 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@410()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@442@442", + "kind": "function", + "name": "匿名函数@442", + "qualifiedName": "匿名函数@442", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 442, + "endLine": 445, + "startCol": 34, + "endCol": 26 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@442(e)", + "params": [ + { + "name": "e", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/TaskList.tsx#匿名函数@458@458", + "kind": "function", + "name": "匿名函数@458", + "qualifiedName": "匿名函数@458", + "location": { + "file": "src/components/TaskList.tsx", + "startLine": 458, + "endLine": 463, + "startCol": 36, + "endCol": 28 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@458(e)", + "params": [ + { + "name": "e", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#addDays@20", + "kind": "function", + "name": "addDays", + "qualifiedName": "addDays", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 20, + "endLine": 24, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "addDays(value: string, days: number)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + }, + { + "name": "days", + "typeRef": "number", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", + "kind": "function", + "name": "WeeklyPlanList", + "qualifiedName": "WeeklyPlanList", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 26, + "endLine": 369, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "WeeklyPlanList({\n plans,\n tasks,\n selectedPlanId,\n canCreatePlans,\n canDeletePlans,\n onSelectPlan,\n onCreatePlan,\n onDeletePlan,\n onMoveTaskToPlan,\n}: WeeklyPlanListProps)", + "params": [ + { + "name": "{\n plans,\n tasks,\n selectedPlanId,\n canCreatePlans,\n canDeletePlans,\n onSelectPlan,\n onCreatePlan,\n onDeletePlan,\n onMoveTaskToPlan,\n}", + "typeRef": "WeeklyPlanListProps", + "optional": false + } + ], + "loc": 344 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#useEffect() 回调@48@48", + "kind": "function", + "name": "useEffect() 回调@48", + "qualifiedName": "useEffect() 回调@48", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 48, + "endLine": 52, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@48()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#forEach() 回调@56@56", + "kind": "function", + "name": "forEach() 回调@56", + "qualifiedName": "forEach() 回调@56", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 56, + "endLine": 61, + "startCol": 17, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@56(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62", + "kind": "function", + "name": "sort() 回调@62", + "qualifiedName": "sort() 回调@62", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 62, + "endLine": 68, + "startCol": 39, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "sort() 回调@62(a, b)", + "params": [ + { + "name": "a", + "optional": false + }, + { + "name": "b", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#resetForm@70", + "kind": "function", + "name": "resetForm", + "qualifiedName": "resetForm", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 70, + "endLine": 74, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "resetForm()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76", + "kind": "function", + "name": "handleCreatePlan", + "qualifiedName": "handleCreatePlan", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 76, + "endLine": 92, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "handleCreatePlan(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", + "kind": "function", + "name": "handleDeletePlan", + "qualifiedName": "handleDeletePlan", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 94, + "endLine": 100, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "handleDeletePlan(event: React.MouseEvent, plan: WeeklyPlan)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "plan", + "typeRef": "WeeklyPlan", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#confirmDeletePlan@102", + "kind": "function", + "name": "confirmDeletePlan", + "qualifiedName": "confirmDeletePlan", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 102, + "endLine": 114, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "confirmDeletePlan()", + "params": [], + "loc": 13 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@162@162", + "kind": "function", + "name": "匿名函数@162", + "qualifiedName": "匿名函数@162", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 162, + "endLine": 167, + "startCol": 25, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@162(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", + "kind": "function", + "name": "map() 回调@197", + "qualifiedName": "map() 回调@197", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 197, + "endLine": 304, + "startCol": 27, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@197(plan)", + "params": [ + { + "name": "plan", + "optional": false + } + ], + "loc": 108 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@209@209", + "kind": "function", + "name": "匿名函数@209", + "qualifiedName": "匿名函数@209", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 209, + "endLine": 212, + "startCol": 30, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@209(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@213@213", + "kind": "function", + "name": "匿名函数@213", + "qualifiedName": "匿名函数@213", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 213, + "endLine": 217, + "startCol": 29, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@213(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyPlanList.tsx#匿名函数@219@219", + "kind": "function", + "name": "匿名函数@219", + "qualifiedName": "匿名函数@219", + "location": { + "file": "src/components/WeeklyPlanList.tsx", + "startLine": 219, + "endLine": 226, + "startCol": 25, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyPlanList.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@219(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "kind": "function", + "name": "WorkflowCanvas", + "qualifiedName": "WorkflowCanvas", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 26, + "endLine": 1124, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "WorkflowCanvas({\n task,\n people,\n selectedNodeId,\n viewport,\n onViewportChange,\n onSelectNode,\n onFocusNode,\n onUpdateNodes,\n projectTemplates = [],\n readOnly = false\n}: WorkflowCanvasProps)", + "params": [ + { + "name": "{\n task,\n people,\n selectedNodeId,\n viewport,\n onViewportChange,\n onSelectNode,\n onFocusNode,\n onUpdateNodes,\n projectTemplates = [],\n readOnly = false\n}", + "typeRef": "WorkflowCanvasProps", + "optional": false + } + ], + "loc": 1099 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 74, + "endLine": 84, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getEffectiveNodeStatus(node: Pick): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 11 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "kind": "function", + "name": "getNodeProgressPercent", + "qualifiedName": "getNodeProgressPercent", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 86, + "endLine": 90, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getNodeProgressPercent(node: WorkflowNode): number", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "number", + "loc": 5 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "kind": "function", + "name": "getStatusMeta", + "qualifiedName": "getStatusMeta", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 92, + "endLine": 130, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getStatusMeta(status: EffectiveNodeStatus)", + "params": [ + { + "name": "status", + "typeRef": "EffectiveNodeStatus", + "optional": false + } + ], + "loc": 39 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "kind": "function", + "name": "handleNodeMouseDown", + "qualifiedName": "handleNodeMouseDown", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 133, + "endLine": 148, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleNodeMouseDown(e: React.MouseEvent, node: WorkflowNode)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 16 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "kind": "function", + "name": "handleNodeClick", + "qualifiedName": "handleNodeClick", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 150, + "endLine": 157, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleNodeClick(e: React.MouseEvent, node: WorkflowNode)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleCanvasMouseDown@159", + "kind": "function", + "name": "handleCanvasMouseDown", + "qualifiedName": "handleCanvasMouseDown", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 159, + "endLine": 173, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleCanvasMouseDown(e: React.MouseEvent)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", + "kind": "function", + "name": "handleContainerMouseMove", + "qualifiedName": "handleContainerMouseMove", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 175, + "endLine": 236, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleContainerMouseMove(e: React.MouseEvent)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 62 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@212@212", + "kind": "function", + "name": "map() 回调@212", + "qualifiedName": "map() 回调@212", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 212, + "endLine": 217, + "startCol": 44, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@212(n)", + "params": [ + { + "name": "n", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleCanvasWheel@238", + "kind": "function", + "name": "handleCanvasWheel", + "qualifiedName": "handleCanvasWheel", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 238, + "endLine": 254, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleCanvasWheel(e: React.WheelEvent)", + "params": [ + { + "name": "e", + "typeRef": "React.WheelEvent", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "kind": "function", + "name": "getLogicalPoint", + "qualifiedName": "getLogicalPoint", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 256, + "endLine": 263, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getLogicalPoint(clientX: number, clientY: number)", + "params": [ + { + "name": "clientX", + "typeRef": "number", + "optional": false + }, + { + "name": "clientY", + "typeRef": "number", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#isAncestor@265", + "kind": "function", + "name": "isAncestor", + "qualifiedName": "isAncestor", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 265, + "endLine": 273, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "isAncestor(ancestorId: string, descendantId: string, visited): boolean", + "params": [ + { + "name": "ancestorId", + "typeRef": "string", + "optional": false + }, + { + "name": "descendantId", + "typeRef": "string", + "optional": false + }, + { + "name": "visited", + "optional": true, + "defaultValue": "new Set()" + } + ], + "returnType": "boolean", + "loc": 9 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", + "kind": "function", + "name": "showConnectionToast", + "qualifiedName": "showConnectionToast", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 275, + "endLine": 280, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "showConnectionToast(message: string)", + "params": [ + { + "name": "message", + "typeRef": "string", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#setTimeout() 回调@277@277", + "kind": "function", + "name": "setTimeout() 回调@277", + "qualifiedName": "setTimeout() 回调@277", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 277, + "endLine": 279, + "startCol": 23, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "setTimeout() 回调@277()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#addConnection@282", + "kind": "function", + "name": "addConnection", + "qualifiedName": "addConnection", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 282, + "endLine": 302, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "addConnection(firstNodeId: string, secondNodeId: string)", + "params": [ + { + "name": "firstNodeId", + "typeRef": "string", + "optional": false + }, + { + "name": "secondNodeId", + "typeRef": "string", + "optional": false + } + ], + "loc": 21 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "kind": "function", + "name": "completeConnectionDrag", + "qualifiedName": "completeConnectionDrag", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 304, + "endLine": 314, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "completeConnectionDrag(logicalX: number, logicalY: number)", + "params": [ + { + "name": "logicalX", + "typeRef": "number", + "optional": false + }, + { + "name": "logicalY", + "typeRef": "number", + "optional": false + } + ], + "loc": 11 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "kind": "function", + "name": "getConnectionTarget", + "qualifiedName": "getConnectionTarget", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 316, + "endLine": 323, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getConnectionTarget(logicalX: number, logicalY: number, sourceId: string)", + "params": [ + { + "name": "logicalX", + "typeRef": "number", + "optional": false + }, + { + "name": "logicalY", + "typeRef": "number", + "optional": false + }, + { + "name": "sourceId", + "typeRef": "string", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#find() 回调@317@317", + "kind": "function", + "name": "find() 回调@317", + "qualifiedName": "find() 回调@317", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 317, + "endLine": 322, + "startCol": 29, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "find() 回调@317(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "kind": "function", + "name": "handleConnectionMouseDown", + "qualifiedName": "handleConnectionMouseDown", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 325, + "endLine": 341, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleConnectionMouseDown(e: React.MouseEvent, node: WorkflowNode)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "kind": "function", + "name": "handleConnectionHandleClick", + "qualifiedName": "handleConnectionHandleClick", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 343, + "endLine": 350, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleConnectionHandleClick(e: React.MouseEvent, node: WorkflowNode)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "kind": "function", + "name": "getOverlapArea", + "qualifiedName": "getOverlapArea", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 352, + "endLine": 359, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "getOverlapArea(a: { x: number; y: number; width: number; height: number }, b: { x: number; y: number; width: number; height: number })", + "params": [ + { + "name": "a", + "typeRef": "{ x: number; y: number; width: number; height: number }", + "optional": false + }, + { + "name": "b", + "typeRef": "{ x: number; y: number; width: number; height: number }", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "kind": "function", + "name": "findPreviewNodePosition", + "qualifiedName": "findPreviewNodePosition", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 361, + "endLine": 398, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "findPreviewNodePosition(anchorNode: WorkflowNode)", + "params": [ + { + "name": "anchorNode", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 38 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleCenterNodes@400", + "kind": "function", + "name": "handleCenterNodes", + "qualifiedName": "handleCenterNodes", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 400, + "endLine": 429, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleCenterNodes()", + "params": [], + "loc": 30 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#reduce() 回调@405@405", + "kind": "function", + "name": "reduce() 回调@405", + "qualifiedName": "reduce() 回调@405", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 405, + "endLine": 412, + "startCol": 7, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "reduce() 回调@405(acc, node)", + "params": [ + { + "name": "acc", + "optional": false + }, + { + "name": "node", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", + "kind": "function", + "name": "handleContainerMouseUp", + "qualifiedName": "handleContainerMouseUp", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 431, + "endLine": 462, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleContainerMouseUp(e: React.MouseEvent)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 32 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "kind": "function", + "name": "createDraftNode", + "qualifiedName": "createDraftNode", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 465, + "endLine": 505, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "createDraftNode(mode: 'empty' | 'parent' | 'child', explicitAnchorNode: WorkflowNode)", + "params": [ + { + "name": "mode", + "typeRef": "'empty' | 'parent' | 'child'", + "optional": false + }, + { + "name": "explicitAnchorNode", + "typeRef": "WorkflowNode", + "optional": true + } + ], + "loc": 41 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507", + "kind": "function", + "name": "handleAddEmptyNode", + "qualifiedName": "handleAddEmptyNode", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 507, + "endLine": 510, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleAddEmptyNode()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleToolbarClick@512", + "kind": "function", + "name": "handleToolbarClick", + "qualifiedName": "handleToolbarClick", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 512, + "endLine": 518, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleToolbarClick(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", + "kind": "function", + "name": "handleDeleteNode", + "qualifiedName": "handleDeleteNode", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 521, + "endLine": 543, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleDeleteNode(nodeId: string)", + "params": [ + { + "name": "nodeId", + "typeRef": "string", + "optional": false + } + ], + "loc": 23 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@533@533", + "kind": "function", + "name": "map() 回调@533", + "qualifiedName": "map() 回调@533", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 533, + "endLine": 538, + "startCol": 46, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@533(n)", + "params": [ + { + "name": "n", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", + "kind": "function", + "name": "handleSelectConnection", + "qualifiedName": "handleSelectConnection", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 545, + "endLine": 550, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleSelectConnection(e: React.MouseEvent, parentId: string, childId: string)", + "params": [ + { + "name": "e", + "typeRef": "React.MouseEvent", + "optional": false + }, + { + "name": "parentId", + "typeRef": "string", + "optional": false + }, + { + "name": "childId", + "typeRef": "string", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "kind": "function", + "name": "handleDeleteConnection", + "qualifiedName": "handleDeleteConnection", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 552, + "endLine": 562, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleDeleteConnection(parentId: string, childId: string)", + "params": [ + { + "name": "parentId", + "typeRef": "string", + "optional": false + }, + { + "name": "childId", + "typeRef": "string", + "optional": false + } + ], + "loc": 11 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@564@564", + "kind": "function", + "name": "useEffect() 回调@564", + "qualifiedName": "useEffect() 回调@564", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 564, + "endLine": 590, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@564()", + "params": [], + "loc": 27 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", + "kind": "function", + "name": "handleKeyDown", + "qualifiedName": "handleKeyDown", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 565, + "endLine": 586, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleKeyDown(event: KeyboardEvent)", + "params": [ + { + "name": "event", + "typeRef": "KeyboardEvent", + "optional": false + } + ], + "loc": 22 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#useEffect() 回调@593@593", + "kind": "function", + "name": "useEffect() 回调@593", + "qualifiedName": "useEffect() 回调@593", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 593, + "endLine": 602, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@593()", + "params": [], + "loc": 10 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleClickOutside@595", + "kind": "function", + "name": "handleClickOutside", + "qualifiedName": "handleClickOutside", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 595, + "endLine": 599, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleClickOutside(event: MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "MouseEvent", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "kind": "function", + "name": "buildImportedTemplateNodes", + "qualifiedName": "buildImportedTemplateNodes", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 619, + "endLine": 665, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "buildImportedTemplateNodes(template: ProjectTemplate): WorkflowNode[]", + "params": [ + { + "name": "template", + "typeRef": "ProjectTemplate", + "optional": false + } + ], + "returnType": "WorkflowNode[]", + "loc": 47 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#toMs@623", + "kind": "function", + "name": "toMs", + "qualifiedName": "toMs", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 623, + "endLine": 623, + "startCol": 11, + "endCol": 81 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "toMs(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 1 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", + "kind": "function", + "name": "map() 回调@638", + "qualifiedName": "map() 回调@638", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 638, + "endLine": 664, + "startCol": 23, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@638(node, index)", + "params": [ + { + "name": "node", + "optional": false + }, + { + "name": "index", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "kind": "function", + "name": "handleImportTemplate", + "qualifiedName": "handleImportTemplate", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 667, + "endLine": 681, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "handleImportTemplate(templateId: string)", + "params": [ + { + "name": "templateId", + "typeRef": "string", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@837@837", + "kind": "function", + "name": "map() 回调@837", + "qualifiedName": "map() 回调@837", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 837, + "endLine": 926, + "startCol": 32, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@837(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 90 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", + "kind": "function", + "name": "map() 回调@838", + "qualifiedName": "map() 回调@838", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 838, + "endLine": 925, + "startCol": 41, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@838(parentID)", + "params": [ + { + "name": "parentID", + "optional": false + } + ], + "loc": 88 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@890@890", + "kind": "function", + "name": "匿名函数@890", + "qualifiedName": "匿名函数@890", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 890, + "endLine": 893, + "startCol": 40, + "endCol": 28 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@890(e)", + "params": [ + { + "name": "e", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@894@894", + "kind": "function", + "name": "匿名函数@894", + "qualifiedName": "匿名函数@894", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 894, + "endLine": 897, + "startCol": 38, + "endCol": 28 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@894(e)", + "params": [ + { + "name": "e", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@900@900", + "kind": "function", + "name": "匿名函数@900", + "qualifiedName": "匿名函数@900", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 900, + "endLine": 904, + "startCol": 36, + "endCol": 28 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@900(e)", + "params": [ + { + "name": "e", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@927@927", + "kind": "function", + "name": "匿名函数@927", + "qualifiedName": "匿名函数@927", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 927, + "endLine": 949, + "startCol": 43, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@927()", + "params": [], + "loc": 23 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "kind": "function", + "name": "map() 回调@997", + "qualifiedName": "map() 回调@997", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 997, + "endLine": 1117, + "startCol": 30, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@997(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 121 + }, + { + "id": "func:src/components/WorkflowCanvas.tsx#匿名函数@1073@1073", + "kind": "function", + "name": "匿名函数@1073", + "qualifiedName": "匿名函数@1073", + "location": { + "file": "src/components/WorkflowCanvas.tsx", + "startLine": 1073, + "endLine": 1077, + "startCol": 34, + "endCol": 26 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WorkflowCanvas.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@1073(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#toDateMs@23", + "kind": "function", + "name": "toDateMs", + "qualifiedName": "toDateMs", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 23, + "endLine": 25, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "toDateMs(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 3 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#addDays@27", + "kind": "function", + "name": "addDays", + "qualifiedName": "addDays", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 27, + "endLine": 31, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "addDays(value: string, days: number)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + }, + { + "name": "days", + "typeRef": "number", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "kind": "function", + "name": "shiftTemplateNodes", + "qualifiedName": "shiftTemplateNodes", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 33, + "endLine": 62, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "shiftTemplateNodes(nodes: WorkflowNode[])", + "params": [ + { + "name": "nodes", + "typeRef": "WorkflowNode[]", + "optional": false + } + ], + "loc": 30 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", + "kind": "function", + "name": "map() 回调@45", + "qualifiedName": "map() 回调@45", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 45, + "endLine": 61, + "startCol": 20, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@45(node, index)", + "params": [ + { + "name": "node", + "optional": false + }, + { + "name": "index", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#TemplateDagPreview@64", + "kind": "function", + "name": "TemplateDagPreview", + "qualifiedName": "TemplateDagPreview", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 64, + "endLine": 121, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "TemplateDagPreview({ template }: { template: ProjectTemplate | null })", + "params": [ + { + "name": "{ template }", + "typeRef": "{ template: ProjectTemplate | null }", + "optional": false + } + ], + "loc": 58 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@68@68", + "kind": "function", + "name": "useEffect() 回调@68", + "qualifiedName": "useEffect() 回调@68", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 68, + "endLine": 71, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@68()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#ProjectCreateModal@123", + "kind": "function", + "name": "ProjectCreateModal", + "qualifiedName": "ProjectCreateModal", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 123, + "endLine": 317, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "ProjectCreateModal({\n availableTags,\n template,\n onClose,\n onCreateTask,\n}: ProjectCreateModalProps)", + "params": [ + { + "name": "{\n availableTags,\n template,\n onClose,\n onCreateTask,\n}", + "typeRef": "ProjectCreateModalProps", + "optional": false + } + ], + "loc": 195 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#useEffect() 回调@137@137", + "kind": "function", + "name": "useEffect() 回调@137", + "qualifiedName": "useEffect() 回调@137", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 137, + "endLine": 144, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@137()", + "params": [], + "loc": 8 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#toggleTag@146", + "kind": "function", + "name": "toggleTag", + "qualifiedName": "toggleTag", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 146, + "endLine": 150, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "toggleTag(tagName: string)", + "params": [ + { + "name": "tagName", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", + "kind": "function", + "name": "resetProjectForm", + "qualifiedName": "resetProjectForm", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 152, + "endLine": 158, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "resetProjectForm()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", + "kind": "function", + "name": "handleCreateProject", + "qualifiedName": "handleCreateProject", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 160, + "endLine": 183, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "handleCreateProject(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 24 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#map() 回调@234@234", + "kind": "function", + "name": "map() 回调@234", + "qualifiedName": "map() 回调@234", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 234, + "endLine": 251, + "startCol": 40, + "endCol": 20 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@234(priority)", + "params": [ + { + "name": "priority", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/ProjectCreateModal.tsx#map() 回调@271@271", + "kind": "function", + "name": "map() 回调@271", + "qualifiedName": "map() 回调@271", + "location": { + "file": "src/components/ProjectCreateModal.tsx", + "startLine": 271, + "endLine": 285, + "startCol": 40, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectCreateModal.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@271(tagDefinition)", + "params": [ + { + "name": "tagDefinition", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "kind": "function", + "name": "TaskOverview", + "qualifiedName": "TaskOverview", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 14, + "endLine": 463, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "TaskOverview({\n task,\n availableTags,\n onUpdateTaskMetadata,\n onRefreshTask\n}: TaskOverviewProps)", + "params": [ + { + "name": "{\n task,\n availableTags,\n onUpdateTaskMetadata,\n onRefreshTask\n}", + "typeRef": "TaskOverviewProps", + "optional": false + } + ], + "loc": 450 + }, + { + "id": "func:src/components/TaskOverview.tsx#useEffect() 回调@48@48", + "kind": "function", + "name": "useEffect() 回调@48", + "qualifiedName": "useEffect() 回调@48", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 48, + "endLine": 56, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@48()", + "params": [], + "loc": 9 + }, + { + "id": "func:src/components/TaskOverview.tsx#useLayoutEffect() 回调@58@58", + "kind": "function", + "name": "useLayoutEffect() 回调@58", + "qualifiedName": "useLayoutEffect() 回调@58", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 58, + "endLine": 62, + "startCol": 19, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "useLayoutEffect() 回调@58()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/TaskOverview.tsx#handleSave@64", + "kind": "function", + "name": "handleSave", + "qualifiedName": "handleSave", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 64, + "endLine": 77, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleSave()", + "params": [], + "loc": 14 + }, + { + "id": "func:src/components/TaskOverview.tsx#handleSaveBlackboard@79", + "kind": "function", + "name": "handleSaveBlackboard", + "qualifiedName": "handleSaveBlackboard", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 79, + "endLine": 86, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleSaveBlackboard()", + "params": [], + "loc": 8 + }, + { + "id": "func:src/components/TaskOverview.tsx#toggleEditTag@89", + "kind": "function", + "name": "toggleEditTag", + "qualifiedName": "toggleEditTag", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 89, + "endLine": 93, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "toggleEditTag(tagName: string)", + "params": [ + { + "name": "tagName", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/TaskOverview.tsx#handleOpenBlackboard@95", + "kind": "function", + "name": "handleOpenBlackboard", + "qualifiedName": "handleOpenBlackboard", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 95, + "endLine": 101, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleOpenBlackboard()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", + "kind": "function", + "name": "runTaskCompletionUpdate", + "qualifiedName": "runTaskCompletionUpdate", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 103, + "endLine": 116, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "runTaskCompletionUpdate()", + "params": [], + "loc": 14 + }, + { + "id": "func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118", + "kind": "function", + "name": "handleToggleTaskCompletion", + "qualifiedName": "handleToggleTaskCompletion", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 118, + "endLine": 132, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleToggleTaskCompletion(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/TaskOverview.tsx#map() 回调@240@240", + "kind": "function", + "name": "map() 回调@240", + "qualifiedName": "map() 回调@240", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 240, + "endLine": 257, + "startCol": 38, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@240(priority)", + "params": [ + { + "name": "priority", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/TaskOverview.tsx#map() 回调@294@294", + "kind": "function", + "name": "map() 回调@294", + "qualifiedName": "map() 回调@294", + "location": { + "file": "src/components/TaskOverview.tsx", + "startLine": 294, + "endLine": 311, + "startCol": 38, + "endCol": 20 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TaskOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@294(tagDefinition)", + "params": [ + { + "name": "tagDefinition", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/GanttChart.tsx#GanttChart@14", + "kind": "function", + "name": "GanttChart", + "qualifiedName": "GanttChart", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 14, + "endLine": 427, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "GanttChart({ task, onSelectNode, selectedNodeId, centerNonce = 0 }: GanttChartProps)", + "params": [ + { + "name": "{ task, onSelectNode, selectedNodeId, centerNonce = 0 }", + "typeRef": "GanttChartProps", + "optional": false + } + ], + "loc": 414 + }, + { + "id": "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", + "kind": "function", + "name": "useMemo() 回调@23", + "qualifiedName": "useMemo() 回调@23", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 23, + "endLine": 73, + "startCol": 29, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@23()", + "params": [], + "loc": 51 + }, + { + "id": "func:src/components/GanttChart.tsx#from() 回调@29@29", + "kind": "function", + "name": "from() 回调@29", + "qualifiedName": "from() 回调@29", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 29, + "endLine": 33, + "startCol": 50, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "from() 回调@29(_, i)", + "params": [ + { + "name": "_", + "optional": false + }, + { + "name": "i", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/GanttChart.tsx#forEach() 回调@40@40", + "kind": "function", + "name": "forEach() 回调@40", + "qualifiedName": "forEach() 回调@40", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 40, + "endLine": 47, + "startCol": 19, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@40(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/GanttChart.tsx#forEach() 回调@41@41", + "kind": "function", + "name": "forEach() 回调@41", + "qualifiedName": "forEach() 回调@41", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 41, + "endLine": 46, + "startCol": 39, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@41(range)", + "params": [ + { + "name": "range", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/GanttChart.tsx#formatDateString@76", + "kind": "function", + "name": "formatDateString", + "qualifiedName": "formatDateString", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 76, + "endLine": 78, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "formatDateString(dt: Date)", + "params": [ + { + "name": "dt", + "typeRef": "Date", + "optional": false + } + ], + "loc": 3 + }, + { + "id": "func:src/components/GanttChart.tsx#getDayLabel@80", + "kind": "function", + "name": "getDayLabel", + "qualifiedName": "getDayLabel", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 80, + "endLine": 83, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getDayLabel(dt: Date)", + "params": [ + { + "name": "dt", + "typeRef": "Date", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/GanttChart.tsx#isWeekend@86", + "kind": "function", + "name": "isWeekend", + "qualifiedName": "isWeekend", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 86, + "endLine": 89, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "isWeekend(dt: Date)", + "params": [ + { + "name": "dt", + "typeRef": "Date", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "kind": "function", + "name": "getTimelinePercentage", + "qualifiedName": "getTimelinePercentage", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 92, + "endLine": 110, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getTimelinePercentage(startStr: string, endStr: string)", + "params": [ + { + "name": "startStr", + "typeRef": "string", + "optional": false + }, + { + "name": "endStr", + "typeRef": "string", + "optional": false + } + ], + "loc": 19 + }, + { + "id": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 115, + "endLine": 125, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getEffectiveNodeStatus(node: WorkflowNode): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 11 + }, + { + "id": "func:src/components/GanttChart.tsx#handleTimelineMouseDown@131", + "kind": "function", + "name": "handleTimelineMouseDown", + "qualifiedName": "handleTimelineMouseDown", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 131, + "endLine": 142, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "handleTimelineMouseDown(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 12 + }, + { + "id": "func:src/components/GanttChart.tsx#handleTimelineMouseMove@144", + "kind": "function", + "name": "handleTimelineMouseMove", + "qualifiedName": "handleTimelineMouseMove", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 144, + "endLine": 153, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "handleTimelineMouseMove(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/GanttChart.tsx#stopTimelineDrag@155", + "kind": "function", + "name": "stopTimelineDrag", + "qualifiedName": "stopTimelineDrag", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 155, + "endLine": 158, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "stopTimelineDrag()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/GanttChart.tsx#handleTimelineClickCapture@160", + "kind": "function", + "name": "handleTimelineClickCapture", + "qualifiedName": "handleTimelineClickCapture", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 160, + "endLine": 165, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "handleTimelineClickCapture(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/GanttChart.tsx#useEffect() 回调@167@167", + "kind": "function", + "name": "useEffect() 回调@167", + "qualifiedName": "useEffect() 回调@167", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 167, + "endLine": 192, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@167()", + "params": [], + "loc": 26 + }, + { + "id": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "kind": "function", + "name": "requestAnimationFrame() 回调@174", + "qualifiedName": "requestAnimationFrame() 回调@174", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 174, + "endLine": 189, + "startCol": 46, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "requestAnimationFrame() 回调@174()", + "params": [], + "loc": 16 + }, + { + "id": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "kind": "function", + "name": "map() 回调@260", + "qualifiedName": "map() 回调@260", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 260, + "endLine": 298, + "startCol": 45, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@260(day, idx)", + "params": [ + { + "name": "day", + "optional": false + }, + { + "name": "idx", + "optional": false + } + ], + "loc": 39 + }, + { + "id": "func:src/components/GanttChart.tsx#map() 回调@304@304", + "kind": "function", + "name": "map() 回调@304", + "qualifiedName": "map() 回调@304", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 304, + "endLine": 420, + "startCol": 26, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@304(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 117 + }, + { + "id": "func:src/components/GanttChart.tsx#map() 回调@375@375", + "kind": "function", + "name": "map() 回调@375", + "qualifiedName": "map() 回调@375", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 375, + "endLine": 386, + "startCol": 53, + "endCol": 26 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@375(day, idx)", + "params": [ + { + "name": "day", + "optional": false + }, + { + "name": "idx", + "optional": false + } + ], + "loc": 12 + }, + { + "id": "func:src/components/GanttChart.tsx#map() 回调@389@389", + "kind": "function", + "name": "map() 回调@389", + "qualifiedName": "map() 回调@389", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 389, + "endLine": 416, + "startCol": 43, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@389(range, rangeIndex)", + "params": [ + { + "name": "range", + "optional": false + }, + { + "name": "rangeIndex", + "optional": false + } + ], + "loc": 28 + }, + { + "id": "func:src/components/GanttChart.tsx#匿名函数@399@399", + "kind": "function", + "name": "匿名函数@399", + "qualifiedName": "匿名函数@399", + "location": { + "file": "src/components/GanttChart.tsx", + "startLine": 399, + "endLine": 402, + "startCol": 38, + "endCol": 30 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/GanttChart.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@399(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#PersonGanttChart@25", + "kind": "function", + "name": "PersonGanttChart", + "qualifiedName": "PersonGanttChart", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 25, + "endLine": 377, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "PersonGanttChart({\r\n tasks,\r\n person,\r\n weeklyPlans = [],\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onSelectTaskNode,\r\n}: PersonGanttChartProps)", + "params": [ + { + "name": "{\r\n tasks,\r\n person,\r\n weeklyPlans = [],\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onSelectTaskNode,\r\n}", + "typeRef": "PersonGanttChartProps", + "optional": false + } + ], + "loc": 353 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@41@41", + "kind": "function", + "name": "useMemo() 回调@41", + "qualifiedName": "useMemo() 回调@41", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 41, + "endLine": 49, + "startCol": 44, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@41()", + "params": [], + "loc": 9 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "kind": "function", + "name": "useMemo() 回调@51", + "qualifiedName": "useMemo() 回调@51", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 51, + "endLine": 76, + "startCol": 29, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@51()", + "params": [], + "loc": 26 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64", + "kind": "function", + "name": "forEach() 回调@64", + "qualifiedName": "forEach() 回调@64", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 64, + "endLine": 71, + "startCol": 19, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@64({ node })", + "params": [ + { + "name": "{ node }", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#forEach() 回调@65@65", + "kind": "function", + "name": "forEach() 回调@65", + "qualifiedName": "forEach() 回调@65", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 65, + "endLine": 70, + "startCol": 39, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@65(range)", + "params": [ + { + "name": "range", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 87, + "endLine": 97, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getEffectiveNodeStatus(node: WorkflowNode): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 11 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "kind": "function", + "name": "getTimelinePercentage", + "qualifiedName": "getTimelinePercentage", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 99, + "endLine": 113, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getTimelinePercentage(startStr: string, endStr: string)", + "params": [ + { + "name": "startStr", + "typeRef": "string", + "optional": false + }, + { + "name": "endStr", + "typeRef": "string", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#handleTimelineMouseDown@115", + "kind": "function", + "name": "handleTimelineMouseDown", + "qualifiedName": "handleTimelineMouseDown", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 115, + "endLine": 124, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "handleTimelineMouseDown(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#handleTimelineMouseMove@126", + "kind": "function", + "name": "handleTimelineMouseMove", + "qualifiedName": "handleTimelineMouseMove", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 126, + "endLine": 133, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "handleTimelineMouseMove(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#stopTimelineDrag@135", + "kind": "function", + "name": "stopTimelineDrag", + "qualifiedName": "stopTimelineDrag", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 135, + "endLine": 138, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "stopTimelineDrag()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#useEffect() 回调@140@140", + "kind": "function", + "name": "useEffect() 回调@140", + "qualifiedName": "useEffect() 回调@140", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 140, + "endLine": 170, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@140()", + "params": [], + "loc": 31 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", + "kind": "function", + "name": "requestAnimationFrame() 回调@149", + "qualifiedName": "requestAnimationFrame() 回调@149", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 149, + "endLine": 167, + "startCol": 46, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "requestAnimationFrame() 回调@149()", + "params": [], + "loc": 19 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#匿名函数@218@218", + "kind": "function", + "name": "匿名函数@218", + "qualifiedName": "匿名函数@218", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 218, + "endLine": 222, + "startCol": 20, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@218(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#map() 回调@235@235", + "kind": "function", + "name": "map() 回调@235", + "qualifiedName": "map() 回调@235", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 235, + "endLine": 261, + "startCol": 45, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@235(day, idx)", + "params": [ + { + "name": "day", + "optional": false + }, + { + "name": "idx", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "kind": "function", + "name": "map() 回调@266", + "qualifiedName": "map() 回调@266", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 266, + "endLine": 370, + "startCol": 26, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@266({ task, node })", + "params": [ + { + "name": "{ task, node }", + "optional": false + } + ], + "loc": 105 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#map() 回调@322@322", + "kind": "function", + "name": "map() 回调@322", + "qualifiedName": "map() 回调@322", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 322, + "endLine": 335, + "startCol": 53, + "endCol": 26 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@322(day, idx)", + "params": [ + { + "name": "day", + "optional": false + }, + { + "name": "idx", + "optional": false + } + ], + "loc": 14 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#map() 回调@337@337", + "kind": "function", + "name": "map() 回调@337", + "qualifiedName": "map() 回调@337", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 337, + "endLine": 366, + "startCol": 43, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@337(range, rangeIndex)", + "params": [ + { + "name": "range", + "optional": false + }, + { + "name": "rangeIndex", + "optional": false + } + ], + "loc": 30 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#匿名函数@344@344", + "kind": "function", + "name": "匿名函数@344", + "qualifiedName": "匿名函数@344", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 344, + "endLine": 351, + "startCol": 38, + "endCol": 30 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@344(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "kind": "function", + "name": "buildDateRange", + "qualifiedName": "buildDateRange", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 379, + "endLine": 391, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "buildDateRange(minDate: Date, maxDate: Date)", + "params": [ + { + "name": "minDate", + "typeRef": "Date", + "optional": false + }, + { + "name": "maxDate", + "typeRef": "Date", + "optional": false + } + ], + "loc": 13 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#getDayLabel@393", + "kind": "function", + "name": "getDayLabel", + "qualifiedName": "getDayLabel", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 393, + "endLine": 396, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getDayLabel(dt: Date)", + "params": [ + { + "name": "dt", + "typeRef": "Date", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "kind": "function", + "name": "getStatusVisual", + "qualifiedName": "getStatusVisual", + "location": { + "file": "src/components/PersonGanttChart.tsx", + "startLine": 398, + "endLine": 424, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PersonGanttChart.tsx", + "moduleId": "module:src/components", + "signature": "getStatusVisual(status: EffectiveNodeStatus)", + "params": [ + { + "name": "status", + "typeRef": "EffectiveNodeStatus", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/components/PeopleManager.tsx#getSearchTokens@29", + "kind": "function", + "name": "getSearchTokens", + "qualifiedName": "getSearchTokens", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 29, + "endLine": 43, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "getSearchTokens(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/PeopleManager.tsx#getPinyinSortKey@45", + "kind": "function", + "name": "getPinyinSortKey", + "qualifiedName": "getPinyinSortKey", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 45, + "endLine": 49, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "getPinyinSortKey(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51", + "kind": "function", + "name": "comparePeopleByPinyin", + "qualifiedName": "comparePeopleByPinyin", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 51, + "endLine": 56, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "comparePeopleByPinyin(a: Person, b: Person)", + "params": [ + { + "name": "a", + "typeRef": "Person", + "optional": false + }, + { + "name": "b", + "typeRef": "Person", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/PeopleManager.tsx#PeopleManager@58", + "kind": "function", + "name": "PeopleManager", + "qualifiedName": "PeopleManager", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 58, + "endLine": 328, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "PeopleManager({\r\n people,\r\n tasks,\r\n weeklyPlans = [],\r\n personalView = false,\r\n currentPersonName = '',\r\n currentPersonRole = '',\r\n currentPersonId = '',\r\n canEditAllPersonRoles = false,\r\n canManagePersonAdmins = false,\r\n focusPersonId = null,\r\n focusPersonNonce = 0,\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onDeletePerson,\r\n onUpdatePersonRole,\r\n onTogglePersonAdmin,\r\n onSelectTaskNode,\r\n onCloseDrawer,\r\n}: PeopleManagerProps)", + "params": [ + { + "name": "{\r\n people,\r\n tasks,\r\n weeklyPlans = [],\r\n personalView = false,\r\n currentPersonName = '',\r\n currentPersonRole = '',\r\n currentPersonId = '',\r\n canEditAllPersonRoles = false,\r\n canManagePersonAdmins = false,\r\n focusPersonId = null,\r\n focusPersonNonce = 0,\r\n selectedTaskId = null,\r\n selectedNodeId = null,\r\n centerNonce = 0,\r\n onDeletePerson,\r\n onUpdatePersonRole,\r\n onTogglePersonAdmin,\r\n onSelectTaskNode,\r\n onCloseDrawer,\r\n}", + "typeRef": "PeopleManagerProps", + "optional": false + } + ], + "loc": 271 + }, + { + "id": "func:src/components/PeopleManager.tsx#useMemo() 回调@107@107", + "kind": "function", + "name": "useMemo() 回调@107", + "qualifiedName": "useMemo() 回调@107", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 107, + "endLine": 116, + "startCol": 34, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@107()", + "params": [], + "loc": 10 + }, + { + "id": "func:src/components/PeopleManager.tsx#useEffect() 回调@118@118", + "kind": "function", + "name": "useEffect() 回调@118", + "qualifiedName": "useEffect() 回调@118", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 118, + "endLine": 120, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@118()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/PeopleManager.tsx#useEffect() 回调@122@122", + "kind": "function", + "name": "useEffect() 回调@122", + "qualifiedName": "useEffect() 回调@122", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 122, + "endLine": 125, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@122()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/PeopleManager.tsx#handleSaveRole@127", + "kind": "function", + "name": "handleSaveRole", + "qualifiedName": "handleSaveRole", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 127, + "endLine": 136, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "handleSaveRole()", + "params": [], + "loc": 10 + }, + { + "id": "func:src/components/PeopleManager.tsx#匿名函数@250@250", + "kind": "function", + "name": "匿名函数@250", + "qualifiedName": "匿名函数@250", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 250, + "endLine": 253, + "startCol": 30, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@250()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/PeopleManager.tsx#匿名函数@280@280", + "kind": "function", + "name": "匿名函数@280", + "qualifiedName": "匿名函数@280", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 280, + "endLine": 284, + "startCol": 32, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@280(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/PeopleManager.tsx#匿名函数@285@285", + "kind": "function", + "name": "匿名函数@285", + "qualifiedName": "匿名函数@285", + "location": { + "file": "src/components/PeopleManager.tsx", + "startLine": 285, + "endLine": 290, + "startCol": 34, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/PeopleManager.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@285(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/utils/api.ts#appPath@7", + "kind": "function", + "name": "appPath", + "qualifiedName": "appPath", + "location": { + "file": "src/utils/api.ts", + "startLine": 7, + "endLine": 13, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/api.ts", + "moduleId": "module:src/utils", + "signature": "appPath(path)", + "params": [ + { + "name": "path", + "optional": true, + "defaultValue": "''" + } + ], + "loc": 7 + }, + { + "id": "func:src/utils/api.ts#apiPath@15", + "kind": "function", + "name": "apiPath", + "qualifiedName": "apiPath", + "location": { + "file": "src/utils/api.ts", + "startLine": 15, + "endLine": 17, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/utils/api.ts", + "moduleId": "module:src/utils", + "signature": "apiPath(path: string)", + "params": [ + { + "name": "path", + "typeRef": "string", + "optional": false + } + ], + "loc": 3 + }, + { + "id": "func:src/components/LoginPage.tsx#readApiJson@21", + "kind": "function", + "name": "readApiJson", + "qualifiedName": "readApiJson", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 21, + "endLine": 29, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "readApiJson(response: Response, fallback: string): Promise", + "params": [ + { + "name": "response", + "typeRef": "Response", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 9 + }, + { + "id": "func:src/components/LoginPage.tsx#createOAuthState@31", + "kind": "function", + "name": "createOAuthState", + "qualifiedName": "createOAuthState", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 31, + "endLine": 37, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "createOAuthState()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "kind": "function", + "name": "requestSsoOAuthCode", + "qualifiedName": "requestSsoOAuthCode", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 39, + "endLine": 82, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "requestSsoOAuthCode(authorizeUrl: string, state: string)", + "params": [ + { + "name": "authorizeUrl", + "typeRef": "string", + "optional": false + }, + { + "name": "state", + "typeRef": "string", + "optional": false + } + ], + "loc": 44 + }, + { + "id": "func:src/components/LoginPage.tsx#匿名函数@40@40", + "kind": "function", + "name": "匿名函数@40", + "qualifiedName": "匿名函数@40", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 40, + "endLine": 81, + "startCol": 30, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@40(resolve, reject)", + "params": [ + { + "name": "resolve", + "optional": false + }, + { + "name": "reject", + "optional": false + } + ], + "loc": 42 + }, + { + "id": "func:src/components/LoginPage.tsx#setTimeout() 回调@52@52", + "kind": "function", + "name": "setTimeout() 回调@52", + "qualifiedName": "setTimeout() 回调@52", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 52, + "endLine": 56, + "startCol": 41, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "setTimeout() 回调@52()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/LoginPage.tsx#handleMessage@58", + "kind": "function", + "name": "handleMessage", + "qualifiedName": "handleMessage", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 58, + "endLine": 78, + "startCol": 5, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "handleMessage(event: MessageEvent)", + "params": [ + { + "name": "event", + "typeRef": "MessageEvent", + "optional": false + } + ], + "loc": 21 + }, + { + "id": "func:src/components/LoginPage.tsx#LoginPage@84", + "kind": "function", + "name": "LoginPage", + "qualifiedName": "LoginPage", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 84, + "endLine": 187, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "LoginPage({ onLogin }: LoginPageProps)", + "params": [ + { + "name": "{ onLogin }", + "typeRef": "LoginPageProps", + "optional": false + } + ], + "loc": 104 + }, + { + "id": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "kind": "function", + "name": "handleSsoLogin", + "qualifiedName": "handleSsoLogin", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 90, + "endLine": 119, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "handleSsoLogin()", + "params": [], + "loc": 30, + "interactions": [ + { + "id": "ix:func:src/components/LoginPage.tsx#handleSsoLogin@90:api:out:GET:`/api/auth/sso-login-url?state=${encodeURIComponent(state)}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "`/api/auth/sso-login-url?state=${encodeURIComponent(state)}`" + }, + { + "id": "ix:func:src/components/LoginPage.tsx#handleSsoLogin@90:api:out:POST:/api/auth/sso-login", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/sso-login" + } + ] + }, + { + "id": "func:src/components/LoginPage.tsx#handleDevLogin@121", + "kind": "function", + "name": "handleDevLogin", + "qualifiedName": "handleDevLogin", + "location": { + "file": "src/components/LoginPage.tsx", + "startLine": 121, + "endLine": 141, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/LoginPage.tsx", + "moduleId": "module:src/components", + "signature": "handleDevLogin()", + "params": [], + "loc": 21, + "interactions": [ + { + "id": "ix:func:src/components/LoginPage.tsx#handleDevLogin@121:api:out:POST:/api/auth/dev-login", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/dev-login" + } + ] + }, + { + "id": "func:src/components/TagManager.tsx#TagManager@11", + "kind": "function", + "name": "TagManager", + "qualifiedName": "TagManager", + "location": { + "file": "src/components/TagManager.tsx", + "startLine": 11, + "endLine": 157, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TagManager.tsx", + "moduleId": "module:src/components", + "signature": "TagManager({ tags, onCreateTag, onDeleteTag }: TagManagerProps)", + "params": [ + { + "name": "{ tags, onCreateTag, onDeleteTag }", + "typeRef": "TagManagerProps", + "optional": false + } + ], + "loc": 147 + }, + { + "id": "func:src/components/TagManager.tsx#useMemo() 回调@17@17", + "kind": "function", + "name": "useMemo() 回调@17", + "qualifiedName": "useMemo() 回调@17", + "location": { + "file": "src/components/TagManager.tsx", + "startLine": 17, + "endLine": 21, + "startCol": 32, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TagManager.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@17()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/TagManager.tsx#handleSubmit@23", + "kind": "function", + "name": "handleSubmit", + "qualifiedName": "handleSubmit", + "location": { + "file": "src/components/TagManager.tsx", + "startLine": 23, + "endLine": 39, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TagManager.tsx", + "moduleId": "module:src/components", + "signature": "handleSubmit(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/TagManager.tsx#匿名函数@136@136", + "kind": "function", + "name": "匿名函数@136", + "qualifiedName": "匿名函数@136", + "location": { + "file": "src/components/TagManager.tsx", + "startLine": 136, + "endLine": 140, + "startCol": 34, + "endCol": 26 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/TagManager.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@136()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", + "kind": "function", + "name": "emptyTemplateDraft", + "qualifiedName": "emptyTemplateDraft", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 18, + "endLine": 25, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "emptyTemplateDraft(): TemplateDraft", + "params": [], + "returnType": "TemplateDraft", + "loc": 8 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", + "kind": "function", + "name": "createDefaultTemplateNode", + "qualifiedName": "createDefaultTemplateNode", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 27, + "endLine": 44, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "createDefaultTemplateNode(): WorkflowNode", + "params": [], + "returnType": "WorkflowNode", + "loc": 18 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "kind": "function", + "name": "getUniqueTemplateName", + "qualifiedName": "getUniqueTemplateName", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 46, + "endLine": 55, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "getUniqueTemplateName(baseName: string, templates: ProjectTemplate[])", + "params": [ + { + "name": "baseName", + "typeRef": "string", + "optional": false + }, + { + "name": "templates", + "typeRef": "ProjectTemplate[]", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "kind": "function", + "name": "normalizeDraft", + "qualifiedName": "normalizeDraft", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 57, + "endLine": 64, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "normalizeDraft(draft: TemplateDraft): Omit", + "params": [ + { + "name": "draft", + "typeRef": "TemplateDraft", + "optional": false + } + ], + "returnType": "Omit", + "loc": 8 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", + "kind": "function", + "name": "toCanvasTask", + "qualifiedName": "toCanvasTask", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 66, + "endLine": 83, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "toCanvasTask(draft: TemplateDraft): Task", + "params": [ + { + "name": "draft", + "typeRef": "TemplateDraft", + "optional": false + } + ], + "returnType": "Task", + "loc": 18 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", + "kind": "function", + "name": "ProjectTemplateManager", + "qualifiedName": "ProjectTemplateManager", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 85, + "endLine": 534, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "ProjectTemplateManager({\n availableTags,\n templates,\n onCreateTemplate,\n onUpdateTemplate,\n onDeleteTemplate,\n}: ProjectTemplateManagerProps)", + "params": [ + { + "name": "{\n availableTags,\n templates,\n onCreateTemplate,\n onUpdateTemplate,\n onDeleteTemplate,\n}", + "typeRef": "ProjectTemplateManagerProps", + "optional": false + } + ], + "loc": 450 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#useEffect() 回调@104@104", + "kind": "function", + "name": "useEffect() 回调@104", + "qualifiedName": "useEffect() 回调@104", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 104, + "endLine": 109, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@104()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#toggleTag@111", + "kind": "function", + "name": "toggleTag", + "qualifiedName": "toggleTag", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 111, + "endLine": 118, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "toggleTag(tagName: string)", + "params": [ + { + "name": "tagName", + "typeRef": "string", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "function", + "name": "loadTemplateIntoEditor", + "qualifiedName": "loadTemplateIntoEditor", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 120, + "endLine": 130, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "loadTemplateIntoEditor(template: ProjectTemplate)", + "params": [ + { + "name": "template", + "typeRef": "ProjectTemplate", + "optional": false + } + ], + "loc": 11 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", + "kind": "function", + "name": "handleNewTemplate", + "qualifiedName": "handleNewTemplate", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 132, + "endLine": 152, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "handleNewTemplate()", + "params": [], + "loc": 21 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", + "kind": "function", + "name": "handleSaveTemplate", + "qualifiedName": "handleSaveTemplate", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 154, + "endLine": 179, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "handleSaveTemplate(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 26 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", + "kind": "function", + "name": "handleCopyTemplate", + "qualifiedName": "handleCopyTemplate", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 181, + "endLine": 220, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "handleCopyTemplate()", + "params": [], + "loc": 40 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@201@201", + "kind": "function", + "name": "map() 回调@201", + "qualifiedName": "map() 回调@201", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 201, + "endLine": 210, + "startCol": 30, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@201(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", + "kind": "function", + "name": "handleDeleteTemplate", + "qualifiedName": "handleDeleteTemplate", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 222, + "endLine": 245, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "handleDeleteTemplate()", + "params": [], + "loc": 24 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#handleUpdateNodes@247", + "kind": "function", + "name": "handleUpdateNodes", + "qualifiedName": "handleUpdateNodes", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 247, + "endLine": 249, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "handleUpdateNodes(nodes: WorkflowNode[])", + "params": [ + { + "name": "nodes", + "typeRef": "WorkflowNode[]", + "optional": false + } + ], + "loc": 3 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", + "kind": "function", + "name": "updateSelectedNode", + "qualifiedName": "updateSelectedNode", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 251, + "endLine": 258, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "updateSelectedNode(patch: Partial)", + "params": [ + { + "name": "patch", + "typeRef": "Partial", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#deleteSelectedNode@260", + "kind": "function", + "name": "deleteSelectedNode", + "qualifiedName": "deleteSelectedNode", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 260, + "endLine": 273, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "deleteSelectedNode()", + "params": [], + "loc": 14 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308", + "kind": "function", + "name": "map() 回调@308", + "qualifiedName": "map() 回调@308", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 308, + "endLine": 336, + "startCol": 31, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@308(template)", + "params": [ + { + "name": "template", + "optional": false + } + ], + "loc": 29 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393", + "kind": "function", + "name": "map() 回调@393", + "qualifiedName": "map() 回调@393", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 393, + "endLine": 407, + "startCol": 40, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@393(tagDefinition)", + "params": [ + { + "name": "tagDefinition", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/ProjectTemplateManager.tsx#map() 回调@504@504", + "kind": "function", + "name": "map() 回调@504", + "qualifiedName": "map() 回调@504", + "location": { + "file": "src/components/ProjectTemplateManager.tsx", + "startLine": 504, + "endLine": 511, + "startCol": 52, + "endCol": 28 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/ProjectTemplateManager.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@504(parentId)", + "params": [ + { + "name": "parentId", + "optional": false + } + ], + "loc": 8 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 49, + "endLine": 59, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getEffectiveNodeStatus(node: Pick): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "Pick", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 11 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "kind": "function", + "name": "getStatusMeta", + "qualifiedName": "getStatusMeta", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 61, + "endLine": 87, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getStatusMeta(status: EffectiveNodeStatus)", + "params": [ + { + "name": "status", + "typeRef": "EffectiveNodeStatus", + "optional": false + } + ], + "loc": 27 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "kind": "function", + "name": "getLinkedNodeClassName", + "qualifiedName": "getLinkedNodeClassName", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 89, + "endLine": 105, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getLinkedNodeClassName(node: WorkflowNode)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getSearchTokens@107", + "kind": "function", + "name": "getSearchTokens", + "qualifiedName": "getSearchTokens", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 107, + "endLine": 121, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getSearchTokens(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 15 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "kind": "function", + "name": "NodeEditorDrawer", + "qualifiedName": "NodeEditorDrawer", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 123, + "endLine": 755, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "NodeEditorDrawer({\r\n task,\r\n people,\r\n selectedNodeId,\r\n isLocked,\r\n currentLocation,\r\n showPersonGantt,\r\n onLockedChange,\r\n onSelectNode,\r\n onFocusNode,\r\n onUpdateNodes,\r\n onNavigate,\r\n}: NodeEditorDrawerProps)", + "params": [ + { + "name": "{\r\n task,\r\n people,\r\n selectedNodeId,\r\n isLocked,\r\n currentLocation,\r\n showPersonGantt,\r\n onLockedChange,\r\n onSelectNode,\r\n onFocusNode,\r\n onUpdateNodes,\r\n onNavigate,\r\n}", + "typeRef": "NodeEditorDrawerProps", + "optional": false + } + ], + "loc": 633 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@151@151", + "kind": "function", + "name": "useEffect() 回调@151", + "qualifiedName": "useEffect() 回调@151", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 151, + "endLine": 176, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@151()", + "params": [], + "loc": 26 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#匿名函数@157@157", + "kind": "function", + "name": "匿名函数@157", + "qualifiedName": "匿名函数@157", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 157, + "endLine": 159, + "startCol": 14, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@157()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#setTimeout() 回调@164@164", + "kind": "function", + "name": "setTimeout() 回调@164", + "qualifiedName": "setTimeout() 回调@164", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 164, + "endLine": 167, + "startCol": 30, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "setTimeout() 回调@164()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#匿名函数@173@173", + "kind": "function", + "name": "匿名函数@173", + "qualifiedName": "匿名函数@173", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 173, + "endLine": 175, + "startCol": 12, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@173()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", + "kind": "function", + "name": "useEffect() 回调@178", + "qualifiedName": "useEffect() 回调@178", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 178, + "endLine": 196, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "useEffect() 回调@178()", + "params": [], + "loc": 19 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#filter() 回调@210@210", + "kind": "function", + "name": "filter() 回调@210", + "qualifiedName": "filter() 回调@210", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 210, + "endLine": 218, + "startCol": 40, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "filter() 回调@210(person)", + "params": [ + { + "name": "person", + "optional": false + } + ], + "loc": 9 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "kind": "function", + "name": "getParentLatestEndDate", + "qualifiedName": "getParentLatestEndDate", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 220, + "endLine": 229, + "startCol": 3, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getParentLatestEndDate(node: WorkflowNode | null)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode | null", + "optional": true, + "defaultValue": "drawerNode" + } + ], + "loc": 10 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "kind": "function", + "name": "getMinimumFirstStartDate", + "qualifiedName": "getMinimumFirstStartDate", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 231, + "endLine": 237, + "startCol": 3, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getMinimumFirstStartDate(node: WorkflowNode | null, locked)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode | null", + "optional": true, + "defaultValue": "drawerNode" + }, + { + "name": "locked", + "optional": true, + "defaultValue": "editStartDateLocked" + } + ], + "loc": 7 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", + "kind": "function", + "name": "closeDrawer", + "qualifiedName": "closeDrawer", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 239, + "endLine": 242, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "closeDrawer()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "kind": "function", + "name": "getDraftKey", + "qualifiedName": "getDraftKey", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 244, + "endLine": 249, + "startCol": 3, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getDraftKey(draft: NodeEditDraft)", + "params": [ + { + "name": "draft", + "typeRef": "NodeEditDraft", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "function", + "name": "getCurrentDraft", + "qualifiedName": "getCurrentDraft", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 251, + "endLine": 259, + "startCol": 3, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "getCurrentDraft(): NodeEditDraft", + "params": [], + "returnType": "NodeEditDraft", + "loc": 9 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "kind": "function", + "name": "normalizeProgress", + "qualifiedName": "normalizeProgress", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 261, + "endLine": 265, + "startCol": 3, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "normalizeProgress(value: unknown)", + "params": [ + { + "name": "value", + "typeRef": "unknown", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "kind": "function", + "name": "selectResponsible", + "qualifiedName": "selectResponsible", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 267, + "endLine": 273, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "selectResponsible(personName: string)", + "params": [ + { + "name": "personName", + "typeRef": "string", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "function", + "name": "updateSelectedNode", + "qualifiedName": "updateSelectedNode", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 275, + "endLine": 326, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "updateSelectedNode(action: 'auto' | 'complete' | 'reopen', draft, startDateLocked)", + "params": [ + { + "name": "action", + "typeRef": "'auto' | 'complete' | 'reopen'", + "optional": true, + "defaultValue": "'auto'" + }, + { + "name": "draft", + "optional": true, + "defaultValue": "getCurrentDraft()" + }, + { + "name": "startDateLocked", + "optional": true, + "defaultValue": "editStartDateLocked" + } + ], + "loc": 52 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#completeNode@328", + "kind": "function", + "name": "completeNode", + "qualifiedName": "completeNode", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 328, + "endLine": 330, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "completeNode()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#reopenNode@332", + "kind": "function", + "name": "reopenNode", + "qualifiedName": "reopenNode", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 332, + "endLine": 334, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "reopenNode()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "kind": "function", + "name": "changeEditName", + "qualifiedName": "changeEditName", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 336, + "endLine": 339, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "changeEditName(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "kind": "function", + "name": "changeEditDesc", + "qualifiedName": "changeEditDesc", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 341, + "endLine": 344, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "changeEditDesc(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "kind": "function", + "name": "updateTimeRanges", + "qualifiedName": "updateTimeRanges", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 346, + "endLine": 355, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "updateTimeRanges(nextRanges: NodeTimeRange[])", + "params": [ + { + "name": "nextRanges", + "typeRef": "NodeTimeRange[]", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "kind": "function", + "name": "changeTimeRange", + "qualifiedName": "changeTimeRange", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 357, + "endLine": 359, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "changeTimeRange(rangeId: string, patch: Partial)", + "params": [ + { + "name": "rangeId", + "typeRef": "string", + "optional": false + }, + { + "name": "patch", + "typeRef": "Partial", + "optional": false + } + ], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", + "kind": "function", + "name": "addTimeRange", + "qualifiedName": "addTimeRange", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 361, + "endLine": 365, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "addTimeRange()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "kind": "function", + "name": "removeTimeRange", + "qualifiedName": "removeTimeRange", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 367, + "endLine": 370, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "removeTimeRange(rangeId: string)", + "params": [ + { + "name": "rangeId", + "typeRef": "string", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "kind": "function", + "name": "changeProgress", + "qualifiedName": "changeProgress", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 372, + "endLine": 376, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "changeProgress(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", + "kind": "function", + "name": "toggleStartDateLock", + "qualifiedName": "toggleStartDateLock", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 378, + "endLine": 382, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "toggleStartDateLock()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#deleteNode@384", + "kind": "function", + "name": "deleteNode", + "qualifiedName": "deleteNode", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 384, + "endLine": 400, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "deleteNode()", + "params": [], + "loc": 17 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "kind": "function", + "name": "focusLinkedNode", + "qualifiedName": "focusLinkedNode", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 402, + "endLine": 405, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "focusLinkedNode(node: WorkflowNode)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#map() 回调@466@466", + "kind": "function", + "name": "map() 回调@466", + "qualifiedName": "map() 回调@466", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 466, + "endLine": 484, + "startCol": 15, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@466({ id, label, icon: Icon })", + "params": [ + { + "name": "{ id, label, icon: Icon }", + "optional": false + } + ], + "loc": 19 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#匿名函数@524@524", + "kind": "function", + "name": "匿名函数@524", + "qualifiedName": "匿名函数@524", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 524, + "endLine": 526, + "startCol": 31, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@524()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", + "kind": "function", + "name": "map() 回调@676", + "qualifiedName": "map() 回调@676", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 676, + "endLine": 693, + "startCol": 44, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@676(parentId)", + "params": [ + { + "name": "parentId", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "kind": "function", + "name": "getDropBeforeTaskId", + "qualifiedName": "getDropBeforeTaskId", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 33, + "endLine": 42, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "getDropBeforeTaskId(container: HTMLElement, clientY: number, draggingTaskId: string | null)", + "params": [ + { + "name": "container", + "typeRef": "HTMLElement", + "optional": false + }, + { + "name": "clientY", + "typeRef": "number", + "optional": false + }, + { + "name": "draggingTaskId", + "typeRef": "string | null", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#find() 回调@37@37", + "kind": "function", + "name": "find() 回调@37", + "qualifiedName": "find() 回调@37", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 37, + "endLine": 40, + "startCol": 29, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "find() 回调@37(element)", + "params": [ + { + "name": "element", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "kind": "function", + "name": "normalizeProgress", + "qualifiedName": "normalizeProgress", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 53, + "endLine": 57, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "normalizeProgress(value: unknown)", + "params": [ + { + "name": "value", + "typeRef": "unknown", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#sortTasks@82", + "kind": "function", + "name": "sortTasks", + "qualifiedName": "sortTasks", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 82, + "endLine": 88, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "sortTasks(tasks: Task[])", + "params": [ + { + "name": "tasks", + "typeRef": "Task[]", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#sort() 回调@83@83", + "kind": "function", + "name": "sort() 回调@83", + "qualifiedName": "sort() 回调@83", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 83, + "endLine": 87, + "startCol": 26, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "sort() 回调@83(a, b)", + "params": [ + { + "name": "a", + "optional": false + }, + { + "name": "b", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "kind": "function", + "name": "getEffectiveNodeStatus", + "qualifiedName": "getEffectiveNodeStatus", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 90, + "endLine": 97, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "getEffectiveNodeStatus(node: WorkflowNode, today: string): EffectiveNodeStatus", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + }, + { + "name": "today", + "typeRef": "string", + "optional": false + } + ], + "returnType": "EffectiveNodeStatus", + "loc": 8 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", + "kind": "function", + "name": "WeeklyOverview", + "qualifiedName": "WeeklyOverview", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 99, + "endLine": 879, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "WeeklyOverview({\n plans,\n tasks,\n canManageTasks = false,\n onOpenTask,\n onOpenPlan,\n onReorderTask,\n onMoveTaskToPlan,\n}: WeeklyOverviewProps)", + "params": [ + { + "name": "{\n plans,\n tasks,\n canManageTasks = false,\n onOpenTask,\n onOpenPlan,\n onReorderTask,\n onMoveTaskToPlan,\n}", + "typeRef": "WeeklyOverviewProps", + "optional": false + } + ], + "loc": 781 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleBoardMouseDown@118", + "kind": "function", + "name": "handleBoardMouseDown", + "qualifiedName": "handleBoardMouseDown", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 118, + "endLine": 129, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleBoardMouseDown(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 12 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleBoardMouseMove@131", + "kind": "function", + "name": "handleBoardMouseMove", + "qualifiedName": "handleBoardMouseMove", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 131, + "endLine": 136, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleBoardMouseMove(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "kind": "function", + "name": "stopBoardDrag", + "qualifiedName": "stopBoardDrag", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 138, + "endLine": 141, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "stopBoardDrag()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleBoardClickCapture@143", + "kind": "function", + "name": "handleBoardClickCapture", + "qualifiedName": "handleBoardClickCapture", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 143, + "endLine": 148, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleBoardClickCapture(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleDrawerMouseDown@156", + "kind": "function", + "name": "handleDrawerMouseDown", + "qualifiedName": "handleDrawerMouseDown", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 156, + "endLine": 168, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleDrawerMouseDown(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 13 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleDrawerMouseMove@170", + "kind": "function", + "name": "handleDrawerMouseMove", + "qualifiedName": "handleDrawerMouseMove", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 170, + "endLine": 194, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleDrawerMouseMove(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 25 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#stopDrawerDrag@196", + "kind": "function", + "name": "stopDrawerDrag", + "qualifiedName": "stopDrawerDrag", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 196, + "endLine": 199, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "stopDrawerDrag()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "kind": "function", + "name": "clearTaskDragState", + "qualifiedName": "clearTaskDragState", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 207, + "endLine": 212, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "clearTaskDragState()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "kind": "function", + "name": "handleTaskDragStart", + "qualifiedName": "handleTaskDragStart", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 214, + "endLine": 225, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleTaskDragStart(event: React.DragEvent, task: Task)", + "params": [ + { + "name": "event", + "typeRef": "React.DragEvent", + "optional": false + }, + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "loc": 12 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "kind": "function", + "name": "handleColumnDragOver", + "qualifiedName": "handleColumnDragOver", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 227, + "endLine": 235, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleColumnDragOver(event: React.DragEvent, planId: string)", + "params": [ + { + "name": "event", + "typeRef": "React.DragEvent", + "optional": false + }, + { + "name": "planId", + "typeRef": "string", + "optional": false + } + ], + "loc": 9 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "kind": "function", + "name": "handleColumnDrop", + "qualifiedName": "handleColumnDrop", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 237, + "endLine": 254, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "handleColumnDrop(event: React.DragEvent, planId: string)", + "params": [ + { + "name": "event", + "typeRef": "React.DragEvent", + "optional": false + }, + { + "name": "planId", + "typeRef": "string", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#useMemo() 回调@261@261", + "kind": "function", + "name": "useMemo() 回调@261", + "qualifiedName": "useMemo() 回调@261", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 261, + "endLine": 269, + "startCol": 31, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "useMemo() 回调@261()", + "params": [], + "loc": 9 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#forEach() 回调@263@263", + "kind": "function", + "name": "forEach() 回调@263", + "qualifiedName": "forEach() 回调@263", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 263, + "endLine": 267, + "startCol": 19, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "forEach() 回调@263(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#sort() 回调@273@273", + "kind": "function", + "name": "sort() 回调@273", + "qualifiedName": "sort() 回调@273", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 273, + "endLine": 279, + "startCol": 23, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "sort() 回调@273(a, b)", + "params": [ + { + "name": "a", + "optional": false + }, + { + "name": "b", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", + "kind": "function", + "name": "toggleSelectedPriority", + "qualifiedName": "toggleSelectedPriority", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 283, + "endLine": 287, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "toggleSelectedPriority(priority: TaskPriority)", + "params": [ + { + "name": "priority", + "typeRef": "TaskPriority", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#matchesFilters@290", + "kind": "function", + "name": "matchesFilters", + "qualifiedName": "matchesFilters", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 290, + "endLine": 300, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "matchesFilters(task: Task)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "loc": 11 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", + "kind": "function", + "name": "map() 回调@335", + "qualifiedName": "map() 回调@335", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 335, + "endLine": 350, + "startCol": 32, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@335(priority)", + "params": [ + { + "name": "priority", + "optional": false + } + ], + "loc": 16 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "kind": "function", + "name": "map() 回调@382", + "qualifiedName": "map() 回调@382", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 382, + "endLine": 620, + "startCol": 31, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@382(plan)", + "params": [ + { + "name": "plan", + "optional": false + } + ], + "loc": 239 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394", + "kind": "function", + "name": "reduce() 回调@394", + "qualifiedName": "reduce() 回调@394", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 394, + "endLine": 397, + "startCol": 17, + "endCol": 18 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "reduce() 回调@394(counts, task)", + "params": [ + { + "name": "counts", + "optional": false + }, + { + "name": "task", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#匿名函数@494@494", + "kind": "function", + "name": "匿名函数@494", + "qualifiedName": "匿名函数@494", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 494, + "endLine": 499, + "startCol": 34, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@494(event)", + "params": [ + { + "name": "event", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "kind": "function", + "name": "map() 回调@513", + "qualifiedName": "map() 回调@513", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 513, + "endLine": 612, + "startCol": 41, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@513(task)", + "params": [ + { + "name": "task", + "optional": false + } + ], + "loc": 100 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "kind": "function", + "name": "匿名函数@644", + "qualifiedName": "匿名函数@644", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 644, + "endLine": 775, + "startCol": 25, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@644()", + "params": [], + "loc": 132 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "kind": "function", + "name": "map() 回调@721", + "qualifiedName": "map() 回调@721", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 721, + "endLine": 757, + "startCol": 40, + "endCol": 24 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@721(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 37 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#匿名函数@777@777", + "kind": "function", + "name": "匿名函数@777", + "qualifiedName": "匿名函数@777", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 777, + "endLine": 875, + "startCol": 25, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "匿名函数@777()", + "params": [], + "loc": 99 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785", + "kind": "function", + "name": "reduce() 回调@785", + "qualifiedName": "reduce() 回调@785", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 785, + "endLine": 788, + "startCol": 13, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "reduce() 回调@785(counts, task)", + "params": [ + { + "name": "counts", + "optional": false + }, + { + "name": "task", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/components/WeeklyOverview.tsx#map() 回调@840@840", + "kind": "function", + "name": "map() 回调@840", + "qualifiedName": "map() 回调@840", + "location": { + "file": "src/components/WeeklyOverview.tsx", + "startLine": 840, + "endLine": 858, + "startCol": 39, + "endCol": 22 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/WeeklyOverview.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@840(status)", + "params": [ + { + "name": "status", + "optional": false + } + ], + "loc": 19 + }, + { + "id": "func:src/App.tsx#readApiError@39", + "kind": "function", + "name": "readApiError", + "qualifiedName": "readApiError", + "location": { + "file": "src/App.tsx", + "startLine": 39, + "endLine": 42, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "readApiError(res: Response, fallback: string)", + "params": [ + { + "name": "res", + "typeRef": "Response", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/App.tsx#readApiJson@44", + "kind": "function", + "name": "readApiJson", + "qualifiedName": "readApiJson", + "location": { + "file": "src/App.tsx", + "startLine": 44, + "endLine": 52, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "readApiJson(res: Response, fallback: string): Promise", + "params": [ + { + "name": "res", + "typeRef": "Response", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 9 + }, + { + "id": "func:src/App.tsx#sortTasksForList@54", + "kind": "function", + "name": "sortTasksForList", + "qualifiedName": "sortTasksForList", + "location": { + "file": "src/App.tsx", + "startLine": 54, + "endLine": 60, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "sortTasksForList(tasks: Task[])", + "params": [ + { + "name": "tasks", + "typeRef": "Task[]", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/App.tsx#sort() 回调@55@55", + "kind": "function", + "name": "sort() 回调@55", + "qualifiedName": "sort() 回调@55", + "location": { + "file": "src/App.tsx", + "startLine": 55, + "endLine": 59, + "startCol": 26, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "sort() 回调@55(a, b)", + "params": [ + { + "name": "a", + "optional": false + }, + { + "name": "b", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:src/App.tsx#readStoredAuthUser@62", + "kind": "function", + "name": "readStoredAuthUser", + "qualifiedName": "readStoredAuthUser", + "location": { + "file": "src/App.tsx", + "startLine": 62, + "endLine": 82, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "readStoredAuthUser(): AuthUser | null", + "params": [], + "returnType": "AuthUser | null", + "loc": 21 + }, + { + "id": "func:src/App.tsx#App@84", + "kind": "function", + "name": "App", + "qualifiedName": "App", + "location": { + "file": "src/App.tsx", + "startLine": 84, + "endLine": 1974, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "App()", + "params": [], + "loc": 1891 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@133@133", + "kind": "function", + "name": "useEffect() 回调@133", + "qualifiedName": "useEffect() 回调@133", + "location": { + "file": "src/App.tsx", + "startLine": 133, + "endLine": 145, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@133()", + "params": [], + "loc": 13 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@147@147", + "kind": "function", + "name": "useEffect() 回调@147", + "qualifiedName": "useEffect() 回调@147", + "location": { + "file": "src/App.tsx", + "startLine": 147, + "endLine": 151, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@147()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@153@153", + "kind": "function", + "name": "useEffect() 回调@153", + "qualifiedName": "useEffect() 回调@153", + "location": { + "file": "src/App.tsx", + "startLine": 153, + "endLine": 157, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@153()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@159@159", + "kind": "function", + "name": "useEffect() 回调@159", + "qualifiedName": "useEffect() 回调@159", + "location": { + "file": "src/App.tsx", + "startLine": 159, + "endLine": 164, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@159()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@171@171", + "kind": "function", + "name": "useEffect() 回调@171", + "qualifiedName": "useEffect() 回调@171", + "location": { + "file": "src/App.tsx", + "startLine": 171, + "endLine": 176, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@171()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@178@178", + "kind": "function", + "name": "useEffect() 回调@178", + "qualifiedName": "useEffect() 回调@178", + "location": { + "file": "src/App.tsx", + "startLine": 178, + "endLine": 184, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@178()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@186@186", + "kind": "function", + "name": "useEffect() 回调@186", + "qualifiedName": "useEffect() 回调@186", + "location": { + "file": "src/App.tsx", + "startLine": 186, + "endLine": 211, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@186()", + "params": [], + "loc": 26 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@213@213", + "kind": "function", + "name": "useEffect() 回调@213", + "qualifiedName": "useEffect() 回调@213", + "location": { + "file": "src/App.tsx", + "startLine": 213, + "endLine": 219, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@213()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/App.tsx#匿名函数@214@214", + "kind": "function", + "name": "匿名函数@214", + "qualifiedName": "匿名函数@214", + "location": { + "file": "src/App.tsx", + "startLine": 214, + "endLine": 218, + "startCol": 12, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "匿名函数@214()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/App.tsx#fetchTasks@221", + "kind": "function", + "name": "fetchTasks", + "qualifiedName": "fetchTasks", + "location": { + "file": "src/App.tsx", + "startLine": 221, + "endLine": 239, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "fetchTasks()", + "params": [], + "loc": 19, + "interactions": [ + { + "id": "ix:func:src/App.tsx#fetchTasks@221:api:out:GET:/api/tasks", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/tasks" + } + ] + }, + { + "id": "func:src/App.tsx#fetchPeople@241", + "kind": "function", + "name": "fetchPeople", + "qualifiedName": "fetchPeople", + "location": { + "file": "src/App.tsx", + "startLine": 241, + "endLine": 254, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "fetchPeople()", + "params": [], + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/App.tsx#fetchPeople@241:api:out:GET:/api/people", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/people" + } + ] + }, + { + "id": "func:src/App.tsx#fetchTags@256", + "kind": "function", + "name": "fetchTags", + "qualifiedName": "fetchTags", + "location": { + "file": "src/App.tsx", + "startLine": 256, + "endLine": 269, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "fetchTags()", + "params": [], + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/App.tsx#fetchTags@256:api:out:GET:/api/tags", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/tags" + } + ] + }, + { + "id": "func:src/App.tsx#handleCreateTag@271", + "kind": "function", + "name": "handleCreateTag", + "qualifiedName": "handleCreateTag", + "location": { + "file": "src/App.tsx", + "startLine": 271, + "endLine": 295, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCreateTag(name: string): Promise", + "params": [ + { + "name": "name", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 25, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleCreateTag@271:api:out:POST:/api/tags", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tags" + } + ] + }, + { + "id": "func:src/App.tsx#setTags() 回调@281@281", + "kind": "function", + "name": "setTags() 回调@281", + "qualifiedName": "setTags() 回调@281", + "location": { + "file": "src/App.tsx", + "startLine": 281, + "endLine": 284, + "startCol": 17, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "setTags() 回调@281(prev)", + "params": [ + { + "name": "prev", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/App.tsx#handleDeleteTag@297", + "kind": "function", + "name": "handleDeleteTag", + "qualifiedName": "handleDeleteTag", + "location": { + "file": "src/App.tsx", + "startLine": 297, + "endLine": 321, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleDeleteTag(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 25, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleDeleteTag@297:api:out:DELETE:`/api/tags/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "`/api/tags/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#fetchProjectTemplates@323", + "kind": "function", + "name": "fetchProjectTemplates", + "qualifiedName": "fetchProjectTemplates", + "location": { + "file": "src/App.tsx", + "startLine": 323, + "endLine": 336, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "fetchProjectTemplates()", + "params": [], + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/App.tsx#fetchProjectTemplates@323:api:out:GET:/api/project-templates", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/project-templates" + } + ] + }, + { + "id": "func:src/App.tsx#fetchWeeklyPlans@338", + "kind": "function", + "name": "fetchWeeklyPlans", + "qualifiedName": "fetchWeeklyPlans", + "location": { + "file": "src/App.tsx", + "startLine": 338, + "endLine": 351, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "fetchWeeklyPlans()", + "params": [], + "loc": 14, + "interactions": [ + { + "id": "ix:func:src/App.tsx#fetchWeeklyPlans@338:api:out:GET:/api/weekly-plans", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "/api/weekly-plans" + } + ] + }, + { + "id": "func:src/App.tsx#handleCreateWeeklyPlan@353", + "kind": "function", + "name": "handleCreateWeeklyPlan", + "qualifiedName": "handleCreateWeeklyPlan", + "location": { + "file": "src/App.tsx", + "startLine": 353, + "endLine": 383, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCreateWeeklyPlan(input: Omit): Promise", + "params": [ + { + "name": "input", + "typeRef": "Omit", + "optional": false + } + ], + "returnType": "Promise", + "loc": 31, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleCreateWeeklyPlan@353:api:out:POST:/api/weekly-plans", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/weekly-plans" + } + ] + }, + { + "id": "func:src/App.tsx#handleDeleteWeeklyPlan@385", + "kind": "function", + "name": "handleDeleteWeeklyPlan", + "qualifiedName": "handleDeleteWeeklyPlan", + "location": { + "file": "src/App.tsx", + "startLine": 385, + "endLine": 425, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleDeleteWeeklyPlan(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 41, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleDeleteWeeklyPlan@385:api:out:DELETE:`/api/weekly-plans/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "`/api/weekly-plans/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#setWeeklyPlans() 回调@402@402", + "kind": "function", + "name": "setWeeklyPlans() 回调@402", + "qualifiedName": "setWeeklyPlans() 回调@402", + "location": { + "file": "src/App.tsx", + "startLine": 402, + "endLine": 407, + "startCol": 22, + "endCol": 8 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "setWeeklyPlans() 回调@402(prev)", + "params": [ + { + "name": "prev", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/App.tsx#handleCreateProjectTemplate@427", + "kind": "function", + "name": "handleCreateProjectTemplate", + "qualifiedName": "handleCreateProjectTemplate", + "location": { + "file": "src/App.tsx", + "startLine": 427, + "endLine": 448, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCreateProjectTemplate(input: Omit): Promise", + "params": [ + { + "name": "input", + "typeRef": "Omit", + "optional": false + } + ], + "returnType": "Promise", + "loc": 22, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleCreateProjectTemplate@427:api:out:POST:/api/project-templates", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/project-templates" + } + ] + }, + { + "id": "func:src/App.tsx#handleUpdateProjectTemplate@450", + "kind": "function", + "name": "handleUpdateProjectTemplate", + "qualifiedName": "handleUpdateProjectTemplate", + "location": { + "file": "src/App.tsx", + "startLine": 450, + "endLine": 476, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleUpdateProjectTemplate(id: string, input: Omit): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + }, + { + "name": "input", + "typeRef": "Omit", + "optional": false + } + ], + "returnType": "Promise", + "loc": 27, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleUpdateProjectTemplate@450:api:out:PUT:`/api/project-templates/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "`/api/project-templates/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleDeleteProjectTemplate@478", + "kind": "function", + "name": "handleDeleteProjectTemplate", + "qualifiedName": "handleDeleteProjectTemplate", + "location": { + "file": "src/App.tsx", + "startLine": 478, + "endLine": 496, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleDeleteProjectTemplate(id: string): Promise", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 19, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleDeleteProjectTemplate@478:api:out:DELETE:`/api/project-templates/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "`/api/project-templates/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleCreatePerson@498", + "kind": "function", + "name": "handleCreatePerson", + "qualifiedName": "handleCreatePerson", + "location": { + "file": "src/App.tsx", + "startLine": 498, + "endLine": 519, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCreatePerson(input: { name: string; role: string })", + "params": [ + { + "name": "input", + "typeRef": "{ name: string; role: string }", + "optional": false + } + ], + "loc": 22, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleCreatePerson@498:api:out:POST:/api/people", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/people" + } + ] + }, + { + "id": "func:src/App.tsx#setPeople() 回调@508@508", + "kind": "function", + "name": "setPeople() 回调@508", + "qualifiedName": "setPeople() 回调@508", + "location": { + "file": "src/App.tsx", + "startLine": 508, + "endLine": 511, + "startCol": 19, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "setPeople() 回调@508(prev)", + "params": [ + { + "name": "prev", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/App.tsx#handleJoinSsoPerson@521", + "kind": "function", + "name": "handleJoinSsoPerson", + "qualifiedName": "handleJoinSsoPerson", + "location": { + "file": "src/App.tsx", + "startLine": 521, + "endLine": 546, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleJoinSsoPerson(authCode: string): Promise", + "params": [ + { + "name": "authCode", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 26, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleJoinSsoPerson@521:api:out:POST:/api/auth/sso-join-person", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/sso-join-person" + } + ] + }, + { + "id": "func:src/App.tsx#setPeople() 回调@532@532", + "kind": "function", + "name": "setPeople() 回调@532", + "qualifiedName": "setPeople() 回调@532", + "location": { + "file": "src/App.tsx", + "startLine": 532, + "endLine": 535, + "startCol": 19, + "endCol": 10 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "setPeople() 回调@532(prev)", + "params": [ + { + "name": "prev", + "optional": false + } + ], + "loc": 4 + }, + { + "id": "func:src/App.tsx#handleDeletePerson@548", + "kind": "function", + "name": "handleDeletePerson", + "qualifiedName": "handleDeletePerson", + "location": { + "file": "src/App.tsx", + "startLine": 548, + "endLine": 563, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleDeletePerson(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 16, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleDeletePerson@548:api:out:DELETE:`/api/people/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "`/api/people/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleUpdatePersonRole@565", + "kind": "function", + "name": "handleUpdatePersonRole", + "qualifiedName": "handleUpdatePersonRole", + "location": { + "file": "src/App.tsx", + "startLine": 565, + "endLine": 603, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleUpdatePersonRole(person: Person, role: string)", + "params": [ + { + "name": "person", + "typeRef": "Person", + "optional": false + }, + { + "name": "role", + "typeRef": "string", + "optional": false + } + ], + "loc": 39, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleUpdatePersonRole@565:api:out:PUT:`/api/people/${person.id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "`/api/people/${person.id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleTogglePersonAdmin@605", + "kind": "function", + "name": "handleTogglePersonAdmin", + "qualifiedName": "handleTogglePersonAdmin", + "location": { + "file": "src/App.tsx", + "startLine": 605, + "endLine": 637, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleTogglePersonAdmin(person: Person, isPersonAdmin: boolean)", + "params": [ + { + "name": "person", + "typeRef": "Person", + "optional": false + }, + { + "name": "isPersonAdmin", + "typeRef": "boolean", + "optional": false + } + ], + "loc": 33, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleTogglePersonAdmin@605:api:out:PUT:`/api/people/${person.id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "`/api/people/${person.id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleLogin@639", + "kind": "function", + "name": "handleLogin", + "qualifiedName": "handleLogin", + "location": { + "file": "src/App.tsx", + "startLine": 639, + "endLine": 648, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleLogin(user: AuthUser)", + "params": [ + { + "name": "user", + "typeRef": "AuthUser", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/App.tsx#handleUnlockAdmin@650", + "kind": "function", + "name": "handleUnlockAdmin", + "qualifiedName": "handleUnlockAdmin", + "location": { + "file": "src/App.tsx", + "startLine": 650, + "endLine": 676, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleUnlockAdmin(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 27, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleUnlockAdmin@650:api:out:POST:/api/auth/manual-login", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/auth/manual-login" + } + ] + }, + { + "id": "func:src/App.tsx#handleCurrentUserClick@678", + "kind": "function", + "name": "handleCurrentUserClick", + "qualifiedName": "handleCurrentUserClick", + "location": { + "file": "src/App.tsx", + "startLine": 678, + "endLine": 694, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCurrentUserClick()", + "params": [], + "loc": 17 + }, + { + "id": "func:src/App.tsx#handleLogout@696", + "kind": "function", + "name": "handleLogout", + "qualifiedName": "handleLogout", + "location": { + "file": "src/App.tsx", + "startLine": 696, + "endLine": 717, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleLogout()", + "params": [], + "loc": 22 + }, + { + "id": "func:src/App.tsx#useMemo() 回调@720@720", + "kind": "function", + "name": "useMemo() 回调@720", + "qualifiedName": "useMemo() 回调@720", + "location": { + "file": "src/App.tsx", + "startLine": 720, + "endLine": 724, + "startCol": 32, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useMemo() 回调@720()", + "params": [], + "loc": 5 + }, + { + "id": "func:src/App.tsx#useMemo() 回调@726@726", + "kind": "function", + "name": "useMemo() 回调@726", + "qualifiedName": "useMemo() 回调@726", + "location": { + "file": "src/App.tsx", + "startLine": 726, + "endLine": 728, + "startCol": 30, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useMemo() 回调@726()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/App.tsx#useMemo() 回调@730@730", + "kind": "function", + "name": "useMemo() 回调@730", + "qualifiedName": "useMemo() 回调@730", + "location": { + "file": "src/App.tsx", + "startLine": 730, + "endLine": 732, + "startCol": 43, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useMemo() 回调@730()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@734@734", + "kind": "function", + "name": "useEffect() 回调@734", + "qualifiedName": "useEffect() 回调@734", + "location": { + "file": "src/App.tsx", + "startLine": 734, + "endLine": 748, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@734()", + "params": [], + "loc": 15 + }, + { + "id": "func:src/App.tsx#handleSelectWeeklyPlan@750", + "kind": "function", + "name": "handleSelectWeeklyPlan", + "qualifiedName": "handleSelectWeeklyPlan", + "location": { + "file": "src/App.tsx", + "startLine": 750, + "endLine": 759, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleSelectWeeklyPlan(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", + "kind": "function", + "name": "handleMoveTaskToWeeklyPlan", + "qualifiedName": "handleMoveTaskToWeeklyPlan", + "location": { + "file": "src/App.tsx", + "startLine": 761, + "endLine": 796, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleMoveTaskToWeeklyPlan(taskId: string, weeklyPlanId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "weeklyPlanId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 36, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761:api:out:PUT:`/api/tasks/${taskId}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "`/api/tasks/${taskId}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleReorderTask@798", + "kind": "function", + "name": "handleReorderTask", + "qualifiedName": "handleReorderTask", + "location": { + "file": "src/App.tsx", + "startLine": 798, + "endLine": 847, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleReorderTask(taskId: string, beforeTaskId: string | null)", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "beforeTaskId", + "typeRef": "string | null", + "optional": false + } + ], + "loc": 50, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleReorderTask@798:api:out:PATCH:`/api/tasks/${task.id}/list-state`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PATCH", + "path": "`/api/tasks/${task.id}/list-state`" + } + ] + }, + { + "id": "func:src/App.tsx#handleSelectTask@849", + "kind": "function", + "name": "handleSelectTask", + "qualifiedName": "handleSelectTask", + "location": { + "file": "src/App.tsx", + "startLine": 849, + "endLine": 854, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleSelectTask(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/App.tsx#handleStartCreateProject@856", + "kind": "function", + "name": "handleStartCreateProject", + "qualifiedName": "handleStartCreateProject", + "location": { + "file": "src/App.tsx", + "startLine": 856, + "endLine": 863, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleStartCreateProject()", + "params": [], + "loc": 8 + }, + { + "id": "func:src/App.tsx#handleCancelCreateProject@865", + "kind": "function", + "name": "handleCancelCreateProject", + "qualifiedName": "handleCancelCreateProject", + "location": { + "file": "src/App.tsx", + "startLine": 865, + "endLine": 868, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCancelCreateProject()", + "params": [], + "loc": 4 + }, + { + "id": "func:src/App.tsx#handleSelectNode@870", + "kind": "function", + "name": "handleSelectNode", + "qualifiedName": "handleSelectNode", + "location": { + "file": "src/App.tsx", + "startLine": 870, + "endLine": 875, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleSelectNode(nodeId: string | null)", + "params": [ + { + "name": "nodeId", + "typeRef": "string | null", + "optional": false + } + ], + "loc": 6 + }, + { + "id": "func:src/App.tsx#handleOpenTaskFromOverview@877", + "kind": "function", + "name": "handleOpenTaskFromOverview", + "qualifiedName": "handleOpenTaskFromOverview", + "location": { + "file": "src/App.tsx", + "startLine": 877, + "endLine": 886, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleOpenTaskFromOverview(task: Task)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/App.tsx#handleOpenPlanFromOverview@888", + "kind": "function", + "name": "handleOpenPlanFromOverview", + "qualifiedName": "handleOpenPlanFromOverview", + "location": { + "file": "src/App.tsx", + "startLine": 888, + "endLine": 897, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleOpenPlanFromOverview(planId: string)", + "params": [ + { + "name": "planId", + "typeRef": "string", + "optional": false + } + ], + "loc": 10 + }, + { + "id": "func:src/App.tsx#handleSelectTaskNode@899", + "kind": "function", + "name": "handleSelectTaskNode", + "qualifiedName": "handleSelectTaskNode", + "location": { + "file": "src/App.tsx", + "startLine": 899, + "endLine": 907, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleSelectTaskNode(taskId: string, nodeId: string)", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "nodeId", + "typeRef": "string", + "optional": false + } + ], + "loc": 9 + }, + { + "id": "func:src/App.tsx#handleNavigateDrawerView@926", + "kind": "function", + "name": "handleNavigateDrawerView", + "qualifiedName": "handleNavigateDrawerView", + "location": { + "file": "src/App.tsx", + "startLine": 926, + "endLine": 955, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleNavigateDrawerView(target: 'project-graph' | 'project-gantt' | 'person-gantt')", + "params": [ + { + "name": "target", + "typeRef": "'project-graph' | 'project-gantt' | 'person-gantt'", + "optional": false + } + ], + "loc": 30 + }, + { + "id": "func:src/App.tsx#handleWorkspaceClick@957", + "kind": "function", + "name": "handleWorkspaceClick", + "qualifiedName": "handleWorkspaceClick", + "location": { + "file": "src/App.tsx", + "startLine": 957, + "endLine": 978, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleWorkspaceClick(event: React.MouseEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.MouseEvent", + "optional": false + } + ], + "loc": 22 + }, + { + "id": "func:src/App.tsx#computeCenteredViewport@981", + "kind": "function", + "name": "computeCenteredViewport", + "qualifiedName": "computeCenteredViewport", + "location": { + "file": "src/App.tsx", + "startLine": 981, + "endLine": 1014, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "computeCenteredViewport(task: Task)", + "params": [ + { + "name": "task", + "typeRef": "Task", + "optional": false + } + ], + "loc": 34 + }, + { + "id": "func:src/App.tsx#focusNodeInCanvas@1016", + "kind": "function", + "name": "focusNodeInCanvas", + "qualifiedName": "focusNodeInCanvas", + "location": { + "file": "src/App.tsx", + "startLine": 1016, + "endLine": 1062, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "focusNodeInCanvas(node: WorkflowNode)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 47 + }, + { + "id": "func:src/App.tsx#animate@1042", + "kind": "function", + "name": "animate", + "qualifiedName": "animate", + "location": { + "file": "src/App.tsx", + "startLine": 1042, + "endLine": 1059, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "animate(now: number)", + "params": [ + { + "name": "now", + "typeRef": "number", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", + "kind": "function", + "name": "revealNodeIfCoveredByDrawer", + "qualifiedName": "revealNodeIfCoveredByDrawer", + "location": { + "file": "src/App.tsx", + "startLine": 1064, + "endLine": 1107, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "revealNodeIfCoveredByDrawer(node: WorkflowNode)", + "params": [ + { + "name": "node", + "typeRef": "WorkflowNode", + "optional": false + } + ], + "loc": 44 + }, + { + "id": "func:src/App.tsx#animate@1088", + "kind": "function", + "name": "animate", + "qualifiedName": "animate", + "location": { + "file": "src/App.tsx", + "startLine": 1088, + "endLine": 1104, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "animate(now: number)", + "params": [ + { + "name": "now", + "typeRef": "number", + "optional": false + } + ], + "loc": 17 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@1109@1109", + "kind": "function", + "name": "useEffect() 回调@1109", + "qualifiedName": "useEffect() 回调@1109", + "location": { + "file": "src/App.tsx", + "startLine": 1109, + "endLine": 1119, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@1109()", + "params": [], + "loc": 11 + }, + { + "id": "func:src/App.tsx#useEffect() 回调@1121@1121", + "kind": "function", + "name": "useEffect() 回调@1121", + "qualifiedName": "useEffect() 回调@1121", + "location": { + "file": "src/App.tsx", + "startLine": 1121, + "endLine": 1130, + "startCol": 13, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useEffect() 回调@1121()", + "params": [], + "loc": 10 + }, + { + "id": "func:src/App.tsx#useLayoutEffect() 回调@1134@1134", + "kind": "function", + "name": "useLayoutEffect() 回调@1134", + "qualifiedName": "useLayoutEffect() 回调@1134", + "location": { + "file": "src/App.tsx", + "startLine": 1134, + "endLine": 1162, + "startCol": 19, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "useLayoutEffect() 回调@1134()", + "params": [], + "loc": 29 + }, + { + "id": "func:src/App.tsx#applyCentered@1149", + "kind": "function", + "name": "applyCentered", + "qualifiedName": "applyCentered", + "location": { + "file": "src/App.tsx", + "startLine": 1149, + "endLine": 1156, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "applyCentered()", + "params": [], + "loc": 8 + }, + { + "id": "func:src/App.tsx#handleCreateTask@1165", + "kind": "function", + "name": "handleCreateTask", + "qualifiedName": "handleCreateTask", + "location": { + "file": "src/App.tsx", + "startLine": 1165, + "endLine": 1209, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleCreateTask(name: string, description: string, priority: TaskPriority, tags: string[], requirementDocUrl: string, nodes: WorkflowNode[]): Promise", + "params": [ + { + "name": "name", + "typeRef": "string", + "optional": false + }, + { + "name": "description", + "typeRef": "string", + "optional": false + }, + { + "name": "priority", + "typeRef": "TaskPriority", + "optional": false + }, + { + "name": "tags", + "typeRef": "string[]", + "optional": false + }, + { + "name": "requirementDocUrl", + "typeRef": "string", + "optional": false + }, + { + "name": "nodes", + "typeRef": "WorkflowNode[]", + "optional": true + } + ], + "returnType": "Promise", + "loc": 45, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleCreateTask@1165:api:out:POST:/api/tasks", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tasks" + } + ] + }, + { + "id": "func:src/App.tsx#handleQuickRequirement@1212", + "kind": "function", + "name": "handleQuickRequirement", + "qualifiedName": "handleQuickRequirement", + "location": { + "file": "src/App.tsx", + "startLine": 1212, + "endLine": 1217, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleQuickRequirement()", + "params": [], + "loc": 6 + }, + { + "id": "func:src/App.tsx#handleSubmitRequirement@1219", + "kind": "function", + "name": "handleSubmitRequirement", + "qualifiedName": "handleSubmitRequirement", + "location": { + "file": "src/App.tsx", + "startLine": 1219, + "endLine": 1276, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleSubmitRequirement(event: React.FormEvent)", + "params": [ + { + "name": "event", + "typeRef": "React.FormEvent", + "optional": false + } + ], + "loc": 58, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleSubmitRequirement@1219:api:out:POST:/api/tasks", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "POST", + "path": "/api/tasks" + } + ] + }, + { + "id": "func:src/App.tsx#handleToggleTaskPinned@1278", + "kind": "function", + "name": "handleToggleTaskPinned", + "qualifiedName": "handleToggleTaskPinned", + "location": { + "file": "src/App.tsx", + "startLine": 1278, + "endLine": 1296, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleToggleTaskPinned(taskId: string, isPinned: boolean)", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + }, + { + "name": "isPinned", + "typeRef": "boolean", + "optional": false + } + ], + "loc": 19, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleToggleTaskPinned@1278:api:out:PATCH:`/api/tasks/${taskId}/list-state`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PATCH", + "path": "`/api/tasks/${taskId}/list-state`" + } + ] + }, + { + "id": "func:src/App.tsx#handleDeleteTask@1299", + "kind": "function", + "name": "handleDeleteTask", + "qualifiedName": "handleDeleteTask", + "location": { + "file": "src/App.tsx", + "startLine": 1299, + "endLine": 1326, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleDeleteTask(id: string)", + "params": [ + { + "name": "id", + "typeRef": "string", + "optional": false + } + ], + "loc": 28, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleDeleteTask@1299:api:out:DELETE:`/api/tasks/${id}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "DELETE", + "path": "`/api/tasks/${id}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleUpdateTaskMetadata@1329", + "kind": "function", + "name": "handleUpdateTaskMetadata", + "qualifiedName": "handleUpdateTaskMetadata", + "location": { + "file": "src/App.tsx", + "startLine": 1329, + "endLine": 1351, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleUpdateTaskMetadata(updatedMetadata: Partial)", + "params": [ + { + "name": "updatedMetadata", + "typeRef": "Partial", + "optional": false + } + ], + "loc": 23, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleUpdateTaskMetadata@1329:api:out:PUT:`/api/tasks/${selectedTaskId}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "PUT", + "path": "`/api/tasks/${selectedTaskId}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleRefreshTask@1353", + "kind": "function", + "name": "handleRefreshTask", + "qualifiedName": "handleRefreshTask", + "location": { + "file": "src/App.tsx", + "startLine": 1353, + "endLine": 1368, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleRefreshTask(taskId: string): Promise", + "params": [ + { + "name": "taskId", + "typeRef": "string", + "optional": false + } + ], + "returnType": "Promise", + "loc": 16, + "interactions": [ + { + "id": "ix:func:src/App.tsx#handleRefreshTask@1353:api:out:GET:`/api/tasks/${taskId}`", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET", + "path": "`/api/tasks/${taskId}`" + } + ] + }, + { + "id": "func:src/App.tsx#handleUpdateNodes@1371", + "kind": "function", + "name": "handleUpdateNodes", + "qualifiedName": "handleUpdateNodes", + "location": { + "file": "src/App.tsx", + "startLine": 1371, + "endLine": 1490, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "handleUpdateNodes(updatedNodes: WorkflowNode[], options: { persist?: boolean; forceNodeIds?: string[] })", + "params": [ + { + "name": "updatedNodes", + "typeRef": "WorkflowNode[]", + "optional": false + }, + { + "name": "options", + "typeRef": "{ persist?: boolean; forceNodeIds?: string[] }", + "optional": true, + "defaultValue": "{}" + } + ], + "loc": 120 + }, + { + "id": "func:src/App.tsx#edgeKey@1383", + "kind": "function", + "name": "edgeKey", + "qualifiedName": "edgeKey", + "location": { + "file": "src/App.tsx", + "startLine": 1383, + "endLine": 1383, + "startCol": 11, + "endCol": 85 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "edgeKey(parentId: string, childId: string)", + "params": [ + { + "name": "parentId", + "typeRef": "string", + "optional": false + }, + { + "name": "childId", + "typeRef": "string", + "optional": false + } + ], + "loc": 1 + }, + { + "id": "func:src/App.tsx#filter() 回调@1393@1393", + "kind": "function", + "name": "filter() 回调@1393", + "qualifiedName": "filter() 回调@1393", + "location": { + "file": "src/App.tsx", + "startLine": 1393, + "endLine": 1410, + "startCol": 58, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "filter() 回调@1393(node)", + "params": [ + { + "name": "node", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/App.tsx#requestTaskUpdate@1425", + "kind": "function", + "name": "requestTaskUpdate", + "qualifiedName": "requestTaskUpdate", + "location": { + "file": "src/App.tsx", + "startLine": 1425, + "endLine": 1437, + "startCol": 11, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "requestTaskUpdate(url: string, init: RequestInit, fallback: string)", + "params": [ + { + "name": "url", + "typeRef": "string", + "optional": false + }, + { + "name": "init", + "typeRef": "RequestInit", + "optional": false + }, + { + "name": "fallback", + "typeRef": "string", + "optional": false + } + ], + "loc": 13, + "interactions": [ + { + "id": "ix:func:src/App.tsx#requestTaskUpdate@1425:api:out:GET:", + "kind": "api", + "direction": "out", + "provenance": "resolved", + "protocol": "http", + "method": "GET" + } + ] + }, + { + "id": "func:src/App.tsx#map() 回调@1526@1526", + "kind": "function", + "name": "map() 回调@1526", + "qualifiedName": "map() 回调@1526", + "location": { + "file": "src/App.tsx", + "startLine": 1526, + "endLine": 1550, + "startCol": 19, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "map() 回调@1526(item)", + "params": [ + { + "name": "item", + "optional": false + } + ], + "loc": 25 + }, + { + "id": "func:src/App.tsx#匿名函数@1533@1533", + "kind": "function", + "name": "匿名函数@1533", + "qualifiedName": "匿名函数@1533", + "location": { + "file": "src/App.tsx", + "startLine": 1533, + "endLine": 1539, + "startCol": 28, + "endCol": 20 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "匿名函数@1533()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/App.tsx#匿名函数@1557@1557", + "kind": "function", + "name": "匿名函数@1557", + "qualifiedName": "匿名函数@1557", + "location": { + "file": "src/App.tsx", + "startLine": 1557, + "endLine": 1563, + "startCol": 22, + "endCol": 14 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "匿名函数@1557()", + "params": [], + "loc": 7 + }, + { + "id": "func:src/App.tsx#map() 回调@1700@1700", + "kind": "function", + "name": "map() 回调@1700", + "qualifiedName": "map() 回调@1700", + "location": { + "file": "src/App.tsx", + "startLine": 1700, + "endLine": 1717, + "startCol": 36, + "endCol": 16 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/App.tsx", + "moduleId": "module:src", + "signature": "map() 回调@1700(priority)", + "params": [ + { + "name": "priority", + "optional": false + } + ], + "loc": 18 + }, + { + "id": "func:src/components/DingTalkLogs.tsx#DingTalkLogs@11", + "kind": "function", + "name": "DingTalkLogs", + "qualifiedName": "DingTalkLogs", + "location": { + "file": "src/components/DingTalkLogs.tsx", + "startLine": 11, + "endLine": 158, + "startCol": 1, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/DingTalkLogs.tsx", + "moduleId": "module:src/components", + "signature": "DingTalkLogs({ logs, onClearLogs, onRefreshLogs }: DingTalkLogsProps)", + "params": [ + { + "name": "{ logs, onClearLogs, onRefreshLogs }", + "typeRef": "DingTalkLogsProps", + "optional": false + } + ], + "loc": 148 + }, + { + "id": "func:src/components/DingTalkLogs.tsx#copyToClipboard@14", + "kind": "function", + "name": "copyToClipboard", + "qualifiedName": "copyToClipboard", + "location": { + "file": "src/components/DingTalkLogs.tsx", + "startLine": 14, + "endLine": 20, + "startCol": 9, + "endCol": 4 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/DingTalkLogs.tsx", + "moduleId": "module:src/components", + "signature": "copyToClipboard(text: string, logId: string)", + "params": [ + { + "name": "text", + "typeRef": "string", + "optional": false + }, + { + "name": "logId", + "typeRef": "string", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:src/components/DingTalkLogs.tsx#setTimeout() 回调@17@17", + "kind": "function", + "name": "setTimeout() 回调@17", + "qualifiedName": "setTimeout() 回调@17", + "location": { + "file": "src/components/DingTalkLogs.tsx", + "startLine": 17, + "endLine": 19, + "startCol": 16, + "endCol": 6 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/DingTalkLogs.tsx", + "moduleId": "module:src/components", + "signature": "setTimeout() 回调@17()", + "params": [], + "loc": 3 + }, + { + "id": "func:src/components/DingTalkLogs.tsx#map() 回调@76@76", + "kind": "function", + "name": "map() 回调@76", + "qualifiedName": "map() 回调@76", + "location": { + "file": "src/components/DingTalkLogs.tsx", + "startLine": 76, + "endLine": 153, + "startCol": 21, + "endCol": 12 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/DingTalkLogs.tsx", + "moduleId": "module:src/components", + "signature": "map() 回调@76(log)", + "params": [ + { + "name": "log", + "optional": false + } + ], + "loc": 78 + }, + { + "id": "func:vite.config.ts#normalizeBasePath@6", + "kind": "function", + "name": "normalizeBasePath", + "qualifiedName": "normalizeBasePath", + "location": { + "file": "vite.config.ts", + "startLine": 6, + "endLine": 10, + "startCol": 1, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:vite.config.ts", + "moduleId": "module:.", + "signature": "normalizeBasePath(value: string)", + "params": [ + { + "name": "value", + "typeRef": "string", + "optional": false + } + ], + "loc": 5 + }, + { + "id": "func:vite.config.ts#defineConfig() 回调@12@12", + "kind": "function", + "name": "defineConfig() 回调@12", + "qualifiedName": "defineConfig() 回调@12", + "location": { + "file": "vite.config.ts", + "startLine": 12, + "endLine": 38, + "startCol": 29, + "endCol": 2 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:vite.config.ts", + "moduleId": "module:.", + "signature": "defineConfig() 回调@12()", + "params": [], + "loc": 27 + }, + { + "id": "func:prisma.config.ts#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "prisma.config.ts", + "startLine": 1, + "endLine": 14 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma.config.ts", + "moduleId": "module:.", + "params": [], + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:prisma/seed.ts#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "prisma/seed.ts", + "startLine": 1, + "endLine": 110 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:prisma/seed.ts", + "moduleId": "module:prisma", + "params": [], + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:src/server/aiChatService.ts#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "src/server/aiChatService.ts", + "startLine": 1, + "endLine": 261 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:src/server/aiChatService.ts", + "moduleId": "module:src/server", + "params": [], + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:server.ts#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "server.ts", + "startLine": 1, + "endLine": 1261 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:server.ts", + "moduleId": "module:.", + "params": [], + "isEntry": true, + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:src/components/NodeEditorDrawer.tsx#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "src/components/NodeEditorDrawer.tsx", + "startLine": 1, + "endLine": 756 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/components/NodeEditorDrawer.tsx", + "moduleId": "module:src/components", + "params": [], + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:src/main.tsx#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "src/main.tsx", + "startLine": 1, + "endLine": 11 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:src/main.tsx", + "moduleId": "module:src", + "params": [], + "isEntry": true, + "summary": "模块顶层代码(副作用/初始化)" + }, + { + "id": "func:vite.config.ts#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "vite.config.ts", + "startLine": 1, + "endLine": 39 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:vite.config.ts", + "moduleId": "module:.", + "params": [], + "summary": "模块顶层代码(副作用/初始化)" + } + ], + "fields": [], + "edges": [ + { + "id": "edge:import:file:src/server/defaultData.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/defaultData.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:prisma/seed.ts=>file:src/server/defaultData.ts", + "kind": "import", + "sourceId": "file:prisma/seed.ts", + "targetId": "file:src/server/defaultData.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:prisma/seed.ts#seed@13=>func:prisma/seed.ts#dateFromInput@9", + "kind": "call", + "sourceId": "func:prisma/seed.ts#seed@13", + "targetId": "func:prisma/seed.ts#dateFromInput@9", + "provenance": "resolved" + }, + { + "id": "edge:call:func:prisma/seed.ts#@0=>func:prisma/seed.ts#seed@13", + "kind": "call", + "sourceId": "func:prisma/seed.ts#@0", + "targetId": "func:prisma/seed.ts#seed@13", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/weeklyPlanRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/weeklyPlanRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/weeklyPlanRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/weeklyPlanRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "targetId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "targetId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "targetId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "targetId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "targetId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "targetId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "targetId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "targetId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "targetId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "targetId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "kind": "call", + "sourceId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "targetId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/taskRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/taskRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/taskRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/taskRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/taskRepository.ts=>file:src/server/weeklyPlanRepository.ts", + "kind": "import", + "sourceId": "file:src/server/taskRepository.ts", + "targetId": "file:src/server/weeklyPlanRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#existingTagNames@96=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#existingTagNames@96", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#dateToInput@36", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "targetId": "func:src/server/taskRepository.ts#dateToInput@36", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#toTask@163", + "targetId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#toTask@163", + "targetId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "targetId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "targetId": "func:src/server/taskRepository.ts#toTask@163", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#getTask@190=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#getTask@190", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#existingTagNames@96", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/taskRepository.ts#existingTagNames@96", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "targetId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "targetId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#replaceTaskNodes@605", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "targetId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createTask@227", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateTask@302", + "targetId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "targetId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "targetId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#existingTagNames@96", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "targetId": "func:src/server/taskRepository.ts#existingTagNames@96", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#replaceTaskNodes@605", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "targetId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateTask@302", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateTaskListState@353", + "targetId": "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateTaskListState@353", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#ensureTaskExists@560", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createWorkflowNode@389", + "targetId": "func:src/server/taskRepository.ts#ensureTaskExists@560", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#dateFromInput@31", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "targetId": "func:src/server/taskRepository.ts#dateFromInput@31", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "targetId": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createWorkflowNode@389", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "targetId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#dateFromInput@31", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "targetId": "func:src/server/taskRepository.ts#dateFromInput@31", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "targetId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createNodeDependency@494", + "targetId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#hasDependencyPath@577", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createNodeDependency@494", + "targetId": "func:src/server/taskRepository.ts#hasDependencyPath@577", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#createNodeDependency@494", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#ensureTaskExists@560", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "targetId": "func:src/server/taskRepository.ts#ensureTaskExists@560", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "targetId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#map() 回调@618@618", + "targetId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#dateFromInput@31", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#map() 回调@618@618", + "targetId": "func:src/server/taskRepository.ts#dateFromInput@31", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#map() 回调@618@618", + "targetId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/taskRepository.ts#replaceTaskNodes@605=>func:src/server/taskRepository.ts#uniqueValues@40", + "kind": "call", + "sourceId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "targetId": "func:src/server/taskRepository.ts#uniqueValues@40", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/notificationRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/notificationRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/notificationRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/notificationRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/notificationRepository.ts#createNotificationLog@37=>func:src/server/notificationRepository.ts#toNotificationLog@17", + "kind": "call", + "sourceId": "func:src/server/notificationRepository.ts#createNotificationLog@37", + "targetId": "func:src/server/notificationRepository.ts#toNotificationLog@17", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/projectTemplateRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/projectTemplateRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/projectTemplateRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/projectTemplateRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "targetId": "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "targetId": "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "targetId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "targetId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "targetId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "targetId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "targetId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "targetId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "kind": "call", + "sourceId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "targetId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/tagRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/tagRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/tagRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/tagRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/tagRepository.ts#createTagDefinition@19=>func:src/server/tagRepository.ts#toTagDefinition@4", + "kind": "call", + "sourceId": "func:src/server/tagRepository.ts#createTagDefinition@19", + "targetId": "func:src/server/tagRepository.ts#toTagDefinition@4", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/personRepository.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/personRepository.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/personRepository.ts=>file:src/server/db.ts", + "kind": "import", + "sourceId": "file:src/server/personRepository.ts", + "targetId": "file:src/server/db.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "kind": "call", + "sourceId": "func:src/server/personRepository.ts#listPeople@53", + "targetId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/personRepository.ts#getPersonOrThrow@64=>func:src/server/personRepository.ts#toPerson@4", + "kind": "call", + "sourceId": "func:src/server/personRepository.ts#getPersonOrThrow@64", + "targetId": "func:src/server/personRepository.ts#toPerson@4", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", + "kind": "call", + "sourceId": "func:src/server/personRepository.ts#createPerson@73", + "targetId": "func:src/server/personRepository.ts#toPerson@4", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/personRepository.ts#updatePerson@142=>func:src/server/personRepository.ts#toPerson@4", + "kind": "call", + "sourceId": "func:src/server/personRepository.ts#updatePerson@142", + "targetId": "func:src/server/personRepository.ts#toPerson@4", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/server/botQueryTools.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/server/personRepository.ts", + "kind": "import", + "sourceId": "file:src/server/botQueryTools.ts", + "targetId": "file:src/server/personRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/server/taskRepository.ts", + "kind": "import", + "sourceId": "file:src/server/botQueryTools.ts", + "targetId": "file:src/server/taskRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/server/botQueryTools.ts=>file:src/server/weeklyPlanRepository.ts", + "kind": "import", + "sourceId": "file:src/server/botQueryTools.ts", + "targetId": "file:src/server/weeklyPlanRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getTodayStr@10=>func:src/server/botQueryTools.ts#value@17", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getTodayStr@10", + "targetId": "func:src/server/botQueryTools.ts#value@17", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "targetId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "targetId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#createBotQueryContext@116=>func:src/server/botQueryTools.ts#getTodayStr@10", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "targetId": "func:src/server/botQueryTools.ts#getTodayStr@10", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getTasks@124=>func:src/server/taskRepository.ts#listTasks@194", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getTasks@124", + "targetId": "func:src/server/taskRepository.ts#listTasks@194", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getPeople@125=>func:src/server/personRepository.ts#listPeople@53", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getPeople@125", + "targetId": "func:src/server/personRepository.ts#listPeople@53", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#getWeeklyPlans@126=>func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#getWeeklyPlans@126", + "targetId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#selfScope@149", + "targetId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "targetId": "func:src/server/botQueryTools.ts#selfScope@149", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "targetId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#summarizeTask@172", + "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#taskDateSpan@51", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#summarizeTask@172", + "targetId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#buildTaskLink@72", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#summarizeTask@172", + "targetId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@297", + "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#planNameById@198", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@297", + "targetId": "func:src/server/botQueryTools.ts#planNameById@198", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#filter() 回调@310@310=>func:src/server/botQueryTools.ts#taskDateSpan@51", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#filter() 回调@310@310", + "targetId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#filter() 回调@310@310=>func:src/server/botQueryTools.ts#overlapsRange@59", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#filter() 回调@310@310", + "targetId": "func:src/server/botQueryTools.ts#overlapsRange@59", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#summarizeTask@172", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@297", + "targetId": "func:src/server/botQueryTools.ts#summarizeTask@172", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#planNameById@198", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#planNameById@198", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#taskDateSpan@51", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#buildTaskLink@72", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@349", + "targetId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#planNameById@198", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#planNameById@198", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#addDays@440", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#addDays@440", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#overlapsRange@59", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#overlapsRange@59", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#buildTaskLink@72", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@430", + "targetId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@500=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@500", + "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#filter() 回调@516@516=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#filter() 回调@516@516", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@500=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@500", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@542", + "targetId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@542", + "targetId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "kind": "call", + "sourceId": "func:src/server/botQueryTools.ts#execute@542", + "targetId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/server/aiChatService.ts=>file:src/server/botQueryTools.ts", + "kind": "import", + "sourceId": "file:src/server/aiChatService.ts", + "targetId": "file:src/server/botQueryTools.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#appendMemoryTurn@72=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "targetId": "func:src/server/aiChatService.ts#getMemoryTurns@62", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#map() 回调@94@94=>func:src/server/botQueryTools.ts#resolveToolSchema@231", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#map() 回调@94@94", + "targetId": "func:src/server/botQueryTools.ts#resolveToolSchema@231", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#executeToolCall@156=>func:src/server/botQueryTools.ts#getBotToolByName@583", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#executeToolCall@156", + "targetId": "func:src/server/botQueryTools.ts#getBotToolByName@583", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#isAiConfigured@30", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#isAiConfigured@30", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#getMemoryTurns@62", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildSystemPrompt@107", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#buildSystemPrompt@107", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildToolSpecs@93", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#buildToolSpecs@93", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#callChatCompletion@124", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#callChatCompletion@124", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#executeToolCall@156", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#executeToolCall@156", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#appendMemoryTurn@72", + "kind": "call", + "sourceId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "targetId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "provenance": "resolved" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/taskRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/taskRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/notificationRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/notificationRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/projectTemplateRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/projectTemplateRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/tagRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/tagRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/weeklyPlanRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/weeklyPlanRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/personRepository.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/personRepository.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/botQueryTools.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/botQueryTools.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/server/aiChatService.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/server/aiChatService.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:server.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:server.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:server.ts#ensureManualLoginPeople@84=>func:src/server/personRepository.ts#ensurePeople@118", + "kind": "call", + "sourceId": "func:server.ts#ensureManualLoginPeople@84", + "targetId": "func:src/server/personRepository.ts#ensurePeople@118", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/health@90", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/health@90", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "kind": "call", + "sourceId": "func:server.ts#getDingTalkRobotAccessToken@128", + "targetId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#getDingTalkRobotAccessToken@128", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#getDingTalkRobotAccessToken@128", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "kind": "call", + "sourceId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "targetId": "func:server.ts#getDingTalkRobotAccessToken@128", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#replyToDingTalkSession@204", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#replyToDingTalkSession@204", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271", + "kind": "call", + "sourceId": "func:server.ts#getZonedDateParts@261", + "targetId": "func:server.ts#value@271", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getZonedDateParts@261", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:server.ts#getZonedDateParts@261", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/taskRepository.ts#listTasks@194", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:src/server/taskRepository.ts#listTasks@194", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/personRepository.ts#listPeople@53", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:src/server/personRepository.ts#listPeople@53", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getDueTimeRanges@290", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:server.ts#getDueTimeRanges@290", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getPersonNamesForDueNodeReminder@280", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:server.ts#getPersonNamesForDueNodeReminder@280", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getWorkflowLink@252", + "kind": "call", + "sourceId": "func:server.ts#sendDailyDueNodeReminder@298", + "targetId": "func:server.ts#getWorkflowLink@252", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getTaskRelatedPersonNames@239", + "kind": "call", + "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "targetId": "func:server.ts#getTaskRelatedPersonNames@239", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:src/server/personRepository.ts#listPeople@53", + "kind": "call", + "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "targetId": "func:src/server/personRepository.ts#listPeople@53", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "kind": "call", + "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "targetId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getWorkflowLink@252", + "kind": "call", + "sourceId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "targetId": "func:server.ts#getWorkflowLink@252", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoAuthUrl@432=>func:server.ts#getSsoRedirectUri@423", + "kind": "call", + "sourceId": "func:server.ts#getSsoAuthUrl@432", + "targetId": "func:server.ts#getSsoRedirectUri@423", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", + "kind": "call", + "sourceId": "func:server.ts#getSsoUserAccessToken@444", + "targetId": "func:server.ts#getSsoRedirectUri@423", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#getSsoUserAccessToken@444", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#getSsoUserAccessToken@444", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", + "kind": "call", + "sourceId": "func:server.ts#getSsoCurrentUser@471", + "targetId": "func:server.ts#readRemoteError@98", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110", + "kind": "call", + "sourceId": "func:server.ts#getSsoCurrentUser@471", + "targetId": "func:server.ts#readRemoteJson@110", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/auth/sso-config@498", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/auth/sso-config@498", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/auth/sso-config@498=>func:server.ts#getSsoRedirectUri@423", + "kind": "call", + "sourceId": "func:server.ts#GET /api/auth/sso-config@498", + "targetId": "func:server.ts#getSsoRedirectUri@423", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/auth/sso-login-url@508", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/auth/sso-login-url@508", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#ensureSsoConfigured@417", + "kind": "call", + "sourceId": "func:server.ts#GET /api/auth/sso-login-url@508", + "targetId": "func:server.ts#ensureSsoConfigured@417", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#getSsoAuthUrl@432", + "kind": "call", + "sourceId": "func:server.ts#GET /api/auth/sso-login-url@508", + "targetId": "func:server.ts#getSsoAuthUrl@432", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#handleSsoCallback@520", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#handleSsoCallback@520", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/auth/manual-users@559", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/auth/manual-users@559", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/manual-login@563", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/auth/manual-login@563", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/dev-login@575", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/auth/dev-login@575", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/dev-login@575=>func:src/server/personRepository.ts#createPerson@73", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/dev-login@575", + "targetId": "func:src/server/personRepository.ts#createPerson@73", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/sso-login@605", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/auth/sso-login@605", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#ensureSsoConfigured@417", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-login@605", + "targetId": "func:server.ts#ensureSsoConfigured@417", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoUserAccessToken@444", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-login@605", + "targetId": "func:server.ts#getSsoUserAccessToken@444", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoCurrentUser@471", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-login@605", + "targetId": "func:server.ts#getSsoCurrentUser@471", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:src/server/personRepository.ts#createPerson@73", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-login@605", + "targetId": "func:src/server/personRepository.ts#createPerson@73", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/auth/sso-join-person@642", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/auth/sso-join-person@642", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#ensureSsoConfigured@417", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", + "targetId": "func:server.ts#ensureSsoConfigured@417", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoUserAccessToken@444", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", + "targetId": "func:server.ts#getSsoUserAccessToken@444", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoCurrentUser@471", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", + "targetId": "func:server.ts#getSsoCurrentUser@471", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:src/server/personRepository.ts#createPerson@73", + "kind": "call", + "sourceId": "func:server.ts#POST /api/auth/sso-join-person@642", + "targetId": "func:src/server/personRepository.ts#createPerson@73", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/people@669", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/people@669", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/people@669=>func:server.ts#ensureManualLoginPeople@84", + "kind": "call", + "sourceId": "func:server.ts#GET /api/people@669", + "targetId": "func:server.ts#ensureManualLoginPeople@84", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/people@669=>func:src/server/personRepository.ts#listPeople@53", + "kind": "call", + "sourceId": "func:server.ts#GET /api/people@669", + "targetId": "func:src/server/personRepository.ts#listPeople@53", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/people@678", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/people@678", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/people@678=>func:src/server/personRepository.ts#createPerson@73", + "kind": "call", + "sourceId": "func:server.ts#POST /api/people@678", + "targetId": "func:src/server/personRepository.ts#createPerson@73", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PUT /api/people/:id@687", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#PUT /api/people/:id@687", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PUT /api/people/:id@687=>func:src/server/personRepository.ts#updatePerson@142", + "kind": "call", + "sourceId": "func:server.ts#PUT /api/people/:id@687", + "targetId": "func:src/server/personRepository.ts#updatePerson@142", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/people/:id@696", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/people/:id@696", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/people/:id@696=>func:src/server/personRepository.ts#deletePerson@177", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/people/:id@696", + "targetId": "func:src/server/personRepository.ts#deletePerson@177", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/dingtalk/robot/send-message@705", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:src/server/personRepository.ts#getPersonOrThrow@64", + "kind": "call", + "sourceId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "targetId": "func:src/server/personRepository.ts#getPersonOrThrow@64", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "kind": "call", + "sourceId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "targetId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/tags@737", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/tags@737", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/tags@737=>func:src/server/tagRepository.ts#listTagDefinitions@11", + "kind": "call", + "sourceId": "func:server.ts#GET /api/tags@737", + "targetId": "func:src/server/tagRepository.ts#listTagDefinitions@11", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tags@745", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/tags@745", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/tags@745=>func:src/server/tagRepository.ts#createTagDefinition@19", + "kind": "call", + "sourceId": "func:server.ts#POST /api/tags@745", + "targetId": "func:src/server/tagRepository.ts#createTagDefinition@19", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tags/:id@754", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/tags/:id@754", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/tags/:id@754=>func:src/server/tagRepository.ts#deleteTagDefinition@34", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/tags/:id@754", + "targetId": "func:src/server/tagRepository.ts#deleteTagDefinition@34", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/weekly-plans@764", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/weekly-plans@764", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/weekly-plans@764=>func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "kind": "call", + "sourceId": "func:server.ts#GET /api/weekly-plans@764", + "targetId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/weekly-plans@772", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/weekly-plans@772", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/weekly-plans@772=>func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "kind": "call", + "sourceId": "func:server.ts#POST /api/weekly-plans@772", + "targetId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/weekly-plans/:id@781", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/weekly-plans/:id@781", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/weekly-plans/:id@781=>func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/weekly-plans/:id@781", + "targetId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/project-templates@791", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/project-templates@791", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/project-templates@791=>func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "kind": "call", + "sourceId": "func:server.ts#GET /api/project-templates@791", + "targetId": "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/project-templates@799", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/project-templates@799", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/project-templates@799=>func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "kind": "call", + "sourceId": "func:server.ts#POST /api/project-templates@799", + "targetId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PUT /api/project-templates/:id@808", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#PUT /api/project-templates/:id@808", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PUT /api/project-templates/:id@808=>func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "kind": "call", + "sourceId": "func:server.ts#PUT /api/project-templates/:id@808", + "targetId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/project-templates/:id@817", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/project-templates/:id@817", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/project-templates/:id@817=>func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/project-templates/:id@817", + "targetId": "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/tasks@826", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/tasks@826", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/tasks@826=>func:src/server/taskRepository.ts#listTasks@194", + "kind": "call", + "sourceId": "func:server.ts#GET /api/tasks@826", + "targetId": "func:src/server/taskRepository.ts#listTasks@194", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/tasks/:id@834", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/tasks/:id@834", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/tasks/:id@834=>func:src/server/taskRepository.ts#getTask@190", + "kind": "call", + "sourceId": "func:server.ts#GET /api/tasks/:id@834", + "targetId": "func:src/server/taskRepository.ts#getTask@190", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tasks@843", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/tasks@843", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/tasks@843=>func:src/server/taskRepository.ts#createTask@227", + "kind": "call", + "sourceId": "func:server.ts#POST /api/tasks@843", + "targetId": "func:src/server/taskRepository.ts#createTask@227", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PATCH /api/tasks/:id/list-state@852", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PATCH /api/tasks/:id/list-state@852=>func:src/server/taskRepository.ts#updateTaskListState@353", + "kind": "call", + "sourceId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "targetId": "func:src/server/taskRepository.ts#updateTaskListState@353", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PUT /api/tasks/:id@865", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#PUT /api/tasks/:id@865", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#getTask@190", + "kind": "call", + "sourceId": "func:server.ts#PUT /api/tasks/:id@865", + "targetId": "func:src/server/taskRepository.ts#getTask@190", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#updateTask@302", + "kind": "call", + "sourceId": "func:server.ts#PUT /api/tasks/:id@865", + "targetId": "func:src/server/taskRepository.ts#updateTask@302", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:server.ts#notifyTaskConfirmedCompleted@363", + "kind": "call", + "sourceId": "func:server.ts#PUT /api/tasks/:id@865", + "targetId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tasks/:id@886", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/tasks/:id@886", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/tasks/:id@886=>func:src/server/taskRepository.ts#deleteTask@383", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/tasks/:id@886", + "targetId": "func:src/server/taskRepository.ts#deleteTask@383", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tasks/:id/nodes@895", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/tasks/:id/nodes@895", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/tasks/:id/nodes@895=>func:src/server/taskRepository.ts#createWorkflowNode@389", + "kind": "call", + "sourceId": "func:server.ts#POST /api/tasks/:id/nodes@895", + "targetId": "func:src/server/taskRepository.ts#createWorkflowNode@389", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905=>func:src/server/taskRepository.ts#updateWorkflowNode@423", + "kind": "call", + "sourceId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "targetId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915=>func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "targetId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/tasks/:id/dependencies@925", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/tasks/:id/dependencies@925", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/tasks/:id/dependencies@925=>func:src/server/taskRepository.ts#createNodeDependency@494", + "kind": "call", + "sourceId": "func:server.ts#POST /api/tasks/:id/dependencies@925", + "targetId": "func:src/server/taskRepository.ts#createNodeDependency@494", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934=>func:src/server/taskRepository.ts#deleteNodeDependency@535", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "targetId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#POST /api/notify@944", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#POST /api/notify@944", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#normalizeActionType@1058", + "kind": "call", + "sourceId": "func:server.ts#POST /api/notify@944", + "targetId": "func:server.ts#normalizeActionType@1058", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getNotificationState@1065", + "kind": "call", + "sourceId": "func:server.ts#POST /api/notify@944", + "targetId": "func:server.ts#getNotificationState@1065", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getWorkflowLink@252", + "kind": "call", + "sourceId": "func:server.ts#POST /api/notify@944", + "targetId": "func:server.ts#getWorkflowLink@252", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#POST /api/notify@944=>func:src/server/notificationRepository.ts#createNotificationLog@37", + "kind": "call", + "sourceId": "func:server.ts#POST /api/notify@944", + "targetId": "func:src/server/notificationRepository.ts#createNotificationLog@37", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#GET /api/logs@1041", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#GET /api/logs@1041", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#GET /api/logs@1041=>func:src/server/notificationRepository.ts#listNotificationLogs@47", + "kind": "call", + "sourceId": "func:server.ts#GET /api/logs@1041", + "targetId": "func:src/server/notificationRepository.ts#listNotificationLogs@47", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#@0=>func:server.ts#DELETE /api/logs@1049", + "kind": "trigger", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#DELETE /api/logs@1049", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#DELETE /api/logs@1049=>func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "kind": "call", + "sourceId": "func:server.ts#DELETE /api/logs@1049", + "targetId": "func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#getZonedDateParts@261", + "kind": "call", + "sourceId": "func:server.ts#checkAndRun@1090", + "targetId": "func:server.ts#getZonedDateParts@261", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#sendDailyDueNodeReminder@298", + "kind": "call", + "sourceId": "func:server.ts#checkAndRun@1090", + "targetId": "func:server.ts#sendDailyDueNodeReminder@298", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204", + "kind": "call", + "sourceId": "func:server.ts#replyText@1147", + "targetId": "func:server.ts#replyToDingTalkSession@204", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyText@1147", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:server.ts#replyText@1147", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#isAiConfigured@30", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:src/server/aiChatService.ts#isAiConfigured@30", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#clearBotMemory@79", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:src/server/aiChatService.ts#clearBotMemory@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/personRepository.ts#listPeople@53", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:src/server/personRepository.ts#listPeople@53", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/botQueryTools.ts#createBotQueryContext@116", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#answerBotQuestion@185", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyToDingTalkSessionMarkdown@222", + "kind": "call", + "sourceId": "func:server.ts#handleDingTalkRobotMessage@1114", + "targetId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#registerCallbackListener() 回调@1215@1215=>func:server.ts#handleDingTalkRobotMessage@1114", + "kind": "call", + "sourceId": "func:server.ts#registerCallbackListener() 回调@1215@1215", + "targetId": "func:server.ts#handleDingTalkRobotMessage@1114", + "provenance": "resolved" + }, + { + "id": "edge:trigger:func:server.ts#startServer@1235=>func:server.ts#GET *@1245", + "kind": "trigger", + "sourceId": "func:server.ts#startServer@1235", + "targetId": "func:server.ts#GET *@1245", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDailyDueNodeReminderScheduler@1089", + "kind": "call", + "sourceId": "func:server.ts#listen() 回调@1250@1250", + "targetId": "func:server.ts#startDailyDueNodeReminderScheduler@1089", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDingTalkRobotStream@1204", + "kind": "call", + "sourceId": "func:server.ts#listen() 回调@1250@1250", + "targetId": "func:server.ts#startDingTalkRobotStream@1204", + "provenance": "resolved" + }, + { + "id": "edge:call:func:server.ts#@0=>func:server.ts#startServer@1235", + "kind": "call", + "sourceId": "func:server.ts#@0", + "targetId": "func:server.ts#startServer@1235", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/utils/nodeTimeRanges.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/utils/nodeTimeRanges.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "targetId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "targetId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "targetId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/utils/taskStatus.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/utils/taskStatus.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/utils/taskStatus.ts=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/utils/taskStatus.ts", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/utils/taskStatus.ts=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/utils/taskStatus.ts", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/utils/taskPriority.ts=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/utils/taskPriority.ts", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/TaskList.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/TaskList.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/TaskList.tsx=>file:src/utils/taskStatus.ts", + "kind": "import", + "sourceId": "file:src/components/TaskList.tsx", + "targetId": "file:src/utils/taskStatus.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/TaskList.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/TaskList.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#reduce() 回调@77@77=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#reduce() 回调@77@77", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#filter() 回调@110@110=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#filter() 回调@110@110", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#filter() 回调@110@110=>func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#filter() 回调@110@110", + "targetId": "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@265@265=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@265@265", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@265@265=>func:src/components/TaskList.tsx#toggleSelectedStatus@97", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@265@265", + "targetId": "func:src/components/TaskList.tsx#toggleSelectedStatus@97", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@297@297=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@297@297", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@297@297=>func:src/components/TaskList.tsx#toggleSelectedPriority@103", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@297@297", + "targetId": "func:src/components/TaskList.tsx#toggleSelectedPriority@103", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#TaskList@47=>func:src/components/TaskList.tsx#toggleSelectedTag@91", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#TaskList@47", + "targetId": "func:src/components/TaskList.tsx#toggleSelectedTag@91", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@353@353=>func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@353@353", + "targetId": "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@353@353=>func:src/components/TaskList.tsx#clearQueueDropState@147", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@353@353", + "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@366@366=>func:src/components/TaskList.tsx#clearQueueDropState@147", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@366@366", + "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@371@371=>func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@371@371", + "targetId": "func:src/components/TaskList.tsx#getDropBeforeTaskId@129", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@371@371=>func:src/components/TaskList.tsx#clearQueueDropState@147", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@371@371", + "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@387@387", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@387@387", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#map() 回调@387@387", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskList.tsx#匿名函数@410@410=>func:src/components/TaskList.tsx#clearQueueDropState@147", + "kind": "call", + "sourceId": "func:src/components/TaskList.tsx#匿名函数@410@410", + "targetId": "func:src/components/TaskList.tsx#clearQueueDropState@147", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/WeeklyPlanList.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyPlanList.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WeeklyPlanList.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyPlanList.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26=>func:src/components/WeeklyPlanList.tsx#addDays@20", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#WeeklyPlanList@26", + "targetId": "func:src/components/WeeklyPlanList.tsx#addDays@20", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#sort() 回调@62@62", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#resetForm@70=>func:src/components/WeeklyPlanList.tsx#addDays@20", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#resetForm@70", + "targetId": "func:src/components/WeeklyPlanList.tsx#addDays@20", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76=>func:src/components/WeeklyPlanList.tsx#resetForm@70", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#handleCreatePlan@76", + "targetId": "func:src/components/WeeklyPlanList.tsx#resetForm@70", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#匿名函数@162@162=>func:src/components/WeeklyPlanList.tsx#addDays@20", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#匿名函数@162@162", + "targetId": "func:src/components/WeeklyPlanList.tsx#addDays@20", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#map() 回调@197@197=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyPlanList.tsx#map() 回调@197@197=>func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", + "kind": "call", + "sourceId": "func:src/components/WeeklyPlanList.tsx#map() 回调@197@197", + "targetId": "func:src/components/WeeklyPlanList.tsx#handleDeletePlan@94", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/WorkflowCanvas.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/WorkflowCanvas.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WorkflowCanvas.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/WorkflowCanvas.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WorkflowCanvas.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/WorkflowCanvas.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175=>func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", + "targetId": "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175=>func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseMove@175", + "targetId": "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#addConnection@282=>func:src/components/WorkflowCanvas.tsx#isAncestor@265", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#addConnection@282", + "targetId": "func:src/components/WorkflowCanvas.tsx#isAncestor@265", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#addConnection@282=>func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#addConnection@282", + "targetId": "func:src/components/WorkflowCanvas.tsx#showConnectionToast@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304=>func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "targetId": "func:src/components/WorkflowCanvas.tsx#getConnectionTarget@316", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304=>func:src/components/WorkflowCanvas.tsx#addConnection@282", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "targetId": "func:src/components/WorkflowCanvas.tsx#addConnection@282", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343=>func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "targetId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361=>func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "targetId": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431=>func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", + "targetId": "func:src/components/WorkflowCanvas.tsx#getLogicalPoint@256", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431=>func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleContainerMouseUp@431", + "targetId": "func:src/components/WorkflowCanvas.tsx#completeConnectionDrag@304", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "targetId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "targetId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507=>func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleAddEmptyNode@507", + "targetId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleKeyDown@565=>func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleKeyDown@565=>func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleKeyDown@565", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleDeleteNode@521", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "targetId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/components/WorkflowCanvas.tsx#toMs@623", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "targetId": "func:src/components/WorkflowCanvas.tsx#toMs@623", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@638@638=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@638@638=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@638@638", + "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667=>func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "targetId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@838@838=>func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleSelectConnection@545", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@838@838=>func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@838@838", + "targetId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#匿名函数@900@900=>func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#匿名函数@900@900", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleDeleteConnection@552", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "kind": "call", + "sourceId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "targetId": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectCreateModal.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectCreateModal.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectCreateModal.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectCreateModal.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectCreateModal.tsx=>file:src/components/WorkflowCanvas.tsx", + "kind": "import", + "sourceId": "file:src/components/ProjectCreateModal.tsx", + "targetId": "file:src/components/WorkflowCanvas.tsx", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33=>func:src/components/ProjectCreateModal.tsx#toDateMs@23", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "targetId": "func:src/components/ProjectCreateModal.tsx#toDateMs@23", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@45@45=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@45@45=>func:src/components/ProjectCreateModal.tsx#addDays@27", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@45@45", + "targetId": "func:src/components/ProjectCreateModal.tsx#addDays@27", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#handleCreateProject@160=>func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", + "targetId": "func:src/components/ProjectCreateModal.tsx#shiftTemplateNodes@33", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#handleCreateProject@160=>func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#handleCreateProject@160", + "targetId": "func:src/components/ProjectCreateModal.tsx#resetProjectForm@152", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@234@234=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@234@234", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectCreateModal.tsx#map() 回调@271@271=>func:src/components/ProjectCreateModal.tsx#toggleTag@146", + "kind": "call", + "sourceId": "func:src/components/ProjectCreateModal.tsx#map() 回调@271@271", + "targetId": "func:src/components/ProjectCreateModal.tsx#toggleTag@146", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/TaskOverview.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/TaskOverview.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/TaskOverview.tsx=>file:src/utils/taskStatus.ts", + "kind": "import", + "sourceId": "file:src/components/TaskOverview.tsx", + "targetId": "file:src/utils/taskStatus.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/TaskOverview.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/TaskOverview.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118=>func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#handleToggleTaskCompletion@118", + "targetId": "func:src/components/TaskOverview.tsx#runTaskCompletionUpdate@103", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#map() 回调@240@240=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#map() 回调@240@240", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/TaskOverview.tsx#map() 回调@294@294=>func:src/components/TaskOverview.tsx#toggleEditTag@89", + "kind": "call", + "sourceId": "func:src/components/TaskOverview.tsx#map() 回调@294@294", + "targetId": "func:src/components/TaskOverview.tsx#toggleEditTag@89", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/GanttChart.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/GanttChart.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/GanttChart.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/GanttChart.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/GanttChart.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/GanttChart.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#useMemo() 回调@23@23=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#useMemo() 回调@23@23=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#useMemo() 回调@23@23", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#forEach() 回调@40@40=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#forEach() 回调@40@40", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#GanttChart@14=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#GanttChart@14", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "targetId": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#isWeekend@86", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "targetId": "func:src/components/GanttChart.tsx#isWeekend@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#formatDateString@76", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "targetId": "func:src/components/GanttChart.tsx#formatDateString@76", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#getDayLabel@80", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "targetId": "func:src/components/GanttChart.tsx#getDayLabel@80", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@304@304=>func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@304@304", + "targetId": "func:src/components/GanttChart.tsx#getEffectiveNodeStatus@115", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@304@304=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@304@304", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@375@375=>func:src/components/GanttChart.tsx#isWeekend@86", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@375@375", + "targetId": "func:src/components/GanttChart.tsx#isWeekend@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/GanttChart.tsx#map() 回调@389@389=>func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "kind": "call", + "sourceId": "func:src/components/GanttChart.tsx#map() 回调@389@389", + "targetId": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/PersonGanttChart.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/PersonGanttChart.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/PersonGanttChart.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/PersonGanttChart.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/PersonGanttChart.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#PersonGanttChart@25=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#PersonGanttChart@25", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "targetId": "func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#forEach() 回调@64@64", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149=>func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", + "targetId": "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#requestAnimationFrame() 回调@149@149", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@235@235=>func:src/components/PersonGanttChart.tsx#getDayLabel@393", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@235@235", + "targetId": "func:src/components/PersonGanttChart.tsx#getDayLabel@393", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "targetId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "targetId": "func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@337@337=>func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "kind": "call", + "sourceId": "func:src/components/PersonGanttChart.tsx#map() 回调@337@337", + "targetId": "func:src/components/PersonGanttChart.tsx#getTimelinePercentage@99", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/PeopleManager.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/PeopleManager.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/PeopleManager.tsx=>file:src/components/PersonGanttChart.tsx", + "kind": "import", + "sourceId": "file:src/components/PeopleManager.tsx", + "targetId": "file:src/components/PersonGanttChart.tsx", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51=>func:src/components/PeopleManager.tsx#getPinyinSortKey@45", + "kind": "call", + "sourceId": "func:src/components/PeopleManager.tsx#comparePeopleByPinyin@51", + "targetId": "func:src/components/PeopleManager.tsx#getPinyinSortKey@45", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/PeopleManager.tsx#useMemo() 回调@107@107=>func:src/components/PeopleManager.tsx#getSearchTokens@29", + "kind": "call", + "sourceId": "func:src/components/PeopleManager.tsx#useMemo() 回调@107@107", + "targetId": "func:src/components/PeopleManager.tsx#getSearchTokens@29", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", + "kind": "call", + "sourceId": "func:src/utils/api.ts#apiPath@15", + "targetId": "func:src/utils/api.ts#appPath@7", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/LoginPage.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/LoginPage.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/LoginPage.tsx=>file:src/utils/api.ts", + "kind": "import", + "sourceId": "file:src/components/LoginPage.tsx", + "targetId": "file:src/utils/api.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#createOAuthState@31", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "targetId": "func:src/components/LoginPage.tsx#createOAuthState@31", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#readApiJson@21", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "targetId": "func:src/components/LoginPage.tsx#readApiJson@21", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "targetId": "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleDevLogin@121=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleDevLogin@121", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/LoginPage.tsx#handleDevLogin@121=>func:src/components/LoginPage.tsx#readApiJson@21", + "kind": "call", + "sourceId": "func:src/components/LoginPage.tsx#handleDevLogin@121", + "targetId": "func:src/components/LoginPage.tsx#readApiJson@21", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/TagManager.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/TagManager.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectTemplateManager.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectTemplateManager.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/ProjectTemplateManager.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/ProjectTemplateManager.tsx=>file:src/components/WorkflowCanvas.tsx", + "kind": "import", + "sourceId": "file:src/components/ProjectTemplateManager.tsx", + "targetId": "file:src/components/WorkflowCanvas.tsx", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", + "targetId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85=>func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", + "targetId": "func:src/components/ProjectTemplateManager.tsx#toCanvasTask@66", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132=>func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", + "targetId": "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132=>func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", + "targetId": "func:src/components/ProjectTemplateManager.tsx#createDefaultTemplateNode@27", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleNewTemplate@132", + "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154=>func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", + "targetId": "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleSaveTemplate@154", + "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181=>func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", + "targetId": "func:src/components/ProjectTemplateManager.tsx#normalizeDraft@57", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181=>func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", + "targetId": "func:src/components/ProjectTemplateManager.tsx#getUniqueTemplateName@46", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleCopyTemplate@181", + "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", + "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222=>func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#handleDeleteTemplate@222", + "targetId": "func:src/components/ProjectTemplateManager.tsx#emptyTemplateDraft@18", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308=>func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#map() 回调@308@308", + "targetId": "func:src/components/ProjectTemplateManager.tsx#loadTemplateIntoEditor@120", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393=>func:src/components/ProjectTemplateManager.tsx#toggleTag@111", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#map() 回调@393@393", + "targetId": "func:src/components/ProjectTemplateManager.tsx#toggleTag@111", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85=>func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", + "kind": "call", + "sourceId": "func:src/components/ProjectTemplateManager.tsx#ProjectTemplateManager@85", + "targetId": "func:src/components/ProjectTemplateManager.tsx#updateSelectedNode@251", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/NodeEditorDrawer.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/NodeEditorDrawer.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/NodeEditorDrawer.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/NodeEditorDrawer.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/NodeEditorDrawer.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/NodeEditorDrawer.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#@0=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#@0", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", + "targetId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178=>func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#useEffect() 回调@178@178", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "targetId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#completeNode@328=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#completeNode@328", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#reopenNode@332=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#reopenNode@332", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "targetId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#addTimeRange@361=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#addTimeRange@361=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#addTimeRange@361", + "targetId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "targetId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", + "targetId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#toggleStartDateLock@378", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#deleteNode@384=>func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#deleteNode@384", + "targetId": "func:src/components/NodeEditorDrawer.tsx#closeDrawer@239", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676=>func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", + "targetId": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676=>func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#map() 回调@676@676", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "kind": "call", + "sourceId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "targetId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyOverview.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/date.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyOverview.tsx", + "targetId": "file:src/utils/date.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyOverview.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/taskStatus.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyOverview.tsx", + "targetId": "file:src/utils/taskStatus.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/components/WeeklyOverview.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/components/WeeklyOverview.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#WeeklyOverview@99=>func:src/utils/date.ts#getLocalDateString@1", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", + "targetId": "func:src/utils/date.ts#getLocalDateString@1", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214=>func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "targetId": "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "targetId": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "targetId": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "targetId": "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#sort() 回调@273@273=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#sort() 回调@273@273", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#matchesFilters@290=>func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#matchesFilters@290", + "targetId": "func:src/utils/taskPriority.ts#normalizeTaskPriority@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#WeeklyOverview@99=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#WeeklyOverview@99", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@335@335=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@335@335=>func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@335@335", + "targetId": "func:src/components/WeeklyOverview.tsx#toggleSelectedPriority@283", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#sortTasks@82", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "targetId": "func:src/components/WeeklyOverview.tsx#sortTasks@82", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#reduce() 回调@394@394", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "targetId": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "targetId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "targetId": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "targetId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "targetId": "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "targetId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#reduce() 回调@785@785", + "targetId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@777@777=>func:src/types.ts#isPublicPoolPlan@68", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#匿名函数@777@777", + "targetId": "func:src/types.ts#isPublicPoolPlan@68", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@840@840=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "kind": "call", + "sourceId": "func:src/components/WeeklyOverview.tsx#map() 回调@840@840", + "targetId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/TaskList.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/TaskList.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/WeeklyPlanList.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/WeeklyPlanList.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/ProjectCreateModal.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/ProjectCreateModal.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/TaskOverview.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/TaskOverview.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/WorkflowCanvas.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/WorkflowCanvas.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/GanttChart.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/GanttChart.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/PeopleManager.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/PeopleManager.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/LoginPage.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/LoginPage.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/TagManager.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/TagManager.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/ProjectTemplateManager.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/ProjectTemplateManager.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/NodeEditorDrawer.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/NodeEditorDrawer.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/components/WeeklyOverview.tsx", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/components/WeeklyOverview.tsx", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/utils/api.ts", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/utils/api.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/utils/nodeTimeRanges.ts", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/utils/nodeTimeRanges.ts", + "provenance": "ast" + }, + { + "id": "edge:import:file:src/App.tsx=>file:src/utils/taskPriority.ts", + "kind": "import", + "sourceId": "file:src/App.tsx", + "targetId": "file:src/utils/taskPriority.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/App.tsx#App@84=>func:src/App.tsx#readStoredAuthUser@62", + "kind": "call", + "sourceId": "func:src/App.tsx#App@84", + "targetId": "func:src/App.tsx#readStoredAuthUser@62", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTasks@221", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", + "targetId": "func:src/App.tsx#fetchTasks@221", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchPeople@241", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", + "targetId": "func:src/App.tsx#fetchPeople@241", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTags@256", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", + "targetId": "func:src/App.tsx#fetchTags@256", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchProjectTemplates@323", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", + "targetId": "func:src/App.tsx#fetchProjectTemplates@323", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchWeeklyPlans@338", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@133@133", + "targetId": "func:src/App.tsx#fetchWeeklyPlans@338", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@147@147=>func:src/App.tsx#fetchTags@256", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@147@147", + "targetId": "func:src/App.tsx#fetchTags@256", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchTasks@221", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchTasks@221", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchPeople@241", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchPeople@241", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchTags@256=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchTags@256", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchTags@256=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchTags@256", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateTag@271=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateTag@271", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateTag@271=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateTag@271", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteTag@297=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteTag@297", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteTag@297=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteTag@297", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchProjectTemplates@323", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchProjectTemplates@323", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchWeeklyPlans@338", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#fetchWeeklyPlans@338", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateWeeklyPlan@353=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateWeeklyPlan@353", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateWeeklyPlan@353=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateWeeklyPlan@353", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteWeeklyPlan@385=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteWeeklyPlan@385", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteWeeklyPlan@385=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteWeeklyPlan@385", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteWeeklyPlan@385=>func:src/App.tsx#readApiJson@44", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteWeeklyPlan@385", + "targetId": "func:src/App.tsx#readApiJson@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateProjectTemplate@427=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateProjectTemplate@427", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateProjectTemplate@427=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateProjectTemplate@427", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateProjectTemplate@450=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateProjectTemplate@450", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateProjectTemplate@450=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateProjectTemplate@450", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteProjectTemplate@478=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteProjectTemplate@478", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteProjectTemplate@478=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteProjectTemplate@478", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreatePerson@498=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreatePerson@498", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreatePerson@498=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreatePerson@498", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleJoinSsoPerson@521=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleJoinSsoPerson@521", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleJoinSsoPerson@521=>func:src/App.tsx#readApiJson@44", + "kind": "call", + "sourceId": "func:src/App.tsx#handleJoinSsoPerson@521", + "targetId": "func:src/App.tsx#readApiJson@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleJoinSsoPerson@521=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleJoinSsoPerson@521", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeletePerson@548=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeletePerson@548", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeletePerson@548=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeletePerson@548", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdatePersonRole@565=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdatePersonRole@565", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdatePersonRole@565=>func:src/App.tsx#readApiJson@44", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdatePersonRole@565", + "targetId": "func:src/App.tsx#readApiJson@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdatePersonRole@565=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdatePersonRole@565", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleTogglePersonAdmin@605=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleTogglePersonAdmin@605", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleTogglePersonAdmin@605=>func:src/App.tsx#readApiJson@44", + "kind": "call", + "sourceId": "func:src/App.tsx#handleTogglePersonAdmin@605", + "targetId": "func:src/App.tsx#readApiJson@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleTogglePersonAdmin@605=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleTogglePersonAdmin@605", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUnlockAdmin@650=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUnlockAdmin@650", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUnlockAdmin@650=>func:src/App.tsx#readApiJson@44", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUnlockAdmin@650", + "targetId": "func:src/App.tsx#readApiJson@44", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleMoveTaskToWeeklyPlan@761=>func:src/App.tsx#sortTasksForList@54", + "kind": "call", + "sourceId": "func:src/App.tsx#handleMoveTaskToWeeklyPlan@761", + "targetId": "func:src/App.tsx#sortTasksForList@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#sortTasksForList@54", + "kind": "call", + "sourceId": "func:src/App.tsx#handleReorderTask@798", + "targetId": "func:src/App.tsx#sortTasksForList@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleReorderTask@798", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleReorderTask@798", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#fetchTasks@221", + "kind": "call", + "sourceId": "func:src/App.tsx#handleReorderTask@798", + "targetId": "func:src/App.tsx#fetchTasks@221", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleWorkspaceClick@957=>func:src/App.tsx#handleSelectNode@870", + "kind": "call", + "sourceId": "func:src/App.tsx#handleWorkspaceClick@957", + "targetId": "func:src/App.tsx#handleSelectNode@870", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@1109@1109=>func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@1109@1109", + "targetId": "func:src/App.tsx#revealNodeIfCoveredByDrawer@1064", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useEffect() 回调@1121@1121=>func:src/App.tsx#focusNodeInCanvas@1016", + "kind": "call", + "sourceId": "func:src/App.tsx#useEffect() 回调@1121@1121", + "targetId": "func:src/App.tsx#focusNodeInCanvas@1016", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#applyCentered@1149=>func:src/App.tsx#computeCenteredViewport@981", + "kind": "call", + "sourceId": "func:src/App.tsx#applyCentered@1149", + "targetId": "func:src/App.tsx#computeCenteredViewport@981", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#useLayoutEffect() 回调@1134@1134=>func:src/App.tsx#applyCentered@1149", + "kind": "call", + "sourceId": "func:src/App.tsx#useLayoutEffect() 回调@1134@1134", + "targetId": "func:src/App.tsx#applyCentered@1149", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateTask@1165=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateTask@1165", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateTask@1165=>func:src/App.tsx#sortTasksForList@54", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateTask@1165", + "targetId": "func:src/App.tsx#sortTasksForList@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleCreateTask@1165=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleCreateTask@1165", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleSubmitRequirement@1219=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleSubmitRequirement@1219", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleSubmitRequirement@1219=>func:src/App.tsx#sortTasksForList@54", + "kind": "call", + "sourceId": "func:src/App.tsx#handleSubmitRequirement@1219", + "targetId": "func:src/App.tsx#sortTasksForList@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleSubmitRequirement@1219=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleSubmitRequirement@1219", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleToggleTaskPinned@1278=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleToggleTaskPinned@1278", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleToggleTaskPinned@1278=>func:src/App.tsx#sortTasksForList@54", + "kind": "call", + "sourceId": "func:src/App.tsx#handleToggleTaskPinned@1278", + "targetId": "func:src/App.tsx#sortTasksForList@54", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleToggleTaskPinned@1278=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleToggleTaskPinned@1278", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteTask@1299=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteTask@1299", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleDeleteTask@1299=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleDeleteTask@1299", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateTaskMetadata@1329=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateTaskMetadata@1329", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateTaskMetadata@1329=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateTaskMetadata@1329", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#handleRefreshTask@1353", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#handleRefreshTask@1353", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", + "targetId": "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#edgeKey@1383", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", + "targetId": "func:src/App.tsx#edgeKey@1383", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/utils/api.ts#apiPath@15", + "kind": "call", + "sourceId": "func:src/App.tsx#requestTaskUpdate@1425", + "targetId": "func:src/utils/api.ts#apiPath@15", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/App.tsx#readApiError@39", + "kind": "call", + "sourceId": "func:src/App.tsx#requestTaskUpdate@1425", + "targetId": "func:src/App.tsx#readApiError@39", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#requestTaskUpdate@1425", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", + "targetId": "func:src/App.tsx#requestTaskUpdate@1425", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#handleRefreshTask@1353", + "kind": "call", + "sourceId": "func:src/App.tsx#handleUpdateNodes@1371", + "targetId": "func:src/App.tsx#handleRefreshTask@1353", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#map() 回调@1700@1700=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "kind": "call", + "sourceId": "func:src/App.tsx#map() 回调@1700@1700", + "targetId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "provenance": "resolved" + }, + { + "id": "edge:call:func:src/App.tsx#App@84=>func:src/App.tsx#handleSelectNode@870", + "kind": "call", + "sourceId": "func:src/App.tsx#App@84", + "targetId": "func:src/App.tsx#handleSelectNode@870", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/components/DingTalkLogs.tsx=>file:src/types.ts", + "kind": "import", + "sourceId": "file:src/components/DingTalkLogs.tsx", + "targetId": "file:src/types.ts", + "provenance": "ast" + }, + { + "id": "edge:call:func:src/components/DingTalkLogs.tsx#map() 回调@76@76=>func:src/components/DingTalkLogs.tsx#copyToClipboard@14", + "kind": "call", + "sourceId": "func:src/components/DingTalkLogs.tsx#map() 回调@76@76", + "targetId": "func:src/components/DingTalkLogs.tsx#copyToClipboard@14", + "provenance": "resolved" + }, + { + "id": "edge:import:file:src/main.tsx=>file:src/App.tsx", + "kind": "import", + "sourceId": "file:src/main.tsx", + "targetId": "file:src/App.tsx", + "provenance": "ast" + }, + { + "id": "edge:call:func:vite.config.ts#defineConfig() 回调@12@12=>func:vite.config.ts#normalizeBasePath@6", + "kind": "call", + "sourceId": "func:vite.config.ts#defineConfig() 回调@12@12", + "targetId": "func:vite.config.ts#normalizeBasePath@6", + "provenance": "resolved" + } + ], + "flows": [ + { + "id": "flow:call:func:server.ts#sendDailyDueNodeReminder@298", + "name": "sendDailyDueNodeReminder (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#sendDailyDueNodeReminder@298", + "steps": [ + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#sendDailyDueNodeReminder@298", + "order": 0, + "nodeId": "func:server.ts#sendDailyDueNodeReminder@298", + "title": "sendDailyDueNodeReminder", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getZonedDateParts@261", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/taskRepository.ts#listTasks@194", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDueTimeRanges@290", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getPersonNamesForDueNodeReminder@280", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getWorkflowLink@252" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getZonedDateParts@261", + "order": 1, + "nodeId": "func:server.ts#getZonedDateParts@261", + "title": "getZonedDateParts", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#value@271" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/taskRepository.ts#listTasks@194", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#listTasks@194", + "title": "listTasks", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#listPeople@53", + "order": 3, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDueTimeRanges@290", + "order": 4, + "nodeId": "func:server.ts#getDueTimeRanges@290", + "title": "getDueTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getPersonNamesForDueNodeReminder@280", + "order": 5, + "nodeId": "func:server.ts#getPersonNamesForDueNodeReminder@280", + "title": "getPersonNamesForDueNodeReminder", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 6, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getWorkflowLink@252", + "order": 7, + "nodeId": "func:server.ts#getWorkflowLink@252", + "title": "getWorkflowLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#value@271", + "order": 8, + "nodeId": "func:server.ts#value@271", + "title": "value", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 9, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 10, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteError@98", + "order": 11, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#readRemoteJson@110", + "order": 12, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDailyDueNodeReminder@298:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 13, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getZonedDateParts@261", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/taskRepository.ts#listTasks@194", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getDueTimeRanges@290", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getPersonNamesForDueNodeReminder@280", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getWorkflowLink@252" + ], + "summary": "以 sendDailyDueNodeReminder 为入口的调用链,覆盖 14 个函数" + }, + { + "id": "flow:call:func:server.ts#handleDingTalkRobotMessage@1114", + "name": "handleDingTalkRobotMessage (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#handleDingTalkRobotMessage@1114", + "steps": [ + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#handleDingTalkRobotMessage@1114", + "order": 0, + "nodeId": "func:server.ts#handleDingTalkRobotMessage@1114", + "title": "handleDingTalkRobotMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyText@1147", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#isAiConfigured@30", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#clearBotMemory@79", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#createBotQueryContext@116", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#answerBotQuestion@185", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSessionMarkdown@222" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyText@1147", + "order": 1, + "nodeId": "func:server.ts#replyText@1147", + "title": "replyText", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSession@204" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#isAiConfigured@30", + "order": 2, + "nodeId": "func:src/server/aiChatService.ts#isAiConfigured@30", + "title": "isAiConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#clearBotMemory@79", + "order": 3, + "nodeId": "func:src/server/aiChatService.ts#clearBotMemory@79", + "title": "clearBotMemory", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#listPeople@53", + "order": 4, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#createBotQueryContext@116", + "order": 5, + "nodeId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "title": "createBotQueryContext", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getTodayStr@10" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#answerBotQuestion@185", + "order": 6, + "nodeId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "title": "answerBotQuestion", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#isAiConfigured@30", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#getMemoryTurns@62", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildSystemPrompt@107", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildToolSpecs@93", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#callChatCompletion@124", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#executeToolCall@156", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#appendMemoryTurn@72" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSessionMarkdown@222", + "order": 7, + "nodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "title": "replyToDingTalkSessionMarkdown", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#replyToDingTalkSession@204", + "order": 8, + "nodeId": "func:server.ts#replyToDingTalkSession@204", + "title": "replyToDingTalkSession", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 9, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getTodayStr@10", + "order": 10, + "nodeId": "func:src/server/botQueryTools.ts#getTodayStr@10", + "title": "getTodayStr", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#value@17" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#getMemoryTurns@62", + "order": 11, + "nodeId": "func:src/server/aiChatService.ts#getMemoryTurns@62", + "title": "getMemoryTurns", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildSystemPrompt@107", + "order": 12, + "nodeId": "func:src/server/aiChatService.ts#buildSystemPrompt@107", + "title": "buildSystemPrompt", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#buildToolSpecs@93", + "order": 13, + "nodeId": "func:src/server/aiChatService.ts#buildToolSpecs@93", + "title": "buildToolSpecs", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#callChatCompletion@124", + "order": 14, + "nodeId": "func:src/server/aiChatService.ts#callChatCompletion@124", + "title": "callChatCompletion", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#executeToolCall@156", + "order": 15, + "nodeId": "func:src/server/aiChatService.ts#executeToolCall@156", + "title": "executeToolCall", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getBotToolByName@583" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#appendMemoryTurn@72", + "order": 16, + "nodeId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "title": "appendMemoryTurn", + "nextStepIds": [ + "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/aiChatService.ts#getMemoryTurns@62" + ] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteError@98", + "order": 17, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:server.ts#readRemoteJson@110", + "order": 18, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#value@17", + "order": 19, + "nodeId": "func:src/server/botQueryTools.ts#value@17", + "title": "value", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#handleDingTalkRobotMessage@1114:func:src/server/botQueryTools.ts#getBotToolByName@583", + "order": 20, + "nodeId": "func:src/server/botQueryTools.ts#getBotToolByName@583", + "title": "getBotToolByName", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:src/server/botQueryTools.ts#getTodayStr@10=>func:src/server/botQueryTools.ts#value@17", + "edge:call:func:src/server/botQueryTools.ts#createBotQueryContext@116=>func:src/server/botQueryTools.ts#getTodayStr@10", + "edge:call:func:src/server/aiChatService.ts#appendMemoryTurn@72=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "edge:call:func:src/server/aiChatService.ts#executeToolCall@156=>func:src/server/botQueryTools.ts#getBotToolByName@583", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#isAiConfigured@30", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildSystemPrompt@107", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildToolSpecs@93", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#callChatCompletion@124", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#executeToolCall@156", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#appendMemoryTurn@72", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyText@1147", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#isAiConfigured@30", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#clearBotMemory@79", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/botQueryTools.ts#createBotQueryContext@116", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#answerBotQuestion@185", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyToDingTalkSessionMarkdown@222" + ], + "summary": "以 handleDingTalkRobotMessage 为入口的调用链,覆盖 21 个函数" + }, + { + "id": "flow:call:func:server.ts#notifyTaskConfirmedCompleted@363", + "name": "notifyTaskConfirmedCompleted (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "steps": [ + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#notifyTaskConfirmedCompleted@363", + "order": 0, + "nodeId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "title": "notifyTaskConfirmedCompleted", + "nextStepIds": [ + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getTaskRelatedPersonNames@239", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getWorkflowLink@252" + ] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getTaskRelatedPersonNames@239", + "order": 1, + "nodeId": "func:server.ts#getTaskRelatedPersonNames@239", + "title": "getTaskRelatedPersonNames", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#listPeople@53", + "order": 2, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 3, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getWorkflowLink@252", + "order": 4, + "nodeId": "func:server.ts#getWorkflowLink@252", + "title": "getWorkflowLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 5, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 6, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteError@98", + "order": 7, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#readRemoteJson@110", + "order": 8, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#notifyTaskConfirmedCompleted@363:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 9, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getTaskRelatedPersonNames@239", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getWorkflowLink@252" + ], + "summary": "以 notifyTaskConfirmedCompleted 为入口的调用链,覆盖 10 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/auth/sso-login@605", + "name": "POST /api/auth/sso-login (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/auth/sso-login@605", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#POST /api/auth/sso-login@605", + "order": 0, + "nodeId": "func:server.ts#POST /api/auth/sso-login@605", + "title": "POST /api/auth/sso-login", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#ensureSsoConfigured@417", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoUserAccessToken@444", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoCurrentUser@471", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#createPerson@73" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#ensureSsoConfigured@417", + "order": 1, + "nodeId": "func:server.ts#ensureSsoConfigured@417", + "title": "ensureSsoConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoUserAccessToken@444", + "order": 2, + "nodeId": "func:server.ts#getSsoUserAccessToken@444", + "title": "getSsoUserAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoRedirectUri@423", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoCurrentUser@471", + "order": 3, + "nodeId": "func:server.ts#getSsoCurrentUser@471", + "title": "getSsoCurrentUser", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#createPerson@73", + "order": 4, + "nodeId": "func:src/server/personRepository.ts#createPerson@73", + "title": "createPerson", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#getSsoRedirectUri@423", + "order": 5, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteError@98", + "order": 6, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:server.ts#readRemoteJson@110", + "order": 7, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-login@605:func:src/server/personRepository.ts#toPerson@4", + "order": 8, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#ensureSsoConfigured@417", + "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoUserAccessToken@444", + "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:server.ts#getSsoCurrentUser@471", + "edge:call:func:server.ts#POST /api/auth/sso-login@605=>func:src/server/personRepository.ts#createPerson@73" + ], + "summary": "以 POST /api/auth/sso-login 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/auth/sso-join-person@642", + "name": "POST /api/auth/sso-join-person (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/auth/sso-join-person@642", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#POST /api/auth/sso-join-person@642", + "order": 0, + "nodeId": "func:server.ts#POST /api/auth/sso-join-person@642", + "title": "POST /api/auth/sso-join-person", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#ensureSsoConfigured@417", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoUserAccessToken@444", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoCurrentUser@471", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#createPerson@73" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#ensureSsoConfigured@417", + "order": 1, + "nodeId": "func:server.ts#ensureSsoConfigured@417", + "title": "ensureSsoConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoUserAccessToken@444", + "order": 2, + "nodeId": "func:server.ts#getSsoUserAccessToken@444", + "title": "getSsoUserAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoRedirectUri@423", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoCurrentUser@471", + "order": 3, + "nodeId": "func:server.ts#getSsoCurrentUser@471", + "title": "getSsoCurrentUser", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#createPerson@73", + "order": 4, + "nodeId": "func:src/server/personRepository.ts#createPerson@73", + "title": "createPerson", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#getSsoRedirectUri@423", + "order": 5, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteError@98", + "order": 6, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:server.ts#readRemoteJson@110", + "order": 7, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/sso-join-person@642:func:src/server/personRepository.ts#toPerson@4", + "order": 8, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#ensureSsoConfigured@417", + "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoUserAccessToken@444", + "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:server.ts#getSsoCurrentUser@471", + "edge:call:func:server.ts#POST /api/auth/sso-join-person@642=>func:src/server/personRepository.ts#createPerson@73" + ], + "summary": "以 POST /api/auth/sso-join-person 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/notify@944", + "name": "POST /api/notify (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/notify@944", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#POST /api/notify@944", + "order": 0, + "nodeId": "func:server.ts#POST /api/notify@944", + "title": "POST /api/notify", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#normalizeActionType@1058", + "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getNotificationState@1065", + "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getWorkflowLink@252", + "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#createNotificationLog@37" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#normalizeActionType@1058", + "order": 1, + "nodeId": "func:server.ts#normalizeActionType@1058", + "title": "normalizeActionType", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getNotificationState@1065", + "order": 2, + "nodeId": "func:server.ts#getNotificationState@1065", + "title": "getNotificationState", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:server.ts#getWorkflowLink@252", + "order": 3, + "nodeId": "func:server.ts#getWorkflowLink@252", + "title": "getWorkflowLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#createNotificationLog@37", + "order": 4, + "nodeId": "func:src/server/notificationRepository.ts#createNotificationLog@37", + "title": "createNotificationLog", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#toNotificationLog@17" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/notify@944:func:src/server/notificationRepository.ts#toNotificationLog@17", + "order": 5, + "nodeId": "func:src/server/notificationRepository.ts#toNotificationLog@17", + "title": "toNotificationLog", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/notificationRepository.ts#createNotificationLog@37=>func:src/server/notificationRepository.ts#toNotificationLog@17", + "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#normalizeActionType@1058", + "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getNotificationState@1065", + "edge:call:func:server.ts#POST /api/notify@944=>func:server.ts#getWorkflowLink@252", + "edge:call:func:server.ts#POST /api/notify@944=>func:src/server/notificationRepository.ts#createNotificationLog@37" + ], + "summary": "以 POST /api/notify 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:server.ts#getDingTalkRobotAccessToken@128", + "name": "getDingTalkRobotAccessToken (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "steps": [ + { + "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 0, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 1, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteError@98", + "order": 2, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#getDingTalkRobotAccessToken@128:func:server.ts#readRemoteJson@110", + "order": 3, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 getDingTalkRobotAccessToken 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "name": "sendDingTalkRobotMarkdownMessage (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "steps": [ + { + "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 0, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 1, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteError@98", + "order": 2, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#readRemoteJson@110", + "order": 3, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 4, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 sendDingTalkRobotMarkdownMessage 为入口的调用链,覆盖 5 个函数" + }, + { + "id": "flow:call:func:server.ts#getSsoUserAccessToken@444", + "name": "getSsoUserAccessToken (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#getSsoUserAccessToken@444", + "steps": [ + { + "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#getSsoUserAccessToken@444", + "order": 0, + "nodeId": "func:server.ts#getSsoUserAccessToken@444", + "title": "getSsoUserAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#getSsoRedirectUri@423", + "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#getSsoRedirectUri@423", + "order": 1, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteError@98", + "order": 2, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#getSsoUserAccessToken@444:func:server.ts#readRemoteJson@110", + "order": 3, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#getSsoRedirectUri@423", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoUserAccessToken@444=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 getSsoUserAccessToken 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:server.ts#PUT /api/tasks/:id@865", + "name": "PUT /api/tasks/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#PUT /api/tasks/:id@865", + "steps": [ + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#PUT /api/tasks/:id@865", + "order": 0, + "nodeId": "func:server.ts#PUT /api/tasks/:id@865", + "title": "PUT /api/tasks/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTask@190", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#updateTask@302", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#notifyTaskConfirmedCompleted@363" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTask@190", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#getTask@190", + "title": "getTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#updateTask@302", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#updateTask@302", + "title": "updateTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#notifyTaskConfirmedCompleted@363", + "order": 3, + "nodeId": "func:server.ts#notifyTaskConfirmedCompleted@363", + "title": "notifyTaskConfirmedCompleted", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getTaskRelatedPersonNames@239", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getWorkflowLink@252" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "order": 5, + "nodeId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "title": "getWeeklyPlanOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getTaskRelatedPersonNames@239", + "order": 6, + "nodeId": "func:server.ts#getTaskRelatedPersonNames@239", + "title": "getTaskRelatedPersonNames", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#listPeople@53", + "order": 7, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 8, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getWorkflowLink@252", + "order": 9, + "nodeId": "func:server.ts#getWorkflowLink@252", + "title": "getWorkflowLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 10, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#toTask@163", + "order": 11, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "order": 12, + "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "title": "toWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 13, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 14, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteError@98", + "order": 15, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#readRemoteJson@110", + "order": 16, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 17, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 18, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "order": 19, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "title": "dateToInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/tasks/:id@865:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 20, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#getTask@190=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "edge:call:func:src/server/taskRepository.ts#updateTask@302=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getTaskRelatedPersonNames@239", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "edge:call:func:server.ts#notifyTaskConfirmedCompleted@363=>func:server.ts#getWorkflowLink@252", + "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#getTask@190", + "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:src/server/taskRepository.ts#updateTask@302", + "edge:call:func:server.ts#PUT /api/tasks/:id@865=>func:server.ts#notifyTaskConfirmedCompleted@363" + ], + "summary": "以 PUT /api/tasks/:id 为入口的调用链,覆盖 21 个函数" + }, + { + "id": "flow:call:func:server.ts#replyToDingTalkSession@204", + "name": "replyToDingTalkSession (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#replyToDingTalkSession@204", + "steps": [ + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#replyToDingTalkSession@204", + "order": 0, + "nodeId": "func:server.ts#replyToDingTalkSession@204", + "title": "replyToDingTalkSession", + "nextStepIds": [ + "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteError@98", + "order": 1, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSession@204:func:server.ts#readRemoteJson@110", + "order": 2, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 replyToDingTalkSession 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222", + "name": "replyToDingTalkSessionMarkdown (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "steps": [ + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#replyToDingTalkSessionMarkdown@222", + "order": 0, + "nodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "title": "replyToDingTalkSessionMarkdown", + "nextStepIds": [ + "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteError@98", + "order": 1, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#replyToDingTalkSessionMarkdown@222:func:server.ts#readRemoteJson@110", + "order": 2, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 replyToDingTalkSessionMarkdown 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#getSsoCurrentUser@471", + "name": "getSsoCurrentUser (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#getSsoCurrentUser@471", + "steps": [ + { + "id": "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#getSsoCurrentUser@471", + "order": 0, + "nodeId": "func:server.ts#getSsoCurrentUser@471", + "title": "getSsoCurrentUser", + "nextStepIds": [ + "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteError@98", + "order": 1, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#getSsoCurrentUser@471:func:server.ts#readRemoteJson@110", + "order": 2, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getSsoCurrentUser@471=>func:server.ts#readRemoteJson@110" + ], + "summary": "以 getSsoCurrentUser 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/auth/sso-login-url@508", + "name": "GET /api/auth/sso-login-url (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/auth/sso-login-url@508", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#GET /api/auth/sso-login-url@508", + "order": 0, + "nodeId": "func:server.ts#GET /api/auth/sso-login-url@508", + "title": "GET /api/auth/sso-login-url", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#ensureSsoConfigured@417", + "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoAuthUrl@432" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#ensureSsoConfigured@417", + "order": 1, + "nodeId": "func:server.ts#ensureSsoConfigured@417", + "title": "ensureSsoConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoAuthUrl@432", + "order": 2, + "nodeId": "func:server.ts#getSsoAuthUrl@432", + "title": "getSsoAuthUrl", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoRedirectUri@423" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-login-url@508:func:server.ts#getSsoRedirectUri@423", + "order": 3, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getSsoAuthUrl@432=>func:server.ts#getSsoRedirectUri@423", + "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#ensureSsoConfigured@417", + "edge:call:func:server.ts#GET /api/auth/sso-login-url@508=>func:server.ts#getSsoAuthUrl@432" + ], + "summary": "以 GET /api/auth/sso-login-url 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/people@669", + "name": "GET /api/people (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/people@669", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/people@669:func:server.ts#GET /api/people@669", + "order": 0, + "nodeId": "func:server.ts#GET /api/people@669", + "title": "GET /api/people", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/people@669:func:server.ts#ensureManualLoginPeople@84", + "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#listPeople@53" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/people@669:func:server.ts#ensureManualLoginPeople@84", + "order": 1, + "nodeId": "func:server.ts#ensureManualLoginPeople@84", + "title": "ensureManualLoginPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeople@118" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#listPeople@53", + "order": 2, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeople@118", + "order": 3, + "nodeId": "func:src/server/personRepository.ts#ensurePeople@118", + "title": "ensurePeople", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/people@669:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 4, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:server.ts#ensureManualLoginPeople@84=>func:src/server/personRepository.ts#ensurePeople@118", + "edge:call:func:server.ts#GET /api/people@669=>func:server.ts#ensureManualLoginPeople@84", + "edge:call:func:server.ts#GET /api/people@669=>func:src/server/personRepository.ts#listPeople@53" + ], + "summary": "以 GET /api/people 为入口的调用链,覆盖 5 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705", + "name": "POST /api/dingtalk/robot/send-message (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#POST /api/dingtalk/robot/send-message@705", + "order": 0, + "nodeId": "func:server.ts#POST /api/dingtalk/robot/send-message@705", + "title": "POST /api/dingtalk/robot/send-message", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#getPersonOrThrow@64", + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#sendDingTalkRobotMarkdownMessage@162" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#getPersonOrThrow@64", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#getPersonOrThrow@64", + "title": "getPersonOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 2, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:src/server/personRepository.ts#toPerson@4", + "order": 3, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 4, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteError@98", + "order": 5, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#readRemoteJson@110", + "order": 6, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/dingtalk/robot/send-message@705:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 7, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#getPersonOrThrow@64=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:src/server/personRepository.ts#getPersonOrThrow@64", + "edge:call:func:server.ts#POST /api/dingtalk/robot/send-message@705=>func:server.ts#sendDingTalkRobotMarkdownMessage@162" + ], + "summary": "以 POST /api/dingtalk/robot/send-message 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#checkAndRun@1090", + "name": "checkAndRun (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#checkAndRun@1090", + "steps": [ + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#checkAndRun@1090", + "order": 0, + "nodeId": "func:server.ts#checkAndRun@1090", + "title": "checkAndRun", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getZonedDateParts@261", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDailyDueNodeReminder@298" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getZonedDateParts@261", + "order": 1, + "nodeId": "func:server.ts#getZonedDateParts@261", + "title": "getZonedDateParts", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#value@271" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDailyDueNodeReminder@298", + "order": 2, + "nodeId": "func:server.ts#sendDailyDueNodeReminder@298", + "title": "sendDailyDueNodeReminder", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getZonedDateParts@261", + "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/taskRepository.ts#listTasks@194", + "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDueTimeRanges@290", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getPersonNamesForDueNodeReminder@280", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getWorkflowLink@252" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#value@271", + "order": 3, + "nodeId": "func:server.ts#value@271", + "title": "value", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/taskRepository.ts#listTasks@194", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#listTasks@194", + "title": "listTasks", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#listPeople@53", + "order": 5, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDueTimeRanges@290", + "order": 6, + "nodeId": "func:server.ts#getDueTimeRanges@290", + "title": "getDueTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getPersonNamesForDueNodeReminder@280", + "order": 7, + "nodeId": "func:server.ts#getPersonNamesForDueNodeReminder@280", + "title": "getPersonNamesForDueNodeReminder", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "order": 8, + "nodeId": "func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "title": "sendDingTalkRobotMarkdownMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDingTalkRobotAccessToken@128", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getWorkflowLink@252", + "order": 9, + "nodeId": "func:server.ts#getWorkflowLink@252", + "title": "getWorkflowLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 10, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#getDingTalkRobotAccessToken@128", + "order": 11, + "nodeId": "func:server.ts#getDingTalkRobotAccessToken@128", + "title": "getDingTalkRobotAccessToken", + "nextStepIds": [ + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#ensureDingTalkRobotConfigured@122", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteError@98", + "order": 12, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#readRemoteJson@110", + "order": 13, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#checkAndRun@1090:func:server.ts#ensureDingTalkRobotConfigured@122", + "order": 14, + "nodeId": "func:server.ts#ensureDingTalkRobotConfigured@122", + "title": "ensureDingTalkRobotConfigured", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#ensureDingTalkRobotConfigured@122", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#getDingTalkRobotAccessToken@128=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#getDingTalkRobotAccessToken@128", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#sendDingTalkRobotMarkdownMessage@162=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getZonedDateParts@261", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/taskRepository.ts#listTasks@194", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getDueTimeRanges@290", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getPersonNamesForDueNodeReminder@280", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#sendDingTalkRobotMarkdownMessage@162", + "edge:call:func:server.ts#sendDailyDueNodeReminder@298=>func:server.ts#getWorkflowLink@252", + "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#getZonedDateParts@261", + "edge:call:func:server.ts#checkAndRun@1090=>func:server.ts#sendDailyDueNodeReminder@298" + ], + "summary": "以 checkAndRun 为入口的调用链,覆盖 15 个函数" + }, + { + "id": "flow:call:func:server.ts#listen() 回调@1250@1250", + "name": "listen() 回调@1250 (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#listen() 回调@1250@1250", + "steps": [ + { + "id": "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#listen() 回调@1250@1250", + "order": 0, + "nodeId": "func:server.ts#listen() 回调@1250@1250", + "title": "listen() 回调@1250", + "nextStepIds": [ + "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDailyDueNodeReminderScheduler@1089", + "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDingTalkRobotStream@1204" + ] + }, + { + "id": "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDailyDueNodeReminderScheduler@1089", + "order": 1, + "nodeId": "func:server.ts#startDailyDueNodeReminderScheduler@1089", + "title": "startDailyDueNodeReminderScheduler", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#listen() 回调@1250@1250:func:server.ts#startDingTalkRobotStream@1204", + "order": 2, + "nodeId": "func:server.ts#startDingTalkRobotStream@1204", + "title": "startDingTalkRobotStream", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDailyDueNodeReminderScheduler@1089", + "edge:call:func:server.ts#listen() 回调@1250@1250=>func:server.ts#startDingTalkRobotStream@1204" + ], + "summary": "以 listen() 回调@1250 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#ensureManualLoginPeople@84", + "name": "ensureManualLoginPeople (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#ensureManualLoginPeople@84", + "steps": [ + { + "id": "step:flow:call:func:server.ts#ensureManualLoginPeople@84:func:server.ts#ensureManualLoginPeople@84", + "order": 0, + "nodeId": "func:server.ts#ensureManualLoginPeople@84", + "title": "ensureManualLoginPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#ensureManualLoginPeople@84:func:src/server/personRepository.ts#ensurePeople@118" + ] + }, + { + "id": "step:flow:call:func:server.ts#ensureManualLoginPeople@84:func:src/server/personRepository.ts#ensurePeople@118", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#ensurePeople@118", + "title": "ensurePeople", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#ensureManualLoginPeople@84=>func:src/server/personRepository.ts#ensurePeople@118" + ], + "summary": "以 ensureManualLoginPeople 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#getZonedDateParts@261", + "name": "getZonedDateParts (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#getZonedDateParts@261", + "steps": [ + { + "id": "step:flow:call:func:server.ts#getZonedDateParts@261:func:server.ts#getZonedDateParts@261", + "order": 0, + "nodeId": "func:server.ts#getZonedDateParts@261", + "title": "getZonedDateParts", + "nextStepIds": [ + "step:flow:call:func:server.ts#getZonedDateParts@261:func:server.ts#value@271" + ] + }, + { + "id": "step:flow:call:func:server.ts#getZonedDateParts@261:func:server.ts#value@271", + "order": 1, + "nodeId": "func:server.ts#value@271", + "title": "value", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getZonedDateParts@261=>func:server.ts#value@271" + ], + "summary": "以 getZonedDateParts 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#getSsoAuthUrl@432", + "name": "getSsoAuthUrl (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#getSsoAuthUrl@432", + "steps": [ + { + "id": "step:flow:call:func:server.ts#getSsoAuthUrl@432:func:server.ts#getSsoAuthUrl@432", + "order": 0, + "nodeId": "func:server.ts#getSsoAuthUrl@432", + "title": "getSsoAuthUrl", + "nextStepIds": [ + "step:flow:call:func:server.ts#getSsoAuthUrl@432:func:server.ts#getSsoRedirectUri@423" + ] + }, + { + "id": "step:flow:call:func:server.ts#getSsoAuthUrl@432:func:server.ts#getSsoRedirectUri@423", + "order": 1, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#getSsoAuthUrl@432=>func:server.ts#getSsoRedirectUri@423" + ], + "summary": "以 getSsoAuthUrl 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/auth/sso-config@498", + "name": "GET /api/auth/sso-config (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/auth/sso-config@498", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-config@498:func:server.ts#GET /api/auth/sso-config@498", + "order": 0, + "nodeId": "func:server.ts#GET /api/auth/sso-config@498", + "title": "GET /api/auth/sso-config", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/auth/sso-config@498:func:server.ts#getSsoRedirectUri@423" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/auth/sso-config@498:func:server.ts#getSsoRedirectUri@423", + "order": 1, + "nodeId": "func:server.ts#getSsoRedirectUri@423", + "title": "getSsoRedirectUri", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#GET /api/auth/sso-config@498=>func:server.ts#getSsoRedirectUri@423" + ], + "summary": "以 GET /api/auth/sso-config 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/auth/dev-login@575", + "name": "POST /api/auth/dev-login (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/auth/dev-login@575", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:server.ts#POST /api/auth/dev-login@575", + "order": 0, + "nodeId": "func:server.ts#POST /api/auth/dev-login@575", + "title": "POST /api/auth/dev-login", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#createPerson@73" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#createPerson@73", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#createPerson@73", + "title": "createPerson", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/auth/dev-login@575:func:src/server/personRepository.ts#toPerson@4", + "order": 2, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#POST /api/auth/dev-login@575=>func:src/server/personRepository.ts#createPerson@73" + ], + "summary": "以 POST /api/auth/dev-login 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/people@678", + "name": "POST /api/people (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/people@678", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/people@678:func:server.ts#POST /api/people@678", + "order": 0, + "nodeId": "func:server.ts#POST /api/people@678", + "title": "POST /api/people", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#createPerson@73" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#createPerson@73", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#createPerson@73", + "title": "createPerson", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/people@678:func:src/server/personRepository.ts#toPerson@4", + "order": 2, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#createPerson@73=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#POST /api/people@678=>func:src/server/personRepository.ts#createPerson@73" + ], + "summary": "以 POST /api/people 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#PUT /api/people/:id@687", + "name": "PUT /api/people/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#PUT /api/people/:id@687", + "steps": [ + { + "id": "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:server.ts#PUT /api/people/:id@687", + "order": 0, + "nodeId": "func:server.ts#PUT /api/people/:id@687", + "title": "PUT /api/people/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#updatePerson@142" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#updatePerson@142", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#updatePerson@142", + "title": "updatePerson", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#toPerson@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/people/:id@687:func:src/server/personRepository.ts#toPerson@4", + "order": 2, + "nodeId": "func:src/server/personRepository.ts#toPerson@4", + "title": "toPerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#updatePerson@142=>func:src/server/personRepository.ts#toPerson@4", + "edge:call:func:server.ts#PUT /api/people/:id@687=>func:src/server/personRepository.ts#updatePerson@142" + ], + "summary": "以 PUT /api/people/:id 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/people/:id@696", + "name": "DELETE /api/people/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/people/:id@696", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/people/:id@696:func:server.ts#DELETE /api/people/:id@696", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/people/:id@696", + "title": "DELETE /api/people/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/people/:id@696:func:src/server/personRepository.ts#deletePerson@177" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/people/:id@696:func:src/server/personRepository.ts#deletePerson@177", + "order": 1, + "nodeId": "func:src/server/personRepository.ts#deletePerson@177", + "title": "deletePerson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#DELETE /api/people/:id@696=>func:src/server/personRepository.ts#deletePerson@177" + ], + "summary": "以 DELETE /api/people/:id 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/tags@737", + "name": "GET /api/tags (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/tags@737", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/tags@737:func:server.ts#GET /api/tags@737", + "order": 0, + "nodeId": "func:server.ts#GET /api/tags@737", + "title": "GET /api/tags", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tags@737:func:src/server/tagRepository.ts#listTagDefinitions@11" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tags@737:func:src/server/tagRepository.ts#listTagDefinitions@11", + "order": 1, + "nodeId": "func:src/server/tagRepository.ts#listTagDefinitions@11", + "title": "listTagDefinitions", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#GET /api/tags@737=>func:src/server/tagRepository.ts#listTagDefinitions@11" + ], + "summary": "以 GET /api/tags 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/tags@745", + "name": "POST /api/tags (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/tags@745", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/tags@745:func:server.ts#POST /api/tags@745", + "order": 0, + "nodeId": "func:server.ts#POST /api/tags@745", + "title": "POST /api/tags", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#createTagDefinition@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#createTagDefinition@19", + "order": 1, + "nodeId": "func:src/server/tagRepository.ts#createTagDefinition@19", + "title": "createTagDefinition", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#toTagDefinition@4" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tags@745:func:src/server/tagRepository.ts#toTagDefinition@4", + "order": 2, + "nodeId": "func:src/server/tagRepository.ts#toTagDefinition@4", + "title": "toTagDefinition", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/tagRepository.ts#createTagDefinition@19=>func:src/server/tagRepository.ts#toTagDefinition@4", + "edge:call:func:server.ts#POST /api/tags@745=>func:src/server/tagRepository.ts#createTagDefinition@19" + ], + "summary": "以 POST /api/tags 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/tags/:id@754", + "name": "DELETE /api/tags/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/tags/:id@754", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/tags/:id@754:func:server.ts#DELETE /api/tags/:id@754", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/tags/:id@754", + "title": "DELETE /api/tags/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tags/:id@754:func:src/server/tagRepository.ts#deleteTagDefinition@34" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tags/:id@754:func:src/server/tagRepository.ts#deleteTagDefinition@34", + "order": 1, + "nodeId": "func:src/server/tagRepository.ts#deleteTagDefinition@34", + "title": "deleteTagDefinition", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#DELETE /api/tags/:id@754=>func:src/server/tagRepository.ts#deleteTagDefinition@34" + ], + "summary": "以 DELETE /api/tags/:id 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/weekly-plans@764", + "name": "GET /api/weekly-plans (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/weekly-plans@764", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:server.ts#GET /api/weekly-plans@764", + "order": 0, + "nodeId": "func:server.ts#GET /api/weekly-plans@764", + "title": "GET /api/weekly-plans", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "order": 1, + "nodeId": "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "title": "listWeeklyPlans", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "order": 2, + "nodeId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "title": "ensurePublicPoolPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#addDays@13", + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "order": 3, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#addDays@13", + "order": 4, + "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "title": "addDays", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "order": 5, + "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "title": "toWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/weekly-plans@764:func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "order": 6, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "title": "dateToInput", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "edge:call:func:server.ts#GET /api/weekly-plans@764=>func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55" + ], + "summary": "以 GET /api/weekly-plans 为入口的调用链,覆盖 7 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/weekly-plans@772", + "name": "POST /api/weekly-plans (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/weekly-plans@772", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:server.ts#POST /api/weekly-plans@772", + "order": 0, + "nodeId": "func:server.ts#POST /api/weekly-plans@772", + "title": "POST /api/weekly-plans", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "order": 1, + "nodeId": "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "title": "createWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#addDays@13", + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#addDays@13", + "order": 2, + "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "title": "addDays", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "order": 3, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "order": 4, + "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "title": "toWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/weekly-plans@772:func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "order": 5, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "title": "dateToInput", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:server.ts#POST /api/weekly-plans@772=>func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69" + ], + "summary": "以 POST /api/weekly-plans 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781", + "name": "DELETE /api/weekly-plans/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/weekly-plans/:id@781", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:server.ts#DELETE /api/weekly-plans/:id@781", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/weekly-plans/:id@781", + "title": "DELETE /api/weekly-plans/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "order": 1, + "nodeId": "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "title": "deleteWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "order": 2, + "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "title": "toWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "order": 3, + "nodeId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "title": "getDefaultWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "order": 4, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "title": "dateToInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "order": 5, + "nodeId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "title": "ensurePublicPoolPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#addDays@13", + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "order": 6, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#addDays@13", + "order": 7, + "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "title": "addDays", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#DELETE /api/weekly-plans/:id@781:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + } + ], + "edgeIds": [ + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "edge:call:func:server.ts#DELETE /api/weekly-plans/:id@781=>func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102" + ], + "summary": "以 DELETE /api/weekly-plans/:id 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/project-templates@791", + "name": "GET /api/project-templates (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/project-templates@791", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/project-templates@791:func:server.ts#GET /api/project-templates@791", + "order": 0, + "nodeId": "func:server.ts#GET /api/project-templates@791", + "title": "GET /api/project-templates", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/project-templates@791:func:src/server/projectTemplateRepository.ts#listProjectTemplates@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/project-templates@791:func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "order": 1, + "nodeId": "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "title": "listProjectTemplates", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#GET /api/project-templates@791=>func:src/server/projectTemplateRepository.ts#listProjectTemplates@110" + ], + "summary": "以 GET /api/project-templates 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/project-templates@799", + "name": "POST /api/project-templates (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/project-templates@799", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:server.ts#POST /api/project-templates@799", + "order": 0, + "nodeId": "func:server.ts#POST /api/project-templates@799", + "title": "POST /api/project-templates", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "order": 1, + "nodeId": "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "title": "createProjectTemplate", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "order": 2, + "nodeId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "order": 3, + "nodeId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "title": "toTemplateNodesJson", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "order": 4, + "nodeId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "title": "toProjectTemplate", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/project-templates@799:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "order": 5, + "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "title": "normalizeTemplateNodes", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "edge:call:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "edge:call:func:src/server/projectTemplateRepository.ts#createProjectTemplate@118=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "edge:call:func:server.ts#POST /api/project-templates@799=>func:src/server/projectTemplateRepository.ts#createProjectTemplate@118" + ], + "summary": "以 POST /api/project-templates 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:server.ts#PUT /api/project-templates/:id@808", + "name": "PUT /api/project-templates/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#PUT /api/project-templates/:id@808", + "steps": [ + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:server.ts#PUT /api/project-templates/:id@808", + "order": 0, + "nodeId": "func:server.ts#PUT /api/project-templates/:id@808", + "title": "PUT /api/project-templates/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "order": 1, + "nodeId": "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "title": "updateProjectTemplate", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "order": 2, + "nodeId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "order": 3, + "nodeId": "func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "title": "toTemplateNodesJson", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "order": 4, + "nodeId": "func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "title": "toProjectTemplate", + "nextStepIds": [ + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54" + ] + }, + { + "id": "step:flow:call:func:server.ts#PUT /api/project-templates/:id@808:func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "order": 5, + "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "title": "normalizeTemplateNodes", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "edge:call:func:src/server/projectTemplateRepository.ts#toProjectTemplate@96=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "edge:call:func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106=>func:src/server/projectTemplateRepository.ts#normalizeTemplateNodes@54", + "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toTemplateNodesJson@106", + "edge:call:func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136=>func:src/server/projectTemplateRepository.ts#toProjectTemplate@96", + "edge:call:func:server.ts#PUT /api/project-templates/:id@808=>func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136" + ], + "summary": "以 PUT /api/project-templates/:id 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/project-templates/:id@817", + "name": "DELETE /api/project-templates/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/project-templates/:id@817", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/project-templates/:id@817:func:server.ts#DELETE /api/project-templates/:id@817", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/project-templates/:id@817", + "title": "DELETE /api/project-templates/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/project-templates/:id@817:func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/project-templates/:id@817:func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "order": 1, + "nodeId": "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "title": "deleteProjectTemplate", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#DELETE /api/project-templates/:id@817=>func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158" + ], + "summary": "以 DELETE /api/project-templates/:id 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/tasks@826", + "name": "GET /api/tasks (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/tasks@826", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/tasks@826:func:server.ts#GET /api/tasks@826", + "order": 0, + "nodeId": "func:server.ts#GET /api/tasks@826", + "title": "GET /api/tasks", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tasks@826:func:src/server/taskRepository.ts#listTasks@194" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks@826:func:src/server/taskRepository.ts#listTasks@194", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#listTasks@194", + "title": "listTasks", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#GET /api/tasks@826=>func:src/server/taskRepository.ts#listTasks@194" + ], + "summary": "以 GET /api/tasks 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/tasks/:id@834", + "name": "GET /api/tasks/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/tasks/:id@834", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:server.ts#GET /api/tasks/:id@834", + "order": 0, + "nodeId": "func:server.ts#GET /api/tasks/:id@834", + "title": "GET /api/tasks/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTask@190" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTask@190", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#getTask@190", + "title": "getTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#toTask@163", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/tasks/:id@834:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#getTask@190=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#GET /api/tasks/:id@834=>func:src/server/taskRepository.ts#getTask@190" + ], + "summary": "以 GET /api/tasks/:id 为入口的调用链,覆盖 7 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/tasks@843", + "name": "POST /api/tasks (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/tasks@843", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:server.ts#POST /api/tasks@843", + "order": 0, + "nodeId": "func:server.ts#POST /api/tasks@843", + "title": "POST /api/tasks", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#createTask@227" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#createTask@227", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#createTask@227", + "title": "createTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#uniqueValues@40", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#existingTagNames@96", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#uniqueValues@40", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "order": 3, + "nodeId": "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "title": "getWeeklyPlanOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "order": 4, + "nodeId": "func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "title": "getDefaultWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "title": "getNextTaskSortOrder", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#existingTagNames@96", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#existingTagNames@96", + "title": "existingTagNames", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#uniqueValues@40" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "order": 8, + "nodeId": "func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "title": "toWeeklyPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "order": 9, + "nodeId": "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "title": "ensurePublicPoolPlan", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#addDays@13", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 10, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#toTask@163", + "order": 11, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "order": 12, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "title": "dateToInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "order": 13, + "nodeId": "func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#addDays@13", + "order": 14, + "nodeId": "func:src/server/weeklyPlanRepository.ts#addDays@13", + "title": "addDays", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/weeklyPlanRepository.ts#dateToInput@9" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 15, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks@843:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 16, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#addDays@13=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19=>func:src/server/weeklyPlanRepository.ts#dateToInput@9", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#dateFromInput@4", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#addDays@13", + "edge:call:func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51=>func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "edge:call:func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93=>func:src/server/weeklyPlanRepository.ts#toWeeklyPlan@19", + "edge:call:func:src/server/taskRepository.ts#existingTagNames@96=>func:src/server/taskRepository.ts#uniqueValues@40", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#uniqueValues@40", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/weeklyPlanRepository.ts#getDefaultWeeklyPlan@51", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#existingTagNames@96", + "edge:call:func:src/server/taskRepository.ts#createTask@227=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#POST /api/tasks@843=>func:src/server/taskRepository.ts#createTask@227" + ], + "summary": "以 POST /api/tasks 为入口的调用链,覆盖 17 个函数" + }, + { + "id": "flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852", + "name": "PATCH /api/tasks/:id/list-state (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "steps": [ + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:server.ts#PATCH /api/tasks/:id/list-state@852", + "order": 0, + "nodeId": "func:server.ts#PATCH /api/tasks/:id/list-state@852", + "title": "PATCH /api/tasks/:id/list-state", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#updateTaskListState@353" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#updateTaskListState@353", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#updateTaskListState@353", + "title": "updateTaskListState", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "title": "getFirstTaskSortOrder", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#toTask@163", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/list-state@852:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "edge:call:func:src/server/taskRepository.ts#updateTaskListState@353=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#PATCH /api/tasks/:id/list-state@852=>func:src/server/taskRepository.ts#updateTaskListState@353" + ], + "summary": "以 PATCH /api/tasks/:id/list-state 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/tasks/:id@886", + "name": "DELETE /api/tasks/:id (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/tasks/:id@886", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id@886:func:server.ts#DELETE /api/tasks/:id@886", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/tasks/:id@886", + "title": "DELETE /api/tasks/:id", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id@886:func:src/server/taskRepository.ts#deleteTask@383" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id@886:func:src/server/taskRepository.ts#deleteTask@383", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#deleteTask@383", + "title": "deleteTask", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#DELETE /api/tasks/:id@886=>func:src/server/taskRepository.ts#deleteTask@383" + ], + "summary": "以 DELETE /api/tasks/:id 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/tasks/:id/nodes@895", + "name": "POST /api/tasks/:id/nodes (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/tasks/:id/nodes@895", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:server.ts#POST /api/tasks/:id/nodes@895", + "order": 0, + "nodeId": "func:server.ts#POST /api/tasks/:id/nodes@895", + "title": "POST /api/tasks/:id/nodes", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#createWorkflowNode@389" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#createWorkflowNode@389", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#createWorkflowNode@389", + "title": "createWorkflowNode", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#ensureTaskExists@560", + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#ensureTaskExists@560", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#ensureTaskExists@560", + "title": "ensureTaskExists", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#toTask@163", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/nodes@895:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#ensureTaskExists@560", + "edge:call:func:src/server/taskRepository.ts#createWorkflowNode@389=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#POST /api/tasks/:id/nodes@895=>func:src/server/taskRepository.ts#createWorkflowNode@389" + ], + "summary": "以 POST /api/tasks/:id/nodes 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "name": "PATCH /api/tasks/:id/nodes/:nodeId (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "steps": [ + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "order": 0, + "nodeId": "func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905", + "title": "PATCH /api/tasks/:id/nodes/:nodeId", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#updateWorkflowNode@423" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#updateWorkflowNode@423", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "title": "updateWorkflowNode", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "title": "ensureWorkflowNodeExists", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#toTask@163", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "edge:call:func:src/server/taskRepository.ts#updateWorkflowNode@423=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905=>func:src/server/taskRepository.ts#updateWorkflowNode@423" + ], + "summary": "以 PATCH /api/tasks/:id/nodes/:nodeId 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "name": "DELETE /api/tasks/:id/nodes/:nodeId (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915", + "title": "DELETE /api/tasks/:id/nodes/:nodeId", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#deleteWorkflowNode@472" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "title": "deleteWorkflowNode", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "title": "ensureWorkflowNodeExists", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#toTask@163", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "edge:call:func:src/server/taskRepository.ts#deleteWorkflowNode@472=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915=>func:src/server/taskRepository.ts#deleteWorkflowNode@472" + ], + "summary": "以 DELETE /api/tasks/:id/nodes/:nodeId 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925", + "name": "POST /api/tasks/:id/dependencies (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#POST /api/tasks/:id/dependencies@925", + "steps": [ + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:server.ts#POST /api/tasks/:id/dependencies@925", + "order": 0, + "nodeId": "func:server.ts#POST /api/tasks/:id/dependencies@925", + "title": "POST /api/tasks/:id/dependencies", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#createNodeDependency@494" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#createNodeDependency@494", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#createNodeDependency@494", + "title": "createNodeDependency", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#hasDependencyPath@577", + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "title": "ensureWorkflowNodeExists", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#hasDependencyPath@577", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#hasDependencyPath@577", + "title": "hasDependencyPath", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#toTask@163", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#POST /api/tasks/:id/dependencies@925:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 8, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#hasDependencyPath@577", + "edge:call:func:src/server/taskRepository.ts#createNodeDependency@494=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#POST /api/tasks/:id/dependencies@925=>func:src/server/taskRepository.ts#createNodeDependency@494" + ], + "summary": "以 POST /api/tasks/:id/dependencies 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "name": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934", + "title": "DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#deleteNodeDependency@535" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#deleteNodeDependency@535", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "title": "deleteNodeDependency", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#ensureTaskExists@560", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#getTaskOrThrow@182" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#ensureTaskExists@560", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#ensureTaskExists@560", + "title": "ensureTaskExists", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#getTaskOrThrow@182", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#getTaskOrThrow@182", + "title": "getTaskOrThrow", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#findTaskRecord@111", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#toTask@163" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#findTaskRecord@111", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#findTaskRecord@111", + "title": "findTaskRecord", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#toTask@163", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#toTask@163", + "title": "toTask", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934:func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "order": 7, + "nodeId": "func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "title": "resolveTaskCompletionStatus", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#toTask@163=>func:src/server/taskRepository.ts#resolveTaskCompletionStatus@153", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#findTaskRecord@111", + "edge:call:func:src/server/taskRepository.ts#getTaskOrThrow@182=>func:src/server/taskRepository.ts#toTask@163", + "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#ensureTaskExists@560", + "edge:call:func:src/server/taskRepository.ts#deleteNodeDependency@535=>func:src/server/taskRepository.ts#getTaskOrThrow@182", + "edge:call:func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934=>func:src/server/taskRepository.ts#deleteNodeDependency@535" + ], + "summary": "以 DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:server.ts#GET /api/logs@1041", + "name": "GET /api/logs (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#GET /api/logs@1041", + "steps": [ + { + "id": "step:flow:call:func:server.ts#GET /api/logs@1041:func:server.ts#GET /api/logs@1041", + "order": 0, + "nodeId": "func:server.ts#GET /api/logs@1041", + "title": "GET /api/logs", + "nextStepIds": [ + "step:flow:call:func:server.ts#GET /api/logs@1041:func:src/server/notificationRepository.ts#listNotificationLogs@47" + ] + }, + { + "id": "step:flow:call:func:server.ts#GET /api/logs@1041:func:src/server/notificationRepository.ts#listNotificationLogs@47", + "order": 1, + "nodeId": "func:src/server/notificationRepository.ts#listNotificationLogs@47", + "title": "listNotificationLogs", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#GET /api/logs@1041=>func:src/server/notificationRepository.ts#listNotificationLogs@47" + ], + "summary": "以 GET /api/logs 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#DELETE /api/logs@1049", + "name": "DELETE /api/logs (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#DELETE /api/logs@1049", + "steps": [ + { + "id": "step:flow:call:func:server.ts#DELETE /api/logs@1049:func:server.ts#DELETE /api/logs@1049", + "order": 0, + "nodeId": "func:server.ts#DELETE /api/logs@1049", + "title": "DELETE /api/logs", + "nextStepIds": [ + "step:flow:call:func:server.ts#DELETE /api/logs@1049:func:src/server/notificationRepository.ts#clearNotificationLogs@56" + ] + }, + { + "id": "step:flow:call:func:server.ts#DELETE /api/logs@1049:func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "order": 1, + "nodeId": "func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "title": "clearNotificationLogs", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#DELETE /api/logs@1049=>func:src/server/notificationRepository.ts#clearNotificationLogs@56" + ], + "summary": "以 DELETE /api/logs 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:server.ts#replyText@1147", + "name": "replyText (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#replyText@1147", + "steps": [ + { + "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#replyText@1147", + "order": 0, + "nodeId": "func:server.ts#replyText@1147", + "title": "replyText", + "nextStepIds": [ + "step:flow:call:func:server.ts#replyText@1147:func:server.ts#replyToDingTalkSession@204" + ] + }, + { + "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#replyToDingTalkSession@204", + "order": 1, + "nodeId": "func:server.ts#replyToDingTalkSession@204", + "title": "replyToDingTalkSession", + "nextStepIds": [ + "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteError@98", + "order": 2, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#replyText@1147:func:server.ts#readRemoteJson@110", + "order": 3, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204" + ], + "summary": "以 replyText 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215", + "name": "registerCallbackListener() 回调@1215 (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#registerCallbackListener() 回调@1215@1215", + "steps": [ + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#registerCallbackListener() 回调@1215@1215", + "order": 0, + "nodeId": "func:server.ts#registerCallbackListener() 回调@1215@1215", + "title": "registerCallbackListener() 回调@1215", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#handleDingTalkRobotMessage@1114" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#handleDingTalkRobotMessage@1114", + "order": 1, + "nodeId": "func:server.ts#handleDingTalkRobotMessage@1114", + "title": "handleDingTalkRobotMessage", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyText@1147", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#isAiConfigured@30", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#clearBotMemory@79", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#listPeople@53", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#createBotQueryContext@116", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#answerBotQuestion@185", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSessionMarkdown@222" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyText@1147", + "order": 2, + "nodeId": "func:server.ts#replyText@1147", + "title": "replyText", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSession@204" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#isAiConfigured@30", + "order": 3, + "nodeId": "func:src/server/aiChatService.ts#isAiConfigured@30", + "title": "isAiConfigured", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#clearBotMemory@79", + "order": 4, + "nodeId": "func:src/server/aiChatService.ts#clearBotMemory@79", + "title": "clearBotMemory", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#listPeople@53", + "order": 5, + "nodeId": "func:src/server/personRepository.ts#listPeople@53", + "title": "listPeople", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#createBotQueryContext@116", + "order": 6, + "nodeId": "func:src/server/botQueryTools.ts#createBotQueryContext@116", + "title": "createBotQueryContext", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getTodayStr@10" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#answerBotQuestion@185", + "order": 7, + "nodeId": "func:src/server/aiChatService.ts#answerBotQuestion@185", + "title": "answerBotQuestion", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#isAiConfigured@30", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#getMemoryTurns@62", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildSystemPrompt@107", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildToolSpecs@93", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#callChatCompletion@124", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#executeToolCall@156", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#appendMemoryTurn@72" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSessionMarkdown@222", + "order": 8, + "nodeId": "func:server.ts#replyToDingTalkSessionMarkdown@222", + "title": "replyToDingTalkSessionMarkdown", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#replyToDingTalkSession@204", + "order": 9, + "nodeId": "func:server.ts#replyToDingTalkSession@204", + "title": "replyToDingTalkSession", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteError@98", + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteJson@110" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "order": 10, + "nodeId": "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "title": "ensurePeopleFromExistingResponsibles", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getTodayStr@10", + "order": 11, + "nodeId": "func:src/server/botQueryTools.ts#getTodayStr@10", + "title": "getTodayStr", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#value@17" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#getMemoryTurns@62", + "order": 12, + "nodeId": "func:src/server/aiChatService.ts#getMemoryTurns@62", + "title": "getMemoryTurns", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildSystemPrompt@107", + "order": 13, + "nodeId": "func:src/server/aiChatService.ts#buildSystemPrompt@107", + "title": "buildSystemPrompt", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#buildToolSpecs@93", + "order": 14, + "nodeId": "func:src/server/aiChatService.ts#buildToolSpecs@93", + "title": "buildToolSpecs", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#callChatCompletion@124", + "order": 15, + "nodeId": "func:src/server/aiChatService.ts#callChatCompletion@124", + "title": "callChatCompletion", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#executeToolCall@156", + "order": 16, + "nodeId": "func:src/server/aiChatService.ts#executeToolCall@156", + "title": "executeToolCall", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getBotToolByName@583" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#appendMemoryTurn@72", + "order": 17, + "nodeId": "func:src/server/aiChatService.ts#appendMemoryTurn@72", + "title": "appendMemoryTurn", + "nextStepIds": [ + "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/aiChatService.ts#getMemoryTurns@62" + ] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteError@98", + "order": 18, + "nodeId": "func:server.ts#readRemoteError@98", + "title": "readRemoteError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:server.ts#readRemoteJson@110", + "order": 19, + "nodeId": "func:server.ts#readRemoteJson@110", + "title": "readRemoteJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#value@17", + "order": 20, + "nodeId": "func:src/server/botQueryTools.ts#value@17", + "title": "value", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:server.ts#registerCallbackListener() 回调@1215@1215:func:src/server/botQueryTools.ts#getBotToolByName@583", + "order": 21, + "nodeId": "func:src/server/botQueryTools.ts#getBotToolByName@583", + "title": "getBotToolByName", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/personRepository.ts#listPeople@53=>func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "edge:call:func:src/server/botQueryTools.ts#getTodayStr@10=>func:src/server/botQueryTools.ts#value@17", + "edge:call:func:src/server/botQueryTools.ts#createBotQueryContext@116=>func:src/server/botQueryTools.ts#getTodayStr@10", + "edge:call:func:src/server/aiChatService.ts#appendMemoryTurn@72=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "edge:call:func:src/server/aiChatService.ts#executeToolCall@156=>func:src/server/botQueryTools.ts#getBotToolByName@583", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#isAiConfigured@30", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#getMemoryTurns@62", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildSystemPrompt@107", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#buildToolSpecs@93", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#callChatCompletion@124", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#executeToolCall@156", + "edge:call:func:src/server/aiChatService.ts#answerBotQuestion@185=>func:src/server/aiChatService.ts#appendMemoryTurn@72", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSession@204=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteError@98", + "edge:call:func:server.ts#replyToDingTalkSessionMarkdown@222=>func:server.ts#readRemoteJson@110", + "edge:call:func:server.ts#replyText@1147=>func:server.ts#replyToDingTalkSession@204", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyText@1147", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#isAiConfigured@30", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#clearBotMemory@79", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/personRepository.ts#listPeople@53", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/botQueryTools.ts#createBotQueryContext@116", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:src/server/aiChatService.ts#answerBotQuestion@185", + "edge:call:func:server.ts#handleDingTalkRobotMessage@1114=>func:server.ts#replyToDingTalkSessionMarkdown@222", + "edge:call:func:server.ts#registerCallbackListener() 回调@1215@1215=>func:server.ts#handleDingTalkRobotMessage@1114" + ], + "summary": "以 registerCallbackListener() 回调@1215 为入口的调用链,覆盖 22 个函数" + }, + { + "id": "flow:call:func:server.ts#@0", + "name": " (server.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:server.ts#@0", + "steps": [ + { + "id": "step:flow:call:func:server.ts#@0:func:server.ts#@0", + "order": 0, + "nodeId": "func:server.ts#@0", + "title": "", + "nextStepIds": [ + "step:flow:call:func:server.ts#@0:func:server.ts#startServer@1235" + ] + }, + { + "id": "step:flow:call:func:server.ts#@0:func:server.ts#startServer@1235", + "order": 1, + "nodeId": "func:server.ts#startServer@1235", + "title": "startServer", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:server.ts#@0=>func:server.ts#startServer@1235" + ], + "summary": "以 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "name": "NodeEditorDrawer (src/components/NodeEditorDrawer.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "steps": [ + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "order": 0, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123", + "title": "NodeEditorDrawer", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "order": 1, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 2, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 3, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "order": 4, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "title": "getStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "order": 5, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "title": "changeEditName", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "order": 6, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "title": "changeEditDesc", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "order": 7, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "title": "selectResponsible", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "order": 8, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "title": "removeTimeRange", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "order": 9, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "title": "changeTimeRange", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "order": 10, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "title": "getMinimumFirstStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "order": 11, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "title": "getParentLatestEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "order": 12, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "title": "changeProgress", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "order": 13, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "title": "focusLinkedNode", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "order": 14, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89", + "title": "getLinkedNodeClassName", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 15, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "order": 16, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "title": "updateSelectedNode", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getDraftKey@244" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "order": 17, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "title": "getCurrentDraft", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "order": 18, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "title": "updateTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "order": 19, + "nodeId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "title": "addDaysToDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "order": 20, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "title": "normalizeProgress", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 21, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "order": 22, + "nodeId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "title": "constrainNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123:func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "order": 23, + "nodeId": "func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "title": "getDraftKey", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getStatusMeta@61", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "edge:call:func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "edge:call:func:src/components/NodeEditorDrawer.tsx#selectResponsible@267=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getEffectiveNodeStatus@49", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275=>func:src/components/NodeEditorDrawer.tsx#getDraftKey@244", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditName@336=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "edge:call:func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "edge:call:func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367=>func:src/components/NodeEditorDrawer.tsx#updateTimeRanges@346", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#normalizeProgress@261", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#updateSelectedNode@275", + "edge:call:func:src/components/NodeEditorDrawer.tsx#changeProgress@372=>func:src/components/NodeEditorDrawer.tsx#getCurrentDraft@251", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditName@336", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeEditDesc@341", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#selectResponsible@267", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#removeTimeRange@367", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeTimeRange@357", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getMinimumFirstStartDate@231", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getParentLatestEndDate@220", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#changeProgress@372", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#focusLinkedNode@402", + "edge:call:func:src/components/NodeEditorDrawer.tsx#NodeEditorDrawer@123=>func:src/components/NodeEditorDrawer.tsx#getLinkedNodeClassName@89" + ], + "summary": "以 NodeEditorDrawer 为入口的调用链,覆盖 24 个函数" + }, + { + "id": "flow:call:func:src/server/botQueryTools.ts#execute@430", + "name": "execute (src/server/botQueryTools.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/botQueryTools.ts#execute@430", + "steps": [ + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#execute@430", + "order": 0, + "nodeId": "func:src/server/botQueryTools.ts#execute@430", + "title": "execute", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#planNameById@198", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#addDays@440", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeEndDate@34", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#overlapsRange@59", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#buildTaskLink@72" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "order": 1, + "nodeId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "title": "resolveTaskScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#selfScope@149", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#planNameById@198", + "order": 2, + "nodeId": "func:src/server/botQueryTools.ts#planNameById@198", + "title": "planNameById", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#addDays@440", + "order": 3, + "nodeId": "func:src/server/botQueryTools.ts#addDays@440", + "title": "addDays", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "order": 4, + "nodeId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "title": "isNodeOwnedByPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "order": 5, + "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeStartDate@28", + "order": 6, + "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "title": "nodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeEndDate@34", + "order": 7, + "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "title": "nodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#overlapsRange@59", + "order": 8, + "nodeId": "func:src/server/botQueryTools.ts#overlapsRange@59", + "title": "overlapsRange", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#buildTaskLink@72", + "order": 9, + "nodeId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "title": "buildTaskLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#selfScope@149", + "order": 10, + "nodeId": "func:src/server/botQueryTools.ts#selfScope@149", + "title": "selfScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "order": 11, + "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "title": "isTaskRelatedToPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@430:func:src/server/botQueryTools.ts#nodeRanges@21", + "order": 12, + "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "title": "nodeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#planNameById@198", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#addDays@440", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#overlapsRange@59", + "edge:call:func:src/server/botQueryTools.ts#execute@430=>func:src/server/botQueryTools.ts#buildTaskLink@72" + ], + "summary": "以 execute 为入口的调用链,覆盖 13 个函数" + }, + { + "id": "flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "name": "map() 回调@997 (src/components/WorkflowCanvas.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "steps": [ + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "order": 0, + "nodeId": "func:src/components/WorkflowCanvas.tsx#map() 回调@997@997", + "title": "map() 回调@997", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "order": 1, + "nodeId": "func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "order": 2, + "nodeId": "func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "title": "getStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "order": 3, + "nodeId": "func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "title": "getNodeProgressPercent", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "order": 5, + "nodeId": "func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "title": "handleNodeMouseDown", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "order": 6, + "nodeId": "func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "title": "handleNodeClick", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "order": 7, + "nodeId": "func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "title": "handleConnectionMouseDown", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "order": 8, + "nodeId": "func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "title": "handleConnectionHandleClick", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#createDraftNode@465" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "order": 9, + "nodeId": "func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93", + "title": "formatNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 10, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 11, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 12, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "order": 13, + "nodeId": "func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "title": "createDraftNode", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "order": 14, + "nodeId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "title": "findPreviewNodePosition", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "order": 15, + "nodeId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "title": "addDaysToDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "order": 16, + "nodeId": "func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "title": "createNodeTimeRange", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "order": 17, + "nodeId": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "title": "getOverlapArea", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343=>func:src/components/WorkflowCanvas.tsx#createDraftNode@465", + "edge:call:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361=>func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/WorkflowCanvas.tsx#createDraftNode@465=>func:src/utils/nodeTimeRanges.ts#createNodeTimeRange@3", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getEffectiveNodeStatus@74", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getStatusMeta@92", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#getNodeProgressPercent@86", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeMouseDown@133", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleNodeClick@150", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionMouseDown@325", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/components/WorkflowCanvas.tsx#handleConnectionHandleClick@343", + "edge:call:func:src/components/WorkflowCanvas.tsx#map() 回调@997@997=>func:src/utils/nodeTimeRanges.ts#formatNodeTimeRanges@93" + ], + "summary": "以 map() 回调@997 为入口的调用链,覆盖 18 个函数" + }, + { + "id": "flow:call:func:src/server/botQueryTools.ts#execute@349", + "name": "execute (src/server/botQueryTools.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/botQueryTools.ts#execute@349", + "steps": [ + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#execute@349", + "order": 0, + "nodeId": "func:src/server/botQueryTools.ts#execute@349", + "title": "execute", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#planNameById@198", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#taskDateSpan@51", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#buildTaskLink@72", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "order": 1, + "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "title": "isTaskRelatedToPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#planNameById@198", + "order": 2, + "nodeId": "func:src/server/botQueryTools.ts#planNameById@198", + "title": "planNameById", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#taskDateSpan@51", + "order": 3, + "nodeId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "title": "taskDateSpan", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#buildTaskLink@72", + "order": 4, + "nodeId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "title": "buildTaskLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "order": 5, + "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeStartDate@28", + "order": 6, + "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "title": "nodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeEndDate@34", + "order": 7, + "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "title": "nodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "order": 8, + "nodeId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "title": "isNodeOwnedByPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@349:func:src/server/botQueryTools.ts#nodeRanges@21", + "order": 9, + "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "title": "nodeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#planNameById@198", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#taskDateSpan@51", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#buildTaskLink@72", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#execute@349=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103" + ], + "summary": "以 execute 为入口的调用链,覆盖 10 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "name": "$transaction() 回调@313 (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@313@313", + "title": "$transaction() 回调@313", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#existingTagNames@96", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#replaceTaskNodes@605" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "title": "normalizeTaskCompletionStatus", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#existingTagNames@96", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#existingTagNames@96", + "title": "existingTagNames", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#replaceTaskNodes@605", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "title": "replaceTaskNodes", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313:func:src/server/taskRepository.ts#uniqueValues@40" + ] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#existingTagNames@96=>func:src/server/taskRepository.ts#uniqueValues@40", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#existingTagNames@96", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#uniqueValues@40", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@313@313=>func:src/server/taskRepository.ts#replaceTaskNodes@605", + "edge:call:func:src/server/taskRepository.ts#replaceTaskNodes@605=>func:src/server/taskRepository.ts#uniqueValues@40" + ], + "summary": "以 $transaction() 回调@313 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "name": "$transaction() 回调@392 (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@392@392", + "title": "$transaction() 回调@392", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#dateFromInput@31", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#uniqueValues@40" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "title": "getNodeTimeBounds", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#dateFromInput@31", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#dateFromInput@31", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "title": "nodeTimeRangesToJson", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#getNodeTimeBounds@81" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "title": "normalizeNodeProgress", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#uniqueValues@40", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "order": 6, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "edge:call:func:src/server/taskRepository.ts#nodeTimeRangesToJson@90=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#dateFromInput@31", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#nodeTimeRangesToJson@90", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@392@392=>func:src/server/taskRepository.ts#uniqueValues@40" + ], + "summary": "以 $transaction() 回调@392 为入口的调用链,覆盖 7 个函数" + }, + { + "id": "flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "name": "map() 回调@382 (src/components/WeeklyOverview.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "steps": [ + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "order": 0, + "nodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@382@382", + "title": "map() 回调@382", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#sortTasks@82", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/types.ts#isPublicPoolPlan@68", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#sortTasks@82", + "order": 1, + "nodeId": "func:src/components/WeeklyOverview.tsx#sortTasks@82", + "title": "sortTasks", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/types.ts#isPublicPoolPlan@68", + "order": 2, + "nodeId": "func:src/types.ts#isPublicPoolPlan@68", + "title": "isPublicPoolPlan", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "order": 3, + "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "title": "getTaskStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "order": 4, + "nodeId": "func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "title": "handleColumnDragOver", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "order": 5, + "nodeId": "func:src/components/WeeklyOverview.tsx#handleColumnDrop@237", + "title": "handleColumnDrop", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#clearTaskDragState@207" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "order": 6, + "nodeId": "func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "title": "getDropBeforeTaskId", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382:func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "order": 7, + "nodeId": "func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "title": "clearTaskDragState", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#getDropBeforeTaskId@33", + "edge:call:func:src/components/WeeklyOverview.tsx#handleColumnDrop@237=>func:src/components/WeeklyOverview.tsx#clearTaskDragState@207", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#sortTasks@82", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/types.ts#isPublicPoolPlan@68", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDragOver@227", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@382@382=>func:src/components/WeeklyOverview.tsx#handleColumnDrop@237" + ], + "summary": "以 map() 回调@382 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:src/App.tsx#useEffect() 回调@133@133", + "name": "useEffect() 回调@133 (src/App.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/App.tsx#useEffect() 回调@133@133", + "steps": [ + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#useEffect() 回调@133@133", + "order": 0, + "nodeId": "func:src/App.tsx#useEffect() 回调@133@133", + "title": "useEffect() 回调@133", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTasks@221", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchPeople@241", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTags@256", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchProjectTemplates@323", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchWeeklyPlans@338" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTasks@221", + "order": 1, + "nodeId": "func:src/App.tsx#fetchTasks@221", + "title": "fetchTasks", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchPeople@241", + "order": 2, + "nodeId": "func:src/App.tsx#fetchPeople@241", + "title": "fetchPeople", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchTags@256", + "order": 3, + "nodeId": "func:src/App.tsx#fetchTags@256", + "title": "fetchTags", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchProjectTemplates@323", + "order": 4, + "nodeId": "func:src/App.tsx#fetchProjectTemplates@323", + "title": "fetchProjectTemplates", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#fetchWeeklyPlans@338", + "order": 5, + "nodeId": "func:src/App.tsx#fetchWeeklyPlans@338", + "title": "fetchWeeklyPlans", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#apiPath@15", + "order": 6, + "nodeId": "func:src/utils/api.ts#apiPath@15", + "title": "apiPath", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#appPath@7" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/App.tsx#readApiError@39", + "order": 7, + "nodeId": "func:src/App.tsx#readApiError@39", + "title": "readApiError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#useEffect() 回调@133@133:func:src/utils/api.ts#appPath@7", + "order": 8, + "nodeId": "func:src/utils/api.ts#appPath@7", + "title": "appPath", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", + "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTasks@221", + "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchPeople@241", + "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchTags@256", + "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchProjectTemplates@323", + "edge:call:func:src/App.tsx#useEffect() 回调@133@133=>func:src/App.tsx#fetchWeeklyPlans@338", + "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchPeople@241=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#fetchTags@256=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchTags@256=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchProjectTemplates@323=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchWeeklyPlans@338=>func:src/App.tsx#readApiError@39" + ], + "summary": "以 useEffect() 回调@133 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "name": "$transaction() 回调@430 (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@430@430", + "title": "$transaction() 回调@430", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#dateFromInput@31", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#uniqueValues@40" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "title": "getNodeTimeBounds", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#dateFromInput@31", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#dateFromInput@31", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "title": "normalizeNodeProgress", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#uniqueValues@40", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "order": 5, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#dateFromInput@31", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@430@430=>func:src/server/taskRepository.ts#uniqueValues@40" + ], + "summary": "以 $transaction() 回调@430 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "name": "map() 回调@107 (src/utils/nodeTimeRanges.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "steps": [ + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "order": 0, + "nodeId": "func:src/utils/nodeTimeRanges.ts#map() 回调@107@107", + "title": "map() 回调@107", + "nextStepIds": [ + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 1, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "order": 2, + "nodeId": "func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "title": "addDaysToDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "order": 3, + "nodeId": "func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "title": "constrainNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#addDaysToDateString@11", + "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#constrainNodeTimeRanges@46", + "edge:call:func:src/utils/nodeTimeRanges.ts#map() 回调@107@107=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ], + "summary": "以 map() 回调@107 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "name": "map() 回调@266 (src/components/PersonGanttChart.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "steps": [ + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "order": 0, + "nodeId": "func:src/components/PersonGanttChart.tsx#map() 回调@266@266", + "title": "map() 回调@266", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "order": 1, + "nodeId": "func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "order": 2, + "nodeId": "func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "title": "getStatusVisual", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "order": 3, + "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "title": "getTaskPriorityMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 7, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getEffectiveNodeStatus@87", + "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/components/PersonGanttChart.tsx#getStatusVisual@398", + "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "edge:call:func:src/components/PersonGanttChart.tsx#map() 回调@266@266=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ], + "summary": "以 map() 回调@266 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90", + "name": "handleSsoLogin (src/components/LoginPage.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "steps": [ + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#handleSsoLogin@90", + "order": 0, + "nodeId": "func:src/components/LoginPage.tsx#handleSsoLogin@90", + "title": "handleSsoLogin", + "nextStepIds": [ + "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#createOAuthState@31", + "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#readApiJson@21", + "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#requestSsoOAuthCode@39" + ] + }, + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#createOAuthState@31", + "order": 1, + "nodeId": "func:src/components/LoginPage.tsx#createOAuthState@31", + "title": "createOAuthState", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#apiPath@15", + "order": 2, + "nodeId": "func:src/utils/api.ts#apiPath@15", + "title": "apiPath", + "nextStepIds": [ + "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#appPath@7" + ] + }, + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#readApiJson@21", + "order": 3, + "nodeId": "func:src/components/LoginPage.tsx#readApiJson@21", + "title": "readApiJson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "order": 4, + "nodeId": "func:src/components/LoginPage.tsx#requestSsoOAuthCode@39", + "title": "requestSsoOAuthCode", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/LoginPage.tsx#handleSsoLogin@90:func:src/utils/api.ts#appPath@7", + "order": 5, + "nodeId": "func:src/utils/api.ts#appPath@7", + "title": "appPath", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", + "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#createOAuthState@31", + "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#readApiJson@21", + "edge:call:func:src/components/LoginPage.tsx#handleSsoLogin@90=>func:src/components/LoginPage.tsx#requestSsoOAuthCode@39" + ], + "summary": "以 handleSsoLogin 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "name": "map() 回调@513 (src/components/WeeklyOverview.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "steps": [ + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "order": 0, + "nodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@513@513", + "title": "map() 回调@513", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "order": 1, + "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "title": "getTaskDisplayStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/date.ts#getLocalDateString@1", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "order": 2, + "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "title": "getTaskStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "order": 3, + "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "title": "getTaskPriorityMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "order": 4, + "nodeId": "func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214", + "title": "handleTaskDragStart", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#stopBoardDrag@138" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/date.ts#getLocalDateString@1", + "order": 5, + "nodeId": "func:src/utils/date.ts#getLocalDateString@1", + "title": "getLocalDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 7, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "order": 8, + "nodeId": "func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "title": "stopBoardDrag", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 9, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 10, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214=>func:src/components/WeeklyOverview.tsx#stopBoardDrag@138", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@513@513=>func:src/components/WeeklyOverview.tsx#handleTaskDragStart@214" + ], + "summary": "以 map() 回调@513 为入口的调用链,覆盖 11 个函数" + }, + { + "id": "flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "name": "匿名函数@644 (src/components/WeeklyOverview.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "steps": [ + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "order": 0, + "nodeId": "func:src/components/WeeklyOverview.tsx#匿名函数@644@644", + "title": "匿名函数@644", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "order": 1, + "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "title": "getTaskDisplayStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/date.ts#getLocalDateString@1", + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "order": 2, + "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "title": "getTaskStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "order": 3, + "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "title": "getTaskPriorityMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/date.ts#getLocalDateString@1", + "order": 5, + "nodeId": "func:src/utils/date.ts#getLocalDateString@1", + "title": "getLocalDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 7, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 8, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "edge:call:func:src/components/WeeklyOverview.tsx#匿名函数@644@644=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79" + ], + "summary": "以 匿名函数@644 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "name": "map() 回调@721 (src/components/WeeklyOverview.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "steps": [ + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "order": 0, + "nodeId": "func:src/components/WeeklyOverview.tsx#map() 回调@721@721", + "title": "map() 回调@721", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "order": 1, + "nodeId": "func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "order": 2, + "nodeId": "func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "title": "normalizeProgress", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 3, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#getEffectiveNodeStatus@90", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/components/WeeklyOverview.tsx#normalizeProgress@53", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/WeeklyOverview.tsx#map() 回调@721@721=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ], + "summary": "以 map() 回调@721 为入口的调用链,覆盖 7 个函数" + }, + { + "id": "flow:call:func:src/App.tsx#handleReorderTask@798", + "name": "handleReorderTask (src/App.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/App.tsx#handleReorderTask@798", + "steps": [ + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#handleReorderTask@798", + "order": 0, + "nodeId": "func:src/App.tsx#handleReorderTask@798", + "title": "handleReorderTask", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#sortTasksForList@54", + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#readApiError@39", + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#fetchTasks@221" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#sortTasksForList@54", + "order": 1, + "nodeId": "func:src/App.tsx#sortTasksForList@54", + "title": "sortTasksForList", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#apiPath@15", + "order": 2, + "nodeId": "func:src/utils/api.ts#apiPath@15", + "title": "apiPath", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#appPath@7" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#readApiError@39", + "order": 3, + "nodeId": "func:src/App.tsx#readApiError@39", + "title": "readApiError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#fetchTasks@221", + "order": 4, + "nodeId": "func:src/App.tsx#fetchTasks@221", + "title": "fetchTasks", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleReorderTask@798:func:src/utils/api.ts#appPath@7", + "order": 5, + "nodeId": "func:src/utils/api.ts#appPath@7", + "title": "appPath", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", + "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#fetchTasks@221=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#sortTasksForList@54", + "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#handleReorderTask@798=>func:src/App.tsx#fetchTasks@221" + ], + "summary": "以 handleReorderTask 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/App.tsx#handleUpdateNodes@1371", + "name": "handleUpdateNodes (src/App.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/App.tsx#handleUpdateNodes@1371", + "steps": [ + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#handleUpdateNodes@1371", + "order": 0, + "nodeId": "func:src/App.tsx#handleUpdateNodes@1371", + "title": "handleUpdateNodes", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#edgeKey@1383", + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#requestTaskUpdate@1425", + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#handleRefreshTask@1353" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "order": 1, + "nodeId": "func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "title": "constrainWorkflowNodesTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#edgeKey@1383", + "order": 2, + "nodeId": "func:src/App.tsx#edgeKey@1383", + "title": "edgeKey", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#requestTaskUpdate@1425", + "order": 3, + "nodeId": "func:src/App.tsx#requestTaskUpdate@1425", + "title": "requestTaskUpdate", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#handleRefreshTask@1353", + "order": 4, + "nodeId": "func:src/App.tsx#handleRefreshTask@1353", + "title": "handleRefreshTask", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#apiPath@15", + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#readApiError@39" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#apiPath@15", + "order": 5, + "nodeId": "func:src/utils/api.ts#apiPath@15", + "title": "apiPath", + "nextStepIds": [ + "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#appPath@7" + ] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/App.tsx#readApiError@39", + "order": 6, + "nodeId": "func:src/App.tsx#readApiError@39", + "title": "readApiError", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/App.tsx#handleUpdateNodes@1371:func:src/utils/api.ts#appPath@7", + "order": 7, + "nodeId": "func:src/utils/api.ts#appPath@7", + "title": "appPath", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/api.ts#apiPath@15=>func:src/utils/api.ts#appPath@7", + "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#handleRefreshTask@1353=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/utils/nodeTimeRanges.ts#constrainWorkflowNodesTimeRanges@99", + "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#edgeKey@1383", + "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/utils/api.ts#apiPath@15", + "edge:call:func:src/App.tsx#requestTaskUpdate@1425=>func:src/App.tsx#readApiError@39", + "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#requestTaskUpdate@1425", + "edge:call:func:src/App.tsx#handleUpdateNodes@1371=>func:src/App.tsx#handleRefreshTask@1353" + ], + "summary": "以 handleUpdateNodes 为入口的调用链,覆盖 8 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118", + "name": "toWorkflowNode (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#toWorkflowNode@118", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#toWorkflowNode@118", + "title": "toWorkflowNode", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#dateToInput@36", + "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeProgress@44" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#dateToInput@36", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#dateToInput@36", + "title": "dateToInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#toWorkflowNode@118:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "title": "normalizeNodeProgress", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#dateToInput@36", + "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "edge:call:func:src/server/taskRepository.ts#toWorkflowNode@118=>func:src/server/taskRepository.ts#normalizeNodeProgress@44" + ], + "summary": "以 toWorkflowNode 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "name": "$transaction() 回调@273 (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#$transaction() 回调@273@273", + "title": "$transaction() 回调@273", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#replaceTaskNodes@605" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "title": "normalizeTaskPriority", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "title": "normalizeTaskCompletionStatus", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#replaceTaskNodes@605", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#replaceTaskNodes@605", + "title": "replaceTaskNodes", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#uniqueValues@40" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273:func:src/server/taskRepository.ts#uniqueValues@40", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#uniqueValues@40", + "title": "uniqueValues", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskPriority@148", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#normalizeTaskCompletionStatus@142", + "edge:call:func:src/server/taskRepository.ts#$transaction() 回调@273@273=>func:src/server/taskRepository.ts#replaceTaskNodes@605", + "edge:call:func:src/server/taskRepository.ts#replaceTaskNodes@605=>func:src/server/taskRepository.ts#uniqueValues@40" + ], + "summary": "以 $transaction() 回调@273 为入口的调用链,覆盖 5 个函数" + }, + { + "id": "flow:call:func:src/server/taskRepository.ts#map() 回调@618@618", + "name": "map() 回调@618 (src/server/taskRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/taskRepository.ts#map() 回调@618@618", + "steps": [ + { + "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#map() 回调@618@618", + "order": 0, + "nodeId": "func:src/server/taskRepository.ts#map() 回调@618@618", + "title": "map() 回调@618", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#dateFromInput@31", + "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeProgress@44" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "order": 1, + "nodeId": "func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "title": "getNodeTimeBounds", + "nextStepIds": [ + "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50" + ] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#dateFromInput@31", + "order": 2, + "nodeId": "func:src/server/taskRepository.ts#dateFromInput@31", + "title": "dateFromInput", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "order": 3, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeProgress@44", + "title": "normalizeNodeProgress", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/taskRepository.ts#map() 回调@618@618:func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "order": 4, + "nodeId": "func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/taskRepository.ts#getNodeTimeBounds@81=>func:src/server/taskRepository.ts#normalizeNodeTimeRanges@50", + "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#getNodeTimeBounds@81", + "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#dateFromInput@31", + "edge:call:func:src/server/taskRepository.ts#map() 回调@618@618=>func:src/server/taskRepository.ts#normalizeNodeProgress@44" + ], + "summary": "以 map() 回调@618 为入口的调用链,覆盖 5 个函数" + }, + { + "id": "flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "name": "map() 回调@58 (src/server/projectTemplateRepository.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "steps": [ + { + "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "order": 0, + "nodeId": "func:src/server/projectTemplateRepository.ts#map() 回调@58@58", + "title": "map() 回调@58", + "nextStepIds": [ + "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17" + ] + }, + { + "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "order": 1, + "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "order": 2, + "nodeId": "func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "title": "uniqueValues", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58:func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "order": 3, + "nodeId": "func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17", + "title": "normalizeNodeProgress", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeTimeRanges@23", + "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#uniqueValues@13", + "edge:call:func:src/server/projectTemplateRepository.ts#map() 回调@58@58=>func:src/server/projectTemplateRepository.ts#normalizeNodeProgress@17" + ], + "summary": "以 map() 回调@58 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:src/server/botQueryTools.ts#execute@297", + "name": "execute (src/server/botQueryTools.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/botQueryTools.ts#execute@297", + "steps": [ + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#execute@297", + "order": 0, + "nodeId": "func:src/server/botQueryTools.ts#execute@297", + "title": "execute", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#planNameById@198", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#summarizeTask@172" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "order": 1, + "nodeId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "title": "resolveTaskScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#selfScope@149", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#planNameById@198", + "order": 2, + "nodeId": "func:src/server/botQueryTools.ts#planNameById@198", + "title": "planNameById", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#summarizeTask@172", + "order": 3, + "nodeId": "func:src/server/botQueryTools.ts#summarizeTask@172", + "title": "summarizeTask", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#taskDateSpan@51", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#buildTaskLink@72" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#selfScope@149", + "order": 4, + "nodeId": "func:src/server/botQueryTools.ts#selfScope@149", + "title": "selfScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "order": 5, + "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "title": "isTaskRelatedToPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "order": 6, + "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#taskDateSpan@51", + "order": 7, + "nodeId": "func:src/server/botQueryTools.ts#taskDateSpan@51", + "title": "taskDateSpan", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#buildTaskLink@72", + "order": 8, + "nodeId": "func:src/server/botQueryTools.ts#buildTaskLink@72", + "title": "buildTaskLink", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeStartDate@28", + "order": 9, + "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "title": "nodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeEndDate@34", + "order": 10, + "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "title": "nodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@297:func:src/server/botQueryTools.ts#nodeRanges@21", + "order": 11, + "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "title": "nodeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#taskDateSpan@51=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#taskDateSpan@51", + "edge:call:func:src/server/botQueryTools.ts#summarizeTask@172=>func:src/server/botQueryTools.ts#buildTaskLink@72", + "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#planNameById@198", + "edge:call:func:src/server/botQueryTools.ts#execute@297=>func:src/server/botQueryTools.ts#summarizeTask@172" + ], + "summary": "以 execute 为入口的调用链,覆盖 12 个函数" + }, + { + "id": "flow:call:func:src/server/botQueryTools.ts#execute@542", + "name": "execute (src/server/botQueryTools.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/server/botQueryTools.ts#execute@542", + "steps": [ + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#execute@542", + "order": 0, + "nodeId": "func:src/server/botQueryTools.ts#execute@542", + "title": "execute", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#resolveTaskScope@141", + "order": 1, + "nodeId": "func:src/server/botQueryTools.ts#resolveTaskScope@141", + "title": "resolveTaskScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#selfScope@149", + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "order": 2, + "nodeId": "func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "title": "isNodeOwnedByPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "order": 3, + "nodeId": "func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41", + "title": "getEffectiveNodeStatus", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeStartDate@28", + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeEndDate@34" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#selfScope@149", + "order": 4, + "nodeId": "func:src/server/botQueryTools.ts#selfScope@149", + "title": "selfScope", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "order": 5, + "nodeId": "func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "title": "isTaskRelatedToPerson", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeStartDate@28", + "order": 6, + "nodeId": "func:src/server/botQueryTools.ts#nodeStartDate@28", + "title": "nodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeEndDate@34", + "order": 7, + "nodeId": "func:src/server/botQueryTools.ts#nodeEndDate@34", + "title": "nodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeRanges@21" + ] + }, + { + "id": "step:flow:call:func:src/server/botQueryTools.ts#execute@542:func:src/server/botQueryTools.ts#nodeRanges@21", + "order": 8, + "nodeId": "func:src/server/botQueryTools.ts#nodeRanges@21", + "title": "nodeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/server/botQueryTools.ts#nodeStartDate@28=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#nodeEndDate@34=>func:src/server/botQueryTools.ts#nodeRanges@21", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeStartDate@28", + "edge:call:func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41=>func:src/server/botQueryTools.ts#nodeEndDate@34", + "edge:call:func:src/server/botQueryTools.ts#selfScope@149=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#selfScope@149", + "edge:call:func:src/server/botQueryTools.ts#resolveTaskScope@141=>func:src/server/botQueryTools.ts#isTaskRelatedToPerson@98", + "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#resolveTaskScope@141", + "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#isNodeOwnedByPerson@103", + "edge:call:func:src/server/botQueryTools.ts#execute@542=>func:src/server/botQueryTools.ts#getEffectiveNodeStatus@41" + ], + "summary": "以 execute 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:src/components/TaskList.tsx#map() 回调@387@387", + "name": "map() 回调@387 (src/components/TaskList.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/TaskList.tsx#map() 回调@387@387", + "steps": [ + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/components/TaskList.tsx#map() 回调@387@387", + "order": 0, + "nodeId": "func:src/components/TaskList.tsx#map() 回调@387@387", + "title": "map() 回调@387", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "order": 1, + "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "title": "getTaskDisplayStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/date.ts#getLocalDateString@1", + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "order": 2, + "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "title": "getTaskStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "order": 3, + "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "title": "getTaskPriorityMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/date.ts#getLocalDateString@1", + "order": 4, + "nodeId": "func:src/utils/date.ts#getLocalDateString@1", + "title": "getLocalDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 7, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskList.tsx#map() 回调@387@387:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 8, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "edge:call:func:src/components/TaskList.tsx#map() 回调@387@387=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" + ], + "summary": "以 map() 回调@387 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "name": "WorkflowCanvas (src/components/WorkflowCanvas.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "steps": [ + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "order": 0, + "nodeId": "func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26", + "title": "WorkflowCanvas", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/date.ts#getLocalDateString@1", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/date.ts#getLocalDateString@1", + "order": 1, + "nodeId": "func:src/utils/date.ts#getLocalDateString@1", + "title": "getLocalDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "order": 2, + "nodeId": "func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "title": "findPreviewNodePosition", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "order": 3, + "nodeId": "func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667", + "title": "handleImportTemplate", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "order": 4, + "nodeId": "func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "title": "getOverlapArea", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "order": 5, + "nodeId": "func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "title": "buildImportedTemplateNodes", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#toMs@623" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/components/WorkflowCanvas.tsx#toMs@623", + "order": 7, + "nodeId": "func:src/components/WorkflowCanvas.tsx#toMs@623", + "title": "toMs", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 8, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 9, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/utils/date.ts#getLocalDateString@1", + "edge:call:func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361=>func:src/components/WorkflowCanvas.tsx#getOverlapArea@352", + "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#findPreviewNodePosition@361", + "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619=>func:src/components/WorkflowCanvas.tsx#toMs@623", + "edge:call:func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667=>func:src/components/WorkflowCanvas.tsx#buildImportedTemplateNodes@619", + "edge:call:func:src/components/WorkflowCanvas.tsx#WorkflowCanvas@26=>func:src/components/WorkflowCanvas.tsx#handleImportTemplate@667" + ], + "summary": "以 WorkflowCanvas 为入口的调用链,覆盖 10 个函数" + }, + { + "id": "flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14", + "name": "TaskOverview (src/components/TaskOverview.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "steps": [ + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/components/TaskOverview.tsx#TaskOverview@14", + "order": 0, + "nodeId": "func:src/components/TaskOverview.tsx#TaskOverview@14", + "title": "TaskOverview", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "order": 1, + "nodeId": "func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "title": "getTaskDisplayStatus", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/date.ts#getLocalDateString@1", + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "order": 2, + "nodeId": "func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "title": "getTaskStatusMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "order": 3, + "nodeId": "func:src/utils/taskPriority.ts#getTaskPriorityMeta@11", + "title": "getTaskPriorityMeta", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/date.ts#getLocalDateString@1", + "order": 4, + "nodeId": "func:src/utils/date.ts#getLocalDateString@1", + "title": "getLocalDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 6, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 7, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/TaskOverview.tsx#TaskOverview@14:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 8, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/date.ts#getLocalDateString@1", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/utils/taskStatus.ts#getTaskDisplayStatus@7=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskDisplayStatus@7", + "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskStatus.ts#getTaskStatusMeta@50", + "edge:call:func:src/components/TaskOverview.tsx#TaskOverview@14=>func:src/utils/taskPriority.ts#getTaskPriorityMeta@11" + ], + "summary": "以 TaskOverview 为入口的调用链,覆盖 9 个函数" + }, + { + "id": "flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "name": "requestAnimationFrame() 回调@174 (src/components/GanttChart.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "steps": [ + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "order": 0, + "nodeId": "func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174", + "title": "requestAnimationFrame() 回调@174", + "nextStepIds": [ + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "order": 1, + "nodeId": "func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "title": "getTimelinePercentage", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 2, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 3, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/components/GanttChart.tsx#getTimelinePercentage@92", + "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/GanttChart.tsx#requestAnimationFrame() 回调@174@174=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ], + "summary": "以 requestAnimationFrame() 回调@174 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260", + "name": "map() 回调@260 (src/components/GanttChart.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "steps": [ + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#map() 回调@260@260", + "order": 0, + "nodeId": "func:src/components/GanttChart.tsx#map() 回调@260@260", + "title": "map() 回调@260", + "nextStepIds": [ + "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#isWeekend@86", + "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#formatDateString@76", + "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#getDayLabel@80" + ] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#isWeekend@86", + "order": 1, + "nodeId": "func:src/components/GanttChart.tsx#isWeekend@86", + "title": "isWeekend", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#formatDateString@76", + "order": 2, + "nodeId": "func:src/components/GanttChart.tsx#formatDateString@76", + "title": "formatDateString", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/GanttChart.tsx#map() 回调@260@260:func:src/components/GanttChart.tsx#getDayLabel@80", + "order": 3, + "nodeId": "func:src/components/GanttChart.tsx#getDayLabel@80", + "title": "getDayLabel", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#isWeekend@86", + "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#formatDateString@76", + "edge:call:func:src/components/GanttChart.tsx#map() 回调@260@260=>func:src/components/GanttChart.tsx#getDayLabel@80" + ], + "summary": "以 map() 回调@260 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "name": "useMemo() 回调@51 (src/components/PersonGanttChart.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "steps": [ + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "order": 0, + "nodeId": "func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51", + "title": "useMemo() 回调@51", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "order": 1, + "nodeId": "func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "title": "buildDateRange", + "nextStepIds": [] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "order": 2, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "title": "getNodeStartDate", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "order": 3, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86", + "title": "getNodeEndDate", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "order": 4, + "nodeId": "func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "title": "getNodeTimeRanges", + "nextStepIds": [ + "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17" + ] + }, + { + "id": "step:flow:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51:func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "order": 5, + "nodeId": "func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "title": "normalizeNodeTimeRanges", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75=>func:src/utils/nodeTimeRanges.ts#normalizeNodeTimeRanges@17", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86=>func:src/utils/nodeTimeRanges.ts#getNodeTimeRanges@75", + "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/components/PersonGanttChart.tsx#buildDateRange@379", + "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeStartDate@79", + "edge:call:func:src/components/PersonGanttChart.tsx#useMemo() 回调@51@51=>func:src/utils/nodeTimeRanges.ts#getNodeEndDate@86" + ], + "summary": "以 useMemo() 回调@51 为入口的调用链,覆盖 6 个函数" + } + ], + "externalSystems": [ + { + "id": "ext:db:prisma", + "kind": "database", + "name": "prisma", + "engine": "prisma", + "tables": [ + "nodeDependency", + "nodeResponsible", + "notificationLog", + "person", + "projectTemplate", + "tagDefinition", + "task", + "taskResponsible", + "taskTag", + "weeklyPlan", + "workflowNode" + ], + "functionIds": [ + "func:prisma/seed.ts#seed@13", + "func:src/server/weeklyPlanRepository.ts#ensurePublicPoolPlan@34", + "func:src/server/weeklyPlanRepository.ts#listWeeklyPlans@55", + "func:src/server/weeklyPlanRepository.ts#createWeeklyPlan@69", + "func:src/server/weeklyPlanRepository.ts#getWeeklyPlanOrThrow@93", + "func:src/server/weeklyPlanRepository.ts#deleteWeeklyPlan@102", + "func:src/server/taskRepository.ts#existingTagNames@96", + "func:src/server/taskRepository.ts#findTaskRecord@111", + "func:src/server/taskRepository.ts#listTasks@194", + "func:src/server/taskRepository.ts#getNextTaskSortOrder@207", + "func:src/server/taskRepository.ts#getFirstTaskSortOrder@217", + "func:src/server/taskRepository.ts#createTask@227", + "func:src/server/taskRepository.ts#updateTask@302", + "func:src/server/taskRepository.ts#updateTaskListState@353", + "func:src/server/taskRepository.ts#deleteTask@383", + "func:src/server/taskRepository.ts#createWorkflowNode@389", + "func:src/server/taskRepository.ts#updateWorkflowNode@423", + "func:src/server/taskRepository.ts#deleteWorkflowNode@472", + "func:src/server/taskRepository.ts#createNodeDependency@494", + "func:src/server/taskRepository.ts#deleteNodeDependency@535", + "func:src/server/taskRepository.ts#ensureTaskExists@560", + "func:src/server/taskRepository.ts#ensureWorkflowNodeExists@567", + "func:src/server/taskRepository.ts#hasDependencyPath@577", + "func:src/server/notificationRepository.ts#createNotificationLog@37", + "func:src/server/notificationRepository.ts#listNotificationLogs@47", + "func:src/server/notificationRepository.ts#clearNotificationLogs@56", + "func:src/server/projectTemplateRepository.ts#listProjectTemplates@110", + "func:src/server/projectTemplateRepository.ts#createProjectTemplate@118", + "func:src/server/projectTemplateRepository.ts#updateProjectTemplate@136", + "func:src/server/projectTemplateRepository.ts#deleteProjectTemplate@158", + "func:src/server/tagRepository.ts#listTagDefinitions@11", + "func:src/server/tagRepository.ts#createTagDefinition@19", + "func:src/server/tagRepository.ts#deleteTagDefinition@34", + "func:src/server/personRepository.ts#ensurePeopleFromExistingResponsibles@28", + "func:src/server/personRepository.ts#listPeople@53", + "func:src/server/personRepository.ts#getPersonOrThrow@64", + "func:src/server/personRepository.ts#createPerson@73", + "func:src/server/personRepository.ts#ensurePeople@118", + "func:src/server/personRepository.ts#updatePerson@142", + "func:src/server/personRepository.ts#deletePerson@177" + ], + "interactionCount": 58, + "provenance": "resolved" + }, + { + "id": "ext:service:api.dingtalk.com", + "kind": "service", + "name": "api.dingtalk.com", + "protocol": "http", + "endpoints": [ + "https://api.dingtalk.com/v1.0/oauth2/accessToken", + "https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend" + ], + "functionIds": [ + "func:server.ts#getDingTalkRobotAccessToken@128", + "func:server.ts#sendDingTalkRobotMarkdownMessage@162" + ], + "interactionCount": 2, + "provenance": "resolved" + } + ] +} \ No newline at end of file diff --git a/web/public/self-report.json b/web/public/self-report.json new file mode 100644 index 0000000..c66a8bb --- /dev/null +++ b/web/public/self-report.json @@ -0,0 +1,5190 @@ +{ + "schemaVersion": "0.1.0", + "project": { + "name": "code-visualize", + "root": "E:/code-visualize", + "languages": [ + "tsx", + "typescript" + ], + "generatedAt": "2026-07-22T03:03:33.188Z", + "generator": "code-visualize-cli@0.1.0" + }, + "stats": { + "fileCount": 21, + "containerCount": 2, + "functionCount": 94, + "edgeCount": 110, + "loc": 2212 + }, + "modules": [ + { + "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" + ], + "parentId": "module:." + }, + { + "id": "module:.", + "kind": "module", + "name": "code-visualize", + "provenance": "ast", + "path": ".", + "childModuleIds": [ + "module:src", + "module:web" + ], + "fileIds": [] + }, + { + "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" + ], + "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" + ], + "parentId": "module:web/src/view" + } + ], + "files": [ + { + "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" + ] + }, + { + "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": [] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "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": [] + }, + { + "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": [] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "id": "file:web/src/viewmodel/GraphViewModel.ts", + "kind": "file", + "name": "GraphViewModel.ts", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 1, + "endLine": 290 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:web/src/viewmodel", + "path": "web/src/viewmodel/GraphViewModel.ts", + "loc": 290, + "containerIds": [ + "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + ], + "functionIds": [ + "func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "func:web/src/viewmodel/GraphViewModel.ts#runInAction() 回调@149@149", + "func:web/src/viewmodel/GraphViewModel.ts#map() 回调@186@186" + ] + }, + { + "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" + ] + }, + { + "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" + ] + }, + { + "id": "file:web/src/view/components/FlowGraph.tsx", + "kind": "file", + "name": "FlowGraph.tsx", + "location": { + "file": "web/src/view/components/FlowGraph.tsx", + "startLine": 1, + "endLine": 73 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:web/src/view/components", + "path": "web/src/view/components/FlowGraph.tsx", + "loc": 73, + "containerIds": [], + "functionIds": [ + "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "func:web/src/view/components/FlowGraph.tsx#@0" + ] + }, + { + "id": "file:web/src/view/components/FlowList.tsx", + "kind": "file", + "name": "FlowList.tsx", + "location": { + "file": "web/src/view/components/FlowList.tsx", + "startLine": 1, + "endLine": 26 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:web/src/view/components", + "path": "web/src/view/components/FlowList.tsx", + "loc": 26, + "containerIds": [], + "functionIds": [ + "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4", + "func:web/src/view/components/FlowList.tsx#@0" + ] + }, + { + "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" + ] + }, + { + "id": "file:web/src/view/components/NodeDetailPanel.tsx", + "kind": "file", + "name": "NodeDetailPanel.tsx", + "location": { + "file": "web/src/view/components/NodeDetailPanel.tsx", + "startLine": 1, + "endLine": 86 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:web/src/view/components", + "path": "web/src/view/components/NodeDetailPanel.tsx", + "loc": 86, + "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" + ] + }, + { + "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" + ] + }, + { + "id": "file:web/src/view/App.tsx", + "kind": "file", + "name": "App.tsx", + "location": { + "file": "web/src/view/App.tsx", + "startLine": 1, + "endLine": 55 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:web/src/view", + "path": "web/src/view/App.tsx", + "loc": 55, + "containerIds": [], + "functionIds": [ + "func:web/src/view/App.tsx#observer() 回调@9@9", + "func:web/src/view/App.tsx#@0" + ] + }, + { + "id": "file:web/src/main.tsx", + "kind": "file", + "name": "main.tsx", + "location": { + "file": "web/src/main.tsx", + "startLine": 1, + "endLine": 26 + }, + "language": "tsx", + "provenance": "ast", + "moduleId": "module:web/src", + "path": "web/src/main.tsx", + "loc": 26, + "containerIds": [], + "functionIds": [ + "func:web/src/main.tsx#@0" + ] + }, + { + "id": "file:web/vite.config.ts", + "kind": "file", + "name": "vite.config.ts", + "location": { + "file": "web/vite.config.ts", + "startLine": 1, + "endLine": 11 + }, + "language": "typescript", + "provenance": "ast", + "moduleId": "module:web", + "path": "web/vite.config.ts", + "loc": 11, + "containerIds": [], + "functionIds": [ + "func:web/vite.config.ts#@0" + ] + } + ], + "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": [] + }, + { + "id": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "kind": "container", + "name": "GraphViewModel", + "qualifiedName": "GraphViewModel", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 43, + "endLine": 289, + "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@58", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.sources@66", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentSource@70", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flows@160", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentFlow@165", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFunc@194", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flowsForSelectedFunc@202", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcIdsInFlows@225", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchResults@240", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280", + "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286" + ], + "fieldIds": [ + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.loading@44", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.error@45", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.report@46", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedSourceId@48", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedGroupId@49", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFlowId@50", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedNodeId@51", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchQuery@52", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcById@54", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.containerById@55", + "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.fileById@56" + ] + } + ], + "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: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/viewmodel/GraphViewModel.ts#baseName@34", + "kind": "function", + "name": "baseName", + "qualifiedName": "baseName", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 34, + "endLine": 37, + "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@58", + "kind": "function", + "name": "constructor", + "qualifiedName": "GraphViewModel.constructor", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 58, + "endLine": 64, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "constructor(sourceList: ReportSource[], makeRepository: (url: string) => ReportRepository)", + "params": [ + { + "name": "sourceList", + "typeRef": "ReportSource[]", + "optional": false + }, + { + "name": "makeRepository", + "typeRef": "(url: string) => ReportRepository", + "optional": false + } + ], + "loc": 7 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.sources@66", + "kind": "function", + "name": "sources", + "qualifiedName": "GraphViewModel.sources", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 66, + "endLine": 68, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "sources(): ReportSource[]", + "params": [], + "returnType": "ReportSource[]", + "loc": 3 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentSource@70", + "kind": "function", + "name": "currentSource", + "qualifiedName": "GraphViewModel.currentSource", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 70, + "endLine": 72, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "currentSource(): ReportSource | null", + "params": [], + "returnType": "ReportSource | null", + "loc": 3 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "kind": "function", + "name": "selectReport", + "qualifiedName": "GraphViewModel.selectReport", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 74, + "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@43", + "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.groupOfFlow@86", + "kind": "function", + "name": "groupOfFlow", + "qualifiedName": "GraphViewModel.groupOfFlow", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 86, + "endLine": 97, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "groupOfFlow(flow: Flow): FlowGroup", + "params": [ + { + "name": "flow", + "typeRef": "Flow", + "optional": false + } + ], + "returnType": "FlowGroup", + "loc": 12 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "kind": "function", + "name": "groups", + "qualifiedName": "GraphViewModel.groups", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 100, + "endLine": 109, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "groups(): FlowGroup[]", + "params": [], + "returnType": "FlowGroup[]", + "loc": 10 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "kind": "function", + "name": "visibleFlows", + "qualifiedName": "GraphViewModel.visibleFlows", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 112, + "endLine": 115, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "visibleFlows(): Flow[]", + "params": [], + "returnType": "Flow[]", + "loc": 4 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117", + "kind": "function", + "name": "selectGroup", + "qualifiedName": "GraphViewModel.selectGroup", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 117, + "endLine": 124, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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@126", + "kind": "function", + "name": "load", + "qualifiedName": "GraphViewModel.load", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 126, + "endLine": 157, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "load(): Promise", + "params": [], + "returnType": "Promise", + "loc": 32 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flows@160", + "kind": "function", + "name": "flows", + "qualifiedName": "GraphViewModel.flows", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 160, + "endLine": 163, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "flows(): Flow[]", + "params": [], + "returnType": "Flow[]", + "loc": 4 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.currentFlow@165", + "kind": "function", + "name": "currentFlow", + "qualifiedName": "GraphViewModel.currentFlow", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 165, + "endLine": 168, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "currentFlow(): Flow | null", + "params": [], + "returnType": "Flow | null", + "loc": 4 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "kind": "function", + "name": "positionedGraph", + "qualifiedName": "GraphViewModel.positionedGraph", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 171, + "endLine": 192, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "positionedGraph(): PositionedGraph", + "params": [], + "returnType": "PositionedGraph", + "loc": 22 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFunc@194", + "kind": "function", + "name": "selectedFunc", + "qualifiedName": "GraphViewModel.selectedFunc", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 194, + "endLine": 199, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "selectedFunc(): Func | null", + "params": [], + "returnType": "Func | null", + "loc": 6 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.flowsForSelectedFunc@202", + "kind": "function", + "name": "flowsForSelectedFunc", + "qualifiedName": "GraphViewModel.flowsForSelectedFunc", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 202, + "endLine": 208, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "flowsForSelectedFunc(): Flow[]", + "params": [], + "returnType": "Flow[]", + "loc": 7 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "kind": "function", + "name": "openFlowForFunc", + "qualifiedName": "GraphViewModel.openFlowForFunc", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 211, + "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@43", + "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@221", + "kind": "function", + "name": "setSearchQuery", + "qualifiedName": "GraphViewModel.setSearchQuery", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 221, + "endLine": 223, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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@225", + "kind": "function", + "name": "funcIdsInFlows", + "qualifiedName": "GraphViewModel.funcIdsInFlows", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 225, + "endLine": 231, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "funcIdsInFlows(): Set", + "params": [], + "returnType": "Set", + "loc": 7 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "kind": "function", + "name": "biggestFlowForFunc", + "qualifiedName": "GraphViewModel.biggestFlowForFunc", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 233, + "endLine": 238, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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@240", + "kind": "function", + "name": "searchResults", + "qualifiedName": "GraphViewModel.searchResults", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 240, + "endLine": 266, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "moduleId": "module:web/src/viewmodel", + "signature": "searchResults(): SearchResult[]", + "params": [], + "returnType": "SearchResult[]", + "loc": 27 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "kind": "function", + "name": "activateSearchResult", + "qualifiedName": "GraphViewModel.activateSearchResult", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 268, + "endLine": 278, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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@280", + "kind": "function", + "name": "selectFlow", + "qualifiedName": "GraphViewModel.selectFlow", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 280, + "endLine": 284, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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@286", + "kind": "function", + "name": "selectNode", + "qualifiedName": "GraphViewModel.selectNode", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 286, + "endLine": 288, + "startCol": 3, + "endCol": 4 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "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#runInAction() 回调@149@149", + "kind": "function", + "name": "runInAction() 回调@149", + "qualifiedName": "runInAction() 回调@149", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 149, + "endLine": 151, + "startCol": 19, + "endCol": 8 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "moduleId": "module:web/src/viewmodel", + "signature": "runInAction() 回调@149()", + "params": [], + "loc": 3 + }, + { + "id": "func:web/src/viewmodel/GraphViewModel.ts#map() 回调@186@186", + "kind": "function", + "name": "map() 回调@186", + "qualifiedName": "map() 回调@186", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 186, + "endLine": 189, + "startCol": 53, + "endCol": 6 + }, + "language": "typescript", + "provenance": "ast", + "fileId": "file:web/src/viewmodel/GraphViewModel.ts", + "moduleId": "module:web/src/viewmodel", + "signature": "map() 回调@186(n)", + "params": [ + { + "name": "n", + "optional": false + } + ], + "loc": 4 + }, + { + "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() 回调@17@17", + "kind": "function", + "name": "observer() 回调@17", + "qualifiedName": "observer() 回调@17", + "location": { + "file": "web/src/view/components/FlowGraph.tsx", + "startLine": 17, + "endLine": 72, + "startCol": 35, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:web/src/view/components/FlowGraph.tsx", + "moduleId": "module:web/src/view/components", + "signature": "observer() 回调@17()", + "params": [], + "loc": 56 + }, + { + "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": 25, + "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": 22 + }, + { + "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": 85, + "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": 73 + }, + { + "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/view/App.tsx#observer() 回调@9@9", + "kind": "function", + "name": "observer() 回调@9", + "qualifiedName": "observer() 回调@9", + "location": { + "file": "web/src/view/App.tsx", + "startLine": 9, + "endLine": 54, + "startCol": 29, + "endCol": 2 + }, + "language": "tsx", + "provenance": "ast", + "fileId": "file:web/src/view/App.tsx", + "moduleId": "module:web/src/view", + "signature": "observer() 回调@9()", + "params": [], + "loc": 46 + }, + { + "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: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": 73 + }, + "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": 26 + }, + "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": 86 + }, + "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/App.tsx#@0", + "kind": "function", + "name": "", + "qualifiedName": "", + "location": { + "file": "web/src/view/App.tsx", + "startLine": 1, + "endLine": 55 + }, + "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": 26 + }, + "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": 11 + }, + "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@44", + "kind": "field", + "name": "loading", + "qualifiedName": "GraphViewModel.loading", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 44, + "endLine": 44, + "startCol": 3, + "endCol": 19 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.error@45", + "kind": "field", + "name": "error", + "qualifiedName": "GraphViewModel.error", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 45, + "endLine": 45, + "startCol": 3, + "endCol": 31 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "string | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.report@46", + "kind": "field", + "name": "report", + "qualifiedName": "GraphViewModel.report", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 46, + "endLine": 46, + "startCol": 3, + "endCol": 32 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "Report | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedSourceId@48", + "kind": "field", + "name": "selectedSourceId", + "qualifiedName": "GraphViewModel.selectedSourceId", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 48, + "endLine": 48, + "startCol": 3, + "endCol": 42 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "string | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedGroupId@49", + "kind": "field", + "name": "selectedGroupId", + "qualifiedName": "GraphViewModel.selectedGroupId", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 49, + "endLine": 49, + "startCol": 3, + "endCol": 41 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "string | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedFlowId@50", + "kind": "field", + "name": "selectedFlowId", + "qualifiedName": "GraphViewModel.selectedFlowId", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 50, + "endLine": 50, + "startCol": 3, + "endCol": 40 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "string | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectedNodeId@51", + "kind": "field", + "name": "selectedNodeId", + "qualifiedName": "GraphViewModel.selectedNodeId", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 51, + "endLine": 51, + "startCol": 3, + "endCol": 40 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43", + "typeRef": "string | null" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.searchQuery@52", + "kind": "field", + "name": "searchQuery", + "qualifiedName": "GraphViewModel.searchQuery", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 52, + "endLine": 52, + "startCol": 3, + "endCol": 20 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.funcById@54", + "kind": "field", + "name": "funcById", + "qualifiedName": "GraphViewModel.funcById", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 54, + "endLine": 54, + "startCol": 3, + "endCol": 46 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.containerById@55", + "kind": "field", + "name": "containerById", + "qualifiedName": "GraphViewModel.containerById", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 55, + "endLine": 55, + "startCol": 3, + "endCol": 56 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + }, + { + "id": "field:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.fileById@56", + "kind": "field", + "name": "fileById", + "qualifiedName": "GraphViewModel.fileById", + "location": { + "file": "web/src/viewmodel/GraphViewModel.ts", + "startLine": 56, + "endLine": 56, + "startCol": 3, + "endCol": 50 + }, + "language": "typescript", + "provenance": "ast", + "ownerId": "container:web/src/viewmodel/GraphViewModel.ts#GraphViewModel@43" + } + ], + "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: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:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86=>func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171=>func:web/src/model/graphModel.ts#flowToGraph@43", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "targetId": "func:web/src/model/graphModel.ts#flowToGraph@43", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171=>func:web/src/services/dagreLayout.ts#computeLayout@31", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "targetId": "func:web/src/services/dagreLayout.ts#computeLayout@31", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "kind": "call", + "sourceId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "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() 回调@17@17=>func:web/src/view/vmContext.ts#useGraphVM@6", + "kind": "call", + "sourceId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "targetId": "func:web/src/view/vmContext.ts#useGraphVM@6", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286", + "kind": "call", + "sourceId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286", + "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@280", + "kind": "call", + "sourceId": "func:web/src/view/components/FlowList.tsx#observer() 回调@4@4", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280", + "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@117", + "kind": "call", + "sourceId": "func:web/src/view/components/GroupList.tsx#observer() 回调@4@4", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117", + "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@211", + "kind": "call", + "sourceId": "func:web/src/view/components/NodeDetailPanel.tsx#observer() 回调@13@13", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "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@268", + "kind": "call", + "sourceId": "func:web/src/view/components/SearchBar.tsx#activate@12", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "kind": "call", + "sourceId": "func:web/src/view/components/SearchBar.tsx#observer() 回调@6@6", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "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@221", + "kind": "call", + "sourceId": "func:web/src/view/components/SearchBar.tsx#匿名函数@26@26", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "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/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:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/view/vmContext.ts#useGraphVM@6", + "kind": "call", + "sourceId": "func:web/src/view/App.tsx#observer() 回调@9@9", + "targetId": "func:web/src/view/vmContext.ts#useGraphVM@6", + "provenance": "resolved" + }, + { + "id": "edge:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "kind": "call", + "sourceId": "func:web/src/view/App.tsx#observer() 回调@9@9", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "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:call:func:web/src/main.tsx#@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "kind": "call", + "sourceId": "func:web/src/main.tsx#@0", + "targetId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "provenance": "resolved" + } + ], + "flows": [ + { + "id": "flow:call:func:web/src/main.tsx#@0", + "name": " (web/src/main.tsx)", + "flowType": "call", + "provenance": "resolved", + "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@126" + ] + }, + { + "id": "step:flow:call:func:web/src/main.tsx#@0:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "order": 1, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "title": "GraphViewModel.load", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/main.tsx#@0=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126" + ], + "summary": "以 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:src/analyzer.ts#visit@245", + "name": "visit (src/analyzer.ts)", + "flowType": "call", + "provenance": "resolved", + "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": "以 visit 为入口的调用链,覆盖 13 个函数" + }, + { + "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": "resolved", + "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@211" + ] + }, + { + "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@211", + "order": 3, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "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@211" + ], + "summary": "以 observer() 回调@13 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "name": "GraphViewModel.positionedGraph (web/src/viewmodel/GraphViewModel.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "steps": [ + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "order": 0, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171", + "title": "GraphViewModel.positionedGraph", + "nextStepIds": [ + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/model/graphModel.ts#flowToGraph@43", + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171:func:web/src/services/dagreLayout.ts#computeLayout@31" + ] + }, + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171: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@171: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@171=>func:web/src/model/graphModel.ts#flowToGraph@43", + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.positionedGraph@171=>func:web/src/services/dagreLayout.ts#computeLayout@31" + ], + "summary": "以 GraphViewModel.positionedGraph 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "name": "observer() 回调@17 (web/src/view/components/FlowGraph.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "steps": [ + { + "id": "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "order": 0, + "nodeId": "func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17", + "title": "observer() 回调@17", + "nextStepIds": [ + "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/view/vmContext.ts#useGraphVM@6", + "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286" + ] + }, + { + "id": "step:flow:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17: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() 回调@17@17:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286", + "title": "GraphViewModel.selectNode", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17=>func:web/src/view/vmContext.ts#useGraphVM@6", + "edge:call:func:web/src/view/components/FlowGraph.tsx#observer() 回调@17@17=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectNode@286" + ], + "summary": "以 observer() 回调@17 为入口的调用链,覆盖 3 个函数" + }, + { + "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": "resolved", + "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@280" + ] + }, + { + "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@280", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectFlow@280", + "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@280" + ], + "summary": "以 observer() 回调@4 为入口的调用链,覆盖 3 个函数" + }, + { + "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": "resolved", + "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@117" + ] + }, + { + "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@117", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectGroup@117", + "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@117" + ], + "summary": "以 observer() 回调@4 为入口的调用链,覆盖 3 个函数" + }, + { + "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": "resolved", + "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@221" + ] + }, + { + "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@221", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "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@221" + ], + "summary": "以 observer() 回调@6 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26", + "name": "匿名函数@26 (web/src/view/components/SearchBar.tsx)", + "flowType": "call", + "provenance": "resolved", + "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@221" + ] + }, + { + "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@268" + ] + }, + { + "id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.setSearchQuery@221", + "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@268", + "order": 3, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "title": "GraphViewModel.activateSearchResult", + "nextStepIds": [ + "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211" + ] + }, + { + "id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@26@26:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "order": 4, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "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@211", + "order": 5, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "title": "GraphViewModel.openFlowForFunc", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "edge:call:func:web/src/view/components/SearchBar.tsx#activate@12=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "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@221" + ], + "summary": "以 匿名函数@26 为入口的调用链,覆盖 6 个函数" + }, + { + "id": "flow:call:func:web/src/view/App.tsx#observer() 回调@9@9", + "name": "observer() 回调@9 (web/src/view/App.tsx)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:web/src/view/App.tsx#observer() 回调@9@9", + "steps": [ + { + "id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/view/App.tsx#observer() 回调@9@9", + "order": 0, + "nodeId": "func:web/src/view/App.tsx#observer() 回调@9@9", + "title": "observer() 回调@9", + "nextStepIds": [ + "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/view/vmContext.ts#useGraphVM@6", + "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74" + ] + }, + { + "id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9: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() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74", + "title": "GraphViewModel.selectReport", + "nextStepIds": [ + "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126" + ] + }, + { + "id": "step:flow:call:func:web/src/view/App.tsx#observer() 回调@9@9:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "order": 3, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "title": "GraphViewModel.load", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.load@126", + "edge:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/view/vmContext.ts#useGraphVM@6", + "edge:call:func:web/src/view/App.tsx#observer() 回调@9@9=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.selectReport@74" + ], + "summary": "以 observer() 回调@9 为入口的调用链,覆盖 4 个函数" + }, + { + "id": "flow:call:func:src/flows.ts#map() 回调@72@72", + "name": "map() 回调@72 (src/flows.ts)", + "flowType": "call", + "provenance": "resolved", + "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": "以 map() 回调@72 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:src/analyzer.ts#inProject@65", + "name": "inProject (src/analyzer.ts)", + "flowType": "call", + "provenance": "resolved", + "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": "以 inProject 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:web/src/model/graphModel.ts#map() 回调@44@44", + "name": "map() 回调@44 (web/src/model/graphModel.ts)", + "flowType": "call", + "provenance": "resolved", + "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": "以 map() 回调@44 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "name": "GraphViewModel.groups (web/src/viewmodel/GraphViewModel.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "steps": [ + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "order": 0, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100", + "title": "GraphViewModel.groups", + "nextStepIds": [ + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86" + ] + }, + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "order": 1, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "title": "GraphViewModel.groupOfFlow", + "nextStepIds": [ + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#baseName@34" + ] + }, + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100:func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "title": "baseName", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86=>func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groups@100=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86" + ], + "summary": "以 GraphViewModel.groups 为入口的调用链,覆盖 3 个函数" + }, + { + "id": "flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "name": "GraphViewModel.visibleFlows (web/src/viewmodel/GraphViewModel.ts)", + "flowType": "call", + "provenance": "resolved", + "entryNodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "steps": [ + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "order": 0, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112", + "title": "GraphViewModel.visibleFlows", + "nextStepIds": [ + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86" + ] + }, + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "order": 1, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86", + "title": "GraphViewModel.groupOfFlow", + "nextStepIds": [ + "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#baseName@34" + ] + }, + { + "id": "step:flow:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112:func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "title": "baseName", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86=>func:web/src/viewmodel/GraphViewModel.ts#baseName@34", + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.visibleFlows@112=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.groupOfFlow@86" + ], + "summary": "以 GraphViewModel.visibleFlows 为入口的调用链,覆盖 3 个函数" + }, + { + "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": "resolved", + "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() 回调@40 为入口的调用链,覆盖 2 个函数" + }, + { + "id": "flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41", + "name": "匿名函数@41 (web/src/view/components/SearchBar.tsx)", + "flowType": "call", + "provenance": "resolved", + "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@268" + ] + }, + { + "id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "order": 2, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "title": "GraphViewModel.activateSearchResult", + "nextStepIds": [ + "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211" + ] + }, + { + "id": "step:flow:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "order": 3, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "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@211", + "order": 4, + "nodeId": "func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "title": "GraphViewModel.openFlowForFunc", + "nextStepIds": [] + } + ], + "edgeIds": [ + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.biggestFlowForFunc@233", + "edge:call:func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.openFlowForFunc@211", + "edge:call:func:web/src/view/components/SearchBar.tsx#activate@12=>func:web/src/viewmodel/GraphViewModel.ts#GraphViewModel.activateSearchResult@268", + "edge:call:func:web/src/view/components/SearchBar.tsx#匿名函数@41@41=>func:web/src/view/components/SearchBar.tsx#activate@12" + ], + "summary": "以 匿名函数@41 为入口的调用链,覆盖 5 个函数" + }, + { + "id": "flow:call:func:src/cli.ts#@0", + "name": " (src/cli.ts)", + "flowType": "call", + "provenance": "resolved", + "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": "以 为入口的调用链,覆盖 26 个函数" + } + ], + "externalSystems": [] +} \ No newline at end of file diff --git a/web/src/main.tsx b/web/src/main.tsx new file mode 100644 index 0000000..fb253ee --- /dev/null +++ b/web/src/main.tsx @@ -0,0 +1,25 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import "@xyflow/react/dist/style.css"; +import "./styles.css"; +import { App } from "./view/App"; +import { VMContext } from "./view/vmContext"; +import { GraphViewModel } from "./viewmodel/GraphViewModel"; +import { HttpReportRepository, type ReportSource } from "./model/reportRepository"; + +// 可切换的报告数据源;新增项目只需往这里加一条 +const sources: ReportSource[] = [ + { id: "taskflow", name: "task-flow-manager", url: "/report.json" }, + { id: "self", name: "code-visualize(本工具)", url: "/self-report.json" }, +]; + +const viewModel = new GraphViewModel(sources, (url) => new HttpReportRepository(url)); +void viewModel.load(); + +ReactDOM.createRoot(document.getElementById("root")!).render( + + + + + +); diff --git a/web/src/model/graphModel.ts b/web/src/model/graphModel.ts new file mode 100644 index 0000000..77c3a9c --- /dev/null +++ b/web/src/model/graphModel.ts @@ -0,0 +1,66 @@ +import type { CodeFile, Container, Flow, Func, Interaction } from "./report"; + +/** 与渲染技术无关的「中性图」结构。ViewModel 与 View 都基于它工作。 */ +export interface GraphNode { + id: string; // 图节点 id(此处等于 FlowStep.id) + label: string; // 函数名 + qualifier?: string; // 归属:方法所属类名 / 自由函数所属文件名 + funcId?: string; + isEntry?: boolean; + interactions?: Interaction[]; +} + +export interface GraphContext { + funcById: Map; + containerById: Map; + fileById: Map; +} + +function baseName(path: string): string { + const parts = path.split("/"); + return parts[parts.length - 1] || path; +} + +function qualifierOf(fn: Func | undefined, ctx: GraphContext): string | undefined { + if (!fn) return undefined; + if (fn.ownerId) return ctx.containerById.get(fn.ownerId)?.name; + const file = ctx.fileById.get(fn.fileId); + return file ? baseName(file.path) : undefined; +} + +export interface GraphEdge { + id: string; + source: string; + target: string; +} + +export interface GraphData { + nodes: GraphNode[]; + edges: GraphEdge[]; +} + +/** 将一条 Flow 转换为中性图(纯函数,无副作用、无框架依赖) */ +export function flowToGraph(flow: Flow, ctx: GraphContext): GraphData { + const nodes: GraphNode[] = flow.steps.map((step) => { + const fn = step.nodeId ? ctx.funcById.get(step.nodeId) : undefined; + return { + id: step.id, + label: fn?.name ?? step.title, + qualifier: qualifierOf(fn, ctx), + funcId: step.nodeId, + isEntry: fn?.isEntry, + interactions: fn?.interactions, + }; + }); + + const validStepIds = new Set(nodes.map((n) => n.id)); + const edges: GraphEdge[] = []; + for (const step of flow.steps) { + for (const next of step.nextStepIds) { + if (!validStepIds.has(next)) continue; + edges.push({ id: `${step.id}->${next}`, source: step.id, target: next }); + } + } + + return { nodes, edges }; +} diff --git a/web/src/model/report.ts b/web/src/model/report.ts new file mode 100644 index 0000000..3a1c667 --- /dev/null +++ b/web/src/model/report.ts @@ -0,0 +1,193 @@ +// 标准化代码报告数据结构(与 CLI 端 src/types.ts 对齐) + +export type Id = string; +export type Provenance = "ast" | "resolved" | "ai" | "manual"; + +export interface SourceLocation { + file: string; + startLine: number; + endLine: number; + startCol?: number; + endCol?: number; +} + +export interface BaseEntity { + id: Id; + name: string; + qualifiedName?: string; + location?: SourceLocation; + language?: string; + provenance: Provenance; + confidence?: number; + summary?: string; + tags?: string[]; + extra?: Record; +} + +export interface Module extends BaseEntity { + kind: "module"; + parentId?: Id; + childModuleIds: Id[]; + fileIds: Id[]; + path?: string; +} + +export interface CodeFile extends BaseEntity { + kind: "file"; + moduleId: Id; + path: string; + loc?: number; + containerIds: Id[]; + functionIds: Id[]; +} + +export interface Container extends BaseEntity { + kind: "container"; + fileId: Id; + moduleId?: Id; + functionIds: Id[]; + fieldIds: Id[]; +} + +export interface Param { + name: string; + typeRef?: string; + optional?: boolean; + defaultValue?: string; +} + +export interface Func extends BaseEntity { + kind: "function"; + fileId: Id; + ownerId?: Id; + moduleId?: Id; + signature?: string; + params: Param[]; + returnType?: string; + isEntry?: boolean; + interactions?: Interaction[]; + loc?: number; +} + +export interface Field extends BaseEntity { + kind: "field"; + ownerId: Id; + typeRef?: string; +} + +export type InteractionKind = "api" | "db"; +export type InteractionDirection = "in" | "out"; + +export interface InteractionBase { + id: Id; + direction: InteractionDirection; + provenance: Provenance; + confidence?: number; + summary?: string; +} + +export interface ApiInteraction extends InteractionBase { + kind: "api"; + protocol: "http" | "ws" | "rpc" | "graphql"; + method?: string; + path?: string; + peer?: string; +} + +export interface DbInteraction extends InteractionBase { + kind: "db"; + operation: "read" | "create" | "update" | "delete" | "other"; + target?: string; + engine?: string; +} + +export type Interaction = ApiInteraction | DbInteraction; + +export type EdgeKind = "call" | "import" | "reference" | "dataflow" | "trigger"; + +export interface Edge { + id: Id; + kind: EdgeKind; + sourceId: Id; + targetId: Id; + provenance: Provenance; + confidence?: number; + label?: string; + extra?: Record; +} + +export interface FlowStep { + id: Id; + order: number; + nodeId?: Id; + title: string; + description?: string; + branchLabel?: string; + nextStepIds: Id[]; +} + +export interface Flow { + id: Id; + name: string; + flowType: "call" | "business"; + summary?: string; + provenance: Provenance; + entryNodeId?: Id; + steps: FlowStep[]; + edgeIds?: Id[]; +} + +export type ExternalSystemKind = "database" | "service"; + +export interface ExternalSystemBase { + id: Id; + kind: ExternalSystemKind; + name: string; + functionIds: Id[]; + interactionCount: number; + provenance: Provenance; +} + +export interface DatabaseSystem extends ExternalSystemBase { + kind: "database"; + engine?: string; + tables: string[]; +} + +export interface ServiceSystem extends ExternalSystemBase { + kind: "service"; + protocol?: string; + endpoints: string[]; +} + +export type ExternalSystem = DatabaseSystem | ServiceSystem; + +export interface ProjectMeta { + name: string; + root: string; + languages: string[]; + generatedAt: string; + generator?: string; +} + +export interface ReportStats { + fileCount: number; + containerCount: number; + functionCount: number; + edgeCount: number; + loc?: number; +} + +export interface Report { + schemaVersion: string; + project: ProjectMeta; + stats: ReportStats; + modules: Module[]; + files: CodeFile[]; + containers: Container[]; + functions: Func[]; + fields: Field[]; + edges: Edge[]; + flows: Flow[]; + externalSystems?: ExternalSystem[]; +} diff --git a/web/src/model/reportRepository.ts b/web/src/model/reportRepository.ts new file mode 100644 index 0000000..c54a01c --- /dev/null +++ b/web/src/model/reportRepository.ts @@ -0,0 +1,26 @@ +import type { Report } from "./report"; + +/** 一个可供选择的报告数据源 */ +export interface ReportSource { + id: string; + name: string; + url: string; +} + +/** 报告数据源抽象。切换来源(HTTP / 本地文件 / 上传)只需换实现,不影响上层。 */ +export interface ReportRepository { + load(): Promise; +} + +/** 从 URL 加载报告 JSON */ +export class HttpReportRepository implements ReportRepository { + constructor(private readonly url: string) {} + + async load(): Promise { + const res = await fetch(this.url); + if (!res.ok) { + throw new Error(`加载报告失败: HTTP ${res.status} (${this.url})`); + } + return (await res.json()) as Report; + } +} diff --git a/web/src/services/dagreLayout.ts b/web/src/services/dagreLayout.ts new file mode 100644 index 0000000..657dbfd --- /dev/null +++ b/web/src/services/dagreLayout.ts @@ -0,0 +1,62 @@ +import dagre from "@dagrejs/dagre"; + +export type LayoutDirection = "LR" | "TB"; + +export interface LayoutNodeInput { + id: string; + width: number; + height: number; +} + +export interface LayoutEdgeInput { + source: string; + target: string; +} + +export interface Position { + x: number; + y: number; +} + +export interface LayoutOptions { + direction?: LayoutDirection; + nodeSep?: number; + rankSep?: number; +} + +/** + * 用 dagre 计算有向图的分层布局,返回每个节点左上角坐标。 + * 纯服务,不依赖任何渲染库。 + */ +export function computeLayout( + nodes: LayoutNodeInput[], + edges: LayoutEdgeInput[], + options: LayoutOptions = {} +): Map { + const { direction = "LR", nodeSep = 40, rankSep = 90 } = options; + + const g = new dagre.graphlib.Graph(); + g.setGraph({ rankdir: direction, nodesep: nodeSep, ranksep: rankSep, marginx: 20, marginy: 20 }); + g.setDefaultEdgeLabel(() => ({})); + + for (const n of nodes) { + g.setNode(n.id, { width: n.width, height: n.height }); + } + for (const e of edges) { + if (e.source !== e.target) g.setEdge(e.source, e.target); + } + + dagre.layout(g); + + const result = new Map(); + for (const n of nodes) { + const node = g.node(n.id); + if (!node) { + result.set(n.id, { x: 0, y: 0 }); + continue; + } + // dagre 返回中心点,转换为左上角 + result.set(n.id, { x: node.x - n.width / 2, y: node.y - n.height / 2 }); + } + return result; +} diff --git a/web/src/styles.css b/web/src/styles.css new file mode 100644 index 0000000..2d973bf --- /dev/null +++ b/web/src/styles.css @@ -0,0 +1,547 @@ +* { + box-sizing: border-box; +} + +html, +body, +#root { + height: 100%; + margin: 0; +} + +body { + font-family: "Segoe UI", "Microsoft YaHei", system-ui, sans-serif; + color: #1e293b; + background: #f1f5f9; +} + +.app { + display: flex; + flex-direction: column; + height: 100%; +} + +.app__header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 18px; + background: #0f172a; + color: #f8fafc; + flex: 0 0 auto; +} + +.app__title { + font-size: 15px; + font-weight: 600; +} + +.app__report-select { + margin-left: 12px; + background: #1e293b; + color: #e2e8f0; + border: 1px solid #334155; + border-radius: 6px; + padding: 3px 8px; + font-size: 12.5px; + cursor: pointer; +} + +.app__stats { + font-size: 12px; + color: #cbd5e1; + flex: 0 0 auto; +} + +/* ---------- 搜索栏 ---------- */ +.search { + position: relative; + flex: 1 1 auto; + max-width: 420px; + margin: 0 20px; +} + +.search__input { + width: 100%; + background: #1e293b; + color: #e2e8f0; + border: 1px solid #334155; + border-radius: 8px; + padding: 6px 12px; + font-size: 13px; + outline: none; +} + +.search__input:focus { + border-color: #3b82f6; +} + +.search__input::placeholder { + color: #64748b; +} + +.search__dropdown { + position: absolute; + top: calc(100% + 6px); + left: 0; + right: 0; + background: #fff; + border: 1px solid #e2e8f0; + border-radius: 10px; + box-shadow: 0 8px 24px rgba(15, 23, 42, 0.18); + max-height: 360px; + overflow: auto; + z-index: 100; + padding: 6px; +} + +.search__empty { + padding: 10px 12px; + color: #94a3b8; + font-size: 12.5px; +} + +.search__item { + display: flex; + align-items: center; + gap: 8px; + width: 100%; + text-align: left; + border: none; + background: transparent; + border-radius: 8px; + padding: 7px 10px; + cursor: pointer; +} + +.search__item:hover { + background: #f1f5f9; +} + +.search__kind { + flex: 0 0 auto; + font-size: 10px; + font-weight: 700; + border-radius: 5px; + padding: 1px 6px; +} + +.search__kind--flow { + background: #dbeafe; + color: #1d4ed8; +} + +.search__kind--func { + background: #e2e8f0; + color: #475569; +} + +.search__label { + flex: 1 1 auto; + font-size: 12.5px; + color: #1e293b; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.search__sub { + flex: 0 0 auto; + font-size: 11px; + color: #94a3b8; + max-width: 45%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.app__body { + flex: 1 1 auto; + display: flex; + min-height: 0; +} + +.app__status { + margin: auto; + color: #64748b; + font-size: 14px; +} + +.app__status--error { + color: #dc2626; +} + +.app__canvas { + flex: 1 1 auto; + min-width: 0; + height: 100%; +} + +/* ---------- 侧栏面板 ---------- */ +.panel { + display: flex; + flex-direction: column; + background: #fff; + flex: 0 0 auto; +} + +.panel--groups { + width: 210px; + border-right: 1px solid #e2e8f0; +} + +.panel--left { + width: 280px; + border-right: 1px solid #e2e8f0; +} + +.panel--right { + width: 320px; + border-left: 1px solid #e2e8f0; +} + +.panel__header { + padding: 10px 14px; + font-size: 13px; + font-weight: 600; + color: #334155; + border-bottom: 1px solid #eef2f6; +} + +.panel__body { + flex: 1 1 auto; + overflow: auto; + padding: 8px; +} + +/* ---------- 流程列表 ---------- */ +.flow-item { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + width: 100%; + text-align: left; + border: 1px solid transparent; + background: transparent; + border-radius: 8px; + padding: 8px 10px; + cursor: pointer; + font-size: 12.5px; + color: #475569; +} + +.flow-item:hover { + background: #f1f5f9; +} + +.flow-item.is-active { + background: #eff6ff; + border-color: #bfdbfe; + color: #1d4ed8; +} + +.flow-item__name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.flow-item__count { + flex: 0 0 auto; + font-size: 11px; + color: #94a3b8; + background: #f1f5f9; + border-radius: 10px; + padding: 1px 8px; +} + +/* ---------- 分组列表 ---------- */ +.group-item { + display: flex; + align-items: center; + gap: 6px; + width: 100%; + text-align: left; + border: 1px solid transparent; + background: transparent; + border-radius: 8px; + padding: 7px 9px; + cursor: pointer; + font-size: 12.5px; + color: #475569; +} + +.group-item:hover { + background: #f1f5f9; +} + +.group-item.is-active { + background: #eef2ff; + border-color: #c7d2fe; + color: #4338ca; +} + +.group-item--all { + font-weight: 600; + color: #334155; + margin-bottom: 4px; +} + +.group-item__tag { + flex: 0 0 auto; + font-size: 10px; + font-weight: 700; + border-radius: 5px; + padding: 1px 5px; +} + +.group-item__tag--class { + background: #ddd6fe; + color: #6d28d9; +} + +.group-item__tag--file { + background: #e2e8f0; + color: #475569; +} + +.group-item__name { + flex: 1 1 auto; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.group-item__count { + flex: 0 0 auto; + font-size: 11px; + color: #94a3b8; + background: #f1f5f9; + border-radius: 10px; + padding: 1px 8px; +} + +/* ---------- 图节点 ---------- */ +.flow-node { + width: 220px; + min-height: 68px; + background: #fff; + border: 1.5px solid #cbd5e1; + border-radius: 10px; + padding: 8px 12px; + box-shadow: 0 1px 2px rgba(15, 23, 42, 0.08); + display: flex; + flex-direction: column; + gap: 4px; + justify-content: center; +} + +.flow-node__qualifier { + font-size: 10.5px; + font-weight: 600; + color: #94a3b8; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.flow-node.is-entry { + border-color: #34d399; + background: #ecfdf5; +} + +.flow-node.is-selected { + border-color: #2563eb; + box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.25); +} + +.flow-node__title { + font-size: 12.5px; + font-weight: 600; + color: #1e293b; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: flex; + align-items: center; + gap: 6px; +} + +.flow-node__entry-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: #10b981; + flex: 0 0 auto; +} + +.flow-node__badges { + display: flex; + gap: 4px; + flex-wrap: wrap; +} + +.badge { + font-size: 10px; + font-weight: 700; + border-radius: 6px; + padding: 1px 6px; + letter-spacing: 0.3px; +} + +.badge-db { + background: #fef3c7; + color: #b45309; +} + +.badge-api-in { + background: #dbeafe; + color: #1d4ed8; +} + +.badge-api-out { + background: #ede9fe; + color: #6d28d9; +} + +/* ---------- 详情面板 ---------- */ +.detail-empty, +.detail__muted { + color: #94a3b8; + font-size: 12.5px; +} + +.detail__name { + font-size: 15px; + font-weight: 700; + color: #0f172a; +} + +.detail__qualified { + font-size: 12px; + color: #64748b; + margin-top: 2px; + word-break: break-all; +} + +.detail__section { + margin-top: 14px; +} + +.detail__label { + font-size: 11px; + font-weight: 700; + color: #94a3b8; + text-transform: uppercase; + letter-spacing: 0.4px; + margin-bottom: 4px; +} + +.detail__mono { + font-family: Consolas, "Courier New", monospace; + font-size: 12px; + color: #334155; + word-break: break-all; +} + +.detail__sig { + background: #f8fafc; + border: 1px solid #eef2f6; + border-radius: 6px; + padding: 6px 8px; +} + +.detail__ix { + list-style: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: 4px; +} + +.ix-line { + font-size: 12px; + border-radius: 6px; + padding: 4px 8px; +} + +.ix-db { + background: #fffbeb; + color: #92400e; +} + +.ix-api { + background: #eff6ff; + color: #1e40af; +} + +.detail__flows { + display: flex; + flex-direction: column; + gap: 4px; +} + +.detail-flow { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + width: 100%; + text-align: left; + border: 1px solid #e2e8f0; + background: #fff; + border-radius: 6px; + padding: 5px 8px; + cursor: pointer; + font-size: 12px; + color: #475569; +} + +.detail-flow:hover { + background: #f8fafc; + border-color: #cbd5e1; +} + +.detail-flow.is-active { + background: #eff6ff; + border-color: #bfdbfe; + color: #1d4ed8; +} + +.detail-flow__name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.detail-flow__count { + flex: 0 0 auto; + font-size: 11px; + color: #94a3b8; + background: #f1f5f9; + border-radius: 10px; + padding: 1px 8px; +} + +.detail__meta { + display: flex; + gap: 10px; + align-items: center; + font-size: 11px; + color: #94a3b8; +} + +.detail__entry { + background: #d1fae5; + color: #047857; + border-radius: 6px; + padding: 1px 8px; + font-weight: 700; +} + +.graph-empty { + margin: auto; + color: #94a3b8; +} diff --git a/web/src/view/App.tsx b/web/src/view/App.tsx new file mode 100644 index 0000000..5a3ed36 --- /dev/null +++ b/web/src/view/App.tsx @@ -0,0 +1,54 @@ +import { observer } from "mobx-react-lite"; +import { useGraphVM } from "./vmContext"; +import { FlowGraph } from "./components/FlowGraph"; +import { FlowList } from "./components/FlowList"; +import { GroupList } from "./components/GroupList"; +import { NodeDetailPanel } from "./components/NodeDetailPanel"; +import { SearchBar } from "./components/SearchBar"; + +export const App = observer(function App() { + const vm = useGraphVM(); + + return ( +
+
+
+ 代码分析可视化 + +
+ {vm.report ? : null} + {vm.report ? ( +
+ 文件 {vm.report.stats.fileCount} · 函数 {vm.report.stats.functionCount} · 边{" "} + {vm.report.stats.edgeCount} · 流程 {vm.report.flows.length} +
+ ) : null} +
+ +
+ {vm.loading ?
加载中…
: null} + {vm.error ?
加载失败: {vm.error}
: null} + {!vm.loading && !vm.error && vm.report ? ( + <> + + +
+ +
+ + + ) : null} +
+
+ ); +}); diff --git a/web/src/view/components/FlowGraph.tsx b/web/src/view/components/FlowGraph.tsx new file mode 100644 index 0000000..68ca50a --- /dev/null +++ b/web/src/view/components/FlowGraph.tsx @@ -0,0 +1,72 @@ +import { useMemo } from "react"; +import { observer } from "mobx-react-lite"; +import { + ReactFlow, + Background, + Controls, + MiniMap, + MarkerType, + type Node, + type Edge, +} from "@xyflow/react"; +import { useGraphVM } from "../vmContext"; +import { FlowNode, type FlowNodeData } from "./FlowNode"; + +const nodeTypes = { flowNode: FlowNode }; + +export const FlowGraph = observer(function FlowGraph() { + const vm = useGraphVM(); + const { nodes, edges } = vm.positionedGraph; + const selectedNodeId = vm.selectedNodeId; + + const rfNodes: Node[] = useMemo( + () => + nodes.map((n) => ({ + id: n.id, + type: "flowNode", + position: { x: n.x, y: n.y }, + selected: n.id === selectedNodeId, + data: { label: n.label, qualifier: n.qualifier, isEntry: n.isEntry, interactions: n.interactions }, + })), + [nodes, selectedNodeId] + ); + + const rfEdges: Edge[] = useMemo( + () => + edges.map((e) => ({ + id: e.id, + source: e.source, + target: e.target, + markerEnd: { type: MarkerType.ArrowClosed, width: 18, height: 18 }, + style: { stroke: "#94a3b8", strokeWidth: 1.5 }, + })), + [edges] + ); + + if (nodes.length === 0) { + return
该报告暂无可展示的流程
; + } + + return ( + vm.selectNode(node.id)} + onPaneClick={() => vm.selectNode(null)} + > + + + + + ); +}); diff --git a/web/src/view/components/FlowList.tsx b/web/src/view/components/FlowList.tsx new file mode 100644 index 0000000..ac7b85b --- /dev/null +++ b/web/src/view/components/FlowList.tsx @@ -0,0 +1,25 @@ +import { observer } from "mobx-react-lite"; +import { useGraphVM } from "../vmContext"; + +export const FlowList = observer(function FlowList() { + const vm = useGraphVM(); + + return ( + + ); +}); diff --git a/web/src/view/components/FlowNode.tsx b/web/src/view/components/FlowNode.tsx new file mode 100644 index 0000000..9b8a252 --- /dev/null +++ b/web/src/view/components/FlowNode.tsx @@ -0,0 +1,66 @@ +import { memo } from "react"; +import { Handle, Position, type NodeProps } from "@xyflow/react"; +import type { Interaction } from "../../model/report"; + +export interface FlowNodeData extends Record { + label: string; + qualifier?: string; + isEntry?: boolean; + interactions?: Interaction[]; +} + +function interactionBadges(interactions?: Interaction[]): { key: string; text: string; cls: string }[] { + if (!interactions?.length) return []; + const badges: { key: string; text: string; cls: string }[] = []; + const seen = new Set(); + for (const ix of interactions) { + let key: string; + let text: string; + let cls: string; + if (ix.kind === "db") { + key = "db"; + text = "DB"; + cls = "badge-db"; + } else if (ix.direction === "in") { + key = "api-in"; + text = "API▸"; + cls = "badge-api-in"; + } else { + key = "api-out"; + text = "▸API"; + cls = "badge-api-out"; + } + if (seen.has(key)) continue; + seen.add(key); + badges.push({ key, text, cls }); + } + return badges; +} + +export const FlowNode = memo(function FlowNode({ data, selected }: NodeProps & { data: FlowNodeData }) { + const badges = interactionBadges(data.interactions); + return ( +
+ + {data.qualifier ? ( +
+ {data.qualifier} +
+ ) : null} +
+ {data.isEntry ? : null} + {data.label} +
+ {badges.length > 0 ? ( +
+ {badges.map((b) => ( + + {b.text} + + ))} +
+ ) : null} + +
+ ); +}); diff --git a/web/src/view/components/GroupList.tsx b/web/src/view/components/GroupList.tsx new file mode 100644 index 0000000..a00b372 --- /dev/null +++ b/web/src/view/components/GroupList.tsx @@ -0,0 +1,36 @@ +import { observer } from "mobx-react-lite"; +import { useGraphVM } from "../vmContext"; + +export const GroupList = observer(function GroupList() { + const vm = useGraphVM(); + + return ( + + ); +}); diff --git a/web/src/view/components/NodeDetailPanel.tsx b/web/src/view/components/NodeDetailPanel.tsx new file mode 100644 index 0000000..41d4df0 --- /dev/null +++ b/web/src/view/components/NodeDetailPanel.tsx @@ -0,0 +1,85 @@ +import { observer } from "mobx-react-lite"; +import { useGraphVM } from "../vmContext"; +import type { Interaction } from "../../model/report"; + +function describeInteraction(ix: Interaction): string { + if (ix.kind === "db") { + return `DB · ${ix.operation}${ix.target ? ` → ${ix.target}` : ""}${ix.engine ? ` (${ix.engine})` : ""}`; + } + const dir = ix.direction === "in" ? "接收" : "发起"; + return `API ${dir} · ${ix.method ?? ""} ${ix.path ?? ""}${ix.peer ? ` @${ix.peer}` : ""}`; +} + +export const NodeDetailPanel = observer(function NodeDetailPanel() { + const vm = useGraphVM(); + const fn = vm.selectedFunc; + + return ( + + ); +}); diff --git a/web/src/view/components/SearchBar.tsx b/web/src/view/components/SearchBar.tsx new file mode 100644 index 0000000..ac3d726 --- /dev/null +++ b/web/src/view/components/SearchBar.tsx @@ -0,0 +1,59 @@ +import { useState } from "react"; +import { observer } from "mobx-react-lite"; +import { useGraphVM } from "../vmContext"; +import type { SearchResult } from "../../viewmodel/GraphViewModel"; + +export const SearchBar = observer(function SearchBar() { + const vm = useGraphVM(); + const [focused, setFocused] = useState(false); + const results = vm.searchResults; + const open = focused && vm.searchQuery.trim().length > 0; + + const activate = (r: SearchResult): void => { + vm.activateSearchResult(r); + setFocused(false); + }; + + return ( +
+ vm.setSearchQuery(e.target.value)} + onFocus={() => setFocused(true)} + onBlur={() => setFocused(false)} + onKeyDown={(e) => { + if (e.key === "Enter" && results[0]) activate(results[0]); + if (e.key === "Escape") vm.setSearchQuery(""); + }} + /> + {open ? ( +
+ {results.length === 0 ? ( +
无匹配结果
+ ) : ( + results.map((r) => ( + + )) + )} +
+ ) : null} +
+ ); +}); diff --git a/web/src/view/vmContext.ts b/web/src/view/vmContext.ts new file mode 100644 index 0000000..47ec5d3 --- /dev/null +++ b/web/src/view/vmContext.ts @@ -0,0 +1,10 @@ +import { createContext, useContext } from "react"; +import type { GraphViewModel } from "../viewmodel/GraphViewModel"; + +export const VMContext = createContext(null); + +export function useGraphVM(): GraphViewModel { + const vm = useContext(VMContext); + if (!vm) throw new Error("GraphViewModel 未在 VMContext 中提供"); + return vm; +} diff --git a/web/src/viewmodel/GraphViewModel.ts b/web/src/viewmodel/GraphViewModel.ts new file mode 100644 index 0000000..2170aa3 --- /dev/null +++ b/web/src/viewmodel/GraphViewModel.ts @@ -0,0 +1,289 @@ +import { makeAutoObservable, runInAction } from "mobx"; +import type { Report, Flow, Func, Container, CodeFile } from "../model/report"; +import type { ReportRepository, ReportSource } from "../model/reportRepository"; +import { flowToGraph, type GraphEdge, type GraphNode } from "../model/graphModel"; +import { computeLayout, type Position } from "../services/dagreLayout"; + +export const NODE_WIDTH = 220; +export const NODE_HEIGHT = 68; + +export interface PositionedNode extends GraphNode, Position { + width: number; + height: number; +} + +export interface PositionedGraph { + nodes: PositionedNode[]; + edges: GraphEdge[]; +} + +export interface FlowGroup { + id: string; + name: string; + kind: "class" | "file"; + count: number; +} + +export interface SearchResult { + id: string; + kind: "flow" | "func"; + label: string; + sublabel: string; +} + +function baseName(path: string): string { + const parts = path.split("/"); + return parts[parts.length - 1] || path; +} + +/** + * 图视图的 ViewModel:编排数据加载、流程选择、布局计算与选中状态。 + * 不依赖任何 React / 渲染库,仅暴露可观察状态与命令。 + */ +export class GraphViewModel { + loading = false; + error: string | null = null; + report: Report | null = null; + + selectedSourceId: string | null = null; + selectedGroupId: string | null = null; // null = 全部 + selectedFlowId: string | null = null; + selectedNodeId: string | null = null; + searchQuery = ""; + + private funcById = new Map(); + private containerById = new Map(); + private fileById = new Map(); + + constructor( + private readonly sourceList: ReportSource[], + private readonly makeRepository: (url: string) => ReportRepository + ) { + this.selectedSourceId = sourceList[0]?.id ?? null; + makeAutoObservable(this, {}, { autoBind: true }); + } + + get sources(): ReportSource[] { + return this.sourceList; + } + + get currentSource(): ReportSource | null { + return this.sourceList.find((s) => s.id === this.selectedSourceId) ?? null; + } + + selectReport(sourceId: string): void { + if (sourceId === this.selectedSourceId) return; + this.selectedSourceId = sourceId; + this.report = null; + this.selectedGroupId = null; + this.selectedFlowId = null; + this.selectedNodeId = null; + this.searchQuery = ""; + void this.load(); + } + + /** 计算一条流程入口所属的分组(方法→类,自由函数→文件) */ + private groupOfFlow(flow: Flow): FlowGroup { + const entry = flow.entryNodeId ? this.funcById.get(flow.entryNodeId) : undefined; + if (entry?.ownerId) { + const container = this.containerById.get(entry.ownerId); + return { id: `class:${entry.ownerId}`, name: container?.name ?? "未知类", kind: "class", count: 0 }; + } + const file = entry ? this.fileById.get(entry.fileId) : undefined; + if (file) { + return { id: `file:${file.id}`, name: baseName(file.path), kind: "file", count: 0 }; + } + return { id: "ungrouped", name: "未归类", kind: "file", count: 0 }; + } + + /** 分组列表:按包含流程数从多到少排序 */ + get groups(): FlowGroup[] { + const map = new Map(); + for (const flow of this.flows) { + const g = this.groupOfFlow(flow); + const existing = map.get(g.id); + if (existing) existing.count += 1; + else map.set(g.id, { ...g, count: 1 }); + } + return [...map.values()].sort((a, b) => b.count - a.count || a.name.localeCompare(b.name)); + } + + /** 当前分组过滤后的流程列表 */ + get visibleFlows(): Flow[] { + if (!this.selectedGroupId) return this.flows; + return this.flows.filter((f) => this.groupOfFlow(f).id === this.selectedGroupId); + } + + selectGroup(groupId: string | null): void { + this.selectedGroupId = groupId; + const visible = this.visibleFlows; + if (!visible.some((f) => f.id === this.selectedFlowId)) { + this.selectedFlowId = visible[0]?.id ?? null; + this.selectedNodeId = null; + } + } + + async load(): Promise { + const source = this.currentSource; + if (!source) return; + this.loading = true; + this.error = null; + try { + const report = await this.makeRepository(source.url).load(); + const funcIndex = new Map(); + for (const fn of report.functions) funcIndex.set(fn.id, fn); + const containerIndex = new Map(); + for (const c of report.containers) containerIndex.set(c.id, c); + const fileIndex = new Map(); + for (const f of report.files) fileIndex.set(f.id, f); + runInAction(() => { + this.report = report; + this.funcById = funcIndex; + this.containerById = containerIndex; + this.fileById = fileIndex; + this.selectedGroupId = null; + this.selectedFlowId = this.flows[0]?.id ?? null; + this.selectedNodeId = null; + }); + } catch (e) { + runInAction(() => { + this.error = e instanceof Error ? e.message : String(e); + }); + } finally { + runInAction(() => { + this.loading = false; + }); + } + } + + /** 流程列表,按步骤数从多到少排序,信息量大的排前面 */ + get flows(): Flow[] { + if (!this.report) return []; + return [...this.report.flows].sort((a, b) => b.steps.length - a.steps.length); + } + + get currentFlow(): Flow | null { + if (!this.report || !this.selectedFlowId) return null; + return this.report.flows.find((f) => f.id === this.selectedFlowId) ?? null; + } + + /** 计算好坐标的中性图,供 View 适配到具体渲染库 */ + get positionedGraph(): PositionedGraph { + const flow = this.currentFlow; + if (!flow) return { nodes: [], edges: [] }; + + const graph = flowToGraph(flow, { + funcById: this.funcById, + containerById: this.containerById, + fileById: this.fileById, + }); + const positions = computeLayout( + graph.nodes.map((n) => ({ id: n.id, width: NODE_WIDTH, height: NODE_HEIGHT })), + graph.edges.map((e) => ({ source: e.source, target: e.target })), + { direction: "LR" } + ); + + const nodes: PositionedNode[] = graph.nodes.map((n) => { + const pos = positions.get(n.id) ?? { x: 0, y: 0 }; + return { ...n, x: pos.x, y: pos.y, width: NODE_WIDTH, height: NODE_HEIGHT }; + }); + + return { nodes, edges: graph.edges }; + } + + get selectedFunc(): Func | null { + if (!this.selectedNodeId) return null; + const node = this.positionedGraph.nodes.find((n) => n.id === this.selectedNodeId); + if (!node?.funcId) return null; + return this.funcById.get(node.funcId) ?? null; + } + + /** 当前选中函数参与(出现在其中)的所有流程 */ + get flowsForSelectedFunc(): Flow[] { + const fn = this.selectedFunc; + if (!fn || !this.report) return []; + return this.report.flows + .filter((flow) => flow.steps.some((s) => s.nodeId === fn.id)) + .sort((a, b) => b.steps.length - a.steps.length); + } + + /** 跳转到指定流程,并定位到其中承载该函数的节点 */ + openFlowForFunc(flowId: string, funcId: string): void { + this.selectedGroupId = null; // 清除分组过滤,确保目标流程在列表中可见 + this.selectedFlowId = flowId; + const flow = this.report?.flows.find((f) => f.id === flowId); + const step = flow?.steps.find((s) => s.nodeId === funcId); + this.selectedNodeId = step?.id ?? null; + } + + // ---------- 搜索 ---------- + + setSearchQuery(q: string): void { + this.searchQuery = q; + } + + private get funcIdsInFlows(): Set { + const set = new Set(); + for (const flow of this.report?.flows ?? []) { + for (const step of flow.steps) if (step.nodeId) set.add(step.nodeId); + } + return set; + } + + private biggestFlowForFunc(funcId: string): Flow | null { + const matched = (this.report?.flows ?? []) + .filter((f) => f.steps.some((s) => s.nodeId === funcId)) + .sort((a, b) => b.steps.length - a.steps.length); + return matched[0] ?? null; + } + + get searchResults(): SearchResult[] { + const q = this.searchQuery.trim().toLowerCase(); + if (!this.report || q.length < 1) return []; + + const results: SearchResult[] = []; + for (const flow of this.flows) { + if (flow.name.toLowerCase().includes(q)) { + results.push({ id: flow.id, kind: "flow", label: flow.name, sublabel: `流程 · ${flow.steps.length} 步` }); + } + if (results.length >= 20) break; + } + + const inFlows = this.funcIdsInFlows; + for (const fn of this.report.functions) { + if (results.length >= 40) break; + if (!inFlows.has(fn.id)) continue; // 只搜可在图上定位的函数 + const name = (fn.qualifiedName ?? fn.name).toLowerCase(); + if (!name.includes(q)) continue; + results.push({ + id: fn.id, + kind: "func", + label: fn.qualifiedName ?? fn.name, + sublabel: fn.location?.file ?? "", + }); + } + return results.slice(0, 40); + } + + activateSearchResult(result: SearchResult): void { + if (result.kind === "flow") { + this.selectedGroupId = null; + this.selectedFlowId = result.id; + this.selectedNodeId = null; + } else { + const flow = this.biggestFlowForFunc(result.id); + if (flow) this.openFlowForFunc(flow.id, result.id); + } + this.searchQuery = ""; + } + + selectFlow(flowId: string): void { + if (this.selectedFlowId === flowId) return; + this.selectedFlowId = flowId; + this.selectedNodeId = null; + } + + selectNode(nodeId: string | null): void { + this.selectedNodeId = nodeId; + } +} diff --git a/web/tsconfig.json b/web/tsconfig.json new file mode 100644 index 0000000..f095667 --- /dev/null +++ b/web/tsconfig.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "target": "ES2022", + "useDefineForClassFields": true, + "lib": ["ES2022", "DOM", "DOM.Iterable"], + "module": "ESNext", + "moduleResolution": "Bundler", + "jsx": "react-jsx", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "resolveJsonModule": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noEmit": true, + "experimentalDecorators": false, + "types": ["node"] + }, + "include": ["src", "vite.config.ts"] +} diff --git a/web/vite.config.ts b/web/vite.config.ts new file mode 100644 index 0000000..995aaa3 --- /dev/null +++ b/web/vite.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [react()], + server: { + port: 5300, + open: true, + }, +});