Files
code_visualize/sample-report.json
T

28907 lines
1.1 MiB
Plaintext

{
"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#<module>@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#<module>@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#<module>@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#<module>@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#<module>@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#<module>@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#<module>@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<WeeklyPlan>",
"params": [],
"returnType": "Promise<WeeklyPlan>",
"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<WeeklyPlan>",
"params": [],
"returnType": "Promise<WeeklyPlan>",
"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<WeeklyPlan[]>",
"params": [],
"returnType": "Promise<WeeklyPlan[]>",
"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<WeeklyPlan>): Promise<WeeklyPlan>",
"params": [
{
"name": "input",
"typeRef": "Partial<WeeklyPlan>",
"optional": false
}
],
"returnType": "Promise<WeeklyPlan>",
"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<WeeklyPlan>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<WeeklyPlan>",
"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<WorkflowNode, \"startDate\" | \"endDate\" | \"timeRanges\">)",
"params": [
{
"name": "node",
"typeRef": "Pick<WorkflowNode, \"startDate\" | \"endDate\" | \"timeRanges\">",
"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<WorkflowNode, \"startDate\" | \"endDate\" | \"timeRanges\">): Prisma.InputJsonValue",
"params": [
{
"name": "node",
"typeRef": "Pick<WorkflowNode, \"startDate\" | \"endDate\" | \"timeRanges\">",
"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<string[]>",
"params": [
{
"name": "values",
"typeRef": "string[]",
"optional": true,
"defaultValue": "[]"
}
],
"returnType": "Promise<string[]>",
"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<DbTask>[\"nodes\"][number]): WorkflowNode",
"params": [
{
"name": "node",
"typeRef": "NonNullable<DbTask>[\"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<DbTask>): TaskCompletionStatus",
"params": [
{
"name": "task",
"typeRef": "NonNullable<DbTask>",
"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<DbTask>): Task",
"params": [
{
"name": "task",
"typeRef": "NonNullable<DbTask>",
"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<Task>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<Task>",
"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<Task>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<Task>",
"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<Task[]>",
"params": [],
"returnType": "Promise<Task[]>",
"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<Task>",
"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<Task>",
"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<Omit<Task, \"id\">>): Promise<Task>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
},
{
"name": "input",
"typeRef": "Partial<Omit<Task, \"id\">>",
"optional": false
}
],
"returnType": "Promise<Task>",
"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<Task>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
},
{
"name": "input",
"typeRef": "{ isPinned?: boolean; sortOrder?: number }",
"optional": false
}
],
"returnType": "Promise<Task>",
"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<void>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<void>",
"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<Task>",
"params": [
{
"name": "taskId",
"typeRef": "string",
"optional": false
},
{
"name": "input",
"typeRef": "WorkflowNode",
"optional": false
}
],
"returnType": "Promise<Task>",
"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<WorkflowNode>): Promise<Task>",
"params": [
{
"name": "taskId",
"typeRef": "string",
"optional": false
},
{
"name": "nodeId",
"typeRef": "string",
"optional": false
},
{
"name": "input",
"typeRef": "Partial<WorkflowNode>",
"optional": false
}
],
"returnType": "Promise<Task>",
"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<Task>",
"params": [
{
"name": "taskId",
"typeRef": "string",
"optional": false
},
{
"name": "nodeId",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<Task>",
"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<Task>",
"params": [
{
"name": "taskId",
"typeRef": "string",
"optional": false
},
{
"name": "parentNodeId",
"typeRef": "string",
"optional": false
},
{
"name": "childNodeId",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<Task>",
"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<Task>",
"params": [
{
"name": "taskId",
"typeRef": "string",
"optional": false
},
{
"name": "parentNodeId",
"typeRef": "string",
"optional": false
},
{
"name": "childNodeId",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<Task>",
"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<boolean>",
"params": [
{
"name": "taskId",
"typeRef": "string",
"optional": false
},
{
"name": "fromNodeId",
"typeRef": "string",
"optional": false
},
{
"name": "toNodeId",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<boolean>",
"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<Parameters<typeof prisma.$transaction>[0]>[0], taskId: string, nodes: WorkflowNode[])",
"params": [
{
"name": "tx",
"typeRef": "Parameters<Parameters<typeof prisma.$transaction>[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<ReturnType<typeof prisma.notificationLog.findFirst>>): NotificationLog",
"params": [
{
"name": "log",
"typeRef": "Awaited<ReturnType<typeof prisma.notificationLog.findFirst>>",
"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<NotificationLog>",
"params": [
{
"name": "input",
"typeRef": "CreateNotificationLogInput",
"optional": false
}
],
"returnType": "Promise<NotificationLog>",
"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<NotificationLog[]>",
"params": [
{
"name": "limit",
"optional": true,
"defaultValue": "50"
}
],
"returnType": "Promise<NotificationLog[]>",
"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<void>",
"params": [],
"returnType": "Promise<void>",
"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<ProjectTemplate[]>",
"params": [],
"returnType": "Promise<ProjectTemplate[]>",
"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<ProjectTemplate>): Promise<ProjectTemplate>",
"params": [
{
"name": "input",
"typeRef": "Partial<ProjectTemplate>",
"optional": false
}
],
"returnType": "Promise<ProjectTemplate>",
"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<ProjectTemplate>): Promise<ProjectTemplate>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
},
{
"name": "input",
"typeRef": "Partial<ProjectTemplate>",
"optional": false
}
],
"returnType": "Promise<ProjectTemplate>",
"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<void>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<void>",
"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<TagDefinition[]>",
"params": [],
"returnType": "Promise<TagDefinition[]>",
"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<TagDefinition>",
"params": [
{
"name": "input",
"typeRef": "{ name?: string }",
"optional": false
}
],
"returnType": "Promise<TagDefinition>",
"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<void>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<void>",
"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<Person[]>",
"params": [],
"returnType": "Promise<Person[]>",
"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<Person>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<Person>",
"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<Person>",
"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<Person>",
"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<void>",
"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<void>",
"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<Person>",
"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<Person>",
"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<void>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<void>",
"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<TaskScope>",
"params": [
{
"name": "ctx",
"typeRef": "BotQueryContext",
"optional": false
},
{
"name": "personName",
"typeRef": "string",
"optional": true
},
{
"name": "allMembers",
"typeRef": "boolean",
"optional": true
}
],
"returnType": "Promise<TaskScope>",
"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<Map<string, string>>",
"params": [
{
"name": "ctx",
"typeRef": "BotQueryContext",
"optional": false
}
],
"returnType": "Promise<Map<string, string>>",
"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<string, unknown> }",
"params": [
{
"name": "tool",
"typeRef": "BotTool",
"optional": false
},
{
"name": "isAdmin",
"typeRef": "boolean",
"optional": false
}
],
"returnType": "{ description: string; parameters: Record<string, unknown> }",
"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<typeof buildToolSpecs>): Promise<ChatMessage>",
"params": [
{
"name": "messages",
"typeRef": "ChatMessage[]",
"optional": false
},
{
"name": "tools",
"typeRef": "ReturnType<typeof buildToolSpecs>",
"optional": false
}
],
"returnType": "Promise<ChatMessage>",
"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<string>",
"params": [
{
"name": "name",
"typeRef": "string",
"optional": false
},
{
"name": "argsJson",
"typeRef": "string",
"optional": false
},
{
"name": "ctx",
"typeRef": "BotQueryContext",
"optional": false
}
],
"returnType": "Promise<string>",
"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<string>",
"params": [
{
"name": "question",
"typeRef": "string",
"optional": false
},
{
"name": "ctx",
"typeRef": "BotQueryContext",
"optional": false
},
{
"name": "sessionKey",
"typeRef": "string",
"optional": true
}
],
"returnType": "Promise<string>",
"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<NodeTimeRange>[] | undefined, fallbackStartDate: string, fallbackEndDate): NodeTimeRange[]",
"params": [
{
"name": "ranges",
"typeRef": "Partial<NodeTimeRange>[] | 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<NodeTimeRange>[] | undefined, fallbackStartDate: string, fallbackEndDate, forcedFirstStartDate: string): NodeTimeRange[]",
"params": [
{
"name": "ranges",
"typeRef": "Partial<NodeTimeRange>[] | 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<WorkflowNode, 'startDate' | 'endDate' | 'timeRanges'>): NodeTimeRange[]",
"params": [
{
"name": "node",
"typeRef": "Pick<WorkflowNode, 'startDate' | 'endDate' | 'timeRanges'>",
"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<WorkflowNode, 'startDate' | 'endDate' | 'timeRanges'>)",
"params": [
{
"name": "node",
"typeRef": "Pick<WorkflowNode, 'startDate' | 'endDate' | 'timeRanges'>",
"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<WorkflowNode, 'startDate' | 'endDate' | 'timeRanges'>)",
"params": [
{
"name": "node",
"typeRef": "Pick<WorkflowNode, 'startDate' | 'endDate' | 'timeRanges'>",
"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<WorkflowNode, 'startDate' | 'endDate' | 'timeRanges'>)",
"params": [
{
"name": "node",
"typeRef": "Pick<WorkflowNode, 'startDate' | 'endDate' | 'timeRanges'>",
"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<Task, 'completionStatus' | 'nodes'>): TaskDisplayStatus",
"params": [
{
"name": "task",
"typeRef": "Pick<Task, 'completionStatus' | 'nodes'>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.DragEvent<HTMLDivElement>",
"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<HTMLButtonElement>, plan: WeeklyPlan)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLButtonElement>",
"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<WorkflowNode, 'status' | 'startDate' | 'endDate' | 'timeRanges'>): EffectiveNodeStatus",
"params": [
{
"name": "node",
"typeRef": "Pick<WorkflowNode, 'status' | 'startDate' | 'endDate' | 'timeRanges'>",
"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<HTMLDivElement>)",
"params": [
{
"name": "e",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLDivElement>)",
"params": [
{
"name": "e",
"typeRef": "React.WheelEvent<HTMLDivElement>",
"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<string>()"
}
],
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLButtonElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLButtonElement>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<T>",
"params": [
{
"name": "response",
"typeRef": "Response",
"optional": false
},
{
"name": "fallback",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<T>",
"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<SsoOAuthMessage>)",
"params": [
{
"name": "event",
"typeRef": "MessageEvent<SsoOAuthMessage>",
"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<ProjectTemplate, 'id'>",
"params": [
{
"name": "draft",
"typeRef": "TemplateDraft",
"optional": false
}
],
"returnType": "Omit<ProjectTemplate, 'id'>",
"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<WorkflowNode>)",
"params": [
{
"name": "patch",
"typeRef": "Partial<WorkflowNode>",
"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<WorkflowNode, 'status' | 'startDate' | 'endDate' | 'timeRanges'>): EffectiveNodeStatus",
"params": [
{
"name": "node",
"typeRef": "Pick<WorkflowNode, 'status' | 'startDate' | 'endDate' | 'timeRanges'>",
"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<NodeTimeRange>)",
"params": [
{
"name": "rangeId",
"typeRef": "string",
"optional": false
},
{
"name": "patch",
"typeRef": "Partial<NodeTimeRange>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<HTMLElement>, task: Task)",
"params": [
{
"name": "event",
"typeRef": "React.DragEvent<HTMLElement>",
"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<HTMLDivElement>, planId: string)",
"params": [
{
"name": "event",
"typeRef": "React.DragEvent<HTMLDivElement>",
"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<HTMLDivElement>, planId: string)",
"params": [
{
"name": "event",
"typeRef": "React.DragEvent<HTMLDivElement>",
"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<T>",
"params": [
{
"name": "res",
"typeRef": "Response",
"optional": false
},
{
"name": "fallback",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<T>",
"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<boolean>",
"params": [
{
"name": "name",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<boolean>",
"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<WeeklyPlan, 'id'>): Promise<WeeklyPlan | null>",
"params": [
{
"name": "input",
"typeRef": "Omit<WeeklyPlan, 'id'>",
"optional": false
}
],
"returnType": "Promise<WeeklyPlan | null>",
"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<boolean>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<boolean>",
"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<ProjectTemplate, 'id'>): Promise<ProjectTemplate | null>",
"params": [
{
"name": "input",
"typeRef": "Omit<ProjectTemplate, 'id'>",
"optional": false
}
],
"returnType": "Promise<ProjectTemplate | null>",
"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<ProjectTemplate, 'id'>): Promise<ProjectTemplate | null>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
},
{
"name": "input",
"typeRef": "Omit<ProjectTemplate, 'id'>",
"optional": false
}
],
"returnType": "Promise<ProjectTemplate | null>",
"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<boolean>",
"params": [
{
"name": "id",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<boolean>",
"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<Person | null>",
"params": [
{
"name": "authCode",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<Person | null>",
"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<boolean>",
"params": [
{
"name": "taskId",
"typeRef": "string",
"optional": false
},
{
"name": "weeklyPlanId",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<boolean>",
"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<HTMLDivElement>)",
"params": [
{
"name": "event",
"typeRef": "React.MouseEvent<HTMLDivElement>",
"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<boolean>",
"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<boolean>",
"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<Task>)",
"params": [
{
"name": "updatedMetadata",
"typeRef": "Partial<Task>",
"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<Task | null>",
"params": [
{
"name": "taskId",
"typeRef": "string",
"optional": false
}
],
"returnType": "Promise<Task | null>",
"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#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"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#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"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#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"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#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"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#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"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#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"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#<module>@0",
"kind": "function",
"name": "<module>",
"qualifiedName": "<module>",
"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#<module>@0=>func:prisma/seed.ts#seed@13",
"kind": "call",
"sourceId": "func:prisma/seed.ts#<module>@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#<module>@0=>func:server.ts#GET /api/health@90",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#GET /api/auth/sso-config@498",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#GET /api/auth/sso-login-url@508",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#handleSsoCallback@520",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@0",
"targetId": "func:server.ts#handleSsoCallback@520",
"provenance": "resolved"
},
{
"id": "edge:trigger:func:server.ts#<module>@0=>func:server.ts#GET /api/auth/manual-users@559",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@0",
"targetId": "func:server.ts#GET /api/auth/manual-users@559",
"provenance": "resolved"
},
{
"id": "edge:trigger:func:server.ts#<module>@0=>func:server.ts#POST /api/auth/manual-login@563",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@0",
"targetId": "func:server.ts#POST /api/auth/manual-login@563",
"provenance": "resolved"
},
{
"id": "edge:trigger:func:server.ts#<module>@0=>func:server.ts#POST /api/auth/dev-login@575",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/auth/sso-login@605",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/auth/sso-join-person@642",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#GET /api/people@669",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/people@678",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#PUT /api/people/:id@687",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#DELETE /api/people/:id@696",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/dingtalk/robot/send-message@705",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#GET /api/tags@737",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/tags@745",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#DELETE /api/tags/:id@754",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#GET /api/weekly-plans@764",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/weekly-plans@772",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#DELETE /api/weekly-plans/:id@781",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#GET /api/project-templates@791",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/project-templates@799",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#PUT /api/project-templates/:id@808",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#DELETE /api/project-templates/:id@817",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#GET /api/tasks@826",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#GET /api/tasks/:id@834",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/tasks@843",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#PATCH /api/tasks/:id/list-state@852",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#PUT /api/tasks/:id@865",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#DELETE /api/tasks/:id@886",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/tasks/:id/nodes@895",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#PATCH /api/tasks/:id/nodes/:nodeId@905",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#DELETE /api/tasks/:id/nodes/:nodeId@915",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/tasks/:id/dependencies@925",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#DELETE /api/tasks/:id/dependencies/:parentNodeId/:childNodeId@934",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#POST /api/notify@944",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#GET /api/logs@1041",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#DELETE /api/logs@1049",
"kind": "trigger",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:server.ts#startServer@1235",
"kind": "call",
"sourceId": "func:server.ts#<module>@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#<module>@0=>func:src/utils/date.ts#getLocalDateString@1",
"kind": "call",
"sourceId": "func:src/components/NodeEditorDrawer.tsx#<module>@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#<module>@0",
"name": "<module> (server.ts)",
"flowType": "call",
"provenance": "resolved",
"entryNodeId": "func:server.ts#<module>@0",
"steps": [
{
"id": "step:flow:call:func:server.ts#<module>@0:func:server.ts#<module>@0",
"order": 0,
"nodeId": "func:server.ts#<module>@0",
"title": "<module>",
"nextStepIds": [
"step:flow:call:func:server.ts#<module>@0:func:server.ts#startServer@1235"
]
},
{
"id": "step:flow:call:func:server.ts#<module>@0:func:server.ts#startServer@1235",
"order": 1,
"nodeId": "func:server.ts#startServer@1235",
"title": "startServer",
"nextStepIds": []
}
],
"edgeIds": [
"edge:call:func:server.ts#<module>@0=>func:server.ts#startServer@1235"
],
"summary": "以 <module> 为入口的调用链,覆盖 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"
}
]
}